您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ sqlite3MPrintf函数代码示例

51自学网 2021-06-03 08:14:10
  C++
这篇教程C++ sqlite3MPrintf函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中sqlite3MPrintf函数的典型用法代码示例。如果您正苦于以下问题:C++ sqlite3MPrintf函数的具体用法?C++ sqlite3MPrintf怎么用?C++ sqlite3MPrintf使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了sqlite3MPrintf函数的29个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: sqlite3VtabFinishParse

/*** The parser calls this routine after the CREATE VIRTUAL TABLE statement** has been completely parsed.*/void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){  Table *pTab;        /* The table being constructed */  sqlite3 *db;        /* The database connection */  char *zModule;      /* The module name of the table: USING modulename */  Module *pMod = 0;  addArgumentToVtab(pParse);  pParse->sArg.z = 0;  /* Lookup the module name. */  pTab = pParse->pNewTable;  if( pTab==0 ) return;  db = pParse->db;  if( pTab->nModuleArg<1 ) return;  zModule = pTab->azModuleArg[0];  pMod = (Module *)sqlite3HashFind(&db->aModule, zModule, strlen(zModule));  pTab->pMod = pMod;    /* If the CREATE VIRTUAL TABLE statement is being entered for the  ** first time (in other words if the virtual table is actually being  ** created now instead of just being read out of sqlite_master) then  ** do additional initialization work and store the statement text  ** in the sqlite_master table.  */  if( !db->init.busy ){    char *zStmt;    char *zWhere;    int iDb;    Vdbe *v;    /* Compute the complete text of the CREATE VIRTUAL TABLE statement */    if( pEnd ){      pParse->sNameToken.n = pEnd->z - pParse->sNameToken.z + pEnd->n;    }    zStmt = sqlite3MPrintf("CREATE VIRTUAL TABLE %T", &pParse->sNameToken);    /* A slot for the record has already been allocated in the     ** SQLITE_MASTER table.  We just need to update that slot with all    ** the information we've collected.      **    ** The top of the stack is the rootpage allocated by sqlite3StartTable().    ** This value is always 0 and is ignored, a virtual table does not have a    ** rootpage. The next entry on the stack is the rowid of the record    ** in the sqlite_master table.    */    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);    sqlite3NestedParse(pParse,      "UPDATE %Q.%s "         "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q "       "WHERE rowid=#1",      db->aDb[iDb].zName, SCHEMA_TABLE(iDb),      pTab->zName,      pTab->zName,      zStmt    );    sqliteFree(zStmt);    v = sqlite3GetVdbe(pParse);    sqlite3ChangeCookie(db, v, iDb);    sqlite3VdbeAddOp(v, OP_Expire, 0, 0);    zWhere = sqlite3MPrintf("name='%q'", pTab->zName);    sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 1, zWhere, P3_DYNAMIC);    sqlite3VdbeOp3(v, OP_VCreate, iDb, 0, pTab->zName, strlen(pTab->zName) + 1);  }  /* If we are rereading the sqlite_master table create the in-memory  ** record of the table. If the module has already been registered,  ** also call the xConnect method here.  */  else {    Table *pOld;    Schema *pSchema = pTab->pSchema;    const char *zName = pTab->zName;    int nName = strlen(zName) + 1;    pOld = sqlite3HashInsert(&pSchema->tblHash, zName, nName, pTab);    if( pOld ){      assert( pTab==pOld );  /* Malloc must have failed inside HashInsert() */      return;    }    pSchema->db = pParse->db;    pParse->pNewTable = 0;  }}
开发者ID:3rdexp,项目名称:jezzitest,代码行数:87,


示例2: renameTriggerFunc

/* This function is used by SQL generated to implement the** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER ** statement. The second is a table name. The table name in the CREATE ** TRIGGER statement is replaced with the third argument and the result ** returned. This is analagous to renameTableFunc() above, except for CREATE** TRIGGER, not CREATE INDEX and CREATE TABLE.*/static void renameTriggerFunc(  sqlite3_context *context,  int NotUsed,  sqlite3_value **argv){  unsigned char const *zSql = sqlite3_value_text(argv[0]);  unsigned char const *zTableName = sqlite3_value_text(argv[1]);  int token;  Token tname;  int dist = 3;  unsigned char const *zCsr = zSql;  int len = 0;  char *zRet;  sqlite3 *db = sqlite3_context_db_handle(context);  UNUSED_PARAMETER(NotUsed);  /* The principle used to locate the table name in the CREATE TRIGGER   ** statement is that the table name is the first token that is immediatedly  ** preceded by either TK_ON or TK_DOT and immediatedly followed by one  ** of TK_WHEN, TK_BEGIN or TK_FOR.  */  if( zSql ){    do {      if( !*zCsr ){        /* Ran out of input before finding the table name. Return NULL. */        return;      }      /* Store the token that zCsr points to in tname. */      tname.z = (char*)zCsr;      tname.n = len;      /* Advance zCsr to the next token. Store that token type in 'token',      ** and its length in 'len' (to be used next iteration of this loop).      */      do {        zCsr += len;        len = sqlite3GetToken(zCsr, &token);      }while( token==TK_SPACE );      assert( len>0 );      /* Variable 'dist' stores the number of tokens read since the most      ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN       ** token is read and 'dist' equals 2, the condition stated above      ** to be met.      **      ** Note that ON cannot be a database, table or column name, so      ** there is no need to worry about syntax like       ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc.      */      dist++;      if( token==TK_DOT || token==TK_ON ){        dist = 0;      }    } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) );    /* Variable tname now contains the token that is the old table-name    ** in the CREATE TRIGGER statement.    */    zRet = sqlite3MPrintf(db, "%.*s/"%w/"%s", (int)(((u8*)tname.z) - zSql),       zSql, zTableName, tname.z+tname.n);    sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC);  }}
开发者ID:0xr0ot,项目名称:sqlcipher,代码行数:74,


示例3: sqlite3RunParser

/*** Run the parser on the given SQL string.  The parser structure is** passed in.  An SQLITE_ status code is returned.  If an error occurs** then an and attempt is made to write an error message into ** memory obtained from sqlite3_malloc() and to make *pzErrMsg point to that** error message.*/int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){  int nErr = 0;                   /* Number of errors encountered */  int i;                          /* Loop counter */  void *pEngine;                  /* The LEMON-generated LALR(1) parser */  int tokenType;                  /* type of the next token */  int lastTokenParsed = -1;       /* type of the previous token */  u8 enableLookaside;             /* Saved value of db->lookaside.bEnabled */  sqlite3 *db = pParse->db;       /* The database connection */  int mxSqlLen;                   /* Max length of an SQL string */  mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];  if( db->activeVdbeCnt==0 ){    db->u1.isInterrupted = 0;  }  pParse->rc = SQLITE_OK;  pParse->zTail = pParse->zSql = zSql;  i = 0;  assert( pzErrMsg!=0 );  pEngine = sqlite3ParserAlloc((void*(*)(size_t))sqlite3Malloc);  if( pEngine==0 ){    db->mallocFailed = 1;    return SQLITE_NOMEM;  }  assert( pParse->sLastToken.dyn==0 );  assert( pParse->pNewTable==0 );  assert( pParse->pNewTrigger==0 );  assert( pParse->nVar==0 );  assert( pParse->nVarExpr==0 );  assert( pParse->nVarExprAlloc==0 );  assert( pParse->apVarExpr==0 );  enableLookaside = db->lookaside.bEnabled;  if( db->lookaside.pStart ) db->lookaside.bEnabled = 1;  pParse->sLastToken.quoted = 1;  while( !db->mallocFailed && zSql[i]!=0 ){    assert( i>=0 );    pParse->sLastToken.z = (u8*)&zSql[i];    assert( pParse->sLastToken.dyn==0 );    assert( pParse->sLastToken.quoted );    pParse->sLastToken.n = sqlite3GetToken((unsigned char*)&zSql[i],&tokenType);    i += pParse->sLastToken.n;    if( i>mxSqlLen ){      pParse->rc = SQLITE_TOOBIG;      break;    }    switch( tokenType ){      case TK_SPACE: {        if( db->u1.isInterrupted ){          pParse->rc = SQLITE_INTERRUPT;          sqlite3SetString(pzErrMsg, db, "interrupt");          goto abort_parse;        }        break;      }      case TK_ILLEGAL: {        sqlite3DbFree(db, *pzErrMsg);        *pzErrMsg = sqlite3MPrintf(db, "unrecognized token: /"%T/"",                        &pParse->sLastToken);        nErr++;        goto abort_parse;      }      case TK_SEMI: {        pParse->zTail = &zSql[i];        /* Fall thru into the default case */      }      default: {        sqlite3Parser(pEngine, tokenType, pParse->sLastToken, pParse);        lastTokenParsed = tokenType;        if( pParse->rc!=SQLITE_OK ){          goto abort_parse;        }        break;      }    }  }abort_parse:  if( zSql[i]==0 && nErr==0 && pParse->rc==SQLITE_OK ){    if( lastTokenParsed!=TK_SEMI ){      sqlite3Parser(pEngine, TK_SEMI, pParse->sLastToken, pParse);      pParse->zTail = &zSql[i];    }    sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse);  }#ifdef YYTRACKMAXSTACKDEPTH  sqlite3StatusSet(SQLITE_STATUS_PARSER_STACK,      sqlite3ParserStackPeak(pEngine)  );#endif /* YYDEBUG */  sqlite3ParserFree(pEngine, sqlite3_free);  db->lookaside.bEnabled = enableLookaside;  if( db->mallocFailed ){    pParse->rc = SQLITE_NOMEM;  }//.........这里部分代码省略.........
开发者ID:scottmills,项目名称:sqlcipher,代码行数:101,


示例4: vtabCallConstructor

/*** Invoke a virtual table constructor (either xCreate or xConnect). The** pointer to the function to invoke is passed as the fourth parameter** to this procedure.*/static int vtabCallConstructor(  sqlite3 *db,   Table *pTab,  Module *pMod,  int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**),  char **pzErr){  VTable *pVTable;  int rc;  const char *const*azArg = (const char *const*)pTab->azModuleArg;  int nArg = pTab->nModuleArg;  char *zErr = 0;  char *zModuleName = sqlite3MPrintf(db, "%s", pTab->zName);  if( !zModuleName ){    return SQLITE_NOMEM;  }  pVTable = sqlite3DbMallocZero(db, sizeof(VTable));  if( !pVTable ){    sqlite3DbFree(db, zModuleName);    return SQLITE_NOMEM;  }  pVTable->db = db;  pVTable->pMod = pMod;  assert( !db->pVTab );  assert( xConstruct );  db->pVTab = pTab;  /* Invoke the virtual table constructor */  rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr);  if( rc==SQLITE_NOMEM ) db->mallocFailed = 1;  if( SQLITE_OK!=rc ){    if( zErr==0 ){      *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName);    }else {      *pzErr = sqlite3MPrintf(db, "%s", zErr);      sqlite3DbFree(db, zErr);    }    sqlite3DbFree(db, pVTable);  }else if( ALWAYS(pVTable->pVtab) ){    /* Justification of ALWAYS():  A correct vtab constructor must allocate    ** the sqlite3_vtab object if successful.  */    pVTable->pVtab->pModule = pMod->pModule;    pVTable->nRef = 1;    if( db->pVTab ){      const char *zFormat = "vtable constructor did not declare schema: %s";      *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName);      sqlite3VtabUnlock(pVTable);      rc = SQLITE_ERROR;    }else{      int iCol;      /* If everything went according to plan, link the new VTable structure      ** into the linked list headed by pTab->pVTable. Then loop through the       ** columns of the table to see if any of them contain the token "hidden".      ** If so, set the Column.isHidden flag and remove the token from      ** the type string.  */      pVTable->pNext = pTab->pVTable;      pTab->pVTable = pVTable;      for(iCol=0; iCol<pTab->nCol; iCol++){        char *zType = pTab->aCol[iCol].zType;        int nType;        int i = 0;        if( !zType ) continue;        nType = sqlite3Strlen30(zType);        if( sqlite3StrNICmp("hidden", zType, 6)||(zType[6] && zType[6]!=' ') ){          for(i=0; i<nType; i++){            if( (0==sqlite3StrNICmp(" hidden", &zType[i], 7))             && (zType[i+7]=='/0' || zType[i+7]==' ')            ){              i++;              break;            }          }        }        if( i<nType ){          int j;          int nDel = 6 + (zType[i+6] ? 1 : 0);          for(j=i; (j+nDel)<=nType; j++){            zType[j] = zType[j+nDel];          }          if( zType[i]=='/0' && i>0 ){            assert(zType[i-1]==' ');            zType[i-1] = '/0';          }          pTab->aCol[iCol].isHidden = 1;        }      }    }  }  sqlite3DbFree(db, zModuleName);//.........这里部分代码省略.........
开发者ID:sukantoguha,项目名称:INET-Vagrant-Demos,代码行数:101,


示例5: sqlite3RunParser

/*** Run the parser on the given SQL string.  The parser structure is** passed in.  An SQLITE_ status code is returned.  If an error occurs** and pzErrMsg!=NULL then an error message might be written into ** memory obtained from malloc() and *pzErrMsg made to point to that** error message.  Or maybe not.*/int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){  int nErr = 0;  int i;  void *pEngine;  int tokenType;  int lastTokenParsed = -1;  sqlite3 *db = pParse->db;  extern void *sqlite3ParserAlloc(void*(*)(int));  extern void sqlite3ParserFree(void*, void(*)(void*));  extern int sqlite3Parser(void*, int, Token, Parse*);  db->flags &= ~SQLITE_Interrupt;  pParse->rc = SQLITE_OK;  i = 0;  pEngine = sqlite3ParserAlloc((void*(*)(int))malloc);  if( pEngine==0 ){    sqlite3SetString(pzErrMsg, "out of memory", (char*)0);    return 1;  }  assert( pParse->sLastToken.dyn==0 );  assert( pParse->pNewTable==0 );  assert( pParse->pNewTrigger==0 );  assert( pParse->nVar==0 );  assert( pParse->nVarExpr==0 );  assert( pParse->nVarExprAlloc==0 );  assert( pParse->apVarExpr==0 );  pParse->zTail = pParse->zSql = zSql;  while( sqlite3_malloc_failed==0 && zSql[i]!=0 ){    assert( i>=0 );    pParse->sLastToken.z = (const unsigned char*)&zSql[i];    assert( pParse->sLastToken.dyn==0 );    pParse->sLastToken.n = getToken((unsigned char*)&zSql[i],&tokenType);    i += pParse->sLastToken.n;    switch( tokenType ){      case TK_SPACE:      case TK_COMMENT: {        if( (db->flags & SQLITE_Interrupt)!=0 ){          pParse->rc = SQLITE_INTERRUPT;          sqlite3SetString(pzErrMsg, "interrupt", (char*)0);          goto abort_parse;        }        break;      }      case TK_ILLEGAL: {        if( pzErrMsg ){          sqliteFree(*pzErrMsg);          *pzErrMsg = sqlite3MPrintf("unrecognized token: /"%T/"",                          &pParse->sLastToken);        }        nErr++;        goto abort_parse;      }      case TK_SEMI: {        pParse->zTail = &zSql[i];        /* Fall thru into the default case */      }      default: {        sqlite3Parser(pEngine, tokenType, pParse->sLastToken, pParse);        lastTokenParsed = tokenType;        if( pParse->rc!=SQLITE_OK ){          goto abort_parse;        }        break;      }    }  }abort_parse:  if( zSql[i]==0 && nErr==0 && pParse->rc==SQLITE_OK ){    if( lastTokenParsed!=TK_SEMI ){      sqlite3Parser(pEngine, TK_SEMI, pParse->sLastToken, pParse);      pParse->zTail = &zSql[i];    }    sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse);  }  sqlite3ParserFree(pEngine, free);  if( sqlite3_malloc_failed ){    pParse->rc = SQLITE_NOMEM;  }  if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){    sqlite3SetString(&pParse->zErrMsg, sqlite3ErrStr(pParse->rc),                    (char*)0);  }  if( pParse->zErrMsg ){    if( pzErrMsg && *pzErrMsg==0 ){      *pzErrMsg = pParse->zErrMsg;    }else{      sqliteFree(pParse->zErrMsg);    }    pParse->zErrMsg = 0;    if( !nErr ) nErr++;  }  if( pParse->pVdbe && pParse->nErr>0 && pParse->nested==0 ){    sqlite3VdbeDelete(pParse->pVdbe);//.........这里部分代码省略.........
开发者ID:huangyt,项目名称:foundations.github.com,代码行数:101,


示例6: attachFunc

/*** An SQL user-function registered to do the work of an ATTACH statement. The** three arguments to the function come directly from an attach statement:****     ATTACH DATABASE x AS y KEY z****     SELECT sqlite_attach(x, y, z)**** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the** third argument.*/static void attachFunc(  sqlite3_context *context,  int NotUsed,  sqlite3_value **argv){  int i;  int rc = 0;  sqlite3 *db = sqlite3_context_db_handle(context);  const char *zName;  const char *zFile;  char *zPath = 0;  char *zErr = 0;  unsigned int flags;  Db *aNew;  char *zErrDyn = 0;  sqlite3_vfs *pVfs;  UNUSED_PARAMETER(NotUsed);  zFile = (const char *)sqlite3_value_text(argv[0]);  zName = (const char *)sqlite3_value_text(argv[1]);  if( zFile==0 ) zFile = "";  if( zName==0 ) zName = "";  /* Check for the following errors:  **  **     * Too many attached databases,  **     * Transaction currently open  **     * Specified database name already being used.  */  if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){    zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d",      db->aLimit[SQLITE_LIMIT_ATTACHED]    );    goto attach_error;  }  if( !db->autoCommit ){    zErrDyn = sqlite3MPrintf(db, "cannot ATTACH database within transaction");    goto attach_error;  }  for(i=0; i<db->nDb; i++){    char *z = db->aDb[i].zName;    assert( z && zName );    if( sqlite3StrICmp(z, zName)==0 ){      zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName);      goto attach_error;    }  }  /* Allocate the new entry in the db->aDb[] array and initialize the schema  ** hash tables.  */  if( db->aDb==db->aDbStatic ){    aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 );    if( aNew==0 ) return;    memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);  }else{    aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );    if( aNew==0 ) return;  }  db->aDb = aNew;  aNew = &db->aDb[db->nDb];  memset(aNew, 0, sizeof(*aNew));  /* Open the database file. If the btree is successfully opened, use  ** it to obtain the database schema. At this point the schema may  ** or may not be initialized.  */  flags = db->openFlags;  rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr);  if( rc!=SQLITE_OK ){    if( rc==SQLITE_NOMEM ) sqlite3OomFault(db);    sqlite3_result_error(context, zErr, -1);    sqlite3_free(zErr);    return;  }  assert( pVfs );  flags |= SQLITE_OPEN_MAIN_DB;  rc = sqlite3BtreeOpen(pVfs, zPath, db, &aNew->pBt, 0, flags);  sqlite3_free( zPath );  db->nDb++;  if( rc==SQLITE_CONSTRAINT ){    rc = SQLITE_ERROR;    zErrDyn = sqlite3MPrintf(db, "database is already attached");  }else if( rc==SQLITE_OK ){    Pager *pPager;    aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt);    if( !aNew->pSchema ){      rc = SQLITE_NOMEM;//.........这里部分代码省略.........
开发者ID:arizwanp,项目名称:intel_sgx,代码行数:101,


示例7: bdb_run_parser

static intbdb_run_parser(Parse *pParse, const char *zSql, char **pzErrMsg) {    int nErr = 0;    int i;    void *pEngine;    int tokenType;    int lastTokenParsed = -1;    pParse->rc = SQLITE_OK;    pParse->zTail = pParse->zSql = zSql;    i = 0;    pEngine = sqlite3ParserAlloc((void*(*)(size_t))malloc);    if ( pEngine==0 ) {        return SQLITE_NOMEM;    }    while (zSql[i]!=0 ) {        assert( i>=0 );        pParse->sLastToken.z = (u8*)&zSql[i];        assert( pParse->sLastToken.dyn==0 );        pParse->sLastToken.n = getToken((unsigned char*)&zSql[i],&tokenType);        i += pParse->sLastToken.n;        if ( i>SQLITE_MAX_SQL_LENGTH ) {            pParse->rc = SQLITE_TOOBIG;            break;        }        switch ( tokenType ) {        case TK_SPACE: {            break;        }        case TK_COMMENT: {            parse_hint_comment(&pParse->sLastToken);            break;        }        case TK_ILLEGAL: {            if ( pzErrMsg ) {                free(*pzErrMsg);                *pzErrMsg = sqlite3MPrintf(0, "unrecognized token: /"%T/"",                                           &pParse->sLastToken);            }            nErr++;            goto abort_parse;        }        case TK_SEMI: {            pParse->zTail = &zSql[i];            /* Fall thru into the default case */        }        default: {            preparser(pEngine, tokenType, pParse->sLastToken, pParse);            lastTokenParsed = tokenType;            if ( pParse->rc!=SQLITE_OK ) {                goto abort_parse;            }            break;        }        }    }abort_parse:    if ( zSql[i]==0 && nErr==0 && pParse->rc==SQLITE_OK ) {        sqlite3Parser(pEngine, TK_SEMI, pParse->sLastToken, pParse);        pParse->zTail = &zSql[i];        sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse);    }    sqlite3ParserFree(pEngine,free);    if ( 0 ) {        pParse->rc = SQLITE_NOMEM;    }    if ( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ) {        setString(&pParse->zErrMsg, sqlite3ErrStr(pParse->rc), (char*)0);    }    if ( pParse->zErrMsg ) {        if ( pzErrMsg && *pzErrMsg==0 ) {            *pzErrMsg = pParse->zErrMsg;        } else {            free(pParse->zErrMsg);        }        pParse->zErrMsg = 0;        nErr++;    }    if ( nErr>0 && (pParse->rc==SQLITE_OK || pParse->rc==SQLITE_DONE) ) {        pParse->rc = SQLITE_ERROR;    }    return nErr;}
开发者ID:balagopalraj,项目名称:clearlinux,代码行数:83,


示例8: sqlite3InitOne

//.........这里部分代码省略.........      rc = sqlite3BtreeGetMeta(pDb->pBt, i+1, (u32 *)&meta[i]);    }    if( rc ){      sqlite3SetString(pzErrMsg, sqlite3ErrStr(rc), (char*)0);      sqlite3BtreeCloseCursor(curMain);      return rc;    }  }else{    memset(meta, 0, sizeof(meta));  }  pDb->pSchema->schema_cookie = meta[0];  /* If opening a non-empty database, check the text encoding. For the  ** main database, set sqlite3.enc to the encoding of the main database.  ** For an attached db, it is an error if the encoding is not the same  ** as sqlite3.enc.  */  if( meta[4] ){  /* text encoding */    if( iDb==0 ){      /* If opening the main database, set ENC(db). */      ENC(db) = (u8)meta[4];      db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0);    }else{      /* If opening an attached database, the encoding much match ENC(db) */      if( meta[4]!=ENC(db) ){        sqlite3BtreeCloseCursor(curMain);        sqlite3SetString(pzErrMsg, "attached databases must use the same"            " text encoding as main database", (char*)0);        return SQLITE_ERROR;      }    }  }else{    DbSetProperty(db, iDb, DB_Empty);  }  pDb->pSchema->enc = ENC(db);  size = meta[2];  if( size==0 ){ size = MAX_PAGES; }  pDb->pSchema->cache_size = size;  sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size);  /*  ** file_format==1    Version 3.0.0.  ** file_format==2    Version 3.1.3.  // ALTER TABLE ADD COLUMN  ** file_format==3    Version 3.1.4.  // ditto but with non-NULL defaults  ** file_format==4    Version 3.3.0.  // DESC indices.  Boolean constants  */  pDb->pSchema->file_format = meta[1];  if( pDb->pSchema->file_format==0 ){    pDb->pSchema->file_format = 1;  }  if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){    sqlite3BtreeCloseCursor(curMain);    sqlite3SetString(pzErrMsg, "unsupported file format", (char*)0);    return SQLITE_ERROR;  }  /* Read the schema information out of the schema tables  */  assert( db->init.busy );  if( rc==SQLITE_EMPTY ){    /* For an empty database, there is nothing to read */    rc = SQLITE_OK;  }else{    char *zSql;    zSql = sqlite3MPrintf(        "SELECT name, rootpage, sql FROM '%q'.%s",        db->aDb[iDb].zName, zMasterName);    sqlite3SafetyOff(db);    rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);    if( rc==SQLITE_ABORT ) rc = initData.rc;    sqlite3SafetyOn(db);    sqliteFree(zSql);#ifndef SQLITE_OMIT_ANALYZE    if( rc==SQLITE_OK ){      sqlite3AnalysisLoad(db, iDb);    }#endif    sqlite3BtreeCloseCursor(curMain);  }  if( sqlite3MallocFailed() ){    /* sqlite3SetString(pzErrMsg, "out of memory", (char*)0); */    rc = SQLITE_NOMEM;    sqlite3ResetInternalSchema(db, 0);  }  if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){    /* Black magic: If the SQLITE_RecoveryMode flag is set, then consider    ** the schema loaded, even if errors occured. In this situation the     ** current sqlite3_prepare() operation will fail, but the following one    ** will attempt to compile the supplied statement against whatever subset    ** of the schema was loaded before the error occured. The primary    ** purpose of this is to allow access to the sqlite_master table    ** even when it's contents have been corrupted.    */    DbSetProperty(db, iDb, DB_SchemaLoaded);    rc = SQLITE_OK;  }  return rc;}
开发者ID:Bracket-,项目名称:psp-ports,代码行数:101,


示例9: sqlite3InitOne

//.........这里部分代码省略.........  }else{    DbSetProperty(db, iDb, DB_Empty);  }  pDb->pSchema->enc = ENC(db);  if( pDb->pSchema->cache_size==0 ){    size = meta[BTREE_DEFAULT_CACHE_SIZE-1];    if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; }    if( size<0 ) size = -size;    pDb->pSchema->cache_size = size;    sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size);  }  /*  ** file_format==1    Version 3.0.0.  ** file_format==2    Version 3.1.3.  // ALTER TABLE ADD COLUMN  ** file_format==3    Version 3.1.4.  // ditto but with non-NULL defaults  ** file_format==4    Version 3.3.0.  // DESC indices.  Boolean constants  */  pDb->pSchema->file_format = (u8)meta[BTREE_FILE_FORMAT-1];  if( pDb->pSchema->file_format==0 ){    pDb->pSchema->file_format = 1;  }  if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){    sqlite3SetString(pzErrMsg, db, "unsupported file format");    rc = SQLITE_ERROR;    goto initone_error_out;  }  /* Ticket #2804:  When we open a database in the newer file format,  ** clear the legacy_file_format pragma flag so that a VACUUM will  ** not downgrade the database and thus invalidate any descending  ** indices that the user might have created.  */  if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){    db->flags &= ~SQLITE_LegacyFileFmt;  }  /* Read the schema information out of the schema tables  */  assert( db->init.busy );  {    char *zSql;    zSql = sqlite3MPrintf(db,         "SELECT name, rootpage, sql FROM '%q'.%s",        db->aDb[iDb].zName, zMasterName);    (void)sqlite3SafetyOff(db);#ifndef SQLITE_OMIT_AUTHORIZATION    {      int (*xAuth)(void*,int,const char*,const char*,const char*,const char*);      xAuth = db->xAuth;      db->xAuth = 0;#endif      rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);#ifndef SQLITE_OMIT_AUTHORIZATION      db->xAuth = xAuth;    }#endif    if( rc==SQLITE_OK ) rc = initData.rc;    (void)sqlite3SafetyOn(db);    sqlite3DbFree(db, zSql);#ifndef SQLITE_OMIT_ANALYZE    if( rc==SQLITE_OK ){      sqlite3AnalysisLoad(db, iDb);    }#endif  }  if( db->mallocFailed ){    rc = SQLITE_NOMEM;    sqlite3ResetInternalSchema(db, 0);  }  if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){    /* Black magic: If the SQLITE_RecoveryMode flag is set, then consider    ** the schema loaded, even if errors occurred. In this situation the     ** current sqlite3_prepare() operation will fail, but the following one    ** will attempt to compile the supplied statement against whatever subset    ** of the schema was loaded before the error occurred. The primary    ** purpose of this is to allow access to the sqlite_master table    ** even when its contents have been corrupted.    */    DbSetProperty(db, iDb, DB_SchemaLoaded);    rc = SQLITE_OK;  }  /* Jump here for an error that occurs after successfully allocating  ** curMain and calling sqlite3BtreeEnter(). For an error that occurs  ** before that point, jump to error_out.  */initone_error_out:  if( openedTransaction ){    sqlite3BtreeCommit(pDb->pBt);  }  sqlite3BtreeLeave(pDb->pBt);error_out:  if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){    db->mallocFailed = 1;  }  return rc;}
开发者ID:biddyweb,项目名称:mediastream-plus,代码行数:101,


示例10: vtabCallConstructor

/*** Invoke a virtual table constructor (either xCreate or xConnect). The** pointer to the function to invoke is passed as the fourth parameter** to this procedure.*/static int vtabCallConstructor(  sqlite3 *db,   Table *pTab,  Module *pMod,  int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**),  char **pzErr){  int rc;  int rc2;  sqlite3_vtab *pVtab = 0;  const char *const*azArg = (const char *const*)pTab->azModuleArg;  int nArg = pTab->nModuleArg;  char *zErr = 0;  char *zModuleName = sqlite3MPrintf(db, "%s", pTab->zName);  if( !zModuleName ){    return SQLITE_NOMEM;  }  assert( !db->pVTab );  assert( xConstruct );  db->pVTab = pTab;  rc = sqlite3SafetyOff(db);  assert( rc==SQLITE_OK );  rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVtab, &zErr);  rc2 = sqlite3SafetyOn(db);  if( rc==SQLITE_OK && pVtab ){    pVtab->pModule = pMod->pModule;    pVtab->nRef = 1;    pTab->pVtab = pVtab;  }  if( SQLITE_OK!=rc ){    if( zErr==0 ){      *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName);    }else {      *pzErr = sqlite3MPrintf(db, "%s", zErr);      sqlite3_free(zErr);    }  }else if( db->pVTab ){    const char *zFormat = "vtable constructor did not declare schema: %s";    *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName);    rc = SQLITE_ERROR;  }   if( rc==SQLITE_OK ){    rc = rc2;  }  db->pVTab = 0;  sqlite3_free(zModuleName);  /* If everything went according to plan, loop through the columns  ** of the table to see if any of them contain the token "hidden".  ** If so, set the Column.isHidden flag and remove the token from  ** the type string.  */  if( rc==SQLITE_OK ){    int iCol;    for(iCol=0; iCol<pTab->nCol; iCol++){      char *zType = pTab->aCol[iCol].zType;      int nType;      int i = 0;      if( !zType ) continue;      nType = strlen(zType);      if( sqlite3StrNICmp("hidden", zType, 6) || (zType[6] && zType[6]!=' ') ){        for(i=0; i<nType; i++){          if( (0==sqlite3StrNICmp(" hidden", &zType[i], 7))           && (zType[i+7]=='/0' || zType[i+7]==' ')          ){            i++;            break;          }        }      }      if( i<nType ){        int j;        int nDel = 6 + (zType[i+6] ? 1 : 0);        for(j=i; (j+nDel)<=nType; j++){          zType[j] = zType[j+nDel];        }        if( zType[i]=='/0' && i>0 ){          assert(zType[i-1]==' ');          zType[i-1] = '/0';        }        pTab->aCol[iCol].isHidden = 1;      }    }  }  return rc;}
开发者ID:wolfspelz,项目名称:Apollo,代码行数:95,


示例11: sqlite3RunVacuum

/*** This routine implements the OP_Vacuum opcode of the VDBE.*/int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){  int rc = SQLITE_OK;     /* Return code from service routines */#if !defined(SQLITE_OMIT_VACUUM) || SQLITE_OMIT_VACUUM  const char *zFilename;  /* full pathname of the database file */  int nFilename;          /* number of characters  in zFilename[] */  char *zTemp = 0;        /* a temporary file in same directory as zFilename */  int i;                  /* Loop counter */  Btree *pMain;           /* The database being vacuumed */  Btree *pTemp;  char *zSql = 0;  if( !db->autoCommit ){    sqlite3SetString(pzErrMsg, "cannot VACUUM from within a transaction",        (char*)0);    rc = SQLITE_ERROR;    goto end_of_vacuum;  }  /* Get the full pathname of the database file and create a  ** temporary filename in the same directory as the original file.  */  pMain = db->aDb[0].pBt;  zFilename = sqlite3BtreeGetFilename(pMain);  assert( zFilename );  if( zFilename[0]=='/0' ){    /* The in-memory database. Do nothing. Return directly to avoid causing    ** an error trying to DETACH the vacuum_db (which never got attached)    ** in the exit-handler.    */    return SQLITE_OK;  }  nFilename = strlen(zFilename);  zTemp = sqliteMalloc( nFilename+100 );  if( zTemp==0 ){    rc = SQLITE_NOMEM;    goto end_of_vacuum;  }  strcpy(zTemp, zFilename);  i = 0;  do {    zTemp[nFilename] = '-';    randomName((unsigned char*)&zTemp[nFilename+1]);  } while( i<10 && sqlite3OsFileExists(zTemp) );  /* Attach the temporary database as 'vacuum_db'. The synchronous pragma  ** can be set to 'off' for this file, as it is not recovered if a crash  ** occurs anyway. The integrity of the database is maintained by a  ** (possibly synchronous) transaction opened on the main database before  ** sqlite3BtreeCopyFile() is called.  **  ** An optimisation would be to use a non-journaled pager.  */  zSql = sqlite3MPrintf("ATTACH '%q' AS vacuum_db;", zTemp);  if( !zSql ){    rc = SQLITE_NOMEM;    goto end_of_vacuum;  }  rc = execSql(db, zSql);  sqliteFree(zSql);  zSql = 0;  if( rc!=SQLITE_OK ) goto end_of_vacuum;  assert( strcmp(db->aDb[db->nDb-1].zName,"vacuum_db")==0 );  pTemp = db->aDb[db->nDb-1].pBt;  sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain),     sqlite3BtreeGetReserve(pMain));  assert( sqlite3BtreeGetPageSize(pTemp)==sqlite3BtreeGetPageSize(pMain) );  execSql(db, "PRAGMA vacuum_db.synchronous=OFF");  /* Begin a transaction */  rc = execSql(db, "BEGIN;");  if( rc!=SQLITE_OK ) goto end_of_vacuum;  /* Query the schema of the main database. Create a mirror schema  ** in the temporary database.  */  rc = execExecSql(db,       "SELECT 'CREATE TABLE vacuum_db.' || substr(sql,14,100000000) "      "  FROM sqlite_master WHERE type='table' "      "UNION ALL "      "SELECT 'CREATE INDEX vacuum_db.' || substr(sql,14,100000000) "      "  FROM sqlite_master WHERE sql LIKE 'CREATE INDEX %' "      "UNION ALL "      "SELECT 'CREATE UNIQUE INDEX vacuum_db.' || substr(sql,21,100000000) "      "  FROM sqlite_master WHERE sql LIKE 'CREATE UNIQUE INDEX %'"      "UNION ALL "      "SELECT 'CREATE VIEW vacuum_db.' || substr(sql,13,100000000) "      "  FROM sqlite_master WHERE type='view'"  );  if( rc!=SQLITE_OK ) goto end_of_vacuum;  /* Loop through the tables in the main database. For each, do  ** an "INSERT INTO vacuum_db.xxx SELECT * FROM xxx;" to copy  ** the contents to the temporary database.  */  rc = execExecSql(db,       "SELECT 'INSERT INTO vacuum_db.' || quote(name) "      "|| ' SELECT * FROM ' || quote(name) || ';'"//.........这里部分代码省略.........
开发者ID:kanbang,项目名称:Colt,代码行数:101,


示例12: sqlite3AnalysisLoad

/*** Load the content of the sqlite_stat1 and sqlite_stat2 tables. The** contents of sqlite_stat1 are used to populate the Index.aiRowEst[]** arrays. The contents of sqlite_stat2 are used to populate the** Index.aSample[] arrays.**** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR** is returned. In this case, even if SQLITE_ENABLE_STAT2 was defined ** during compilation and the sqlite_stat2 table is present, no data is ** read from it.**** If SQLITE_ENABLE_STAT2 was defined during compilation and the ** sqlite_stat2 table is not present in the database, SQLITE_ERROR is** returned. However, in this case, data is read from the sqlite_stat1** table (if it is present) before returning.**** If an OOM error occurs, this function always sets db->mallocFailed.** This means if the caller does not care about other errors, the return** code may be ignored.*/int sqlite3AnalysisLoad(sqlite3 *db, int iDb){  analysisInfo sInfo;  HashElem *i;  char *zSql;  int rc;  assert( iDb>=0 && iDb<db->nDb );  assert( db->aDb[iDb].pBt!=0 );  /* Clear any prior statistics */  assert( sqlite3SchemaMutexHeld(db, iDb, 0) );  for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){    Index *pIdx = (Index *) sqliteHashData(i);    sqlite3DefaultRowEst(pIdx);    sqlite3DeleteIndexSamples(db, pIdx);    pIdx->aSample = 0;  }  /* Check to make sure the sqlite_stat1 table exists */  sInfo.db = db;  sInfo.zDatabase = db->aDb[iDb].zName;  if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)==0 ){    return SQLITE_ERROR;  }  /* Load new statistics out of the sqlite_stat1 table */  zSql = sqlite3MPrintf(db,       "SELECT tbl, idx, stat FROM %Q.sqlite_stat1", sInfo.zDatabase);  if( zSql==0 ){    rc = SQLITE_NOMEM;  }else{    rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0);    sqlite3DbFree(db, zSql);  }  /* Load the statistics from the sqlite_stat2 table. */#ifdef SQLITE_ENABLE_STAT2  if( rc==SQLITE_OK && !sqlite3FindTable(db, "sqlite_stat2", sInfo.zDatabase) ){    rc = SQLITE_ERROR;  }  if( rc==SQLITE_OK ){    sqlite3_stmt *pStmt = 0;    zSql = sqlite3MPrintf(db,         "SELECT idx,sampleno,sample FROM %Q.sqlite_stat2", sInfo.zDatabase);    if( !zSql ){      rc = SQLITE_NOMEM;    }else{      rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);      sqlite3DbFree(db, zSql);    }    if( rc==SQLITE_OK ){      while( sqlite3_step(pStmt)==SQLITE_ROW ){        char *zIndex;   /* Index name */        Index *pIdx;    /* Pointer to the index object */        zIndex = (char *)sqlite3_column_text(pStmt, 0);        pIdx = zIndex ? sqlite3FindIndex(db, zIndex, sInfo.zDatabase) : 0;        if( pIdx ){          int iSample = sqlite3_column_int(pStmt, 1);          if( iSample<SQLITE_INDEX_SAMPLES && iSample>=0 ){            int eType = sqlite3_column_type(pStmt, 2);            if( pIdx->aSample==0 ){              static const int sz = sizeof(IndexSample)*SQLITE_INDEX_SAMPLES;              pIdx->aSample = (IndexSample *)sqlite3DbMallocRaw(0, sz);              if( pIdx->aSample==0 ){                db->mallocFailed = 1;                break;              }	      memset(pIdx->aSample, 0, sz);            }            assert( pIdx->aSample );            {              IndexSample *pSample = &pIdx->aSample[iSample];              pSample->eType = (u8)eType;              if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){//.........这里部分代码省略.........
开发者ID:sunyangkobe,项目名称:db_research,代码行数:101,


示例13: sqlite3CodeRowTrigger

/*** This is called to code FOR EACH ROW triggers.**** When the code that this function generates is executed, the following ** must be true:**** 1. No cursors may be open in the main database.  (But newIdx and oldIdx**    can be indices of cursors in temporary tables.  See below.)**** 2. If the triggers being coded are ON INSERT or ON UPDATE triggers, then**    a temporary vdbe cursor (index newIdx) must be open and pointing at**    a row containing values to be substituted for new.* expressions in the**    trigger program(s).**** 3. If the triggers being coded are ON DELETE or ON UPDATE triggers, then**    a temporary vdbe cursor (index oldIdx) must be open and pointing at**    a row containing values to be substituted for old.* expressions in the**    trigger program(s).**** If they are not NULL, the piOldColMask and piNewColMask output variables** are set to values that describe the columns used by the trigger program** in the OLD.* and NEW.* tables respectively. If column N of the ** pseudo-table is read at least once, the corresponding bit of the output** mask is set. If a column with an index greater than 32 is read, the** output mask is set to the special value 0xffffffff.***/int sqlite3CodeRowTrigger(  Parse *pParse,       /* Parse context */  Trigger *pTrigger,   /* List of triggers on table pTab */  int op,              /* One of TK_UPDATE, TK_INSERT, TK_DELETE */  ExprList *pChanges,  /* Changes list for any UPDATE OF triggers */  int tr_tm,           /* One of TRIGGER_BEFORE, TRIGGER_AFTER */  Table *pTab,         /* The table to code triggers from */  int newIdx,          /* The indice of the "new" row to access */  int oldIdx,          /* The indice of the "old" row to access */  int orconf,          /* ON CONFLICT policy */  int ignoreJump,      /* Instruction to jump to for RAISE(IGNORE) */  u32 *piOldColMask,   /* OUT: Mask of columns used from the OLD.* table */  u32 *piNewColMask    /* OUT: Mask of columns used from the NEW.* table */){  Trigger *p;  sqlite3 *db = pParse->db;  TriggerStack trigStackEntry;  trigStackEntry.oldColMask = 0;  trigStackEntry.newColMask = 0;  assert(op == TK_UPDATE || op == TK_INSERT || op == TK_DELETE);  assert(tr_tm == TRIGGER_BEFORE || tr_tm == TRIGGER_AFTER );  assert(newIdx != -1 || oldIdx != -1);  for(p=pTrigger; p; p=p->pNext){    int fire_this = 0;    /* Sanity checking:  The schema for the trigger and for the table are    ** always defined.  The trigger must be in the same schema as the table    ** or else it must be a TEMP trigger. */    assert( p->pSchema!=0 );    assert( p->pTabSchema!=0 );    assert( p->pSchema==p->pTabSchema || p->pSchema==db->aDb[1].pSchema );    /* Determine whether we should code this trigger */    if(       p->op==op &&       p->tr_tm==tr_tm &&       checkColumnOverlap(p->pColumns,pChanges)    ){      TriggerStack *pS;      /* Pointer to trigger-stack entry */      for(pS=pParse->trigStack; pS && p!=pS->pTrigger; pS=pS->pNext){}      if( !pS ){        fire_this = 1;      }#if 0    /* Give no warning for recursive triggers.  Just do not do them */      else{        sqlite3ErrorMsg(pParse, "recursive triggers not supported (%s)",            p->name);        return SQLITE_ERROR;      }#endif    }     if( fire_this ){      int endTrigger;      Expr * whenExpr;      AuthContext sContext;      NameContext sNC;#ifndef SQLITE_OMIT_TRACE      sqlite3VdbeAddOp4(pParse->pVdbe, OP_Trace, 0, 0, 0,                        sqlite3MPrintf(db, "-- TRIGGER %s", p->name),                        P4_DYNAMIC);#endif      memset(&sNC, 0, sizeof(sNC));      sNC.pParse = pParse;      /* Push an entry on to the trigger stack */      trigStackEntry.pTrigger = p;      trigStackEntry.newIdx = newIdx;//.........这里部分代码省略.........
开发者ID:Ramananda,项目名称:sqlcipher,代码行数:101,


示例14: sqlite3Update

/*** Process an UPDATE statement.****   UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL;**          /_______/ /________/     /______/       /________________/*            onError   pTabList      pChanges             pWhere*/void sqlite3Update(  Parse *pParse,         /* The parser context */  SrcList *pTabList,     /* The table in which we should change things */  ExprList *pChanges,    /* Things to be changed */  Expr *pWhere,          /* The WHERE clause.  May be null */  int onError            /* How to handle constraint errors */){  int i, j;              /* Loop counters */  Table *pTab;           /* The table to be updated */  int addrTop = 0;       /* VDBE instruction address of the start of the loop */  WhereInfo *pWInfo;     /* Information about the WHERE clause */  Vdbe *v;               /* The virtual database engine */  Index *pIdx;           /* For looping over indices */  Index *pPk;            /* The PRIMARY KEY index for WITHOUT ROWID tables */  int nIdx;              /* Number of indices that need updating */  int iBaseCur;          /* Base cursor number */  int iDataCur;          /* Cursor for the canonical data btree */  int iIdxCur;           /* Cursor for the first index */  sqlite3 *db;           /* The database structure */  int *aRegIdx = 0;      /* One register assigned to each index to be updated */  int *aXRef = 0;        /* aXRef[i] is the index in pChanges->a[] of the                         ** an expression for the i-th column of the table.                         ** aXRef[i]==-1 if the i-th column is not changed. */  u8 *aToOpen;           /* 1 for tables and indices to be opened */  u8 chngPk;             /* PRIMARY KEY changed in a WITHOUT ROWID table */  u8 chngRowid;          /* Rowid changed in a normal table */  u8 chngKey;            /* Either chngPk or chngRowid */  Expr *pRowidExpr = 0;  /* Expression defining the new record number */  AuthContext sContext;  /* The authorization context */  NameContext sNC;       /* The name-context to resolve expressions in */  int iDb;               /* Database containing the table being updated */  int okOnePass;         /* True for one-pass algorithm without the FIFO */  int hasFK;             /* True if foreign key processing is required */  int labelBreak;        /* Jump here to break out of UPDATE loop */  int labelContinue;     /* Jump here to continue next step of UPDATE loop */#ifndef SQLITE_OMIT_TRIGGER  int isView;            /* True when updating a view (INSTEAD OF trigger) */  Trigger *pTrigger;     /* List of triggers on pTab, if required */  int tmask;             /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */#endif  int newmask;           /* Mask of NEW.* columns accessed by BEFORE triggers */  int iEph = 0;          /* Ephemeral table holding all primary key values */  int nKey = 0;          /* Number of elements in regKey for WITHOUT ROWID */  int aiCurOnePass[2];   /* The write cursors opened by WHERE_ONEPASS */  /* Register Allocations */  int regRowCount = 0;   /* A count of rows changed */  int regOldRowid;       /* The old rowid */  int regNewRowid;       /* The new rowid */  int regNew;            /* Content of the NEW.* table in triggers */  int regOld = 0;        /* Content of OLD.* table in triggers */  int regRowSet = 0;     /* Rowset of rows to be updated */  int regKey = 0;        /* composite PRIMARY KEY value */  memset(&sContext, 0, sizeof(sContext));  db = pParse->db;  if( pParse->nErr || db->mallocFailed ){    goto update_cleanup;  }  assert( pTabList->nSrc==1 );  /* Locate the table which we want to update.   */  pTab = sqlite3SrcListLookup(pParse, pTabList);  if( pTab==0 ) goto update_cleanup;  iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);#if defined(SQLITE_ENABLE_SELINUX)if(0!=sqlite3StrNICmp(pTab->zName, "sqlite_", 7) && 0!=sqlite3StrNICmp(pTab->zName, "selinux_", 8)) {  /* MODIFIED */  Expr *pNewWhere = NULL;  char *f_name = sqlite3MPrintf(db, "%s", "selinux_check_access");  char *f_column = sqlite3MPrintf(db, "%s", "security_context");  char *f_class = sqlite3MPrintf(db, "%s", "db_tuple");  char *f_action = sqlite3MPrintf(db, "%s", "update");  for(i = 0; i < pTabList->nAlloc; i++){      Expr *pFName = sqlite3DbMallocZero(db, sizeof(Expr) + strlen(f_name) + 1);      Expr *pFTable = sqlite3DbMallocZero(db, sizeof(Expr) + strlen(pTabList->a[i].zName) + 1);      Expr *pFColumn = sqlite3DbMallocZero(db, sizeof(Expr) + strlen(f_column) + 1);      Expr *pFClass = sqlite3DbMallocZero(db, sizeof(Expr) + strlen(f_class) + 1);      Expr *pFAction = sqlite3DbMallocZero(db, sizeof(Expr) + strlen(f_action) + 1);      Expr *pFDebug = sqlite3DbMallocZero(db, sizeof(Expr) + strlen(pTabList->a[i].zName) + 1);      Expr *pFunction = sqlite3DbMallocZero(db, sizeof(Expr));    pFName->op = (u8)153;     pFName->iAgg = -1;    pFTable->op = (u8)27;//.........这里部分代码省略.........
开发者ID:vsimple,项目名称:sesqlite,代码行数:101,


示例15: attachFunc

static void attachFunc(  sqlite3_context *context,  int NotUsed,  sqlite3_value **argv){  int i;  int rc = 0;  sqlite3 *db = sqlite3_context_db_handle(context);  const char *zName;  const char *zFile;  Db *aNew;  char *zErrDyn = 0;  UNUSED_PARAMETER(NotUsed);  zFile = (const char *)sqlite3_value_text(argv[0]);  zName = (const char *)sqlite3_value_text(argv[1]);  if( zFile==0 ) zFile = "";  if( zName==0 ) zName = "";  if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){    zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d",       db->aLimit[SQLITE_LIMIT_ATTACHED]    );    goto attach_error;  }  if( !db->autoCommit ){    zErrDyn = sqlite3MPrintf(db, "cannot ATTACH database within transaction");    goto attach_error;  }  for(i=0; i<db->nDb; i++){    char *z = db->aDb[i].zName;    assert( z && zName );    if( sqlite3StrICmp(z, zName)==0 ){      zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName);      goto attach_error;    }  }  if( db->aDb==db->aDbStatic ){    aNew = sqlite3DbMallocRaw(db, sizeof(db->aDb[0])*3 );    if( aNew==0 ) return;    memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);  }else{    aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );    if( aNew==0 ) return;  }  db->aDb = aNew;  aNew = &db->aDb[db->nDb];  memset(aNew, 0, sizeof(*aNew));  rc = sqlite3BtreeOpen(zFile, db, &aNew->pBt, 0,                        db->openFlags | SQLITE_OPEN_MAIN_DB);  db->nDb++;  if( rc==SQLITE_CONSTRAINT ){    rc = SQLITE_ERROR;    zErrDyn = sqlite3MPrintf(db, "database is already attached");  }else if( rc==SQLITE_OK ){    Pager *pPager;    aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt);    if( !aNew->pSchema ){      rc = SQLITE_NOMEM;    }else if( aNew->pSchema->file_format && aNew->pSchema->enc!=ENC(db) ){      zErrDyn = sqlite3MPrintf(db,         "attached databases must use the same text encoding as main database");      rc = SQLITE_ERROR;    }    pPager = sqlite3BtreePager(aNew->pBt);    sqlite3PagerLockingMode(pPager, db->dfltLockMode);    sqlite3BtreeSecureDelete(aNew->pBt,                             sqlite3BtreeSecureDelete(db->aDb[0].pBt,-1) );  }  aNew->safety_level = 3;  aNew->zName = sqlite3DbStrDup(db, zName);  if( rc==SQLITE_OK && aNew->zName==0 ){    rc = SQLITE_NOMEM;  }#ifdef SQLITE_HAS_CODEC  if( rc==SQLITE_OK ){    extern int sqlite3CodecAttach(sqlite3*, int, const void*, int);    extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*);    int nKey;    char *zKey;    int t = sqlite3_value_type(argv[2]);    switch( t ){      case SQLITE_INTEGER:      case SQLITE_FLOAT:        zErrDyn = sqlite3DbStrDup(db, "Invalid key value");        rc = SQLITE_ERROR;        break;              case SQLITE_TEXT:      case SQLITE_BLOB:        nKey = sqlite3_value_bytes(argv[2]);        zKey = (char *)sqlite3_value_blob(argv[2]);        rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey);        break;//.........这里部分代码省略.........
开发者ID:qtekfun,项目名称:htcDesire820Kernel,代码行数:101,


示例16: codeTriggerProgram

/*** Generate VDBE code for the statements inside the body of a single ** trigger.*/static int codeTriggerProgram(  Parse *pParse,            /* The parser context */  TriggerStep *pStepList,   /* List of statements inside the trigger body */  int orconf                /* Conflict algorithm. (OE_Abort, etc) */  ){  TriggerStep *pStep;  Vdbe *v = pParse->pVdbe;  sqlite3 *db = pParse->db;  assert( pParse->pTriggerTab && pParse->pToplevel );  assert( pStepList );  assert( v!=0 );  for(pStep=pStepList; pStep; pStep=pStep->pNext){    /* Figure out the ON CONFLICT policy that will be used for this step    ** of the trigger program. If the statement that caused this trigger    ** to fire had an explicit ON CONFLICT, then use it. Otherwise, use    ** the ON CONFLICT policy that was specified as part of the trigger    ** step statement. Example:    **    **   CREATE TRIGGER AFTER INSERT ON t1 BEGIN;    **     INSERT OR REPLACE INTO t2 VALUES(new.a, new.b);    **   END;    **    **   INSERT INTO t1 ... ;            -- insert into t2 uses REPLACE policy    **   INSERT OR IGNORE INTO t1 ... ;  -- insert into t2 uses IGNORE policy    */    pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf;    assert( pParse->okConstFactor==0 );#ifndef SQLITE_OMIT_TRACE    if( pStep->zSpan ){      sqlite3VdbeAddOp4(v, OP_Trace, 0x7fffffff, 1, 0,                        sqlite3MPrintf(db, "-- %s", pStep->zSpan),                        P4_DYNAMIC);    }#endif    switch( pStep->op ){      case TK_UPDATE: {        sqlite3Update(pParse,           targetSrcList(pParse, pStep),          sqlite3ExprListDup(db, pStep->pExprList, 0),           sqlite3ExprDup(db, pStep->pWhere, 0),           pParse->eOrconf, 0, 0, 0        );        break;      }      case TK_INSERT: {        sqlite3Insert(pParse,           targetSrcList(pParse, pStep),          sqlite3SelectDup(db, pStep->pSelect, 0),           sqlite3IdListDup(db, pStep->pIdList),           pParse->eOrconf,          sqlite3UpsertDup(db, pStep->pUpsert)        );        break;      }      case TK_DELETE: {        sqlite3DeleteFrom(pParse,           targetSrcList(pParse, pStep),          sqlite3ExprDup(db, pStep->pWhere, 0), 0, 0        );        break;      }      default: assert( pStep->op==TK_SELECT ); {        SelectDest sDest;        Select *pSelect = sqlite3SelectDup(db, pStep->pSelect, 0);        sqlite3SelectDestInit(&sDest, SRT_Discard, 0);        sqlite3Select(pParse, pSelect, &sDest);        sqlite3SelectDelete(db, pSelect);        break;      }    }     if( pStep->op!=TK_SELECT ){      sqlite3VdbeAddOp0(v, OP_ResetCount);    }  }  return 0;}
开发者ID:cris-auts,项目名称:linux_c_study,代码行数:84,


示例17: sqlite3Pragma

/*** Process a pragma statement.  **** Pragmas are of this form:****      PRAGMA [database.]id [= value]**** The identifier might also be a string.  The value is a string, and** identifier, or a number.  If minusFlag is true, then the value is** a number that was preceded by a minus sign.**** If the left side is "database.id" then pId1 is the database name** and pId2 is the id.  If the left side is just "id" then pId1 is the** id and pId2 is any empty string.*/void sqlite3Pragma(  Parse *pParse,   Token *pId1,        /* First part of [database.]id field */  Token *pId2,        /* Second part of [database.]id field, or NULL */  Token *pValue,      /* Token for <value>, or NULL */  int minusFlag       /* True if a '-' sign preceded <value> */){  char *zLeft = 0;       /* Nul-terminated UTF-8 string <id> */  char *zRight = 0;      /* Nul-terminated UTF-8 string <value>, or NULL */  const char *zDb = 0;   /* The database name */  Token *pId;            /* Pointer to <id> token */  int iDb;               /* Database index for <database> */  sqlite3 *db = pParse->db;  Db *pDb;  Vdbe *v = sqlite3GetVdbe(pParse);  if( v==0 ) return;  /* Interpret the [database.] part of the pragma statement. iDb is the  ** index of the database this pragma is being applied to in db.aDb[]. */  iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId);  if( iDb<0 ) return;  pDb = &db->aDb[iDb];  zLeft = sqlite3NameFromToken(pId);  if( !zLeft ) return;  if( minusFlag ){    zRight = sqlite3MPrintf("-%T", pValue);  }else{    zRight = sqlite3NameFromToken(pValue);  }  zDb = ((iDb>0)?pDb->zName:0);  if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){    goto pragma_out;  } #ifndef SQLITE_OMIT_PAGER_PRAGMAS  /*  **  PRAGMA [database.]default_cache_size  **  PRAGMA [database.]default_cache_size=N  **  ** The first form reports the current persistent setting for the  ** page cache size.  The value returned is the maximum number of  ** pages in the page cache.  The second form sets both the current  ** page cache size value and the persistent page cache size value  ** stored in the database file.  **  ** The default cache size is stored in meta-value 2 of page 1 of the  ** database file.  The cache size is actually the absolute value of  ** this memory location.  The sign of meta-value 2 determines the  ** synchronous setting.  A negative value means synchronous is off  ** and a positive value means synchronous is on.  */  if( sqlite3StrICmp(zLeft,"default_cache_size")==0 ){    static const VdbeOpList getCacheSize[] = {      { OP_ReadCookie,  0, 2,        0},  /* 0 */      { OP_AbsValue,    0, 0,        0},      { OP_Dup,         0, 0,        0},      { OP_Integer,     0, 0,        0},      { OP_Ne,          0, 6,        0},      { OP_Integer,     0, 0,        0},  /* 5 */      { OP_Callback,    1, 0,        0},    };    int addr;    if( sqlite3ReadSchema(pParse) ) goto pragma_out;    if( !zRight ){      sqlite3VdbeSetNumCols(v, 1);      sqlite3VdbeSetColName(v, 0, "cache_size", P3_STATIC);      addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize);      sqlite3VdbeChangeP1(v, addr, iDb);      sqlite3VdbeChangeP1(v, addr+5, MAX_PAGES);    }else{      int size = atoi(zRight);      if( size<0 ) size = -size;      sqlite3BeginWriteOperation(pParse, 0, iDb);      sqlite3VdbeAddOp(v, OP_Integer, size, 0);      sqlite3VdbeAddOp(v, OP_ReadCookie, iDb, 2);      addr = sqlite3VdbeAddOp(v, OP_Integer, 0, 0);      sqlite3VdbeAddOp(v, OP_Ge, 0, addr+3);      sqlite3VdbeAddOp(v, OP_Negative, 0, 0);      sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 2);      pDb->cache_size = size;      sqlite3BtreeSetCacheSize(pDb->pBt, pDb->cache_size);    }  }else//.........这里部分代码省略.........
开发者ID:JeremiasE,项目名称:KFormula,代码行数:101,


示例18: sqlite3_blob_open

//.........这里部分代码省略.........    sqlite3BtreeEnterAll(db);    pTab = sqlite3LocateTable(pParse, 0, zTable, zDb);    if( pTab && IsVirtual(pTab) ){      pTab = 0;      sqlite3ErrorMsg(pParse, "cannot open virtual table: %s", zTable);    }#ifndef SQLITE_OMIT_VIEW    if( pTab && pTab->pSelect ){      pTab = 0;      sqlite3ErrorMsg(pParse, "cannot open view: %s", zTable);    }#endif    if( !pTab ){      if( pParse->zErrMsg ){        sqlite3DbFree(db, zErr);        zErr = pParse->zErrMsg;        pParse->zErrMsg = 0;      }      rc = SQLITE_ERROR;      (void)sqlite3SafetyOff(db);      sqlite3BtreeLeaveAll(db);      goto blob_open_out;    }    /* Now search pTab for the exact column. */    for(iCol=0; iCol < pTab->nCol; iCol++) {      if( sqlite3StrICmp(pTab->aCol[iCol].zName, zColumn)==0 ){        break;      }    }    if( iCol==pTab->nCol ){      sqlite3DbFree(db, zErr);      zErr = sqlite3MPrintf(db, "no such column: /"%s/"", zColumn);      rc = SQLITE_ERROR;      (void)sqlite3SafetyOff(db);      sqlite3BtreeLeaveAll(db);      goto blob_open_out;    }    /* If the value is being opened for writing, check that the    ** column is not indexed, and that it is not part of a foreign key.     ** It is against the rules to open a column to which either of these    ** descriptions applies for writing.  */    if( flags ){      const char *zFault = 0;      Index *pIdx;#ifndef SQLITE_OMIT_FOREIGN_KEY      if( db->flags&SQLITE_ForeignKeys ){        /* Check that the column is not part of an FK child key definition. It        ** is not necessary to check if it is part of a parent key, as parent        ** key columns must be indexed. The check below will pick up this         ** case.  */        FKey *pFKey;        for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){          int j;          for(j=0; j<pFKey->nCol; j++){            if( pFKey->aCol[j].iFrom==iCol ){              zFault = "foreign key";            }          }        }      }#endif      for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){        int j;
开发者ID:biddyweb,项目名称:mediastream-plus,代码行数:67,


示例19: sqlite3FinishTrigger

/*** This routine is called after all of the trigger actions have been parsed** in order to complete the process of building the trigger.*/void sqlite3FinishTrigger(  Parse *pParse,          /* Parser context */  TriggerStep *pStepList, /* The triggered program */  Token *pAll             /* Token that describes the complete CREATE TRIGGER */){  Trigger *pTrig = 0;     /* The trigger whose construction is finishing up */  sqlite3 *db = pParse->db;  /* The database */  DbFixer sFix;  int iDb;                   /* Database containing the trigger */  pTrig = pParse->pNewTrigger;  pParse->pNewTrigger = 0;  if( pParse->nErr || !pTrig ) goto triggerfinish_cleanup;  iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);  pTrig->step_list = pStepList;  while( pStepList ){    pStepList->pTrig = pTrig;    pStepList = pStepList->pNext;  }  if( sqlite3FixInit(&sFix, pParse, iDb, "trigger", &pTrig->nameToken)           && sqlite3FixTriggerStep(&sFix, pTrig->step_list) ){    goto triggerfinish_cleanup;  }  /* if we are not initializing, and this trigger is not on a TEMP table,   ** build the sqlite_master entry  */  if( !db->init.busy ){    static const VdbeOpList insertTrig[] = {      { OP_NewRowid,   0, 0,  0          },      { OP_String8,    0, 0,  "trigger"  },      { OP_String8,    0, 0,  0          },  /* 2: trigger name */      { OP_String8,    0, 0,  0          },  /* 3: table name */      { OP_Integer,    0, 0,  0          },      { OP_String8,    0, 0,  "CREATE TRIGGER "},      { OP_String8,    0, 0,  0          },  /* 6: SQL */      { OP_Concat,     0, 0,  0          },       { OP_MakeRecord, 5, 0,  "aaada"    },      { OP_Insert,     0, 0,  0          },    };    int addr;    Vdbe *v;    /* Make an entry in the sqlite_master table */    v = sqlite3GetVdbe(pParse);    if( v==0 ) goto triggerfinish_cleanup;    sqlite3BeginWriteOperation(pParse, 0, iDb);    sqlite3OpenMasterTable(pParse, iDb);    addr = sqlite3VdbeAddOpList(v, ArraySize(insertTrig), insertTrig);    sqlite3VdbeChangeP3(v, addr+2, pTrig->name, 0);     sqlite3VdbeChangeP3(v, addr+3, pTrig->table, 0);     sqlite3VdbeChangeP3(v, addr+6, (char*)pAll->z, pAll->n);    sqlite3ChangeCookie(db, v, iDb);    sqlite3VdbeAddOp(v, OP_Close, 0, 0);    sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0,        sqlite3MPrintf("type='trigger' AND name='%q'", pTrig->name), P3_DYNAMIC);  }  if( db->init.busy ){    int n;    Table *pTab;    Trigger *pDel;    pDel = sqlite3HashInsert(&db->aDb[iDb].pSchema->trigHash,                      pTrig->name, strlen(pTrig->name), pTrig);    if( pDel ){      assert( sqlite3MallocFailed() && pDel==pTrig );      goto triggerfinish_cleanup;    }    n = strlen(pTrig->table) + 1;    pTab = sqlite3HashFind(&pTrig->pTabSchema->tblHash, pTrig->table, n);    assert( pTab!=0 );    pTrig->pNext = pTab->pTrigger;    pTab->pTrigger = pTrig;    pTrig = 0;  }triggerfinish_cleanup:  sqlite3DeleteTrigger(pTrig);  assert( !pParse->pNewTrigger );  sqlite3DeleteTriggerStep(pStepList);}
开发者ID:9iky6,项目名称:amxmodx,代码行数:85,


示例20: sqlite3VtabFinishParse

/*** The parser calls this routine after the CREATE VIRTUAL TABLE statement** has been completely parsed.*/void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){  Table *pTab = pParse->pNewTable;  /* The table being constructed */  sqlite3 *db = pParse->db;         /* The database connection */  if( pTab==0 ) return;  addArgumentToVtab(pParse);  pParse->sArg.z = 0;  if( pTab->nModuleArg<1 ) return;    /* If the CREATE VIRTUAL TABLE statement is being entered for the  ** first time (in other words if the virtual table is actually being  ** created now instead of just being read out of sqlite_master) then  ** do additional initialization work and store the statement text  ** in the sqlite_master table.  */  if( !db->init.busy ){    char *zStmt;    char *zWhere;    int iDb;    Vdbe *v;    /* Compute the complete text of the CREATE VIRTUAL TABLE statement */    if( pEnd ){      pParse->sNameToken.n = (int)(pEnd->z - pParse->sNameToken.z) + pEnd->n;    }    zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken);    /* A slot for the record has already been allocated in the     ** SQLITE_MASTER table.  We just need to update that slot with all    ** the information we've collected.      **    ** The VM register number pParse->regRowid holds the rowid of an    ** entry in the sqlite_master table tht was created for this vtab    ** by sqlite3StartTable().    */    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);    sqlite3NestedParse(pParse,      "UPDATE %Q.%s "         "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q "       "WHERE rowid=#%d",      db->aDb[iDb].zName, SCHEMA_TABLE(iDb),      pTab->zName,      pTab->zName,      zStmt,      pParse->regRowid    );    sqlite3DbFree(db, zStmt);    v = sqlite3GetVdbe(pParse);    sqlite3ChangeCookie(pParse, iDb);    sqlite3VdbeAddOp2(v, OP_Expire, 0, 0);    zWhere = sqlite3MPrintf(db, "name='%q'", pTab->zName);    sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 1, 0, zWhere, P4_DYNAMIC);    sqlite3VdbeAddOp4(v, OP_VCreate, iDb, 0, 0,                          pTab->zName, sqlite3Strlen30(pTab->zName) + 1);  }  /* If we are rereading the sqlite_master table create the in-memory  ** record of the table. The xConnect() method is not called until  ** the first time the virtual table is used in an SQL statement. This  ** allows a schema that contains virtual tables to be loaded before  ** the required virtual table implementations are registered.  */  else {    Table *pOld;    Schema *pSchema = pTab->pSchema;    const char *zName = pTab->zName;    int nName = sqlite3Strlen30(zName);    pOld = sqlite3HashInsert(&pSchema->tblHash, zName, nName, pTab);    if( pOld ){      db->mallocFailed = 1;      assert( pTab==pOld );  /* Malloc must have failed inside HashInsert() */      return;    }    pSchema->db = pParse->db;    pParse->pNewTable = 0;  }}
开发者ID:sukantoguha,项目名称:INET-Vagrant-Demos,代码行数:81,


示例21: sqlite3RunParser

/*** Run the parser on the given SQL string.  The parser structure is** passed in.  An SQLITE_ status code is returned.  If an error occurs** and pzErrMsg!=NULL then an error message might be written into ** memory obtained from malloc() and *pzErrMsg made to point to that** error message.  Or maybe not.*/int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){  int nErr = 0;  int i;  void *pEngine;  int tokenType;  int lastTokenParsed = -1;  sqlite3 *db = pParse->db;  if( db->activeVdbeCnt==0 ){    db->u1.isInterrupted = 0;  }  pParse->rc = SQLITE_OK;  i = 0;  pEngine = sqlite3ParserAlloc((void*(*)(size_t))sqlite3MallocX);  if( pEngine==0 ){    return SQLITE_NOMEM;  }  assert( pParse->sLastToken.dyn==0 );  assert( pParse->pNewTable==0 );  assert( pParse->pNewTrigger==0 );  assert( pParse->nVar==0 );  assert( pParse->nVarExpr==0 );  assert( pParse->nVarExprAlloc==0 );  assert( pParse->apVarExpr==0 );  pParse->zTail = pParse->zSql = zSql;  while( !sqlite3MallocFailed() && zSql[i]!=0 ){    assert( i>=0 );    pParse->sLastToken.z = (u8*)&zSql[i];    assert( pParse->sLastToken.dyn==0 );    pParse->sLastToken.n = getToken((unsigned char*)&zSql[i],&tokenType);    i += pParse->sLastToken.n;    if( i>SQLITE_MAX_SQL_LENGTH ){      pParse->rc = SQLITE_TOOBIG;      break;    }    switch( tokenType ){      case TK_SPACE:      case TK_COMMENT: {        if( db->u1.isInterrupted ){          pParse->rc = SQLITE_INTERRUPT;          sqlite3SetString(pzErrMsg, "interrupt", (char*)0);          goto abort_parse;        }        break;      }      case TK_ILLEGAL: {        if( pzErrMsg ){          sqliteFree(*pzErrMsg);          *pzErrMsg = sqlite3MPrintf("unrecognized token: /"%T/"",                          &pParse->sLastToken);        }        nErr++;        goto abort_parse;      }      case TK_SEMI: {        pParse->zTail = &zSql[i];        /* Fall thru into the default case */      }      default: {        sqlite3Parser(pEngine, tokenType, pParse->sLastToken, pParse);        lastTokenParsed = tokenType;        if( pParse->rc!=SQLITE_OK ){          goto abort_parse;        }        break;      }    }  }abort_parse:  if( zSql[i]==0 && nErr==0 && pParse->rc==SQLITE_OK ){    if( lastTokenParsed!=TK_SEMI ){      sqlite3Parser(pEngine, TK_SEMI, pParse->sLastToken, pParse);      pParse->zTail = &zSql[i];    }    sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse);  }  sqlite3ParserFree(pEngine, sqlite3FreeX);  if( sqlite3MallocFailed() ){    pParse->rc = SQLITE_NOMEM;  }  if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){    sqlite3SetString(&pParse->zErrMsg, sqlite3ErrStr(pParse->rc), (char*)0);  }  if( pParse->zErrMsg ){    if( pzErrMsg && *pzErrMsg==0 ){      *pzErrMsg = pParse->zErrMsg;    }else{      sqliteFree(pParse->zErrMsg);    }    pParse->zErrMsg = 0;    if( !nErr ) nErr++;  }  if( pParse->pVdbe && pParse->nErr>0 && pParse->nested==0 ){//.........这里部分代码省略.........
开发者ID:bluebellzhy,项目名称:chromium,代码行数:101,


示例22: sqlite3ValueFromExpr

/*** Create a new sqlite3_value object, containing the value of pExpr.**** This only works for very simple expressions that consist of one constant** token (i.e. "5", "5.1", "'a string'"). If the expression can** be converted directly into a value, then the value is allocated and** a pointer written to *ppVal. The caller is responsible for deallocating** the value by passing it to sqlite3ValueFree() later on. If the expression** cannot be converted to a value, then *ppVal is set to NULL.*/int sqlite3ValueFromExpr(  sqlite3 *db,              /* The database connection */  Expr *pExpr,              /* The expression to evaluate */  u8 enc,                   /* Encoding to use */  u8 affinity,              /* Affinity to use */  sqlite3_value **ppVal     /* Write the new value here */){  int op;  char *zVal = 0;  sqlite3_value *pVal = 0;  int negInt = 1;  const char *zNeg = "";  if( !pExpr ){    *ppVal = 0;    return SQLITE_OK;  }  op = pExpr->op;  /* op can only be TK_REGISTER if we have compiled with SQLITE_ENABLE_STAT3.  ** The ifdef here is to enable us to achieve 100% branch test coverage even  ** when SQLITE_ENABLE_STAT3 is omitted.  */#ifdef SQLITE_ENABLE_STAT3  if( op==TK_REGISTER ) op = pExpr->op2;#else  if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;#endif  /* Handle negative integers in a single step.  This is needed in the  ** case when the value is -9223372036854775808.  */  if( op==TK_UMINUS   && (pExpr->pLeft->op==TK_INTEGER || pExpr->pLeft->op==TK_FLOAT) ){    pExpr = pExpr->pLeft;    op = pExpr->op;    negInt = -1;    zNeg = "-";  }  if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){    pVal = sqlite3ValueNew(db);    if( pVal==0 ) goto no_mem;    if( ExprHasProperty(pExpr, EP_IntValue) ){      sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt);    }else{      zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken);      if( zVal==0 ) goto no_mem;      sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC);      if( op==TK_FLOAT ) pVal->type = SQLITE_FLOAT;    }    if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_NONE ){      sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8);    }else{      sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8);    }    if( pVal->flags & (MEM_Int|MEM_Real) ) pVal->flags &= ~MEM_Str;    if( enc!=SQLITE_UTF8 ){      sqlite3VdbeChangeEncoding(pVal, enc);    }  }else if( op==TK_UMINUS ) {    /* This branch happens for multiple negative signs.  Ex: -(-5) */    if( SQLITE_OK==sqlite3ValueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal) ){      sqlite3VdbeMemNumerify(pVal);      if( pVal->u.i==SMALLEST_INT64 ){        pVal->flags &= MEM_Int;        pVal->flags |= MEM_Real;        pVal->r = (double)LARGEST_INT64;      }else{        pVal->u.i = -pVal->u.i;      }      pVal->r = -pVal->r;      sqlite3ValueApplyAffinity(pVal, affinity, enc);    }  }else if( op==TK_NULL ){    pVal = sqlite3ValueNew(db);    if( pVal==0 ) goto no_mem;  }#ifndef SQLITE_OMIT_BLOB_LITERAL  else if( op==TK_BLOB ){    int nVal;    assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' );    assert( pExpr->u.zToken[1]=='/'' );    pVal = sqlite3ValueNew(db);    if( !pVal ) goto no_mem;    zVal = &pExpr->u.zToken[2];    nVal = sqlite3Strlen30(zVal)-1;    assert( zVal[nVal]=='/'' );    sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2,                         0, SQLITE_DYNAMIC);//.........这里部分代码省略.........
开发者ID:aosm,项目名称:SQLite,代码行数:101,


示例23: sqlite3ParseToplevel

/*** Create and populate a new TriggerPrg object with a sub-program ** implementing trigger pTrigger with ON CONFLICT policy orconf.*/static TriggerPrg *codeRowTrigger(  Parse *pParse,       /* Current parse context */  Trigger *pTrigger,   /* Trigger to code */  Table *pTab,         /* The table pTrigger is attached to */  int orconf           /* ON CONFLICT policy to code trigger program with */){  Parse *pTop = sqlite3ParseToplevel(pParse);  sqlite3 *db = pParse->db;   /* Database handle */  TriggerPrg *pPrg;           /* Value to return */  Expr *pWhen = 0;            /* Duplicate of trigger WHEN expression */  Vdbe *v;                    /* Temporary VM */  NameContext sNC;            /* Name context for sub-vdbe */  SubProgram *pProgram = 0;   /* Sub-vdbe for trigger program */  Parse *pSubParse;           /* Parse context for sub-vdbe */  int iEndTrigger = 0;        /* Label to jump to if WHEN is false */  assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );  assert( pTop->pVdbe );  /* Allocate the TriggerPrg and SubProgram objects. To ensure that they  ** are freed if an error occurs, link them into the Parse.pTriggerPrg   ** list of the top-level Parse object sooner rather than later.  */  pPrg = sqlite3DbMallocZero(db, sizeof(TriggerPrg));  if( !pPrg ) return 0;  pPrg->pNext = pTop->pTriggerPrg;  pTop->pTriggerPrg = pPrg;  pPrg->pProgram = pProgram = sqlite3DbMallocZero(db, sizeof(SubProgram));  if( !pProgram ) return 0;  sqlite3VdbeLinkSubProgram(pTop->pVdbe, pProgram);  pPrg->pTrigger = pTrigger;  pPrg->orconf = orconf;  pPrg->aColmask[0] = 0xffffffff;  pPrg->aColmask[1] = 0xffffffff;  /* Allocate and populate a new Parse context to use for coding the   ** trigger sub-program.  */  pSubParse = sqlite3StackAllocZero(db, sizeof(Parse));  if( !pSubParse ) return 0;  memset(&sNC, 0, sizeof(sNC));  sNC.pParse = pSubParse;  pSubParse->db = db;  pSubParse->pTriggerTab = pTab;  pSubParse->pToplevel = pTop;  pSubParse->zAuthContext = pTrigger->zName;  pSubParse->eTriggerOp = pTrigger->op;  pSubParse->nQueryLoop = pParse->nQueryLoop;  v = sqlite3GetVdbe(pSubParse);  if( v ){    VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)",       pTrigger->zName, onErrorText(orconf),      (pTrigger->tr_tm==TRIGGER_BEFORE ? "BEFORE" : "AFTER"),        (pTrigger->op==TK_UPDATE ? "UPDATE" : ""),        (pTrigger->op==TK_INSERT ? "INSERT" : ""),        (pTrigger->op==TK_DELETE ? "DELETE" : ""),      pTab->zName    ));#ifndef SQLITE_OMIT_TRACE    sqlite3VdbeChangeP4(v, -1,       sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC    );#endif    /* If one was specified, code the WHEN clause. If it evaluates to false    ** (or NULL) the sub-vdbe is immediately halted by jumping to the     ** OP_Halt inserted at the end of the program.  */    if( pTrigger->pWhen ){      pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0);      if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen)        && db->mallocFailed==0       ){        iEndTrigger = sqlite3VdbeMakeLabel(v);        sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL);      }      sqlite3ExprDelete(db, pWhen);    }    /* Code the trigger program into the sub-vdbe. */    codeTriggerProgram(pSubParse, pTrigger->step_list, orconf);    /* Insert an OP_Halt at the end of the sub-program. */    if( iEndTrigger ){      sqlite3VdbeResolveLabel(v, iEndTrigger);    }    sqlite3VdbeAddOp0(v, OP_Halt);    VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf)));    transferParseError(pParse, pSubParse);    if( db->mallocFailed==0 ){      pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg);    }    pProgram->nMem = pSubParse->nMem;    pProgram->nCsr = pSubParse->nTab;    pProgram->token = (void *)pTrigger;    pPrg->aColmask[0] = pSubParse->oldmask;    pPrg->aColmask[1] = pSubParse->newmask;//.........这里部分代码省略.........
开发者ID:cznic,项目名称:cc,代码行数:101,


示例24: vdbeCommit

/*** A read or write transaction may or may not be active on database handle** db. If a transaction is active, commit it. If there is a** write-transaction spanning more than one database file, this routine** takes care of the master journal trickery.*/static int vdbeCommit(sqlite3 *db){  int i;  int nTrans = 0;  /* Number of databases with an active write-transaction */  int rc = SQLITE_OK;  int needXcommit = 0;  for(i=0; i<db->nDb; i++){     Btree *pBt = db->aDb[i].pBt;    if( pBt && sqlite3BtreeIsInTrans(pBt) ){      needXcommit = 1;      if( i!=1 ) nTrans++;    }  }  /* If there are any write-transactions at all, invoke the commit hook */  if( needXcommit && db->xCommitCallback ){    int rc;    sqlite3SafetyOff(db);    rc = db->xCommitCallback(db->pCommitArg);    sqlite3SafetyOn(db);    if( rc ){      return SQLITE_CONSTRAINT;    }  }  /* The simple case - no more than one database file (not counting the  ** TEMP database) has a transaction active.   There is no need for the  ** master-journal.  **  ** If the return value of sqlite3BtreeGetFilename() is a zero length  ** string, it means the main database is :memory:.  In that case we do  ** not support atomic multi-file commits, so use the simple case then  ** too.  */  if( 0==strlen(sqlite3BtreeGetFilename(db->aDb[0].pBt)) || nTrans<=1 ){    for(i=0; rc==SQLITE_OK && i<db->nDb; i++){       Btree *pBt = db->aDb[i].pBt;      if( pBt ){        rc = sqlite3BtreeSync(pBt, 0);      }    }    /* Do the commit only if all databases successfully synced */    if( rc==SQLITE_OK ){      for(i=0; i<db->nDb; i++){        Btree *pBt = db->aDb[i].pBt;        if( pBt ){          sqlite3BtreeCommit(pBt);        }      }    }  }  /* The complex case - There is a multi-file write-transaction active.  ** This requires a master journal file to ensure the transaction is  ** committed atomicly.  */  else{    char *zMaster = 0;   /* File-name for the master journal */    char const *zMainFile = sqlite3BtreeGetFilename(db->aDb[0].pBt);    OsFile master;    /* Select a master journal file name */    do {      u32 random;      sqliteFree(zMaster);      sqlite3Randomness(sizeof(random), &random);      zMaster = sqlite3MPrintf("%s-mj%08X", zMainFile, random&0x7fffffff);      if( !zMaster ){        return SQLITE_NOMEM;      }    }while( sqlite3OsFileExists(zMaster) );    /* Open the master journal. */    memset(&master, 0, sizeof(master));    rc = sqlite3OsOpenExclusive(zMaster, &master, 0);    if( rc!=SQLITE_OK ){      sqliteFree(zMaster);      return rc;    }     /* Write the name of each database file in the transaction into the new    ** master journal file. If an error occurs at this point close    ** and delete the master journal file. All the individual journal files    ** still have 'null' as the master journal pointer, so they will roll    ** back independantly if a failure occurs.    */    for(i=0; i<db->nDb; i++){       Btree *pBt = db->aDb[i].pBt;      if( i==1 ) continue;   /* Ignore the TEMP database */      if( pBt && sqlite3BtreeIsInTrans(pBt) ){        char const *zFile = sqlite3BtreeGetJournalname(pBt);        if( zFile[0]==0 ) continue;  /* Ignore :memory: databases */        rc = sqlite3OsWrite(&master, zFile, strlen(zFile)+1);//.........这里部分代码省略.........
开发者ID:Shad000w,项目名称:NWNX2-windows,代码行数:101,


示例25: sqlite3_blob_open

//.........这里部分代码省略.........    if( pTab && IsVirtual(pTab) ){      pTab = 0;      sqlite3ErrorMsg(pParse, "cannot open virtual table: %s", zTable);    }    if( pTab && !HasRowid(pTab) ){      pTab = 0;      sqlite3ErrorMsg(pParse, "cannot open table without rowid: %s", zTable);    }#ifndef SQLITE_OMIT_VIEW    if( pTab && pTab->pSelect ){      pTab = 0;      sqlite3ErrorMsg(pParse, "cannot open view: %s", zTable);    }#endif    if( !pTab ){      if( pParse->zErrMsg ){        sqlite3DbFree(db, zErr);        zErr = pParse->zErrMsg;        pParse->zErrMsg = 0;      }      rc = SQLITE_ERROR;      sqlite3BtreeLeaveAll(db);      goto blob_open_out;    }    /* Now search pTab for the exact column. */    for(iCol=0; iCol<pTab->nCol; iCol++) {      if( sqlite3StrICmp(pTab->aCol[iCol].zName, zColumn)==0 ){        break;      }    }    if( iCol==pTab->nCol ){      sqlite3DbFree(db, zErr);      zErr = sqlite3MPrintf(db, "no such column: /"%s/"", zColumn);      rc = SQLITE_ERROR;      sqlite3BtreeLeaveAll(db);      goto blob_open_out;    }    /* If the value is being opened for writing, check that the    ** column is not indexed, and that it is not part of a foreign key.     ** It is against the rules to open a column to which either of these    ** descriptions applies for writing.  */    if( flags ){      const char *zFault = 0;      SIndex *pIdx;#ifndef SQLITE_OMIT_FOREIGN_KEY      if( db->flags&SQLITE_ForeignKeys ){        /* Check that the column is not part of an FK child key definition. It        ** is not necessary to check if it is part of a parent key, as parent        ** key columns must be indexed. The check below will pick up this         ** case.  */        FKey *pFKey;        for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){          int j;          for(j=0; j<pFKey->nCol; j++){            if( pFKey->aCol[j].iFrom==iCol ){              zFault = "foreign key";            }          }        }      }#endif      for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){        int j;        for(j=0; j<pIdx->nKeyCol; j++){
开发者ID:tarantool,项目名称:sqlite,代码行数:67,


示例26: sqlite3AlterBeginAddColumn

/*** This function is called by the parser after the table-name in** an "ALTER TABLE <table-name> ADD" statement is parsed. Argument ** pSrc is the full-name of the table being altered.**** This routine makes a (partial) copy of the Table structure** for the table being altered and sets Parse.pNewTable to point** to it. Routines called by the parser as the column definition** is parsed (i.e. sqlite3AddColumn()) add the new Column data to ** the copy. The copy of the Table structure is deleted by tokenize.c ** after parsing is finished.**** Routine sqlite3AlterFinishAddColumn() will be called to complete** coding the "ALTER TABLE ... ADD" statement.*/void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){  Table *pNew;  Table *pTab;  Vdbe *v;  int iDb;  int i;  int nAlloc;  sqlite3 *db = pParse->db;  /* Look up the table being altered. */  assert( pParse->pNewTable==0 );  assert( sqlite3BtreeHoldsAllMutexes(db) );  if( db->mallocFailed ) goto exit_begin_add_column;  pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]);  if( !pTab ) goto exit_begin_add_column;#ifndef SQLITE_OMIT_VIRTUALTABLE  if( IsVirtual(pTab) ){    sqlite3ErrorMsg(pParse, "virtual tables may not be altered");    goto exit_begin_add_column;  }#endif  /* Make sure this is not an attempt to ALTER a view. */  if( pTab->pSelect ){    sqlite3ErrorMsg(pParse, "Cannot add a column to a view");    goto exit_begin_add_column;  }  if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){    goto exit_begin_add_column;  }  assert( pTab->addColOffset>0 );  iDb = sqlite3SchemaToIndex(db, pTab->pSchema);  /* Put a copy of the Table struct in Parse.pNewTable for the  ** sqlite3AddColumn() function and friends to modify.  But modify  ** the name by adding an "sqlite_altertab_" prefix.  By adding this  ** prefix, we insure that the name will not collide with an existing  ** table because user table are not allowed to have the "sqlite_"  ** prefix on their name.  */  pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table));  if( !pNew ) goto exit_begin_add_column;  pParse->pNewTable = pNew;  pNew->nRef = 1;  pNew->nCol = pTab->nCol;  assert( pNew->nCol>0 );  nAlloc = (((pNew->nCol-1)/8)*8)+8;  assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 );  pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc);  pNew->zName = sqlite3MPrintf(db, "sqlite_altertab_%s", pTab->zName);  if( !pNew->aCol || !pNew->zName ){    db->mallocFailed = 1;    goto exit_begin_add_column;  }  memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol);  for(i=0; i<pNew->nCol; i++){    Column *pCol = &pNew->aCol[i];    pCol->zName = sqlite3DbStrDup(db, pCol->zName);    pCol->zColl = 0;    pCol->zType = 0;    pCol->pDflt = 0;    pCol->zDflt = 0;  }  pNew->pSchema = db->aDb[iDb].pSchema;  pNew->addColOffset = pTab->addColOffset;  pNew->nRef = 1;  /* Begin a transaction and increment the schema cookie.  */  sqlite3BeginWriteOperation(pParse, 0, iDb);  v = sqlite3GetVdbe(pParse);  if( !v ) goto exit_begin_add_column;  sqlite3ChangeCookie(pParse, iDb);exit_begin_add_column:  sqlite3SrcListDelete(db, pSrc);  return;}
开发者ID:0xr0ot,项目名称:sqlcipher,代码行数:94,


示例27: vtabCallConstructor

/*** Invoke a virtual table constructor (either xCreate or xConnect). The** pointer to the function to invoke is passed as the fourth parameter** to this procedure.*/static int vtabCallConstructor(  sqlite3 *db,   Table *pTab,  Module *pMod,  int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**),  char **pzErr){  VtabCtx sCtx;  VTable *pVTable;  int rc;  const char *const*azArg = (const char *const*)pTab->azModuleArg;  int nArg = pTab->nModuleArg;  char *zErr = 0;  char *zModuleName;  int iDb;  VtabCtx *pCtx;  /* Check that the virtual-table is not already being initialized */  for(pCtx=db->pVtabCtx; pCtx; pCtx=pCtx->pPrior){    if( pCtx->pTab==pTab ){      *pzErr = sqlite3MPrintf(db,           "vtable constructor called recursively: %s", pTab->zName      );      return SQLITE_LOCKED;    }  }  zModuleName = sqlite3MPrintf(db, "%s", pTab->zName);  if( !zModuleName ){    return SQLITE_NOMEM;  }  pVTable = sqlite3DbMallocZero(db, sizeof(VTable));  if( !pVTable ){    sqlite3DbFree(db, zModuleName);    return SQLITE_NOMEM;  }  pVTable->db = db;  pVTable->pMod = pMod;  iDb = sqlite3SchemaToIndex(db, pTab->pSchema);  pTab->azModuleArg[1] = db->aDb[iDb].zName;  /* Invoke the virtual table constructor */  assert( &db->pVtabCtx );  assert( xConstruct );  sCtx.pTab = pTab;  sCtx.pVTable = pVTable;  sCtx.pPrior = db->pVtabCtx;  sCtx.bDeclared = 0;  db->pVtabCtx = &sCtx;  rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr);  db->pVtabCtx = sCtx.pPrior;  if( rc==SQLITE_NOMEM ) db->mallocFailed = 1;  assert( sCtx.pTab==pTab );  if( SQLITE_OK!=rc ){    if( zErr==0 ){      *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName);    }else {      *pzErr = sqlite3MPrintf(db, "%s", zErr);      sqlite3_free(zErr);    }    sqlite3DbFree(db, pVTable);  }else if( ALWAYS(pVTable->pVtab) ){    /* Justification of ALWAYS():  A correct vtab constructor must allocate    ** the sqlite3_vtab object if successful.  */    memset(pVTable->pVtab, 0, sizeof(pVTable->pVtab[0]));    pVTable->pVtab->pModule = pMod->pModule;    pVTable->nRef = 1;    if( sCtx.bDeclared==0 ){      const char *zFormat = "vtable constructor did not declare schema: %s";      *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName);      sqlite3VtabUnlock(pVTable);      rc = SQLITE_ERROR;    }else{      int iCol;      u8 oooHidden = 0;      /* If everything went according to plan, link the new VTable structure      ** into the linked list headed by pTab->pVTable. Then loop through the       ** columns of the table to see if any of them contain the token "hidden".      ** If so, set the Column COLFLAG_HIDDEN flag and remove the token from      ** the type string.  */      pVTable->pNext = pTab->pVTable;      pTab->pVTable = pVTable;      for(iCol=0; iCol<pTab->nCol; iCol++){        char *zType = pTab->aCol[iCol].zType;        int nType;        int i = 0;        if( !zType ){          pTab->tabFlags |= oooHidden;          continue;        }        nType = sqlite3Strlen30(zType);//.........这里部分代码省略.........
开发者ID:aobzhirov,项目名称:ChromiumGStreamerBackend,代码行数:101,


示例28: sqlite3FinishTrigger

/*** This routine is called after all of the trigger actions have been parsed** in order to complete the process of building the trigger.*/void sqlite3FinishTrigger(  Parse *pParse,          /* Parser context */  TriggerStep *pStepList, /* The triggered program */  Token *pAll             /* Token that describes the complete CREATE TRIGGER */){  Trigger *pTrig = pParse->pNewTrigger;   /* Trigger being finished */  char *zName;                            /* Name of trigger */  sqlite3 *db = pParse->db;               /* The database */  DbFixer sFix;                           /* Fixer object */  int iDb;                                /* Database containing the trigger */  Token nameToken;                        /* Trigger name for error reporting */  pParse->pNewTrigger = 0;  if( NEVER(pParse->nErr) || !pTrig ) goto triggerfinish_cleanup;  zName = pTrig->zName;  iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);  pTrig->step_list = pStepList;  while( pStepList ){    pStepList->pTrig = pTrig;    pStepList = pStepList->pNext;  }  nameToken.z = pTrig->zName;  nameToken.n = sqlite3Strlen30(nameToken.z);  sqlite3FixInit(&sFix, pParse, iDb, "trigger", &nameToken);  if( sqlite3FixTriggerStep(&sFix, pTrig->step_list)    || sqlite3FixExpr(&sFix, pTrig->pWhen)   ){    goto triggerfinish_cleanup;  }  /* if we are not initializing,  ** build the sqlite_master entry  */  if( !db->init.busy ){    Vdbe *v;    char *z;    /* Make an entry in the sqlite_master table */    v = sqlite3GetVdbe(pParse);    if( v==0 ) goto triggerfinish_cleanup;    sqlite3BeginWriteOperation(pParse, 0, iDb);    z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n);    sqlite3NestedParse(pParse,       "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')",       db->aDb[iDb].zName, SCHEMA_TABLE(iDb), zName,       pTrig->table, z);    sqlite3DbFree(db, z);    sqlite3ChangeCookie(pParse, iDb);    sqlite3VdbeAddParseSchemaOp(v, iDb,        sqlite3MPrintf(db, "type='trigger' AND name='%q'", zName));  }  if( db->init.busy ){    Trigger *pLink = pTrig;    Hash *pHash = &db->aDb[iDb].pSchema->trigHash;    assert( sqlite3SchemaMutexHeld(db, iDb, 0) );    pTrig = sqlite3HashInsert(pHash, zName, pTrig);    if( pTrig ){      db->mallocFailed = 1;    }else if( pLink->pSchema==pLink->pTabSchema ){      Table *pTab;      pTab = sqlite3HashFind(&pLink->pTabSchema->tblHash, pLink->table);      assert( pTab!=0 );      pLink->pNext = pTab->pTrigger;      pTab->pTrigger = pLink;    }  }triggerfinish_cleanup:  sqlite3DeleteTrigger(db, pTrig);  assert( !pParse->pNewTrigger );  sqlite3DeleteTriggerStep(db, pStepList);}
开发者ID:AchironOS,项目名称:chromium-2,代码行数:77,


示例29: sqlite3InitOne

//.........这里部分代码省略.........    int i;    for(i=0; rc==SQLITE_OK && i<sizeof(meta)/sizeof(meta[0]); i++){      rc = sqlite3BtreeGetMeta(db->aDb[iDb].pBt, i+1, (u32 *)&meta[i]);    }    if( rc ){      sqlite3SetString(pzErrMsg, sqlite3ErrStr(rc), (char*)0);      sqlite3BtreeCloseCursor(curMain);      return rc;    }  }else{    memset(meta, 0, sizeof(meta));  }  db->aDb[iDb].schema_cookie = meta[0];  /* If opening a non-empty database, check the text encoding. For the  ** main database, set sqlite3.enc to the encoding of the main database.  ** For an attached db, it is an error if the encoding is not the same  ** as sqlite3.enc.  */  if( meta[4] ){  /* text encoding */    if( iDb==0 ){      /* If opening the main database, set db->enc. */      db->enc = (u8)meta[4];      db->pDfltColl = sqlite3FindCollSeq(db, db->enc, "BINARY", 6, 0);    }else{      /* If opening an attached database, the encoding much match db->enc */      if( meta[4]!=db->enc ){        sqlite3BtreeCloseCursor(curMain);        sqlite3SetString(pzErrMsg, "attached databases must use the same"            " text encoding as main database", (char*)0);        return SQLITE_ERROR;      }    }  }  size = meta[2];  if( size==0 ){ size = MAX_PAGES; }  db->aDb[iDb].cache_size = size;  if( iDb==0 ){    db->file_format = meta[1];    if( db->file_format==0 ){      /* This happens if the database was initially empty */      db->file_format = 1;    }    if( db->file_format==2 || db->file_format==3 ){      /* File format 2 is treated exactly as file format 1. New       ** databases are created with file format 1.      */       db->file_format = 1;    }  }  /*  ** file_format==1    Version 3.0.0.  ** file_format==2    Version 3.1.3.  ** file_format==3    Version 3.1.4.  **  ** Version 3.0 can only use files with file_format==1. Version 3.1.3  ** can read and write files with file_format==1 or file_format==2.  ** Version 3.1.4 can read and write file formats 1, 2 and 3.  */  if( meta[1]>3 ){    sqlite3BtreeCloseCursor(curMain);    sqlite3SetString(pzErrMsg, "unsupported file format", (char*)0);    return SQLITE_ERROR;  }  sqlite3BtreeSetCacheSize(db->aDb[iDb].pBt, db->aDb[iDb].cache_size);  /* Read the schema information out of the schema tables  */  assert( db->init.busy );  if( rc==SQLITE_EMPTY ){    /* For an empty database, there is nothing to read */    rc = SQLITE_OK;  }else{    char *zSql;    zSql = sqlite3MPrintf(        "SELECT name, rootpage, sql, '%s' FROM '%q'.%s",        zDbNum, db->aDb[iDb].zName, zMasterName);    sqlite3SafetyOff(db);    rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);    sqlite3SafetyOn(db);    sqliteFree(zSql);    sqlite3BtreeCloseCursor(curMain);  }  if( sqlite3_malloc_failed ){    sqlite3SetString(pzErrMsg, "out of memory", (char*)0);    rc = SQLITE_NOMEM;    sqlite3ResetInternalSchema(db, 0);  }  if( rc==SQLITE_OK ){    DbSetProperty(db, iDb, DB_SchemaLoaded);  }else{    sqlite3ResetInternalSchema(db, iDb);  }  return rc;}
开发者ID:huangyt,项目名称:foundations.github.com,代码行数:101,



注:本文中的sqlite3MPrintf函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ sqlite3Malloc函数代码示例
C++ sqlite3HashFind函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。