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

📄 test1.c

📁 sqlite-3.4.1,嵌入式数据库.是一个功能强大的开源数据库,给学习和研发以及小型公司的发展带来了全所未有的好处.
💻 C
📖 第 1 页 / 共 5 页
字号:
** Usage: sqlite3_enable_load_extension DB-HANDLE ONOFF*/static int test_enable_load(  ClientData clientData, /* Not used */  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int objc,              /* Number of arguments */  Tcl_Obj *CONST objv[]  /* Command arguments */){  Tcl_CmdInfo cmdInfo;  sqlite3 *db;  char *zDb;  int onoff;  if( objc!=3 ){    Tcl_WrongNumArgs(interp, 1, objv, "DB-HANDLE ONOFF");    return TCL_ERROR;  }  zDb = Tcl_GetString(objv[1]);  /* Extract the C database handle from the Tcl command name */  if( !Tcl_GetCommandInfo(interp, zDb, &cmdInfo) ){    Tcl_AppendResult(interp, "command not found: ", zDb, (char*)0);    return TCL_ERROR;  }  db = ((struct SqliteDb*)cmdInfo.objClientData)->db;  assert(db);  /* Get the onoff parameter */  if( Tcl_GetBooleanFromObj(interp, objv[2], &onoff) ){    return TCL_ERROR;  }#ifdef SQLITE_OMIT_LOAD_EXTENSION  Tcl_AppendResult(interp, "this build omits sqlite3_load_extension()");  return TCL_ERROR;#else  sqlite3_enable_load_extension(db, onoff);  return TCL_OK;#endif}/*** Usage:  sqlite_abort**** Shutdown the process immediately.  This is not a clean shutdown.** This command is used to test the recoverability of a database in** the event of a program crash.*/static int sqlite_abort(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  assert( interp==0 );   /* This will always fail */  return TCL_OK;}/*** The following routine is a user-defined SQL function whose purpose** is to test the sqlite_set_result() API.*/static void testFunc(sqlite3_context *context, int argc, sqlite3_value **argv){  while( argc>=2 ){    const char *zArg0 = (char*)sqlite3_value_text(argv[0]);    if( zArg0 ){      if( 0==sqlite3StrICmp(zArg0, "int") ){        sqlite3_result_int(context, sqlite3_value_int(argv[1]));      }else if( sqlite3StrICmp(zArg0,"int64")==0 ){        sqlite3_result_int64(context, sqlite3_value_int64(argv[1]));      }else if( sqlite3StrICmp(zArg0,"string")==0 ){        sqlite3_result_text(context, (char*)sqlite3_value_text(argv[1]), -1,            SQLITE_TRANSIENT);      }else if( sqlite3StrICmp(zArg0,"double")==0 ){        sqlite3_result_double(context, sqlite3_value_double(argv[1]));      }else if( sqlite3StrICmp(zArg0,"null")==0 ){        sqlite3_result_null(context);      }else if( sqlite3StrICmp(zArg0,"value")==0 ){        sqlite3_result_value(context, argv[sqlite3_value_int(argv[1])]);      }else{        goto error_out;      }    }else{      goto error_out;    }    argc -= 2;    argv += 2;  }  return;error_out:  sqlite3_result_error(context,"first argument should be one of: "      "int int64 string double null value", -1);}/*** Usage:   sqlite_register_test_function  DB  NAME**** Register the test SQL function on the database DB under the name NAME.*/static int test_register_func(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  sqlite3 *db;  int rc;  if( argc!=3 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],        " DB FUNCTION-NAME", 0);    return TCL_ERROR;  }  if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR;  rc = sqlite3_create_function(db, argv[2], -1, SQLITE_UTF8, 0,       testFunc, 0, 0);  if( rc!=0 ){    Tcl_AppendResult(interp, sqlite3ErrStr(rc), 0);    return TCL_ERROR;  }  if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR;  return TCL_OK;}/*** Usage:  sqlite3_finalize  STMT **** Finalize a statement handle.*/static int test_finalize(  void * clientData,  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[]){  sqlite3_stmt *pStmt;  int rc;  sqlite3 *db = 0;  if( objc!=2 ){    Tcl_AppendResult(interp, "wrong # args: should be \"",        Tcl_GetStringFromObj(objv[0], 0), " <STMT>", 0);    return TCL_ERROR;  }  if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR;  if( pStmt ){    db = StmtToDb(pStmt);  }  rc = sqlite3_finalize(pStmt);  Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC);  if( db && sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR;  return TCL_OK;}/*** Usage:  sqlite3_reset  STMT **** Reset a statement handle.*/static int test_reset(  void * clientData,  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[]){  sqlite3_stmt *pStmt;  int rc;  if( objc!=2 ){    Tcl_AppendResult(interp, "wrong # args: should be \"",        Tcl_GetStringFromObj(objv[0], 0), " <STMT>", 0);    return TCL_ERROR;  }  if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR;  rc = sqlite3_reset(pStmt);  if( pStmt && sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ){    return TCL_ERROR;  }  Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC);/*  if( rc ){    return TCL_ERROR;  }*/  return TCL_OK;}/*** Usage:  sqlite3_expired STMT **** Return TRUE if a recompilation of the statement is recommended.*/static int test_expired(  void * clientData,  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[]){  sqlite3_stmt *pStmt;  if( objc!=2 ){    Tcl_AppendResult(interp, "wrong # args: should be \"",        Tcl_GetStringFromObj(objv[0], 0), " <STMT>", 0);    return TCL_ERROR;  }  if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR;  Tcl_SetObjResult(interp, Tcl_NewBooleanObj(sqlite3_expired(pStmt)));  return TCL_OK;}/*** Usage:  sqlite3_transfer_bindings FROMSTMT TOSTMT**** Transfer all bindings from FROMSTMT over to TOSTMT*/static int test_transfer_bind(  void * clientData,  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[]){  sqlite3_stmt *pStmt1, *pStmt2;  if( objc!=3 ){    Tcl_AppendResult(interp, "wrong # args: should be \"",        Tcl_GetStringFromObj(objv[0], 0), " FROM-STMT TO-STMT", 0);    return TCL_ERROR;  }  if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt1)) return TCL_ERROR;  if( getStmtPointer(interp, Tcl_GetString(objv[2]), &pStmt2)) return TCL_ERROR;  Tcl_SetObjResult(interp,      Tcl_NewIntObj(sqlite3_transfer_bindings(pStmt1,pStmt2)));  return TCL_OK;}/*** Usage:  sqlite3_changes DB**** Return the number of changes made to the database by the last SQL** execution.*/static int test_changes(  void * clientData,  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[]){  sqlite3 *db;  if( objc!=2 ){    Tcl_AppendResult(interp, "wrong # args: should be \"",       Tcl_GetString(objv[0]), " DB", 0);    return TCL_ERROR;  }  if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;  Tcl_SetObjResult(interp, Tcl_NewIntObj(sqlite3_changes(db)));  return TCL_OK;}/*** This is the "static_bind_value" that variables are bound to when** the FLAG option of sqlite3_bind is "static"*/static char *sqlite_static_bind_value = 0;static int sqlite_static_bind_nbyte = 0;/*** Usage:  sqlite3_bind  VM  IDX  VALUE  FLAGS**** Sets the value of the IDX-th occurance of "?" in the original SQL** string.  VALUE is the new value.  If FLAGS=="null" then VALUE is** ignored and the value is set to NULL.  If FLAGS=="static" then** the value is set to the value of a static variable named** "sqlite_static_bind_value".  If FLAGS=="normal" then a copy** of the VALUE is made.  If FLAGS=="blob10" then a VALUE is ignored** an a 10-byte blob "abc\000xyz\000pq" is inserted.*/static int test_bind(  void *NotUsed,  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */  int argc,              /* Number of arguments */  char **argv            /* Text of each argument */){  sqlite3_stmt *pStmt;  int rc;  int idx;  if( argc!=5 ){    Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],        " VM IDX VALUE (null|static|normal)\"", 0);    return TCL_ERROR;  }  if( getStmtPointer(interp, argv[1], &pStmt) ) return TCL_ERROR;  if( Tcl_GetInt(interp, argv[2], &idx) ) return TCL_ERROR;  if( strcmp(argv[4],"null")==0 ){    rc = sqlite3_bind_null(pStmt, idx);  }else if( strcmp(argv[4],"static")==0 ){    rc = sqlite3_bind_text(pStmt, idx, sqlite_static_bind_value, -1, 0);  }else if( strcmp(argv[4],"static-nbytes")==0 ){    rc = sqlite3_bind_text(pStmt, idx, sqlite_static_bind_value,                                       sqlite_static_bind_nbyte, 0);  }else if( strcmp(argv[4],"normal")==0 ){    rc = sqlite3_bind_text(pStmt, idx, argv[3], -1, SQLITE_TRANSIENT);  }else if( strcmp(argv[4],"blob10")==0 ){    rc = sqlite3_bind_text(pStmt, idx, "abc\000xyz\000pq", 10, SQLITE_STATIC);  }else{    Tcl_AppendResult(interp, "4th argument should be "        "\"null\" or \"static\" or \"normal\"", 0);    return TCL_ERROR;  }  if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR;  if( rc ){    char zBuf[50];    sprintf(zBuf, "(%d) ", rc);    Tcl_AppendResult(interp, zBuf, sqlite3ErrStr(rc), 0);    return TCL_ERROR;  }  return TCL_OK;}#ifndef SQLITE_OMIT_UTF16/*** Usage: add_test_collate <db ptr> <utf8> <utf16le> <utf16be>**** This function is used to test that SQLite selects the correct collation** sequence callback when multiple versions (for different text encodings)** are available.**** Calling this routine registers the collation sequence "test_collate"** with database handle <db>. The second argument must be a list of three** boolean values. If the first is true, then a version of test_collate is** registered for UTF-8, if the second is true, a version is registered for** UTF-16le, if the third is true, a UTF-16be version is available.** Previous versions of test_collate are deleted.**** The collation sequence test_collate is implemented by calling the** following TCL script:****   "test_collate <enc> <lhs> <rhs>"**** The <lhs> and <rhs> are the two values being compared, encoded in UTF-8.** The <enc> parameter is the encoding of the collation function that** SQLite selected to call. The TCL test script implements the** "test_collate" proc.**** Note that this will only work with one intepreter at a time, as the** interp pointer to use when evaluating the TCL script is stored in** pTestCollateInterp.*/static Tcl_Interp* pTestCollateInterp;static int test_collate_func(  void *pCtx,   int nA, const void *zA,  int nB, const void *zB){  Tcl_Interp *i = pTestCollateInterp;  int encin = (int)pCtx;  int res;  int n;  sqlite3_value *pVal;  Tcl_Obj *pX;  pX = Tcl_NewStringObj("test_collate", -1);  Tcl_IncrRefCount(pX);  switch( encin ){    case SQLITE_UTF8:      Tcl_ListObjAppendElement(i,pX,Tcl_NewStringObj("UTF-8",-1));      break;    case SQLITE_UTF16LE:      Tcl_ListObjAppendElement(i,pX,Tcl_NewStringObj("UTF-16LE",-1));      break;    case SQLITE_UTF16BE:      Tcl_ListObjAppendElement(i,pX,Tcl_NewStringObj("UTF-16BE",-1));      break;    default:      assert(0);  }  pVal = sqlite3ValueNew();  sqlite3ValueSetStr(pVal, nA, zA, encin, SQLITE_STATIC);  n = sqlite3_value_bytes(pVal);  Tcl_ListObjAppendElement(i,pX,      Tcl_NewStringObj((char*)sqlite3_value_text(pVal),n));  sqlite3ValueSetStr(pVal, nB, zB, encin, SQLITE_STATIC);  n = sqlite3_value_bytes(pVal);  Tcl_ListObjAppendElement(i,pX,      Tcl_NewStringObj((char*)sqlite3_value_text(pVal),n));  sqlite3ValueFree(pVal);  Tcl_EvalObjEx(i, pX, 0);  Tcl_DecrRefCount(pX);  Tcl_GetIntFromObj(i, Tcl_GetObjResult(i), &res);  return res;}static int test_collate(  void * clientData,  Tcl_Interp *interp,  int objc,  Tcl_Obj *CONST objv[]){  sqlite3 *db;  int val;  sqlite3_value *pVal;  int rc;  if( objc!=5 ) goto bad_args;  pTestCollateInterp = interp;  if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;  if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[2], &val) ) return TCL_ERROR;  rc = sqlite3_create_collation(db, "test_collate", SQLITE_UTF8,           (void *)SQLITE_UTF8, val?test_collate_func:0);  if( rc==SQLITE_OK ){    if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[3], &val) ) return TCL_ERROR;    rc = sqlite3_create_collation(db, "test_collate", SQLITE_UTF16LE,             (void *)SQLITE_UTF16LE, val?test_collate_func:0);    if( TCL_OK!=Tcl_GetBooleanFromObj(interp, objv[4], &val) ) return TCL_ERROR;#ifdef SQLITE_MEMDEBUG    if( sqlite3_iMallocFail>0 ){      sqlite3_iMallocFail++;    }#endif    pVal = sqlite3ValueNew();    sqlite3ValueSetStr(pVal, -1, "test_collate", SQLITE_UTF8, SQLITE_STATIC);    rc = sqlite3_create_collation16(db,           sqlite3ValueText(pVal, SQLITE_UTF16NATIVE), SQLITE_UTF16BE,           (void *)SQLITE_UTF16BE, val?test_collate_func:0);    sqlite3ValueFree(pVal);  }  if( sqlite3TestErrCode(interp, db, rc) ) return TCL_ERROR;    if( rc!=SQLITE_OK ){    Tcl_AppendResult(interp, sqlite3TestErrorName(rc), 0);    return TCL_ERROR;  }  return TCL_OK;bad_args:  Tcl_AppendResult(interp, "wrong # args: should be \"",      Tcl_GetStringFromObj(objv[0], 0), " <DB> <utf8> <utf16le> <utf16be>", 0);  return TCL_ERROR;}/*** When the collation needed callback is invoked, record the name of 

⌨️ 快捷键说明

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