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

📄 tclsqlite.c

📁 pda上的数据库,速度快,体积小,做朋友的福音
💻 C
📖 第 1 页 / 共 5 页
字号:
      rc = TCL_ERROR;    }#endif    break;  }  /*  **     $db timeout MILLESECONDS  **  ** Delay for the number of milliseconds specified when a file is locked.  */  case DB_TIMEOUT: {    int ms;    if( objc!=3 ){      Tcl_WrongNumArgs(interp, 2, objv, "MILLISECONDS");      return TCL_ERROR;    }    if( Tcl_GetIntFromObj(interp, objv[2], &ms) ) return TCL_ERROR;    sqlite3_busy_timeout(pDb->db, ms);    break;  }    /*  **     $db total_changes  **  ** Return the number of rows that were modified, inserted, or deleted   ** since the database handle was created.  */  case DB_TOTAL_CHANGES: {    Tcl_Obj *pResult;    if( objc!=2 ){      Tcl_WrongNumArgs(interp, 2, objv, "");      return TCL_ERROR;    }    pResult = Tcl_GetObjResult(interp);    Tcl_SetIntObj(pResult, sqlite3_total_changes(pDb->db));    break;  }  /*    $db trace ?CALLBACK?  **  ** Make arrangements to invoke the CALLBACK routine for each SQL statement  ** that is executed.  The text of the SQL is appended to CALLBACK before  ** it is executed.  */  case DB_TRACE: {    if( objc>3 ){      Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?");      return TCL_ERROR;    }else if( objc==2 ){      if( pDb->zTrace ){        Tcl_AppendResult(interp, pDb->zTrace, 0);      }    }else{      char *zTrace;      int len;      if( pDb->zTrace ){        Tcl_Free(pDb->zTrace);      }      zTrace = Tcl_GetStringFromObj(objv[2], &len);      if( zTrace && len>0 ){        pDb->zTrace = Tcl_Alloc( len + 1 );        strcpy(pDb->zTrace, zTrace);      }else{        pDb->zTrace = 0;      }#ifndef SQLITE_OMIT_TRACE      if( pDb->zTrace ){        pDb->interp = interp;        sqlite3_trace(pDb->db, DbTraceHandler, pDb);      }else{        sqlite3_trace(pDb->db, 0, 0);      }#endif    }    break;  }  /*    $db transaction [-deferred|-immediate|-exclusive] SCRIPT  **  ** Start a new transaction (if we are not already in the midst of a  ** transaction) and execute the TCL script SCRIPT.  After SCRIPT  ** completes, either commit the transaction or roll it back if SCRIPT  ** throws an exception.  Or if no new transation was started, do nothing.  ** pass the exception on up the stack.  **  ** This command was inspired by Dave Thomas's talk on Ruby at the  ** 2005 O'Reilly Open Source Convention (OSCON).  */  case DB_TRANSACTION: {    int inTrans;    Tcl_Obj *pScript;    const char *zBegin = "BEGIN";    if( objc!=3 && objc!=4 ){      Tcl_WrongNumArgs(interp, 2, objv, "[TYPE] SCRIPT");      return TCL_ERROR;    }    if( objc==3 ){      pScript = objv[2];    } else {      static const char *TTYPE_strs[] = {        "deferred",   "exclusive",  "immediate", 0      };      enum TTYPE_enum {        TTYPE_DEFERRED, TTYPE_EXCLUSIVE, TTYPE_IMMEDIATE      };      int ttype;      if( Tcl_GetIndexFromObj(interp, objv[2], TTYPE_strs, "transaction type",                              0, &ttype) ){        return TCL_ERROR;      }      switch( (enum TTYPE_enum)ttype ){        case TTYPE_DEFERRED:    /* no-op */;                 break;        case TTYPE_EXCLUSIVE:   zBegin = "BEGIN EXCLUSIVE";  break;        case TTYPE_IMMEDIATE:   zBegin = "BEGIN IMMEDIATE";  break;      }      pScript = objv[3];    }    inTrans = !sqlite3_get_autocommit(pDb->db);    if( !inTrans ){      sqlite3_exec(pDb->db, zBegin, 0, 0, 0);    }    rc = Tcl_EvalObjEx(interp, pScript, 0);    if( !inTrans ){      const char *zEnd;      if( rc==TCL_ERROR ){        zEnd = "ROLLBACK";      } else {        zEnd = "COMMIT";      }      sqlite3_exec(pDb->db, zEnd, 0, 0, 0);    }    break;  }  /*    $db version  **  ** Return the version string for this database.  */  case DB_VERSION: {    Tcl_SetResult(interp, (char *)sqlite3_libversion(), TCL_STATIC);    break;  }  } /* End of the SWITCH statement */  return rc;}/***   sqlite3 DBNAME FILENAME ?MODE? ?-key KEY?**** This is the main Tcl command.  When the "sqlite" Tcl command is** invoked, this routine runs to process that command.**** The first argument, DBNAME, is an arbitrary name for a new** database connection.  This command creates a new command named** DBNAME that is used to control that connection.  The database** connection is deleted when the DBNAME command is deleted.**** The second argument is the name of the directory that contains** the sqlite database that is to be accessed.**** For testing purposes, we also support the following:****  sqlite3 -encoding****       Return the encoding used by LIKE and GLOB operators.  Choices**       are UTF-8 and iso8859.****  sqlite3 -version****       Return the version number of the SQLite library.****  sqlite3 -tcl-uses-utf****       Return "1" if compiled with a Tcl uses UTF-8.  Return "0" if**       not.  Used by tests to make sure the library was compiled **       correctly.*/static int DbMain(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){  SqliteDb *p;  void *pKey = 0;  int nKey = 0;  const char *zArg;  char *zErrMsg;  const char *zFile;  char zBuf[80];  if( objc==2 ){    zArg = Tcl_GetStringFromObj(objv[1], 0);    if( strcmp(zArg,"-version")==0 ){      Tcl_AppendResult(interp,sqlite3_version,0);      return TCL_OK;    }    if( strcmp(zArg,"-has-codec")==0 ){#ifdef SQLITE_HAS_CODEC      Tcl_AppendResult(interp,"1",0);#else      Tcl_AppendResult(interp,"0",0);#endif      return TCL_OK;    }    if( strcmp(zArg,"-tcl-uses-utf")==0 ){#ifdef TCL_UTF_MAX      Tcl_AppendResult(interp,"1",0);#else      Tcl_AppendResult(interp,"0",0);#endif      return TCL_OK;    }  }  if( objc==5 || objc==6 ){    zArg = Tcl_GetStringFromObj(objv[objc-2], 0);    if( strcmp(zArg,"-key")==0 ){      pKey = Tcl_GetByteArrayFromObj(objv[objc-1], &nKey);      objc -= 2;    }  }  if( objc!=3 && objc!=4 ){    Tcl_WrongNumArgs(interp, 1, objv, #ifdef SQLITE_HAS_CODEC      "HANDLE FILENAME ?-key CODEC-KEY?"#else      "HANDLE FILENAME ?MODE?"#endif    );    return TCL_ERROR;  }  zErrMsg = 0;  p = (SqliteDb*)Tcl_Alloc( sizeof(*p) );  if( p==0 ){    Tcl_SetResult(interp, "malloc failed", TCL_STATIC);    return TCL_ERROR;  }  memset(p, 0, sizeof(*p));  zFile = Tcl_GetStringFromObj(objv[2], 0);  sqlite3_open(zFile, &p->db);  if( SQLITE_OK!=sqlite3_errcode(p->db) ){    zErrMsg = strdup(sqlite3_errmsg(p->db));    sqlite3_close(p->db);    p->db = 0;  }#ifdef SQLITE_HAS_CODEC  sqlite3_key(p->db, pKey, nKey);#endif  if( p->db==0 ){    Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE);    Tcl_Free((char*)p);    free(zErrMsg);    return TCL_ERROR;  }  p->maxStmt = NUM_PREPARED_STMTS;  zArg = Tcl_GetStringFromObj(objv[1], 0);  Tcl_CreateObjCommand(interp, zArg, DbObjCmd, (char*)p, DbDeleteCmd);  /* The return value is the value of the sqlite* pointer  */  sprintf(zBuf, "%p", p->db);  if( strncmp(zBuf,"0x",2) ){    sprintf(zBuf, "0x%p", p->db);  }  Tcl_AppendResult(interp, zBuf, 0);  /* If compiled with SQLITE_TEST turned on, then register the "md5sum"  ** SQL function.  */#ifdef SQLITE_TEST  {    extern void Md5_Register(sqlite3*);#ifdef SQLITE_MEMDEBUG    int mallocfail = sqlite3_iMallocFail;    sqlite3_iMallocFail = 0;#endif    Md5_Register(p->db);#ifdef SQLITE_MEMDEBUG    sqlite3_iMallocFail = mallocfail;#endif   }#endif    p->interp = interp;  return TCL_OK;}/*** Provide a dummy Tcl_InitStubs if we are using this as a static** library.*/#ifndef USE_TCL_STUBS# undef  Tcl_InitStubs# define Tcl_InitStubs(a,b,c)#endif/*** Initialize this module.**** This Tcl module contains only a single new Tcl command named "sqlite".** (Hence there is no namespace.  There is no point in using a namespace** if the extension only supplies one new name!)  The "sqlite" command is** used to open a new SQLite database.  See the DbMain() routine above** for additional information.*/int Sqlite3_Init(Tcl_Interp *interp){  Tcl_InitStubs(interp, "8.4", 0);  Tcl_CreateObjCommand(interp, "sqlite3", (Tcl_ObjCmdProc*)DbMain, 0, 0);  Tcl_PkgProvide(interp, "sqlite3", "3.0");  Tcl_CreateObjCommand(interp, "sqlite", (Tcl_ObjCmdProc*)DbMain, 0, 0);  Tcl_PkgProvide(interp, "sqlite", "3.0");  return TCL_OK;}int Tclsqlite3_Init(Tcl_Interp *interp){ return Sqlite3_Init(interp); }int Sqlite3_SafeInit(Tcl_Interp *interp){ return TCL_OK; }int Tclsqlite3_SafeInit(Tcl_Interp *interp){ return TCL_OK; }#ifndef SQLITE_3_SUFFIX_ONLYint Sqlite_Init(Tcl_Interp *interp){ return Sqlite3_Init(interp); }int Tclsqlite_Init(Tcl_Interp *interp){ return Sqlite3_Init(interp); }int Sqlite_SafeInit(Tcl_Interp *interp){ return TCL_OK; }int Tclsqlite_SafeInit(Tcl_Interp *interp){ return TCL_OK; }#endif#ifdef TCLSH/******************************************************************************* The code that follows is used to build standalone TCL interpreters*//*** If the macro TCLSH is one, then put in code this for the** "main" routine that will initialize Tcl and take input from** standard input.*/#if TCLSH==1static char zMainloop[] =  "set line {}\n"  "while {![eof stdin]} {\n"    "if {$line!=\"\"} {\n"      "puts -nonewline \"> \"\n"    "} else {\n"      "puts -nonewline \"% \"\n"    "}\n"    "flush stdout\n"    "append line [gets stdin]\n"    "if {[info complete $line]} {\n"      "if {[catch {uplevel #0 $line} result]} {\n"        "puts stderr \"Error: $result\"\n"      "} elseif {$result!=\"\"} {\n"        "puts $result\n"      "}\n"      "set line {}\n"    "} else {\n"      "append line \\n\n"    "}\n"  "}\n";#endif/*** If the macro TCLSH is two, then get the main loop code out of** the separate file "spaceanal_tcl.h".*/#if TCLSH==2static char zMainloop[] = #include "spaceanal_tcl.h";#endif#define TCLSH_MAIN main   /* Needed to fake out mktclapp */int TCLSH_MAIN(int argc, char **argv){  Tcl_Interp *interp;  Tcl_FindExecutable(argv[0]);  interp = Tcl_CreateInterp();  Sqlite3_Init(interp);#ifdef SQLITE_TEST  {    extern int Sqlitetest1_Init(Tcl_Interp*);    extern int Sqlitetest2_Init(Tcl_Interp*);    extern int Sqlitetest3_Init(Tcl_Interp*);    extern int Sqlitetest4_Init(Tcl_Interp*);    extern int Sqlitetest5_Init(Tcl_Interp*);    extern int Md5_Init(Tcl_Interp*);    extern int Sqlitetestsse_Init(Tcl_Interp*);    Sqlitetest1_Init(interp);    Sqlitetest2_Init(interp);    Sqlitetest3_Init(interp);    Sqlitetest4_Init(interp);    Sqlitetest5_Init(interp);    Md5_Init(interp);#ifdef SQLITE_SSE    Sqlitetestsse_Init(interp);#endif  }#endif  if( argc>=2 || TCLSH==2 ){    int i;    Tcl_SetVar(interp,"argv0",argv[1],TCL_GLOBAL_ONLY);    Tcl_SetVar(interp,"argv", "", TCL_GLOBAL_ONLY);    for(i=3-TCLSH; i<argc; i++){      Tcl_SetVar(interp, "argv", argv[i],          TCL_GLOBAL_ONLY | TCL_LIST_ELEMENT | TCL_APPEND_VALUE);    }    if( TCLSH==1 && Tcl_EvalFile(interp, argv[1])!=TCL_OK ){      const char *zInfo = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);      if( zInfo==0 ) zInfo = interp->result;      fprintf(stderr,"%s: %s\n", *argv, zInfo);      return 1;    }  }  if( argc<=1 || TCLSH==2 ){    Tcl_GlobalEval(interp, zMainloop);  }  return 0;}#endif /* TCLSH */#endif /* !defined(NO_TCL) */

⌨️ 快捷键说明

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