| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ** 2007 March 29 | |
| 3 ** | |
| 4 ** The author disclaims copyright to this source code. In place of | |
| 5 ** a legal notice, here is a blessing: | |
| 6 ** | |
| 7 ** May you do good and not evil. | |
| 8 ** May you find forgiveness for yourself and forgive others. | |
| 9 ** May you share freely, never taking more than you give. | |
| 10 ** | |
| 11 ************************************************************************* | |
| 12 ** | |
| 13 ** This file contains obscure tests of the C-interface required | |
| 14 ** for completeness. Test code is written in C for these cases | |
| 15 ** as there is not much point in binding to Tcl. | |
| 16 */ | |
| 17 #include "sqliteInt.h" | |
| 18 #include "tcl.h" | |
| 19 #include <stdlib.h> | |
| 20 #include <string.h> | |
| 21 | |
| 22 /* | |
| 23 ** c_collation_test | |
| 24 */ | |
| 25 static int c_collation_test( | |
| 26 ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ | |
| 27 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | |
| 28 int objc, /* Number of arguments */ | |
| 29 Tcl_Obj *CONST objv[] /* Command arguments */ | |
| 30 ){ | |
| 31 const char *zErrFunction = "N/A"; | |
| 32 sqlite3 *db; | |
| 33 | |
| 34 int rc; | |
| 35 if( objc!=1 ){ | |
| 36 Tcl_WrongNumArgs(interp, 1, objv, ""); | |
| 37 return TCL_ERROR; | |
| 38 } | |
| 39 | |
| 40 /* Open a database. */ | |
| 41 rc = sqlite3_open(":memory:", &db); | |
| 42 if( rc!=SQLITE_OK ){ | |
| 43 zErrFunction = "sqlite3_open"; | |
| 44 goto error_out; | |
| 45 } | |
| 46 | |
| 47 rc = sqlite3_create_collation(db, "collate", 456, 0, 0); | |
| 48 if( rc!=SQLITE_MISUSE ){ | |
| 49 sqlite3_close(db); | |
| 50 zErrFunction = "sqlite3_create_collation"; | |
| 51 goto error_out; | |
| 52 } | |
| 53 | |
| 54 sqlite3_close(db); | |
| 55 return TCL_OK; | |
| 56 | |
| 57 error_out: | |
| 58 Tcl_ResetResult(interp); | |
| 59 Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0); | |
| 60 return TCL_ERROR; | |
| 61 } | |
| 62 | |
| 63 /* | |
| 64 ** c_realloc_test | |
| 65 */ | |
| 66 static int c_realloc_test( | |
| 67 ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ | |
| 68 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | |
| 69 int objc, /* Number of arguments */ | |
| 70 Tcl_Obj *CONST objv[] /* Command arguments */ | |
| 71 ){ | |
| 72 void *p; | |
| 73 const char *zErrFunction = "N/A"; | |
| 74 | |
| 75 if( objc!=1 ){ | |
| 76 Tcl_WrongNumArgs(interp, 1, objv, ""); | |
| 77 return TCL_ERROR; | |
| 78 } | |
| 79 | |
| 80 p = sqlite3_malloc(5); | |
| 81 if( !p ){ | |
| 82 zErrFunction = "sqlite3_malloc"; | |
| 83 goto error_out; | |
| 84 } | |
| 85 | |
| 86 /* Test that realloc()ing a block of memory to a negative size is | |
| 87 ** the same as free()ing that memory. | |
| 88 */ | |
| 89 p = sqlite3_realloc(p, -1); | |
| 90 if( p ){ | |
| 91 zErrFunction = "sqlite3_realloc"; | |
| 92 goto error_out; | |
| 93 } | |
| 94 | |
| 95 return TCL_OK; | |
| 96 | |
| 97 error_out: | |
| 98 Tcl_ResetResult(interp); | |
| 99 Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0); | |
| 100 return TCL_ERROR; | |
| 101 } | |
| 102 | |
| 103 | |
| 104 /* | |
| 105 ** c_misuse_test | |
| 106 */ | |
| 107 static int c_misuse_test( | |
| 108 ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ | |
| 109 Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ | |
| 110 int objc, /* Number of arguments */ | |
| 111 Tcl_Obj *CONST objv[] /* Command arguments */ | |
| 112 ){ | |
| 113 const char *zErrFunction = "N/A"; | |
| 114 sqlite3 *db = 0; | |
| 115 sqlite3_stmt *pStmt; | |
| 116 int rc; | |
| 117 | |
| 118 if( objc!=1 ){ | |
| 119 Tcl_WrongNumArgs(interp, 1, objv, ""); | |
| 120 return TCL_ERROR; | |
| 121 } | |
| 122 | |
| 123 /* Open a database. Then close it again. We need to do this so that | |
| 124 ** we have a "closed database handle" to pass to various API functions. | |
| 125 */ | |
| 126 rc = sqlite3_open(":memory:", &db); | |
| 127 if( rc!=SQLITE_OK ){ | |
| 128 zErrFunction = "sqlite3_open"; | |
| 129 goto error_out; | |
| 130 } | |
| 131 sqlite3_close(db); | |
| 132 | |
| 133 | |
| 134 rc = sqlite3_errcode(db); | |
| 135 if( rc!=SQLITE_MISUSE ){ | |
| 136 zErrFunction = "sqlite3_errcode"; | |
| 137 goto error_out; | |
| 138 } | |
| 139 | |
| 140 pStmt = (sqlite3_stmt*)1234; | |
| 141 rc = sqlite3_prepare(db, 0, 0, &pStmt, 0); | |
| 142 if( rc!=SQLITE_MISUSE ){ | |
| 143 zErrFunction = "sqlite3_prepare"; | |
| 144 goto error_out; | |
| 145 } | |
| 146 assert( pStmt==0 ); /* Verify that pStmt is zeroed even on a MISUSE error */ | |
| 147 | |
| 148 pStmt = (sqlite3_stmt*)1234; | |
| 149 rc = sqlite3_prepare_v2(db, 0, 0, &pStmt, 0); | |
| 150 if( rc!=SQLITE_MISUSE ){ | |
| 151 zErrFunction = "sqlite3_prepare_v2"; | |
| 152 goto error_out; | |
| 153 } | |
| 154 assert( pStmt==0 ); | |
| 155 | |
| 156 #ifndef SQLITE_OMIT_UTF16 | |
| 157 pStmt = (sqlite3_stmt*)1234; | |
| 158 rc = sqlite3_prepare16(db, 0, 0, &pStmt, 0); | |
| 159 if( rc!=SQLITE_MISUSE ){ | |
| 160 zErrFunction = "sqlite3_prepare16"; | |
| 161 goto error_out; | |
| 162 } | |
| 163 assert( pStmt==0 ); | |
| 164 pStmt = (sqlite3_stmt*)1234; | |
| 165 rc = sqlite3_prepare16_v2(db, 0, 0, &pStmt, 0); | |
| 166 if( rc!=SQLITE_MISUSE ){ | |
| 167 zErrFunction = "sqlite3_prepare16_v2"; | |
| 168 goto error_out; | |
| 169 } | |
| 170 assert( pStmt==0 ); | |
| 171 #endif | |
| 172 | |
| 173 return TCL_OK; | |
| 174 | |
| 175 error_out: | |
| 176 Tcl_ResetResult(interp); | |
| 177 Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0); | |
| 178 return TCL_ERROR; | |
| 179 } | |
| 180 | |
| 181 /* | |
| 182 ** Register commands with the TCL interpreter. | |
| 183 */ | |
| 184 int Sqlitetest9_Init(Tcl_Interp *interp){ | |
| 185 static struct { | |
| 186 char *zName; | |
| 187 Tcl_ObjCmdProc *xProc; | |
| 188 void *clientData; | |
| 189 } aObjCmd[] = { | |
| 190 { "c_misuse_test", c_misuse_test, 0 }, | |
| 191 { "c_realloc_test", c_realloc_test, 0 }, | |
| 192 { "c_collation_test", c_collation_test, 0 }, | |
| 193 }; | |
| 194 int i; | |
| 195 for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){ | |
| 196 Tcl_CreateObjCommand(interp, aObjCmd[i].zName, | |
| 197 aObjCmd[i].xProc, aObjCmd[i].clientData, 0); | |
| 198 } | |
| 199 return TCL_OK; | |
| 200 } | |
| OLD | NEW |