Index: third_party/sqlite/src/src/test6.c |
diff --git a/third_party/sqlite/src/src/test6.c b/third_party/sqlite/src/src/test6.c |
index 306482dcd30964268958e854eae4fb87bda06ad0..5304bcc31f20b012501aa544ffe6a618a1c12671 100644 |
--- a/third_party/sqlite/src/src/test6.c |
+++ b/third_party/sqlite/src/src/test6.c |
@@ -16,7 +16,11 @@ |
*/ |
#if SQLITE_TEST /* This file is used for testing only */ |
#include "sqliteInt.h" |
-#include "tcl.h" |
+#if defined(INCLUDE_SQLITE_TCL_H) |
+# include "sqlite_tcl.h" |
+#else |
+# include "tcl.h" |
+#endif |
#ifndef SQLITE_OMIT_DISKIO /* This file is a no-op if disk I/O is disabled */ |
@@ -215,7 +219,9 @@ static int writeListSync(CrashFile *pFile, int isCrash){ |
} |
#ifdef TRACE_CRASHTEST |
- printf("Sync %s (is %s crash)\n", pFile->zName, (isCrash?"a":"not a")); |
+ if( pFile ){ |
+ printf("Sync %s (is %s crash)\n", pFile->zName, (isCrash?"a":"not a")); |
+ } |
#endif |
ppPtr = &g.pWriteList; |
@@ -701,6 +707,10 @@ static int cfCurrentTime(sqlite3_vfs *pCfVfs, double *pTimeOut){ |
sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData; |
return pVfs->xCurrentTime(pVfs, pTimeOut); |
} |
+static int cfGetLastError(sqlite3_vfs *pCfVfs, int n, char *z){ |
+ sqlite3_vfs *pVfs = (sqlite3_vfs *)pCfVfs->pAppData; |
+ return pVfs->xGetLastError(pVfs, n, z); |
+} |
static int processDevSymArgs( |
Tcl_Interp *interp, |
@@ -796,12 +806,33 @@ static int processDevSymArgs( |
} |
/* |
+** tclcmd: sqlite3_crash_now |
+** |
+** Simulate a crash immediately. This function does not return |
+** (writeListSync() calls exit(-1)). |
+*/ |
+static int SQLITE_TCLAPI crashNowCmd( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ if( objc!=1 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, ""); |
+ return TCL_ERROR; |
+ } |
+ writeListSync(0, 1); |
+ assert( 0 ); |
+ return TCL_OK; |
+} |
+ |
+/* |
** tclcmd: sqlite_crash_enable ENABLE |
** |
** Parameter ENABLE must be a boolean value. If true, then the "crash" |
** vfs is added to the system. If false, it is removed. |
*/ |
-static int crashEnableCmd( |
+static int SQLITE_TCLAPI crashEnableCmd( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -827,7 +858,7 @@ static int crashEnableCmd( |
cfRandomness, /* xRandomness */ |
cfSleep, /* xSleep */ |
cfCurrentTime, /* xCurrentTime */ |
- 0, /* xGetlastError */ |
+ cfGetLastError, /* xGetLastError */ |
0, /* xCurrentTimeInt64 */ |
}; |
@@ -876,7 +907,7 @@ static int crashEnableCmd( |
** sqlite_crashparams -sect 1024 -char {atomic sequential} ./test.db 1 |
** |
*/ |
-static int crashParamsObjCmd( |
+static int SQLITE_TCLAPI crashParamsObjCmd( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -923,7 +954,7 @@ error: |
return TCL_ERROR; |
} |
-static int devSymObjCmd( |
+static int SQLITE_TCLAPI devSymObjCmd( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -940,12 +971,33 @@ static int devSymObjCmd( |
devsym_register(iDc, iSectorSize); |
return TCL_OK; |
+ |
+} |
+ |
+/* |
+** tclcmd: unregister_devsim |
+*/ |
+static int SQLITE_TCLAPI dsUnregisterObjCmd( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ void devsym_unregister(void); |
+ |
+ if( objc!=1 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, ""); |
+ return TCL_ERROR; |
+ } |
+ |
+ devsym_unregister(); |
+ return TCL_OK; |
} |
/* |
** tclcmd: register_jt_vfs ?-default? PARENT-VFS |
*/ |
-static int jtObjCmd( |
+static int SQLITE_TCLAPI jtObjCmd( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -983,7 +1035,7 @@ static int jtObjCmd( |
/* |
** tclcmd: unregister_jt_vfs |
*/ |
-static int jtUnregisterObjCmd( |
+static int SQLITE_TCLAPI jtUnregisterObjCmd( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -1009,7 +1061,9 @@ int Sqlitetest6_Init(Tcl_Interp *interp){ |
#ifndef SQLITE_OMIT_DISKIO |
Tcl_CreateObjCommand(interp, "sqlite3_crash_enable", crashEnableCmd, 0, 0); |
Tcl_CreateObjCommand(interp, "sqlite3_crashparams", crashParamsObjCmd, 0, 0); |
+ Tcl_CreateObjCommand(interp, "sqlite3_crash_now", crashNowCmd, 0, 0); |
Tcl_CreateObjCommand(interp, "sqlite3_simulate_device", devSymObjCmd, 0, 0); |
+ Tcl_CreateObjCommand(interp, "unregister_devsim", dsUnregisterObjCmd, 0, 0); |
Tcl_CreateObjCommand(interp, "register_jt_vfs", jtObjCmd, 0, 0); |
Tcl_CreateObjCommand(interp, "unregister_jt_vfs", jtUnregisterObjCmd, 0, 0); |
#endif |