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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>