Annotation of embedaddon/php/ext/sqlite/libsqlite/src/main.c, revision 1.1

1.1     ! misho       1: /*
        !             2: ** 2001 September 15
        !             3: **
        !             4: ** The author disclaims copyright to this source code.  In place of
        !             5: ** a legal notice, here is a blessing:
        !             6: **
        !             7: **    May you do good and not evil.
        !             8: **    May you find forgiveness for yourself and forgive others.
        !             9: **    May you share freely, never taking more than you give.
        !            10: **
        !            11: *************************************************************************
        !            12: ** Main file for the SQLite library.  The routines in this file
        !            13: ** implement the programmer interface to the library.  Routines in
        !            14: ** other files are for internal use by SQLite and should not be
        !            15: ** accessed by users of the library.
        !            16: **
        !            17: ** $Id: main.c 195361 2005-09-07 15:11:33Z iliaa $
        !            18: */
        !            19: #include "sqliteInt.h"
        !            20: #include "os.h"
        !            21: #include <ctype.h>
        !            22: 
        !            23: /*
        !            24: ** A pointer to this structure is used to communicate information
        !            25: ** from sqliteInit into the sqliteInitCallback.
        !            26: */
        !            27: typedef struct {
        !            28:   sqlite *db;         /* The database being initialized */
        !            29:   char **pzErrMsg;    /* Error message stored here */
        !            30: } InitData;
        !            31: 
        !            32: /*
        !            33: ** Fill the InitData structure with an error message that indicates
        !            34: ** that the database is corrupt.
        !            35: */
        !            36: static void corruptSchema(InitData *pData, const char *zExtra){
        !            37:   sqliteSetString(pData->pzErrMsg, "malformed database schema",
        !            38:      zExtra!=0 && zExtra[0]!=0 ? " - " : (char*)0, zExtra, (char*)0);
        !            39: }
        !            40: 
        !            41: /*
        !            42: ** This is the callback routine for the code that initializes the
        !            43: ** database.  See sqliteInit() below for additional information.
        !            44: **
        !            45: ** Each callback contains the following information:
        !            46: **
        !            47: **     argv[0] = "file-format" or "schema-cookie" or "table" or "index"
        !            48: **     argv[1] = table or index name or meta statement type.
        !            49: **     argv[2] = root page number for table or index.  NULL for meta.
        !            50: **     argv[3] = SQL text for a CREATE TABLE or CREATE INDEX statement.
        !            51: **     argv[4] = "1" for temporary files, "0" for main database, "2" or more
        !            52: **               for auxiliary database files.
        !            53: **
        !            54: */
        !            55: static
        !            56: int sqliteInitCallback(void *pInit, int argc, char **argv, char **azColName){
        !            57:   InitData *pData = (InitData*)pInit;
        !            58:   int nErr = 0;
        !            59: 
        !            60:   assert( argc==5 );
        !            61:   if( argv==0 ) return 0;   /* Might happen if EMPTY_RESULT_CALLBACKS are on */
        !            62:   if( argv[0]==0 ){
        !            63:     corruptSchema(pData, 0);
        !            64:     return 1;
        !            65:   }
        !            66:   switch( argv[0][0] ){
        !            67:     case 'v':
        !            68:     case 'i':
        !            69:     case 't': {  /* CREATE TABLE, CREATE INDEX, or CREATE VIEW statements */
        !            70:       sqlite *db = pData->db;
        !            71:       if( argv[2]==0 || argv[4]==0 ){
        !            72:         corruptSchema(pData, 0);
        !            73:         return 1;
        !            74:       }
        !            75:       if( argv[3] && argv[3][0] ){
        !            76:         /* Call the parser to process a CREATE TABLE, INDEX or VIEW.
        !            77:         ** But because db->init.busy is set to 1, no VDBE code is generated
        !            78:         ** or executed.  All the parser does is build the internal data
        !            79:         ** structures that describe the table, index, or view.
        !            80:         */
        !            81:         char *zErr;
        !            82:         assert( db->init.busy );
        !            83:         db->init.iDb = atoi(argv[4]);
        !            84:         assert( db->init.iDb>=0 && db->init.iDb<db->nDb );
        !            85:         db->init.newTnum = atoi(argv[2]);
        !            86:         if( sqlite_exec(db, argv[3], 0, 0, &zErr) ){
        !            87:           corruptSchema(pData, zErr);
        !            88:           sqlite_freemem(zErr);
        !            89:         }
        !            90:         db->init.iDb = 0;
        !            91:       }else{
        !            92:         /* If the SQL column is blank it means this is an index that
        !            93:         ** was created to be the PRIMARY KEY or to fulfill a UNIQUE
        !            94:         ** constraint for a CREATE TABLE.  The index should have already
        !            95:         ** been created when we processed the CREATE TABLE.  All we have
        !            96:         ** to do here is record the root page number for that index.
        !            97:         */
        !            98:         int iDb;
        !            99:         Index *pIndex;
        !           100: 
        !           101:         iDb = atoi(argv[4]);
        !           102:         assert( iDb>=0 && iDb<db->nDb );
        !           103:         pIndex = sqliteFindIndex(db, argv[1], db->aDb[iDb].zName);
        !           104:         if( pIndex==0 || pIndex->tnum!=0 ){
        !           105:           /* This can occur if there exists an index on a TEMP table which
        !           106:           ** has the same name as another index on a permanent index.  Since
        !           107:           ** the permanent table is hidden by the TEMP table, we can also
        !           108:           ** safely ignore the index on the permanent table.
        !           109:           */
        !           110:           /* Do Nothing */;
        !           111:         }else{
        !           112:           pIndex->tnum = atoi(argv[2]);
        !           113:         }
        !           114:       }
        !           115:       break;
        !           116:     }
        !           117:     default: {
        !           118:       /* This can not happen! */
        !           119:       nErr = 1;
        !           120:       assert( nErr==0 );
        !           121:     }
        !           122:   }
        !           123:   return nErr;
        !           124: }
        !           125: 
        !           126: /*
        !           127: ** This is a callback procedure used to reconstruct a table.  The
        !           128: ** name of the table to be reconstructed is passed in as argv[0].
        !           129: **
        !           130: ** This routine is used to automatically upgrade a database from
        !           131: ** format version 1 or 2 to version 3.  The correct operation of
        !           132: ** this routine relys on the fact that no indices are used when
        !           133: ** copying a table out to a temporary file.
        !           134: **
        !           135: ** The change from version 2 to version 3 occurred between SQLite
        !           136: ** version 2.5.6 and 2.6.0 on 2002-July-18.  
        !           137: */
        !           138: static
        !           139: int upgrade_3_callback(void *pInit, int argc, char **argv, char **NotUsed){
        !           140:   InitData *pData = (InitData*)pInit;
        !           141:   int rc;
        !           142:   Table *pTab;
        !           143:   Trigger *pTrig;
        !           144:   char *zErr = 0;
        !           145: 
        !           146:   pTab = sqliteFindTable(pData->db, argv[0], 0);
        !           147:   assert( pTab!=0 );
        !           148:   assert( sqliteStrICmp(pTab->zName, argv[0])==0 );
        !           149:   if( pTab ){
        !           150:     pTrig = pTab->pTrigger;
        !           151:     pTab->pTrigger = 0;  /* Disable all triggers before rebuilding the table */
        !           152:   }
        !           153:   rc = sqlite_exec_printf(pData->db,
        !           154:     "CREATE TEMP TABLE sqlite_x AS SELECT * FROM '%q'; "
        !           155:     "DELETE FROM '%q'; "
        !           156:     "INSERT INTO '%q' SELECT * FROM sqlite_x; "
        !           157:     "DROP TABLE sqlite_x;",
        !           158:     0, 0, &zErr, argv[0], argv[0], argv[0]);
        !           159:   if( zErr ){
        !           160:     if( *pData->pzErrMsg ) sqlite_freemem(*pData->pzErrMsg);
        !           161:     *pData->pzErrMsg = zErr;
        !           162:   }
        !           163: 
        !           164:   /* If an error occurred in the SQL above, then the transaction will
        !           165:   ** rollback which will delete the internal symbol tables.  This will
        !           166:   ** cause the structure that pTab points to be deleted.  In case that
        !           167:   ** happened, we need to refetch pTab.
        !           168:   */
        !           169:   pTab = sqliteFindTable(pData->db, argv[0], 0);
        !           170:   if( pTab ){
        !           171:     assert( sqliteStrICmp(pTab->zName, argv[0])==0 );
        !           172:     pTab->pTrigger = pTrig;  /* Re-enable triggers */
        !           173:   }
        !           174:   return rc!=SQLITE_OK;
        !           175: }
        !           176: 
        !           177: 
        !           178: 
        !           179: /*
        !           180: ** Attempt to read the database schema and initialize internal
        !           181: ** data structures for a single database file.  The index of the
        !           182: ** database file is given by iDb.  iDb==0 is used for the main
        !           183: ** database.  iDb==1 should never be used.  iDb>=2 is used for
        !           184: ** auxiliary databases.  Return one of the SQLITE_ error codes to
        !           185: ** indicate success or failure.
        !           186: */
        !           187: static int sqliteInitOne(sqlite *db, int iDb, char **pzErrMsg){
        !           188:   int rc;
        !           189:   BtCursor *curMain;
        !           190:   int size;
        !           191:   Table *pTab;
        !           192:   char const *azArg[6];
        !           193:   char zDbNum[30];
        !           194:   int meta[SQLITE_N_BTREE_META];
        !           195:   InitData initData;
        !           196:   char const *zMasterSchema;
        !           197:   char const *zMasterName;
        !           198:   char *zSql = 0;
        !           199: 
        !           200:   /*
        !           201:   ** The master database table has a structure like this
        !           202:   */
        !           203:   static char master_schema[] = 
        !           204:      "CREATE TABLE sqlite_master(\n"
        !           205:      "  type text,\n"
        !           206:      "  name text,\n"
        !           207:      "  tbl_name text,\n"
        !           208:      "  rootpage integer,\n"
        !           209:      "  sql text\n"
        !           210:      ")"
        !           211:   ;
        !           212:   static char temp_master_schema[] = 
        !           213:      "CREATE TEMP TABLE sqlite_temp_master(\n"
        !           214:      "  type text,\n"
        !           215:      "  name text,\n"
        !           216:      "  tbl_name text,\n"
        !           217:      "  rootpage integer,\n"
        !           218:      "  sql text\n"
        !           219:      ")"
        !           220:   ;
        !           221: 
        !           222:   assert( iDb>=0 && iDb<db->nDb );
        !           223: 
        !           224:   /* zMasterSchema and zInitScript are set to point at the master schema
        !           225:   ** and initialisation script appropriate for the database being
        !           226:   ** initialised. zMasterName is the name of the master table.
        !           227:   */
        !           228:   if( iDb==1 ){
        !           229:     zMasterSchema = temp_master_schema;
        !           230:     zMasterName = TEMP_MASTER_NAME;
        !           231:   }else{
        !           232:     zMasterSchema = master_schema;
        !           233:     zMasterName = MASTER_NAME;
        !           234:   }
        !           235: 
        !           236:   /* Construct the schema table.
        !           237:   */
        !           238:   sqliteSafetyOff(db);
        !           239:   azArg[0] = "table";
        !           240:   azArg[1] = zMasterName;
        !           241:   azArg[2] = "2";
        !           242:   azArg[3] = zMasterSchema;
        !           243:   sprintf(zDbNum, "%d", iDb);
        !           244:   azArg[4] = zDbNum;
        !           245:   azArg[5] = 0;
        !           246:   initData.db = db;
        !           247:   initData.pzErrMsg = pzErrMsg;
        !           248:   sqliteInitCallback(&initData, 5, (char **)azArg, 0);
        !           249:   pTab = sqliteFindTable(db, zMasterName, db->aDb[iDb].zName);
        !           250:   if( pTab ){
        !           251:     pTab->readOnly = 1;
        !           252:   }else{
        !           253:     return SQLITE_NOMEM;
        !           254:   }
        !           255:   sqliteSafetyOn(db);
        !           256: 
        !           257:   /* Create a cursor to hold the database open
        !           258:   */
        !           259:   if( db->aDb[iDb].pBt==0 ) return SQLITE_OK;
        !           260:   rc = sqliteBtreeCursor(db->aDb[iDb].pBt, 2, 0, &curMain);
        !           261:   if( rc ){
        !           262:     sqliteSetString(pzErrMsg, sqlite_error_string(rc), (char*)0);
        !           263:     return rc;
        !           264:   }
        !           265: 
        !           266:   /* Get the database meta information
        !           267:   */
        !           268:   rc = sqliteBtreeGetMeta(db->aDb[iDb].pBt, meta);
        !           269:   if( rc ){
        !           270:     sqliteSetString(pzErrMsg, sqlite_error_string(rc), (char*)0);
        !           271:     sqliteBtreeCloseCursor(curMain);
        !           272:     return rc;
        !           273:   }
        !           274:   db->aDb[iDb].schema_cookie = meta[1];
        !           275:   if( iDb==0 ){
        !           276:     db->next_cookie = meta[1];
        !           277:     db->file_format = meta[2];
        !           278:     size = meta[3];
        !           279:     if( size==0 ){ size = MAX_PAGES; }
        !           280:     db->cache_size = size;
        !           281:     db->safety_level = meta[4];
        !           282:     if( meta[6]>0 && meta[6]<=2 && db->temp_store==0 ){
        !           283:       db->temp_store = meta[6];
        !           284:     }
        !           285:     if( db->safety_level==0 ) db->safety_level = 2;
        !           286: 
        !           287:     /*
        !           288:     **  file_format==1    Version 2.1.0.
        !           289:     **  file_format==2    Version 2.2.0. Add support for INTEGER PRIMARY KEY.
        !           290:     **  file_format==3    Version 2.6.0. Fix empty-string index bug.
        !           291:     **  file_format==4    Version 2.7.0. Add support for separate numeric and
        !           292:     **                    text datatypes.
        !           293:     */
        !           294:     if( db->file_format==0 ){
        !           295:       /* This happens if the database was initially empty */
        !           296:       db->file_format = 4;
        !           297:     }else if( db->file_format>4 ){
        !           298:       sqliteBtreeCloseCursor(curMain);
        !           299:       sqliteSetString(pzErrMsg, "unsupported file format", (char*)0);
        !           300:       return SQLITE_ERROR;
        !           301:     }
        !           302:   }else if( iDb!=1 && (db->file_format!=meta[2] || db->file_format<4) ){
        !           303:     assert( db->file_format>=4 );
        !           304:     if( meta[2]==0 ){
        !           305:       sqliteSetString(pzErrMsg, "cannot attach empty database: ",
        !           306:          db->aDb[iDb].zName, (char*)0);
        !           307:     }else{
        !           308:       sqliteSetString(pzErrMsg, "incompatible file format in auxiliary "
        !           309:          "database: ", db->aDb[iDb].zName, (char*)0);
        !           310:     }
        !           311:     sqliteBtreeClose(db->aDb[iDb].pBt);
        !           312:     db->aDb[iDb].pBt = 0;
        !           313:     return SQLITE_FORMAT;
        !           314:   }
        !           315:   sqliteBtreeSetCacheSize(db->aDb[iDb].pBt, db->cache_size);
        !           316:   sqliteBtreeSetSafetyLevel(db->aDb[iDb].pBt, meta[4]==0 ? 2 : meta[4]);
        !           317: 
        !           318:   /* Read the schema information out of the schema tables
        !           319:   */
        !           320:   assert( db->init.busy );
        !           321:   sqliteSafetyOff(db);
        !           322: 
        !           323:   /* The following SQL will read the schema from the master tables.
        !           324:   ** The first version works with SQLite file formats 2 or greater.
        !           325:   ** The second version is for format 1 files.
        !           326:   **
        !           327:   ** Beginning with file format 2, the rowid for new table entries
        !           328:   ** (including entries in sqlite_master) is an increasing integer.
        !           329:   ** So for file format 2 and later, we can play back sqlite_master
        !           330:   ** and all the CREATE statements will appear in the right order.
        !           331:   ** But with file format 1, table entries were random and so we
        !           332:   ** have to make sure the CREATE TABLEs occur before their corresponding
        !           333:   ** CREATE INDEXs.  (We don't have to deal with CREATE VIEW or
        !           334:   ** CREATE TRIGGER in file format 1 because those constructs did
        !           335:   ** not exist then.) 
        !           336:   */
        !           337:   if( db->file_format>=2 ){
        !           338:     sqliteSetString(&zSql, 
        !           339:         "SELECT type, name, rootpage, sql, ", zDbNum, " FROM \"",
        !           340:        db->aDb[iDb].zName, "\".", zMasterName, (char*)0);
        !           341:   }else{
        !           342:     sqliteSetString(&zSql, 
        !           343:         "SELECT type, name, rootpage, sql, ", zDbNum, " FROM \"",
        !           344:        db->aDb[iDb].zName, "\".", zMasterName, 
        !           345:        " WHERE type IN ('table', 'index')"
        !           346:        " ORDER BY CASE type WHEN 'table' THEN 0 ELSE 1 END", (char*)0);
        !           347:   }
        !           348:   rc = sqlite_exec(db, zSql, sqliteInitCallback, &initData, 0);
        !           349: 
        !           350:   sqliteFree(zSql);
        !           351:   sqliteSafetyOn(db);
        !           352:   sqliteBtreeCloseCursor(curMain);
        !           353:   if( sqlite_malloc_failed ){
        !           354:     sqliteSetString(pzErrMsg, "out of memory", (char*)0);
        !           355:     rc = SQLITE_NOMEM;
        !           356:     sqliteResetInternalSchema(db, 0);
        !           357:   }
        !           358:   if( rc==SQLITE_OK ){
        !           359:     DbSetProperty(db, iDb, DB_SchemaLoaded);
        !           360:   }else{
        !           361:     sqliteResetInternalSchema(db, iDb);
        !           362:   }
        !           363:   return rc;
        !           364: }
        !           365: 
        !           366: /*
        !           367: ** Initialize all database files - the main database file, the file
        !           368: ** used to store temporary tables, and any additional database files
        !           369: ** created using ATTACH statements.  Return a success code.  If an
        !           370: ** error occurs, write an error message into *pzErrMsg.
        !           371: **
        !           372: ** After the database is initialized, the SQLITE_Initialized
        !           373: ** bit is set in the flags field of the sqlite structure.  An
        !           374: ** attempt is made to initialize the database as soon as it
        !           375: ** is opened.  If that fails (perhaps because another process
        !           376: ** has the sqlite_master table locked) than another attempt
        !           377: ** is made the first time the database is accessed.
        !           378: */
        !           379: int sqliteInit(sqlite *db, char **pzErrMsg){
        !           380:   int i, rc;
        !           381:   
        !           382:   if( db->init.busy ) return SQLITE_OK;
        !           383:   assert( (db->flags & SQLITE_Initialized)==0 );
        !           384:   rc = SQLITE_OK;
        !           385:   db->init.busy = 1;
        !           386:   for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
        !           387:     if( DbHasProperty(db, i, DB_SchemaLoaded) || i==1 ) continue;
        !           388:     rc = sqliteInitOne(db, i, pzErrMsg);
        !           389:     if( rc ){
        !           390:       sqliteResetInternalSchema(db, i);
        !           391:     }
        !           392:   }
        !           393: 
        !           394:   /* Once all the other databases have been initialised, load the schema
        !           395:   ** for the TEMP database. This is loaded last, as the TEMP database
        !           396:   ** schema may contain references to objects in other databases.
        !           397:   */
        !           398:   if( rc==SQLITE_OK && db->nDb>1 && !DbHasProperty(db, 1, DB_SchemaLoaded) ){
        !           399:     rc = sqliteInitOne(db, 1, pzErrMsg);
        !           400:     if( rc ){
        !           401:       sqliteResetInternalSchema(db, 1);
        !           402:     }
        !           403:   }
        !           404: 
        !           405:   db->init.busy = 0;
        !           406:   if( rc==SQLITE_OK ){
        !           407:     db->flags |= SQLITE_Initialized;
        !           408:     sqliteCommitInternalChanges(db);
        !           409:   }
        !           410: 
        !           411:   /* If the database is in formats 1 or 2, then upgrade it to
        !           412:   ** version 3.  This will reconstruct all indices.  If the
        !           413:   ** upgrade fails for any reason (ex: out of disk space, database
        !           414:   ** is read only, interrupt received, etc.) then fail the init.
        !           415:   */
        !           416:   if( rc==SQLITE_OK && db->file_format<3 ){
        !           417:     char *zErr = 0;
        !           418:     InitData initData;
        !           419:     int meta[SQLITE_N_BTREE_META];
        !           420: 
        !           421:     db->magic = SQLITE_MAGIC_OPEN;
        !           422:     initData.db = db;
        !           423:     initData.pzErrMsg = &zErr;
        !           424:     db->file_format = 3;
        !           425:     rc = sqlite_exec(db,
        !           426:       "BEGIN; SELECT name FROM sqlite_master WHERE type='table';",
        !           427:       upgrade_3_callback,
        !           428:       &initData,
        !           429:       &zErr);
        !           430:     if( rc==SQLITE_OK ){
        !           431:       sqliteBtreeGetMeta(db->aDb[0].pBt, meta);
        !           432:       meta[2] = 4;
        !           433:       sqliteBtreeUpdateMeta(db->aDb[0].pBt, meta);
        !           434:       sqlite_exec(db, "COMMIT", 0, 0, 0);
        !           435:     }
        !           436:     if( rc!=SQLITE_OK ){
        !           437:       sqliteSetString(pzErrMsg, 
        !           438:         "unable to upgrade database to the version 2.6 format",
        !           439:         zErr ? ": " : 0, zErr, (char*)0);
        !           440:     }
        !           441:     sqlite_freemem(zErr);
        !           442:   }
        !           443: 
        !           444:   if( rc!=SQLITE_OK ){
        !           445:     db->flags &= ~SQLITE_Initialized;
        !           446:   }
        !           447:   return rc;
        !           448: }
        !           449: 
        !           450: /*
        !           451: ** The version of the library
        !           452: */
        !           453: const char rcsid[] = "@(#) \044Id: SQLite version " SQLITE_VERSION " $";
        !           454: const char sqlite_version[] = SQLITE_VERSION;
        !           455: 
        !           456: /*
        !           457: ** Does the library expect data to be encoded as UTF-8 or iso8859?  The
        !           458: ** following global constant always lets us know.
        !           459: */
        !           460: #ifdef SQLITE_UTF8
        !           461: const char sqlite_encoding[] = "UTF-8";
        !           462: #else
        !           463: const char sqlite_encoding[] = "iso8859";
        !           464: #endif
        !           465: 
        !           466: /*
        !           467: ** Open a new SQLite database.  Construct an "sqlite" structure to define
        !           468: ** the state of this database and return a pointer to that structure.
        !           469: **
        !           470: ** An attempt is made to initialize the in-memory data structures that
        !           471: ** hold the database schema.  But if this fails (because the schema file
        !           472: ** is locked) then that step is deferred until the first call to
        !           473: ** sqlite_exec().
        !           474: */
        !           475: sqlite *sqlite_open(const char *zFilename, int mode, char **pzErrMsg){
        !           476:   sqlite *db;
        !           477:   int rc, i;
        !           478: 
        !           479:   /* Allocate the sqlite data structure */
        !           480:   db = sqliteMalloc( sizeof(sqlite) );
        !           481:   if( pzErrMsg ) *pzErrMsg = 0;
        !           482:   if( db==0 ) goto no_mem_on_open;
        !           483:   db->onError = OE_Default;
        !           484:   db->priorNewRowid = 0;
        !           485:   db->magic = SQLITE_MAGIC_BUSY;
        !           486:   db->nDb = 2;
        !           487:   db->aDb = db->aDbStatic;
        !           488:   /* db->flags |= SQLITE_ShortColNames; */
        !           489:   sqliteHashInit(&db->aFunc, SQLITE_HASH_STRING, 1);
        !           490:   for(i=0; i<db->nDb; i++){
        !           491:     sqliteHashInit(&db->aDb[i].tblHash, SQLITE_HASH_STRING, 0);
        !           492:     sqliteHashInit(&db->aDb[i].idxHash, SQLITE_HASH_STRING, 0);
        !           493:     sqliteHashInit(&db->aDb[i].trigHash, SQLITE_HASH_STRING, 0);
        !           494:     sqliteHashInit(&db->aDb[i].aFKey, SQLITE_HASH_STRING, 1);
        !           495:   }
        !           496:   
        !           497:   /* Open the backend database driver */
        !           498:   if( zFilename[0]==':' && strcmp(zFilename,":memory:")==0 ){
        !           499:     db->temp_store = 2;
        !           500:   }
        !           501:   rc = sqliteBtreeFactory(db, zFilename, 0, MAX_PAGES, &db->aDb[0].pBt);
        !           502:   if( rc!=SQLITE_OK ){
        !           503:     switch( rc ){
        !           504:       default: {
        !           505:         sqliteSetString(pzErrMsg, "unable to open database: ",
        !           506:            zFilename, (char*)0);
        !           507:       }
        !           508:     }
        !           509:     sqliteFree(db);
        !           510:     sqliteStrRealloc(pzErrMsg);
        !           511:     return 0;
        !           512:   }
        !           513:   db->aDb[0].zName = "main";
        !           514:   db->aDb[1].zName = "temp";
        !           515: 
        !           516:   /* Attempt to read the schema */
        !           517:   sqliteRegisterBuiltinFunctions(db);
        !           518:   rc = sqliteInit(db, pzErrMsg);
        !           519:   db->magic = SQLITE_MAGIC_OPEN;
        !           520:   if( sqlite_malloc_failed ){
        !           521:     sqlite_close(db);
        !           522:     goto no_mem_on_open;
        !           523:   }else if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){
        !           524:     sqlite_close(db);
        !           525:     sqliteStrRealloc(pzErrMsg);
        !           526:     return 0;
        !           527:   }else if( pzErrMsg ){
        !           528:     sqliteFree(*pzErrMsg);
        !           529:     *pzErrMsg = 0;
        !           530:   }
        !           531: 
        !           532:   /* Return a pointer to the newly opened database structure */
        !           533:   return db;
        !           534: 
        !           535: no_mem_on_open:
        !           536:   sqliteSetString(pzErrMsg, "out of memory", (char*)0);
        !           537:   sqliteStrRealloc(pzErrMsg);
        !           538:   return 0;
        !           539: }
        !           540: 
        !           541: /*
        !           542: ** Return the ROWID of the most recent insert
        !           543: */
        !           544: int sqlite_last_insert_rowid(sqlite *db){
        !           545:   return db->lastRowid;
        !           546: }
        !           547: 
        !           548: /*
        !           549: ** Return the number of changes in the most recent call to sqlite_exec().
        !           550: */
        !           551: int sqlite_changes(sqlite *db){
        !           552:   return db->nChange;
        !           553: }
        !           554: 
        !           555: /*
        !           556: ** Return the number of changes produced by the last INSERT, UPDATE, or
        !           557: ** DELETE statement to complete execution. The count does not include
        !           558: ** changes due to SQL statements executed in trigger programs that were
        !           559: ** triggered by that statement
        !           560: */
        !           561: int sqlite_last_statement_changes(sqlite *db){
        !           562:   return db->lsChange;
        !           563: }
        !           564: 
        !           565: /*
        !           566: ** Close an existing SQLite database
        !           567: */
        !           568: void sqlite_close(sqlite *db){
        !           569:   HashElem *i;
        !           570:   int j;
        !           571:   db->want_to_close = 1;
        !           572:   if( sqliteSafetyCheck(db) || sqliteSafetyOn(db) ){
        !           573:     /* printf("DID NOT CLOSE\n"); fflush(stdout); */
        !           574:     return;
        !           575:   }
        !           576:   db->magic = SQLITE_MAGIC_CLOSED;
        !           577:   for(j=0; j<db->nDb; j++){
        !           578:     struct Db *pDb = &db->aDb[j];
        !           579:     if( pDb->pBt ){
        !           580:       sqliteBtreeClose(pDb->pBt);
        !           581:       pDb->pBt = 0;
        !           582:     }
        !           583:   }
        !           584:   sqliteResetInternalSchema(db, 0);
        !           585:   assert( db->nDb<=2 );
        !           586:   assert( db->aDb==db->aDbStatic );
        !           587:   for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){
        !           588:     FuncDef *pFunc, *pNext;
        !           589:     for(pFunc = (FuncDef*)sqliteHashData(i); pFunc; pFunc=pNext){
        !           590:       pNext = pFunc->pNext;
        !           591:       sqliteFree(pFunc);
        !           592:     }
        !           593:   }
        !           594:   sqliteHashClear(&db->aFunc);
        !           595:   sqliteFree(db);
        !           596: }
        !           597: 
        !           598: /*
        !           599: ** Rollback all database files.
        !           600: */
        !           601: void sqliteRollbackAll(sqlite *db){
        !           602:   int i;
        !           603:   for(i=0; i<db->nDb; i++){
        !           604:     if( db->aDb[i].pBt ){
        !           605:       sqliteBtreeRollback(db->aDb[i].pBt);
        !           606:       db->aDb[i].inTrans = 0;
        !           607:     }
        !           608:   }
        !           609:   sqliteResetInternalSchema(db, 0);
        !           610:   /* sqliteRollbackInternalChanges(db); */
        !           611: }
        !           612: 
        !           613: /*
        !           614: ** Execute SQL code.  Return one of the SQLITE_ success/failure
        !           615: ** codes.  Also write an error message into memory obtained from
        !           616: ** malloc() and make *pzErrMsg point to that message.
        !           617: **
        !           618: ** If the SQL is a query, then for each row in the query result
        !           619: ** the xCallback() function is called.  pArg becomes the first
        !           620: ** argument to xCallback().  If xCallback=NULL then no callback
        !           621: ** is invoked, even for queries.
        !           622: */
        !           623: int sqlite_exec(
        !           624:   sqlite *db,                 /* The database on which the SQL executes */
        !           625:   const char *zSql,           /* The SQL to be executed */
        !           626:   sqlite_callback xCallback,  /* Invoke this callback routine */
        !           627:   void *pArg,                 /* First argument to xCallback() */
        !           628:   char **pzErrMsg             /* Write error messages here */
        !           629: ){
        !           630:   int rc = SQLITE_OK;
        !           631:   const char *zLeftover;
        !           632:   sqlite_vm *pVm;
        !           633:   int nRetry = 0;
        !           634:   int nChange = 0;
        !           635:   int nCallback;
        !           636: 
        !           637:   if( zSql==0 ) return SQLITE_OK;
        !           638:   while( rc==SQLITE_OK && zSql[0] ){
        !           639:     pVm = 0;
        !           640:     rc = sqlite_compile(db, zSql, &zLeftover, &pVm, pzErrMsg);
        !           641:     if( rc!=SQLITE_OK ){
        !           642:       assert( pVm==0 || sqlite_malloc_failed );
        !           643:       return rc;
        !           644:     }
        !           645:     if( pVm==0 ){
        !           646:       /* This happens if the zSql input contained only whitespace */
        !           647:       break;
        !           648:     }
        !           649:     db->nChange += nChange;
        !           650:     nCallback = 0;
        !           651:     while(1){
        !           652:       int nArg;
        !           653:       char **azArg, **azCol;
        !           654:       rc = sqlite_step(pVm, &nArg, (const char***)&azArg,(const char***)&azCol);
        !           655:       if( rc==SQLITE_ROW ){
        !           656:         if( xCallback!=0 && xCallback(pArg, nArg, azArg, azCol) ){
        !           657:           sqlite_finalize(pVm, 0);
        !           658:           return SQLITE_ABORT;
        !           659:         }
        !           660:         nCallback++;
        !           661:       }else{
        !           662:         if( rc==SQLITE_DONE && nCallback==0
        !           663:           && (db->flags & SQLITE_NullCallback)!=0 && xCallback!=0 ){
        !           664:           xCallback(pArg, nArg, azArg, azCol);
        !           665:         }
        !           666:         rc = sqlite_finalize(pVm, pzErrMsg);
        !           667:         if( rc==SQLITE_SCHEMA && nRetry<2 ){
        !           668:           nRetry++;
        !           669:           rc = SQLITE_OK;
        !           670:           break;
        !           671:         }
        !           672:         if( db->pVdbe==0 ){
        !           673:           nChange = db->nChange;
        !           674:         }
        !           675:         nRetry = 0;
        !           676:         zSql = zLeftover;
        !           677:         while( isspace(zSql[0]) ) zSql++;
        !           678:         break;
        !           679:       }
        !           680:     }
        !           681:   }
        !           682:   return rc;
        !           683: }
        !           684: 
        !           685: 
        !           686: /*
        !           687: ** Compile a single statement of SQL into a virtual machine.  Return one
        !           688: ** of the SQLITE_ success/failure codes.  Also write an error message into
        !           689: ** memory obtained from malloc() and make *pzErrMsg point to that message.
        !           690: */
        !           691: int sqlite_compile(
        !           692:   sqlite *db,                 /* The database on which the SQL executes */
        !           693:   const char *zSql,           /* The SQL to be executed */
        !           694:   const char **pzTail,        /* OUT: Next statement after the first */
        !           695:   sqlite_vm **ppVm,           /* OUT: The virtual machine */
        !           696:   char **pzErrMsg             /* OUT: Write error messages here */
        !           697: ){
        !           698:   Parse sParse;
        !           699: 
        !           700:   if( pzErrMsg ) *pzErrMsg = 0;
        !           701:   if( sqliteSafetyOn(db) ) goto exec_misuse;
        !           702:   if( !db->init.busy ){
        !           703:     if( (db->flags & SQLITE_Initialized)==0 ){
        !           704:       int rc, cnt = 1;
        !           705:       while( (rc = sqliteInit(db, pzErrMsg))==SQLITE_BUSY
        !           706:          && db->xBusyCallback
        !           707:          && db->xBusyCallback(db->pBusyArg, "", cnt++)!=0 ){}
        !           708:       if( rc!=SQLITE_OK ){
        !           709:         sqliteStrRealloc(pzErrMsg);
        !           710:         sqliteSafetyOff(db);
        !           711:         return rc;
        !           712:       }
        !           713:       if( pzErrMsg ){
        !           714:         sqliteFree(*pzErrMsg);
        !           715:         *pzErrMsg = 0;
        !           716:       }
        !           717:     }
        !           718:     if( db->file_format<3 ){
        !           719:       sqliteSafetyOff(db);
        !           720:       sqliteSetString(pzErrMsg, "obsolete database file format", (char*)0);
        !           721:       return SQLITE_ERROR;
        !           722:     }
        !           723:   }
        !           724:   assert( (db->flags & SQLITE_Initialized)!=0 || db->init.busy );
        !           725:   if( db->pVdbe==0 ){ db->nChange = 0; }
        !           726:   memset(&sParse, 0, sizeof(sParse));
        !           727:   sParse.db = db;
        !           728:   sqliteRunParser(&sParse, zSql, pzErrMsg);
        !           729:   if( db->xTrace && !db->init.busy ){
        !           730:     /* Trace only the statment that was compiled.
        !           731:     ** Make a copy of that part of the SQL string since zSQL is const
        !           732:     ** and we must pass a zero terminated string to the trace function
        !           733:     ** The copy is unnecessary if the tail pointer is pointing at the
        !           734:     ** beginnig or end of the SQL string.
        !           735:     */
        !           736:     if( sParse.zTail && sParse.zTail!=zSql && *sParse.zTail ){
        !           737:       char *tmpSql = sqliteStrNDup(zSql, sParse.zTail - zSql);
        !           738:       if( tmpSql ){
        !           739:         db->xTrace(db->pTraceArg, tmpSql);
        !           740:         free(tmpSql);
        !           741:       }else{
        !           742:         /* If a memory error occurred during the copy,
        !           743:         ** trace entire SQL string and fall through to the
        !           744:         ** sqlite_malloc_failed test to report the error.
        !           745:         */
        !           746:         db->xTrace(db->pTraceArg, zSql); 
        !           747:       }
        !           748:     }else{
        !           749:       db->xTrace(db->pTraceArg, zSql); 
        !           750:     }
        !           751:   }
        !           752:   if( sqlite_malloc_failed ){
        !           753:     sqliteSetString(pzErrMsg, "out of memory", (char*)0);
        !           754:     sParse.rc = SQLITE_NOMEM;
        !           755:     sqliteRollbackAll(db);
        !           756:     sqliteResetInternalSchema(db, 0);
        !           757:     db->flags &= ~SQLITE_InTrans;
        !           758:   }
        !           759:   if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK;
        !           760:   if( sParse.rc!=SQLITE_OK && pzErrMsg && *pzErrMsg==0 ){
        !           761:     sqliteSetString(pzErrMsg, sqlite_error_string(sParse.rc), (char*)0);
        !           762:   }
        !           763:   sqliteStrRealloc(pzErrMsg);
        !           764:   if( sParse.rc==SQLITE_SCHEMA ){
        !           765:     sqliteResetInternalSchema(db, 0);
        !           766:   }
        !           767:   assert( ppVm );
        !           768:   *ppVm = (sqlite_vm*)sParse.pVdbe;
        !           769:   if( pzTail ) *pzTail = sParse.zTail;
        !           770:   if( sqliteSafetyOff(db) ) goto exec_misuse;
        !           771:   return sParse.rc;
        !           772: 
        !           773: exec_misuse:
        !           774:   if( pzErrMsg ){
        !           775:     *pzErrMsg = 0;
        !           776:     sqliteSetString(pzErrMsg, sqlite_error_string(SQLITE_MISUSE), (char*)0);
        !           777:     sqliteStrRealloc(pzErrMsg);
        !           778:   }
        !           779:   return SQLITE_MISUSE;
        !           780: }
        !           781: 
        !           782: 
        !           783: /*
        !           784: ** The following routine destroys a virtual machine that is created by
        !           785: ** the sqlite_compile() routine.
        !           786: **
        !           787: ** The integer returned is an SQLITE_ success/failure code that describes
        !           788: ** the result of executing the virtual machine.  An error message is
        !           789: ** written into memory obtained from malloc and *pzErrMsg is made to
        !           790: ** point to that error if pzErrMsg is not NULL.  The calling routine
        !           791: ** should use sqlite_freemem() to delete the message when it has finished
        !           792: ** with it.
        !           793: */
        !           794: int sqlite_finalize(
        !           795:   sqlite_vm *pVm,            /* The virtual machine to be destroyed */
        !           796:   char **pzErrMsg            /* OUT: Write error messages here */
        !           797: ){
        !           798:   int rc = sqliteVdbeFinalize((Vdbe*)pVm, pzErrMsg);
        !           799:   sqliteStrRealloc(pzErrMsg);
        !           800:   return rc;
        !           801: }
        !           802: 
        !           803: /*
        !           804: ** Terminate the current execution of a virtual machine then
        !           805: ** reset the virtual machine back to its starting state so that it
        !           806: ** can be reused.  Any error message resulting from the prior execution
        !           807: ** is written into *pzErrMsg.  A success code from the prior execution
        !           808: ** is returned.
        !           809: */
        !           810: int sqlite_reset(
        !           811:   sqlite_vm *pVm,            /* The virtual machine to be destroyed */
        !           812:   char **pzErrMsg            /* OUT: Write error messages here */
        !           813: ){
        !           814:   int rc = sqliteVdbeReset((Vdbe*)pVm, pzErrMsg);
        !           815:   sqliteVdbeMakeReady((Vdbe*)pVm, -1, 0);
        !           816:   sqliteStrRealloc(pzErrMsg);
        !           817:   return rc;
        !           818: }
        !           819: 
        !           820: /*
        !           821: ** Return a static string that describes the kind of error specified in the
        !           822: ** argument.
        !           823: */
        !           824: const char *sqlite_error_string(int rc){
        !           825:   const char *z;
        !           826:   switch( rc ){
        !           827:     case SQLITE_OK:         z = "not an error";                          break;
        !           828:     case SQLITE_ERROR:      z = "SQL logic error or missing database";   break;
        !           829:     case SQLITE_INTERNAL:   z = "internal SQLite implementation flaw";   break;
        !           830:     case SQLITE_PERM:       z = "access permission denied";              break;
        !           831:     case SQLITE_ABORT:      z = "callback requested query abort";        break;
        !           832:     case SQLITE_BUSY:       z = "database is locked";                    break;
        !           833:     case SQLITE_LOCKED:     z = "database table is locked";              break;
        !           834:     case SQLITE_NOMEM:      z = "out of memory";                         break;
        !           835:     case SQLITE_READONLY:   z = "attempt to write a readonly database";  break;
        !           836:     case SQLITE_INTERRUPT:  z = "interrupted";                           break;
        !           837:     case SQLITE_IOERR:      z = "disk I/O error";                        break;
        !           838:     case SQLITE_CORRUPT:    z = "database disk image is malformed";      break;
        !           839:     case SQLITE_NOTFOUND:   z = "table or record not found";             break;
        !           840:     case SQLITE_FULL:       z = "database is full";                      break;
        !           841:     case SQLITE_CANTOPEN:   z = "unable to open database file";          break;
        !           842:     case SQLITE_PROTOCOL:   z = "database locking protocol failure";     break;
        !           843:     case SQLITE_EMPTY:      z = "table contains no data";                break;
        !           844:     case SQLITE_SCHEMA:     z = "database schema has changed";           break;
        !           845:     case SQLITE_TOOBIG:     z = "too much data for one table row";       break;
        !           846:     case SQLITE_CONSTRAINT: z = "constraint failed";                     break;
        !           847:     case SQLITE_MISMATCH:   z = "datatype mismatch";                     break;
        !           848:     case SQLITE_MISUSE:     z = "library routine called out of sequence";break;
        !           849:     case SQLITE_NOLFS:      z = "kernel lacks large file support";       break;
        !           850:     case SQLITE_AUTH:       z = "authorization denied";                  break;
        !           851:     case SQLITE_FORMAT:     z = "auxiliary database format error";       break;
        !           852:     case SQLITE_RANGE:      z = "bind index out of range";               break;
        !           853:     case SQLITE_NOTADB:     z = "file is encrypted or is not a database";break;
        !           854:     default:                z = "unknown error";                         break;
        !           855:   }
        !           856:   return z;
        !           857: }
        !           858: 
        !           859: /*
        !           860: ** This routine implements a busy callback that sleeps and tries
        !           861: ** again until a timeout value is reached.  The timeout value is
        !           862: ** an integer number of milliseconds passed in as the first
        !           863: ** argument.
        !           864: */
        !           865: static int sqliteDefaultBusyCallback(
        !           866:  void *Timeout,           /* Maximum amount of time to wait */
        !           867:  const char *NotUsed,     /* The name of the table that is busy */
        !           868:  int count                /* Number of times table has been busy */
        !           869: ){
        !           870: #if SQLITE_MIN_SLEEP_MS==1
        !           871:   static const char delays[] =
        !           872:      { 1, 2, 5, 10, 15, 20, 25, 25,  25,  50,  50,  50, 100};
        !           873:   static const short int totals[] =
        !           874:      { 0, 1, 3,  8, 18, 33, 53, 78, 103, 128, 178, 228, 287};
        !           875: # define NDELAY (sizeof(delays)/sizeof(delays[0]))
        !           876:   int timeout = (int)(long)Timeout;
        !           877:   int delay, prior;
        !           878: 
        !           879:   if( count <= NDELAY ){
        !           880:     delay = delays[count-1];
        !           881:     prior = totals[count-1];
        !           882:   }else{
        !           883:     delay = delays[NDELAY-1];
        !           884:     prior = totals[NDELAY-1] + delay*(count-NDELAY-1);
        !           885:   }
        !           886:   if( prior + delay > timeout ){
        !           887:     delay = timeout - prior;
        !           888:     if( delay<=0 ) return 0;
        !           889:   }
        !           890:   sqliteOsSleep(delay);
        !           891:   return 1;
        !           892: #else
        !           893:   int timeout = (int)(long)Timeout;
        !           894:   if( (count+1)*1000 > timeout ){
        !           895:     return 0;
        !           896:   }
        !           897:   sqliteOsSleep(1000);
        !           898:   return 1;
        !           899: #endif
        !           900: }
        !           901: 
        !           902: /*
        !           903: ** This routine sets the busy callback for an Sqlite database to the
        !           904: ** given callback function with the given argument.
        !           905: */
        !           906: void sqlite_busy_handler(
        !           907:   sqlite *db,
        !           908:   int (*xBusy)(void*,const char*,int),
        !           909:   void *pArg
        !           910: ){
        !           911:   db->xBusyCallback = xBusy;
        !           912:   db->pBusyArg = pArg;
        !           913: }
        !           914: 
        !           915: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
        !           916: /*
        !           917: ** This routine sets the progress callback for an Sqlite database to the
        !           918: ** given callback function with the given argument. The progress callback will
        !           919: ** be invoked every nOps opcodes.
        !           920: */
        !           921: void sqlite_progress_handler(
        !           922:   sqlite *db, 
        !           923:   int nOps,
        !           924:   int (*xProgress)(void*), 
        !           925:   void *pArg
        !           926: ){
        !           927:   if( nOps>0 ){
        !           928:     db->xProgress = xProgress;
        !           929:     db->nProgressOps = nOps;
        !           930:     db->pProgressArg = pArg;
        !           931:   }else{
        !           932:     db->xProgress = 0;
        !           933:     db->nProgressOps = 0;
        !           934:     db->pProgressArg = 0;
        !           935:   }
        !           936: }
        !           937: #endif
        !           938: 
        !           939: 
        !           940: /*
        !           941: ** This routine installs a default busy handler that waits for the
        !           942: ** specified number of milliseconds before returning 0.
        !           943: */
        !           944: void sqlite_busy_timeout(sqlite *db, int ms){
        !           945:   if( ms>0 ){
        !           946:     sqlite_busy_handler(db, sqliteDefaultBusyCallback, (void*)(long)ms);
        !           947:   }else{
        !           948:     sqlite_busy_handler(db, 0, 0);
        !           949:   }
        !           950: }
        !           951: 
        !           952: /*
        !           953: ** Cause any pending operation to stop at its earliest opportunity.
        !           954: */
        !           955: void sqlite_interrupt(sqlite *db){
        !           956:   db->flags |= SQLITE_Interrupt;
        !           957: }
        !           958: 
        !           959: /*
        !           960: ** Windows systems should call this routine to free memory that
        !           961: ** is returned in the in the errmsg parameter of sqlite_open() when
        !           962: ** SQLite is a DLL.  For some reason, it does not work to call free()
        !           963: ** directly.
        !           964: **
        !           965: ** Note that we need to call free() not sqliteFree() here, since every
        !           966: ** string that is exported from SQLite should have already passed through
        !           967: ** sqliteStrRealloc().
        !           968: */
        !           969: void sqlite_freemem(void *p){ free(p); }
        !           970: 
        !           971: /*
        !           972: ** Windows systems need functions to call to return the sqlite_version
        !           973: ** and sqlite_encoding strings since they are unable to access constants
        !           974: ** within DLLs.
        !           975: */
        !           976: const char *sqlite_libversion(void){ return sqlite_version; }
        !           977: const char *sqlite_libencoding(void){ return sqlite_encoding; }
        !           978: 
        !           979: /*
        !           980: ** Create new user-defined functions.  The sqlite_create_function()
        !           981: ** routine creates a regular function and sqlite_create_aggregate()
        !           982: ** creates an aggregate function.
        !           983: **
        !           984: ** Passing a NULL xFunc argument or NULL xStep and xFinalize arguments
        !           985: ** disables the function.  Calling sqlite_create_function() with the
        !           986: ** same name and number of arguments as a prior call to
        !           987: ** sqlite_create_aggregate() disables the prior call to
        !           988: ** sqlite_create_aggregate(), and vice versa.
        !           989: **
        !           990: ** If nArg is -1 it means that this function will accept any number
        !           991: ** of arguments, including 0.  The maximum allowed value of nArg is 127.
        !           992: */
        !           993: int sqlite_create_function(
        !           994:   sqlite *db,          /* Add the function to this database connection */
        !           995:   const char *zName,   /* Name of the function to add */
        !           996:   int nArg,            /* Number of arguments */
        !           997:   void (*xFunc)(sqlite_func*,int,const char**),  /* The implementation */
        !           998:   void *pUserData      /* User data */
        !           999: ){
        !          1000:   FuncDef *p;
        !          1001:   int nName;
        !          1002:   if( db==0 || zName==0 || sqliteSafetyCheck(db) ) return 1;
        !          1003:   if( nArg<-1 || nArg>127 ) return 1;
        !          1004:   nName = strlen(zName);
        !          1005:   if( nName>255 ) return 1;
        !          1006:   p = sqliteFindFunction(db, zName, nName, nArg, 1);
        !          1007:   if( p==0 ) return 1;
        !          1008:   p->xFunc = xFunc;
        !          1009:   p->xStep = 0;
        !          1010:   p->xFinalize = 0;
        !          1011:   p->pUserData = pUserData;
        !          1012:   return 0;
        !          1013: }
        !          1014: int sqlite_create_aggregate(
        !          1015:   sqlite *db,          /* Add the function to this database connection */
        !          1016:   const char *zName,   /* Name of the function to add */
        !          1017:   int nArg,            /* Number of arguments */
        !          1018:   void (*xStep)(sqlite_func*,int,const char**), /* The step function */
        !          1019:   void (*xFinalize)(sqlite_func*),              /* The finalizer */
        !          1020:   void *pUserData      /* User data */
        !          1021: ){
        !          1022:   FuncDef *p;
        !          1023:   int nName;
        !          1024:   if( db==0 || zName==0 || sqliteSafetyCheck(db) ) return 1;
        !          1025:   if( nArg<-1 || nArg>127 ) return 1;
        !          1026:   nName = strlen(zName);
        !          1027:   if( nName>255 ) return 1;
        !          1028:   p = sqliteFindFunction(db, zName, nName, nArg, 1);
        !          1029:   if( p==0 ) return 1;
        !          1030:   p->xFunc = 0;
        !          1031:   p->xStep = xStep;
        !          1032:   p->xFinalize = xFinalize;
        !          1033:   p->pUserData = pUserData;
        !          1034:   return 0;
        !          1035: }
        !          1036: 
        !          1037: /*
        !          1038: ** Change the datatype for all functions with a given name.  See the
        !          1039: ** header comment for the prototype of this function in sqlite.h for
        !          1040: ** additional information.
        !          1041: */
        !          1042: int sqlite_function_type(sqlite *db, const char *zName, int dataType){
        !          1043:   FuncDef *p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, strlen(zName));
        !          1044:   while( p ){
        !          1045:     p->dataType = dataType; 
        !          1046:     p = p->pNext;
        !          1047:   }
        !          1048:   return SQLITE_OK;
        !          1049: }
        !          1050: 
        !          1051: /*
        !          1052: ** Register a trace function.  The pArg from the previously registered trace
        !          1053: ** is returned.  
        !          1054: **
        !          1055: ** A NULL trace function means that no tracing is executes.  A non-NULL
        !          1056: ** trace is a pointer to a function that is invoked at the start of each
        !          1057: ** sqlite_exec().
        !          1058: */
        !          1059: void *sqlite_trace(sqlite *db, void (*xTrace)(void*,const char*), void *pArg){
        !          1060:   void *pOld = db->pTraceArg;
        !          1061:   db->xTrace = xTrace;
        !          1062:   db->pTraceArg = pArg;
        !          1063:   return pOld;
        !          1064: }
        !          1065: 
        !          1066: /*** EXPERIMENTAL ***
        !          1067: **
        !          1068: ** Register a function to be invoked when a transaction comments.
        !          1069: ** If either function returns non-zero, then the commit becomes a
        !          1070: ** rollback.
        !          1071: */
        !          1072: void *sqlite_commit_hook(
        !          1073:   sqlite *db,               /* Attach the hook to this database */
        !          1074:   int (*xCallback)(void*),  /* Function to invoke on each commit */
        !          1075:   void *pArg                /* Argument to the function */
        !          1076: ){
        !          1077:   void *pOld = db->pCommitArg;
        !          1078:   db->xCommitCallback = xCallback;
        !          1079:   db->pCommitArg = pArg;
        !          1080:   return pOld;
        !          1081: }
        !          1082: 
        !          1083: 
        !          1084: /*
        !          1085: ** This routine is called to create a connection to a database BTree
        !          1086: ** driver.  If zFilename is the name of a file, then that file is
        !          1087: ** opened and used.  If zFilename is the magic name ":memory:" then
        !          1088: ** the database is stored in memory (and is thus forgotten as soon as
        !          1089: ** the connection is closed.)  If zFilename is NULL then the database
        !          1090: ** is for temporary use only and is deleted as soon as the connection
        !          1091: ** is closed.
        !          1092: **
        !          1093: ** A temporary database can be either a disk file (that is automatically
        !          1094: ** deleted when the file is closed) or a set of red-black trees held in memory,
        !          1095: ** depending on the values of the TEMP_STORE compile-time macro and the
        !          1096: ** db->temp_store variable, according to the following chart:
        !          1097: **
        !          1098: **       TEMP_STORE     db->temp_store     Location of temporary database
        !          1099: **       ----------     --------------     ------------------------------
        !          1100: **           0               any             file
        !          1101: **           1                1              file
        !          1102: **           1                2              memory
        !          1103: **           1                0              file
        !          1104: **           2                1              file
        !          1105: **           2                2              memory
        !          1106: **           2                0              memory
        !          1107: **           3               any             memory
        !          1108: */
        !          1109: int sqliteBtreeFactory(
        !          1110:   const sqlite *db,        /* Main database when opening aux otherwise 0 */
        !          1111:   const char *zFilename,    /* Name of the file containing the BTree database */
        !          1112:   int omitJournal,          /* if TRUE then do not journal this file */
        !          1113:   int nCache,               /* How many pages in the page cache */
        !          1114:   Btree **ppBtree){         /* Pointer to new Btree object written here */
        !          1115: 
        !          1116:   assert( ppBtree != 0);
        !          1117: 
        !          1118: #ifndef SQLITE_OMIT_INMEMORYDB
        !          1119:   if( zFilename==0 ){
        !          1120:     if (TEMP_STORE == 0) {
        !          1121:       /* Always use file based temporary DB */
        !          1122:       return sqliteBtreeOpen(0, omitJournal, nCache, ppBtree);
        !          1123:     } else if (TEMP_STORE == 1 || TEMP_STORE == 2) {
        !          1124:       /* Switch depending on compile-time and/or runtime settings. */
        !          1125:       int location = db->temp_store==0 ? TEMP_STORE : db->temp_store;
        !          1126: 
        !          1127:       if (location == 1) {
        !          1128:         return sqliteBtreeOpen(zFilename, omitJournal, nCache, ppBtree);
        !          1129:       } else {
        !          1130:         return sqliteRbtreeOpen(0, 0, 0, ppBtree);
        !          1131:       }
        !          1132:     } else {
        !          1133:       /* Always use in-core DB */
        !          1134:       return sqliteRbtreeOpen(0, 0, 0, ppBtree);
        !          1135:     }
        !          1136:   }else if( zFilename[0]==':' && strcmp(zFilename,":memory:")==0 ){
        !          1137:     return sqliteRbtreeOpen(0, 0, 0, ppBtree);
        !          1138:   }else
        !          1139: #endif
        !          1140:   {
        !          1141:     return sqliteBtreeOpen(zFilename, omitJournal, nCache, ppBtree);
        !          1142:   }
        !          1143: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>