亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tclsqlite.c

?? 調用sqlite開源數據的小程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*** 2001 September 15**** The author disclaims copyright to this source code.  In place of** a legal notice, here is a blessing:****    May you do good and not evil.**    May you find forgiveness for yourself and forgive others.**    May you share freely, never taking more than you give.***************************************************************************** A TCL Interface to SQLite**** $Id: tclsqlite.c,v 1.132 2005/08/29 23:00:04 drh Exp $*/#ifndef NO_TCL     /* Omit this whole file if TCL is unavailable */#include "sqliteInt.h"#include "hash.h"#include "tcl.h"#include <stdlib.h>#include <string.h>#include <assert.h>#include <ctype.h>#define NUM_PREPARED_STMTS 10#define MAX_PREPARED_STMTS 100/*** If TCL uses UTF-8 and SQLite is configured to use iso8859, then we** have to do a translation when going between the two.  Set the ** UTF_TRANSLATION_NEEDED macro to indicate that we need to do** this translation.  */#if defined(TCL_UTF_MAX) && !defined(SQLITE_UTF8)# define UTF_TRANSLATION_NEEDED 1#endif/*** New SQL functions can be created as TCL scripts.  Each such function** is described by an instance of the following structure.*/typedef struct SqlFunc SqlFunc;struct SqlFunc {  Tcl_Interp *interp;   /* The TCL interpret to execute the function */  Tcl_Obj *pScript;     /* The Tcl_Obj representation of the script */  int useEvalObjv;      /* True if it is safe to use Tcl_EvalObjv */  char *zName;          /* Name of this function */  SqlFunc *pNext;       /* Next function on the list of them all */};/*** New collation sequences function can be created as TCL scripts.  Each such** function is described by an instance of the following structure.*/typedef struct SqlCollate SqlCollate;struct SqlCollate {  Tcl_Interp *interp;   /* The TCL interpret to execute the function */  char *zScript;        /* The script to be run */  SqlCollate *pNext;    /* Next function on the list of them all */};/*** Prepared statements are cached for faster execution.  Each prepared** statement is described by an instance of the following structure.*/typedef struct SqlPreparedStmt SqlPreparedStmt;struct SqlPreparedStmt {  SqlPreparedStmt *pNext;  /* Next in linked list */  SqlPreparedStmt *pPrev;  /* Previous on the list */  sqlite3_stmt *pStmt;     /* The prepared statement */  int nSql;                /* chars in zSql[] */  char zSql[1];            /* Text of the SQL statement */};/*** There is one instance of this structure for each SQLite database** that has been opened by the SQLite TCL interface.*/typedef struct SqliteDb SqliteDb;struct SqliteDb {  sqlite3 *db;               /* The "real" database structure */  Tcl_Interp *interp;        /* The interpreter used for this database */  char *zBusy;               /* The busy callback routine */  char *zCommit;             /* The commit hook callback routine */  char *zTrace;              /* The trace callback routine */  char *zProfile;            /* The profile callback routine */  char *zProgress;           /* The progress callback routine */  char *zAuth;               /* The authorization callback routine */  char *zNull;               /* Text to substitute for an SQL NULL value */  SqlFunc *pFunc;            /* List of SQL functions */  SqlCollate *pCollate;      /* List of SQL collation functions */  int rc;                    /* Return code of most recent sqlite3_exec() */  Tcl_Obj *pCollateNeeded;   /* Collation needed script */  SqlPreparedStmt *stmtList; /* List of prepared statements*/  SqlPreparedStmt *stmtLast; /* Last statement in the list */  int maxStmt;               /* The next maximum number of stmtList */  int nStmt;                 /* Number of statements in stmtList */};/*** Look at the script prefix in pCmd.  We will be executing this script** after first appending one or more arguments.  This routine analyzes** the script to see if it is safe to use Tcl_EvalObjv() on the script** rather than the more general Tcl_EvalEx().  Tcl_EvalObjv() is much** faster.**** Scripts that are safe to use with Tcl_EvalObjv() consists of a** command name followed by zero or more arguments with no [...] or $** or {...} or ; to be seen anywhere.  Most callback scripts consist** of just a single procedure name and they meet this requirement.*/static int safeToUseEvalObjv(Tcl_Interp *interp, Tcl_Obj *pCmd){  /* We could try to do something with Tcl_Parse().  But we will instead  ** just do a search for forbidden characters.  If any of the forbidden  ** characters appear in pCmd, we will report the string as unsafe.  */  const char *z;  int n;  z = Tcl_GetStringFromObj(pCmd, &n);  while( n-- > 0 ){    int c = *(z++);    if( c=='$' || c=='[' || c==';' ) return 0;  }  return 1;}/*** Find an SqlFunc structure with the given name.  Or create a new** one if an existing one cannot be found.  Return a pointer to the** structure.*/static SqlFunc *findSqlFunc(SqliteDb *pDb, const char *zName){  SqlFunc *p, *pNew;  int i;  pNew = (SqlFunc*)Tcl_Alloc( sizeof(*pNew) + strlen(zName) + 1 );  pNew->zName = (char*)&pNew[1];  for(i=0; zName[i]; i++){ pNew->zName[i] = tolower(zName[i]); }  pNew->zName[i] = 0;  for(p=pDb->pFunc; p; p=p->pNext){     if( strcmp(p->zName, pNew->zName)==0 ){      Tcl_Free((char*)pNew);      return p;    }  }  pNew->interp = pDb->interp;  pNew->pScript = 0;  pNew->pNext = pDb->pFunc;  pDb->pFunc = pNew;  return pNew;}/*** Finalize and free a list of prepared statements*/static void flushStmtCache( SqliteDb *pDb ){  SqlPreparedStmt *pPreStmt;  while(  pDb->stmtList ){    sqlite3_finalize( pDb->stmtList->pStmt );    pPreStmt = pDb->stmtList;    pDb->stmtList = pDb->stmtList->pNext;    Tcl_Free( (char*)pPreStmt );  }  pDb->nStmt = 0;  pDb->stmtLast = 0;}/*** TCL calls this procedure when an sqlite3 database command is** deleted.*/static void DbDeleteCmd(void *db){  SqliteDb *pDb = (SqliteDb*)db;  flushStmtCache(pDb);  sqlite3_close(pDb->db);  while( pDb->pFunc ){    SqlFunc *pFunc = pDb->pFunc;    pDb->pFunc = pFunc->pNext;    Tcl_DecrRefCount(pFunc->pScript);    Tcl_Free((char*)pFunc);  }  while( pDb->pCollate ){    SqlCollate *pCollate = pDb->pCollate;    pDb->pCollate = pCollate->pNext;    Tcl_Free((char*)pCollate);  }  if( pDb->zBusy ){    Tcl_Free(pDb->zBusy);  }  if( pDb->zTrace ){    Tcl_Free(pDb->zTrace);  }  if( pDb->zProfile ){    Tcl_Free(pDb->zProfile);  }  if( pDb->zAuth ){    Tcl_Free(pDb->zAuth);  }  if( pDb->zNull ){    Tcl_Free(pDb->zNull);  }  Tcl_Free((char*)pDb);}/*** This routine is called when a database file is locked while trying** to execute SQL.*/static int DbBusyHandler(void *cd, int nTries){  SqliteDb *pDb = (SqliteDb*)cd;  int rc;  char zVal[30];  sprintf(zVal, "%d", nTries);  rc = Tcl_VarEval(pDb->interp, pDb->zBusy, " ", zVal, (char*)0);  if( rc!=TCL_OK || atoi(Tcl_GetStringResult(pDb->interp)) ){    return 0;  }  return 1;}/*** This routine is invoked as the 'progress callback' for the database.*/static int DbProgressHandler(void *cd){  SqliteDb *pDb = (SqliteDb*)cd;  int rc;  assert( pDb->zProgress );  rc = Tcl_Eval(pDb->interp, pDb->zProgress);  if( rc!=TCL_OK || atoi(Tcl_GetStringResult(pDb->interp)) ){    return 1;  }  return 0;}/*** This routine is called by the SQLite trace handler whenever a new** block of SQL is executed.  The TCL script in pDb->zTrace is executed.*/static void DbTraceHandler(void *cd, const char *zSql){  SqliteDb *pDb = (SqliteDb*)cd;  Tcl_DString str;  Tcl_DStringInit(&str);  Tcl_DStringAppend(&str, pDb->zTrace, -1);  Tcl_DStringAppendElement(&str, zSql);  Tcl_Eval(pDb->interp, Tcl_DStringValue(&str));  Tcl_DStringFree(&str);  Tcl_ResetResult(pDb->interp);}/*** This routine is called by the SQLite profile handler after a statement** SQL has executed.  The TCL script in pDb->zProfile is evaluated.*/static void DbProfileHandler(void *cd, const char *zSql, sqlite_uint64 tm){  SqliteDb *pDb = (SqliteDb*)cd;  Tcl_DString str;  char zTm[100];  sqlite3_snprintf(sizeof(zTm)-1, zTm, "%lld", tm);  Tcl_DStringInit(&str);  Tcl_DStringAppend(&str, pDb->zProfile, -1);  Tcl_DStringAppendElement(&str, zSql);  Tcl_DStringAppendElement(&str, zTm);  Tcl_Eval(pDb->interp, Tcl_DStringValue(&str));  Tcl_DStringFree(&str);  Tcl_ResetResult(pDb->interp);}/*** This routine is called when a transaction is committed.  The** TCL script in pDb->zCommit is executed.  If it returns non-zero or** if it throws an exception, the transaction is rolled back instead** of being committed.*/static int DbCommitHandler(void *cd){  SqliteDb *pDb = (SqliteDb*)cd;  int rc;  rc = Tcl_Eval(pDb->interp, pDb->zCommit);  if( rc!=TCL_OK || atoi(Tcl_GetStringResult(pDb->interp)) ){    return 1;  }  return 0;}static void tclCollateNeeded(  void *pCtx,  sqlite3 *db,  int enc,  const char *zName){  SqliteDb *pDb = (SqliteDb *)pCtx;  Tcl_Obj *pScript = Tcl_DuplicateObj(pDb->pCollateNeeded);  Tcl_IncrRefCount(pScript);  Tcl_ListObjAppendElement(0, pScript, Tcl_NewStringObj(zName, -1));  Tcl_EvalObjEx(pDb->interp, pScript, 0);  Tcl_DecrRefCount(pScript);}/*** This routine is called to evaluate an SQL collation function implemented** using TCL script.*/static int tclSqlCollate(  void *pCtx,  int nA,  const void *zA,  int nB,  const void *zB){  SqlCollate *p = (SqlCollate *)pCtx;  Tcl_Obj *pCmd;  pCmd = Tcl_NewStringObj(p->zScript, -1);  Tcl_IncrRefCount(pCmd);  Tcl_ListObjAppendElement(p->interp, pCmd, Tcl_NewStringObj(zA, nA));  Tcl_ListObjAppendElement(p->interp, pCmd, Tcl_NewStringObj(zB, nB));  Tcl_EvalObjEx(p->interp, pCmd, TCL_EVAL_DIRECT);  Tcl_DecrRefCount(pCmd);  return (atoi(Tcl_GetStringResult(p->interp)));}/*** This routine is called to evaluate an SQL function implemented** using TCL script.*/static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){  SqlFunc *p = sqlite3_user_data(context);  Tcl_Obj *pCmd;  int i;  int rc;  if( argc==0 ){    /* If there are no arguments to the function, call Tcl_EvalObjEx on the    ** script object directly.  This allows the TCL compiler to generate    ** bytecode for the command on the first invocation and thus make    ** subsequent invocations much faster. */    pCmd = p->pScript;    Tcl_IncrRefCount(pCmd);    rc = Tcl_EvalObjEx(p->interp, pCmd, 0);    Tcl_DecrRefCount(pCmd);  }else{    /* If there are arguments to the function, make a shallow copy of the    ** script object, lappend the arguments, then evaluate the copy.    **    ** By "shallow" copy, we mean a only the outer list Tcl_Obj is duplicated.    ** The new Tcl_Obj contains pointers to the original list elements.     ** That way, when Tcl_EvalObjv() is run and shimmers the first element    ** of the list to tclCmdNameType, that alternate representation will    ** be preserved and reused on the next invocation.    */    Tcl_Obj **aArg;    int nArg;    if( Tcl_ListObjGetElements(p->interp, p->pScript, &nArg, &aArg) ){      sqlite3_result_error(context, Tcl_GetStringResult(p->interp), -1);       return;    }         pCmd = Tcl_NewListObj(nArg, aArg);    Tcl_IncrRefCount(pCmd);    for(i=0; i<argc; i++){      sqlite3_value *pIn = argv[i];      Tcl_Obj *pVal;                  /* Set pVal to contain the i'th column of this row. */      switch( sqlite3_value_type(pIn) ){        case SQLITE_BLOB: {          int bytes = sqlite3_value_bytes(pIn);          pVal = Tcl_NewByteArrayObj(sqlite3_value_blob(pIn), bytes);          break;        }        case SQLITE_INTEGER: {          sqlite_int64 v = sqlite3_value_int64(pIn);          if( v>=-2147483647 && v<=2147483647 ){            pVal = Tcl_NewIntObj(v);          }else{            pVal = Tcl_NewWideIntObj(v);          }          break;        }        case SQLITE_FLOAT: {          double r = sqlite3_value_double(pIn);          pVal = Tcl_NewDoubleObj(r);          break;        }        case SQLITE_NULL: {          pVal = Tcl_NewStringObj("", 0);          break;        }        default: {          int bytes = sqlite3_value_bytes(pIn);          pVal = Tcl_NewStringObj(sqlite3_value_text(pIn), bytes);          break;        }      }      rc = Tcl_ListObjAppendElement(p->interp, pCmd, pVal);      if( rc ){        Tcl_DecrRefCount(pCmd);        sqlite3_result_error(context, Tcl_GetStringResult(p->interp), -1);         return;      }    }    if( !p->useEvalObjv ){      /* Tcl_EvalObjEx() will automatically call Tcl_EvalObjv() if pCmd      ** is a list without a string representation.  To prevent this from      ** happening, make sure pCmd has a valid string representation */      Tcl_GetString(pCmd);    }    rc = Tcl_EvalObjEx(p->interp, pCmd, TCL_EVAL_DIRECT);    Tcl_DecrRefCount(pCmd);  }  if( rc && rc!=TCL_RETURN ){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合免费观看高清完整版在线 | 亚洲精品老司机| 国产91在线|亚洲| 国产日韩亚洲欧美综合| 国产激情精品久久久第一区二区| 久久久久亚洲综合| 成人免费看黄yyy456| 自拍偷在线精品自拍偷无码专区| 色94色欧美sute亚洲线路二| 一区二区三区精品视频| 欧美蜜桃一区二区三区| 日日欢夜夜爽一区| 精品福利一二区| 国产成人超碰人人澡人人澡| 1024成人网色www| 欧美日韩国产中文| 麻豆久久久久久| 国产精品视频一二三| 欧洲精品在线观看| 久久疯狂做爰流白浆xx| 国产精品欧美久久久久一区二区| 91免费版pro下载短视频| 亚洲一区二区三区自拍| 精品国产三级a在线观看| 成人国产在线观看| 三级一区在线视频先锋| 国产亚洲1区2区3区| 欧美亚洲自拍偷拍| 国产揄拍国内精品对白| 亚洲欧美另类图片小说| 欧美一级黄色录像| www.色综合.com| 麻豆精品新av中文字幕| 亚洲精品自拍动漫在线| 日韩精品一区二区在线| 91视频www| 国产综合色精品一区二区三区| 一区二区三区精品在线观看| 久久久精品黄色| 宅男噜噜噜66一区二区66| 成人免费不卡视频| 麻豆精品视频在线观看| 亚洲一区在线观看网站| 国产欧美日韩亚州综合 | 在线综合+亚洲+欧美中文字幕| 高清不卡在线观看av| 天天色图综合网| 亚洲天堂精品在线观看| 久久日一线二线三线suv| 9191国产精品| 在线一区二区视频| zzijzzij亚洲日本少妇熟睡| 毛片av中文字幕一区二区| 亚洲国产aⅴ成人精品无吗| 亚洲国产成人午夜在线一区| 欧美本精品男人aⅴ天堂| 欧美男生操女生| 欧美三级一区二区| 色综合天天综合网天天狠天天 | 久久久久久99久久久精品网站| 欧美精品乱人伦久久久久久| 91麻豆免费在线观看| 国产成人精品午夜视频免费| 国产在线视视频有精品| 日本视频免费一区| 日韩影院免费视频| 午夜影院久久久| 洋洋成人永久网站入口| 中文字幕在线一区免费| 国产欧美一区二区精品秋霞影院 | 欧美三级在线视频| 欧美日韩专区在线| 欧美三级资源在线| 欧美色倩网站大全免费| 欧美另类高清zo欧美| 欧美精品日日鲁夜夜添| 欧美精品xxxxbbbb| 7777精品伊人久久久大香线蕉经典版下载 | 91福利社在线观看| 91麻豆国产福利在线观看| 99综合影院在线| 99久久婷婷国产精品综合| 99热精品一区二区| 色婷婷av一区二区三区大白胸| jlzzjlzz亚洲日本少妇| 日本高清无吗v一区| 91精品福利视频| 欧美日韩亚洲综合| 51精品久久久久久久蜜臀| 日韩视频在线你懂得| 久久久久久夜精品精品免费| 国产日韩成人精品| 亚洲精品久久久久久国产精华液| 亚洲欧美乱综合| 日韩制服丝袜av| 国产麻豆精品在线观看| 白白色 亚洲乱淫| 欧美视频在线观看一区二区| 337p亚洲精品色噜噜噜| 久久久久久久性| 国产精品久久久久久久久免费丝袜| 自拍偷拍国产精品| 性做久久久久久免费观看| 激情文学综合网| 成a人片国产精品| 欧美剧在线免费观看网站| 精品国产髙清在线看国产毛片 | 欧美mv日韩mv| 亚洲欧美一区二区在线观看| 亚洲第一综合色| 国产乱码字幕精品高清av | 欧美曰成人黄网| 日韩精品中文字幕在线一区| 国产精品毛片久久久久久久| 一区二区成人在线| 激情都市一区二区| 欧洲日韩一区二区三区| 欧美精品一区二区三区一线天视频| 国产精品久久午夜| 丝袜国产日韩另类美女| 国产**成人网毛片九色 | 97久久精品人人做人人爽| 欧美日韩不卡一区二区| 欧美国产日本韩| 午夜精品在线视频一区| 成人午夜精品在线| 欧美一区二区三区免费| 《视频一区视频二区| 老司机精品视频一区二区三区| www.亚洲在线| 2020日本不卡一区二区视频| 亚洲一线二线三线视频| 成人午夜视频网站| 精品嫩草影院久久| 天堂一区二区在线免费观看| av亚洲产国偷v产偷v自拍| 日韩欧美激情一区| 亚洲综合久久久| 成人久久久精品乱码一区二区三区| 91精品国产一区二区| 亚洲精品乱码久久久久久久久| 国产美女一区二区| 欧美一区二区黄色| 亚洲国产婷婷综合在线精品| 99久久夜色精品国产网站| 国产欧美日韩在线| 国产一区二区三区香蕉| 日韩精品一区二区三区四区| 亚洲风情在线资源站| 色视频成人在线观看免| 国产精品不卡视频| 成人性生交大片免费看在线播放 | 日本一区二区久久| 精品写真视频在线观看| 日韩欧美中文字幕精品| 首页国产欧美久久| 欧美日韩在线综合| 亚洲精品乱码久久久久久久久| 不卡视频免费播放| 国产欧美精品在线观看| 国产精品亚洲第一| 久久精品日韩一区二区三区| 经典三级在线一区| 欧美va亚洲va在线观看蝴蝶网| 免费成人在线影院| 精品久久人人做人人爽| 久久99精品一区二区三区三区| 日韩欧美亚洲国产另类| 免费看欧美美女黄的网站| 日韩女优制服丝袜电影| 美女免费视频一区二区| 精品99一区二区三区| 国产一区日韩二区欧美三区| 国产亚洲精品久| jizz一区二区| 亚洲狠狠爱一区二区三区| 欧美日韩国产天堂| 日本成人在线电影网| 欧美成人video| 国产精品996| 国产精品九色蝌蚪自拍| 91在线云播放| 亚洲综合久久久| 欧美一级艳片视频免费观看| 韩国毛片一区二区三区| 欧美国产一区二区| 91国产免费观看| 欧美aⅴ一区二区三区视频| 欧美精品一区视频| 99国内精品久久| 亚洲综合精品久久| 日韩欧美一区二区视频| 从欧美一区二区三区| 一区二区三区中文免费| 91精品婷婷国产综合久久性色| 精品一区二区三区免费视频| 国产精品欧美一区二区三区| 欧美色区777第一页| 国产精品自在欧美一区| 亚洲美女视频一区|