Index: third_party/sqlite/src/src/test1.c |
diff --git a/third_party/sqlite/src/src/test1.c b/third_party/sqlite/src/src/test1.c |
index c5e71582bcd5a5a21f9f0982e83c465b04f21692..d17fc1022ad4208641894466a6d5fb1a20c76a91 100644 |
--- a/third_party/sqlite/src/src/test1.c |
+++ b/third_party/sqlite/src/src/test1.c |
@@ -19,7 +19,11 @@ |
#endif |
#include "vdbeInt.h" |
-#include "tcl.h" |
+#if defined(INCLUDE_SQLITE_TCL_H) |
+# include "sqlite_tcl.h" |
+#else |
+# include "tcl.h" |
+#endif |
#include <stdlib.h> |
#include <string.h> |
@@ -75,7 +79,7 @@ void *sqlite3TestTextToPtr(const char *z){ |
** for an sqlite connection instance. Bad things happen if the |
** input is not an sqlite connection. |
*/ |
-static int get_sqlite_pointer( |
+static int SQLITE_TCLAPI get_sqlite_pointer( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -221,7 +225,7 @@ static void io_trace_callback(const char *zFormat, ...){ |
** I/O tracing begins going into FILENAME. If FILENAME is an empty |
** string, I/O tracing is turned off. |
*/ |
-static int test_io_trace( |
+static int SQLITE_TCLAPI test_io_trace( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -262,7 +266,7 @@ static int test_io_trace( |
** |
** Also return true if the OMIT_MISUSE environment variable exists. |
*/ |
-static int clang_sanitize_address( |
+static int SQLITE_TCLAPI clang_sanitize_address( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -289,7 +293,7 @@ static int clang_sanitize_address( |
** DB. The SQL is the string FORMAT. The format string should contain |
** one %s or %q. STRING is the value inserted into %s or %q. |
*/ |
-static int test_exec_printf( |
+static int SQLITE_TCLAPI test_exec_printf( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -327,7 +331,7 @@ static int test_exec_printf( |
** HEX into ASCII. Most characters are translated as is. %HH becomes |
** a hex character. |
*/ |
-static int test_exec_hex( |
+static int SQLITE_TCLAPI test_exec_hex( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -373,7 +377,7 @@ static int test_exec_hex( |
** |
** Enter or leave the mutex on a database connection. |
*/ |
-static int db_enter( |
+static int SQLITE_TCLAPI db_enter( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -389,7 +393,7 @@ static int db_enter( |
sqlite3_mutex_enter(db->mutex); |
return TCL_OK; |
} |
-static int db_leave( |
+static int SQLITE_TCLAPI db_leave( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -411,7 +415,7 @@ static int db_leave( |
** |
** Invoke the sqlite3_exec interface using the open database DB |
*/ |
-static int test_exec( |
+static int SQLITE_TCLAPI test_exec( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -458,7 +462,7 @@ static int test_exec( |
** Invoke the sqlite3_exec interface using the open database DB. Discard |
** all results |
*/ |
-static int test_exec_nr( |
+static int SQLITE_TCLAPI test_exec_nr( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -485,7 +489,7 @@ static int test_exec_nr( |
** concatenate arg0 through argn using separator as the separator. |
** Return the result. |
*/ |
-static int test_mprintf_z( |
+static int SQLITE_TCLAPI test_mprintf_z( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -508,7 +512,7 @@ static int test_mprintf_z( |
** Test the %n format of sqlite_mprintf(). Return the length of the |
** input string. |
*/ |
-static int test_mprintf_n( |
+static int SQLITE_TCLAPI test_mprintf_n( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -532,7 +536,7 @@ static int test_mprintf_n( |
** You pass in a format string that requires more than one argument, |
** bad things will happen. |
*/ |
-static int test_snprintf_int( |
+static int SQLITE_TCLAPI test_snprintf_int( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -558,7 +562,7 @@ static int test_snprintf_int( |
** DB. The SQL is the string FORMAT. The format string should contain |
** one %s or %q. STRING is the value inserted into %s or %q. |
*/ |
-static int test_get_table_printf( |
+static int SQLITE_TCLAPI test_get_table_printf( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -621,7 +625,7 @@ static int test_get_table_printf( |
** |
** Returns the integer ROWID of the most recent insert. |
*/ |
-static int test_last_rowid( |
+static int SQLITE_TCLAPI test_last_rowid( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -645,13 +649,13 @@ static int test_last_rowid( |
** |
** Set the codec key. |
*/ |
-static int test_key( |
+static int SQLITE_TCLAPI test_key( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
char **argv /* Text of each argument */ |
){ |
-#ifdef SQLITE_HAS_CODEC |
+#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_CODEC_FROM_TCL) |
sqlite3 *db; |
const char *zKey; |
int nKey; |
@@ -673,7 +677,7 @@ static int test_key( |
** |
** Change the codec key. |
*/ |
-static int test_rekey( |
+static int SQLITE_TCLAPI test_rekey( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -701,7 +705,7 @@ static int test_rekey( |
** |
** Closes the database opened by sqlite3_open. |
*/ |
-static int sqlite_test_close( |
+static int SQLITE_TCLAPI sqlite_test_close( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -725,7 +729,7 @@ static int sqlite_test_close( |
** |
** Closes the database opened by sqlite3_open. |
*/ |
-static int sqlite_test_close_v2( |
+static int SQLITE_TCLAPI sqlite_test_close_v2( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1009,7 +1013,7 @@ static void nondeterministicFunction( |
** sqlite3_create_function function while a query is in progress in order |
** to test the SQLITE_MISUSE detection logic. |
*/ |
-static int test_create_function( |
+static int SQLITE_TCLAPI test_create_function( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1166,7 +1170,7 @@ static void legacyCountFinalize(sqlite3_context *context){ |
** "legacy_count()" with the supplied database handle. This is used |
** to test the deprecated sqlite3_aggregate_count() API. |
*/ |
-static int test_create_aggregate( |
+static int SQLITE_TCLAPI test_create_aggregate( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1207,7 +1211,7 @@ static int test_create_aggregate( |
** Puts uses a separate buffer and debugging statements will be out of |
** sequence if it is used. |
*/ |
-static int test_printf( |
+static int SQLITE_TCLAPI test_printf( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1229,7 +1233,7 @@ static int test_printf( |
** |
** Call mprintf with three integer arguments |
*/ |
-static int sqlite3_mprintf_int( |
+static int SQLITE_TCLAPI sqlite3_mprintf_int( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1256,7 +1260,7 @@ static int sqlite3_mprintf_int( |
** |
** Call mprintf with three 64-bit integer arguments |
*/ |
-static int sqlite3_mprintf_int64( |
+static int SQLITE_TCLAPI sqlite3_mprintf_int64( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1271,7 +1275,7 @@ static int sqlite3_mprintf_int64( |
return TCL_ERROR; |
} |
for(i=2; i<5; i++){ |
- if( sqlite3Atoi64(argv[i], &a[i-2], 1000000, SQLITE_UTF8) ){ |
+ if( sqlite3Atoi64(argv[i], &a[i-2], sqlite3Strlen30(argv[i]), SQLITE_UTF8) ){ |
Tcl_AppendResult(interp, "argument is not a valid 64-bit integer", 0); |
return TCL_ERROR; |
} |
@@ -1289,7 +1293,7 @@ static int sqlite3_mprintf_int64( |
** same as sqlite3_mprintf_int or sqlite3_mprintf_int64, depending on |
** platform. |
*/ |
-static int sqlite3_mprintf_long( |
+static int SQLITE_TCLAPI sqlite3_mprintf_long( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1320,7 +1324,7 @@ static int sqlite3_mprintf_long( |
** |
** Call mprintf with two integer arguments and one string argument |
*/ |
-static int sqlite3_mprintf_str( |
+static int SQLITE_TCLAPI sqlite3_mprintf_str( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1347,7 +1351,7 @@ static int sqlite3_mprintf_str( |
** |
** Call mprintf with two integer arguments and one string argument |
*/ |
-static int sqlite3_snprintf_str( |
+static int SQLITE_TCLAPI sqlite3_snprintf_str( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1381,7 +1385,7 @@ static int sqlite3_snprintf_str( |
** |
** Call mprintf with two integer arguments and one double argument |
*/ |
-static int sqlite3_mprintf_double( |
+static int SQLITE_TCLAPI sqlite3_mprintf_double( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1412,7 +1416,7 @@ static int sqlite3_mprintf_double( |
** two arguments given above. This is used to generate overflow and underflow |
** doubles to test that they are converted properly. |
*/ |
-static int sqlite3_mprintf_scaled( |
+static int SQLITE_TCLAPI sqlite3_mprintf_scaled( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1442,7 +1446,7 @@ static int sqlite3_mprintf_scaled( |
** two arguments given above. This is used to generate overflow and underflow |
** doubles to test that they are converted properly. |
*/ |
-static int sqlite3_mprintf_stronly( |
+static int SQLITE_TCLAPI sqlite3_mprintf_stronly( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1466,7 +1470,7 @@ static int sqlite3_mprintf_stronly( |
** Call mprintf with a single double argument which is derived from the |
** hexadecimal encoding of an IEEE double. |
*/ |
-static int sqlite3_mprintf_hexdouble( |
+static int SQLITE_TCLAPI sqlite3_mprintf_hexdouble( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -1499,7 +1503,7 @@ static int sqlite3_mprintf_hexdouble( |
** |
*/ |
#if !defined(SQLITE_OMIT_SHARED_CACHE) |
-static int test_enable_shared( |
+static int SQLITE_TCLAPI test_enable_shared( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -1536,7 +1540,7 @@ static int test_enable_shared( |
** Usage: sqlite3_extended_result_codes DB BOOLEAN |
** |
*/ |
-static int test_extended_result_codes( |
+static int SQLITE_TCLAPI test_extended_result_codes( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -1559,7 +1563,7 @@ static int test_extended_result_codes( |
** Usage: sqlite3_libversion_number |
** |
*/ |
-static int test_libversion_number( |
+static int SQLITE_TCLAPI test_libversion_number( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -1573,7 +1577,7 @@ static int test_libversion_number( |
** Usage: sqlite3_table_column_metadata DB dbname tblname colname |
** |
*/ |
-static int test_table_column_metadata( |
+static int SQLITE_TCLAPI 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 */ |
@@ -1624,7 +1628,7 @@ static int test_table_column_metadata( |
#ifndef SQLITE_OMIT_INCRBLOB |
-static int blobHandleFromObj( |
+static int SQLITE_TCLAPI blobHandleFromObj( |
Tcl_Interp *interp, |
Tcl_Obj *pObj, |
sqlite3_blob **ppBlob |
@@ -1653,7 +1657,7 @@ static int blobHandleFromObj( |
return TCL_OK; |
} |
-static int test_blob_reopen( |
+static int SQLITE_TCLAPI test_blob_reopen( |
ClientData clientData, /* Not used */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -1729,7 +1733,7 @@ static int testCreateCollationCmp( |
return iRes; |
} |
-static int test_create_collation_v2( |
+static int SQLITE_TCLAPI test_create_collation_v2( |
ClientData clientData, /* Not used */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -1804,7 +1808,7 @@ static void cf2Destroy(void *pUser){ |
if( p->pDestroy ) Tcl_DecrRefCount(p->pDestroy); |
sqlite3_free(p); |
} |
-static int test_create_function_v2( |
+static int SQLITE_TCLAPI test_create_function_v2( |
ClientData clientData, /* Not used */ |
Tcl_Interp *interp, /* The invoking TCL interpreter */ |
int objc, /* Number of arguments */ |
@@ -1892,7 +1896,7 @@ static int test_create_function_v2( |
/* |
** Usage: sqlite3_load_extension DB-HANDLE FILE ?PROC? |
*/ |
-static int test_load_extension( |
+static int SQLITE_TCLAPI test_load_extension( |
ClientData clientData, /* Not used */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -1931,6 +1935,8 @@ static int test_load_extension( |
#ifdef SQLITE_OMIT_LOAD_EXTENSION |
rc = SQLITE_ERROR; |
zErr = sqlite3_mprintf("this build omits sqlite3_load_extension()"); |
+ (void)zProc; |
+ (void)zFile; |
#else |
rc = sqlite3_load_extension(db, zFile, zProc, &zErr); |
#endif |
@@ -1948,7 +1954,7 @@ static int test_load_extension( |
/* |
** Usage: sqlite3_enable_load_extension DB-HANDLE ONOFF |
*/ |
-static int test_enable_load( |
+static int SQLITE_TCLAPI test_enable_load( |
ClientData clientData, /* Not used */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -1994,7 +2000,7 @@ static int test_enable_load( |
** This command is used to test the recoverability of a database in |
** the event of a program crash. |
*/ |
-static int sqlite_abort( |
+static int SQLITE_TCLAPI sqlite_abort( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -2053,7 +2059,7 @@ error_out: |
** |
** Register the test SQL function on the database DB under the name NAME. |
*/ |
-static int test_register_func( |
+static int SQLITE_TCLAPI test_register_func( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -2082,7 +2088,7 @@ static int test_register_func( |
** |
** Finalize a statement handle. |
*/ |
-static int test_finalize( |
+static int SQLITE_TCLAPI test_finalize( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2114,7 +2120,7 @@ static int test_finalize( |
** |
** Get the value of a status counter from a statement. |
*/ |
-static int test_stmt_status( |
+static int SQLITE_TCLAPI test_stmt_status( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2159,7 +2165,7 @@ static int test_stmt_status( |
/* |
** Usage: sqlite3_stmt_scanstatus STMT IDX |
*/ |
-static int test_stmt_scanstatus( |
+static int SQLITE_TCLAPI test_stmt_scanstatus( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2209,7 +2215,7 @@ static int test_stmt_scanstatus( |
/* |
** Usage: sqlite3_stmt_scanstatus_reset STMT |
*/ |
-static int test_stmt_scanstatus_reset( |
+static int SQLITE_TCLAPI test_stmt_scanstatus_reset( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2232,7 +2238,7 @@ static int test_stmt_scanstatus_reset( |
** |
** Zero the SQLITE_CONFIG_SQLLOG configuration |
*/ |
-static int test_config_sqllog( |
+static int SQLITE_TCLAPI test_config_sqllog( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2252,7 +2258,7 @@ static int test_config_sqllog( |
** |
** Return the value returned by the default VFS's xCurrentTimeInt64 method. |
*/ |
-static int vfsCurrentTimeInt64( |
+static int SQLITE_TCLAPI vfsCurrentTimeInt64( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2273,7 +2279,7 @@ static int vfsCurrentTimeInt64( |
/* |
** Usage: sqlite3_snapshot_get DB DBNAME |
*/ |
-static int test_snapshot_get( |
+static int SQLITE_TCLAPI test_snapshot_get( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2306,9 +2312,41 @@ static int test_snapshot_get( |
#ifdef SQLITE_ENABLE_SNAPSHOT |
/* |
+** Usage: sqlite3_snapshot_recover DB DBNAME |
+*/ |
+static int SQLITE_TCLAPI test_snapshot_recover( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int rc; |
+ sqlite3 *db; |
+ char *zName; |
+ |
+ if( objc!=3 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME"); |
+ return TCL_ERROR; |
+ } |
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; |
+ zName = Tcl_GetString(objv[2]); |
+ |
+ rc = sqlite3_snapshot_recover(db, zName); |
+ if( rc!=SQLITE_OK ){ |
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); |
+ return TCL_ERROR; |
+ }else{ |
+ Tcl_ResetResult(interp); |
+ } |
+ return TCL_OK; |
+} |
+#endif /* SQLITE_ENABLE_SNAPSHOT */ |
+ |
+#ifdef SQLITE_ENABLE_SNAPSHOT |
+/* |
** Usage: sqlite3_snapshot_open DB DBNAME SNAPSHOT |
*/ |
-static int test_snapshot_open( |
+static int SQLITE_TCLAPI test_snapshot_open( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2340,7 +2378,7 @@ static int test_snapshot_open( |
/* |
** Usage: sqlite3_snapshot_free SNAPSHOT |
*/ |
-static int test_snapshot_free( |
+static int SQLITE_TCLAPI test_snapshot_free( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2357,12 +2395,167 @@ static int test_snapshot_free( |
} |
#endif /* SQLITE_ENABLE_SNAPSHOT */ |
+#ifdef SQLITE_ENABLE_SNAPSHOT |
+/* |
+** Usage: sqlite3_snapshot_cmp SNAPSHOT1 SNAPSHOT2 |
+*/ |
+static int SQLITE_TCLAPI test_snapshot_cmp( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int res; |
+ sqlite3_snapshot *p1; |
+ sqlite3_snapshot *p2; |
+ if( objc!=3 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "SNAPSHOT1 SNAPSHOT2"); |
+ return TCL_ERROR; |
+ } |
+ p1 = (sqlite3_snapshot*)sqlite3TestTextToPtr(Tcl_GetString(objv[1])); |
+ p2 = (sqlite3_snapshot*)sqlite3TestTextToPtr(Tcl_GetString(objv[2])); |
+ res = sqlite3_snapshot_cmp(p1, p2); |
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(res)); |
+ return TCL_OK; |
+} |
+#endif /* SQLITE_ENABLE_SNAPSHOT */ |
+ |
+#ifdef SQLITE_ENABLE_SNAPSHOT |
+/* |
+** Usage: sqlite3_snapshot_get_blob DB DBNAME |
+*/ |
+static int SQLITE_TCLAPI test_snapshot_get_blob( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int rc; |
+ sqlite3 *db; |
+ char *zName; |
+ sqlite3_snapshot *pSnapshot = 0; |
+ |
+ if( objc!=3 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME"); |
+ return TCL_ERROR; |
+ } |
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; |
+ zName = Tcl_GetString(objv[2]); |
+ |
+ rc = sqlite3_snapshot_get(db, zName, &pSnapshot); |
+ if( rc!=SQLITE_OK ){ |
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); |
+ return TCL_ERROR; |
+ }else{ |
+ Tcl_SetObjResult(interp, |
+ Tcl_NewByteArrayObj((unsigned char*)pSnapshot, sizeof(sqlite3_snapshot)) |
+ ); |
+ sqlite3_snapshot_free(pSnapshot); |
+ } |
+ return TCL_OK; |
+} |
+#endif /* SQLITE_ENABLE_SNAPSHOT */ |
+ |
+#ifdef SQLITE_ENABLE_SNAPSHOT |
+ /* |
+ ** Usage: sqlite3_snapshot_open_blob DB DBNAME SNAPSHOT |
+*/ |
+static int SQLITE_TCLAPI test_snapshot_open_blob( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int rc; |
+ sqlite3 *db; |
+ char *zName; |
+ unsigned char *pBlob; |
+ int nBlob; |
+ |
+ if( objc!=4 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME SNAPSHOT"); |
+ return TCL_ERROR; |
+ } |
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; |
+ zName = Tcl_GetString(objv[2]); |
+ pBlob = Tcl_GetByteArrayFromObj(objv[3], &nBlob); |
+ if( nBlob!=sizeof(sqlite3_snapshot) ){ |
+ Tcl_AppendResult(interp, "bad SNAPSHOT", 0); |
+ return TCL_ERROR; |
+ } |
+ rc = sqlite3_snapshot_open(db, zName, (sqlite3_snapshot*)pBlob); |
+ if( rc!=SQLITE_OK ){ |
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); |
+ return TCL_ERROR; |
+ } |
+ return TCL_OK; |
+} |
+#endif /* SQLITE_ENABLE_SNAPSHOT */ |
+ |
+#ifdef SQLITE_ENABLE_SNAPSHOT |
+/* |
+** Usage: sqlite3_snapshot_cmp_blob SNAPSHOT1 SNAPSHOT2 |
+*/ |
+static int SQLITE_TCLAPI test_snapshot_cmp_blob( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int res; |
+ unsigned char *p1; |
+ unsigned char *p2; |
+ int n1; |
+ int n2; |
+ |
+ if( objc!=3 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "SNAPSHOT1 SNAPSHOT2"); |
+ return TCL_ERROR; |
+ } |
+ |
+ p1 = Tcl_GetByteArrayFromObj(objv[1], &n1); |
+ p2 = Tcl_GetByteArrayFromObj(objv[2], &n2); |
+ |
+ if( n1!=sizeof(sqlite3_snapshot) || n1!=n2 ){ |
+ Tcl_AppendResult(interp, "bad SNAPSHOT", 0); |
+ return TCL_ERROR; |
+ } |
+ |
+ res = sqlite3_snapshot_cmp((sqlite3_snapshot*)p1, (sqlite3_snapshot*)p2); |
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(res)); |
+ return TCL_OK; |
+} |
+#endif /* SQLITE_ENABLE_SNAPSHOT */ |
+ |
+/* |
+** Usage: sqlite3_delete_database FILENAME |
+*/ |
+int sqlite3_delete_database(const char*); /* in test_delete.c */ |
+static int SQLITE_TCLAPI test_delete_database( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int rc; |
+ const char *zFile; |
+ if( objc!=2 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "FILE"); |
+ return TCL_ERROR; |
+ } |
+ zFile = (const char*)Tcl_GetString(objv[1]); |
+ rc = sqlite3_delete_database(zFile); |
+ |
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); |
+ return TCL_OK; |
+} |
+ |
/* |
** Usage: sqlite3_next_stmt DB STMT |
** |
** Return the next statment in sequence after STMT. |
*/ |
-static int test_next_stmt( |
+static int SQLITE_TCLAPI test_next_stmt( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2394,7 +2587,7 @@ static int test_next_stmt( |
** Return true if STMT is a NULL pointer or a pointer to a statement |
** that is guaranteed to leave the database unmodified. |
*/ |
-static int test_stmt_readonly( |
+static int SQLITE_TCLAPI test_stmt_readonly( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2421,7 +2614,7 @@ static int test_stmt_readonly( |
** Return true if STMT is a non-NULL pointer to a statement |
** that has been stepped but not to completion. |
*/ |
-static int test_stmt_busy( |
+static int SQLITE_TCLAPI test_stmt_busy( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2447,7 +2640,7 @@ static int test_stmt_busy( |
** |
** Return true if STMT uses a statement journal. |
*/ |
-static int uses_stmt_journal( |
+static int SQLITE_TCLAPI uses_stmt_journal( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2473,7 +2666,7 @@ static int uses_stmt_journal( |
** |
** Reset a statement handle. |
*/ |
-static int test_reset( |
+static int SQLITE_TCLAPI test_reset( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2508,7 +2701,7 @@ static int test_reset( |
** |
** Return TRUE if a recompilation of the statement is recommended. |
*/ |
-static int test_expired( |
+static int SQLITE_TCLAPI test_expired( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2532,7 +2725,7 @@ static int test_expired( |
** |
** Transfer all bindings from FROMSTMT over to TOSTMT |
*/ |
-static int test_transfer_bind( |
+static int SQLITE_TCLAPI test_transfer_bind( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2559,7 +2752,7 @@ static int test_transfer_bind( |
** Return the number of changes made to the database by the last SQL |
** execution. |
*/ |
-static int test_changes( |
+static int SQLITE_TCLAPI test_changes( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2594,7 +2787,7 @@ static int sqlite_static_bind_nbyte = 0; |
** 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( |
+static int SQLITE_TCLAPI test_bind( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -2716,7 +2909,7 @@ static int test_collate_func( |
Tcl_GetIntFromObj(i, Tcl_GetObjResult(i), &res); |
return res; |
} |
-static int test_collate( |
+static int SQLITE_TCLAPI test_collate( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2790,7 +2983,7 @@ static int test_utf16bin_collate_func( |
if( res==0 ) res = nA - nB; |
return res; |
} |
-static int test_utf16bin_collate( |
+static int SQLITE_TCLAPI test_utf16bin_collate( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2847,7 +3040,7 @@ static void test_collate_needed_cb( |
/* |
** Usage: add_test_collate_needed DB |
*/ |
-static int test_collate_needed( |
+static int SQLITE_TCLAPI test_collate_needed( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -2898,7 +3091,7 @@ static int alignmentCollFunc( |
} |
return rc; |
} |
-static int add_alignment_test_collations( |
+static int SQLITE_TCLAPI add_alignment_test_collations( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3016,7 +3209,7 @@ static void test_function_utf16be( |
sqlite3ValueFree(pVal); |
} |
#endif /* SQLITE_OMIT_UTF16 */ |
-static int test_function( |
+static int SQLITE_TCLAPI test_function( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3061,7 +3254,7 @@ bad_args: |
** The result is a list of two elements, the string representation of the |
** error code and the english language explanation. |
*/ |
-static int test_errstr( |
+static int SQLITE_TCLAPI test_errstr( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3094,7 +3287,7 @@ static int test_errstr( |
** Then run testfixture in the debugger and wait for the breakpoint to |
** fire. Then additional breakpoints can be set to trace down the bug. |
*/ |
-static int test_breakpoint( |
+static int SQLITE_TCLAPI test_breakpoint( |
void *NotUsed, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int argc, /* Number of arguments */ |
@@ -3110,7 +3303,7 @@ static int test_breakpoint( |
** IDX is the index of a wildcard in the prepared statement. This command |
** binds a N-byte zero-filled BLOB to the wildcard. |
*/ |
-static int test_bind_zeroblob( |
+static int SQLITE_TCLAPI test_bind_zeroblob( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3146,7 +3339,7 @@ static int test_bind_zeroblob( |
** IDX is the index of a wildcard in the prepared statement. This command |
** binds a N-byte zero-filled BLOB to the wildcard. |
*/ |
-static int test_bind_zeroblob64( |
+static int SQLITE_TCLAPI test_bind_zeroblob64( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3154,7 +3347,7 @@ static int test_bind_zeroblob64( |
){ |
sqlite3_stmt *pStmt; |
int idx; |
- i64 n; |
+ Tcl_WideInt n; |
int rc; |
if( objc!=4 ){ |
@@ -3183,7 +3376,7 @@ static int test_bind_zeroblob64( |
** N is the index of a wildcard in the prepared statement. This command |
** binds a 32-bit integer VALUE to that wildcard. |
*/ |
-static int test_bind_int( |
+static int SQLITE_TCLAPI test_bind_int( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3215,13 +3408,152 @@ static int test_bind_int( |
/* |
+** Usage: intarray_addr INT ... |
+** |
+** Return the address of a C-language array of 32-bit integers. |
+** |
+** Space to hold the array is obtained from malloc(). Call this procedure once |
+** with no arguments in order to release memory. Each call to this procedure |
+** overwrites the previous array. |
+*/ |
+static int SQLITE_TCLAPI test_intarray_addr( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int i; |
+ static int *p = 0; |
+ |
+ sqlite3_free(p); |
+ p = 0; |
+ if( objc>1 ){ |
+ p = sqlite3_malloc( sizeof(p[0])*(objc-1) ); |
+ if( p==0 ) return TCL_ERROR; |
+ for(i=0; i<objc-1; i++){ |
+ if( Tcl_GetIntFromObj(interp, objv[1+i], &p[i]) ){ |
+ sqlite3_free(p); |
+ p = 0; |
+ return TCL_ERROR; |
+ } |
+ } |
+ } |
+ Tcl_SetObjResult(interp, Tcl_NewWideIntObj((sqlite3_int64)p)); |
+ return TCL_OK; |
+} |
+/* |
+** Usage: intarray_addr INT ... |
+** |
+** Return the address of a C-language array of 32-bit integers. |
+** |
+** Space to hold the array is obtained from malloc(). Call this procedure once |
+** with no arguments in order to release memory. Each call to this procedure |
+** overwrites the previous array. |
+*/ |
+static int SQLITE_TCLAPI test_int64array_addr( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int i; |
+ static sqlite3_int64 *p = 0; |
+ |
+ sqlite3_free(p); |
+ p = 0; |
+ if( objc>1 ){ |
+ p = sqlite3_malloc( sizeof(p[0])*(objc-1) ); |
+ if( p==0 ) return TCL_ERROR; |
+ for(i=0; i<objc-1; i++){ |
+ Tcl_WideInt v; |
+ if( Tcl_GetWideIntFromObj(interp, objv[1+i], &v) ){ |
+ sqlite3_free(p); |
+ p = 0; |
+ return TCL_ERROR; |
+ } |
+ p[i] = v; |
+ } |
+ } |
+ Tcl_SetObjResult(interp, Tcl_NewWideIntObj((sqlite3_int64)p)); |
+ return TCL_OK; |
+} |
+/* |
+** Usage: doublearray_addr INT ... |
+** |
+** Return the address of a C-language array of doubles. |
+** |
+** Space to hold the array is obtained from malloc(). Call this procedure once |
+** with no arguments in order to release memory. Each call to this procedure |
+** overwrites the previous array. |
+*/ |
+static int SQLITE_TCLAPI test_doublearray_addr( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int i; |
+ static double *p = 0; |
+ |
+ sqlite3_free(p); |
+ p = 0; |
+ if( objc>1 ){ |
+ p = sqlite3_malloc( sizeof(p[0])*(objc-1) ); |
+ if( p==0 ) return TCL_ERROR; |
+ for(i=0; i<objc-1; i++){ |
+ if( Tcl_GetDoubleFromObj(interp, objv[1+i], &p[i]) ){ |
+ sqlite3_free(p); |
+ p = 0; |
+ return TCL_ERROR; |
+ } |
+ } |
+ } |
+ Tcl_SetObjResult(interp, Tcl_NewWideIntObj((sqlite3_int64)p)); |
+ return TCL_OK; |
+} |
+/* |
+** Usage: textarray_addr TEXT ... |
+** |
+** Return the address of a C-language array of strings. |
+** |
+** Space to hold the array is obtained from malloc(). Call this procedure once |
+** with no arguments in order to release memory. Each call to this procedure |
+** overwrites the previous array. |
+*/ |
+static int SQLITE_TCLAPI test_textarray_addr( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int i; |
+ static int n = 0; |
+ static char **p = 0; |
+ |
+ for(i=0; i<n; i++) sqlite3_free(p[i]); |
+ sqlite3_free(p); |
+ p = 0; |
+ if( objc>1 ){ |
+ p = sqlite3_malloc( sizeof(p[0])*(objc-1) ); |
+ if( p==0 ) return TCL_ERROR; |
+ for(i=0; i<objc-1; i++){ |
+ p[i] = sqlite3_mprintf("%s", Tcl_GetString(objv[1+i])); |
+ } |
+ } |
+ n = objc-1; |
+ Tcl_SetObjResult(interp, Tcl_NewWideIntObj((sqlite3_int64)p)); |
+ return TCL_OK; |
+} |
+ |
+ |
+/* |
** Usage: sqlite3_bind_int64 STMT N VALUE |
** |
** Test the sqlite3_bind_int64 interface. STMT is a prepared statement. |
** N is the index of a wildcard in the prepared statement. This command |
** binds a 64-bit integer VALUE to that wildcard. |
*/ |
-static int test_bind_int64( |
+static int SQLITE_TCLAPI test_bind_int64( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3259,7 +3591,7 @@ static int test_bind_int64( |
** N is the index of a wildcard in the prepared statement. This command |
** binds a 64-bit integer VALUE to that wildcard. |
*/ |
-static int test_bind_double( |
+static int SQLITE_TCLAPI test_bind_double( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3335,7 +3667,7 @@ static int test_bind_double( |
** N is the index of a wildcard in the prepared statement. This command |
** binds a NULL to the wildcard. |
*/ |
-static int test_bind_null( |
+static int SQLITE_TCLAPI test_bind_null( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3371,7 +3703,7 @@ static int test_bind_null( |
** binds a UTF-8 string STRING to the wildcard. The string is BYTES bytes |
** long. |
*/ |
-static int test_bind_text( |
+static int SQLITE_TCLAPI test_bind_text( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3412,7 +3744,7 @@ static int test_bind_text( |
** binds a UTF-16 string STRING to the wildcard. The string is BYTES bytes |
** long. |
*/ |
-static int test_bind_text16( |
+static int SQLITE_TCLAPI test_bind_text16( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3460,14 +3792,14 @@ static int test_bind_text16( |
** N is the index of a wildcard in the prepared statement. This command |
** binds a BLOB to the wildcard. The BLOB is BYTES bytes in size. |
*/ |
-static int test_bind_blob( |
+static int SQLITE_TCLAPI test_bind_blob( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
Tcl_Obj *CONST objv[] |
){ |
sqlite3_stmt *pStmt; |
- int idx; |
+ int len, idx; |
int bytes; |
char *value; |
int rc; |
@@ -3486,9 +3818,18 @@ static int test_bind_blob( |
if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; |
if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; |
- value = Tcl_GetString(objv[3]); |
+ |
+ value = (char*)Tcl_GetByteArrayFromObj(objv[3], &len); |
if( Tcl_GetIntFromObj(interp, objv[4], &bytes) ) return TCL_ERROR; |
+ if( bytes>len ){ |
+ char zBuf[200]; |
+ sqlite3_snprintf(sizeof(zBuf), zBuf, |
+ "cannot use %d blob bytes, have %d", bytes, len); |
+ Tcl_AppendResult(interp, zBuf, -1); |
+ return TCL_ERROR; |
+ } |
+ |
rc = sqlite3_bind_blob(pStmt, idx, value, bytes, xDestructor); |
if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; |
if( rc!=SQLITE_OK ){ |
@@ -3503,7 +3844,7 @@ static int test_bind_blob( |
** |
** Return the number of wildcards in the given statement. |
*/ |
-static int test_bind_parameter_count( |
+static int SQLITE_TCLAPI test_bind_parameter_count( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3527,7 +3868,7 @@ static int test_bind_parameter_count( |
** An empty string is returned if N is out of range or if the wildcard |
** is nameless. |
*/ |
-static int test_bind_parameter_name( |
+static int SQLITE_TCLAPI test_bind_parameter_name( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3554,7 +3895,7 @@ static int test_bind_parameter_name( |
** Return the index of the wildcard called NAME. Return 0 if there is |
** no such wildcard. |
*/ |
-static int test_bind_parameter_index( |
+static int SQLITE_TCLAPI test_bind_parameter_index( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3579,7 +3920,7 @@ static int test_bind_parameter_index( |
** Usage: sqlite3_clear_bindings STMT |
** |
*/ |
-static int test_clear_bindings( |
+static int SQLITE_TCLAPI test_clear_bindings( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3599,7 +3940,7 @@ static int test_clear_bindings( |
/* |
** Usage: sqlite3_sleep MILLISECONDS |
*/ |
-static int test_sleep( |
+static int SQLITE_TCLAPI test_sleep( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3624,7 +3965,7 @@ static int test_sleep( |
** Return the string representation of the most recent sqlite3_* API |
** error code. e.g. "SQLITE_ERROR". |
*/ |
-static int test_ex_errcode( |
+static int SQLITE_TCLAPI test_ex_errcode( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3651,7 +3992,7 @@ static int test_ex_errcode( |
** Return the string representation of the most recent sqlite3_* API |
** error code. e.g. "SQLITE_ERROR". |
*/ |
-static int test_errcode( |
+static int SQLITE_TCLAPI test_errcode( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3677,7 +4018,7 @@ static int test_errcode( |
** Returns the UTF-8 representation of the error message string for the |
** most recent sqlite3_* API call. |
*/ |
-static int test_errmsg( |
+static int SQLITE_TCLAPI test_errmsg( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3706,7 +4047,7 @@ static int test_errmsg( |
** level, and it includes the 0x00 0x00 terminator bytes at the end of the |
** UTF-16 string. |
*/ |
-static int test_errmsg16( |
+static int SQLITE_TCLAPI test_errmsg16( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3743,7 +4084,7 @@ static int test_errmsg16( |
** variable that is set to the unused portion of <sql> (if any). A |
** STMT handle is returned. |
*/ |
-static int test_prepare( |
+static int SQLITE_TCLAPI test_prepare( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3800,7 +4141,7 @@ static int test_prepare( |
** variable that is set to the unused portion of <sql> (if any). A |
** STMT handle is returned. |
*/ |
-static int test_prepare_v2( |
+static int SQLITE_TCLAPI test_prepare_v2( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3868,7 +4209,7 @@ static int test_prepare_v2( |
** Generate a prepared statement for a zero-byte string as a test |
** for ticket #3134. The string should be preceded by a zero byte. |
*/ |
-static int test_prepare_tkt3134( |
+static int SQLITE_TCLAPI test_prepare_tkt3134( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3911,7 +4252,7 @@ static int test_prepare_tkt3134( |
** variable that is set to the unused portion of <sql> (if any). A |
** STMT handle is returned. |
*/ |
-static int test_prepare16( |
+static int SQLITE_TCLAPI test_prepare16( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -3971,7 +4312,7 @@ static int test_prepare16( |
** variable that is set to the unused portion of <sql> (if any). A |
** STMT handle is returned. |
*/ |
-static int test_prepare16_v2( |
+static int SQLITE_TCLAPI test_prepare16_v2( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4026,7 +4367,7 @@ static int test_prepare16_v2( |
/* |
** Usage: sqlite3_open filename ?options-list? |
*/ |
-static int test_open( |
+static int SQLITE_TCLAPI test_open( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4053,7 +4394,7 @@ static int test_open( |
/* |
** Usage: sqlite3_open_v2 FILENAME FLAGS VFS |
*/ |
-static int test_open_v2( |
+static int SQLITE_TCLAPI test_open_v2( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4123,7 +4464,7 @@ static int test_open_v2( |
/* |
** Usage: sqlite3_open16 filename options |
*/ |
-static int test_open16( |
+static int SQLITE_TCLAPI test_open16( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4155,7 +4496,7 @@ static int test_open16( |
** Return 1 if the supplied argument is a complete SQL statement, or zero |
** otherwise. |
*/ |
-static int test_complete16( |
+static int SQLITE_TCLAPI test_complete16( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4180,7 +4521,7 @@ static int test_complete16( |
** |
** Advance the statement to the next row. |
*/ |
-static int test_step( |
+static int SQLITE_TCLAPI test_step( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4203,7 +4544,7 @@ static int test_step( |
return TCL_OK; |
} |
-static int test_sql( |
+static int SQLITE_TCLAPI test_sql( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4220,13 +4561,33 @@ static int test_sql( |
Tcl_SetResult(interp, (char *)sqlite3_sql(pStmt), TCL_VOLATILE); |
return TCL_OK; |
} |
+static int SQLITE_TCLAPI test_ex_sql( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ sqlite3_stmt *pStmt; |
+ char *z; |
+ |
+ if( objc!=2 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "STMT"); |
+ return TCL_ERROR; |
+ } |
+ |
+ if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; |
+ z = sqlite3_expanded_sql(pStmt); |
+ Tcl_SetResult(interp, z, TCL_VOLATILE); |
+ sqlite3_free(z); |
+ return TCL_OK; |
+} |
/* |
** Usage: sqlite3_column_count STMT |
** |
** Return the number of columns returned by the sql statement STMT. |
*/ |
-static int test_column_count( |
+static int SQLITE_TCLAPI test_column_count( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4251,7 +4612,7 @@ static int test_column_count( |
** |
** Return the type of the data in column 'column' of the current row. |
*/ |
-static int test_column_type( |
+static int SQLITE_TCLAPI test_column_type( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4300,7 +4661,7 @@ static int test_column_type( |
** Return the data in column 'column' of the current row cast as an |
** wide (64-bit) integer. |
*/ |
-static int test_column_int64( |
+static int SQLITE_TCLAPI test_column_int64( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4327,7 +4688,7 @@ static int test_column_int64( |
/* |
** Usage: sqlite3_column_blob STMT column |
*/ |
-static int test_column_blob( |
+static int SQLITE_TCLAPI test_column_blob( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4359,7 +4720,7 @@ static int test_column_blob( |
** |
** Return the data in column 'column' of the current row cast as a double. |
*/ |
-static int test_column_double( |
+static int SQLITE_TCLAPI test_column_double( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4388,7 +4749,7 @@ static int test_column_double( |
** |
** Return the number of columns returned by the sql statement STMT. |
*/ |
-static int test_data_count( |
+static int SQLITE_TCLAPI test_data_count( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4415,7 +4776,7 @@ static int test_data_count( |
** |
** Usage: sqlite3_column_name STMT column |
*/ |
-static int test_stmt_utf8( |
+static int SQLITE_TCLAPI test_stmt_utf8( |
void * clientData, /* Pointer to SQLite API function to be invoke */ |
Tcl_Interp *interp, |
int objc, |
@@ -4442,7 +4803,7 @@ static int test_stmt_utf8( |
return TCL_OK; |
} |
-static int test_global_recover( |
+static int SQLITE_TCLAPI test_global_recover( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4467,7 +4828,7 @@ static int test_global_recover( |
** |
** Usage: sqlite3_column_name STMT column |
*/ |
-static int test_stmt_utf16( |
+static int SQLITE_TCLAPI test_stmt_utf16( |
void * clientData, /* Pointer to SQLite API function to be invoked */ |
Tcl_Interp *interp, |
int objc, |
@@ -4511,7 +4872,7 @@ static int test_stmt_utf16( |
** Usage: sqlite3_column_bytes16 STMT column |
** |
*/ |
-static int test_stmt_int( |
+static int SQLITE_TCLAPI test_stmt_int( |
void * clientData, /* Pointer to SQLite API function to be invoked */ |
Tcl_Interp *interp, |
int objc, |
@@ -4540,7 +4901,7 @@ static int test_stmt_int( |
** |
** Set the db->magic value. This is used to test error recovery logic. |
*/ |
-static int sqlite_set_magic( |
+static int SQLITE_TCLAPI sqlite_set_magic( |
void * clientData, |
Tcl_Interp *interp, |
int argc, |
@@ -4572,7 +4933,7 @@ static int sqlite_set_magic( |
** |
** Trigger an interrupt on DB |
*/ |
-static int test_interrupt( |
+static int SQLITE_TCLAPI test_interrupt( |
void * clientData, |
Tcl_Interp *interp, |
int argc, |
@@ -4613,7 +4974,7 @@ u64 sqlite3StackDepth(void){ |
** |
** Try to measure the amount of stack space used by a call to sqlite3_exec |
*/ |
-static int test_stack_used( |
+static int SQLITE_TCLAPI test_stack_used( |
void * clientData, |
Tcl_Interp *interp, |
int argc, |
@@ -4641,7 +5002,7 @@ static int test_stack_used( |
** is assumed that the user function was created as UTF8, any number of |
** arguments (the way the TCL interface does it). |
*/ |
-static int delete_function( |
+static int SQLITE_TCLAPI delete_function( |
void * clientData, |
Tcl_Interp *interp, |
int argc, |
@@ -4667,7 +5028,7 @@ static int delete_function( |
** DB. It is assumed that the collation sequence was created as UTF8 (the |
** way the TCL interface does it). |
*/ |
-static int delete_collation( |
+static int SQLITE_TCLAPI delete_collation( |
void * clientData, |
Tcl_Interp *interp, |
int argc, |
@@ -4692,7 +5053,7 @@ static int delete_collation( |
** Return true if the database DB is currently in auto-commit mode. |
** Return false if not. |
*/ |
-static int get_autocommit( |
+static int SQLITE_TCLAPI get_autocommit( |
void * clientData, |
Tcl_Interp *interp, |
int argc, |
@@ -4718,7 +5079,7 @@ static int get_autocommit( |
** method of the TCL interface. But we need a way to test the case |
** where it returns SQLITE_MISUSE. |
*/ |
-static int test_busy_timeout( |
+static int SQLITE_TCLAPI test_busy_timeout( |
void * clientData, |
Tcl_Interp *interp, |
int argc, |
@@ -4744,7 +5105,7 @@ static int test_busy_timeout( |
** Return the name of the internal representation for the |
** value of the given variable. |
*/ |
-static int tcl_variable_type( |
+static int SQLITE_TCLAPI tcl_variable_type( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4770,7 +5131,7 @@ static int tcl_variable_type( |
** The integer N is the number of bytes we are trying to release. The |
** return value is the amount of memory actually released. |
*/ |
-static int test_release_memory( |
+static int SQLITE_TCLAPI test_release_memory( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4801,7 +5162,7 @@ static int test_release_memory( |
** Attempt to release memory currently held by database DB. Return the |
** result code (which in the current implementation is always zero). |
*/ |
-static int test_db_release_memory( |
+static int SQLITE_TCLAPI test_db_release_memory( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4824,7 +5185,7 @@ static int test_db_release_memory( |
** |
** Attempt to flush any dirty pages to disk. |
*/ |
-static int test_db_cacheflush( |
+static int SQLITE_TCLAPI test_db_cacheflush( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4848,11 +5209,34 @@ static int test_db_cacheflush( |
} |
/* |
+** Usage: sqlite3_system_errno DB |
+** |
+** Return the low-level system errno value. |
+*/ |
+static int SQLITE_TCLAPI test_system_errno( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ sqlite3 *db; |
+ int iErrno; |
+ if( objc!=2 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "DB"); |
+ return TCL_ERROR; |
+ } |
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; |
+ iErrno = sqlite3_system_errno(db); |
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(iErrno)); |
+ return TCL_OK; |
+} |
+ |
+/* |
** Usage: sqlite3_db_filename DB DBNAME |
** |
** Return the name of a file associated with a database. |
*/ |
-static int test_db_filename( |
+static int SQLITE_TCLAPI test_db_filename( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4876,7 +5260,7 @@ static int test_db_filename( |
** Return 1 or 0 if DBNAME is readonly or not. Return -1 if DBNAME does |
** not exist. |
*/ |
-static int test_db_readonly( |
+static int SQLITE_TCLAPI test_db_readonly( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4901,7 +5285,7 @@ static int test_db_readonly( |
** limit is only changed if the N is present. The previous limit |
** is returned. |
*/ |
-static int test_soft_heap_limit( |
+static int SQLITE_TCLAPI test_soft_heap_limit( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4926,7 +5310,7 @@ static int test_soft_heap_limit( |
** |
** Call the sqlite3_thread_cleanup API. |
*/ |
-static int test_thread_cleanup( |
+static int SQLITE_TCLAPI test_thread_cleanup( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4944,7 +5328,7 @@ static int test_thread_cleanup( |
** Return a list of numbers which are the PagerRefcount for all |
** pagers on each database connection. |
*/ |
-static int test_pager_refcounts( |
+static int SQLITE_TCLAPI test_pager_refcounts( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -4990,7 +5374,7 @@ static int test_pager_refcounts( |
** and that the errors they are seeing in the test scripts might be |
** a result of their defective TCL rather than problems in SQLite. |
*/ |
-static int working_64bit_int( |
+static int SQLITE_TCLAPI working_64bit_int( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5015,7 +5399,7 @@ static int working_64bit_int( |
** VFS when none are previously registered, and the ability to |
** unregister the only available VFS. Ticket #2738 |
*/ |
-static int vfs_unlink_test( |
+static int SQLITE_TCLAPI vfs_unlink_test( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5117,7 +5501,7 @@ static int vfs_unlink_test( |
** This TCL command attempts to vfs_find and vfs_register when the |
** sqlite3_initialize() interface is failing. All calls should fail. |
*/ |
-static int vfs_initfail_test( |
+static int SQLITE_TCLAPI vfs_initfail_test( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5145,7 +5529,7 @@ static int nVfs = 0; |
** |
** Unregister all VFSes. |
*/ |
-static int vfs_unregister_all( |
+static int SQLITE_TCLAPI vfs_unregister_all( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5163,17 +5547,19 @@ static int vfs_unregister_all( |
/* |
** tclcmd: vfs_reregister_all |
** |
-** Restore all VFSes that were removed using vfs_unregister_all |
+** Restore all VFSes that were removed using vfs_unregister_all. Taking |
+** care to put the linked list back together in the same order as it was |
+** in before vfs_unregister_all was invoked. |
*/ |
-static int vfs_reregister_all( |
+static int SQLITE_TCLAPI vfs_reregister_all( |
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 */ |
){ |
int i; |
- for(i=0; i<nVfs; i++){ |
- sqlite3_vfs_register(apVfs[i], i==0); |
+ for(i=nVfs-1; i>=0; i--){ |
+ sqlite3_vfs_register(apVfs[i], 1); |
} |
return TCL_OK; |
} |
@@ -5185,7 +5571,7 @@ static int vfs_reregister_all( |
** This TCL command runs the sqlite3_file_control interface and |
** verifies correct operation of the same. |
*/ |
-static int file_control_test( |
+static int SQLITE_TCLAPI file_control_test( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5220,7 +5606,7 @@ static int file_control_test( |
** This TCL command runs the sqlite3_file_control interface and |
** verifies correct operation of the SQLITE_LAST_ERRNO verb. |
*/ |
-static int file_control_lasterrno_test( |
+static int SQLITE_TCLAPI file_control_lasterrno_test( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5258,7 +5644,7 @@ static int file_control_lasterrno_test( |
** verifies correct operation of the SQLITE_GET_LOCKPROXYFILE and |
** SQLITE_SET_LOCKPROXYFILE verbs. |
*/ |
-static int file_control_chunksize_test( |
+static int SQLITE_TCLAPI file_control_chunksize_test( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5295,7 +5681,7 @@ static int file_control_chunksize_test( |
** This TCL command runs the sqlite3_file_control interface |
** with SQLITE_FCNTL_SIZE_HINT |
*/ |
-static int file_control_sizehint_test( |
+static int SQLITE_TCLAPI file_control_sizehint_test( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5333,7 +5719,7 @@ static int file_control_sizehint_test( |
** verifies correct operation of the SQLITE_GET_LOCKPROXYFILE and |
** SQLITE_SET_LOCKPROXYFILE verbs. |
*/ |
-static int file_control_lockproxy_test( |
+static int SQLITE_TCLAPI file_control_lockproxy_test( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5403,7 +5789,7 @@ static int file_control_lockproxy_test( |
** This TCL command runs the sqlite3_file_control interface with |
** the SQLITE_FCNTL_WIN32_AV_RETRY opcode. |
*/ |
-static int file_control_win32_av_retry( |
+static int SQLITE_TCLAPI file_control_win32_av_retry( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5431,12 +5817,44 @@ static int file_control_win32_av_retry( |
} |
/* |
+** tclcmd: file_control_win32_get_handle DB |
+** |
+** This TCL command runs the sqlite3_file_control interface with |
+** the SQLITE_FCNTL_WIN32_GET_HANDLE opcode. |
+*/ |
+static int file_control_win32_get_handle( |
+ 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; |
+ int rc; |
+ HANDLE hFile = NULL; |
+ char z[100]; |
+ |
+ if( objc!=2 ){ |
+ Tcl_AppendResult(interp, "wrong # args: should be \"", |
+ Tcl_GetStringFromObj(objv[0], 0), " DB", 0); |
+ return TCL_ERROR; |
+ } |
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ){ |
+ return TCL_ERROR; |
+ } |
+ rc = sqlite3_file_control(db, NULL, SQLITE_FCNTL_WIN32_GET_HANDLE, |
+ (void*)&hFile); |
+ sqlite3_snprintf(sizeof(z), z, "%d %p", rc, (void*)hFile); |
+ Tcl_AppendResult(interp, z, (char*)0); |
+ return TCL_OK; |
+} |
+ |
+/* |
** tclcmd: file_control_win32_set_handle DB HANDLE |
** |
** This TCL command runs the sqlite3_file_control interface with |
** the SQLITE_FCNTL_WIN32_SET_HANDLE opcode. |
*/ |
-static int file_control_win32_set_handle( |
+static int SQLITE_TCLAPI file_control_win32_set_handle( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5472,7 +5890,7 @@ static int file_control_win32_set_handle( |
** This TCL command runs the sqlite3_file_control interface with |
** the SQLITE_FCNTL_PERSIST_WAL opcode. |
*/ |
-static int file_control_persist_wal( |
+static int SQLITE_TCLAPI file_control_persist_wal( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5504,7 +5922,7 @@ static int file_control_persist_wal( |
** This TCL command runs the sqlite3_file_control interface with |
** the SQLITE_FCNTL_POWERSAFE_OVERWRITE opcode. |
*/ |
-static int file_control_powersafe_overwrite( |
+static int SQLITE_TCLAPI file_control_powersafe_overwrite( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5536,7 +5954,7 @@ static int file_control_powersafe_overwrite( |
** |
** Return a string that describes the stack of VFSes. |
*/ |
-static int file_control_vfsname( |
+static int SQLITE_TCLAPI file_control_vfsname( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5568,7 +5986,7 @@ static int file_control_vfsname( |
** |
** Return a string that is a temporary filename |
*/ |
-static int file_control_tempfilename( |
+static int SQLITE_TCLAPI file_control_tempfilename( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5601,7 +6019,7 @@ static int file_control_tempfilename( |
** |
** Return a tcl list containing the names of all registered vfs's. |
*/ |
-static int vfs_list( |
+static int SQLITE_TCLAPI vfs_list( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5626,7 +6044,7 @@ static int vfs_list( |
** This TCL command runs the sqlite3_limit interface and |
** verifies correct operation of the same. |
*/ |
-static int test_limit( |
+static int SQLITE_TCLAPI test_limit( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5689,7 +6107,7 @@ static int test_limit( |
** At the same time, verify that sqlite3_test_control works even when |
** called with an out-of-range opcode. |
*/ |
-static int save_prng_state( |
+static int SQLITE_TCLAPI save_prng_state( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5705,7 +6123,7 @@ static int save_prng_state( |
/* |
** tclcmd: restore_prng_state |
*/ |
-static int restore_prng_state( |
+static int SQLITE_TCLAPI restore_prng_state( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5717,7 +6135,7 @@ static int restore_prng_state( |
/* |
** tclcmd: reset_prng_state |
*/ |
-static int reset_prng_state( |
+static int SQLITE_TCLAPI reset_prng_state( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5733,7 +6151,7 @@ static int reset_prng_state( |
** Indicate that database files might be corrupt. In other words, set the normal |
** state of operation. |
*/ |
-static int database_may_be_corrupt( |
+static int SQLITE_TCLAPI database_may_be_corrupt( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5748,7 +6166,7 @@ static int database_may_be_corrupt( |
** Indicate that database files are always well-formed. This enables extra assert() |
** statements that test conditions that are always true for well-formed databases. |
*/ |
-static int database_never_corrupt( |
+static int SQLITE_TCLAPI database_never_corrupt( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5761,7 +6179,7 @@ static int database_never_corrupt( |
/* |
** tclcmd: pcache_stats |
*/ |
-static int test_pcache_stats( |
+static int SQLITE_TCLAPI test_pcache_stats( |
ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5803,7 +6221,7 @@ static void test_unlock_notify_cb(void **aArg, int nArg){ |
** tclcmd: sqlite3_unlock_notify db |
*/ |
#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY |
-static int test_unlock_notify( |
+static int SQLITE_TCLAPI test_unlock_notify( |
ClientData clientData, /* Unused */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5829,7 +6247,7 @@ static int test_unlock_notify( |
/* |
** tclcmd: sqlite3_wal_checkpoint db ?NAME? |
*/ |
-static int test_wal_checkpoint( |
+static int SQLITE_TCLAPI test_wal_checkpoint( |
ClientData clientData, /* Unused */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5873,7 +6291,7 @@ static int test_wal_checkpoint( |
** the number of frames in the log and the number of frames in the log |
** that have been checkpointed. |
*/ |
-static int test_wal_checkpoint_v2( |
+static int SQLITE_TCLAPI test_wal_checkpoint_v2( |
ClientData clientData, /* Unused */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5929,7 +6347,7 @@ static int test_wal_checkpoint_v2( |
/* |
** tclcmd: sqlite3_wal_autocheckpoint db VALUE |
*/ |
-static int test_wal_autocheckpoint( |
+static int SQLITE_TCLAPI test_wal_autocheckpoint( |
ClientData clientData, /* Unused */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -5980,7 +6398,7 @@ static void xLogcallback(void *unused, int err, char *zMsg){ |
Tcl_EvalObjEx(logcallback.pInterp, pNew, TCL_EVAL_GLOBAL|TCL_EVAL_DIRECT); |
Tcl_DecrRefCount(pNew); |
} |
-static int test_sqlite3_log( |
+static int SQLITE_TCLAPI test_sqlite3_log( |
ClientData clientData, |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -6011,7 +6429,7 @@ static int test_sqlite3_log( |
** Run a TCL command using its objProc interface. Throw an error if |
** the command has no objProc interface. |
*/ |
-static int runAsObjProc( |
+static int SQLITE_TCLAPI runAsObjProc( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6074,7 +6492,7 @@ int printExplainQueryPlan(sqlite3_stmt *pStmt){ |
return sqlite3_finalize(pExplain); |
} |
-static int test_print_eqp( |
+static int SQLITE_TCLAPI test_print_eqp( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6102,7 +6520,7 @@ static int test_print_eqp( |
/* |
** sqlite3_test_control VERB ARGS... |
*/ |
-static int test_test_control( |
+static int SQLITE_TCLAPI test_test_control( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6181,7 +6599,7 @@ static int test_test_control( |
#include <sys/time.h> |
#include <sys/resource.h> |
-static int test_getrusage( |
+static int SQLITE_TCLAPI test_getrusage( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6224,7 +6642,7 @@ struct win32FileLocker { |
/* |
** The background thread that does file locking. |
*/ |
-static void win32_file_locker(void *pAppData){ |
+static void SQLITE_CDECL win32_file_locker(void *pAppData){ |
struct win32FileLocker *p = (struct win32FileLocker*)pAppData; |
if( p->evName ){ |
HANDLE ev = OpenEvent(EVENT_MODIFY_STATE, FALSE, p->evName); |
@@ -6255,7 +6673,7 @@ static void win32_file_locker(void *pAppData){ |
** Get an exclusive manditory lock on file for DELAY2 milliseconds. |
** Wait DELAY1 milliseconds before acquiring the lock. |
*/ |
-static int win32_file_lock( |
+static int SQLITE_TCLAPI win32_file_lock( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6319,7 +6737,7 @@ static int win32_file_lock( |
** Returns non-zero if the specified path exists, whose fully qualified name |
** may exceed 260 characters if it is prefixed with "\\?\". |
*/ |
-static int win32_exists_path( |
+static int SQLITE_TCLAPI win32_exists_path( |
void *clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6341,7 +6759,7 @@ static int win32_exists_path( |
** whose fully qualified name may exceed 248 characters if it is prefixed with |
** "\\?\". |
*/ |
-static int win32_find_file( |
+static int SQLITE_TCLAPI win32_find_file( |
void *clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6386,7 +6804,7 @@ static int win32_find_file( |
** Deletes the specified file, whose fully qualified name may exceed 260 |
** characters if it is prefixed with "\\?\". |
*/ |
-static int win32_delete_file( |
+static int SQLITE_TCLAPI win32_delete_file( |
void *clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6410,7 +6828,7 @@ static int win32_delete_file( |
** Creates the specified directory, whose fully qualified name may exceed 248 |
** characters if it is prefixed with "\\?\". |
*/ |
-static int win32_mkdir( |
+static int SQLITE_TCLAPI win32_mkdir( |
void *clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6434,7 +6852,7 @@ static int win32_mkdir( |
** Removes the specified directory, whose fully qualified name may exceed 248 |
** characters if it is prefixed with "\\?\". |
*/ |
-static int win32_rmdir( |
+static int SQLITE_TCLAPI win32_rmdir( |
void *clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6461,7 +6879,7 @@ static int win32_rmdir( |
** interface. Disable if BOOLEAN is false and enable if BOOLEAN is true. |
** OPT is the name of the optimization to be disabled. |
*/ |
-static int optimization_control( |
+static int SQLITE_TCLAPI optimization_control( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6518,20 +6936,21 @@ static int optimization_control( |
return TCL_OK; |
} |
-typedef struct sqlite3_api_routines sqlite3_api_routines; |
/* |
** load_static_extension DB NAME ... |
** |
** Load one or more statically linked extensions. |
*/ |
-static int tclLoadStaticExtensionCmd( |
+static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
Tcl_Obj *CONST objv[] |
){ |
extern int sqlite3_amatch_init(sqlite3*,char**,const sqlite3_api_routines*); |
+ extern int sqlite3_carray_init(sqlite3*,char**,const sqlite3_api_routines*); |
extern int sqlite3_closure_init(sqlite3*,char**,const sqlite3_api_routines*); |
+ extern int sqlite3_csv_init(sqlite3*,char**,const sqlite3_api_routines*); |
extern int sqlite3_eval_init(sqlite3*,char**,const sqlite3_api_routines*); |
extern int sqlite3_fileio_init(sqlite3*,char**,const sqlite3_api_routines*); |
extern int sqlite3_fuzzer_init(sqlite3*,char**,const sqlite3_api_routines*); |
@@ -6539,6 +6958,7 @@ static int tclLoadStaticExtensionCmd( |
extern int sqlite3_nextchar_init(sqlite3*,char**,const sqlite3_api_routines*); |
extern int sqlite3_percentile_init(sqlite3*,char**,const sqlite3_api_routines*); |
extern int sqlite3_regexp_init(sqlite3*,char**,const sqlite3_api_routines*); |
+ extern int sqlite3_remember_init(sqlite3*,char**,const sqlite3_api_routines*); |
extern int sqlite3_series_init(sqlite3*,char**,const sqlite3_api_routines*); |
extern int sqlite3_spellfix_init(sqlite3*,char**,const sqlite3_api_routines*); |
extern int sqlite3_totype_init(sqlite3*,char**,const sqlite3_api_routines*); |
@@ -6548,7 +6968,9 @@ static int tclLoadStaticExtensionCmd( |
int (*pInit)(sqlite3*,char**,const sqlite3_api_routines*); |
} aExtension[] = { |
{ "amatch", sqlite3_amatch_init }, |
+ { "carray", sqlite3_carray_init }, |
{ "closure", sqlite3_closure_init }, |
+ { "csv", sqlite3_csv_init }, |
{ "eval", sqlite3_eval_init }, |
{ "fileio", sqlite3_fileio_init }, |
{ "fuzzer", sqlite3_fuzzer_init }, |
@@ -6556,6 +6978,7 @@ static int tclLoadStaticExtensionCmd( |
{ "nextchar", sqlite3_nextchar_init }, |
{ "percentile", sqlite3_percentile_init }, |
{ "regexp", sqlite3_regexp_init }, |
+ { "remember", sqlite3_remember_init }, |
{ "series", sqlite3_series_init }, |
{ "spellfix", sqlite3_spellfix_init }, |
{ "totype", sqlite3_totype_init }, |
@@ -6598,7 +7021,7 @@ static int tclLoadStaticExtensionCmd( |
** sorter_test_fakeheap BOOL |
** |
*/ |
-static int sorter_test_fakeheap( |
+static int SQLITE_TCLAPI sorter_test_fakeheap( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6638,7 +7061,7 @@ static int sorter_test_fakeheap( |
** Then execute statement $SQL2. Check that the statement returns the same |
** set of integers in the same order as in the previous step (using $SQL1). |
*/ |
-static int sorter_test_sort4_helper( |
+static int SQLITE_TCLAPI sorter_test_sort4_helper( |
void * clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6648,8 +7071,8 @@ static int sorter_test_sort4_helper( |
const char *zSql2; |
int nStep; |
int iStep; |
- int iCksum1 = 0; |
- int iCksum2 = 0; |
+ unsigned int iCksum1 = 0; |
+ unsigned int iCksum2 = 0; |
int rc; |
int iB; |
sqlite3 *db; |
@@ -6676,7 +7099,7 @@ static int sorter_test_sort4_helper( |
return TCL_ERROR; |
} |
- iCksum1 += (iCksum1 << 3) + a; |
+ iCksum1 += (iCksum1 << 3) + (unsigned int)a; |
} |
rc = sqlite3_finalize(pStmt); |
if( rc!=SQLITE_OK ) goto sql_error; |
@@ -6685,7 +7108,7 @@ static int sorter_test_sort4_helper( |
if( rc!=SQLITE_OK ) goto sql_error; |
for(iStep=0; SQLITE_ROW==sqlite3_step(pStmt); iStep++){ |
int a = sqlite3_column_int(pStmt, 0); |
- iCksum2 += (iCksum2 << 3) + a; |
+ iCksum2 += (iCksum2 << 3) + (unsigned int)a; |
} |
rc = sqlite3_finalize(pStmt); |
if( rc!=SQLITE_OK ) goto sql_error; |
@@ -6707,7 +7130,7 @@ static int sorter_test_sort4_helper( |
/* |
** tclcmd: sqlite3_user_authenticate DB USERNAME PASSWORD |
*/ |
-static int test_user_authenticate( |
+static int SQLITE_TCLAPI test_user_authenticate( |
ClientData clientData, /* Unused */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -6738,7 +7161,7 @@ static int test_user_authenticate( |
/* |
** tclcmd: sqlite3_user_add DB USERNAME PASSWORD ISADMIN |
*/ |
-static int test_user_add( |
+static int SQLITE_TCLAPI test_user_add( |
ClientData clientData, /* Unused */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -6771,7 +7194,7 @@ static int test_user_add( |
/* |
** tclcmd: sqlite3_user_change DB USERNAME PASSWORD ISADMIN |
*/ |
-static int test_user_change( |
+static int SQLITE_TCLAPI test_user_change( |
ClientData clientData, /* Unused */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -6804,7 +7227,7 @@ static int test_user_change( |
/* |
** tclcmd: sqlite3_user_delete DB USERNAME |
*/ |
-static int test_user_delete( |
+static int SQLITE_TCLAPI test_user_delete( |
ClientData clientData, /* Unused */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -6841,7 +7264,7 @@ static int test_user_delete( |
** 3 Read after free |
** 4 Panic |
*/ |
-static int test_bad_behavior( |
+static int SQLITE_TCLAPI test_bad_behavior( |
ClientData clientData, /* Pointer to an integer containing zero */ |
Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ |
int objc, /* Number of arguments */ |
@@ -6891,7 +7314,7 @@ static int test_bad_behavior( |
** |
** Cause the dbstat virtual table to be available on the connection DB |
*/ |
-static int test_register_dbstat_vtab( |
+static int SQLITE_TCLAPI test_register_dbstat_vtab( |
void *clientData, |
Tcl_Interp *interp, |
int objc, |
@@ -6921,6 +7344,78 @@ static int test_register_dbstat_vtab( |
} |
/* |
+** tclcmd: sqlite3_db_config DB SETTING VALUE |
+** |
+** Invoke sqlite3_db_config() for one of the setting values. |
+*/ |
+static int SQLITE_TCLAPI test_sqlite3_db_config( |
+ void *clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ static const struct { |
+ const char *zName; |
+ int eVal; |
+ } aSetting[] = { |
+ { "FKEY", SQLITE_DBCONFIG_ENABLE_FKEY }, |
+ { "TRIGGER", SQLITE_DBCONFIG_ENABLE_TRIGGER }, |
+ { "FTS3_TOKENIZER", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, |
+ { "LOAD_EXTENSION", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, |
+ { "NO_CKPT_ON_CLOSE",SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, |
+ }; |
+ int i; |
+ int v; |
+ const char *zSetting; |
+ sqlite3 *db; |
+ |
+ if( objc!=4 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "DB SETTING VALUE"); |
+ return TCL_ERROR; |
+ } |
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; |
+ zSetting = Tcl_GetString(objv[2]); |
+ if( sqlite3_strglob("SQLITE_*", zSetting)==0 ) zSetting += 7; |
+ if( sqlite3_strglob("DBCONFIG_*", zSetting)==0 ) zSetting += 9; |
+ if( sqlite3_strglob("ENABLE_*", zSetting)==0 ) zSetting += 7; |
+ for(i=0; i<ArraySize(aSetting); i++){ |
+ if( strcmp(zSetting, aSetting[i].zName)==0 ) break; |
+ } |
+ if( i>=ArraySize(aSetting) ){ |
+ Tcl_SetObjResult(interp, |
+ Tcl_NewStringObj("unknown sqlite3_db_config setting", -1)); |
+ return TCL_ERROR; |
+ } |
+ if( Tcl_GetIntFromObj(interp, objv[3], &v) ) return TCL_ERROR; |
+ sqlite3_db_config(db, aSetting[i].eVal, v, &v); |
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(v)); |
+ return TCL_OK; |
+} |
+ |
+/* |
+** Change the name of the main database schema from "main" to "icecube". |
+*/ |
+static int SQLITE_TCLAPI test_dbconfig_maindbname_icecube( |
+ void * clientData, |
+ Tcl_Interp *interp, |
+ int objc, |
+ Tcl_Obj *CONST objv[] |
+){ |
+ int rc; |
+ sqlite3 *db; |
+ extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**); |
+ if( objc!=2 ){ |
+ Tcl_WrongNumArgs(interp, 1, objv, "DB"); |
+ return TCL_ERROR; |
+ }else{ |
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; |
+ rc = sqlite3_db_config(db, SQLITE_DBCONFIG_MAINDBNAME, "icecube"); |
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); |
+ return TCL_OK; |
+ } |
+} |
+ |
+/* |
** Register commands with the TCL interpreter. |
*/ |
int Sqlitetest1_Init(Tcl_Interp *interp){ |
@@ -6934,7 +7429,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ |
extern int sqlite3_hostid_num; |
#endif |
extern int sqlite3_max_blobsize; |
- extern int sqlite3BtreeSharedCacheReport(void*, |
+ extern int SQLITE_TCLAPI sqlite3BtreeSharedCacheReport(void*, |
Tcl_Interp*,int,Tcl_Obj*CONST*); |
static int iZero = 0; |
static struct { |
@@ -6989,9 +7484,14 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ |
Tcl_ObjCmdProc *xProc; |
void *clientData; |
} aObjCmd[] = { |
+ { "sqlite3_db_config", test_sqlite3_db_config, 0 }, |
{ "bad_behavior", test_bad_behavior, (void*)&iZero }, |
{ "register_dbstat_vtab", test_register_dbstat_vtab }, |
{ "sqlite3_connection_pointer", get_sqlite_pointer, 0 }, |
+ { "intarray_addr", test_intarray_addr, 0 }, |
+ { "int64array_addr", test_int64array_addr, 0 }, |
+ { "doublearray_addr", test_doublearray_addr, 0 }, |
+ { "textarray_addr", test_textarray_addr, 0 }, |
{ "sqlite3_bind_int", test_bind_int, 0 }, |
{ "sqlite3_bind_zeroblob", test_bind_zeroblob, 0 }, |
{ "sqlite3_bind_zeroblob64", test_bind_zeroblob64, 0 }, |
@@ -7028,6 +7528,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ |
{ "sqlite3_changes", test_changes ,0 }, |
{ "sqlite3_step", test_step ,0 }, |
{ "sqlite3_sql", test_sql ,0 }, |
+ { "sqlite3_expanded_sql", test_ex_sql ,0 }, |
{ "sqlite3_next_stmt", test_next_stmt ,0 }, |
{ "sqlite3_stmt_readonly", test_stmt_readonly ,0 }, |
{ "sqlite3_stmt_busy", test_stmt_busy ,0 }, |
@@ -7036,6 +7537,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ |
{ "sqlite3_release_memory", test_release_memory, 0}, |
{ "sqlite3_db_release_memory", test_db_release_memory, 0}, |
{ "sqlite3_db_cacheflush", test_db_cacheflush, 0}, |
+ { "sqlite3_system_errno", test_system_errno, 0}, |
{ "sqlite3_db_filename", test_db_filename, 0}, |
{ "sqlite3_db_readonly", test_db_readonly, 0}, |
{ "sqlite3_soft_heap_limit", test_soft_heap_limit, 0}, |
@@ -7046,6 +7548,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ |
{ "sqlite3_enable_load_extension", test_enable_load, 0}, |
{ "sqlite3_extended_result_codes", test_extended_result_codes, 0}, |
{ "sqlite3_limit", test_limit, 0}, |
+ { "dbconfig_maindbname_icecube", test_dbconfig_maindbname_icecube }, |
{ "save_prng_state", save_prng_state, 0 }, |
{ "restore_prng_state", restore_prng_state, 0 }, |
@@ -7112,6 +7615,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ |
{ "file_control_sizehint_test", file_control_sizehint_test, 0 }, |
#if SQLITE_OS_WIN |
{ "file_control_win32_av_retry", file_control_win32_av_retry, 0 }, |
+ { "file_control_win32_get_handle", file_control_win32_get_handle, 0 }, |
{ "file_control_win32_set_handle", file_control_win32_set_handle, 0 }, |
#endif |
{ "file_control_persist_wal", file_control_persist_wal, 0 }, |
@@ -7175,7 +7679,13 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ |
{ "sqlite3_snapshot_get", test_snapshot_get, 0 }, |
{ "sqlite3_snapshot_open", test_snapshot_open, 0 }, |
{ "sqlite3_snapshot_free", test_snapshot_free, 0 }, |
+ { "sqlite3_snapshot_cmp", test_snapshot_cmp, 0 }, |
+ { "sqlite3_snapshot_recover", test_snapshot_recover, 0 }, |
+ { "sqlite3_snapshot_get_blob", test_snapshot_get_blob, 0 }, |
+ { "sqlite3_snapshot_open_blob", test_snapshot_open_blob, 0 }, |
+ { "sqlite3_snapshot_cmp_blob", test_snapshot_cmp_blob, 0 }, |
#endif |
+ { "sqlite3_delete_database", test_delete_database, 0 }, |
}; |
static int bitmask_size = sizeof(Bitmask)*8; |
static int longdouble_size = sizeof(LONGDOUBLE_TYPE); |