Annotation of embedaddon/sqlite3/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: #include "sqliteInt.h"
        !            18: 
        !            19: #ifdef SQLITE_ENABLE_FTS3
        !            20: # include "fts3.h"
        !            21: #endif
        !            22: #ifdef SQLITE_ENABLE_RTREE
        !            23: # include "rtree.h"
        !            24: #endif
        !            25: #ifdef SQLITE_ENABLE_ICU
        !            26: # include "sqliteicu.h"
        !            27: #endif
        !            28: 
        !            29: #ifndef SQLITE_AMALGAMATION
        !            30: /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant
        !            31: ** contains the text of SQLITE_VERSION macro. 
        !            32: */
        !            33: const char sqlite3_version[] = SQLITE_VERSION;
        !            34: #endif
        !            35: 
        !            36: /* IMPLEMENTATION-OF: R-53536-42575 The sqlite3_libversion() function returns
        !            37: ** a pointer to the to the sqlite3_version[] string constant. 
        !            38: */
        !            39: const char *sqlite3_libversion(void){ return sqlite3_version; }
        !            40: 
        !            41: /* IMPLEMENTATION-OF: R-63124-39300 The sqlite3_sourceid() function returns a
        !            42: ** pointer to a string constant whose value is the same as the
        !            43: ** SQLITE_SOURCE_ID C preprocessor macro. 
        !            44: */
        !            45: const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
        !            46: 
        !            47: /* IMPLEMENTATION-OF: R-35210-63508 The sqlite3_libversion_number() function
        !            48: ** returns an integer equal to SQLITE_VERSION_NUMBER.
        !            49: */
        !            50: int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; }
        !            51: 
        !            52: /* IMPLEMENTATION-OF: R-20790-14025 The sqlite3_threadsafe() function returns
        !            53: ** zero if and only if SQLite was compiled with mutexing code omitted due to
        !            54: ** the SQLITE_THREADSAFE compile-time option being set to 0.
        !            55: */
        !            56: int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }
        !            57: 
        !            58: #if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE)
        !            59: /*
        !            60: ** If the following function pointer is not NULL and if
        !            61: ** SQLITE_ENABLE_IOTRACE is enabled, then messages describing
        !            62: ** I/O active are written using this function.  These messages
        !            63: ** are intended for debugging activity only.
        !            64: */
        !            65: void (*sqlite3IoTrace)(const char*, ...) = 0;
        !            66: #endif
        !            67: 
        !            68: /*
        !            69: ** If the following global variable points to a string which is the
        !            70: ** name of a directory, then that directory will be used to store
        !            71: ** temporary files.
        !            72: **
        !            73: ** See also the "PRAGMA temp_store_directory" SQL command.
        !            74: */
        !            75: char *sqlite3_temp_directory = 0;
        !            76: 
        !            77: /*
        !            78: ** Initialize SQLite.  
        !            79: **
        !            80: ** This routine must be called to initialize the memory allocation,
        !            81: ** VFS, and mutex subsystems prior to doing any serious work with
        !            82: ** SQLite.  But as long as you do not compile with SQLITE_OMIT_AUTOINIT
        !            83: ** this routine will be called automatically by key routines such as
        !            84: ** sqlite3_open().  
        !            85: **
        !            86: ** This routine is a no-op except on its very first call for the process,
        !            87: ** or for the first call after a call to sqlite3_shutdown.
        !            88: **
        !            89: ** The first thread to call this routine runs the initialization to
        !            90: ** completion.  If subsequent threads call this routine before the first
        !            91: ** thread has finished the initialization process, then the subsequent
        !            92: ** threads must block until the first thread finishes with the initialization.
        !            93: **
        !            94: ** The first thread might call this routine recursively.  Recursive
        !            95: ** calls to this routine should not block, of course.  Otherwise the
        !            96: ** initialization process would never complete.
        !            97: **
        !            98: ** Let X be the first thread to enter this routine.  Let Y be some other
        !            99: ** thread.  Then while the initial invocation of this routine by X is
        !           100: ** incomplete, it is required that:
        !           101: **
        !           102: **    *  Calls to this routine from Y must block until the outer-most
        !           103: **       call by X completes.
        !           104: **
        !           105: **    *  Recursive calls to this routine from thread X return immediately
        !           106: **       without blocking.
        !           107: */
        !           108: int sqlite3_initialize(void){
        !           109:   MUTEX_LOGIC( sqlite3_mutex *pMaster; )       /* The main static mutex */
        !           110:   int rc;                                      /* Result code */
        !           111: 
        !           112: #ifdef SQLITE_OMIT_WSD
        !           113:   rc = sqlite3_wsd_init(4096, 24);
        !           114:   if( rc!=SQLITE_OK ){
        !           115:     return rc;
        !           116:   }
        !           117: #endif
        !           118: 
        !           119:   /* If SQLite is already completely initialized, then this call
        !           120:   ** to sqlite3_initialize() should be a no-op.  But the initialization
        !           121:   ** must be complete.  So isInit must not be set until the very end
        !           122:   ** of this routine.
        !           123:   */
        !           124:   if( sqlite3GlobalConfig.isInit ) return SQLITE_OK;
        !           125: 
        !           126:   /* Make sure the mutex subsystem is initialized.  If unable to 
        !           127:   ** initialize the mutex subsystem, return early with the error.
        !           128:   ** If the system is so sick that we are unable to allocate a mutex,
        !           129:   ** there is not much SQLite is going to be able to do.
        !           130:   **
        !           131:   ** The mutex subsystem must take care of serializing its own
        !           132:   ** initialization.
        !           133:   */
        !           134:   rc = sqlite3MutexInit();
        !           135:   if( rc ) return rc;
        !           136: 
        !           137:   /* Initialize the malloc() system and the recursive pInitMutex mutex.
        !           138:   ** This operation is protected by the STATIC_MASTER mutex.  Note that
        !           139:   ** MutexAlloc() is called for a static mutex prior to initializing the
        !           140:   ** malloc subsystem - this implies that the allocation of a static
        !           141:   ** mutex must not require support from the malloc subsystem.
        !           142:   */
        !           143:   MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
        !           144:   sqlite3_mutex_enter(pMaster);
        !           145:   sqlite3GlobalConfig.isMutexInit = 1;
        !           146:   if( !sqlite3GlobalConfig.isMallocInit ){
        !           147:     rc = sqlite3MallocInit();
        !           148:   }
        !           149:   if( rc==SQLITE_OK ){
        !           150:     sqlite3GlobalConfig.isMallocInit = 1;
        !           151:     if( !sqlite3GlobalConfig.pInitMutex ){
        !           152:       sqlite3GlobalConfig.pInitMutex =
        !           153:            sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
        !           154:       if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){
        !           155:         rc = SQLITE_NOMEM;
        !           156:       }
        !           157:     }
        !           158:   }
        !           159:   if( rc==SQLITE_OK ){
        !           160:     sqlite3GlobalConfig.nRefInitMutex++;
        !           161:   }
        !           162:   sqlite3_mutex_leave(pMaster);
        !           163: 
        !           164:   /* If rc is not SQLITE_OK at this point, then either the malloc
        !           165:   ** subsystem could not be initialized or the system failed to allocate
        !           166:   ** the pInitMutex mutex. Return an error in either case.  */
        !           167:   if( rc!=SQLITE_OK ){
        !           168:     return rc;
        !           169:   }
        !           170: 
        !           171:   /* Do the rest of the initialization under the recursive mutex so
        !           172:   ** that we will be able to handle recursive calls into
        !           173:   ** sqlite3_initialize().  The recursive calls normally come through
        !           174:   ** sqlite3_os_init() when it invokes sqlite3_vfs_register(), but other
        !           175:   ** recursive calls might also be possible.
        !           176:   **
        !           177:   ** IMPLEMENTATION-OF: R-00140-37445 SQLite automatically serializes calls
        !           178:   ** to the xInit method, so the xInit method need not be threadsafe.
        !           179:   **
        !           180:   ** The following mutex is what serializes access to the appdef pcache xInit
        !           181:   ** methods.  The sqlite3_pcache_methods.xInit() all is embedded in the
        !           182:   ** call to sqlite3PcacheInitialize().
        !           183:   */
        !           184:   sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex);
        !           185:   if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){
        !           186:     FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
        !           187:     sqlite3GlobalConfig.inProgress = 1;
        !           188:     memset(pHash, 0, sizeof(sqlite3GlobalFunctions));
        !           189:     sqlite3RegisterGlobalFunctions();
        !           190:     if( sqlite3GlobalConfig.isPCacheInit==0 ){
        !           191:       rc = sqlite3PcacheInitialize();
        !           192:     }
        !           193:     if( rc==SQLITE_OK ){
        !           194:       sqlite3GlobalConfig.isPCacheInit = 1;
        !           195:       rc = sqlite3OsInit();
        !           196:     }
        !           197:     if( rc==SQLITE_OK ){
        !           198:       sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, 
        !           199:           sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage);
        !           200:       sqlite3GlobalConfig.isInit = 1;
        !           201:     }
        !           202:     sqlite3GlobalConfig.inProgress = 0;
        !           203:   }
        !           204:   sqlite3_mutex_leave(sqlite3GlobalConfig.pInitMutex);
        !           205: 
        !           206:   /* Go back under the static mutex and clean up the recursive
        !           207:   ** mutex to prevent a resource leak.
        !           208:   */
        !           209:   sqlite3_mutex_enter(pMaster);
        !           210:   sqlite3GlobalConfig.nRefInitMutex--;
        !           211:   if( sqlite3GlobalConfig.nRefInitMutex<=0 ){
        !           212:     assert( sqlite3GlobalConfig.nRefInitMutex==0 );
        !           213:     sqlite3_mutex_free(sqlite3GlobalConfig.pInitMutex);
        !           214:     sqlite3GlobalConfig.pInitMutex = 0;
        !           215:   }
        !           216:   sqlite3_mutex_leave(pMaster);
        !           217: 
        !           218:   /* The following is just a sanity check to make sure SQLite has
        !           219:   ** been compiled correctly.  It is important to run this code, but
        !           220:   ** we don't want to run it too often and soak up CPU cycles for no
        !           221:   ** reason.  So we run it once during initialization.
        !           222:   */
        !           223: #ifndef NDEBUG
        !           224: #ifndef SQLITE_OMIT_FLOATING_POINT
        !           225:   /* This section of code's only "output" is via assert() statements. */
        !           226:   if ( rc==SQLITE_OK ){
        !           227:     u64 x = (((u64)1)<<63)-1;
        !           228:     double y;
        !           229:     assert(sizeof(x)==8);
        !           230:     assert(sizeof(x)==sizeof(y));
        !           231:     memcpy(&y, &x, 8);
        !           232:     assert( sqlite3IsNaN(y) );
        !           233:   }
        !           234: #endif
        !           235: #endif
        !           236: 
        !           237:   /* Do extra initialization steps requested by the SQLITE_EXTRA_INIT
        !           238:   ** compile-time option.
        !           239:   */
        !           240: #ifdef SQLITE_EXTRA_INIT
        !           241:   if( rc==SQLITE_OK && sqlite3GlobalConfig.isInit ){
        !           242:     int SQLITE_EXTRA_INIT(const char*);
        !           243:     rc = SQLITE_EXTRA_INIT(0);
        !           244:   }
        !           245: #endif
        !           246: 
        !           247:   return rc;
        !           248: }
        !           249: 
        !           250: /*
        !           251: ** Undo the effects of sqlite3_initialize().  Must not be called while
        !           252: ** there are outstanding database connections or memory allocations or
        !           253: ** while any part of SQLite is otherwise in use in any thread.  This
        !           254: ** routine is not threadsafe.  But it is safe to invoke this routine
        !           255: ** on when SQLite is already shut down.  If SQLite is already shut down
        !           256: ** when this routine is invoked, then this routine is a harmless no-op.
        !           257: */
        !           258: int sqlite3_shutdown(void){
        !           259:   if( sqlite3GlobalConfig.isInit ){
        !           260: #ifdef SQLITE_EXTRA_SHUTDOWN
        !           261:     void SQLITE_EXTRA_SHUTDOWN(void);
        !           262:     SQLITE_EXTRA_SHUTDOWN();
        !           263: #endif
        !           264:     sqlite3_os_end();
        !           265:     sqlite3_reset_auto_extension();
        !           266:     sqlite3GlobalConfig.isInit = 0;
        !           267:   }
        !           268:   if( sqlite3GlobalConfig.isPCacheInit ){
        !           269:     sqlite3PcacheShutdown();
        !           270:     sqlite3GlobalConfig.isPCacheInit = 0;
        !           271:   }
        !           272:   if( sqlite3GlobalConfig.isMallocInit ){
        !           273:     sqlite3MallocEnd();
        !           274:     sqlite3GlobalConfig.isMallocInit = 0;
        !           275:   }
        !           276:   if( sqlite3GlobalConfig.isMutexInit ){
        !           277:     sqlite3MutexEnd();
        !           278:     sqlite3GlobalConfig.isMutexInit = 0;
        !           279:   }
        !           280: 
        !           281:   return SQLITE_OK;
        !           282: }
        !           283: 
        !           284: /*
        !           285: ** This API allows applications to modify the global configuration of
        !           286: ** the SQLite library at run-time.
        !           287: **
        !           288: ** This routine should only be called when there are no outstanding
        !           289: ** database connections or memory allocations.  This routine is not
        !           290: ** threadsafe.  Failure to heed these warnings can lead to unpredictable
        !           291: ** behavior.
        !           292: */
        !           293: int sqlite3_config(int op, ...){
        !           294:   va_list ap;
        !           295:   int rc = SQLITE_OK;
        !           296: 
        !           297:   /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while
        !           298:   ** the SQLite library is in use. */
        !           299:   if( sqlite3GlobalConfig.isInit ) return SQLITE_MISUSE_BKPT;
        !           300: 
        !           301:   va_start(ap, op);
        !           302:   switch( op ){
        !           303: 
        !           304:     /* Mutex configuration options are only available in a threadsafe
        !           305:     ** compile. 
        !           306:     */
        !           307: #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0
        !           308:     case SQLITE_CONFIG_SINGLETHREAD: {
        !           309:       /* Disable all mutexing */
        !           310:       sqlite3GlobalConfig.bCoreMutex = 0;
        !           311:       sqlite3GlobalConfig.bFullMutex = 0;
        !           312:       break;
        !           313:     }
        !           314:     case SQLITE_CONFIG_MULTITHREAD: {
        !           315:       /* Disable mutexing of database connections */
        !           316:       /* Enable mutexing of core data structures */
        !           317:       sqlite3GlobalConfig.bCoreMutex = 1;
        !           318:       sqlite3GlobalConfig.bFullMutex = 0;
        !           319:       break;
        !           320:     }
        !           321:     case SQLITE_CONFIG_SERIALIZED: {
        !           322:       /* Enable all mutexing */
        !           323:       sqlite3GlobalConfig.bCoreMutex = 1;
        !           324:       sqlite3GlobalConfig.bFullMutex = 1;
        !           325:       break;
        !           326:     }
        !           327:     case SQLITE_CONFIG_MUTEX: {
        !           328:       /* Specify an alternative mutex implementation */
        !           329:       sqlite3GlobalConfig.mutex = *va_arg(ap, sqlite3_mutex_methods*);
        !           330:       break;
        !           331:     }
        !           332:     case SQLITE_CONFIG_GETMUTEX: {
        !           333:       /* Retrieve the current mutex implementation */
        !           334:       *va_arg(ap, sqlite3_mutex_methods*) = sqlite3GlobalConfig.mutex;
        !           335:       break;
        !           336:     }
        !           337: #endif
        !           338: 
        !           339: 
        !           340:     case SQLITE_CONFIG_MALLOC: {
        !           341:       /* Specify an alternative malloc implementation */
        !           342:       sqlite3GlobalConfig.m = *va_arg(ap, sqlite3_mem_methods*);
        !           343:       break;
        !           344:     }
        !           345:     case SQLITE_CONFIG_GETMALLOC: {
        !           346:       /* Retrieve the current malloc() implementation */
        !           347:       if( sqlite3GlobalConfig.m.xMalloc==0 ) sqlite3MemSetDefault();
        !           348:       *va_arg(ap, sqlite3_mem_methods*) = sqlite3GlobalConfig.m;
        !           349:       break;
        !           350:     }
        !           351:     case SQLITE_CONFIG_MEMSTATUS: {
        !           352:       /* Enable or disable the malloc status collection */
        !           353:       sqlite3GlobalConfig.bMemstat = va_arg(ap, int);
        !           354:       break;
        !           355:     }
        !           356:     case SQLITE_CONFIG_SCRATCH: {
        !           357:       /* Designate a buffer for scratch memory space */
        !           358:       sqlite3GlobalConfig.pScratch = va_arg(ap, void*);
        !           359:       sqlite3GlobalConfig.szScratch = va_arg(ap, int);
        !           360:       sqlite3GlobalConfig.nScratch = va_arg(ap, int);
        !           361:       break;
        !           362:     }
        !           363:     case SQLITE_CONFIG_PAGECACHE: {
        !           364:       /* Designate a buffer for page cache memory space */
        !           365:       sqlite3GlobalConfig.pPage = va_arg(ap, void*);
        !           366:       sqlite3GlobalConfig.szPage = va_arg(ap, int);
        !           367:       sqlite3GlobalConfig.nPage = va_arg(ap, int);
        !           368:       break;
        !           369:     }
        !           370: 
        !           371:     case SQLITE_CONFIG_PCACHE: {
        !           372:       /* no-op */
        !           373:       break;
        !           374:     }
        !           375:     case SQLITE_CONFIG_GETPCACHE: {
        !           376:       /* now an error */
        !           377:       rc = SQLITE_ERROR;
        !           378:       break;
        !           379:     }
        !           380: 
        !           381:     case SQLITE_CONFIG_PCACHE2: {
        !           382:       /* Specify an alternative page cache implementation */
        !           383:       sqlite3GlobalConfig.pcache2 = *va_arg(ap, sqlite3_pcache_methods2*);
        !           384:       break;
        !           385:     }
        !           386:     case SQLITE_CONFIG_GETPCACHE2: {
        !           387:       if( sqlite3GlobalConfig.pcache2.xInit==0 ){
        !           388:         sqlite3PCacheSetDefault();
        !           389:       }
        !           390:       *va_arg(ap, sqlite3_pcache_methods2*) = sqlite3GlobalConfig.pcache2;
        !           391:       break;
        !           392:     }
        !           393: 
        !           394: #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
        !           395:     case SQLITE_CONFIG_HEAP: {
        !           396:       /* Designate a buffer for heap memory space */
        !           397:       sqlite3GlobalConfig.pHeap = va_arg(ap, void*);
        !           398:       sqlite3GlobalConfig.nHeap = va_arg(ap, int);
        !           399:       sqlite3GlobalConfig.mnReq = va_arg(ap, int);
        !           400: 
        !           401:       if( sqlite3GlobalConfig.mnReq<1 ){
        !           402:         sqlite3GlobalConfig.mnReq = 1;
        !           403:       }else if( sqlite3GlobalConfig.mnReq>(1<<12) ){
        !           404:         /* cap min request size at 2^12 */
        !           405:         sqlite3GlobalConfig.mnReq = (1<<12);
        !           406:       }
        !           407: 
        !           408:       if( sqlite3GlobalConfig.pHeap==0 ){
        !           409:         /* If the heap pointer is NULL, then restore the malloc implementation
        !           410:         ** back to NULL pointers too.  This will cause the malloc to go
        !           411:         ** back to its default implementation when sqlite3_initialize() is
        !           412:         ** run.
        !           413:         */
        !           414:         memset(&sqlite3GlobalConfig.m, 0, sizeof(sqlite3GlobalConfig.m));
        !           415:       }else{
        !           416:         /* The heap pointer is not NULL, then install one of the
        !           417:         ** mem5.c/mem3.c methods. If neither ENABLE_MEMSYS3 nor
        !           418:         ** ENABLE_MEMSYS5 is defined, return an error.
        !           419:         */
        !           420: #ifdef SQLITE_ENABLE_MEMSYS3
        !           421:         sqlite3GlobalConfig.m = *sqlite3MemGetMemsys3();
        !           422: #endif
        !           423: #ifdef SQLITE_ENABLE_MEMSYS5
        !           424:         sqlite3GlobalConfig.m = *sqlite3MemGetMemsys5();
        !           425: #endif
        !           426:       }
        !           427:       break;
        !           428:     }
        !           429: #endif
        !           430: 
        !           431:     case SQLITE_CONFIG_LOOKASIDE: {
        !           432:       sqlite3GlobalConfig.szLookaside = va_arg(ap, int);
        !           433:       sqlite3GlobalConfig.nLookaside = va_arg(ap, int);
        !           434:       break;
        !           435:     }
        !           436:     
        !           437:     /* Record a pointer to the logger funcction and its first argument.
        !           438:     ** The default is NULL.  Logging is disabled if the function pointer is
        !           439:     ** NULL.
        !           440:     */
        !           441:     case SQLITE_CONFIG_LOG: {
        !           442:       /* MSVC is picky about pulling func ptrs from va lists.
        !           443:       ** http://support.microsoft.com/kb/47961
        !           444:       ** sqlite3GlobalConfig.xLog = va_arg(ap, void(*)(void*,int,const char*));
        !           445:       */
        !           446:       typedef void(*LOGFUNC_t)(void*,int,const char*);
        !           447:       sqlite3GlobalConfig.xLog = va_arg(ap, LOGFUNC_t);
        !           448:       sqlite3GlobalConfig.pLogArg = va_arg(ap, void*);
        !           449:       break;
        !           450:     }
        !           451: 
        !           452:     case SQLITE_CONFIG_URI: {
        !           453:       sqlite3GlobalConfig.bOpenUri = va_arg(ap, int);
        !           454:       break;
        !           455:     }
        !           456: 
        !           457:     default: {
        !           458:       rc = SQLITE_ERROR;
        !           459:       break;
        !           460:     }
        !           461:   }
        !           462:   va_end(ap);
        !           463:   return rc;
        !           464: }
        !           465: 
        !           466: /*
        !           467: ** Set up the lookaside buffers for a database connection.
        !           468: ** Return SQLITE_OK on success.  
        !           469: ** If lookaside is already active, return SQLITE_BUSY.
        !           470: **
        !           471: ** The sz parameter is the number of bytes in each lookaside slot.
        !           472: ** The cnt parameter is the number of slots.  If pStart is NULL the
        !           473: ** space for the lookaside memory is obtained from sqlite3_malloc().
        !           474: ** If pStart is not NULL then it is sz*cnt bytes of memory to use for
        !           475: ** the lookaside memory.
        !           476: */
        !           477: static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){
        !           478:   void *pStart;
        !           479:   if( db->lookaside.nOut ){
        !           480:     return SQLITE_BUSY;
        !           481:   }
        !           482:   /* Free any existing lookaside buffer for this handle before
        !           483:   ** allocating a new one so we don't have to have space for 
        !           484:   ** both at the same time.
        !           485:   */
        !           486:   if( db->lookaside.bMalloced ){
        !           487:     sqlite3_free(db->lookaside.pStart);
        !           488:   }
        !           489:   /* The size of a lookaside slot after ROUNDDOWN8 needs to be larger
        !           490:   ** than a pointer to be useful.
        !           491:   */
        !           492:   sz = ROUNDDOWN8(sz);  /* IMP: R-33038-09382 */
        !           493:   if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0;
        !           494:   if( cnt<0 ) cnt = 0;
        !           495:   if( sz==0 || cnt==0 ){
        !           496:     sz = 0;
        !           497:     pStart = 0;
        !           498:   }else if( pBuf==0 ){
        !           499:     sqlite3BeginBenignMalloc();
        !           500:     pStart = sqlite3Malloc( sz*cnt );  /* IMP: R-61949-35727 */
        !           501:     sqlite3EndBenignMalloc();
        !           502:     if( pStart ) cnt = sqlite3MallocSize(pStart)/sz;
        !           503:   }else{
        !           504:     pStart = pBuf;
        !           505:   }
        !           506:   db->lookaside.pStart = pStart;
        !           507:   db->lookaside.pFree = 0;
        !           508:   db->lookaside.sz = (u16)sz;
        !           509:   if( pStart ){
        !           510:     int i;
        !           511:     LookasideSlot *p;
        !           512:     assert( sz > (int)sizeof(LookasideSlot*) );
        !           513:     p = (LookasideSlot*)pStart;
        !           514:     for(i=cnt-1; i>=0; i--){
        !           515:       p->pNext = db->lookaside.pFree;
        !           516:       db->lookaside.pFree = p;
        !           517:       p = (LookasideSlot*)&((u8*)p)[sz];
        !           518:     }
        !           519:     db->lookaside.pEnd = p;
        !           520:     db->lookaside.bEnabled = 1;
        !           521:     db->lookaside.bMalloced = pBuf==0 ?1:0;
        !           522:   }else{
        !           523:     db->lookaside.pEnd = 0;
        !           524:     db->lookaside.bEnabled = 0;
        !           525:     db->lookaside.bMalloced = 0;
        !           526:   }
        !           527:   return SQLITE_OK;
        !           528: }
        !           529: 
        !           530: /*
        !           531: ** Return the mutex associated with a database connection.
        !           532: */
        !           533: sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){
        !           534:   return db->mutex;
        !           535: }
        !           536: 
        !           537: /*
        !           538: ** Free up as much memory as we can from the given database
        !           539: ** connection.
        !           540: */
        !           541: int sqlite3_db_release_memory(sqlite3 *db){
        !           542:   int i;
        !           543:   sqlite3_mutex_enter(db->mutex);
        !           544:   sqlite3BtreeEnterAll(db);
        !           545:   for(i=0; i<db->nDb; i++){
        !           546:     Btree *pBt = db->aDb[i].pBt;
        !           547:     if( pBt ){
        !           548:       Pager *pPager = sqlite3BtreePager(pBt);
        !           549:       sqlite3PagerShrink(pPager);
        !           550:     }
        !           551:   }
        !           552:   sqlite3BtreeLeaveAll(db);
        !           553:   sqlite3_mutex_leave(db->mutex);
        !           554:   return SQLITE_OK;
        !           555: }
        !           556: 
        !           557: /*
        !           558: ** Configuration settings for an individual database connection
        !           559: */
        !           560: int sqlite3_db_config(sqlite3 *db, int op, ...){
        !           561:   va_list ap;
        !           562:   int rc;
        !           563:   va_start(ap, op);
        !           564:   switch( op ){
        !           565:     case SQLITE_DBCONFIG_LOOKASIDE: {
        !           566:       void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */
        !           567:       int sz = va_arg(ap, int);       /* IMP: R-47871-25994 */
        !           568:       int cnt = va_arg(ap, int);      /* IMP: R-04460-53386 */
        !           569:       rc = setupLookaside(db, pBuf, sz, cnt);
        !           570:       break;
        !           571:     }
        !           572:     default: {
        !           573:       static const struct {
        !           574:         int op;      /* The opcode */
        !           575:         u32 mask;    /* Mask of the bit in sqlite3.flags to set/clear */
        !           576:       } aFlagOp[] = {
        !           577:         { SQLITE_DBCONFIG_ENABLE_FKEY,    SQLITE_ForeignKeys    },
        !           578:         { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger  },
        !           579:       };
        !           580:       unsigned int i;
        !           581:       rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
        !           582:       for(i=0; i<ArraySize(aFlagOp); i++){
        !           583:         if( aFlagOp[i].op==op ){
        !           584:           int onoff = va_arg(ap, int);
        !           585:           int *pRes = va_arg(ap, int*);
        !           586:           int oldFlags = db->flags;
        !           587:           if( onoff>0 ){
        !           588:             db->flags |= aFlagOp[i].mask;
        !           589:           }else if( onoff==0 ){
        !           590:             db->flags &= ~aFlagOp[i].mask;
        !           591:           }
        !           592:           if( oldFlags!=db->flags ){
        !           593:             sqlite3ExpirePreparedStatements(db);
        !           594:           }
        !           595:           if( pRes ){
        !           596:             *pRes = (db->flags & aFlagOp[i].mask)!=0;
        !           597:           }
        !           598:           rc = SQLITE_OK;
        !           599:           break;
        !           600:         }
        !           601:       }
        !           602:       break;
        !           603:     }
        !           604:   }
        !           605:   va_end(ap);
        !           606:   return rc;
        !           607: }
        !           608: 
        !           609: 
        !           610: /*
        !           611: ** Return true if the buffer z[0..n-1] contains all spaces.
        !           612: */
        !           613: static int allSpaces(const char *z, int n){
        !           614:   while( n>0 && z[n-1]==' ' ){ n--; }
        !           615:   return n==0;
        !           616: }
        !           617: 
        !           618: /*
        !           619: ** This is the default collating function named "BINARY" which is always
        !           620: ** available.
        !           621: **
        !           622: ** If the padFlag argument is not NULL then space padding at the end
        !           623: ** of strings is ignored.  This implements the RTRIM collation.
        !           624: */
        !           625: static int binCollFunc(
        !           626:   void *padFlag,
        !           627:   int nKey1, const void *pKey1,
        !           628:   int nKey2, const void *pKey2
        !           629: ){
        !           630:   int rc, n;
        !           631:   n = nKey1<nKey2 ? nKey1 : nKey2;
        !           632:   rc = memcmp(pKey1, pKey2, n);
        !           633:   if( rc==0 ){
        !           634:     if( padFlag
        !           635:      && allSpaces(((char*)pKey1)+n, nKey1-n)
        !           636:      && allSpaces(((char*)pKey2)+n, nKey2-n)
        !           637:     ){
        !           638:       /* Leave rc unchanged at 0 */
        !           639:     }else{
        !           640:       rc = nKey1 - nKey2;
        !           641:     }
        !           642:   }
        !           643:   return rc;
        !           644: }
        !           645: 
        !           646: /*
        !           647: ** Another built-in collating sequence: NOCASE. 
        !           648: **
        !           649: ** This collating sequence is intended to be used for "case independant
        !           650: ** comparison". SQLite's knowledge of upper and lower case equivalents
        !           651: ** extends only to the 26 characters used in the English language.
        !           652: **
        !           653: ** At the moment there is only a UTF-8 implementation.
        !           654: */
        !           655: static int nocaseCollatingFunc(
        !           656:   void *NotUsed,
        !           657:   int nKey1, const void *pKey1,
        !           658:   int nKey2, const void *pKey2
        !           659: ){
        !           660:   int r = sqlite3StrNICmp(
        !           661:       (const char *)pKey1, (const char *)pKey2, (nKey1<nKey2)?nKey1:nKey2);
        !           662:   UNUSED_PARAMETER(NotUsed);
        !           663:   if( 0==r ){
        !           664:     r = nKey1-nKey2;
        !           665:   }
        !           666:   return r;
        !           667: }
        !           668: 
        !           669: /*
        !           670: ** Return the ROWID of the most recent insert
        !           671: */
        !           672: sqlite_int64 sqlite3_last_insert_rowid(sqlite3 *db){
        !           673:   return db->lastRowid;
        !           674: }
        !           675: 
        !           676: /*
        !           677: ** Return the number of changes in the most recent call to sqlite3_exec().
        !           678: */
        !           679: int sqlite3_changes(sqlite3 *db){
        !           680:   return db->nChange;
        !           681: }
        !           682: 
        !           683: /*
        !           684: ** Return the number of changes since the database handle was opened.
        !           685: */
        !           686: int sqlite3_total_changes(sqlite3 *db){
        !           687:   return db->nTotalChange;
        !           688: }
        !           689: 
        !           690: /*
        !           691: ** Close all open savepoints. This function only manipulates fields of the
        !           692: ** database handle object, it does not close any savepoints that may be open
        !           693: ** at the b-tree/pager level.
        !           694: */
        !           695: void sqlite3CloseSavepoints(sqlite3 *db){
        !           696:   while( db->pSavepoint ){
        !           697:     Savepoint *pTmp = db->pSavepoint;
        !           698:     db->pSavepoint = pTmp->pNext;
        !           699:     sqlite3DbFree(db, pTmp);
        !           700:   }
        !           701:   db->nSavepoint = 0;
        !           702:   db->nStatement = 0;
        !           703:   db->isTransactionSavepoint = 0;
        !           704: }
        !           705: 
        !           706: /*
        !           707: ** Invoke the destructor function associated with FuncDef p, if any. Except,
        !           708: ** if this is not the last copy of the function, do not invoke it. Multiple
        !           709: ** copies of a single function are created when create_function() is called
        !           710: ** with SQLITE_ANY as the encoding.
        !           711: */
        !           712: static void functionDestroy(sqlite3 *db, FuncDef *p){
        !           713:   FuncDestructor *pDestructor = p->pDestructor;
        !           714:   if( pDestructor ){
        !           715:     pDestructor->nRef--;
        !           716:     if( pDestructor->nRef==0 ){
        !           717:       pDestructor->xDestroy(pDestructor->pUserData);
        !           718:       sqlite3DbFree(db, pDestructor);
        !           719:     }
        !           720:   }
        !           721: }
        !           722: 
        !           723: /*
        !           724: ** Close an existing SQLite database
        !           725: */
        !           726: int sqlite3_close(sqlite3 *db){
        !           727:   HashElem *i;                    /* Hash table iterator */
        !           728:   int j;
        !           729: 
        !           730:   if( !db ){
        !           731:     return SQLITE_OK;
        !           732:   }
        !           733:   if( !sqlite3SafetyCheckSickOrOk(db) ){
        !           734:     return SQLITE_MISUSE_BKPT;
        !           735:   }
        !           736:   sqlite3_mutex_enter(db->mutex);
        !           737: 
        !           738:   /* Force xDestroy calls on all virtual tables */
        !           739:   sqlite3ResetInternalSchema(db, -1);
        !           740: 
        !           741:   /* If a transaction is open, the ResetInternalSchema() call above
        !           742:   ** will not have called the xDisconnect() method on any virtual
        !           743:   ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback()
        !           744:   ** call will do so. We need to do this before the check for active
        !           745:   ** SQL statements below, as the v-table implementation may be storing
        !           746:   ** some prepared statements internally.
        !           747:   */
        !           748:   sqlite3VtabRollback(db);
        !           749: 
        !           750:   /* If there are any outstanding VMs, return SQLITE_BUSY. */
        !           751:   if( db->pVdbe ){
        !           752:     sqlite3Error(db, SQLITE_BUSY, 
        !           753:         "unable to close due to unfinalised statements");
        !           754:     sqlite3_mutex_leave(db->mutex);
        !           755:     return SQLITE_BUSY;
        !           756:   }
        !           757:   assert( sqlite3SafetyCheckSickOrOk(db) );
        !           758: 
        !           759:   for(j=0; j<db->nDb; j++){
        !           760:     Btree *pBt = db->aDb[j].pBt;
        !           761:     if( pBt && sqlite3BtreeIsInBackup(pBt) ){
        !           762:       sqlite3Error(db, SQLITE_BUSY, 
        !           763:           "unable to close due to unfinished backup operation");
        !           764:       sqlite3_mutex_leave(db->mutex);
        !           765:       return SQLITE_BUSY;
        !           766:     }
        !           767:   }
        !           768: 
        !           769:   /* Free any outstanding Savepoint structures. */
        !           770:   sqlite3CloseSavepoints(db);
        !           771: 
        !           772:   for(j=0; j<db->nDb; j++){
        !           773:     struct Db *pDb = &db->aDb[j];
        !           774:     if( pDb->pBt ){
        !           775:       sqlite3BtreeClose(pDb->pBt);
        !           776:       pDb->pBt = 0;
        !           777:       if( j!=1 ){
        !           778:         pDb->pSchema = 0;
        !           779:       }
        !           780:     }
        !           781:   }
        !           782:   sqlite3ResetInternalSchema(db, -1);
        !           783: 
        !           784:   /* Tell the code in notify.c that the connection no longer holds any
        !           785:   ** locks and does not require any further unlock-notify callbacks.
        !           786:   */
        !           787:   sqlite3ConnectionClosed(db);
        !           788: 
        !           789:   assert( db->nDb<=2 );
        !           790:   assert( db->aDb==db->aDbStatic );
        !           791:   for(j=0; j<ArraySize(db->aFunc.a); j++){
        !           792:     FuncDef *pNext, *pHash, *p;
        !           793:     for(p=db->aFunc.a[j]; p; p=pHash){
        !           794:       pHash = p->pHash;
        !           795:       while( p ){
        !           796:         functionDestroy(db, p);
        !           797:         pNext = p->pNext;
        !           798:         sqlite3DbFree(db, p);
        !           799:         p = pNext;
        !           800:       }
        !           801:     }
        !           802:   }
        !           803:   for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){
        !           804:     CollSeq *pColl = (CollSeq *)sqliteHashData(i);
        !           805:     /* Invoke any destructors registered for collation sequence user data. */
        !           806:     for(j=0; j<3; j++){
        !           807:       if( pColl[j].xDel ){
        !           808:         pColl[j].xDel(pColl[j].pUser);
        !           809:       }
        !           810:     }
        !           811:     sqlite3DbFree(db, pColl);
        !           812:   }
        !           813:   sqlite3HashClear(&db->aCollSeq);
        !           814: #ifndef SQLITE_OMIT_VIRTUALTABLE
        !           815:   for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){
        !           816:     Module *pMod = (Module *)sqliteHashData(i);
        !           817:     if( pMod->xDestroy ){
        !           818:       pMod->xDestroy(pMod->pAux);
        !           819:     }
        !           820:     sqlite3DbFree(db, pMod);
        !           821:   }
        !           822:   sqlite3HashClear(&db->aModule);
        !           823: #endif
        !           824: 
        !           825:   sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */
        !           826:   if( db->pErr ){
        !           827:     sqlite3ValueFree(db->pErr);
        !           828:   }
        !           829:   sqlite3CloseExtensions(db);
        !           830: 
        !           831:   db->magic = SQLITE_MAGIC_ERROR;
        !           832: 
        !           833:   /* The temp-database schema is allocated differently from the other schema
        !           834:   ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()).
        !           835:   ** So it needs to be freed here. Todo: Why not roll the temp schema into
        !           836:   ** the same sqliteMalloc() as the one that allocates the database 
        !           837:   ** structure?
        !           838:   */
        !           839:   sqlite3DbFree(db, db->aDb[1].pSchema);
        !           840:   sqlite3_mutex_leave(db->mutex);
        !           841:   db->magic = SQLITE_MAGIC_CLOSED;
        !           842:   sqlite3_mutex_free(db->mutex);
        !           843:   assert( db->lookaside.nOut==0 );  /* Fails on a lookaside memory leak */
        !           844:   if( db->lookaside.bMalloced ){
        !           845:     sqlite3_free(db->lookaside.pStart);
        !           846:   }
        !           847:   sqlite3_free(db);
        !           848:   return SQLITE_OK;
        !           849: }
        !           850: 
        !           851: /*
        !           852: ** Rollback all database files.
        !           853: */
        !           854: void sqlite3RollbackAll(sqlite3 *db){
        !           855:   int i;
        !           856:   int inTrans = 0;
        !           857:   assert( sqlite3_mutex_held(db->mutex) );
        !           858:   sqlite3BeginBenignMalloc();
        !           859:   for(i=0; i<db->nDb; i++){
        !           860:     if( db->aDb[i].pBt ){
        !           861:       if( sqlite3BtreeIsInTrans(db->aDb[i].pBt) ){
        !           862:         inTrans = 1;
        !           863:       }
        !           864:       sqlite3BtreeRollback(db->aDb[i].pBt);
        !           865:       db->aDb[i].inTrans = 0;
        !           866:     }
        !           867:   }
        !           868:   sqlite3VtabRollback(db);
        !           869:   sqlite3EndBenignMalloc();
        !           870: 
        !           871:   if( db->flags&SQLITE_InternChanges ){
        !           872:     sqlite3ExpirePreparedStatements(db);
        !           873:     sqlite3ResetInternalSchema(db, -1);
        !           874:   }
        !           875: 
        !           876:   /* Any deferred constraint violations have now been resolved. */
        !           877:   db->nDeferredCons = 0;
        !           878: 
        !           879:   /* If one has been configured, invoke the rollback-hook callback */
        !           880:   if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){
        !           881:     db->xRollbackCallback(db->pRollbackArg);
        !           882:   }
        !           883: }
        !           884: 
        !           885: /*
        !           886: ** Return a static string that describes the kind of error specified in the
        !           887: ** argument.
        !           888: */
        !           889: const char *sqlite3ErrStr(int rc){
        !           890:   static const char* const aMsg[] = {
        !           891:     /* SQLITE_OK          */ "not an error",
        !           892:     /* SQLITE_ERROR       */ "SQL logic error or missing database",
        !           893:     /* SQLITE_INTERNAL    */ 0,
        !           894:     /* SQLITE_PERM        */ "access permission denied",
        !           895:     /* SQLITE_ABORT       */ "callback requested query abort",
        !           896:     /* SQLITE_BUSY        */ "database is locked",
        !           897:     /* SQLITE_LOCKED      */ "database table is locked",
        !           898:     /* SQLITE_NOMEM       */ "out of memory",
        !           899:     /* SQLITE_READONLY    */ "attempt to write a readonly database",
        !           900:     /* SQLITE_INTERRUPT   */ "interrupted",
        !           901:     /* SQLITE_IOERR       */ "disk I/O error",
        !           902:     /* SQLITE_CORRUPT     */ "database disk image is malformed",
        !           903:     /* SQLITE_NOTFOUND    */ "unknown operation",
        !           904:     /* SQLITE_FULL        */ "database or disk is full",
        !           905:     /* SQLITE_CANTOPEN    */ "unable to open database file",
        !           906:     /* SQLITE_PROTOCOL    */ "locking protocol",
        !           907:     /* SQLITE_EMPTY       */ "table contains no data",
        !           908:     /* SQLITE_SCHEMA      */ "database schema has changed",
        !           909:     /* SQLITE_TOOBIG      */ "string or blob too big",
        !           910:     /* SQLITE_CONSTRAINT  */ "constraint failed",
        !           911:     /* SQLITE_MISMATCH    */ "datatype mismatch",
        !           912:     /* SQLITE_MISUSE      */ "library routine called out of sequence",
        !           913:     /* SQLITE_NOLFS       */ "large file support is disabled",
        !           914:     /* SQLITE_AUTH        */ "authorization denied",
        !           915:     /* SQLITE_FORMAT      */ "auxiliary database format error",
        !           916:     /* SQLITE_RANGE       */ "bind or column index out of range",
        !           917:     /* SQLITE_NOTADB      */ "file is encrypted or is not a database",
        !           918:   };
        !           919:   rc &= 0xff;
        !           920:   if( ALWAYS(rc>=0) && rc<(int)(sizeof(aMsg)/sizeof(aMsg[0])) && aMsg[rc]!=0 ){
        !           921:     return aMsg[rc];
        !           922:   }else{
        !           923:     return "unknown error";
        !           924:   }
        !           925: }
        !           926: 
        !           927: /*
        !           928: ** This routine implements a busy callback that sleeps and tries
        !           929: ** again until a timeout value is reached.  The timeout value is
        !           930: ** an integer number of milliseconds passed in as the first
        !           931: ** argument.
        !           932: */
        !           933: static int sqliteDefaultBusyCallback(
        !           934:  void *ptr,               /* Database connection */
        !           935:  int count                /* Number of times table has been busy */
        !           936: ){
        !           937: #if SQLITE_OS_WIN || (defined(HAVE_USLEEP) && HAVE_USLEEP)
        !           938:   static const u8 delays[] =
        !           939:      { 1, 2, 5, 10, 15, 20, 25, 25,  25,  50,  50, 100 };
        !           940:   static const u8 totals[] =
        !           941:      { 0, 1, 3,  8, 18, 33, 53, 78, 103, 128, 178, 228 };
        !           942: # define NDELAY ArraySize(delays)
        !           943:   sqlite3 *db = (sqlite3 *)ptr;
        !           944:   int timeout = db->busyTimeout;
        !           945:   int delay, prior;
        !           946: 
        !           947:   assert( count>=0 );
        !           948:   if( count < NDELAY ){
        !           949:     delay = delays[count];
        !           950:     prior = totals[count];
        !           951:   }else{
        !           952:     delay = delays[NDELAY-1];
        !           953:     prior = totals[NDELAY-1] + delay*(count-(NDELAY-1));
        !           954:   }
        !           955:   if( prior + delay > timeout ){
        !           956:     delay = timeout - prior;
        !           957:     if( delay<=0 ) return 0;
        !           958:   }
        !           959:   sqlite3OsSleep(db->pVfs, delay*1000);
        !           960:   return 1;
        !           961: #else
        !           962:   sqlite3 *db = (sqlite3 *)ptr;
        !           963:   int timeout = ((sqlite3 *)ptr)->busyTimeout;
        !           964:   if( (count+1)*1000 > timeout ){
        !           965:     return 0;
        !           966:   }
        !           967:   sqlite3OsSleep(db->pVfs, 1000000);
        !           968:   return 1;
        !           969: #endif
        !           970: }
        !           971: 
        !           972: /*
        !           973: ** Invoke the given busy handler.
        !           974: **
        !           975: ** This routine is called when an operation failed with a lock.
        !           976: ** If this routine returns non-zero, the lock is retried.  If it
        !           977: ** returns 0, the operation aborts with an SQLITE_BUSY error.
        !           978: */
        !           979: int sqlite3InvokeBusyHandler(BusyHandler *p){
        !           980:   int rc;
        !           981:   if( NEVER(p==0) || p->xFunc==0 || p->nBusy<0 ) return 0;
        !           982:   rc = p->xFunc(p->pArg, p->nBusy);
        !           983:   if( rc==0 ){
        !           984:     p->nBusy = -1;
        !           985:   }else{
        !           986:     p->nBusy++;
        !           987:   }
        !           988:   return rc; 
        !           989: }
        !           990: 
        !           991: /*
        !           992: ** This routine sets the busy callback for an Sqlite database to the
        !           993: ** given callback function with the given argument.
        !           994: */
        !           995: int sqlite3_busy_handler(
        !           996:   sqlite3 *db,
        !           997:   int (*xBusy)(void*,int),
        !           998:   void *pArg
        !           999: ){
        !          1000:   sqlite3_mutex_enter(db->mutex);
        !          1001:   db->busyHandler.xFunc = xBusy;
        !          1002:   db->busyHandler.pArg = pArg;
        !          1003:   db->busyHandler.nBusy = 0;
        !          1004:   sqlite3_mutex_leave(db->mutex);
        !          1005:   return SQLITE_OK;
        !          1006: }
        !          1007: 
        !          1008: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
        !          1009: /*
        !          1010: ** This routine sets the progress callback for an Sqlite database to the
        !          1011: ** given callback function with the given argument. The progress callback will
        !          1012: ** be invoked every nOps opcodes.
        !          1013: */
        !          1014: void sqlite3_progress_handler(
        !          1015:   sqlite3 *db, 
        !          1016:   int nOps,
        !          1017:   int (*xProgress)(void*), 
        !          1018:   void *pArg
        !          1019: ){
        !          1020:   sqlite3_mutex_enter(db->mutex);
        !          1021:   if( nOps>0 ){
        !          1022:     db->xProgress = xProgress;
        !          1023:     db->nProgressOps = nOps;
        !          1024:     db->pProgressArg = pArg;
        !          1025:   }else{
        !          1026:     db->xProgress = 0;
        !          1027:     db->nProgressOps = 0;
        !          1028:     db->pProgressArg = 0;
        !          1029:   }
        !          1030:   sqlite3_mutex_leave(db->mutex);
        !          1031: }
        !          1032: #endif
        !          1033: 
        !          1034: 
        !          1035: /*
        !          1036: ** This routine installs a default busy handler that waits for the
        !          1037: ** specified number of milliseconds before returning 0.
        !          1038: */
        !          1039: int sqlite3_busy_timeout(sqlite3 *db, int ms){
        !          1040:   if( ms>0 ){
        !          1041:     db->busyTimeout = ms;
        !          1042:     sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db);
        !          1043:   }else{
        !          1044:     sqlite3_busy_handler(db, 0, 0);
        !          1045:   }
        !          1046:   return SQLITE_OK;
        !          1047: }
        !          1048: 
        !          1049: /*
        !          1050: ** Cause any pending operation to stop at its earliest opportunity.
        !          1051: */
        !          1052: void sqlite3_interrupt(sqlite3 *db){
        !          1053:   db->u1.isInterrupted = 1;
        !          1054: }
        !          1055: 
        !          1056: 
        !          1057: /*
        !          1058: ** This function is exactly the same as sqlite3_create_function(), except
        !          1059: ** that it is designed to be called by internal code. The difference is
        !          1060: ** that if a malloc() fails in sqlite3_create_function(), an error code
        !          1061: ** is returned and the mallocFailed flag cleared. 
        !          1062: */
        !          1063: int sqlite3CreateFunc(
        !          1064:   sqlite3 *db,
        !          1065:   const char *zFunctionName,
        !          1066:   int nArg,
        !          1067:   int enc,
        !          1068:   void *pUserData,
        !          1069:   void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
        !          1070:   void (*xStep)(sqlite3_context*,int,sqlite3_value **),
        !          1071:   void (*xFinal)(sqlite3_context*),
        !          1072:   FuncDestructor *pDestructor
        !          1073: ){
        !          1074:   FuncDef *p;
        !          1075:   int nName;
        !          1076: 
        !          1077:   assert( sqlite3_mutex_held(db->mutex) );
        !          1078:   if( zFunctionName==0 ||
        !          1079:       (xFunc && (xFinal || xStep)) || 
        !          1080:       (!xFunc && (xFinal && !xStep)) ||
        !          1081:       (!xFunc && (!xFinal && xStep)) ||
        !          1082:       (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) ||
        !          1083:       (255<(nName = sqlite3Strlen30( zFunctionName))) ){
        !          1084:     return SQLITE_MISUSE_BKPT;
        !          1085:   }
        !          1086:   
        !          1087: #ifndef SQLITE_OMIT_UTF16
        !          1088:   /* If SQLITE_UTF16 is specified as the encoding type, transform this
        !          1089:   ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
        !          1090:   ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
        !          1091:   **
        !          1092:   ** If SQLITE_ANY is specified, add three versions of the function
        !          1093:   ** to the hash table.
        !          1094:   */
        !          1095:   if( enc==SQLITE_UTF16 ){
        !          1096:     enc = SQLITE_UTF16NATIVE;
        !          1097:   }else if( enc==SQLITE_ANY ){
        !          1098:     int rc;
        !          1099:     rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8,
        !          1100:          pUserData, xFunc, xStep, xFinal, pDestructor);
        !          1101:     if( rc==SQLITE_OK ){
        !          1102:       rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE,
        !          1103:           pUserData, xFunc, xStep, xFinal, pDestructor);
        !          1104:     }
        !          1105:     if( rc!=SQLITE_OK ){
        !          1106:       return rc;
        !          1107:     }
        !          1108:     enc = SQLITE_UTF16BE;
        !          1109:   }
        !          1110: #else
        !          1111:   enc = SQLITE_UTF8;
        !          1112: #endif
        !          1113:   
        !          1114:   /* Check if an existing function is being overridden or deleted. If so,
        !          1115:   ** and there are active VMs, then return SQLITE_BUSY. If a function
        !          1116:   ** is being overridden/deleted but there are no active VMs, allow the
        !          1117:   ** operation to continue but invalidate all precompiled statements.
        !          1118:   */
        !          1119:   p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 0);
        !          1120:   if( p && p->iPrefEnc==enc && p->nArg==nArg ){
        !          1121:     if( db->activeVdbeCnt ){
        !          1122:       sqlite3Error(db, SQLITE_BUSY, 
        !          1123:         "unable to delete/modify user-function due to active statements");
        !          1124:       assert( !db->mallocFailed );
        !          1125:       return SQLITE_BUSY;
        !          1126:     }else{
        !          1127:       sqlite3ExpirePreparedStatements(db);
        !          1128:     }
        !          1129:   }
        !          1130: 
        !          1131:   p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 1);
        !          1132:   assert(p || db->mallocFailed);
        !          1133:   if( !p ){
        !          1134:     return SQLITE_NOMEM;
        !          1135:   }
        !          1136: 
        !          1137:   /* If an older version of the function with a configured destructor is
        !          1138:   ** being replaced invoke the destructor function here. */
        !          1139:   functionDestroy(db, p);
        !          1140: 
        !          1141:   if( pDestructor ){
        !          1142:     pDestructor->nRef++;
        !          1143:   }
        !          1144:   p->pDestructor = pDestructor;
        !          1145:   p->flags = 0;
        !          1146:   p->xFunc = xFunc;
        !          1147:   p->xStep = xStep;
        !          1148:   p->xFinalize = xFinal;
        !          1149:   p->pUserData = pUserData;
        !          1150:   p->nArg = (u16)nArg;
        !          1151:   return SQLITE_OK;
        !          1152: }
        !          1153: 
        !          1154: /*
        !          1155: ** Create new user functions.
        !          1156: */
        !          1157: int sqlite3_create_function(
        !          1158:   sqlite3 *db,
        !          1159:   const char *zFunc,
        !          1160:   int nArg,
        !          1161:   int enc,
        !          1162:   void *p,
        !          1163:   void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
        !          1164:   void (*xStep)(sqlite3_context*,int,sqlite3_value **),
        !          1165:   void (*xFinal)(sqlite3_context*)
        !          1166: ){
        !          1167:   return sqlite3_create_function_v2(db, zFunc, nArg, enc, p, xFunc, xStep,
        !          1168:                                     xFinal, 0);
        !          1169: }
        !          1170: 
        !          1171: int sqlite3_create_function_v2(
        !          1172:   sqlite3 *db,
        !          1173:   const char *zFunc,
        !          1174:   int nArg,
        !          1175:   int enc,
        !          1176:   void *p,
        !          1177:   void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
        !          1178:   void (*xStep)(sqlite3_context*,int,sqlite3_value **),
        !          1179:   void (*xFinal)(sqlite3_context*),
        !          1180:   void (*xDestroy)(void *)
        !          1181: ){
        !          1182:   int rc = SQLITE_ERROR;
        !          1183:   FuncDestructor *pArg = 0;
        !          1184:   sqlite3_mutex_enter(db->mutex);
        !          1185:   if( xDestroy ){
        !          1186:     pArg = (FuncDestructor *)sqlite3DbMallocZero(db, sizeof(FuncDestructor));
        !          1187:     if( !pArg ){
        !          1188:       xDestroy(p);
        !          1189:       goto out;
        !          1190:     }
        !          1191:     pArg->xDestroy = xDestroy;
        !          1192:     pArg->pUserData = p;
        !          1193:   }
        !          1194:   rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, xFunc, xStep, xFinal, pArg);
        !          1195:   if( pArg && pArg->nRef==0 ){
        !          1196:     assert( rc!=SQLITE_OK );
        !          1197:     xDestroy(p);
        !          1198:     sqlite3DbFree(db, pArg);
        !          1199:   }
        !          1200: 
        !          1201:  out:
        !          1202:   rc = sqlite3ApiExit(db, rc);
        !          1203:   sqlite3_mutex_leave(db->mutex);
        !          1204:   return rc;
        !          1205: }
        !          1206: 
        !          1207: #ifndef SQLITE_OMIT_UTF16
        !          1208: int sqlite3_create_function16(
        !          1209:   sqlite3 *db,
        !          1210:   const void *zFunctionName,
        !          1211:   int nArg,
        !          1212:   int eTextRep,
        !          1213:   void *p,
        !          1214:   void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
        !          1215:   void (*xStep)(sqlite3_context*,int,sqlite3_value**),
        !          1216:   void (*xFinal)(sqlite3_context*)
        !          1217: ){
        !          1218:   int rc;
        !          1219:   char *zFunc8;
        !          1220:   sqlite3_mutex_enter(db->mutex);
        !          1221:   assert( !db->mallocFailed );
        !          1222:   zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE);
        !          1223:   rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal,0);
        !          1224:   sqlite3DbFree(db, zFunc8);
        !          1225:   rc = sqlite3ApiExit(db, rc);
        !          1226:   sqlite3_mutex_leave(db->mutex);
        !          1227:   return rc;
        !          1228: }
        !          1229: #endif
        !          1230: 
        !          1231: 
        !          1232: /*
        !          1233: ** Declare that a function has been overloaded by a virtual table.
        !          1234: **
        !          1235: ** If the function already exists as a regular global function, then
        !          1236: ** this routine is a no-op.  If the function does not exist, then create
        !          1237: ** a new one that always throws a run-time error.  
        !          1238: **
        !          1239: ** When virtual tables intend to provide an overloaded function, they
        !          1240: ** should call this routine to make sure the global function exists.
        !          1241: ** A global function must exist in order for name resolution to work
        !          1242: ** properly.
        !          1243: */
        !          1244: int sqlite3_overload_function(
        !          1245:   sqlite3 *db,
        !          1246:   const char *zName,
        !          1247:   int nArg
        !          1248: ){
        !          1249:   int nName = sqlite3Strlen30(zName);
        !          1250:   int rc = SQLITE_OK;
        !          1251:   sqlite3_mutex_enter(db->mutex);
        !          1252:   if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){
        !          1253:     rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
        !          1254:                            0, sqlite3InvalidFunction, 0, 0, 0);
        !          1255:   }
        !          1256:   rc = sqlite3ApiExit(db, rc);
        !          1257:   sqlite3_mutex_leave(db->mutex);
        !          1258:   return rc;
        !          1259: }
        !          1260: 
        !          1261: #ifndef SQLITE_OMIT_TRACE
        !          1262: /*
        !          1263: ** Register a trace function.  The pArg from the previously registered trace
        !          1264: ** is returned.  
        !          1265: **
        !          1266: ** A NULL trace function means that no tracing is executes.  A non-NULL
        !          1267: ** trace is a pointer to a function that is invoked at the start of each
        !          1268: ** SQL statement.
        !          1269: */
        !          1270: void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), void *pArg){
        !          1271:   void *pOld;
        !          1272:   sqlite3_mutex_enter(db->mutex);
        !          1273:   pOld = db->pTraceArg;
        !          1274:   db->xTrace = xTrace;
        !          1275:   db->pTraceArg = pArg;
        !          1276:   sqlite3_mutex_leave(db->mutex);
        !          1277:   return pOld;
        !          1278: }
        !          1279: /*
        !          1280: ** Register a profile function.  The pArg from the previously registered 
        !          1281: ** profile function is returned.  
        !          1282: **
        !          1283: ** A NULL profile function means that no profiling is executes.  A non-NULL
        !          1284: ** profile is a pointer to a function that is invoked at the conclusion of
        !          1285: ** each SQL statement that is run.
        !          1286: */
        !          1287: void *sqlite3_profile(
        !          1288:   sqlite3 *db,
        !          1289:   void (*xProfile)(void*,const char*,sqlite_uint64),
        !          1290:   void *pArg
        !          1291: ){
        !          1292:   void *pOld;
        !          1293:   sqlite3_mutex_enter(db->mutex);
        !          1294:   pOld = db->pProfileArg;
        !          1295:   db->xProfile = xProfile;
        !          1296:   db->pProfileArg = pArg;
        !          1297:   sqlite3_mutex_leave(db->mutex);
        !          1298:   return pOld;
        !          1299: }
        !          1300: #endif /* SQLITE_OMIT_TRACE */
        !          1301: 
        !          1302: /*** EXPERIMENTAL ***
        !          1303: **
        !          1304: ** Register a function to be invoked when a transaction comments.
        !          1305: ** If the invoked function returns non-zero, then the commit becomes a
        !          1306: ** rollback.
        !          1307: */
        !          1308: void *sqlite3_commit_hook(
        !          1309:   sqlite3 *db,              /* Attach the hook to this database */
        !          1310:   int (*xCallback)(void*),  /* Function to invoke on each commit */
        !          1311:   void *pArg                /* Argument to the function */
        !          1312: ){
        !          1313:   void *pOld;
        !          1314:   sqlite3_mutex_enter(db->mutex);
        !          1315:   pOld = db->pCommitArg;
        !          1316:   db->xCommitCallback = xCallback;
        !          1317:   db->pCommitArg = pArg;
        !          1318:   sqlite3_mutex_leave(db->mutex);
        !          1319:   return pOld;
        !          1320: }
        !          1321: 
        !          1322: /*
        !          1323: ** Register a callback to be invoked each time a row is updated,
        !          1324: ** inserted or deleted using this database connection.
        !          1325: */
        !          1326: void *sqlite3_update_hook(
        !          1327:   sqlite3 *db,              /* Attach the hook to this database */
        !          1328:   void (*xCallback)(void*,int,char const *,char const *,sqlite_int64),
        !          1329:   void *pArg                /* Argument to the function */
        !          1330: ){
        !          1331:   void *pRet;
        !          1332:   sqlite3_mutex_enter(db->mutex);
        !          1333:   pRet = db->pUpdateArg;
        !          1334:   db->xUpdateCallback = xCallback;
        !          1335:   db->pUpdateArg = pArg;
        !          1336:   sqlite3_mutex_leave(db->mutex);
        !          1337:   return pRet;
        !          1338: }
        !          1339: 
        !          1340: /*
        !          1341: ** Register a callback to be invoked each time a transaction is rolled
        !          1342: ** back by this database connection.
        !          1343: */
        !          1344: void *sqlite3_rollback_hook(
        !          1345:   sqlite3 *db,              /* Attach the hook to this database */
        !          1346:   void (*xCallback)(void*), /* Callback function */
        !          1347:   void *pArg                /* Argument to the function */
        !          1348: ){
        !          1349:   void *pRet;
        !          1350:   sqlite3_mutex_enter(db->mutex);
        !          1351:   pRet = db->pRollbackArg;
        !          1352:   db->xRollbackCallback = xCallback;
        !          1353:   db->pRollbackArg = pArg;
        !          1354:   sqlite3_mutex_leave(db->mutex);
        !          1355:   return pRet;
        !          1356: }
        !          1357: 
        !          1358: #ifndef SQLITE_OMIT_WAL
        !          1359: /*
        !          1360: ** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint().
        !          1361: ** Invoke sqlite3_wal_checkpoint if the number of frames in the log file
        !          1362: ** is greater than sqlite3.pWalArg cast to an integer (the value configured by
        !          1363: ** wal_autocheckpoint()).
        !          1364: */ 
        !          1365: int sqlite3WalDefaultHook(
        !          1366:   void *pClientData,     /* Argument */
        !          1367:   sqlite3 *db,           /* Connection */
        !          1368:   const char *zDb,       /* Database */
        !          1369:   int nFrame             /* Size of WAL */
        !          1370: ){
        !          1371:   if( nFrame>=SQLITE_PTR_TO_INT(pClientData) ){
        !          1372:     sqlite3BeginBenignMalloc();
        !          1373:     sqlite3_wal_checkpoint(db, zDb);
        !          1374:     sqlite3EndBenignMalloc();
        !          1375:   }
        !          1376:   return SQLITE_OK;
        !          1377: }
        !          1378: #endif /* SQLITE_OMIT_WAL */
        !          1379: 
        !          1380: /*
        !          1381: ** Configure an sqlite3_wal_hook() callback to automatically checkpoint
        !          1382: ** a database after committing a transaction if there are nFrame or
        !          1383: ** more frames in the log file. Passing zero or a negative value as the
        !          1384: ** nFrame parameter disables automatic checkpoints entirely.
        !          1385: **
        !          1386: ** The callback registered by this function replaces any existing callback
        !          1387: ** registered using sqlite3_wal_hook(). Likewise, registering a callback
        !          1388: ** using sqlite3_wal_hook() disables the automatic checkpoint mechanism
        !          1389: ** configured by this function.
        !          1390: */
        !          1391: int sqlite3_wal_autocheckpoint(sqlite3 *db, int nFrame){
        !          1392: #ifdef SQLITE_OMIT_WAL
        !          1393:   UNUSED_PARAMETER(db);
        !          1394:   UNUSED_PARAMETER(nFrame);
        !          1395: #else
        !          1396:   if( nFrame>0 ){
        !          1397:     sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame));
        !          1398:   }else{
        !          1399:     sqlite3_wal_hook(db, 0, 0);
        !          1400:   }
        !          1401: #endif
        !          1402:   return SQLITE_OK;
        !          1403: }
        !          1404: 
        !          1405: /*
        !          1406: ** Register a callback to be invoked each time a transaction is written
        !          1407: ** into the write-ahead-log by this database connection.
        !          1408: */
        !          1409: void *sqlite3_wal_hook(
        !          1410:   sqlite3 *db,                    /* Attach the hook to this db handle */
        !          1411:   int(*xCallback)(void *, sqlite3*, const char*, int),
        !          1412:   void *pArg                      /* First argument passed to xCallback() */
        !          1413: ){
        !          1414: #ifndef SQLITE_OMIT_WAL
        !          1415:   void *pRet;
        !          1416:   sqlite3_mutex_enter(db->mutex);
        !          1417:   pRet = db->pWalArg;
        !          1418:   db->xWalCallback = xCallback;
        !          1419:   db->pWalArg = pArg;
        !          1420:   sqlite3_mutex_leave(db->mutex);
        !          1421:   return pRet;
        !          1422: #else
        !          1423:   return 0;
        !          1424: #endif
        !          1425: }
        !          1426: 
        !          1427: /*
        !          1428: ** Checkpoint database zDb.
        !          1429: */
        !          1430: int sqlite3_wal_checkpoint_v2(
        !          1431:   sqlite3 *db,                    /* Database handle */
        !          1432:   const char *zDb,                /* Name of attached database (or NULL) */
        !          1433:   int eMode,                      /* SQLITE_CHECKPOINT_* value */
        !          1434:   int *pnLog,                     /* OUT: Size of WAL log in frames */
        !          1435:   int *pnCkpt                     /* OUT: Total number of frames checkpointed */
        !          1436: ){
        !          1437: #ifdef SQLITE_OMIT_WAL
        !          1438:   return SQLITE_OK;
        !          1439: #else
        !          1440:   int rc;                         /* Return code */
        !          1441:   int iDb = SQLITE_MAX_ATTACHED;  /* sqlite3.aDb[] index of db to checkpoint */
        !          1442: 
        !          1443:   /* Initialize the output variables to -1 in case an error occurs. */
        !          1444:   if( pnLog ) *pnLog = -1;
        !          1445:   if( pnCkpt ) *pnCkpt = -1;
        !          1446: 
        !          1447:   assert( SQLITE_CHECKPOINT_FULL>SQLITE_CHECKPOINT_PASSIVE );
        !          1448:   assert( SQLITE_CHECKPOINT_FULL<SQLITE_CHECKPOINT_RESTART );
        !          1449:   assert( SQLITE_CHECKPOINT_PASSIVE+2==SQLITE_CHECKPOINT_RESTART );
        !          1450:   if( eMode<SQLITE_CHECKPOINT_PASSIVE || eMode>SQLITE_CHECKPOINT_RESTART ){
        !          1451:     return SQLITE_MISUSE;
        !          1452:   }
        !          1453: 
        !          1454:   sqlite3_mutex_enter(db->mutex);
        !          1455:   if( zDb && zDb[0] ){
        !          1456:     iDb = sqlite3FindDbName(db, zDb);
        !          1457:   }
        !          1458:   if( iDb<0 ){
        !          1459:     rc = SQLITE_ERROR;
        !          1460:     sqlite3Error(db, SQLITE_ERROR, "unknown database: %s", zDb);
        !          1461:   }else{
        !          1462:     rc = sqlite3Checkpoint(db, iDb, eMode, pnLog, pnCkpt);
        !          1463:     sqlite3Error(db, rc, 0);
        !          1464:   }
        !          1465:   rc = sqlite3ApiExit(db, rc);
        !          1466:   sqlite3_mutex_leave(db->mutex);
        !          1467:   return rc;
        !          1468: #endif
        !          1469: }
        !          1470: 
        !          1471: 
        !          1472: /*
        !          1473: ** Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points
        !          1474: ** to contains a zero-length string, all attached databases are 
        !          1475: ** checkpointed.
        !          1476: */
        !          1477: int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){
        !          1478:   return sqlite3_wal_checkpoint_v2(db, zDb, SQLITE_CHECKPOINT_PASSIVE, 0, 0);
        !          1479: }
        !          1480: 
        !          1481: #ifndef SQLITE_OMIT_WAL
        !          1482: /*
        !          1483: ** Run a checkpoint on database iDb. This is a no-op if database iDb is
        !          1484: ** not currently open in WAL mode.
        !          1485: **
        !          1486: ** If a transaction is open on the database being checkpointed, this 
        !          1487: ** function returns SQLITE_LOCKED and a checkpoint is not attempted. If 
        !          1488: ** an error occurs while running the checkpoint, an SQLite error code is 
        !          1489: ** returned (i.e. SQLITE_IOERR). Otherwise, SQLITE_OK.
        !          1490: **
        !          1491: ** The mutex on database handle db should be held by the caller. The mutex
        !          1492: ** associated with the specific b-tree being checkpointed is taken by
        !          1493: ** this function while the checkpoint is running.
        !          1494: **
        !          1495: ** If iDb is passed SQLITE_MAX_ATTACHED, then all attached databases are
        !          1496: ** checkpointed. If an error is encountered it is returned immediately -
        !          1497: ** no attempt is made to checkpoint any remaining databases.
        !          1498: **
        !          1499: ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART.
        !          1500: */
        !          1501: int sqlite3Checkpoint(sqlite3 *db, int iDb, int eMode, int *pnLog, int *pnCkpt){
        !          1502:   int rc = SQLITE_OK;             /* Return code */
        !          1503:   int i;                          /* Used to iterate through attached dbs */
        !          1504:   int bBusy = 0;                  /* True if SQLITE_BUSY has been encountered */
        !          1505: 
        !          1506:   assert( sqlite3_mutex_held(db->mutex) );
        !          1507:   assert( !pnLog || *pnLog==-1 );
        !          1508:   assert( !pnCkpt || *pnCkpt==-1 );
        !          1509: 
        !          1510:   for(i=0; i<db->nDb && rc==SQLITE_OK; i++){
        !          1511:     if( i==iDb || iDb==SQLITE_MAX_ATTACHED ){
        !          1512:       rc = sqlite3BtreeCheckpoint(db->aDb[i].pBt, eMode, pnLog, pnCkpt);
        !          1513:       pnLog = 0;
        !          1514:       pnCkpt = 0;
        !          1515:       if( rc==SQLITE_BUSY ){
        !          1516:         bBusy = 1;
        !          1517:         rc = SQLITE_OK;
        !          1518:       }
        !          1519:     }
        !          1520:   }
        !          1521: 
        !          1522:   return (rc==SQLITE_OK && bBusy) ? SQLITE_BUSY : rc;
        !          1523: }
        !          1524: #endif /* SQLITE_OMIT_WAL */
        !          1525: 
        !          1526: /*
        !          1527: ** This function returns true if main-memory should be used instead of
        !          1528: ** a temporary file for transient pager files and statement journals.
        !          1529: ** The value returned depends on the value of db->temp_store (runtime
        !          1530: ** parameter) and the compile time value of SQLITE_TEMP_STORE. The
        !          1531: ** following table describes the relationship between these two values
        !          1532: ** and this functions return value.
        !          1533: **
        !          1534: **   SQLITE_TEMP_STORE     db->temp_store     Location of temporary database
        !          1535: **   -----------------     --------------     ------------------------------
        !          1536: **   0                     any                file      (return 0)
        !          1537: **   1                     1                  file      (return 0)
        !          1538: **   1                     2                  memory    (return 1)
        !          1539: **   1                     0                  file      (return 0)
        !          1540: **   2                     1                  file      (return 0)
        !          1541: **   2                     2                  memory    (return 1)
        !          1542: **   2                     0                  memory    (return 1)
        !          1543: **   3                     any                memory    (return 1)
        !          1544: */
        !          1545: int sqlite3TempInMemory(const sqlite3 *db){
        !          1546: #if SQLITE_TEMP_STORE==1
        !          1547:   return ( db->temp_store==2 );
        !          1548: #endif
        !          1549: #if SQLITE_TEMP_STORE==2
        !          1550:   return ( db->temp_store!=1 );
        !          1551: #endif
        !          1552: #if SQLITE_TEMP_STORE==3
        !          1553:   return 1;
        !          1554: #endif
        !          1555: #if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3
        !          1556:   return 0;
        !          1557: #endif
        !          1558: }
        !          1559: 
        !          1560: /*
        !          1561: ** Return UTF-8 encoded English language explanation of the most recent
        !          1562: ** error.
        !          1563: */
        !          1564: const char *sqlite3_errmsg(sqlite3 *db){
        !          1565:   const char *z;
        !          1566:   if( !db ){
        !          1567:     return sqlite3ErrStr(SQLITE_NOMEM);
        !          1568:   }
        !          1569:   if( !sqlite3SafetyCheckSickOrOk(db) ){
        !          1570:     return sqlite3ErrStr(SQLITE_MISUSE_BKPT);
        !          1571:   }
        !          1572:   sqlite3_mutex_enter(db->mutex);
        !          1573:   if( db->mallocFailed ){
        !          1574:     z = sqlite3ErrStr(SQLITE_NOMEM);
        !          1575:   }else{
        !          1576:     z = (char*)sqlite3_value_text(db->pErr);
        !          1577:     assert( !db->mallocFailed );
        !          1578:     if( z==0 ){
        !          1579:       z = sqlite3ErrStr(db->errCode);
        !          1580:     }
        !          1581:   }
        !          1582:   sqlite3_mutex_leave(db->mutex);
        !          1583:   return z;
        !          1584: }
        !          1585: 
        !          1586: #ifndef SQLITE_OMIT_UTF16
        !          1587: /*
        !          1588: ** Return UTF-16 encoded English language explanation of the most recent
        !          1589: ** error.
        !          1590: */
        !          1591: const void *sqlite3_errmsg16(sqlite3 *db){
        !          1592:   static const u16 outOfMem[] = {
        !          1593:     'o', 'u', 't', ' ', 'o', 'f', ' ', 'm', 'e', 'm', 'o', 'r', 'y', 0
        !          1594:   };
        !          1595:   static const u16 misuse[] = {
        !          1596:     'l', 'i', 'b', 'r', 'a', 'r', 'y', ' ', 
        !          1597:     'r', 'o', 'u', 't', 'i', 'n', 'e', ' ', 
        !          1598:     'c', 'a', 'l', 'l', 'e', 'd', ' ', 
        !          1599:     'o', 'u', 't', ' ', 
        !          1600:     'o', 'f', ' ', 
        !          1601:     's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', 0
        !          1602:   };
        !          1603: 
        !          1604:   const void *z;
        !          1605:   if( !db ){
        !          1606:     return (void *)outOfMem;
        !          1607:   }
        !          1608:   if( !sqlite3SafetyCheckSickOrOk(db) ){
        !          1609:     return (void *)misuse;
        !          1610:   }
        !          1611:   sqlite3_mutex_enter(db->mutex);
        !          1612:   if( db->mallocFailed ){
        !          1613:     z = (void *)outOfMem;
        !          1614:   }else{
        !          1615:     z = sqlite3_value_text16(db->pErr);
        !          1616:     if( z==0 ){
        !          1617:       sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode),
        !          1618:            SQLITE_UTF8, SQLITE_STATIC);
        !          1619:       z = sqlite3_value_text16(db->pErr);
        !          1620:     }
        !          1621:     /* A malloc() may have failed within the call to sqlite3_value_text16()
        !          1622:     ** above. If this is the case, then the db->mallocFailed flag needs to
        !          1623:     ** be cleared before returning. Do this directly, instead of via
        !          1624:     ** sqlite3ApiExit(), to avoid setting the database handle error message.
        !          1625:     */
        !          1626:     db->mallocFailed = 0;
        !          1627:   }
        !          1628:   sqlite3_mutex_leave(db->mutex);
        !          1629:   return z;
        !          1630: }
        !          1631: #endif /* SQLITE_OMIT_UTF16 */
        !          1632: 
        !          1633: /*
        !          1634: ** Return the most recent error code generated by an SQLite routine. If NULL is
        !          1635: ** passed to this function, we assume a malloc() failed during sqlite3_open().
        !          1636: */
        !          1637: int sqlite3_errcode(sqlite3 *db){
        !          1638:   if( db && !sqlite3SafetyCheckSickOrOk(db) ){
        !          1639:     return SQLITE_MISUSE_BKPT;
        !          1640:   }
        !          1641:   if( !db || db->mallocFailed ){
        !          1642:     return SQLITE_NOMEM;
        !          1643:   }
        !          1644:   return db->errCode & db->errMask;
        !          1645: }
        !          1646: int sqlite3_extended_errcode(sqlite3 *db){
        !          1647:   if( db && !sqlite3SafetyCheckSickOrOk(db) ){
        !          1648:     return SQLITE_MISUSE_BKPT;
        !          1649:   }
        !          1650:   if( !db || db->mallocFailed ){
        !          1651:     return SQLITE_NOMEM;
        !          1652:   }
        !          1653:   return db->errCode;
        !          1654: }
        !          1655: 
        !          1656: /*
        !          1657: ** Create a new collating function for database "db".  The name is zName
        !          1658: ** and the encoding is enc.
        !          1659: */
        !          1660: static int createCollation(
        !          1661:   sqlite3* db,
        !          1662:   const char *zName, 
        !          1663:   u8 enc,
        !          1664:   void* pCtx,
        !          1665:   int(*xCompare)(void*,int,const void*,int,const void*),
        !          1666:   void(*xDel)(void*)
        !          1667: ){
        !          1668:   CollSeq *pColl;
        !          1669:   int enc2;
        !          1670:   int nName = sqlite3Strlen30(zName);
        !          1671:   
        !          1672:   assert( sqlite3_mutex_held(db->mutex) );
        !          1673: 
        !          1674:   /* If SQLITE_UTF16 is specified as the encoding type, transform this
        !          1675:   ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
        !          1676:   ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
        !          1677:   */
        !          1678:   enc2 = enc;
        !          1679:   testcase( enc2==SQLITE_UTF16 );
        !          1680:   testcase( enc2==SQLITE_UTF16_ALIGNED );
        !          1681:   if( enc2==SQLITE_UTF16 || enc2==SQLITE_UTF16_ALIGNED ){
        !          1682:     enc2 = SQLITE_UTF16NATIVE;
        !          1683:   }
        !          1684:   if( enc2<SQLITE_UTF8 || enc2>SQLITE_UTF16BE ){
        !          1685:     return SQLITE_MISUSE_BKPT;
        !          1686:   }
        !          1687: 
        !          1688:   /* Check if this call is removing or replacing an existing collation 
        !          1689:   ** sequence. If so, and there are active VMs, return busy. If there
        !          1690:   ** are no active VMs, invalidate any pre-compiled statements.
        !          1691:   */
        !          1692:   pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 0);
        !          1693:   if( pColl && pColl->xCmp ){
        !          1694:     if( db->activeVdbeCnt ){
        !          1695:       sqlite3Error(db, SQLITE_BUSY, 
        !          1696:         "unable to delete/modify collation sequence due to active statements");
        !          1697:       return SQLITE_BUSY;
        !          1698:     }
        !          1699:     sqlite3ExpirePreparedStatements(db);
        !          1700: 
        !          1701:     /* If collation sequence pColl was created directly by a call to
        !          1702:     ** sqlite3_create_collation, and not generated by synthCollSeq(),
        !          1703:     ** then any copies made by synthCollSeq() need to be invalidated.
        !          1704:     ** Also, collation destructor - CollSeq.xDel() - function may need
        !          1705:     ** to be called.
        !          1706:     */ 
        !          1707:     if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){
        !          1708:       CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, nName);
        !          1709:       int j;
        !          1710:       for(j=0; j<3; j++){
        !          1711:         CollSeq *p = &aColl[j];
        !          1712:         if( p->enc==pColl->enc ){
        !          1713:           if( p->xDel ){
        !          1714:             p->xDel(p->pUser);
        !          1715:           }
        !          1716:           p->xCmp = 0;
        !          1717:         }
        !          1718:       }
        !          1719:     }
        !          1720:   }
        !          1721: 
        !          1722:   pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1);
        !          1723:   if( pColl==0 ) return SQLITE_NOMEM;
        !          1724:   pColl->xCmp = xCompare;
        !          1725:   pColl->pUser = pCtx;
        !          1726:   pColl->xDel = xDel;
        !          1727:   pColl->enc = (u8)(enc2 | (enc & SQLITE_UTF16_ALIGNED));
        !          1728:   sqlite3Error(db, SQLITE_OK, 0);
        !          1729:   return SQLITE_OK;
        !          1730: }
        !          1731: 
        !          1732: 
        !          1733: /*
        !          1734: ** This array defines hard upper bounds on limit values.  The
        !          1735: ** initializer must be kept in sync with the SQLITE_LIMIT_*
        !          1736: ** #defines in sqlite3.h.
        !          1737: */
        !          1738: static const int aHardLimit[] = {
        !          1739:   SQLITE_MAX_LENGTH,
        !          1740:   SQLITE_MAX_SQL_LENGTH,
        !          1741:   SQLITE_MAX_COLUMN,
        !          1742:   SQLITE_MAX_EXPR_DEPTH,
        !          1743:   SQLITE_MAX_COMPOUND_SELECT,
        !          1744:   SQLITE_MAX_VDBE_OP,
        !          1745:   SQLITE_MAX_FUNCTION_ARG,
        !          1746:   SQLITE_MAX_ATTACHED,
        !          1747:   SQLITE_MAX_LIKE_PATTERN_LENGTH,
        !          1748:   SQLITE_MAX_VARIABLE_NUMBER,
        !          1749:   SQLITE_MAX_TRIGGER_DEPTH,
        !          1750: };
        !          1751: 
        !          1752: /*
        !          1753: ** Make sure the hard limits are set to reasonable values
        !          1754: */
        !          1755: #if SQLITE_MAX_LENGTH<100
        !          1756: # error SQLITE_MAX_LENGTH must be at least 100
        !          1757: #endif
        !          1758: #if SQLITE_MAX_SQL_LENGTH<100
        !          1759: # error SQLITE_MAX_SQL_LENGTH must be at least 100
        !          1760: #endif
        !          1761: #if SQLITE_MAX_SQL_LENGTH>SQLITE_MAX_LENGTH
        !          1762: # error SQLITE_MAX_SQL_LENGTH must not be greater than SQLITE_MAX_LENGTH
        !          1763: #endif
        !          1764: #if SQLITE_MAX_COMPOUND_SELECT<2
        !          1765: # error SQLITE_MAX_COMPOUND_SELECT must be at least 2
        !          1766: #endif
        !          1767: #if SQLITE_MAX_VDBE_OP<40
        !          1768: # error SQLITE_MAX_VDBE_OP must be at least 40
        !          1769: #endif
        !          1770: #if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>1000
        !          1771: # error SQLITE_MAX_FUNCTION_ARG must be between 0 and 1000
        !          1772: #endif
        !          1773: #if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>62
        !          1774: # error SQLITE_MAX_ATTACHED must be between 0 and 62
        !          1775: #endif
        !          1776: #if SQLITE_MAX_LIKE_PATTERN_LENGTH<1
        !          1777: # error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1
        !          1778: #endif
        !          1779: #if SQLITE_MAX_COLUMN>32767
        !          1780: # error SQLITE_MAX_COLUMN must not exceed 32767
        !          1781: #endif
        !          1782: #if SQLITE_MAX_TRIGGER_DEPTH<1
        !          1783: # error SQLITE_MAX_TRIGGER_DEPTH must be at least 1
        !          1784: #endif
        !          1785: 
        !          1786: 
        !          1787: /*
        !          1788: ** Change the value of a limit.  Report the old value.
        !          1789: ** If an invalid limit index is supplied, report -1.
        !          1790: ** Make no changes but still report the old value if the
        !          1791: ** new limit is negative.
        !          1792: **
        !          1793: ** A new lower limit does not shrink existing constructs.
        !          1794: ** It merely prevents new constructs that exceed the limit
        !          1795: ** from forming.
        !          1796: */
        !          1797: int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){
        !          1798:   int oldLimit;
        !          1799: 
        !          1800: 
        !          1801:   /* EVIDENCE-OF: R-30189-54097 For each limit category SQLITE_LIMIT_NAME
        !          1802:   ** there is a hard upper bound set at compile-time by a C preprocessor
        !          1803:   ** macro called SQLITE_MAX_NAME. (The "_LIMIT_" in the name is changed to
        !          1804:   ** "_MAX_".)
        !          1805:   */
        !          1806:   assert( aHardLimit[SQLITE_LIMIT_LENGTH]==SQLITE_MAX_LENGTH );
        !          1807:   assert( aHardLimit[SQLITE_LIMIT_SQL_LENGTH]==SQLITE_MAX_SQL_LENGTH );
        !          1808:   assert( aHardLimit[SQLITE_LIMIT_COLUMN]==SQLITE_MAX_COLUMN );
        !          1809:   assert( aHardLimit[SQLITE_LIMIT_EXPR_DEPTH]==SQLITE_MAX_EXPR_DEPTH );
        !          1810:   assert( aHardLimit[SQLITE_LIMIT_COMPOUND_SELECT]==SQLITE_MAX_COMPOUND_SELECT);
        !          1811:   assert( aHardLimit[SQLITE_LIMIT_VDBE_OP]==SQLITE_MAX_VDBE_OP );
        !          1812:   assert( aHardLimit[SQLITE_LIMIT_FUNCTION_ARG]==SQLITE_MAX_FUNCTION_ARG );
        !          1813:   assert( aHardLimit[SQLITE_LIMIT_ATTACHED]==SQLITE_MAX_ATTACHED );
        !          1814:   assert( aHardLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]==
        !          1815:                                                SQLITE_MAX_LIKE_PATTERN_LENGTH );
        !          1816:   assert( aHardLimit[SQLITE_LIMIT_VARIABLE_NUMBER]==SQLITE_MAX_VARIABLE_NUMBER);
        !          1817:   assert( aHardLimit[SQLITE_LIMIT_TRIGGER_DEPTH]==SQLITE_MAX_TRIGGER_DEPTH );
        !          1818:   assert( SQLITE_LIMIT_TRIGGER_DEPTH==(SQLITE_N_LIMIT-1) );
        !          1819: 
        !          1820: 
        !          1821:   if( limitId<0 || limitId>=SQLITE_N_LIMIT ){
        !          1822:     return -1;
        !          1823:   }
        !          1824:   oldLimit = db->aLimit[limitId];
        !          1825:   if( newLimit>=0 ){                   /* IMP: R-52476-28732 */
        !          1826:     if( newLimit>aHardLimit[limitId] ){
        !          1827:       newLimit = aHardLimit[limitId];  /* IMP: R-51463-25634 */
        !          1828:     }
        !          1829:     db->aLimit[limitId] = newLimit;
        !          1830:   }
        !          1831:   return oldLimit;                     /* IMP: R-53341-35419 */
        !          1832: }
        !          1833: 
        !          1834: /*
        !          1835: ** This function is used to parse both URIs and non-URI filenames passed by the
        !          1836: ** user to API functions sqlite3_open() or sqlite3_open_v2(), and for database
        !          1837: ** URIs specified as part of ATTACH statements.
        !          1838: **
        !          1839: ** The first argument to this function is the name of the VFS to use (or
        !          1840: ** a NULL to signify the default VFS) if the URI does not contain a "vfs=xxx"
        !          1841: ** query parameter. The second argument contains the URI (or non-URI filename)
        !          1842: ** itself. When this function is called the *pFlags variable should contain
        !          1843: ** the default flags to open the database handle with. The value stored in
        !          1844: ** *pFlags may be updated before returning if the URI filename contains 
        !          1845: ** "cache=xxx" or "mode=xxx" query parameters.
        !          1846: **
        !          1847: ** If successful, SQLITE_OK is returned. In this case *ppVfs is set to point to
        !          1848: ** the VFS that should be used to open the database file. *pzFile is set to
        !          1849: ** point to a buffer containing the name of the file to open. It is the 
        !          1850: ** responsibility of the caller to eventually call sqlite3_free() to release
        !          1851: ** this buffer.
        !          1852: **
        !          1853: ** If an error occurs, then an SQLite error code is returned and *pzErrMsg
        !          1854: ** may be set to point to a buffer containing an English language error 
        !          1855: ** message. It is the responsibility of the caller to eventually release
        !          1856: ** this buffer by calling sqlite3_free().
        !          1857: */
        !          1858: int sqlite3ParseUri(
        !          1859:   const char *zDefaultVfs,        /* VFS to use if no "vfs=xxx" query option */
        !          1860:   const char *zUri,               /* Nul-terminated URI to parse */
        !          1861:   unsigned int *pFlags,           /* IN/OUT: SQLITE_OPEN_XXX flags */
        !          1862:   sqlite3_vfs **ppVfs,            /* OUT: VFS to use */ 
        !          1863:   char **pzFile,                  /* OUT: Filename component of URI */
        !          1864:   char **pzErrMsg                 /* OUT: Error message (if rc!=SQLITE_OK) */
        !          1865: ){
        !          1866:   int rc = SQLITE_OK;
        !          1867:   unsigned int flags = *pFlags;
        !          1868:   const char *zVfs = zDefaultVfs;
        !          1869:   char *zFile;
        !          1870:   char c;
        !          1871:   int nUri = sqlite3Strlen30(zUri);
        !          1872: 
        !          1873:   assert( *pzErrMsg==0 );
        !          1874: 
        !          1875:   if( ((flags & SQLITE_OPEN_URI) || sqlite3GlobalConfig.bOpenUri) 
        !          1876:    && nUri>=5 && memcmp(zUri, "file:", 5)==0 
        !          1877:   ){
        !          1878:     char *zOpt;
        !          1879:     int eState;                   /* Parser state when parsing URI */
        !          1880:     int iIn;                      /* Input character index */
        !          1881:     int iOut = 0;                 /* Output character index */
        !          1882:     int nByte = nUri+2;           /* Bytes of space to allocate */
        !          1883: 
        !          1884:     /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen 
        !          1885:     ** method that there may be extra parameters following the file-name.  */
        !          1886:     flags |= SQLITE_OPEN_URI;
        !          1887: 
        !          1888:     for(iIn=0; iIn<nUri; iIn++) nByte += (zUri[iIn]=='&');
        !          1889:     zFile = sqlite3_malloc(nByte);
        !          1890:     if( !zFile ) return SQLITE_NOMEM;
        !          1891: 
        !          1892:     /* Discard the scheme and authority segments of the URI. */
        !          1893:     if( zUri[5]=='/' && zUri[6]=='/' ){
        !          1894:       iIn = 7;
        !          1895:       while( zUri[iIn] && zUri[iIn]!='/' ) iIn++;
        !          1896: 
        !          1897:       if( iIn!=7 && (iIn!=16 || memcmp("localhost", &zUri[7], 9)) ){
        !          1898:         *pzErrMsg = sqlite3_mprintf("invalid uri authority: %.*s", 
        !          1899:             iIn-7, &zUri[7]);
        !          1900:         rc = SQLITE_ERROR;
        !          1901:         goto parse_uri_out;
        !          1902:       }
        !          1903:     }else{
        !          1904:       iIn = 5;
        !          1905:     }
        !          1906: 
        !          1907:     /* Copy the filename and any query parameters into the zFile buffer. 
        !          1908:     ** Decode %HH escape codes along the way. 
        !          1909:     **
        !          1910:     ** Within this loop, variable eState may be set to 0, 1 or 2, depending
        !          1911:     ** on the parsing context. As follows:
        !          1912:     **
        !          1913:     **   0: Parsing file-name.
        !          1914:     **   1: Parsing name section of a name=value query parameter.
        !          1915:     **   2: Parsing value section of a name=value query parameter.
        !          1916:     */
        !          1917:     eState = 0;
        !          1918:     while( (c = zUri[iIn])!=0 && c!='#' ){
        !          1919:       iIn++;
        !          1920:       if( c=='%' 
        !          1921:        && sqlite3Isxdigit(zUri[iIn]) 
        !          1922:        && sqlite3Isxdigit(zUri[iIn+1]) 
        !          1923:       ){
        !          1924:         int octet = (sqlite3HexToInt(zUri[iIn++]) << 4);
        !          1925:         octet += sqlite3HexToInt(zUri[iIn++]);
        !          1926: 
        !          1927:         assert( octet>=0 && octet<256 );
        !          1928:         if( octet==0 ){
        !          1929:           /* This branch is taken when "%00" appears within the URI. In this
        !          1930:           ** case we ignore all text in the remainder of the path, name or
        !          1931:           ** value currently being parsed. So ignore the current character
        !          1932:           ** and skip to the next "?", "=" or "&", as appropriate. */
        !          1933:           while( (c = zUri[iIn])!=0 && c!='#' 
        !          1934:               && (eState!=0 || c!='?')
        !          1935:               && (eState!=1 || (c!='=' && c!='&'))
        !          1936:               && (eState!=2 || c!='&')
        !          1937:           ){
        !          1938:             iIn++;
        !          1939:           }
        !          1940:           continue;
        !          1941:         }
        !          1942:         c = octet;
        !          1943:       }else if( eState==1 && (c=='&' || c=='=') ){
        !          1944:         if( zFile[iOut-1]==0 ){
        !          1945:           /* An empty option name. Ignore this option altogether. */
        !          1946:           while( zUri[iIn] && zUri[iIn]!='#' && zUri[iIn-1]!='&' ) iIn++;
        !          1947:           continue;
        !          1948:         }
        !          1949:         if( c=='&' ){
        !          1950:           zFile[iOut++] = '\0';
        !          1951:         }else{
        !          1952:           eState = 2;
        !          1953:         }
        !          1954:         c = 0;
        !          1955:       }else if( (eState==0 && c=='?') || (eState==2 && c=='&') ){
        !          1956:         c = 0;
        !          1957:         eState = 1;
        !          1958:       }
        !          1959:       zFile[iOut++] = c;
        !          1960:     }
        !          1961:     if( eState==1 ) zFile[iOut++] = '\0';
        !          1962:     zFile[iOut++] = '\0';
        !          1963:     zFile[iOut++] = '\0';
        !          1964: 
        !          1965:     /* Check if there were any options specified that should be interpreted 
        !          1966:     ** here. Options that are interpreted here include "vfs" and those that
        !          1967:     ** correspond to flags that may be passed to the sqlite3_open_v2()
        !          1968:     ** method. */
        !          1969:     zOpt = &zFile[sqlite3Strlen30(zFile)+1];
        !          1970:     while( zOpt[0] ){
        !          1971:       int nOpt = sqlite3Strlen30(zOpt);
        !          1972:       char *zVal = &zOpt[nOpt+1];
        !          1973:       int nVal = sqlite3Strlen30(zVal);
        !          1974: 
        !          1975:       if( nOpt==3 && memcmp("vfs", zOpt, 3)==0 ){
        !          1976:         zVfs = zVal;
        !          1977:       }else{
        !          1978:         struct OpenMode {
        !          1979:           const char *z;
        !          1980:           int mode;
        !          1981:         } *aMode = 0;
        !          1982:         char *zModeType = 0;
        !          1983:         int mask = 0;
        !          1984:         int limit = 0;
        !          1985: 
        !          1986:         if( nOpt==5 && memcmp("cache", zOpt, 5)==0 ){
        !          1987:           static struct OpenMode aCacheMode[] = {
        !          1988:             { "shared",  SQLITE_OPEN_SHAREDCACHE },
        !          1989:             { "private", SQLITE_OPEN_PRIVATECACHE },
        !          1990:             { 0, 0 }
        !          1991:           };
        !          1992: 
        !          1993:           mask = SQLITE_OPEN_SHAREDCACHE|SQLITE_OPEN_PRIVATECACHE;
        !          1994:           aMode = aCacheMode;
        !          1995:           limit = mask;
        !          1996:           zModeType = "cache";
        !          1997:         }
        !          1998:         if( nOpt==4 && memcmp("mode", zOpt, 4)==0 ){
        !          1999:           static struct OpenMode aOpenMode[] = {
        !          2000:             { "ro",  SQLITE_OPEN_READONLY },
        !          2001:             { "rw",  SQLITE_OPEN_READWRITE }, 
        !          2002:             { "rwc", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE },
        !          2003:             { 0, 0 }
        !          2004:           };
        !          2005: 
        !          2006:           mask = SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE;
        !          2007:           aMode = aOpenMode;
        !          2008:           limit = mask & flags;
        !          2009:           zModeType = "access";
        !          2010:         }
        !          2011: 
        !          2012:         if( aMode ){
        !          2013:           int i;
        !          2014:           int mode = 0;
        !          2015:           for(i=0; aMode[i].z; i++){
        !          2016:             const char *z = aMode[i].z;
        !          2017:             if( nVal==sqlite3Strlen30(z) && 0==memcmp(zVal, z, nVal) ){
        !          2018:               mode = aMode[i].mode;
        !          2019:               break;
        !          2020:             }
        !          2021:           }
        !          2022:           if( mode==0 ){
        !          2023:             *pzErrMsg = sqlite3_mprintf("no such %s mode: %s", zModeType, zVal);
        !          2024:             rc = SQLITE_ERROR;
        !          2025:             goto parse_uri_out;
        !          2026:           }
        !          2027:           if( mode>limit ){
        !          2028:             *pzErrMsg = sqlite3_mprintf("%s mode not allowed: %s",
        !          2029:                                         zModeType, zVal);
        !          2030:             rc = SQLITE_PERM;
        !          2031:             goto parse_uri_out;
        !          2032:           }
        !          2033:           flags = (flags & ~mask) | mode;
        !          2034:         }
        !          2035:       }
        !          2036: 
        !          2037:       zOpt = &zVal[nVal+1];
        !          2038:     }
        !          2039: 
        !          2040:   }else{
        !          2041:     zFile = sqlite3_malloc(nUri+2);
        !          2042:     if( !zFile ) return SQLITE_NOMEM;
        !          2043:     memcpy(zFile, zUri, nUri);
        !          2044:     zFile[nUri] = '\0';
        !          2045:     zFile[nUri+1] = '\0';
        !          2046:   }
        !          2047: 
        !          2048:   *ppVfs = sqlite3_vfs_find(zVfs);
        !          2049:   if( *ppVfs==0 ){
        !          2050:     *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs);
        !          2051:     rc = SQLITE_ERROR;
        !          2052:   }
        !          2053:  parse_uri_out:
        !          2054:   if( rc!=SQLITE_OK ){
        !          2055:     sqlite3_free(zFile);
        !          2056:     zFile = 0;
        !          2057:   }
        !          2058:   *pFlags = flags;
        !          2059:   *pzFile = zFile;
        !          2060:   return rc;
        !          2061: }
        !          2062: 
        !          2063: 
        !          2064: /*
        !          2065: ** This routine does the work of opening a database on behalf of
        !          2066: ** sqlite3_open() and sqlite3_open16(). The database filename "zFilename"  
        !          2067: ** is UTF-8 encoded.
        !          2068: */
        !          2069: static int openDatabase(
        !          2070:   const char *zFilename, /* Database filename UTF-8 encoded */
        !          2071:   sqlite3 **ppDb,        /* OUT: Returned database handle */
        !          2072:   unsigned int flags,    /* Operational flags */
        !          2073:   const char *zVfs       /* Name of the VFS to use */
        !          2074: ){
        !          2075:   sqlite3 *db;                    /* Store allocated handle here */
        !          2076:   int rc;                         /* Return code */
        !          2077:   int isThreadsafe;               /* True for threadsafe connections */
        !          2078:   char *zOpen = 0;                /* Filename argument to pass to BtreeOpen() */
        !          2079:   char *zErrMsg = 0;              /* Error message from sqlite3ParseUri() */
        !          2080: 
        !          2081:   *ppDb = 0;
        !          2082: #ifndef SQLITE_OMIT_AUTOINIT
        !          2083:   rc = sqlite3_initialize();
        !          2084:   if( rc ) return rc;
        !          2085: #endif
        !          2086: 
        !          2087:   /* Only allow sensible combinations of bits in the flags argument.  
        !          2088:   ** Throw an error if any non-sense combination is used.  If we
        !          2089:   ** do not block illegal combinations here, it could trigger
        !          2090:   ** assert() statements in deeper layers.  Sensible combinations
        !          2091:   ** are:
        !          2092:   **
        !          2093:   **  1:  SQLITE_OPEN_READONLY
        !          2094:   **  2:  SQLITE_OPEN_READWRITE
        !          2095:   **  6:  SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
        !          2096:   */
        !          2097:   assert( SQLITE_OPEN_READONLY  == 0x01 );
        !          2098:   assert( SQLITE_OPEN_READWRITE == 0x02 );
        !          2099:   assert( SQLITE_OPEN_CREATE    == 0x04 );
        !          2100:   testcase( (1<<(flags&7))==0x02 ); /* READONLY */
        !          2101:   testcase( (1<<(flags&7))==0x04 ); /* READWRITE */
        !          2102:   testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */
        !          2103:   if( ((1<<(flags&7)) & 0x46)==0 ) return SQLITE_MISUSE_BKPT;
        !          2104: 
        !          2105:   if( sqlite3GlobalConfig.bCoreMutex==0 ){
        !          2106:     isThreadsafe = 0;
        !          2107:   }else if( flags & SQLITE_OPEN_NOMUTEX ){
        !          2108:     isThreadsafe = 0;
        !          2109:   }else if( flags & SQLITE_OPEN_FULLMUTEX ){
        !          2110:     isThreadsafe = 1;
        !          2111:   }else{
        !          2112:     isThreadsafe = sqlite3GlobalConfig.bFullMutex;
        !          2113:   }
        !          2114:   if( flags & SQLITE_OPEN_PRIVATECACHE ){
        !          2115:     flags &= ~SQLITE_OPEN_SHAREDCACHE;
        !          2116:   }else if( sqlite3GlobalConfig.sharedCacheEnabled ){
        !          2117:     flags |= SQLITE_OPEN_SHAREDCACHE;
        !          2118:   }
        !          2119: 
        !          2120:   /* Remove harmful bits from the flags parameter
        !          2121:   **
        !          2122:   ** The SQLITE_OPEN_NOMUTEX and SQLITE_OPEN_FULLMUTEX flags were
        !          2123:   ** dealt with in the previous code block.  Besides these, the only
        !          2124:   ** valid input flags for sqlite3_open_v2() are SQLITE_OPEN_READONLY,
        !          2125:   ** SQLITE_OPEN_READWRITE, SQLITE_OPEN_CREATE, SQLITE_OPEN_SHAREDCACHE,
        !          2126:   ** SQLITE_OPEN_PRIVATECACHE, and some reserved bits.  Silently mask
        !          2127:   ** off all other flags.
        !          2128:   */
        !          2129:   flags &=  ~( SQLITE_OPEN_DELETEONCLOSE |
        !          2130:                SQLITE_OPEN_EXCLUSIVE |
        !          2131:                SQLITE_OPEN_MAIN_DB |
        !          2132:                SQLITE_OPEN_TEMP_DB | 
        !          2133:                SQLITE_OPEN_TRANSIENT_DB | 
        !          2134:                SQLITE_OPEN_MAIN_JOURNAL | 
        !          2135:                SQLITE_OPEN_TEMP_JOURNAL | 
        !          2136:                SQLITE_OPEN_SUBJOURNAL | 
        !          2137:                SQLITE_OPEN_MASTER_JOURNAL |
        !          2138:                SQLITE_OPEN_NOMUTEX |
        !          2139:                SQLITE_OPEN_FULLMUTEX |
        !          2140:                SQLITE_OPEN_WAL
        !          2141:              );
        !          2142: 
        !          2143:   /* Allocate the sqlite data structure */
        !          2144:   db = sqlite3MallocZero( sizeof(sqlite3) );
        !          2145:   if( db==0 ) goto opendb_out;
        !          2146:   if( isThreadsafe ){
        !          2147:     db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
        !          2148:     if( db->mutex==0 ){
        !          2149:       sqlite3_free(db);
        !          2150:       db = 0;
        !          2151:       goto opendb_out;
        !          2152:     }
        !          2153:   }
        !          2154:   sqlite3_mutex_enter(db->mutex);
        !          2155:   db->errMask = 0xff;
        !          2156:   db->nDb = 2;
        !          2157:   db->magic = SQLITE_MAGIC_BUSY;
        !          2158:   db->aDb = db->aDbStatic;
        !          2159: 
        !          2160:   assert( sizeof(db->aLimit)==sizeof(aHardLimit) );
        !          2161:   memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit));
        !          2162:   db->autoCommit = 1;
        !          2163:   db->nextAutovac = -1;
        !          2164:   db->nextPagesize = 0;
        !          2165:   db->flags |= SQLITE_ShortColNames | SQLITE_AutoIndex | SQLITE_EnableTrigger
        !          2166: #if SQLITE_DEFAULT_FILE_FORMAT<4
        !          2167:                  | SQLITE_LegacyFileFmt
        !          2168: #endif
        !          2169: #ifdef SQLITE_ENABLE_LOAD_EXTENSION
        !          2170:                  | SQLITE_LoadExtension
        !          2171: #endif
        !          2172: #if SQLITE_DEFAULT_RECURSIVE_TRIGGERS
        !          2173:                  | SQLITE_RecTriggers
        !          2174: #endif
        !          2175: #if defined(SQLITE_DEFAULT_FOREIGN_KEYS) && SQLITE_DEFAULT_FOREIGN_KEYS
        !          2176:                  | SQLITE_ForeignKeys
        !          2177: #endif
        !          2178:       ;
        !          2179:   sqlite3HashInit(&db->aCollSeq);
        !          2180: #ifndef SQLITE_OMIT_VIRTUALTABLE
        !          2181:   sqlite3HashInit(&db->aModule);
        !          2182: #endif
        !          2183: 
        !          2184:   /* Add the default collation sequence BINARY. BINARY works for both UTF-8
        !          2185:   ** and UTF-16, so add a version for each to avoid any unnecessary
        !          2186:   ** conversions. The only error that can occur here is a malloc() failure.
        !          2187:   */
        !          2188:   createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0);
        !          2189:   createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0);
        !          2190:   createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0);
        !          2191:   createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0);
        !          2192:   if( db->mallocFailed ){
        !          2193:     goto opendb_out;
        !          2194:   }
        !          2195:   db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 0);
        !          2196:   assert( db->pDfltColl!=0 );
        !          2197: 
        !          2198:   /* Also add a UTF-8 case-insensitive collation sequence. */
        !          2199:   createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0);
        !          2200: 
        !          2201:   /* Parse the filename/URI argument. */
        !          2202:   db->openFlags = flags;
        !          2203:   rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg);
        !          2204:   if( rc!=SQLITE_OK ){
        !          2205:     if( rc==SQLITE_NOMEM ) db->mallocFailed = 1;
        !          2206:     sqlite3Error(db, rc, zErrMsg ? "%s" : 0, zErrMsg);
        !          2207:     sqlite3_free(zErrMsg);
        !          2208:     goto opendb_out;
        !          2209:   }
        !          2210: 
        !          2211:   /* Open the backend database driver */
        !          2212:   rc = sqlite3BtreeOpen(db->pVfs, zOpen, db, &db->aDb[0].pBt, 0,
        !          2213:                         flags | SQLITE_OPEN_MAIN_DB);
        !          2214:   if( rc!=SQLITE_OK ){
        !          2215:     if( rc==SQLITE_IOERR_NOMEM ){
        !          2216:       rc = SQLITE_NOMEM;
        !          2217:     }
        !          2218:     sqlite3Error(db, rc, 0);
        !          2219:     goto opendb_out;
        !          2220:   }
        !          2221:   db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt);
        !          2222:   db->aDb[1].pSchema = sqlite3SchemaGet(db, 0);
        !          2223: 
        !          2224: 
        !          2225:   /* The default safety_level for the main database is 'full'; for the temp
        !          2226:   ** database it is 'NONE'. This matches the pager layer defaults.  
        !          2227:   */
        !          2228:   db->aDb[0].zName = "main";
        !          2229:   db->aDb[0].safety_level = 3;
        !          2230:   db->aDb[1].zName = "temp";
        !          2231:   db->aDb[1].safety_level = 1;
        !          2232: 
        !          2233:   db->magic = SQLITE_MAGIC_OPEN;
        !          2234:   if( db->mallocFailed ){
        !          2235:     goto opendb_out;
        !          2236:   }
        !          2237: 
        !          2238:   /* Register all built-in functions, but do not attempt to read the
        !          2239:   ** database schema yet. This is delayed until the first time the database
        !          2240:   ** is accessed.
        !          2241:   */
        !          2242:   sqlite3Error(db, SQLITE_OK, 0);
        !          2243:   sqlite3RegisterBuiltinFunctions(db);
        !          2244: 
        !          2245:   /* Load automatic extensions - extensions that have been registered
        !          2246:   ** using the sqlite3_automatic_extension() API.
        !          2247:   */
        !          2248:   rc = sqlite3_errcode(db);
        !          2249:   if( rc==SQLITE_OK ){
        !          2250:     sqlite3AutoLoadExtensions(db);
        !          2251:     rc = sqlite3_errcode(db);
        !          2252:     if( rc!=SQLITE_OK ){
        !          2253:       goto opendb_out;
        !          2254:     }
        !          2255:   }
        !          2256: 
        !          2257: #ifdef SQLITE_ENABLE_FTS1
        !          2258:   if( !db->mallocFailed ){
        !          2259:     extern int sqlite3Fts1Init(sqlite3*);
        !          2260:     rc = sqlite3Fts1Init(db);
        !          2261:   }
        !          2262: #endif
        !          2263: 
        !          2264: #ifdef SQLITE_ENABLE_FTS2
        !          2265:   if( !db->mallocFailed && rc==SQLITE_OK ){
        !          2266:     extern int sqlite3Fts2Init(sqlite3*);
        !          2267:     rc = sqlite3Fts2Init(db);
        !          2268:   }
        !          2269: #endif
        !          2270: 
        !          2271: #ifdef SQLITE_ENABLE_FTS3
        !          2272:   if( !db->mallocFailed && rc==SQLITE_OK ){
        !          2273:     rc = sqlite3Fts3Init(db);
        !          2274:   }
        !          2275: #endif
        !          2276: 
        !          2277: #ifdef SQLITE_ENABLE_ICU
        !          2278:   if( !db->mallocFailed && rc==SQLITE_OK ){
        !          2279:     rc = sqlite3IcuInit(db);
        !          2280:   }
        !          2281: #endif
        !          2282: 
        !          2283: #ifdef SQLITE_ENABLE_RTREE
        !          2284:   if( !db->mallocFailed && rc==SQLITE_OK){
        !          2285:     rc = sqlite3RtreeInit(db);
        !          2286:   }
        !          2287: #endif
        !          2288: 
        !          2289:   sqlite3Error(db, rc, 0);
        !          2290: 
        !          2291:   /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking
        !          2292:   ** mode.  -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking
        !          2293:   ** mode.  Doing nothing at all also makes NORMAL the default.
        !          2294:   */
        !          2295: #ifdef SQLITE_DEFAULT_LOCKING_MODE
        !          2296:   db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE;
        !          2297:   sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt),
        !          2298:                           SQLITE_DEFAULT_LOCKING_MODE);
        !          2299: #endif
        !          2300: 
        !          2301:   /* Enable the lookaside-malloc subsystem */
        !          2302:   setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside,
        !          2303:                         sqlite3GlobalConfig.nLookaside);
        !          2304: 
        !          2305:   sqlite3_wal_autocheckpoint(db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT);
        !          2306: 
        !          2307: opendb_out:
        !          2308:   sqlite3_free(zOpen);
        !          2309:   if( db ){
        !          2310:     assert( db->mutex!=0 || isThreadsafe==0 || sqlite3GlobalConfig.bFullMutex==0 );
        !          2311:     sqlite3_mutex_leave(db->mutex);
        !          2312:   }
        !          2313:   rc = sqlite3_errcode(db);
        !          2314:   assert( db!=0 || rc==SQLITE_NOMEM );
        !          2315:   if( rc==SQLITE_NOMEM ){
        !          2316:     sqlite3_close(db);
        !          2317:     db = 0;
        !          2318:   }else if( rc!=SQLITE_OK ){
        !          2319:     db->magic = SQLITE_MAGIC_SICK;
        !          2320:   }
        !          2321:   *ppDb = db;
        !          2322:   return sqlite3ApiExit(0, rc);
        !          2323: }
        !          2324: 
        !          2325: /*
        !          2326: ** Open a new database handle.
        !          2327: */
        !          2328: int sqlite3_open(
        !          2329:   const char *zFilename, 
        !          2330:   sqlite3 **ppDb 
        !          2331: ){
        !          2332:   return openDatabase(zFilename, ppDb,
        !          2333:                       SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
        !          2334: }
        !          2335: int sqlite3_open_v2(
        !          2336:   const char *filename,   /* Database filename (UTF-8) */
        !          2337:   sqlite3 **ppDb,         /* OUT: SQLite db handle */
        !          2338:   int flags,              /* Flags */
        !          2339:   const char *zVfs        /* Name of VFS module to use */
        !          2340: ){
        !          2341:   return openDatabase(filename, ppDb, (unsigned int)flags, zVfs);
        !          2342: }
        !          2343: 
        !          2344: #ifndef SQLITE_OMIT_UTF16
        !          2345: /*
        !          2346: ** Open a new database handle.
        !          2347: */
        !          2348: int sqlite3_open16(
        !          2349:   const void *zFilename, 
        !          2350:   sqlite3 **ppDb
        !          2351: ){
        !          2352:   char const *zFilename8;   /* zFilename encoded in UTF-8 instead of UTF-16 */
        !          2353:   sqlite3_value *pVal;
        !          2354:   int rc;
        !          2355: 
        !          2356:   assert( zFilename );
        !          2357:   assert( ppDb );
        !          2358:   *ppDb = 0;
        !          2359: #ifndef SQLITE_OMIT_AUTOINIT
        !          2360:   rc = sqlite3_initialize();
        !          2361:   if( rc ) return rc;
        !          2362: #endif
        !          2363:   pVal = sqlite3ValueNew(0);
        !          2364:   sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC);
        !          2365:   zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8);
        !          2366:   if( zFilename8 ){
        !          2367:     rc = openDatabase(zFilename8, ppDb,
        !          2368:                       SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
        !          2369:     assert( *ppDb || rc==SQLITE_NOMEM );
        !          2370:     if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){
        !          2371:       ENC(*ppDb) = SQLITE_UTF16NATIVE;
        !          2372:     }
        !          2373:   }else{
        !          2374:     rc = SQLITE_NOMEM;
        !          2375:   }
        !          2376:   sqlite3ValueFree(pVal);
        !          2377: 
        !          2378:   return sqlite3ApiExit(0, rc);
        !          2379: }
        !          2380: #endif /* SQLITE_OMIT_UTF16 */
        !          2381: 
        !          2382: /*
        !          2383: ** Register a new collation sequence with the database handle db.
        !          2384: */
        !          2385: int sqlite3_create_collation(
        !          2386:   sqlite3* db, 
        !          2387:   const char *zName, 
        !          2388:   int enc, 
        !          2389:   void* pCtx,
        !          2390:   int(*xCompare)(void*,int,const void*,int,const void*)
        !          2391: ){
        !          2392:   int rc;
        !          2393:   sqlite3_mutex_enter(db->mutex);
        !          2394:   assert( !db->mallocFailed );
        !          2395:   rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, 0);
        !          2396:   rc = sqlite3ApiExit(db, rc);
        !          2397:   sqlite3_mutex_leave(db->mutex);
        !          2398:   return rc;
        !          2399: }
        !          2400: 
        !          2401: /*
        !          2402: ** Register a new collation sequence with the database handle db.
        !          2403: */
        !          2404: int sqlite3_create_collation_v2(
        !          2405:   sqlite3* db, 
        !          2406:   const char *zName, 
        !          2407:   int enc, 
        !          2408:   void* pCtx,
        !          2409:   int(*xCompare)(void*,int,const void*,int,const void*),
        !          2410:   void(*xDel)(void*)
        !          2411: ){
        !          2412:   int rc;
        !          2413:   sqlite3_mutex_enter(db->mutex);
        !          2414:   assert( !db->mallocFailed );
        !          2415:   rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, xDel);
        !          2416:   rc = sqlite3ApiExit(db, rc);
        !          2417:   sqlite3_mutex_leave(db->mutex);
        !          2418:   return rc;
        !          2419: }
        !          2420: 
        !          2421: #ifndef SQLITE_OMIT_UTF16
        !          2422: /*
        !          2423: ** Register a new collation sequence with the database handle db.
        !          2424: */
        !          2425: int sqlite3_create_collation16(
        !          2426:   sqlite3* db, 
        !          2427:   const void *zName,
        !          2428:   int enc, 
        !          2429:   void* pCtx,
        !          2430:   int(*xCompare)(void*,int,const void*,int,const void*)
        !          2431: ){
        !          2432:   int rc = SQLITE_OK;
        !          2433:   char *zName8;
        !          2434:   sqlite3_mutex_enter(db->mutex);
        !          2435:   assert( !db->mallocFailed );
        !          2436:   zName8 = sqlite3Utf16to8(db, zName, -1, SQLITE_UTF16NATIVE);
        !          2437:   if( zName8 ){
        !          2438:     rc = createCollation(db, zName8, (u8)enc, pCtx, xCompare, 0);
        !          2439:     sqlite3DbFree(db, zName8);
        !          2440:   }
        !          2441:   rc = sqlite3ApiExit(db, rc);
        !          2442:   sqlite3_mutex_leave(db->mutex);
        !          2443:   return rc;
        !          2444: }
        !          2445: #endif /* SQLITE_OMIT_UTF16 */
        !          2446: 
        !          2447: /*
        !          2448: ** Register a collation sequence factory callback with the database handle
        !          2449: ** db. Replace any previously installed collation sequence factory.
        !          2450: */
        !          2451: int sqlite3_collation_needed(
        !          2452:   sqlite3 *db, 
        !          2453:   void *pCollNeededArg, 
        !          2454:   void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*)
        !          2455: ){
        !          2456:   sqlite3_mutex_enter(db->mutex);
        !          2457:   db->xCollNeeded = xCollNeeded;
        !          2458:   db->xCollNeeded16 = 0;
        !          2459:   db->pCollNeededArg = pCollNeededArg;
        !          2460:   sqlite3_mutex_leave(db->mutex);
        !          2461:   return SQLITE_OK;
        !          2462: }
        !          2463: 
        !          2464: #ifndef SQLITE_OMIT_UTF16
        !          2465: /*
        !          2466: ** Register a collation sequence factory callback with the database handle
        !          2467: ** db. Replace any previously installed collation sequence factory.
        !          2468: */
        !          2469: int sqlite3_collation_needed16(
        !          2470:   sqlite3 *db, 
        !          2471:   void *pCollNeededArg, 
        !          2472:   void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*)
        !          2473: ){
        !          2474:   sqlite3_mutex_enter(db->mutex);
        !          2475:   db->xCollNeeded = 0;
        !          2476:   db->xCollNeeded16 = xCollNeeded16;
        !          2477:   db->pCollNeededArg = pCollNeededArg;
        !          2478:   sqlite3_mutex_leave(db->mutex);
        !          2479:   return SQLITE_OK;
        !          2480: }
        !          2481: #endif /* SQLITE_OMIT_UTF16 */
        !          2482: 
        !          2483: #ifndef SQLITE_OMIT_DEPRECATED
        !          2484: /*
        !          2485: ** This function is now an anachronism. It used to be used to recover from a
        !          2486: ** malloc() failure, but SQLite now does this automatically.
        !          2487: */
        !          2488: int sqlite3_global_recover(void){
        !          2489:   return SQLITE_OK;
        !          2490: }
        !          2491: #endif
        !          2492: 
        !          2493: /*
        !          2494: ** Test to see whether or not the database connection is in autocommit
        !          2495: ** mode.  Return TRUE if it is and FALSE if not.  Autocommit mode is on
        !          2496: ** by default.  Autocommit is disabled by a BEGIN statement and reenabled
        !          2497: ** by the next COMMIT or ROLLBACK.
        !          2498: **
        !          2499: ******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ******
        !          2500: */
        !          2501: int sqlite3_get_autocommit(sqlite3 *db){
        !          2502:   return db->autoCommit;
        !          2503: }
        !          2504: 
        !          2505: /*
        !          2506: ** The following routines are subtitutes for constants SQLITE_CORRUPT,
        !          2507: ** SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_IOERR and possibly other error
        !          2508: ** constants.  They server two purposes:
        !          2509: **
        !          2510: **   1.  Serve as a convenient place to set a breakpoint in a debugger
        !          2511: **       to detect when version error conditions occurs.
        !          2512: **
        !          2513: **   2.  Invoke sqlite3_log() to provide the source code location where
        !          2514: **       a low-level error is first detected.
        !          2515: */
        !          2516: int sqlite3CorruptError(int lineno){
        !          2517:   testcase( sqlite3GlobalConfig.xLog!=0 );
        !          2518:   sqlite3_log(SQLITE_CORRUPT,
        !          2519:               "database corruption at line %d of [%.10s]",
        !          2520:               lineno, 20+sqlite3_sourceid());
        !          2521:   return SQLITE_CORRUPT;
        !          2522: }
        !          2523: int sqlite3MisuseError(int lineno){
        !          2524:   testcase( sqlite3GlobalConfig.xLog!=0 );
        !          2525:   sqlite3_log(SQLITE_MISUSE, 
        !          2526:               "misuse at line %d of [%.10s]",
        !          2527:               lineno, 20+sqlite3_sourceid());
        !          2528:   return SQLITE_MISUSE;
        !          2529: }
        !          2530: int sqlite3CantopenError(int lineno){
        !          2531:   testcase( sqlite3GlobalConfig.xLog!=0 );
        !          2532:   sqlite3_log(SQLITE_CANTOPEN, 
        !          2533:               "cannot open file at line %d of [%.10s]",
        !          2534:               lineno, 20+sqlite3_sourceid());
        !          2535:   return SQLITE_CANTOPEN;
        !          2536: }
        !          2537: 
        !          2538: 
        !          2539: #ifndef SQLITE_OMIT_DEPRECATED
        !          2540: /*
        !          2541: ** This is a convenience routine that makes sure that all thread-specific
        !          2542: ** data for this thread has been deallocated.
        !          2543: **
        !          2544: ** SQLite no longer uses thread-specific data so this routine is now a
        !          2545: ** no-op.  It is retained for historical compatibility.
        !          2546: */
        !          2547: void sqlite3_thread_cleanup(void){
        !          2548: }
        !          2549: #endif
        !          2550: 
        !          2551: /*
        !          2552: ** Return meta information about a specific column of a database table.
        !          2553: ** See comment in sqlite3.h (sqlite.h.in) for details.
        !          2554: */
        !          2555: #ifdef SQLITE_ENABLE_COLUMN_METADATA
        !          2556: int sqlite3_table_column_metadata(
        !          2557:   sqlite3 *db,                /* Connection handle */
        !          2558:   const char *zDbName,        /* Database name or NULL */
        !          2559:   const char *zTableName,     /* Table name */
        !          2560:   const char *zColumnName,    /* Column name */
        !          2561:   char const **pzDataType,    /* OUTPUT: Declared data type */
        !          2562:   char const **pzCollSeq,     /* OUTPUT: Collation sequence name */
        !          2563:   int *pNotNull,              /* OUTPUT: True if NOT NULL constraint exists */
        !          2564:   int *pPrimaryKey,           /* OUTPUT: True if column part of PK */
        !          2565:   int *pAutoinc               /* OUTPUT: True if column is auto-increment */
        !          2566: ){
        !          2567:   int rc;
        !          2568:   char *zErrMsg = 0;
        !          2569:   Table *pTab = 0;
        !          2570:   Column *pCol = 0;
        !          2571:   int iCol;
        !          2572: 
        !          2573:   char const *zDataType = 0;
        !          2574:   char const *zCollSeq = 0;
        !          2575:   int notnull = 0;
        !          2576:   int primarykey = 0;
        !          2577:   int autoinc = 0;
        !          2578: 
        !          2579:   /* Ensure the database schema has been loaded */
        !          2580:   sqlite3_mutex_enter(db->mutex);
        !          2581:   sqlite3BtreeEnterAll(db);
        !          2582:   rc = sqlite3Init(db, &zErrMsg);
        !          2583:   if( SQLITE_OK!=rc ){
        !          2584:     goto error_out;
        !          2585:   }
        !          2586: 
        !          2587:   /* Locate the table in question */
        !          2588:   pTab = sqlite3FindTable(db, zTableName, zDbName);
        !          2589:   if( !pTab || pTab->pSelect ){
        !          2590:     pTab = 0;
        !          2591:     goto error_out;
        !          2592:   }
        !          2593: 
        !          2594:   /* Find the column for which info is requested */
        !          2595:   if( sqlite3IsRowid(zColumnName) ){
        !          2596:     iCol = pTab->iPKey;
        !          2597:     if( iCol>=0 ){
        !          2598:       pCol = &pTab->aCol[iCol];
        !          2599:     }
        !          2600:   }else{
        !          2601:     for(iCol=0; iCol<pTab->nCol; iCol++){
        !          2602:       pCol = &pTab->aCol[iCol];
        !          2603:       if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){
        !          2604:         break;
        !          2605:       }
        !          2606:     }
        !          2607:     if( iCol==pTab->nCol ){
        !          2608:       pTab = 0;
        !          2609:       goto error_out;
        !          2610:     }
        !          2611:   }
        !          2612: 
        !          2613:   /* The following block stores the meta information that will be returned
        !          2614:   ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey
        !          2615:   ** and autoinc. At this point there are two possibilities:
        !          2616:   ** 
        !          2617:   **     1. The specified column name was rowid", "oid" or "_rowid_" 
        !          2618:   **        and there is no explicitly declared IPK column. 
        !          2619:   **
        !          2620:   **     2. The table is not a view and the column name identified an 
        !          2621:   **        explicitly declared column. Copy meta information from *pCol.
        !          2622:   */ 
        !          2623:   if( pCol ){
        !          2624:     zDataType = pCol->zType;
        !          2625:     zCollSeq = pCol->zColl;
        !          2626:     notnull = pCol->notNull!=0;
        !          2627:     primarykey  = pCol->isPrimKey!=0;
        !          2628:     autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0;
        !          2629:   }else{
        !          2630:     zDataType = "INTEGER";
        !          2631:     primarykey = 1;
        !          2632:   }
        !          2633:   if( !zCollSeq ){
        !          2634:     zCollSeq = "BINARY";
        !          2635:   }
        !          2636: 
        !          2637: error_out:
        !          2638:   sqlite3BtreeLeaveAll(db);
        !          2639: 
        !          2640:   /* Whether the function call succeeded or failed, set the output parameters
        !          2641:   ** to whatever their local counterparts contain. If an error did occur,
        !          2642:   ** this has the effect of zeroing all output parameters.
        !          2643:   */
        !          2644:   if( pzDataType ) *pzDataType = zDataType;
        !          2645:   if( pzCollSeq ) *pzCollSeq = zCollSeq;
        !          2646:   if( pNotNull ) *pNotNull = notnull;
        !          2647:   if( pPrimaryKey ) *pPrimaryKey = primarykey;
        !          2648:   if( pAutoinc ) *pAutoinc = autoinc;
        !          2649: 
        !          2650:   if( SQLITE_OK==rc && !pTab ){
        !          2651:     sqlite3DbFree(db, zErrMsg);
        !          2652:     zErrMsg = sqlite3MPrintf(db, "no such table column: %s.%s", zTableName,
        !          2653:         zColumnName);
        !          2654:     rc = SQLITE_ERROR;
        !          2655:   }
        !          2656:   sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg);
        !          2657:   sqlite3DbFree(db, zErrMsg);
        !          2658:   rc = sqlite3ApiExit(db, rc);
        !          2659:   sqlite3_mutex_leave(db->mutex);
        !          2660:   return rc;
        !          2661: }
        !          2662: #endif
        !          2663: 
        !          2664: /*
        !          2665: ** Sleep for a little while.  Return the amount of time slept.
        !          2666: */
        !          2667: int sqlite3_sleep(int ms){
        !          2668:   sqlite3_vfs *pVfs;
        !          2669:   int rc;
        !          2670:   pVfs = sqlite3_vfs_find(0);
        !          2671:   if( pVfs==0 ) return 0;
        !          2672: 
        !          2673:   /* This function works in milliseconds, but the underlying OsSleep() 
        !          2674:   ** API uses microseconds. Hence the 1000's.
        !          2675:   */
        !          2676:   rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000);
        !          2677:   return rc;
        !          2678: }
        !          2679: 
        !          2680: /*
        !          2681: ** Enable or disable the extended result codes.
        !          2682: */
        !          2683: int sqlite3_extended_result_codes(sqlite3 *db, int onoff){
        !          2684:   sqlite3_mutex_enter(db->mutex);
        !          2685:   db->errMask = onoff ? 0xffffffff : 0xff;
        !          2686:   sqlite3_mutex_leave(db->mutex);
        !          2687:   return SQLITE_OK;
        !          2688: }
        !          2689: 
        !          2690: /*
        !          2691: ** Invoke the xFileControl method on a particular database.
        !          2692: */
        !          2693: int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){
        !          2694:   int rc = SQLITE_ERROR;
        !          2695:   int iDb;
        !          2696:   sqlite3_mutex_enter(db->mutex);
        !          2697:   if( zDbName==0 ){
        !          2698:     iDb = 0;
        !          2699:   }else{
        !          2700:     for(iDb=0; iDb<db->nDb; iDb++){
        !          2701:       if( strcmp(db->aDb[iDb].zName, zDbName)==0 ) break;
        !          2702:     }
        !          2703:   }
        !          2704:   if( iDb<db->nDb ){
        !          2705:     Btree *pBtree = db->aDb[iDb].pBt;
        !          2706:     if( pBtree ){
        !          2707:       Pager *pPager;
        !          2708:       sqlite3_file *fd;
        !          2709:       sqlite3BtreeEnter(pBtree);
        !          2710:       pPager = sqlite3BtreePager(pBtree);
        !          2711:       assert( pPager!=0 );
        !          2712:       fd = sqlite3PagerFile(pPager);
        !          2713:       assert( fd!=0 );
        !          2714:       if( op==SQLITE_FCNTL_FILE_POINTER ){
        !          2715:         *(sqlite3_file**)pArg = fd;
        !          2716:         rc = SQLITE_OK;
        !          2717:       }else if( fd->pMethods ){
        !          2718:         rc = sqlite3OsFileControl(fd, op, pArg);
        !          2719:       }else{
        !          2720:         rc = SQLITE_NOTFOUND;
        !          2721:       }
        !          2722:       sqlite3BtreeLeave(pBtree);
        !          2723:     }
        !          2724:   }
        !          2725:   sqlite3_mutex_leave(db->mutex);
        !          2726:   return rc;   
        !          2727: }
        !          2728: 
        !          2729: /*
        !          2730: ** Interface to the testing logic.
        !          2731: */
        !          2732: int sqlite3_test_control(int op, ...){
        !          2733:   int rc = 0;
        !          2734: #ifndef SQLITE_OMIT_BUILTIN_TEST
        !          2735:   va_list ap;
        !          2736:   va_start(ap, op);
        !          2737:   switch( op ){
        !          2738: 
        !          2739:     /*
        !          2740:     ** Save the current state of the PRNG.
        !          2741:     */
        !          2742:     case SQLITE_TESTCTRL_PRNG_SAVE: {
        !          2743:       sqlite3PrngSaveState();
        !          2744:       break;
        !          2745:     }
        !          2746: 
        !          2747:     /*
        !          2748:     ** Restore the state of the PRNG to the last state saved using
        !          2749:     ** PRNG_SAVE.  If PRNG_SAVE has never before been called, then
        !          2750:     ** this verb acts like PRNG_RESET.
        !          2751:     */
        !          2752:     case SQLITE_TESTCTRL_PRNG_RESTORE: {
        !          2753:       sqlite3PrngRestoreState();
        !          2754:       break;
        !          2755:     }
        !          2756: 
        !          2757:     /*
        !          2758:     ** Reset the PRNG back to its uninitialized state.  The next call
        !          2759:     ** to sqlite3_randomness() will reseed the PRNG using a single call
        !          2760:     ** to the xRandomness method of the default VFS.
        !          2761:     */
        !          2762:     case SQLITE_TESTCTRL_PRNG_RESET: {
        !          2763:       sqlite3PrngResetState();
        !          2764:       break;
        !          2765:     }
        !          2766: 
        !          2767:     /*
        !          2768:     **  sqlite3_test_control(BITVEC_TEST, size, program)
        !          2769:     **
        !          2770:     ** Run a test against a Bitvec object of size.  The program argument
        !          2771:     ** is an array of integers that defines the test.  Return -1 on a
        !          2772:     ** memory allocation error, 0 on success, or non-zero for an error.
        !          2773:     ** See the sqlite3BitvecBuiltinTest() for additional information.
        !          2774:     */
        !          2775:     case SQLITE_TESTCTRL_BITVEC_TEST: {
        !          2776:       int sz = va_arg(ap, int);
        !          2777:       int *aProg = va_arg(ap, int*);
        !          2778:       rc = sqlite3BitvecBuiltinTest(sz, aProg);
        !          2779:       break;
        !          2780:     }
        !          2781: 
        !          2782:     /*
        !          2783:     **  sqlite3_test_control(BENIGN_MALLOC_HOOKS, xBegin, xEnd)
        !          2784:     **
        !          2785:     ** Register hooks to call to indicate which malloc() failures 
        !          2786:     ** are benign.
        !          2787:     */
        !          2788:     case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: {
        !          2789:       typedef void (*void_function)(void);
        !          2790:       void_function xBenignBegin;
        !          2791:       void_function xBenignEnd;
        !          2792:       xBenignBegin = va_arg(ap, void_function);
        !          2793:       xBenignEnd = va_arg(ap, void_function);
        !          2794:       sqlite3BenignMallocHooks(xBenignBegin, xBenignEnd);
        !          2795:       break;
        !          2796:     }
        !          2797: 
        !          2798:     /*
        !          2799:     **  sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, unsigned int X)
        !          2800:     **
        !          2801:     ** Set the PENDING byte to the value in the argument, if X>0.
        !          2802:     ** Make no changes if X==0.  Return the value of the pending byte
        !          2803:     ** as it existing before this routine was called.
        !          2804:     **
        !          2805:     ** IMPORTANT:  Changing the PENDING byte from 0x40000000 results in
        !          2806:     ** an incompatible database file format.  Changing the PENDING byte
        !          2807:     ** while any database connection is open results in undefined and
        !          2808:     ** dileterious behavior.
        !          2809:     */
        !          2810:     case SQLITE_TESTCTRL_PENDING_BYTE: {
        !          2811:       rc = PENDING_BYTE;
        !          2812: #ifndef SQLITE_OMIT_WSD
        !          2813:       {
        !          2814:         unsigned int newVal = va_arg(ap, unsigned int);
        !          2815:         if( newVal ) sqlite3PendingByte = newVal;
        !          2816:       }
        !          2817: #endif
        !          2818:       break;
        !          2819:     }
        !          2820: 
        !          2821:     /*
        !          2822:     **  sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, int X)
        !          2823:     **
        !          2824:     ** This action provides a run-time test to see whether or not
        !          2825:     ** assert() was enabled at compile-time.  If X is true and assert()
        !          2826:     ** is enabled, then the return value is true.  If X is true and
        !          2827:     ** assert() is disabled, then the return value is zero.  If X is
        !          2828:     ** false and assert() is enabled, then the assertion fires and the
        !          2829:     ** process aborts.  If X is false and assert() is disabled, then the
        !          2830:     ** return value is zero.
        !          2831:     */
        !          2832:     case SQLITE_TESTCTRL_ASSERT: {
        !          2833:       volatile int x = 0;
        !          2834:       assert( (x = va_arg(ap,int))!=0 );
        !          2835:       rc = x;
        !          2836:       break;
        !          2837:     }
        !          2838: 
        !          2839: 
        !          2840:     /*
        !          2841:     **  sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, int X)
        !          2842:     **
        !          2843:     ** This action provides a run-time test to see how the ALWAYS and
        !          2844:     ** NEVER macros were defined at compile-time.
        !          2845:     **
        !          2846:     ** The return value is ALWAYS(X).  
        !          2847:     **
        !          2848:     ** The recommended test is X==2.  If the return value is 2, that means
        !          2849:     ** ALWAYS() and NEVER() are both no-op pass-through macros, which is the
        !          2850:     ** default setting.  If the return value is 1, then ALWAYS() is either
        !          2851:     ** hard-coded to true or else it asserts if its argument is false.
        !          2852:     ** The first behavior (hard-coded to true) is the case if
        !          2853:     ** SQLITE_TESTCTRL_ASSERT shows that assert() is disabled and the second
        !          2854:     ** behavior (assert if the argument to ALWAYS() is false) is the case if
        !          2855:     ** SQLITE_TESTCTRL_ASSERT shows that assert() is enabled.
        !          2856:     **
        !          2857:     ** The run-time test procedure might look something like this:
        !          2858:     **
        !          2859:     **    if( sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, 2)==2 ){
        !          2860:     **      // ALWAYS() and NEVER() are no-op pass-through macros
        !          2861:     **    }else if( sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, 1) ){
        !          2862:     **      // ALWAYS(x) asserts that x is true. NEVER(x) asserts x is false.
        !          2863:     **    }else{
        !          2864:     **      // ALWAYS(x) is a constant 1.  NEVER(x) is a constant 0.
        !          2865:     **    }
        !          2866:     */
        !          2867:     case SQLITE_TESTCTRL_ALWAYS: {
        !          2868:       int x = va_arg(ap,int);
        !          2869:       rc = ALWAYS(x);
        !          2870:       break;
        !          2871:     }
        !          2872: 
        !          2873:     /*   sqlite3_test_control(SQLITE_TESTCTRL_RESERVE, sqlite3 *db, int N)
        !          2874:     **
        !          2875:     ** Set the nReserve size to N for the main database on the database
        !          2876:     ** connection db.
        !          2877:     */
        !          2878:     case SQLITE_TESTCTRL_RESERVE: {
        !          2879:       sqlite3 *db = va_arg(ap, sqlite3*);
        !          2880:       int x = va_arg(ap,int);
        !          2881:       sqlite3_mutex_enter(db->mutex);
        !          2882:       sqlite3BtreeSetPageSize(db->aDb[0].pBt, 0, x, 0);
        !          2883:       sqlite3_mutex_leave(db->mutex);
        !          2884:       break;
        !          2885:     }
        !          2886: 
        !          2887:     /*  sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite3 *db, int N)
        !          2888:     **
        !          2889:     ** Enable or disable various optimizations for testing purposes.  The 
        !          2890:     ** argument N is a bitmask of optimizations to be disabled.  For normal
        !          2891:     ** operation N should be 0.  The idea is that a test program (like the
        !          2892:     ** SQL Logic Test or SLT test module) can run the same SQL multiple times
        !          2893:     ** with various optimizations disabled to verify that the same answer
        !          2894:     ** is obtained in every case.
        !          2895:     */
        !          2896:     case SQLITE_TESTCTRL_OPTIMIZATIONS: {
        !          2897:       sqlite3 *db = va_arg(ap, sqlite3*);
        !          2898:       int x = va_arg(ap,int);
        !          2899:       db->flags = (x & SQLITE_OptMask) | (db->flags & ~SQLITE_OptMask);
        !          2900:       break;
        !          2901:     }
        !          2902: 
        !          2903: #ifdef SQLITE_N_KEYWORD
        !          2904:     /* sqlite3_test_control(SQLITE_TESTCTRL_ISKEYWORD, const char *zWord)
        !          2905:     **
        !          2906:     ** If zWord is a keyword recognized by the parser, then return the
        !          2907:     ** number of keywords.  Or if zWord is not a keyword, return 0.
        !          2908:     ** 
        !          2909:     ** This test feature is only available in the amalgamation since
        !          2910:     ** the SQLITE_N_KEYWORD macro is not defined in this file if SQLite
        !          2911:     ** is built using separate source files.
        !          2912:     */
        !          2913:     case SQLITE_TESTCTRL_ISKEYWORD: {
        !          2914:       const char *zWord = va_arg(ap, const char*);
        !          2915:       int n = sqlite3Strlen30(zWord);
        !          2916:       rc = (sqlite3KeywordCode((u8*)zWord, n)!=TK_ID) ? SQLITE_N_KEYWORD : 0;
        !          2917:       break;
        !          2918:     }
        !          2919: #endif 
        !          2920: 
        !          2921:     /* sqlite3_test_control(SQLITE_TESTCTRL_SCRATCHMALLOC, sz, &pNew, pFree);
        !          2922:     **
        !          2923:     ** Pass pFree into sqlite3ScratchFree(). 
        !          2924:     ** If sz>0 then allocate a scratch buffer into pNew.  
        !          2925:     */
        !          2926:     case SQLITE_TESTCTRL_SCRATCHMALLOC: {
        !          2927:       void *pFree, **ppNew;
        !          2928:       int sz;
        !          2929:       sz = va_arg(ap, int);
        !          2930:       ppNew = va_arg(ap, void**);
        !          2931:       pFree = va_arg(ap, void*);
        !          2932:       if( sz ) *ppNew = sqlite3ScratchMalloc(sz);
        !          2933:       sqlite3ScratchFree(pFree);
        !          2934:       break;
        !          2935:     }
        !          2936: 
        !          2937:     /*   sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff);
        !          2938:     **
        !          2939:     ** If parameter onoff is non-zero, configure the wrappers so that all
        !          2940:     ** subsequent calls to localtime() and variants fail. If onoff is zero,
        !          2941:     ** undo this setting.
        !          2942:     */
        !          2943:     case SQLITE_TESTCTRL_LOCALTIME_FAULT: {
        !          2944:       sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int);
        !          2945:       break;
        !          2946:     }
        !          2947: 
        !          2948: #if defined(SQLITE_ENABLE_TREE_EXPLAIN)
        !          2949:     /*   sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT,
        !          2950:     **                        sqlite3_stmt*,const char**);
        !          2951:     **
        !          2952:     ** If compiled with SQLITE_ENABLE_TREE_EXPLAIN, each sqlite3_stmt holds
        !          2953:     ** a string that describes the optimized parse tree.  This test-control
        !          2954:     ** returns a pointer to that string.
        !          2955:     */
        !          2956:     case SQLITE_TESTCTRL_EXPLAIN_STMT: {
        !          2957:       sqlite3_stmt *pStmt = va_arg(ap, sqlite3_stmt*);
        !          2958:       const char **pzRet = va_arg(ap, const char**);
        !          2959:       *pzRet = sqlite3VdbeExplanation((Vdbe*)pStmt);
        !          2960:       break;
        !          2961:     }
        !          2962: #endif
        !          2963: 
        !          2964:   }
        !          2965:   va_end(ap);
        !          2966: #endif /* SQLITE_OMIT_BUILTIN_TEST */
        !          2967:   return rc;
        !          2968: }
        !          2969: 
        !          2970: /*
        !          2971: ** This is a utility routine, useful to VFS implementations, that checks
        !          2972: ** to see if a database file was a URI that contained a specific query 
        !          2973: ** parameter, and if so obtains the value of the query parameter.
        !          2974: **
        !          2975: ** The zFilename argument is the filename pointer passed into the xOpen()
        !          2976: ** method of a VFS implementation.  The zParam argument is the name of the
        !          2977: ** query parameter we seek.  This routine returns the value of the zParam
        !          2978: ** parameter if it exists.  If the parameter does not exist, this routine
        !          2979: ** returns a NULL pointer.
        !          2980: */
        !          2981: const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){
        !          2982:   if( zFilename==0 ) return 0;
        !          2983:   zFilename += sqlite3Strlen30(zFilename) + 1;
        !          2984:   while( zFilename[0] ){
        !          2985:     int x = strcmp(zFilename, zParam);
        !          2986:     zFilename += sqlite3Strlen30(zFilename) + 1;
        !          2987:     if( x==0 ) return zFilename;
        !          2988:     zFilename += sqlite3Strlen30(zFilename) + 1;
        !          2989:   }
        !          2990:   return 0;
        !          2991: }
        !          2992: 
        !          2993: /*
        !          2994: ** Return a boolean value for a query parameter.
        !          2995: */
        !          2996: int sqlite3_uri_boolean(const char *zFilename, const char *zParam, int bDflt){
        !          2997:   const char *z = sqlite3_uri_parameter(zFilename, zParam);
        !          2998:   return z ? sqlite3GetBoolean(z) : (bDflt!=0);
        !          2999: }
        !          3000: 
        !          3001: /*
        !          3002: ** Return a 64-bit integer value for a query parameter.
        !          3003: */
        !          3004: sqlite3_int64 sqlite3_uri_int64(
        !          3005:   const char *zFilename,    /* Filename as passed to xOpen */
        !          3006:   const char *zParam,       /* URI parameter sought */
        !          3007:   sqlite3_int64 bDflt       /* return if parameter is missing */
        !          3008: ){
        !          3009:   const char *z = sqlite3_uri_parameter(zFilename, zParam);
        !          3010:   sqlite3_int64 v;
        !          3011:   if( z && sqlite3Atoi64(z, &v, sqlite3Strlen30(z), SQLITE_UTF8)==SQLITE_OK ){
        !          3012:     bDflt = v;
        !          3013:   }
        !          3014:   return bDflt;
        !          3015: }
        !          3016: 
        !          3017: /*
        !          3018: ** Return the filename of the database associated with a database
        !          3019: ** connection.
        !          3020: */
        !          3021: const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName){
        !          3022:   int i;
        !          3023:   for(i=0; i<db->nDb; i++){
        !          3024:     if( db->aDb[i].pBt && sqlite3StrICmp(zDbName, db->aDb[i].zName)==0 ){
        !          3025:       return sqlite3BtreeGetFilename(db->aDb[i].pBt);
        !          3026:     }
        !          3027:   }
        !          3028:   return 0;
        !          3029: }

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