OLD | NEW |
| (Empty) |
1 /* | |
2 ** 2006 August 23 | |
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 ** Test extension for testing the sqlite3_auto_extension() function. | |
13 */ | |
14 #include "tcl.h" | |
15 #include "sqlite3ext.h" | |
16 | |
17 #ifndef SQLITE_OMIT_LOAD_EXTENSION | |
18 SQLITE_EXTENSION_INIT1 | |
19 | |
20 /* | |
21 ** The sqr() SQL function returns the square of its input value. | |
22 */ | |
23 static void sqrFunc( | |
24 sqlite3_context *context, | |
25 int argc, | |
26 sqlite3_value **argv | |
27 ){ | |
28 double r = sqlite3_value_double(argv[0]); | |
29 sqlite3_result_double(context, r*r); | |
30 } | |
31 | |
32 /* | |
33 ** This is the entry point to register the extension for the sqr() function. | |
34 */ | |
35 static int sqr_init( | |
36 sqlite3 *db, | |
37 char **pzErrMsg, | |
38 const sqlite3_api_routines *pApi | |
39 ){ | |
40 SQLITE_EXTENSION_INIT2(pApi); | |
41 sqlite3_create_function(db, "sqr", 1, SQLITE_ANY, 0, sqrFunc, 0, 0); | |
42 return 0; | |
43 } | |
44 | |
45 /* | |
46 ** The cube() SQL function returns the cube of its input value. | |
47 */ | |
48 static void cubeFunc( | |
49 sqlite3_context *context, | |
50 int argc, | |
51 sqlite3_value **argv | |
52 ){ | |
53 double r = sqlite3_value_double(argv[0]); | |
54 sqlite3_result_double(context, r*r*r); | |
55 } | |
56 | |
57 /* | |
58 ** This is the entry point to register the extension for the cube() function. | |
59 */ | |
60 static int cube_init( | |
61 sqlite3 *db, | |
62 char **pzErrMsg, | |
63 const sqlite3_api_routines *pApi | |
64 ){ | |
65 SQLITE_EXTENSION_INIT2(pApi); | |
66 sqlite3_create_function(db, "cube", 1, SQLITE_ANY, 0, cubeFunc, 0, 0); | |
67 return 0; | |
68 } | |
69 | |
70 /* | |
71 ** This is a broken extension entry point | |
72 */ | |
73 static int broken_init( | |
74 sqlite3 *db, | |
75 char **pzErrMsg, | |
76 const sqlite3_api_routines *pApi | |
77 ){ | |
78 char *zErr; | |
79 SQLITE_EXTENSION_INIT2(pApi); | |
80 zErr = sqlite3_mprintf("broken autoext!"); | |
81 *pzErrMsg = zErr; | |
82 return 1; | |
83 } | |
84 | |
85 /* | |
86 ** tclcmd: sqlite3_auto_extension_sqr | |
87 ** | |
88 ** Register the "sqr" extension to be loaded automatically. | |
89 */ | |
90 static int autoExtSqrObjCmd( | |
91 void * clientData, | |
92 Tcl_Interp *interp, | |
93 int objc, | |
94 Tcl_Obj *CONST objv[] | |
95 ){ | |
96 int rc = sqlite3_auto_extension((void*)sqr_init); | |
97 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
98 return SQLITE_OK; | |
99 } | |
100 | |
101 /* | |
102 ** tclcmd: sqlite3_cancel_auto_extension_sqr | |
103 ** | |
104 ** Unregister the "sqr" extension. | |
105 */ | |
106 static int cancelAutoExtSqrObjCmd( | |
107 void * clientData, | |
108 Tcl_Interp *interp, | |
109 int objc, | |
110 Tcl_Obj *CONST objv[] | |
111 ){ | |
112 int rc = sqlite3_cancel_auto_extension((void*)sqr_init); | |
113 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
114 return SQLITE_OK; | |
115 } | |
116 | |
117 /* | |
118 ** tclcmd: sqlite3_auto_extension_cube | |
119 ** | |
120 ** Register the "cube" extension to be loaded automatically. | |
121 */ | |
122 static int autoExtCubeObjCmd( | |
123 void * clientData, | |
124 Tcl_Interp *interp, | |
125 int objc, | |
126 Tcl_Obj *CONST objv[] | |
127 ){ | |
128 int rc = sqlite3_auto_extension((void*)cube_init); | |
129 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
130 return SQLITE_OK; | |
131 } | |
132 | |
133 /* | |
134 ** tclcmd: sqlite3_cancel_auto_extension_cube | |
135 ** | |
136 ** Unregister the "cube" extension. | |
137 */ | |
138 static int cancelAutoExtCubeObjCmd( | |
139 void * clientData, | |
140 Tcl_Interp *interp, | |
141 int objc, | |
142 Tcl_Obj *CONST objv[] | |
143 ){ | |
144 int rc = sqlite3_cancel_auto_extension((void*)cube_init); | |
145 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
146 return SQLITE_OK; | |
147 } | |
148 | |
149 /* | |
150 ** tclcmd: sqlite3_auto_extension_broken | |
151 ** | |
152 ** Register the broken extension to be loaded automatically. | |
153 */ | |
154 static int autoExtBrokenObjCmd( | |
155 void * clientData, | |
156 Tcl_Interp *interp, | |
157 int objc, | |
158 Tcl_Obj *CONST objv[] | |
159 ){ | |
160 int rc = sqlite3_auto_extension((void*)broken_init); | |
161 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
162 return SQLITE_OK; | |
163 } | |
164 | |
165 /* | |
166 ** tclcmd: sqlite3_cancel_auto_extension_broken | |
167 ** | |
168 ** Unregister the broken extension. | |
169 */ | |
170 static int cancelAutoExtBrokenObjCmd( | |
171 void * clientData, | |
172 Tcl_Interp *interp, | |
173 int objc, | |
174 Tcl_Obj *CONST objv[] | |
175 ){ | |
176 int rc = sqlite3_cancel_auto_extension((void*)broken_init); | |
177 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
178 return SQLITE_OK; | |
179 } | |
180 | |
181 #endif /* SQLITE_OMIT_LOAD_EXTENSION */ | |
182 | |
183 | |
184 /* | |
185 ** tclcmd: sqlite3_reset_auto_extension | |
186 ** | |
187 ** Reset all auto-extensions | |
188 */ | |
189 static int resetAutoExtObjCmd( | |
190 void * clientData, | |
191 Tcl_Interp *interp, | |
192 int objc, | |
193 Tcl_Obj *CONST objv[] | |
194 ){ | |
195 sqlite3_reset_auto_extension(); | |
196 return SQLITE_OK; | |
197 } | |
198 | |
199 | |
200 /* | |
201 ** This procedure registers the TCL procs defined in this file. | |
202 */ | |
203 int Sqlitetest_autoext_Init(Tcl_Interp *interp){ | |
204 #ifndef SQLITE_OMIT_LOAD_EXTENSION | |
205 Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_sqr", | |
206 autoExtSqrObjCmd, 0, 0); | |
207 Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_cube", | |
208 autoExtCubeObjCmd, 0, 0); | |
209 Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_broken", | |
210 autoExtBrokenObjCmd, 0, 0); | |
211 Tcl_CreateObjCommand(interp, "sqlite3_cancel_auto_extension_sqr", | |
212 cancelAutoExtSqrObjCmd, 0, 0); | |
213 Tcl_CreateObjCommand(interp, "sqlite3_cancel_auto_extension_cube", | |
214 cancelAutoExtCubeObjCmd, 0, 0); | |
215 Tcl_CreateObjCommand(interp, "sqlite3_cancel_auto_extension_broken", | |
216 cancelAutoExtBrokenObjCmd, 0, 0); | |
217 #endif | |
218 Tcl_CreateObjCommand(interp, "sqlite3_reset_auto_extension", | |
219 resetAutoExtObjCmd, 0, 0); | |
220 return TCL_OK; | |
221 } | |
OLD | NEW |