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

📄 main.c

📁 最新的sqlite3.6.2源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
    goto opendb_out;  }#ifdef SQLITE_ENABLE_FTS1  if( !db->mallocFailed ){    extern int sqlite3Fts1Init(sqlite3*);    rc = sqlite3Fts1Init(db);  }#endif#ifdef SQLITE_ENABLE_FTS2  if( !db->mallocFailed && rc==SQLITE_OK ){    extern int sqlite3Fts2Init(sqlite3*);    rc = sqlite3Fts2Init(db);  }#endif#ifdef SQLITE_ENABLE_FTS3  if( !db->mallocFailed && rc==SQLITE_OK ){    rc = sqlite3Fts3Init(db);  }#endif#ifdef SQLITE_ENABLE_ICU  if( !db->mallocFailed && rc==SQLITE_OK ){    extern int sqlite3IcuInit(sqlite3*);    rc = sqlite3IcuInit(db);  }#endif#ifdef SQLITE_ENABLE_RTREE  if( !db->mallocFailed && rc==SQLITE_OK){    rc = sqlite3RtreeInit(db);  }#endif  sqlite3Error(db, rc, 0);  /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking  ** mode.  -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking  ** mode.  Doing nothing at all also makes NORMAL the default.  */#ifdef SQLITE_DEFAULT_LOCKING_MODE  db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE;  sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt),                          SQLITE_DEFAULT_LOCKING_MODE);#endif  /* Enable the lookaside-malloc subsystem */  setupLookaside(db, 0, sqlite3Config.szLookaside, sqlite3Config.nLookaside);opendb_out:  if( db ){    assert( db->mutex!=0 || isThreadsafe==0 || sqlite3Config.bFullMutex==0 );    sqlite3_mutex_leave(db->mutex);  }  rc = sqlite3_errcode(db);  if( rc==SQLITE_NOMEM ){    sqlite3_close(db);    db = 0;  }else if( rc!=SQLITE_OK ){    db->magic = SQLITE_MAGIC_SICK;  }  *ppDb = db;  return sqlite3ApiExit(0, rc);}/*** Open a new database handle.*/int sqlite3_open(  const char *zFilename,   sqlite3 **ppDb ){  return openDatabase(zFilename, ppDb,                      SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);}int sqlite3_open_v2(  const char *filename,   /* Database filename (UTF-8) */  sqlite3 **ppDb,         /* OUT: SQLite db handle */  int flags,              /* Flags */  const char *zVfs        /* Name of VFS module to use */){  return openDatabase(filename, ppDb, flags, zVfs);}#ifndef SQLITE_OMIT_UTF16/*** Open a new database handle.*/int sqlite3_open16(  const void *zFilename,   sqlite3 **ppDb){  char const *zFilename8;   /* zFilename encoded in UTF-8 instead of UTF-16 */  sqlite3_value *pVal;  int rc;  assert( zFilename );  assert( ppDb );  *ppDb = 0;#ifndef SQLITE_OMIT_AUTOINIT  rc = sqlite3_initialize();  if( rc ) return rc;#endif  pVal = sqlite3ValueNew(0);  sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC);  zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8);  if( zFilename8 ){    rc = openDatabase(zFilename8, ppDb,                      SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);    assert( *ppDb || rc==SQLITE_NOMEM );    if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){      ENC(*ppDb) = SQLITE_UTF16NATIVE;    }  }else{    rc = SQLITE_NOMEM;  }  sqlite3ValueFree(pVal);  return sqlite3ApiExit(0, rc);}#endif /* SQLITE_OMIT_UTF16 *//*** Register a new collation sequence with the database handle db.*/int sqlite3_create_collation(  sqlite3* db,   const char *zName,   int enc,   void* pCtx,  int(*xCompare)(void*,int,const void*,int,const void*)){  int rc;  sqlite3_mutex_enter(db->mutex);  assert( !db->mallocFailed );  rc = createCollation(db, zName, enc, pCtx, xCompare, 0);  rc = sqlite3ApiExit(db, rc);  sqlite3_mutex_leave(db->mutex);  return rc;}/*** Register a new collation sequence with the database handle db.*/int sqlite3_create_collation_v2(  sqlite3* db,   const char *zName,   int enc,   void* pCtx,  int(*xCompare)(void*,int,const void*,int,const void*),  void(*xDel)(void*)){  int rc;  sqlite3_mutex_enter(db->mutex);  assert( !db->mallocFailed );  rc = createCollation(db, zName, enc, pCtx, xCompare, xDel);  rc = sqlite3ApiExit(db, rc);  sqlite3_mutex_leave(db->mutex);  return rc;}#ifndef SQLITE_OMIT_UTF16/*** Register a new collation sequence with the database handle db.*/int sqlite3_create_collation16(  sqlite3* db,   const void *zName,  int enc,   void* pCtx,  int(*xCompare)(void*,int,const void*,int,const void*)){  int rc = SQLITE_OK;  char *zName8;  sqlite3_mutex_enter(db->mutex);  assert( !db->mallocFailed );  zName8 = sqlite3Utf16to8(db, zName, -1);  if( zName8 ){    rc = createCollation(db, zName8, enc, pCtx, xCompare, 0);    sqlite3DbFree(db, zName8);  }  rc = sqlite3ApiExit(db, rc);  sqlite3_mutex_leave(db->mutex);  return rc;}#endif /* SQLITE_OMIT_UTF16 *//*** Register a collation sequence factory callback with the database handle** db. Replace any previously installed collation sequence factory.*/int sqlite3_collation_needed(  sqlite3 *db,   void *pCollNeededArg,   void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*)){  sqlite3_mutex_enter(db->mutex);  db->xCollNeeded = xCollNeeded;  db->xCollNeeded16 = 0;  db->pCollNeededArg = pCollNeededArg;  sqlite3_mutex_leave(db->mutex);  return SQLITE_OK;}#ifndef SQLITE_OMIT_UTF16/*** Register a collation sequence factory callback with the database handle** db. Replace any previously installed collation sequence factory.*/int sqlite3_collation_needed16(  sqlite3 *db,   void *pCollNeededArg,   void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*)){  sqlite3_mutex_enter(db->mutex);  db->xCollNeeded = 0;  db->xCollNeeded16 = xCollNeeded16;  db->pCollNeededArg = pCollNeededArg;  sqlite3_mutex_leave(db->mutex);  return SQLITE_OK;}#endif /* SQLITE_OMIT_UTF16 */#ifndef SQLITE_OMIT_GLOBALRECOVER/*** This function is now an anachronism. It used to be used to recover from a** malloc() failure, but SQLite now does this automatically.*/int sqlite3_global_recover(void){  return SQLITE_OK;}#endif/*** Test to see whether or not the database connection is in autocommit** mode.  Return TRUE if it is and FALSE if not.  Autocommit mode is on** by default.  Autocommit is disabled by a BEGIN statement and reenabled** by the next COMMIT or ROLLBACK.********* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE *******/int sqlite3_get_autocommit(sqlite3 *db){  return db->autoCommit;}#ifdef SQLITE_DEBUG/*** The following routine is subtituted for constant SQLITE_CORRUPT in** debugging builds.  This provides a way to set a breakpoint for when** corruption is first detected.*/int sqlite3Corrupt(void){  return SQLITE_CORRUPT;}#endif/*** This is a convenience routine that makes sure that all thread-specific** data for this thread has been deallocated.**** SQLite no longer uses thread-specific data so this routine is now a** no-op.  It is retained for historical compatibility.*/void sqlite3_thread_cleanup(void){}/*** Return meta information about a specific column of a database table.** See comment in sqlite3.h (sqlite.h.in) for details.*/#ifdef SQLITE_ENABLE_COLUMN_METADATAint sqlite3_table_column_metadata(  sqlite3 *db,                /* Connection handle */  const char *zDbName,        /* Database name or NULL */  const char *zTableName,     /* Table name */  const char *zColumnName,    /* Column name */  char const **pzDataType,    /* OUTPUT: Declared data type */  char const **pzCollSeq,     /* OUTPUT: Collation sequence name */  int *pNotNull,              /* OUTPUT: True if NOT NULL constraint exists */  int *pPrimaryKey,           /* OUTPUT: True if column part of PK */  int *pAutoinc               /* OUTPUT: True if column is auto-increment */){  int rc;  char *zErrMsg = 0;  Table *pTab = 0;  Column *pCol = 0;  int iCol;  char const *zDataType = 0;  char const *zCollSeq = 0;  int notnull = 0;  int primarykey = 0;  int autoinc = 0;  /* Ensure the database schema has been loaded */  sqlite3_mutex_enter(db->mutex);  (void)sqlite3SafetyOn(db);  sqlite3BtreeEnterAll(db);  rc = sqlite3Init(db, &zErrMsg);  sqlite3BtreeLeaveAll(db);  if( SQLITE_OK!=rc ){    goto error_out;  }  /* Locate the table in question */  pTab = sqlite3FindTable(db, zTableName, zDbName);  if( !pTab || pTab->pSelect ){    pTab = 0;    goto error_out;  }  /* Find the column for which info is requested */  if( sqlite3IsRowid(zColumnName) ){    iCol = pTab->iPKey;    if( iCol>=0 ){      pCol = &pTab->aCol[iCol];    }  }else{    for(iCol=0; iCol<pTab->nCol; iCol++){      pCol = &pTab->aCol[iCol];      if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){        break;      }    }    if( iCol==pTab->nCol ){      pTab = 0;      goto error_out;    }  }  /* The following block stores the meta information that will be returned  ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey  ** and autoinc. At this point there are two possibilities:  **   **     1. The specified column name was rowid", "oid" or "_rowid_"   **        and there is no explicitly declared IPK column.   **  **     2. The table is not a view and the column name identified an   **        explicitly declared column. Copy meta information from *pCol.  */   if( pCol ){    zDataType = pCol->zType;    zCollSeq = pCol->zColl;    notnull = pCol->notNull!=0;    primarykey  = pCol->isPrimKey!=0;    autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0;  }else{    zDataType = "INTEGER";    primarykey = 1;  }  if( !zCollSeq ){    zCollSeq = "BINARY";  }error_out:  (void)sqlite3SafetyOff(db);  /* Whether the function call succeeded or failed, set the output parameters  ** to whatever their local counterparts contain. If an error did occur,  ** this has the effect of zeroing all output parameters.  */  if( pzDataType ) *pzDataType = zDataType;  if( pzCollSeq ) *pzCollSeq = zCollSeq;  if( pNotNull ) *pNotNull = notnull;  if( pPrimaryKey ) *pPrimaryKey = primarykey;  if( pAutoinc ) *pAutoinc = autoinc;  if( SQLITE_OK==rc && !pTab ){    sqlite3DbFree(db, zErrMsg);    zErrMsg = sqlite3MPrintf(db, "no such table column: %s.%s", zTableName,        zColumnName);    rc = SQLITE_ERROR;  }  sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg);  sqlite3DbFree(db, zErrMsg);  rc = sqlite3ApiExit(db, rc);  sqlite3_mutex_leave(db->mutex);  return rc;}#endif/*** Sleep for a little while.  Return the amount of time slept.*/int sqlite3_sleep(int ms){  sqlite3_vfs *pVfs;  int rc;  pVfs = sqlite3_vfs_find(0);  if( pVfs==0 ) return 0;  /* This function works in milliseconds, but the underlying OsSleep()   ** API uses microseconds. Hence the 1000's.  */  rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000);  return rc;}/*** Enable or disable the extended result codes.*/int sqlite3_extended_result_codes(sqlite3 *db, int onoff){  sqlite3_mutex_enter(db->mutex);  db->errMask = onoff ? 0xffffffff : 0xff;  sqlite3_mutex_leave(db->mutex);  return SQLITE_OK;}/*** Invoke the xFileControl method on a particular database.*/int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){  int rc = SQLITE_ERROR;  int iDb;  sqlite3_mutex_enter(db->mutex);  if( zDbName==0 ){    iDb = 0;  }else{    for(iDb=0; iDb<db->nDb; iDb++){      if( strcmp(db->aDb[iDb].zName, zDbName)==0 ) break;    }  }  if( iDb<db->nDb ){    Btree *pBtree = db->aDb[iDb].pBt;    if( pBtree ){      Pager *pPager;      sqlite3_file *fd;      sqlite3BtreeEnter(pBtree);      pPager = sqlite3BtreePager(pBtree);      assert( pPager!=0 );      fd = sqlite3PagerFile(pPager);      assert( fd!=0 );      if( fd->pMethods ){        rc = sqlite3OsFileControl(fd, op, pArg);      }      sqlite3BtreeLeave(pBtree);    }  }  sqlite3_mutex_leave(db->mutex);  return rc;   }/*** Interface to the testing logic.*/int sqlite3_test_control(int op, ...){  int rc = 0;#ifndef SQLITE_OMIT_BUILTIN_TEST  va_list ap;  va_start(ap, op);  switch( op ){    /*    ** Save the current state of the PRNG.    */    case SQLITE_TESTCTRL_PRNG_SAVE: {      sqlite3PrngSaveState();      break;    }    /*    ** Restore the state of the PRNG to the last state saved using    ** PRNG_SAVE.  If PRNG_SAVE has never before been called, then    ** this verb acts like PRNG_RESET.    */    case SQLITE_TESTCTRL_PRNG_RESTORE: {      sqlite3PrngRestoreState();      break;    }    /*    ** Reset the PRNG back to its uninitialized state.  The next call    ** to sqlite3_randomness() will reseed the PRNG using a single call    ** to the xRandomness method of the default VFS.    */    case SQLITE_TESTCTRL_PRNG_RESET: {      sqlite3PrngResetState();      break;    }    /*    **  sqlite3_test_control(BITVEC_TEST, size, program)    **    ** Run a test against a Bitvec object of size.  The program argument    ** is an array of integers that defines the test.  Return -1 on a    ** memory allocation error, 0 on success, or non-zero for an error.    ** See the sqlite3BitvecBuiltinTest() for additional information.    */    case SQLITE_TESTCTRL_BITVEC_TEST: {      int sz = va_arg(ap, int);      int *aProg = va_arg(ap, int*);      rc = sqlite3BitvecBuiltinTest(sz, aProg);      break;    }    /*    **  sqlite3_test_control(BENIGN_MALLOC_HOOKS, xBegin, xEnd)    **    ** Register hooks to call to indicate which malloc() failures     ** are benign.    */    case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: {      typedef void (*void_function)(void);      void_function xBenignBegin;      void_function xBenignEnd;      xBenignBegin = va_arg(ap, void_function);      xBenignEnd = va_arg(ap, void_function);      sqlite3BenignMallocHooks(xBenignBegin, xBenignEnd);      break;    }  }  va_end(ap);#endif /* SQLITE_OMIT_BUILTIN_TEST */  return rc;}

⌨️ 快捷键说明

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