| | |
| | |
| | |
| | |
| | #define TCLSH_INIT_PROC sqlite3_checker_init_proc |
| | #define SQLITE_ENABLE_DBPAGE_VTAB 1 |
| | #undef SQLITE_THREADSAFE |
| | #define SQLITE_THREADSAFE 0 |
| | #undef SQLITE_ENABLE_COLUMN_METADATA |
| | #define SQLITE_OMIT_DECLTYPE 1 |
| | #define SQLITE_OMIT_DEPRECATED 1 |
| | #define SQLITE_OMIT_PROGRESS_CALLBACK 1 |
| | #define SQLITE_OMIT_SHARED_CACHE 1 |
| | #define SQLITE_DEFAULT_MEMSTATUS 0 |
| | #define SQLITE_MAX_EXPR_DEPTH 0 |
| | INCLUDE sqlite3.c |
| | INCLUDE $ROOT/src/tclsqlite.c |
| | INCLUDE $ROOT/ext/misc/btreeinfo.c |
| | INCLUDE $ROOT/ext/repair/checkindex.c |
| | INCLUDE $ROOT/ext/repair/checkfreelist.c |
| |
|
| | |
| | |
| | |
| | int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb){ |
| | struct SqliteDb *p; |
| | Tcl_CmdInfo cmdInfo; |
| | if( Tcl_GetCommandInfo(interp, zA, &cmdInfo) ){ |
| | p = (struct SqliteDb*)cmdInfo.objClientData; |
| | *ppDb = p->db; |
| | return TCL_OK; |
| | }else{ |
| | *ppDb = 0; |
| | return TCL_ERROR; |
| | } |
| | return TCL_OK; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | static int sqlite3_imposter( |
| | void *clientData, |
| | Tcl_Interp *interp, |
| | int objc, |
| | Tcl_Obj *CONST objv[] |
| | ){ |
| | sqlite3 *db; |
| | const char *zSchema; |
| | int iRoot; |
| | const char *zSql; |
| |
|
| | if( objc!=3 && objc!=5 ){ |
| | Tcl_WrongNumArgs(interp, 1, objv, "DB SCHEMA [ROOTPAGE SQL]"); |
| | return TCL_ERROR; |
| | } |
| | if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; |
| | zSchema = Tcl_GetString(objv[2]); |
| | if( objc==3 ){ |
| | sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, zSchema, 0, 1); |
| | }else{ |
| | if( Tcl_GetIntFromObj(interp, objv[3], &iRoot) ) return TCL_ERROR; |
| | zSql = Tcl_GetString(objv[4]); |
| | sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, zSchema, 1, iRoot); |
| | sqlite3_exec(db, zSql, 0, 0, 0); |
| | sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, zSchema, 0, 0); |
| | } |
| | return TCL_OK; |
| | } |
| |
|
| | #include <stdio.h> |
| |
|
| | const char *sqlite3_checker_init_proc(Tcl_Interp *interp){ |
| | Tcl_CreateObjCommand(interp, "sqlite3_imposter", |
| | (Tcl_ObjCmdProc*)sqlite3_imposter, 0, 0); |
| | sqlite3_auto_extension((void(*)(void))sqlite3_btreeinfo_init); |
| | sqlite3_auto_extension((void(*)(void))sqlite3_checkindex_init); |
| | sqlite3_auto_extension((void(*)(void))sqlite3_checkfreelist_init); |
| | return |
| | BEGIN_STRING |
| | INCLUDE $ROOT/ext/repair/sqlite3_checker.tcl |
| | END_STRING |
| | ; |
| | } |
| |
|