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>