1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/extensions/sqlite/sqlite-source/main.c Sun Mar 30 07:00:22 2008 +0000
1.3 @@ -0,0 +1,1485 @@
1.4 +/*
1.5 +** 2001 September 15
1.6 +**
1.7 +** The author disclaims copyright to this source code. In place of
1.8 +** a legal notice, here is a blessing:
1.9 +**
1.10 +** May you do good and not evil.
1.11 +** May you find forgiveness for yourself and forgive others.
1.12 +** May you share freely, never taking more than you give.
1.13 +**
1.14 +*************************************************************************
1.15 +** Main file for the SQLite library. The routines in this file
1.16 +** implement the programmer interface to the library. Routines in
1.17 +** other files are for internal use by SQLite and should not be
1.18 +** accessed by users of the library.
1.19 +**
1.20 +** $Id$
1.21 +*/
1.22 +#include "sqliteInt.h"
1.23 +#include <ctype.h>
1.24 +
1.25 +/*
1.26 +** The version of the library
1.27 +*/
1.28 +const char sqlite3_version[] = SQLITE_VERSION;
1.29 +const char *sqlite3_libversion(void){ return sqlite3_version; }
1.30 +int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; }
1.31 +int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }
1.32 +
1.33 +/*
1.34 +** If the following function pointer is not NULL and if
1.35 +** SQLITE_ENABLE_IOTRACE is enabled, then messages describing
1.36 +** I/O active are written using this function. These messages
1.37 +** are intended for debugging activity only.
1.38 +*/
1.39 +void (*sqlite3_io_trace)(const char*, ...) = 0;
1.40 +
1.41 +/*
1.42 +** If the following global variable points to a string which is the
1.43 +** name of a directory, then that directory will be used to store
1.44 +** temporary files.
1.45 +**
1.46 +** See also the "PRAGMA temp_store_directory" SQL command.
1.47 +*/
1.48 +char *sqlite3_temp_directory = 0;
1.49 +
1.50 +
1.51 +/*
1.52 +** This is the default collating function named "BINARY" which is always
1.53 +** available.
1.54 +*/
1.55 +static int binCollFunc(
1.56 + void *NotUsed,
1.57 + int nKey1, const void *pKey1,
1.58 + int nKey2, const void *pKey2
1.59 +){
1.60 + int rc, n;
1.61 + n = nKey1<nKey2 ? nKey1 : nKey2;
1.62 + rc = memcmp(pKey1, pKey2, n);
1.63 + if( rc==0 ){
1.64 + rc = nKey1 - nKey2;
1.65 + }
1.66 + return rc;
1.67 +}
1.68 +
1.69 +/*
1.70 +** Another built-in collating sequence: NOCASE.
1.71 +**
1.72 +** This collating sequence is intended to be used for "case independant
1.73 +** comparison". SQLite's knowledge of upper and lower case equivalents
1.74 +** extends only to the 26 characters used in the English language.
1.75 +**
1.76 +** At the moment there is only a UTF-8 implementation.
1.77 +*/
1.78 +static int nocaseCollatingFunc(
1.79 + void *NotUsed,
1.80 + int nKey1, const void *pKey1,
1.81 + int nKey2, const void *pKey2
1.82 +){
1.83 + int r = sqlite3StrNICmp(
1.84 + (const char *)pKey1, (const char *)pKey2, (nKey1<nKey2)?nKey1:nKey2);
1.85 + if( 0==r ){
1.86 + r = nKey1-nKey2;
1.87 + }
1.88 + return r;
1.89 +}
1.90 +
1.91 +/*
1.92 +** Return the ROWID of the most recent insert
1.93 +*/
1.94 +sqlite_int64 sqlite3_last_insert_rowid(sqlite3 *db){
1.95 + return db->lastRowid;
1.96 +}
1.97 +
1.98 +/*
1.99 +** Return the number of changes in the most recent call to sqlite3_exec().
1.100 +*/
1.101 +int sqlite3_changes(sqlite3 *db){
1.102 + return db->nChange;
1.103 +}
1.104 +
1.105 +/*
1.106 +** Return the number of changes since the database handle was opened.
1.107 +*/
1.108 +int sqlite3_total_changes(sqlite3 *db){
1.109 + return db->nTotalChange;
1.110 +}
1.111 +
1.112 +/*
1.113 +** Close an existing SQLite database
1.114 +*/
1.115 +int sqlite3_close(sqlite3 *db){
1.116 + HashElem *i;
1.117 + int j;
1.118 +
1.119 + if( !db ){
1.120 + return SQLITE_OK;
1.121 + }
1.122 + if( sqlite3SafetyCheck(db) ){
1.123 + return SQLITE_MISUSE;
1.124 + }
1.125 + sqlite3_mutex_enter(db->mutex);
1.126 +
1.127 +#ifdef SQLITE_SSE
1.128 + {
1.129 + extern void sqlite3SseCleanup(sqlite3*);
1.130 + sqlite3SseCleanup(db);
1.131 + }
1.132 +#endif
1.133 +
1.134 + sqlite3ResetInternalSchema(db, 0);
1.135 +
1.136 + /* If a transaction is open, the ResetInternalSchema() call above
1.137 + ** will not have called the xDisconnect() method on any virtual
1.138 + ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback()
1.139 + ** call will do so. We need to do this before the check for active
1.140 + ** SQL statements below, as the v-table implementation may be storing
1.141 + ** some prepared statements internally.
1.142 + */
1.143 + sqlite3VtabRollback(db);
1.144 +
1.145 + /* If there are any outstanding VMs, return SQLITE_BUSY. */
1.146 + if( db->pVdbe ){
1.147 + sqlite3Error(db, SQLITE_BUSY,
1.148 + "Unable to close due to unfinalised statements");
1.149 + sqlite3_mutex_leave(db->mutex);
1.150 + return SQLITE_BUSY;
1.151 + }
1.152 + assert( !sqlite3SafetyCheck(db) );
1.153 +
1.154 + /* FIX ME: db->magic may be set to SQLITE_MAGIC_CLOSED if the database
1.155 + ** cannot be opened for some reason. So this routine needs to run in
1.156 + ** that case. But maybe there should be an extra magic value for the
1.157 + ** "failed to open" state.
1.158 + **
1.159 + ** TODO: Coverage tests do not test the case where this condition is
1.160 + ** true. It's hard to see how to cause it without messing with threads.
1.161 + */
1.162 + if( db->magic!=SQLITE_MAGIC_CLOSED && sqlite3SafetyOn(db) ){
1.163 + /* printf("DID NOT CLOSE\n"); fflush(stdout); */
1.164 + sqlite3_mutex_leave(db->mutex);
1.165 + return SQLITE_ERROR;
1.166 + }
1.167 +
1.168 + for(j=0; j<db->nDb; j++){
1.169 + struct Db *pDb = &db->aDb[j];
1.170 + if( pDb->pBt ){
1.171 + sqlite3BtreeClose(pDb->pBt);
1.172 + pDb->pBt = 0;
1.173 + if( j!=1 ){
1.174 + pDb->pSchema = 0;
1.175 + }
1.176 + }
1.177 + }
1.178 + sqlite3ResetInternalSchema(db, 0);
1.179 + assert( db->nDb<=2 );
1.180 + assert( db->aDb==db->aDbStatic );
1.181 + for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){
1.182 + FuncDef *pFunc, *pNext;
1.183 + for(pFunc = (FuncDef*)sqliteHashData(i); pFunc; pFunc=pNext){
1.184 + pNext = pFunc->pNext;
1.185 + sqlite3_free(pFunc);
1.186 + }
1.187 + }
1.188 +
1.189 + for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){
1.190 + CollSeq *pColl = (CollSeq *)sqliteHashData(i);
1.191 + /* Invoke any destructors registered for collation sequence user data. */
1.192 + for(j=0; j<3; j++){
1.193 + if( pColl[j].xDel ){
1.194 + pColl[j].xDel(pColl[j].pUser);
1.195 + }
1.196 + }
1.197 + sqlite3_free(pColl);
1.198 + }
1.199 + sqlite3HashClear(&db->aCollSeq);
1.200 +#ifndef SQLITE_OMIT_VIRTUALTABLE
1.201 + for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){
1.202 + Module *pMod = (Module *)sqliteHashData(i);
1.203 + if( pMod->xDestroy ){
1.204 + pMod->xDestroy(pMod->pAux);
1.205 + }
1.206 + sqlite3_free(pMod);
1.207 + }
1.208 + sqlite3HashClear(&db->aModule);
1.209 +#endif
1.210 +
1.211 + sqlite3HashClear(&db->aFunc);
1.212 + sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */
1.213 + if( db->pErr ){
1.214 + sqlite3ValueFree(db->pErr);
1.215 + }
1.216 + sqlite3CloseExtensions(db);
1.217 +
1.218 + db->magic = SQLITE_MAGIC_ERROR;
1.219 +
1.220 + /* The temp-database schema is allocated differently from the other schema
1.221 + ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()).
1.222 + ** So it needs to be freed here. Todo: Why not roll the temp schema into
1.223 + ** the same sqliteMalloc() as the one that allocates the database
1.224 + ** structure?
1.225 + */
1.226 + sqlite3_free(db->aDb[1].pSchema);
1.227 + sqlite3_mutex_leave(db->mutex);
1.228 + sqlite3_mutex_free(db->mutex);
1.229 + sqlite3_free(db);
1.230 + return SQLITE_OK;
1.231 +}
1.232 +
1.233 +/*
1.234 +** Rollback all database files.
1.235 +*/
1.236 +void sqlite3RollbackAll(sqlite3 *db){
1.237 + int i;
1.238 + int inTrans = 0;
1.239 + assert( sqlite3_mutex_held(db->mutex) );
1.240 + sqlite3MallocEnterBenignBlock(1); /* Enter benign region */
1.241 + for(i=0; i<db->nDb; i++){
1.242 + if( db->aDb[i].pBt ){
1.243 + if( sqlite3BtreeIsInTrans(db->aDb[i].pBt) ){
1.244 + inTrans = 1;
1.245 + }
1.246 + sqlite3BtreeRollback(db->aDb[i].pBt);
1.247 + db->aDb[i].inTrans = 0;
1.248 + }
1.249 + }
1.250 + sqlite3VtabRollback(db);
1.251 + sqlite3MallocLeaveBenignBlock(); /* Leave benign region */
1.252 +
1.253 + if( db->flags&SQLITE_InternChanges ){
1.254 + sqlite3ExpirePreparedStatements(db);
1.255 + sqlite3ResetInternalSchema(db, 0);
1.256 + }
1.257 +
1.258 + /* If one has been configured, invoke the rollback-hook callback */
1.259 + if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){
1.260 + db->xRollbackCallback(db->pRollbackArg);
1.261 + }
1.262 +}
1.263 +
1.264 +/*
1.265 +** Return a static string that describes the kind of error specified in the
1.266 +** argument.
1.267 +*/
1.268 +const char *sqlite3ErrStr(int rc){
1.269 + const char *z;
1.270 + switch( rc & 0xff ){
1.271 + case SQLITE_ROW:
1.272 + case SQLITE_DONE:
1.273 + case SQLITE_OK: z = "not an error"; break;
1.274 + case SQLITE_ERROR: z = "SQL logic error or missing database"; break;
1.275 + case SQLITE_PERM: z = "access permission denied"; break;
1.276 + case SQLITE_ABORT: z = "callback requested query abort"; break;
1.277 + case SQLITE_BUSY: z = "database is locked"; break;
1.278 + case SQLITE_LOCKED: z = "database table is locked"; break;
1.279 + case SQLITE_NOMEM: z = "out of memory"; break;
1.280 + case SQLITE_READONLY: z = "attempt to write a readonly database"; break;
1.281 + case SQLITE_INTERRUPT: z = "interrupted"; break;
1.282 + case SQLITE_IOERR: z = "disk I/O error"; break;
1.283 + case SQLITE_CORRUPT: z = "database disk image is malformed"; break;
1.284 + case SQLITE_FULL: z = "database or disk is full"; break;
1.285 + case SQLITE_CANTOPEN: z = "unable to open database file"; break;
1.286 + case SQLITE_EMPTY: z = "table contains no data"; break;
1.287 + case SQLITE_SCHEMA: z = "database schema has changed"; break;
1.288 + case SQLITE_TOOBIG: z = "String or BLOB exceeded size limit"; break;
1.289 + case SQLITE_CONSTRAINT: z = "constraint failed"; break;
1.290 + case SQLITE_MISMATCH: z = "datatype mismatch"; break;
1.291 + case SQLITE_MISUSE: z = "library routine called out of sequence";break;
1.292 + case SQLITE_NOLFS: z = "kernel lacks large file support"; break;
1.293 + case SQLITE_AUTH: z = "authorization denied"; break;
1.294 + case SQLITE_FORMAT: z = "auxiliary database format error"; break;
1.295 + case SQLITE_RANGE: z = "bind or column index out of range"; break;
1.296 + case SQLITE_NOTADB: z = "file is encrypted or is not a database";break;
1.297 + default: z = "unknown error"; break;
1.298 + }
1.299 + return z;
1.300 +}
1.301 +
1.302 +/*
1.303 +** This routine implements a busy callback that sleeps and tries
1.304 +** again until a timeout value is reached. The timeout value is
1.305 +** an integer number of milliseconds passed in as the first
1.306 +** argument.
1.307 +*/
1.308 +static int sqliteDefaultBusyCallback(
1.309 + void *ptr, /* Database connection */
1.310 + int count /* Number of times table has been busy */
1.311 +){
1.312 +#if OS_WIN || (defined(HAVE_USLEEP) && HAVE_USLEEP)
1.313 + static const u8 delays[] =
1.314 + { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 };
1.315 + static const u8 totals[] =
1.316 + { 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 };
1.317 +# define NDELAY (sizeof(delays)/sizeof(delays[0]))
1.318 + sqlite3 *db = (sqlite3 *)ptr;
1.319 + int timeout = db->busyTimeout;
1.320 + int delay, prior;
1.321 +
1.322 + assert( count>=0 );
1.323 + if( count < NDELAY ){
1.324 + delay = delays[count];
1.325 + prior = totals[count];
1.326 + }else{
1.327 + delay = delays[NDELAY-1];
1.328 + prior = totals[NDELAY-1] + delay*(count-(NDELAY-1));
1.329 + }
1.330 + if( prior + delay > timeout ){
1.331 + delay = timeout - prior;
1.332 + if( delay<=0 ) return 0;
1.333 + }
1.334 + sqlite3OsSleep(db->pVfs, delay*1000);
1.335 + return 1;
1.336 +#else
1.337 + sqlite3 *db = (sqlite3 *)ptr;
1.338 + int timeout = ((sqlite3 *)ptr)->busyTimeout;
1.339 + if( (count+1)*1000 > timeout ){
1.340 + return 0;
1.341 + }
1.342 + sqlite3OsSleep(db->pVfs, 1000000);
1.343 + return 1;
1.344 +#endif
1.345 +}
1.346 +
1.347 +/*
1.348 +** Invoke the given busy handler.
1.349 +**
1.350 +** This routine is called when an operation failed with a lock.
1.351 +** If this routine returns non-zero, the lock is retried. If it
1.352 +** returns 0, the operation aborts with an SQLITE_BUSY error.
1.353 +*/
1.354 +int sqlite3InvokeBusyHandler(BusyHandler *p){
1.355 + int rc;
1.356 + if( p==0 || p->xFunc==0 || p->nBusy<0 ) return 0;
1.357 + rc = p->xFunc(p->pArg, p->nBusy);
1.358 + if( rc==0 ){
1.359 + p->nBusy = -1;
1.360 + }else{
1.361 + p->nBusy++;
1.362 + }
1.363 + return rc;
1.364 +}
1.365 +
1.366 +/*
1.367 +** This routine sets the busy callback for an Sqlite database to the
1.368 +** given callback function with the given argument.
1.369 +*/
1.370 +int sqlite3_busy_handler(
1.371 + sqlite3 *db,
1.372 + int (*xBusy)(void*,int),
1.373 + void *pArg
1.374 +){
1.375 + if( sqlite3SafetyCheck(db) ){
1.376 + return SQLITE_MISUSE;
1.377 + }
1.378 + sqlite3_mutex_enter(db->mutex);
1.379 + db->busyHandler.xFunc = xBusy;
1.380 + db->busyHandler.pArg = pArg;
1.381 + db->busyHandler.nBusy = 0;
1.382 + sqlite3_mutex_leave(db->mutex);
1.383 + return SQLITE_OK;
1.384 +}
1.385 +
1.386 +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
1.387 +/*
1.388 +** This routine sets the progress callback for an Sqlite database to the
1.389 +** given callback function with the given argument. The progress callback will
1.390 +** be invoked every nOps opcodes.
1.391 +*/
1.392 +void sqlite3_progress_handler(
1.393 + sqlite3 *db,
1.394 + int nOps,
1.395 + int (*xProgress)(void*),
1.396 + void *pArg
1.397 +){
1.398 + if( !sqlite3SafetyCheck(db) ){
1.399 + sqlite3_mutex_enter(db->mutex);
1.400 + if( nOps>0 ){
1.401 + db->xProgress = xProgress;
1.402 + db->nProgressOps = nOps;
1.403 + db->pProgressArg = pArg;
1.404 + }else{
1.405 + db->xProgress = 0;
1.406 + db->nProgressOps = 0;
1.407 + db->pProgressArg = 0;
1.408 + }
1.409 + sqlite3_mutex_leave(db->mutex);
1.410 + }
1.411 +}
1.412 +#endif
1.413 +
1.414 +
1.415 +/*
1.416 +** This routine installs a default busy handler that waits for the
1.417 +** specified number of milliseconds before returning 0.
1.418 +*/
1.419 +int sqlite3_busy_timeout(sqlite3 *db, int ms){
1.420 + if( sqlite3SafetyCheck(db) ){
1.421 + return SQLITE_MISUSE;
1.422 + }
1.423 + if( ms>0 ){
1.424 + db->busyTimeout = ms;
1.425 + sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db);
1.426 + }else{
1.427 + sqlite3_busy_handler(db, 0, 0);
1.428 + }
1.429 + return SQLITE_OK;
1.430 +}
1.431 +
1.432 +/*
1.433 +** Cause any pending operation to stop at its earliest opportunity.
1.434 +*/
1.435 +void sqlite3_interrupt(sqlite3 *db){
1.436 + if( db && (db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_BUSY) ){
1.437 + db->u1.isInterrupted = 1;
1.438 + }
1.439 +}
1.440 +
1.441 +
1.442 +/*
1.443 +** This function is exactly the same as sqlite3_create_function(), except
1.444 +** that it is designed to be called by internal code. The difference is
1.445 +** that if a malloc() fails in sqlite3_create_function(), an error code
1.446 +** is returned and the mallocFailed flag cleared.
1.447 +*/
1.448 +int sqlite3CreateFunc(
1.449 + sqlite3 *db,
1.450 + const char *zFunctionName,
1.451 + int nArg,
1.452 + int enc,
1.453 + void *pUserData,
1.454 + void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
1.455 + void (*xStep)(sqlite3_context*,int,sqlite3_value **),
1.456 + void (*xFinal)(sqlite3_context*)
1.457 +){
1.458 + FuncDef *p;
1.459 + int nName;
1.460 +
1.461 + assert( sqlite3_mutex_held(db->mutex) );
1.462 + if( sqlite3SafetyCheck(db) ){
1.463 + return SQLITE_MISUSE;
1.464 + }
1.465 + if( zFunctionName==0 ||
1.466 + (xFunc && (xFinal || xStep)) ||
1.467 + (!xFunc && (xFinal && !xStep)) ||
1.468 + (!xFunc && (!xFinal && xStep)) ||
1.469 + (nArg<-1 || nArg>127) ||
1.470 + (255<(nName = strlen(zFunctionName))) ){
1.471 + sqlite3Error(db, SQLITE_ERROR, "bad parameters");
1.472 + return SQLITE_ERROR;
1.473 + }
1.474 +
1.475 +#ifndef SQLITE_OMIT_UTF16
1.476 + /* If SQLITE_UTF16 is specified as the encoding type, transform this
1.477 + ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
1.478 + ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
1.479 + **
1.480 + ** If SQLITE_ANY is specified, add three versions of the function
1.481 + ** to the hash table.
1.482 + */
1.483 + if( enc==SQLITE_UTF16 ){
1.484 + enc = SQLITE_UTF16NATIVE;
1.485 + }else if( enc==SQLITE_ANY ){
1.486 + int rc;
1.487 + rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8,
1.488 + pUserData, xFunc, xStep, xFinal);
1.489 + if( rc==SQLITE_OK ){
1.490 + rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE,
1.491 + pUserData, xFunc, xStep, xFinal);
1.492 + }
1.493 + if( rc!=SQLITE_OK ){
1.494 + return rc;
1.495 + }
1.496 + enc = SQLITE_UTF16BE;
1.497 + }
1.498 +#else
1.499 + enc = SQLITE_UTF8;
1.500 +#endif
1.501 +
1.502 + /* Check if an existing function is being overridden or deleted. If so,
1.503 + ** and there are active VMs, then return SQLITE_BUSY. If a function
1.504 + ** is being overridden/deleted but there are no active VMs, allow the
1.505 + ** operation to continue but invalidate all precompiled statements.
1.506 + */
1.507 + p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 0);
1.508 + if( p && p->iPrefEnc==enc && p->nArg==nArg ){
1.509 + if( db->activeVdbeCnt ){
1.510 + sqlite3Error(db, SQLITE_BUSY,
1.511 + "Unable to delete/modify user-function due to active statements");
1.512 + assert( !db->mallocFailed );
1.513 + return SQLITE_BUSY;
1.514 + }else{
1.515 + sqlite3ExpirePreparedStatements(db);
1.516 + }
1.517 + }
1.518 +
1.519 + p = sqlite3FindFunction(db, zFunctionName, nName, nArg, enc, 1);
1.520 + assert(p || db->mallocFailed);
1.521 + if( !p ){
1.522 + return SQLITE_NOMEM;
1.523 + }
1.524 + p->flags = 0;
1.525 + p->xFunc = xFunc;
1.526 + p->xStep = xStep;
1.527 + p->xFinalize = xFinal;
1.528 + p->pUserData = pUserData;
1.529 + p->nArg = nArg;
1.530 + return SQLITE_OK;
1.531 +}
1.532 +
1.533 +/*
1.534 +** Create new user functions.
1.535 +*/
1.536 +int sqlite3_create_function(
1.537 + sqlite3 *db,
1.538 + const char *zFunctionName,
1.539 + int nArg,
1.540 + int enc,
1.541 + void *p,
1.542 + void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
1.543 + void (*xStep)(sqlite3_context*,int,sqlite3_value **),
1.544 + void (*xFinal)(sqlite3_context*)
1.545 +){
1.546 + int rc;
1.547 + sqlite3_mutex_enter(db->mutex);
1.548 + assert( !db->mallocFailed );
1.549 + rc = sqlite3CreateFunc(db, zFunctionName, nArg, enc, p, xFunc, xStep, xFinal);
1.550 + rc = sqlite3ApiExit(db, rc);
1.551 + sqlite3_mutex_leave(db->mutex);
1.552 + return rc;
1.553 +}
1.554 +
1.555 +#ifndef SQLITE_OMIT_UTF16
1.556 +int sqlite3_create_function16(
1.557 + sqlite3 *db,
1.558 + const void *zFunctionName,
1.559 + int nArg,
1.560 + int eTextRep,
1.561 + void *p,
1.562 + void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
1.563 + void (*xStep)(sqlite3_context*,int,sqlite3_value**),
1.564 + void (*xFinal)(sqlite3_context*)
1.565 +){
1.566 + int rc;
1.567 + char *zFunc8;
1.568 + sqlite3_mutex_enter(db->mutex);
1.569 + assert( !db->mallocFailed );
1.570 + zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1);
1.571 + rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal);
1.572 + sqlite3_free(zFunc8);
1.573 + rc = sqlite3ApiExit(db, rc);
1.574 + sqlite3_mutex_leave(db->mutex);
1.575 + return rc;
1.576 +}
1.577 +#endif
1.578 +
1.579 +
1.580 +/*
1.581 +** Declare that a function has been overloaded by a virtual table.
1.582 +**
1.583 +** If the function already exists as a regular global function, then
1.584 +** this routine is a no-op. If the function does not exist, then create
1.585 +** a new one that always throws a run-time error.
1.586 +**
1.587 +** When virtual tables intend to provide an overloaded function, they
1.588 +** should call this routine to make sure the global function exists.
1.589 +** A global function must exist in order for name resolution to work
1.590 +** properly.
1.591 +*/
1.592 +int sqlite3_overload_function(
1.593 + sqlite3 *db,
1.594 + const char *zName,
1.595 + int nArg
1.596 +){
1.597 + int nName = strlen(zName);
1.598 + int rc;
1.599 + sqlite3_mutex_enter(db->mutex);
1.600 + if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){
1.601 + sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
1.602 + 0, sqlite3InvalidFunction, 0, 0);
1.603 + }
1.604 + rc = sqlite3ApiExit(db, SQLITE_OK);
1.605 + sqlite3_mutex_leave(db->mutex);
1.606 + return rc;
1.607 +}
1.608 +
1.609 +#ifndef SQLITE_OMIT_TRACE
1.610 +/*
1.611 +** Register a trace function. The pArg from the previously registered trace
1.612 +** is returned.
1.613 +**
1.614 +** A NULL trace function means that no tracing is executes. A non-NULL
1.615 +** trace is a pointer to a function that is invoked at the start of each
1.616 +** SQL statement.
1.617 +*/
1.618 +void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), void *pArg){
1.619 + void *pOld;
1.620 + sqlite3_mutex_enter(db->mutex);
1.621 + pOld = db->pTraceArg;
1.622 + db->xTrace = xTrace;
1.623 + db->pTraceArg = pArg;
1.624 + sqlite3_mutex_leave(db->mutex);
1.625 + return pOld;
1.626 +}
1.627 +/*
1.628 +** Register a profile function. The pArg from the previously registered
1.629 +** profile function is returned.
1.630 +**
1.631 +** A NULL profile function means that no profiling is executes. A non-NULL
1.632 +** profile is a pointer to a function that is invoked at the conclusion of
1.633 +** each SQL statement that is run.
1.634 +*/
1.635 +void *sqlite3_profile(
1.636 + sqlite3 *db,
1.637 + void (*xProfile)(void*,const char*,sqlite_uint64),
1.638 + void *pArg
1.639 +){
1.640 + void *pOld;
1.641 + sqlite3_mutex_enter(db->mutex);
1.642 + pOld = db->pProfileArg;
1.643 + db->xProfile = xProfile;
1.644 + db->pProfileArg = pArg;
1.645 + sqlite3_mutex_leave(db->mutex);
1.646 + return pOld;
1.647 +}
1.648 +#endif /* SQLITE_OMIT_TRACE */
1.649 +
1.650 +/*** EXPERIMENTAL ***
1.651 +**
1.652 +** Register a function to be invoked when a transaction comments.
1.653 +** If the invoked function returns non-zero, then the commit becomes a
1.654 +** rollback.
1.655 +*/
1.656 +void *sqlite3_commit_hook(
1.657 + sqlite3 *db, /* Attach the hook to this database */
1.658 + int (*xCallback)(void*), /* Function to invoke on each commit */
1.659 + void *pArg /* Argument to the function */
1.660 +){
1.661 + void *pOld;
1.662 + sqlite3_mutex_enter(db->mutex);
1.663 + pOld = db->pCommitArg;
1.664 + db->xCommitCallback = xCallback;
1.665 + db->pCommitArg = pArg;
1.666 + sqlite3_mutex_leave(db->mutex);
1.667 + return pOld;
1.668 +}
1.669 +
1.670 +/*
1.671 +** Register a callback to be invoked each time a row is updated,
1.672 +** inserted or deleted using this database connection.
1.673 +*/
1.674 +void *sqlite3_update_hook(
1.675 + sqlite3 *db, /* Attach the hook to this database */
1.676 + void (*xCallback)(void*,int,char const *,char const *,sqlite_int64),
1.677 + void *pArg /* Argument to the function */
1.678 +){
1.679 + void *pRet;
1.680 + sqlite3_mutex_enter(db->mutex);
1.681 + pRet = db->pUpdateArg;
1.682 + db->xUpdateCallback = xCallback;
1.683 + db->pUpdateArg = pArg;
1.684 + sqlite3_mutex_leave(db->mutex);
1.685 + return pRet;
1.686 +}
1.687 +
1.688 +/*
1.689 +** Register a callback to be invoked each time a transaction is rolled
1.690 +** back by this database connection.
1.691 +*/
1.692 +void *sqlite3_rollback_hook(
1.693 + sqlite3 *db, /* Attach the hook to this database */
1.694 + void (*xCallback)(void*), /* Callback function */
1.695 + void *pArg /* Argument to the function */
1.696 +){
1.697 + void *pRet;
1.698 + sqlite3_mutex_enter(db->mutex);
1.699 + pRet = db->pRollbackArg;
1.700 + db->xRollbackCallback = xCallback;
1.701 + db->pRollbackArg = pArg;
1.702 + sqlite3_mutex_leave(db->mutex);
1.703 + return pRet;
1.704 +}
1.705 +
1.706 +/*
1.707 +** This routine is called to create a connection to a database BTree
1.708 +** driver. If zFilename is the name of a file, then that file is
1.709 +** opened and used. If zFilename is the magic name ":memory:" then
1.710 +** the database is stored in memory (and is thus forgotten as soon as
1.711 +** the connection is closed.) If zFilename is NULL then the database
1.712 +** is a "virtual" database for transient use only and is deleted as
1.713 +** soon as the connection is closed.
1.714 +**
1.715 +** A virtual database can be either a disk file (that is automatically
1.716 +** deleted when the file is closed) or it an be held entirely in memory,
1.717 +** depending on the values of the TEMP_STORE compile-time macro and the
1.718 +** db->temp_store variable, according to the following chart:
1.719 +**
1.720 +** TEMP_STORE db->temp_store Location of temporary database
1.721 +** ---------- -------------- ------------------------------
1.722 +** 0 any file
1.723 +** 1 1 file
1.724 +** 1 2 memory
1.725 +** 1 0 file
1.726 +** 2 1 file
1.727 +** 2 2 memory
1.728 +** 2 0 memory
1.729 +** 3 any memory
1.730 +*/
1.731 +int sqlite3BtreeFactory(
1.732 + const sqlite3 *db, /* Main database when opening aux otherwise 0 */
1.733 + const char *zFilename, /* Name of the file containing the BTree database */
1.734 + int omitJournal, /* if TRUE then do not journal this file */
1.735 + int nCache, /* How many pages in the page cache */
1.736 + int vfsFlags, /* Flags passed through to vfsOpen */
1.737 + Btree **ppBtree /* Pointer to new Btree object written here */
1.738 +){
1.739 + int btFlags = 0;
1.740 + int rc;
1.741 +
1.742 + assert( sqlite3_mutex_held(db->mutex) );
1.743 + assert( ppBtree != 0);
1.744 + if( omitJournal ){
1.745 + btFlags |= BTREE_OMIT_JOURNAL;
1.746 + }
1.747 + if( db->flags & SQLITE_NoReadlock ){
1.748 + btFlags |= BTREE_NO_READLOCK;
1.749 + }
1.750 + if( zFilename==0 ){
1.751 +#if TEMP_STORE==0
1.752 + /* Do nothing */
1.753 +#endif
1.754 +#ifndef SQLITE_OMIT_MEMORYDB
1.755 +#if TEMP_STORE==1
1.756 + if( db->temp_store==2 ) zFilename = ":memory:";
1.757 +#endif
1.758 +#if TEMP_STORE==2
1.759 + if( db->temp_store!=1 ) zFilename = ":memory:";
1.760 +#endif
1.761 +#if TEMP_STORE==3
1.762 + zFilename = ":memory:";
1.763 +#endif
1.764 +#endif /* SQLITE_OMIT_MEMORYDB */
1.765 + }
1.766 +
1.767 + if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (zFilename==0 || *zFilename==0) ){
1.768 + vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB;
1.769 + }
1.770 + rc = sqlite3BtreeOpen(zFilename, (sqlite3 *)db, ppBtree, btFlags, vfsFlags);
1.771 + if( rc==SQLITE_OK ){
1.772 + sqlite3BtreeSetBusyHandler(*ppBtree, (void*)&db->busyHandler);
1.773 + sqlite3BtreeSetCacheSize(*ppBtree, nCache);
1.774 + }
1.775 + return rc;
1.776 +}
1.777 +
1.778 +/*
1.779 +** Return UTF-8 encoded English language explanation of the most recent
1.780 +** error.
1.781 +*/
1.782 +const char *sqlite3_errmsg(sqlite3 *db){
1.783 + const char *z;
1.784 + if( !db ){
1.785 + return sqlite3ErrStr(SQLITE_NOMEM);
1.786 + }
1.787 + if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){
1.788 + return sqlite3ErrStr(SQLITE_MISUSE);
1.789 + }
1.790 + sqlite3_mutex_enter(db->mutex);
1.791 + assert( !db->mallocFailed );
1.792 + z = (char*)sqlite3_value_text(db->pErr);
1.793 + if( z==0 ){
1.794 + z = sqlite3ErrStr(db->errCode);
1.795 + }
1.796 + sqlite3_mutex_leave(db->mutex);
1.797 + return z;
1.798 +}
1.799 +
1.800 +#ifndef SQLITE_OMIT_UTF16
1.801 +/*
1.802 +** Return UTF-16 encoded English language explanation of the most recent
1.803 +** error.
1.804 +*/
1.805 +const void *sqlite3_errmsg16(sqlite3 *db){
1.806 + /* Because all the characters in the string are in the unicode
1.807 + ** range 0x00-0xFF, if we pad the big-endian string with a
1.808 + ** zero byte, we can obtain the little-endian string with
1.809 + ** &big_endian[1].
1.810 + */
1.811 + static const char outOfMemBe[] = {
1.812 + 0, 'o', 0, 'u', 0, 't', 0, ' ',
1.813 + 0, 'o', 0, 'f', 0, ' ',
1.814 + 0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0
1.815 + };
1.816 + static const char misuseBe [] = {
1.817 + 0, 'l', 0, 'i', 0, 'b', 0, 'r', 0, 'a', 0, 'r', 0, 'y', 0, ' ',
1.818 + 0, 'r', 0, 'o', 0, 'u', 0, 't', 0, 'i', 0, 'n', 0, 'e', 0, ' ',
1.819 + 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ',
1.820 + 0, 'o', 0, 'u', 0, 't', 0, ' ',
1.821 + 0, 'o', 0, 'f', 0, ' ',
1.822 + 0, 's', 0, 'e', 0, 'q', 0, 'u', 0, 'e', 0, 'n', 0, 'c', 0, 'e', 0, 0, 0
1.823 + };
1.824 +
1.825 + const void *z;
1.826 + if( !db ){
1.827 + return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]);
1.828 + }
1.829 + if( sqlite3SafetyCheck(db) || db->errCode==SQLITE_MISUSE ){
1.830 + return (void *)(&misuseBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]);
1.831 + }
1.832 + sqlite3_mutex_enter(db->mutex);
1.833 + assert( !db->mallocFailed );
1.834 + z = sqlite3_value_text16(db->pErr);
1.835 + if( z==0 ){
1.836 + sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode),
1.837 + SQLITE_UTF8, SQLITE_STATIC);
1.838 + z = sqlite3_value_text16(db->pErr);
1.839 + }
1.840 + sqlite3ApiExit(0, 0);
1.841 + sqlite3_mutex_leave(db->mutex);
1.842 + return z;
1.843 +}
1.844 +#endif /* SQLITE_OMIT_UTF16 */
1.845 +
1.846 +/*
1.847 +** Return the most recent error code generated by an SQLite routine. If NULL is
1.848 +** passed to this function, we assume a malloc() failed during sqlite3_open().
1.849 +*/
1.850 +int sqlite3_errcode(sqlite3 *db){
1.851 + if( !db || db->mallocFailed ){
1.852 + return SQLITE_NOMEM;
1.853 + }
1.854 + if( sqlite3SafetyCheck(db) ){
1.855 + return SQLITE_MISUSE;
1.856 + }
1.857 + return db->errCode & db->errMask;
1.858 +}
1.859 +
1.860 +/*
1.861 +** Create a new collating function for database "db". The name is zName
1.862 +** and the encoding is enc.
1.863 +*/
1.864 +static int createCollation(
1.865 + sqlite3* db,
1.866 + const char *zName,
1.867 + int enc,
1.868 + void* pCtx,
1.869 + int(*xCompare)(void*,int,const void*,int,const void*),
1.870 + void(*xDel)(void*)
1.871 +){
1.872 + CollSeq *pColl;
1.873 + int enc2;
1.874 +
1.875 + if( sqlite3SafetyCheck(db) ){
1.876 + return SQLITE_MISUSE;
1.877 + }
1.878 + assert( sqlite3_mutex_held(db->mutex) );
1.879 +
1.880 + /* If SQLITE_UTF16 is specified as the encoding type, transform this
1.881 + ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
1.882 + ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
1.883 + */
1.884 + enc2 = enc & ~SQLITE_UTF16_ALIGNED;
1.885 + if( enc2==SQLITE_UTF16 ){
1.886 + enc2 = SQLITE_UTF16NATIVE;
1.887 + }
1.888 +
1.889 + if( (enc2&~3)!=0 ){
1.890 + sqlite3Error(db, SQLITE_ERROR, "unknown encoding");
1.891 + return SQLITE_ERROR;
1.892 + }
1.893 +
1.894 + /* Check if this call is removing or replacing an existing collation
1.895 + ** sequence. If so, and there are active VMs, return busy. If there
1.896 + ** are no active VMs, invalidate any pre-compiled statements.
1.897 + */
1.898 + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 0);
1.899 + if( pColl && pColl->xCmp ){
1.900 + if( db->activeVdbeCnt ){
1.901 + sqlite3Error(db, SQLITE_BUSY,
1.902 + "Unable to delete/modify collation sequence due to active statements");
1.903 + return SQLITE_BUSY;
1.904 + }
1.905 + sqlite3ExpirePreparedStatements(db);
1.906 +
1.907 + /* If collation sequence pColl was created directly by a call to
1.908 + ** sqlite3_create_collation, and not generated by synthCollSeq(),
1.909 + ** then any copies made by synthCollSeq() need to be invalidated.
1.910 + ** Also, collation destructor - CollSeq.xDel() - function may need
1.911 + ** to be called.
1.912 + */
1.913 + if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){
1.914 + CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, strlen(zName));
1.915 + int j;
1.916 + for(j=0; j<3; j++){
1.917 + CollSeq *p = &aColl[j];
1.918 + if( p->enc==pColl->enc ){
1.919 + if( p->xDel ){
1.920 + p->xDel(p->pUser);
1.921 + }
1.922 + p->xCmp = 0;
1.923 + }
1.924 + }
1.925 + }
1.926 + }
1.927 +
1.928 + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 1);
1.929 + if( pColl ){
1.930 + pColl->xCmp = xCompare;
1.931 + pColl->pUser = pCtx;
1.932 + pColl->xDel = xDel;
1.933 + pColl->enc = enc2 | (enc & SQLITE_UTF16_ALIGNED);
1.934 + }
1.935 + sqlite3Error(db, SQLITE_OK, 0);
1.936 + return SQLITE_OK;
1.937 +}
1.938 +
1.939 +
1.940 +/*
1.941 +** This routine does the work of opening a database on behalf of
1.942 +** sqlite3_open() and sqlite3_open16(). The database filename "zFilename"
1.943 +** is UTF-8 encoded.
1.944 +*/
1.945 +static int openDatabase(
1.946 + const char *zFilename, /* Database filename UTF-8 encoded */
1.947 + sqlite3 **ppDb, /* OUT: Returned database handle */
1.948 + unsigned flags, /* Operational flags */
1.949 + const char *zVfs /* Name of the VFS to use */
1.950 +){
1.951 + sqlite3 *db;
1.952 + int rc;
1.953 + CollSeq *pColl;
1.954 +
1.955 + /* Allocate the sqlite data structure */
1.956 + db = sqlite3MallocZero( sizeof(sqlite3) );
1.957 + if( db==0 ) goto opendb_out;
1.958 + db->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE);
1.959 + if( db->mutex==0 ){
1.960 + sqlite3_free(db);
1.961 + db = 0;
1.962 + goto opendb_out;
1.963 + }
1.964 + sqlite3_mutex_enter(db->mutex);
1.965 + db->errMask = 0xff;
1.966 + db->priorNewRowid = 0;
1.967 + db->nDb = 2;
1.968 + db->magic = SQLITE_MAGIC_BUSY;
1.969 + db->aDb = db->aDbStatic;
1.970 + db->autoCommit = 1;
1.971 + db->flags |= SQLITE_ShortColNames
1.972 +#if SQLITE_DEFAULT_FILE_FORMAT<4
1.973 + | SQLITE_LegacyFileFmt
1.974 +#endif
1.975 +#ifdef SQLITE_ENABLE_LOAD_EXTENSION
1.976 + | SQLITE_LoadExtension
1.977 +#endif
1.978 + ;
1.979 + sqlite3HashInit(&db->aFunc, SQLITE_HASH_STRING, 0);
1.980 + sqlite3HashInit(&db->aCollSeq, SQLITE_HASH_STRING, 0);
1.981 +#ifndef SQLITE_OMIT_VIRTUALTABLE
1.982 + sqlite3HashInit(&db->aModule, SQLITE_HASH_STRING, 0);
1.983 +#endif
1.984 +
1.985 + db->pVfs = sqlite3_vfs_find(zVfs);
1.986 + if( !db->pVfs ){
1.987 + rc = SQLITE_ERROR;
1.988 + db->magic = SQLITE_MAGIC_CLOSED;
1.989 + sqlite3Error(db, rc, "no such vfs: %s", (zVfs?zVfs:"(null)"));
1.990 + goto opendb_out;
1.991 + }
1.992 +
1.993 + /* Add the default collation sequence BINARY. BINARY works for both UTF-8
1.994 + ** and UTF-16, so add a version for each to avoid any unnecessary
1.995 + ** conversions. The only error that can occur here is a malloc() failure.
1.996 + */
1.997 + if( createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0) ||
1.998 + createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0) ||
1.999 + createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0) ||
1.1000 + (db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0))==0
1.1001 + ){
1.1002 + assert( db->mallocFailed );
1.1003 + db->magic = SQLITE_MAGIC_CLOSED;
1.1004 + goto opendb_out;
1.1005 + }
1.1006 +
1.1007 + /* Also add a UTF-8 case-insensitive collation sequence. */
1.1008 + createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0);
1.1009 +
1.1010 + /* Set flags on the built-in collating sequences */
1.1011 + db->pDfltColl->type = SQLITE_COLL_BINARY;
1.1012 + pColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "NOCASE", 6, 0);
1.1013 + if( pColl ){
1.1014 + pColl->type = SQLITE_COLL_NOCASE;
1.1015 + }
1.1016 +
1.1017 + /* Open the backend database driver */
1.1018 + db->openFlags = flags;
1.1019 + rc = sqlite3BtreeFactory(db, zFilename, 0, SQLITE_DEFAULT_CACHE_SIZE,
1.1020 + flags | SQLITE_OPEN_MAIN_DB,
1.1021 + &db->aDb[0].pBt);
1.1022 + if( rc!=SQLITE_OK ){
1.1023 + sqlite3Error(db, rc, 0);
1.1024 + db->magic = SQLITE_MAGIC_CLOSED;
1.1025 + goto opendb_out;
1.1026 + }
1.1027 + db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt);
1.1028 + db->aDb[1].pSchema = sqlite3SchemaGet(db, 0);
1.1029 +
1.1030 +
1.1031 + /* The default safety_level for the main database is 'full'; for the temp
1.1032 + ** database it is 'NONE'. This matches the pager layer defaults.
1.1033 + */
1.1034 + db->aDb[0].zName = "main";
1.1035 + db->aDb[0].safety_level = 3;
1.1036 +#ifndef SQLITE_OMIT_TEMPDB
1.1037 + db->aDb[1].zName = "temp";
1.1038 + db->aDb[1].safety_level = 1;
1.1039 +#endif
1.1040 +
1.1041 + db->magic = SQLITE_MAGIC_OPEN;
1.1042 + if( db->mallocFailed ){
1.1043 + goto opendb_out;
1.1044 + }
1.1045 +
1.1046 + /* Register all built-in functions, but do not attempt to read the
1.1047 + ** database schema yet. This is delayed until the first time the database
1.1048 + ** is accessed.
1.1049 + */
1.1050 + sqlite3Error(db, SQLITE_OK, 0);
1.1051 + sqlite3RegisterBuiltinFunctions(db);
1.1052 +
1.1053 + /* Load automatic extensions - extensions that have been registered
1.1054 + ** using the sqlite3_automatic_extension() API.
1.1055 + */
1.1056 + (void)sqlite3AutoLoadExtensions(db);
1.1057 + if( sqlite3_errcode(db)!=SQLITE_OK ){
1.1058 + goto opendb_out;
1.1059 + }
1.1060 +
1.1061 +#ifdef SQLITE_ENABLE_FTS1
1.1062 + if( !db->mallocFailed ){
1.1063 + extern int sqlite3Fts1Init(sqlite3*);
1.1064 + rc = sqlite3Fts1Init(db);
1.1065 + }
1.1066 +#endif
1.1067 +
1.1068 +#ifdef SQLITE_ENABLE_FTS2
1.1069 + if( !db->mallocFailed && rc==SQLITE_OK ){
1.1070 + extern int sqlite3Fts2Init(sqlite3*);
1.1071 + rc = sqlite3Fts2Init(db);
1.1072 + }
1.1073 +#endif
1.1074 +
1.1075 +#ifdef SQLITE_ENABLE_FTS3
1.1076 + if( !db->mallocFailed && rc==SQLITE_OK ){
1.1077 + extern int sqlite3Fts3Init(sqlite3*);
1.1078 + rc = sqlite3Fts3Init(db);
1.1079 + }
1.1080 +#endif
1.1081 +
1.1082 +#ifdef SQLITE_ENABLE_ICU
1.1083 + if( !db->mallocFailed && rc==SQLITE_OK ){
1.1084 + extern int sqlite3IcuInit(sqlite3*);
1.1085 + rc = sqlite3IcuInit(db);
1.1086 + }
1.1087 +#endif
1.1088 + sqlite3Error(db, rc, 0);
1.1089 +
1.1090 + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking
1.1091 + ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking
1.1092 + ** mode. Doing nothing at all also makes NORMAL the default.
1.1093 + */
1.1094 +#ifdef SQLITE_DEFAULT_LOCKING_MODE
1.1095 + db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE;
1.1096 + sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt),
1.1097 + SQLITE_DEFAULT_LOCKING_MODE);
1.1098 +#endif
1.1099 +
1.1100 +opendb_out:
1.1101 + if( db && db->mutex ){
1.1102 + sqlite3_mutex_leave(db->mutex);
1.1103 + }
1.1104 + if( SQLITE_NOMEM==(rc = sqlite3_errcode(db)) ){
1.1105 + sqlite3_close(db);
1.1106 + db = 0;
1.1107 + }
1.1108 + *ppDb = db;
1.1109 + return sqlite3ApiExit(0, rc);
1.1110 +}
1.1111 +
1.1112 +/*
1.1113 +** Open a new database handle.
1.1114 +*/
1.1115 +int sqlite3_open(
1.1116 + const char *zFilename,
1.1117 + sqlite3 **ppDb
1.1118 +){
1.1119 + return openDatabase(zFilename, ppDb,
1.1120 + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
1.1121 +}
1.1122 +int sqlite3_open_v2(
1.1123 + const char *filename, /* Database filename (UTF-8) */
1.1124 + sqlite3 **ppDb, /* OUT: SQLite db handle */
1.1125 + int flags, /* Flags */
1.1126 + const char *zVfs /* Name of VFS module to use */
1.1127 +){
1.1128 + return openDatabase(filename, ppDb, flags, zVfs);
1.1129 +}
1.1130 +
1.1131 +#ifndef SQLITE_OMIT_UTF16
1.1132 +/*
1.1133 +** Open a new database handle.
1.1134 +*/
1.1135 +int sqlite3_open16(
1.1136 + const void *zFilename,
1.1137 + sqlite3 **ppDb
1.1138 +){
1.1139 + char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */
1.1140 + sqlite3_value *pVal;
1.1141 + int rc = SQLITE_NOMEM;
1.1142 +
1.1143 + assert( zFilename );
1.1144 + assert( ppDb );
1.1145 + *ppDb = 0;
1.1146 + pVal = sqlite3ValueNew(0);
1.1147 + sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC);
1.1148 + zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8);
1.1149 + if( zFilename8 ){
1.1150 + rc = openDatabase(zFilename8, ppDb,
1.1151 + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
1.1152 + if( rc==SQLITE_OK && *ppDb ){
1.1153 + rc = sqlite3_exec(*ppDb, "PRAGMA encoding = 'UTF-16'", 0, 0, 0);
1.1154 + if( rc!=SQLITE_OK ){
1.1155 + sqlite3_close(*ppDb);
1.1156 + *ppDb = 0;
1.1157 + }
1.1158 + }
1.1159 + }
1.1160 + sqlite3ValueFree(pVal);
1.1161 +
1.1162 + return sqlite3ApiExit(0, rc);
1.1163 +}
1.1164 +#endif /* SQLITE_OMIT_UTF16 */
1.1165 +
1.1166 +/*
1.1167 +** Register a new collation sequence with the database handle db.
1.1168 +*/
1.1169 +int sqlite3_create_collation(
1.1170 + sqlite3* db,
1.1171 + const char *zName,
1.1172 + int enc,
1.1173 + void* pCtx,
1.1174 + int(*xCompare)(void*,int,const void*,int,const void*)
1.1175 +){
1.1176 + int rc;
1.1177 + sqlite3_mutex_enter(db->mutex);
1.1178 + assert( !db->mallocFailed );
1.1179 + rc = createCollation(db, zName, enc, pCtx, xCompare, 0);
1.1180 + rc = sqlite3ApiExit(db, rc);
1.1181 + sqlite3_mutex_leave(db->mutex);
1.1182 + return rc;
1.1183 +}
1.1184 +
1.1185 +/*
1.1186 +** Register a new collation sequence with the database handle db.
1.1187 +*/
1.1188 +int sqlite3_create_collation_v2(
1.1189 + sqlite3* db,
1.1190 + const char *zName,
1.1191 + int enc,
1.1192 + void* pCtx,
1.1193 + int(*xCompare)(void*,int,const void*,int,const void*),
1.1194 + void(*xDel)(void*)
1.1195 +){
1.1196 + int rc;
1.1197 + sqlite3_mutex_enter(db->mutex);
1.1198 + assert( !db->mallocFailed );
1.1199 + rc = createCollation(db, zName, enc, pCtx, xCompare, xDel);
1.1200 + rc = sqlite3ApiExit(db, rc);
1.1201 + sqlite3_mutex_leave(db->mutex);
1.1202 + return rc;
1.1203 +}
1.1204 +
1.1205 +#ifndef SQLITE_OMIT_UTF16
1.1206 +/*
1.1207 +** Register a new collation sequence with the database handle db.
1.1208 +*/
1.1209 +int sqlite3_create_collation16(
1.1210 + sqlite3* db,
1.1211 + const char *zName,
1.1212 + int enc,
1.1213 + void* pCtx,
1.1214 + int(*xCompare)(void*,int,const void*,int,const void*)
1.1215 +){
1.1216 + int rc = SQLITE_OK;
1.1217 + char *zName8;
1.1218 + sqlite3_mutex_enter(db->mutex);
1.1219 + assert( !db->mallocFailed );
1.1220 + zName8 = sqlite3Utf16to8(db, zName, -1);
1.1221 + if( zName8 ){
1.1222 + rc = createCollation(db, zName8, enc, pCtx, xCompare, 0);
1.1223 + sqlite3_free(zName8);
1.1224 + }
1.1225 + rc = sqlite3ApiExit(db, rc);
1.1226 + sqlite3_mutex_leave(db->mutex);
1.1227 + return rc;
1.1228 +}
1.1229 +#endif /* SQLITE_OMIT_UTF16 */
1.1230 +
1.1231 +/*
1.1232 +** Register a collation sequence factory callback with the database handle
1.1233 +** db. Replace any previously installed collation sequence factory.
1.1234 +*/
1.1235 +int sqlite3_collation_needed(
1.1236 + sqlite3 *db,
1.1237 + void *pCollNeededArg,
1.1238 + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*)
1.1239 +){
1.1240 + if( sqlite3SafetyCheck(db) ){
1.1241 + return SQLITE_MISUSE;
1.1242 + }
1.1243 + sqlite3_mutex_enter(db->mutex);
1.1244 + db->xCollNeeded = xCollNeeded;
1.1245 + db->xCollNeeded16 = 0;
1.1246 + db->pCollNeededArg = pCollNeededArg;
1.1247 + sqlite3_mutex_leave(db->mutex);
1.1248 + return SQLITE_OK;
1.1249 +}
1.1250 +
1.1251 +#ifndef SQLITE_OMIT_UTF16
1.1252 +/*
1.1253 +** Register a collation sequence factory callback with the database handle
1.1254 +** db. Replace any previously installed collation sequence factory.
1.1255 +*/
1.1256 +int sqlite3_collation_needed16(
1.1257 + sqlite3 *db,
1.1258 + void *pCollNeededArg,
1.1259 + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*)
1.1260 +){
1.1261 + if( sqlite3SafetyCheck(db) ){
1.1262 + return SQLITE_MISUSE;
1.1263 + }
1.1264 + sqlite3_mutex_enter(db->mutex);
1.1265 + db->xCollNeeded = 0;
1.1266 + db->xCollNeeded16 = xCollNeeded16;
1.1267 + db->pCollNeededArg = pCollNeededArg;
1.1268 + sqlite3_mutex_leave(db->mutex);
1.1269 + return SQLITE_OK;
1.1270 +}
1.1271 +#endif /* SQLITE_OMIT_UTF16 */
1.1272 +
1.1273 +#ifndef SQLITE_OMIT_GLOBALRECOVER
1.1274 +/*
1.1275 +** This function is now an anachronism. It used to be used to recover from a
1.1276 +** malloc() failure, but SQLite now does this automatically.
1.1277 +*/
1.1278 +int sqlite3_global_recover(){
1.1279 + return SQLITE_OK;
1.1280 +}
1.1281 +#endif
1.1282 +
1.1283 +/*
1.1284 +** Test to see whether or not the database connection is in autocommit
1.1285 +** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on
1.1286 +** by default. Autocommit is disabled by a BEGIN statement and reenabled
1.1287 +** by the next COMMIT or ROLLBACK.
1.1288 +**
1.1289 +******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ******
1.1290 +*/
1.1291 +int sqlite3_get_autocommit(sqlite3 *db){
1.1292 + return db->autoCommit;
1.1293 +}
1.1294 +
1.1295 +#ifdef SQLITE_DEBUG
1.1296 +/*
1.1297 +** The following routine is subtituted for constant SQLITE_CORRUPT in
1.1298 +** debugging builds. This provides a way to set a breakpoint for when
1.1299 +** corruption is first detected.
1.1300 +*/
1.1301 +int sqlite3Corrupt(void){
1.1302 + return SQLITE_CORRUPT;
1.1303 +}
1.1304 +#endif
1.1305 +
1.1306 +/*
1.1307 +** This is a convenience routine that makes sure that all thread-specific
1.1308 +** data for this thread has been deallocated.
1.1309 +**
1.1310 +** SQLite no longer uses thread-specific data so this routine is now a
1.1311 +** no-op. It is retained for historical compatibility.
1.1312 +*/
1.1313 +void sqlite3_thread_cleanup(void){
1.1314 +}
1.1315 +
1.1316 +/*
1.1317 +** Return meta information about a specific column of a database table.
1.1318 +** See comment in sqlite3.h (sqlite.h.in) for details.
1.1319 +*/
1.1320 +#ifdef SQLITE_ENABLE_COLUMN_METADATA
1.1321 +int sqlite3_table_column_metadata(
1.1322 + sqlite3 *db, /* Connection handle */
1.1323 + const char *zDbName, /* Database name or NULL */
1.1324 + const char *zTableName, /* Table name */
1.1325 + const char *zColumnName, /* Column name */
1.1326 + char const **pzDataType, /* OUTPUT: Declared data type */
1.1327 + char const **pzCollSeq, /* OUTPUT: Collation sequence name */
1.1328 + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */
1.1329 + int *pPrimaryKey, /* OUTPUT: True if column part of PK */
1.1330 + int *pAutoinc /* OUTPUT: True if colums is auto-increment */
1.1331 +){
1.1332 + int rc;
1.1333 + char *zErrMsg = 0;
1.1334 + Table *pTab = 0;
1.1335 + Column *pCol = 0;
1.1336 + int iCol;
1.1337 +
1.1338 + char const *zDataType = 0;
1.1339 + char const *zCollSeq = 0;
1.1340 + int notnull = 0;
1.1341 + int primarykey = 0;
1.1342 + int autoinc = 0;
1.1343 +
1.1344 + /* Ensure the database schema has been loaded */
1.1345 + if( sqlite3SafetyOn(db) ){
1.1346 + return SQLITE_MISUSE;
1.1347 + }
1.1348 + sqlite3_mutex_enter(db->mutex);
1.1349 + rc = sqlite3Init(db, &zErrMsg);
1.1350 + if( SQLITE_OK!=rc ){
1.1351 + goto error_out;
1.1352 + }
1.1353 +
1.1354 + /* Locate the table in question */
1.1355 + pTab = sqlite3FindTable(db, zTableName, zDbName);
1.1356 + if( !pTab || pTab->pSelect ){
1.1357 + pTab = 0;
1.1358 + goto error_out;
1.1359 + }
1.1360 +
1.1361 + /* Find the column for which info is requested */
1.1362 + if( sqlite3IsRowid(zColumnName) ){
1.1363 + iCol = pTab->iPKey;
1.1364 + if( iCol>=0 ){
1.1365 + pCol = &pTab->aCol[iCol];
1.1366 + }
1.1367 + }else{
1.1368 + for(iCol=0; iCol<pTab->nCol; iCol++){
1.1369 + pCol = &pTab->aCol[iCol];
1.1370 + if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){
1.1371 + break;
1.1372 + }
1.1373 + }
1.1374 + if( iCol==pTab->nCol ){
1.1375 + pTab = 0;
1.1376 + goto error_out;
1.1377 + }
1.1378 + }
1.1379 +
1.1380 + /* The following block stores the meta information that will be returned
1.1381 + ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey
1.1382 + ** and autoinc. At this point there are two possibilities:
1.1383 + **
1.1384 + ** 1. The specified column name was rowid", "oid" or "_rowid_"
1.1385 + ** and there is no explicitly declared IPK column.
1.1386 + **
1.1387 + ** 2. The table is not a view and the column name identified an
1.1388 + ** explicitly declared column. Copy meta information from *pCol.
1.1389 + */
1.1390 + if( pCol ){
1.1391 + zDataType = pCol->zType;
1.1392 + zCollSeq = pCol->zColl;
1.1393 + notnull = (pCol->notNull?1:0);
1.1394 + primarykey = (pCol->isPrimKey?1:0);
1.1395 + autoinc = ((pTab->iPKey==iCol && pTab->autoInc)?1:0);
1.1396 + }else{
1.1397 + zDataType = "INTEGER";
1.1398 + primarykey = 1;
1.1399 + }
1.1400 + if( !zCollSeq ){
1.1401 + zCollSeq = "BINARY";
1.1402 + }
1.1403 +
1.1404 +error_out:
1.1405 + if( sqlite3SafetyOff(db) ){
1.1406 + rc = SQLITE_MISUSE;
1.1407 + }
1.1408 +
1.1409 + /* Whether the function call succeeded or failed, set the output parameters
1.1410 + ** to whatever their local counterparts contain. If an error did occur,
1.1411 + ** this has the effect of zeroing all output parameters.
1.1412 + */
1.1413 + if( pzDataType ) *pzDataType = zDataType;
1.1414 + if( pzCollSeq ) *pzCollSeq = zCollSeq;
1.1415 + if( pNotNull ) *pNotNull = notnull;
1.1416 + if( pPrimaryKey ) *pPrimaryKey = primarykey;
1.1417 + if( pAutoinc ) *pAutoinc = autoinc;
1.1418 +
1.1419 + if( SQLITE_OK==rc && !pTab ){
1.1420 + sqlite3SetString(&zErrMsg, "no such table column: ", zTableName, ".",
1.1421 + zColumnName, 0);
1.1422 + rc = SQLITE_ERROR;
1.1423 + }
1.1424 + sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg);
1.1425 + sqlite3_free(zErrMsg);
1.1426 + rc = sqlite3ApiExit(db, rc);
1.1427 + sqlite3_mutex_leave(db->mutex);
1.1428 + return rc;
1.1429 +}
1.1430 +#endif
1.1431 +
1.1432 +/*
1.1433 +** Sleep for a little while. Return the amount of time slept.
1.1434 +*/
1.1435 +int sqlite3_sleep(int ms){
1.1436 + sqlite3_vfs *pVfs;
1.1437 + int rc;
1.1438 + pVfs = sqlite3_vfs_find(0);
1.1439 +
1.1440 + /* This function works in milliseconds, but the underlying OsSleep()
1.1441 + ** API uses microseconds. Hence the 1000's.
1.1442 + */
1.1443 + rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000);
1.1444 + return rc;
1.1445 +}
1.1446 +
1.1447 +/*
1.1448 +** Enable or disable the extended result codes.
1.1449 +*/
1.1450 +int sqlite3_extended_result_codes(sqlite3 *db, int onoff){
1.1451 + sqlite3_mutex_enter(db->mutex);
1.1452 + db->errMask = onoff ? 0xffffffff : 0xff;
1.1453 + sqlite3_mutex_leave(db->mutex);
1.1454 + return SQLITE_OK;
1.1455 +}
1.1456 +
1.1457 +/*
1.1458 +** Invoke the xFileControl method on a particular database.
1.1459 +*/
1.1460 +int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){
1.1461 + int rc = SQLITE_ERROR;
1.1462 + int iDb;
1.1463 + sqlite3_mutex_enter(db->mutex);
1.1464 + if( zDbName==0 ){
1.1465 + iDb = 0;
1.1466 + }else{
1.1467 + for(iDb=0; iDb<db->nDb; iDb++){
1.1468 + if( strcmp(db->aDb[iDb].zName, zDbName)==0 ) break;
1.1469 + }
1.1470 + }
1.1471 + if( iDb<db->nDb ){
1.1472 + Btree *pBtree = db->aDb[iDb].pBt;
1.1473 + if( pBtree ){
1.1474 + Pager *pPager;
1.1475 + sqlite3BtreeEnter(pBtree);
1.1476 + pPager = sqlite3BtreePager(pBtree);
1.1477 + if( pPager ){
1.1478 + sqlite3_file *fd = sqlite3PagerFile(pPager);
1.1479 + if( fd ){
1.1480 + rc = sqlite3OsFileControl(fd, op, pArg);
1.1481 + }
1.1482 + }
1.1483 + sqlite3BtreeLeave(pBtree);
1.1484 + }
1.1485 + }
1.1486 + sqlite3_mutex_leave(db->mutex);
1.1487 + return rc;
1.1488 +}