• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 static SQLITE_EXTENSION_INIT1
19 
20 /*
21 ** The sqr() SQL function returns the square of its input value.
22 */
sqrFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)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 */
sqr_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)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 */
cubeFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)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 */
cube_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)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 */
broken_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)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 */
autoExtSqrObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])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_auto_extension_cube
103 **
104 ** Register the "cube" extension to be loaded automatically.
105 */
autoExtCubeObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])106 static int autoExtCubeObjCmd(
107   void * clientData,
108   Tcl_Interp *interp,
109   int objc,
110   Tcl_Obj *CONST objv[]
111 ){
112   int rc = sqlite3_auto_extension((void*)cube_init);
113   Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
114   return SQLITE_OK;
115 }
116 
117 /*
118 ** tclcmd:   sqlite3_auto_extension_broken
119 **
120 ** Register the broken extension to be loaded automatically.
121 */
autoExtBrokenObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])122 static int autoExtBrokenObjCmd(
123   void * clientData,
124   Tcl_Interp *interp,
125   int objc,
126   Tcl_Obj *CONST objv[]
127 ){
128   int rc = sqlite3_auto_extension((void*)broken_init);
129   Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
130   return SQLITE_OK;
131 }
132 
133 #endif /* SQLITE_OMIT_LOAD_EXTENSION */
134 
135 
136 /*
137 ** tclcmd:   sqlite3_reset_auto_extension
138 **
139 ** Reset all auto-extensions
140 */
resetAutoExtObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])141 static int resetAutoExtObjCmd(
142   void * clientData,
143   Tcl_Interp *interp,
144   int objc,
145   Tcl_Obj *CONST objv[]
146 ){
147   sqlite3_reset_auto_extension();
148   return SQLITE_OK;
149 }
150 
151 
152 /*
153 ** This procedure registers the TCL procs defined in this file.
154 */
Sqlitetest_autoext_Init(Tcl_Interp * interp)155 int Sqlitetest_autoext_Init(Tcl_Interp *interp){
156 #ifndef SQLITE_OMIT_LOAD_EXTENSION
157   Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_sqr",
158           autoExtSqrObjCmd, 0, 0);
159   Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_cube",
160           autoExtCubeObjCmd, 0, 0);
161   Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_broken",
162           autoExtBrokenObjCmd, 0, 0);
163 #endif
164   Tcl_CreateObjCommand(interp, "sqlite3_reset_auto_extension",
165           resetAutoExtObjCmd, 0, 0);
166   return TCL_OK;
167 }
168