⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 最新的sqlite3.6.2源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
** If the invoked function returns non-zero, then the commit becomes a** rollback.*/void *sqlite3_commit_hook(  sqlite3 *db,              /* Attach the hook to this database */  int (*xCallback)(void*),  /* Function to invoke on each commit */  void *pArg                /* Argument to the function */){  void *pOld;  sqlite3_mutex_enter(db->mutex);  pOld = db->pCommitArg;  db->xCommitCallback = xCallback;  db->pCommitArg = pArg;  sqlite3_mutex_leave(db->mutex);  return pOld;}/*** Register a callback to be invoked each time a row is updated,** inserted or deleted using this database connection.*/void *sqlite3_update_hook(  sqlite3 *db,              /* Attach the hook to this database */  void (*xCallback)(void*,int,char const *,char const *,sqlite_int64),  void *pArg                /* Argument to the function */){  void *pRet;  sqlite3_mutex_enter(db->mutex);  pRet = db->pUpdateArg;  db->xUpdateCallback = xCallback;  db->pUpdateArg = pArg;  sqlite3_mutex_leave(db->mutex);  return pRet;}/*** Register a callback to be invoked each time a transaction is rolled** back by this database connection.*/void *sqlite3_rollback_hook(  sqlite3 *db,              /* Attach the hook to this database */  void (*xCallback)(void*), /* Callback function */  void *pArg                /* Argument to the function */){  void *pRet;  sqlite3_mutex_enter(db->mutex);  pRet = db->pRollbackArg;  db->xRollbackCallback = xCallback;  db->pRollbackArg = pArg;  sqlite3_mutex_leave(db->mutex);  return pRet;}/*** This routine is called to create a connection to a database BTree** driver.  If zFilename is the name of a file, then that file is** opened and used.  If zFilename is the magic name ":memory:" then** the database is stored in memory (and is thus forgotten as soon as** the connection is closed.)  If zFilename is NULL then the database** is a "virtual" database for transient use only and is deleted as** soon as the connection is closed.**** A virtual database can be either a disk file (that is automatically** deleted when the file is closed) or it an be held entirely in memory,** depending on the values of the SQLITE_TEMP_STORE compile-time macro and the** db->temp_store variable, according to the following chart:****   SQLITE_TEMP_STORE     db->temp_store     Location of temporary database**   -----------------     --------------     ------------------------------**   0                     any                file**   1                     1                  file**   1                     2                  memory**   1                     0                  file**   2                     1                  file**   2                     2                  memory**   2                     0                  memory**   3                     any                memory*/int sqlite3BtreeFactory(  const sqlite3 *db,        /* Main database when opening aux otherwise 0 */  const char *zFilename,    /* Name of the file containing the BTree database */  int omitJournal,          /* if TRUE then do not journal this file */  int nCache,               /* How many pages in the page cache */  int vfsFlags,             /* Flags passed through to vfsOpen */  Btree **ppBtree           /* Pointer to new Btree object written here */){  int btFlags = 0;  int rc;    assert( sqlite3_mutex_held(db->mutex) );  assert( ppBtree != 0);  if( omitJournal ){    btFlags |= BTREE_OMIT_JOURNAL;  }  if( db->flags & SQLITE_NoReadlock ){    btFlags |= BTREE_NO_READLOCK;  }  if( zFilename==0 ){#if SQLITE_TEMP_STORE==0    /* Do nothing */#endif#ifndef SQLITE_OMIT_MEMORYDB#if SQLITE_TEMP_STORE==1    if( db->temp_store==2 ) zFilename = ":memory:";#endif#if SQLITE_TEMP_STORE==2    if( db->temp_store!=1 ) zFilename = ":memory:";#endif#if SQLITE_TEMP_STORE==3    zFilename = ":memory:";#endif#endif /* SQLITE_OMIT_MEMORYDB */  }  if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (zFilename==0 || *zFilename==0) ){    vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB;  }  rc = sqlite3BtreeOpen(zFilename, (sqlite3 *)db, ppBtree, btFlags, vfsFlags);  /* If the B-Tree was successfully opened, set the pager-cache size to the  ** default value. Except, if the call to BtreeOpen() returned a handle  ** open on an existing shared pager-cache, do not change the pager-cache   ** size.  */  if( rc==SQLITE_OK && 0==sqlite3BtreeSchema(*ppBtree, 0, 0) ){    sqlite3BtreeSetCacheSize(*ppBtree, nCache);  }  return rc;}/*** Return UTF-8 encoded English language explanation of the most recent** error.*/const char *sqlite3_errmsg(sqlite3 *db){  const char *z;  if( !db ){    return sqlite3ErrStr(SQLITE_NOMEM);  }  if( !sqlite3SafetyCheckSickOrOk(db) ){    return sqlite3ErrStr(SQLITE_MISUSE);  }  sqlite3_mutex_enter(db->mutex);  assert( !db->mallocFailed );  z = (char*)sqlite3_value_text(db->pErr);  assert( !db->mallocFailed );  if( z==0 ){    z = sqlite3ErrStr(db->errCode);  }  sqlite3_mutex_leave(db->mutex);  return z;}#ifndef SQLITE_OMIT_UTF16/*** Return UTF-16 encoded English language explanation of the most recent** error.*/const void *sqlite3_errmsg16(sqlite3 *db){  /* Because all the characters in the string are in the unicode  ** range 0x00-0xFF, if we pad the big-endian string with a   ** zero byte, we can obtain the little-endian string with  ** &big_endian[1].  */  static const char outOfMemBe[] = {    0, 'o', 0, 'u', 0, 't', 0, ' ',     0, 'o', 0, 'f', 0, ' ',     0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0  };  static const char misuseBe [] = {    0, 'l', 0, 'i', 0, 'b', 0, 'r', 0, 'a', 0, 'r', 0, 'y', 0, ' ',     0, 'r', 0, 'o', 0, 'u', 0, 't', 0, 'i', 0, 'n', 0, 'e', 0, ' ',     0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ',     0, 'o', 0, 'u', 0, 't', 0, ' ',     0, 'o', 0, 'f', 0, ' ',     0, 's', 0, 'e', 0, 'q', 0, 'u', 0, 'e', 0, 'n', 0, 'c', 0, 'e', 0, 0, 0  };  const void *z;  if( !db ){    return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]);  }  if( !sqlite3SafetyCheckSickOrOk(db) ){    return (void *)(&misuseBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]);  }  sqlite3_mutex_enter(db->mutex);  assert( !db->mallocFailed );  z = sqlite3_value_text16(db->pErr);  if( z==0 ){    sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode),         SQLITE_UTF8, SQLITE_STATIC);    z = sqlite3_value_text16(db->pErr);  }  /* A malloc() may have failed within the call to sqlite3_value_text16()  ** above. If this is the case, then the db->mallocFailed flag needs to  ** be cleared before returning. Do this directly, instead of via  ** sqlite3ApiExit(), to avoid setting the database handle error message.  */  db->mallocFailed = 0;  sqlite3_mutex_leave(db->mutex);  return z;}#endif /* SQLITE_OMIT_UTF16 *//*** Return the most recent error code generated by an SQLite routine. If NULL is** passed to this function, we assume a malloc() failed during sqlite3_open().*/int sqlite3_errcode(sqlite3 *db){  if( db && !sqlite3SafetyCheckSickOrOk(db) ){    return SQLITE_MISUSE;  }  if( !db || db->mallocFailed ){    return SQLITE_NOMEM;  }  return db->errCode & db->errMask;}/*** Create a new collating function for database "db".  The name is zName** and the encoding is enc.*/static int createCollation(  sqlite3* db,   const char *zName,   int enc,   void* pCtx,  int(*xCompare)(void*,int,const void*,int,const void*),  void(*xDel)(void*)){  CollSeq *pColl;  int enc2;  int nName;    assert( sqlite3_mutex_held(db->mutex) );  /* If SQLITE_UTF16 is specified as the encoding type, transform this  ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the  ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.  */  enc2 = enc & ~SQLITE_UTF16_ALIGNED;  if( enc2==SQLITE_UTF16 ){    enc2 = SQLITE_UTF16NATIVE;  }  if( (enc2&~3)!=0 ){    return SQLITE_MISUSE;  }  /* Check if this call is removing or replacing an existing collation   ** sequence. If so, and there are active VMs, return busy. If there  ** are no active VMs, invalidate any pre-compiled statements.  */  nName = sqlite3Strlen(db, zName);  pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, nName, 0);  if( pColl && pColl->xCmp ){    if( db->activeVdbeCnt ){      sqlite3Error(db, SQLITE_BUSY,         "Unable to delete/modify collation sequence due to active statements");      return SQLITE_BUSY;    }    sqlite3ExpirePreparedStatements(db);    /* If collation sequence pColl was created directly by a call to    ** sqlite3_create_collation, and not generated by synthCollSeq(),    ** then any copies made by synthCollSeq() need to be invalidated.    ** Also, collation destructor - CollSeq.xDel() - function may need    ** to be called.    */     if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){      CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, nName);      int j;      for(j=0; j<3; j++){        CollSeq *p = &aColl[j];        if( p->enc==pColl->enc ){          if( p->xDel ){            p->xDel(p->pUser);          }          p->xCmp = 0;        }      }    }  }  pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, nName, 1);  if( pColl ){    pColl->xCmp = xCompare;    pColl->pUser = pCtx;    pColl->xDel = xDel;    pColl->enc = enc2 | (enc & SQLITE_UTF16_ALIGNED);  }  sqlite3Error(db, SQLITE_OK, 0);  return SQLITE_OK;}/*** This array defines hard upper bounds on limit values.  The** initializer must be kept in sync with the SQLITE_LIMIT_*** #defines in sqlite3.h.*/static const int aHardLimit[] = {  SQLITE_MAX_LENGTH,  SQLITE_MAX_SQL_LENGTH,  SQLITE_MAX_COLUMN,  SQLITE_MAX_EXPR_DEPTH,  SQLITE_MAX_COMPOUND_SELECT,  SQLITE_MAX_VDBE_OP,  SQLITE_MAX_FUNCTION_ARG,  SQLITE_MAX_ATTACHED,  SQLITE_MAX_LIKE_PATTERN_LENGTH,  SQLITE_MAX_VARIABLE_NUMBER,};/*** Make sure the hard limits are set to reasonable values*/#if SQLITE_MAX_LENGTH<100# error SQLITE_MAX_LENGTH must be at least 100#endif#if SQLITE_MAX_SQL_LENGTH<100# error SQLITE_MAX_SQL_LENGTH must be at least 100#endif#if SQLITE_MAX_SQL_LENGTH>SQLITE_MAX_LENGTH# error SQLITE_MAX_SQL_LENGTH must not be greater than SQLITE_MAX_LENGTH#endif#if SQLITE_MAX_COMPOUND_SELECT<2# error SQLITE_MAX_COMPOUND_SELECT must be at least 2#endif#if SQLITE_MAX_VDBE_OP<40# error SQLITE_MAX_VDBE_OP must be at least 40#endif#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>127# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 127#endif#if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>30# error SQLITE_MAX_ATTACHED must be between 0 and 30#endif#if SQLITE_MAX_LIKE_PATTERN_LENGTH<1# error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1#endif#if SQLITE_MAX_VARIABLE_NUMBER<1# error SQLITE_MAX_VARIABLE_NUMBER must be at least 1#endif#if SQLITE_MAX_COLUMN>32767# error SQLITE_MAX_COLUMN must not exceed 32767#endif/*** Change the value of a limit.  Report the old value.** If an invalid limit index is supplied, report -1.** Make no changes but still report the old value if the** new limit is negative.**** A new lower limit does not shrink existing constructs.** It merely prevents new constructs that exceed the limit** from forming.*/int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){  int oldLimit;  if( limitId<0 || limitId>=SQLITE_N_LIMIT ){    return -1;  }  oldLimit = db->aLimit[limitId];  if( newLimit>=0 ){    if( newLimit>aHardLimit[limitId] ){      newLimit = aHardLimit[limitId];    }    db->aLimit[limitId] = newLimit;  }  return oldLimit;}/*** This routine does the work of opening a database on behalf of** sqlite3_open() and sqlite3_open16(). The database filename "zFilename"  ** is UTF-8 encoded.*/static int openDatabase(  const char *zFilename, /* Database filename UTF-8 encoded */  sqlite3 **ppDb,        /* OUT: Returned database handle */  unsigned flags,        /* Operational flags */  const char *zVfs       /* Name of the VFS to use */){  sqlite3 *db;  int rc;  CollSeq *pColl;  int isThreadsafe = 1;#ifndef SQLITE_OMIT_AUTOINIT  rc = sqlite3_initialize();  if( rc ) return rc;#endif  if( flags&SQLITE_OPEN_NOMUTEX ){    isThreadsafe = 0;  }  /* Remove harmful bits from the flags parameter */  flags &=  ~( SQLITE_OPEN_DELETEONCLOSE |               SQLITE_OPEN_MAIN_DB |               SQLITE_OPEN_TEMP_DB |                SQLITE_OPEN_TRANSIENT_DB |                SQLITE_OPEN_MAIN_JOURNAL |                SQLITE_OPEN_TEMP_JOURNAL |                SQLITE_OPEN_SUBJOURNAL |                SQLITE_OPEN_MASTER_JOURNAL |               SQLITE_OPEN_NOMUTEX             );  /* Allocate the sqlite data structure */  db = sqlite3MallocZero( sizeof(sqlite3) );  if( db==0 ) goto opendb_out;  if( sqlite3Config.bFullMutex && isThreadsafe ){    db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);    if( db->mutex==0 ){      sqlite3_free(db);      db = 0;      goto opendb_out;    }  }  sqlite3_mutex_enter(db->mutex);  db->errMask = 0xff;  db->priorNewRowid = 0;  db->nDb = 2;  db->magic = SQLITE_MAGIC_BUSY;  db->aDb = db->aDbStatic;  assert( sizeof(db->aLimit)==sizeof(aHardLimit) );  memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit));  db->autoCommit = 1;  db->nextAutovac = -1;  db->nextPagesize = 0;  db->flags |= SQLITE_ShortColNames#if SQLITE_DEFAULT_FILE_FORMAT<4                 | SQLITE_LegacyFileFmt#endif#ifdef SQLITE_ENABLE_LOAD_EXTENSION                 | SQLITE_LoadExtension#endif      ;  sqlite3HashInit(&db->aCollSeq, SQLITE_HASH_STRING, 0);#ifndef SQLITE_OMIT_VIRTUALTABLE  sqlite3HashInit(&db->aModule, SQLITE_HASH_STRING, 0);#endif  db->pVfs = sqlite3_vfs_find(zVfs);  if( !db->pVfs ){    rc = SQLITE_ERROR;    sqlite3Error(db, rc, "no such vfs: %s", zVfs);    goto opendb_out;  }  /* Add the default collation sequence BINARY. BINARY works for both UTF-8  ** and UTF-16, so add a version for each to avoid any unnecessary  ** conversions. The only error that can occur here is a malloc() failure.  */  createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0);  createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0);  createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0);  createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0);  if( db->mallocFailed ){    goto opendb_out;  }  db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0);  assert( db->pDfltColl!=0 );  /* Also add a UTF-8 case-insensitive collation sequence. */  createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0);  /* Set flags on the built-in collating sequences */  db->pDfltColl->type = SQLITE_COLL_BINARY;  pColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "NOCASE", 6, 0);  if( pColl ){    pColl->type = SQLITE_COLL_NOCASE;  }  /* Open the backend database driver */  db->openFlags = flags;  rc = sqlite3BtreeFactory(db, zFilename, 0, SQLITE_DEFAULT_CACHE_SIZE,                            flags | SQLITE_OPEN_MAIN_DB,                           &db->aDb[0].pBt);  if( rc!=SQLITE_OK ){    sqlite3Error(db, rc, 0);    goto opendb_out;  }  db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt);  db->aDb[1].pSchema = sqlite3SchemaGet(db, 0);  /* The default safety_level for the main database is 'full'; for the temp  ** database it is 'NONE'. This matches the pager layer defaults.    */  db->aDb[0].zName = "main";  db->aDb[0].safety_level = 3;#ifndef SQLITE_OMIT_TEMPDB  db->aDb[1].zName = "temp";  db->aDb[1].safety_level = 1;#endif  db->magic = SQLITE_MAGIC_OPEN;  if( db->mallocFailed ){    goto opendb_out;  }  /* Register all built-in functions, but do not attempt to read the  ** database schema yet. This is delayed until the first time the database  ** is accessed.  */  sqlite3Error(db, SQLITE_OK, 0);  sqlite3RegisterBuiltinFunctions(db);  /* Load automatic extensions - extensions that have been registered  ** using the sqlite3_automatic_extension() API.  */  (void)sqlite3AutoLoadExtensions(db);  if( sqlite3_errcode(db)!=SQLITE_OK ){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -