📄 test1.c
字号:
*/#ifdef SQLITE_ENABLE_COLUMN_METADATAstatic int test_table_column_metadata( ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ int objc, /* Number of arguments */ Tcl_Obj *CONST objv[] /* Command arguments */){ sqlite3 *db; const char *zDb; const char *zTbl; const char *zCol; int rc; Tcl_Obj *pRet; const char *zDatatype; const char *zCollseq; int notnull; int primarykey; int autoincrement; if( objc!=5 ){ Tcl_WrongNumArgs(interp, 1, objv, "DB dbname tblname colname"); return TCL_ERROR; } if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; zDb = Tcl_GetString(objv[2]); zTbl = Tcl_GetString(objv[3]); zCol = Tcl_GetString(objv[4]); if( strlen(zDb)==0 ) zDb = 0; rc = sqlite3_table_column_metadata(db, zDb, zTbl, zCol, &zDatatype, &zCollseq, ¬null, &primarykey, &autoincrement); if( rc!=SQLITE_OK ){ Tcl_AppendResult(interp, sqlite3_errmsg(db), 0); return TCL_ERROR; } pRet = Tcl_NewObj(); Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zDatatype, -1)); Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zCollseq, -1)); Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(notnull)); Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(primarykey)); Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(autoincrement)); Tcl_SetObjResult(interp, pRet); return TCL_OK;}#endif/*** Usage: sqlite3_load_extension DB-HANDLE FILE ?PROC?*/static int test_load_extension( 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; int rc; char *zDb; char *zFile; char *zProc = 0; char *zErr = 0; if( objc!=4 && objc!=3 ){ Tcl_WrongNumArgs(interp, 1, objv, "DB-HANDLE FILE ?PROC?"); return TCL_ERROR; } zDb = Tcl_GetString(objv[1]); zFile = Tcl_GetString(objv[2]); if( objc==4 ){ zProc = Tcl_GetString(objv[3]); } /* 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); /* Call the underlying C function. If an error occurs, set rc to ** TCL_ERROR and load any error string into the interpreter. If no ** error occurs, set rc to TCL_OK. */#ifdef SQLITE_OMIT_LOAD_EXTENSION rc = SQLITE_ERROR; zErr = sqlite3_mprintf("this build omits sqlite3_load_extension()");#else rc = sqlite3_load_extension(db, zFile, zProc, &zErr);#endif if( rc!=SQLITE_OK ){ Tcl_SetResult(interp, zErr ? zErr : "", TCL_VOLATILE); rc = TCL_ERROR; }else{ rc = TCL_OK; } sqlite3_free(zErr); return rc;}/*** 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.**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -