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 |