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

📄 main.c

📁 这是一个开源的数据库系统,值得学习啊, 里面用了SQL语句,与微软的SQL SERVIER,差不了多少
💻 C
📖 第 1 页 / 共 3 页
字号:
  if( createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0) ||      createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0) ||      createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0) ||      (db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 6, 0))==0   ){    assert( db->mallocFailed );    db->magic = SQLITE_MAGIC_CLOSED;    goto opendb_out;  }  /* 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);    db->magic = SQLITE_MAGIC_CLOSED;    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 ){    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 ){    extern int sqlite3Fts3Init(sqlite3*);    rc = sqlite3Fts3Init(db);  }#endif#ifdef SQLITE_ENABLE_ICU  if( !db->mallocFailed && rc==SQLITE_OK ){    extern int sqlite3IcuInit(sqlite3*);    rc = sqlite3IcuInit(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);#endifopendb_out:  if( db && db->mutex ){    sqlite3_mutex_leave(db->mutex);  }  if( SQLITE_NOMEM==(rc = sqlite3_errcode(db)) ){    sqlite3_close(db);    db = 0;  }  *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 = SQLITE_NOMEM;  assert( zFilename );  assert( ppDb );  *ppDb = 0;  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);    if( rc==SQLITE_OK && *ppDb ){      rc = sqlite3_exec(*ppDb, "PRAGMA encoding = 'UTF-16'", 0, 0, 0);      if( rc!=SQLITE_OK ){        sqlite3_close(*ppDb);        *ppDb = 0;      }    }  }  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 char *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);    sqlite3_free(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*)){  if( sqlite3SafetyCheck(db) ){    return SQLITE_MISUSE;  }  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*)){  if( sqlite3SafetyCheck(db) ){    return SQLITE_MISUSE;  }  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(){  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 colums 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 */  if( sqlite3SafetyOn(db) ){    return SQLITE_MISUSE;  }  sqlite3_mutex_enter(db->mutex);  rc = sqlite3Init(db, &zErrMsg);  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?1:0);    primarykey  = (pCol->isPrimKey?1:0);    autoinc = ((pTab->iPKey==iCol && pTab->autoInc)?1:0);  }else{    zDataType = "INTEGER";    primarykey = 1;  }  if( !zCollSeq ){    zCollSeq = "BINARY";  }error_out:  if( sqlite3SafetyOff(db) ){    rc = SQLITE_MISUSE;  }  /* 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 ){    sqlite3SetString(&zErrMsg, "no such table column: ", zTableName, ".",         zColumnName, 0);    rc = SQLITE_ERROR;  }  sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg);  sqlite3_free(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);  /* 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;      sqlite3BtreeEnter(pBtree);      pPager = sqlite3BtreePager(pBtree);      if( pPager ){        sqlite3_file *fd = sqlite3PagerFile(pPager);        if( fd ){          rc = sqlite3OsFileControl(fd, op, pArg);        }      }      sqlite3BtreeLeave(pBtree);    }  }  sqlite3_mutex_leave(db->mutex);  return rc;   }

⌨️ 快捷键说明

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