xref: /sqlite-3.40.0/src/test_autoext.c (revision 5d00d0a8)
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 ** $Id: test_autoext.c,v 1.5 2008/07/08 02:12:37 drh Exp $
15 */
16 #include "tcl.h"
17 #include "sqlite3ext.h"
18 
19 #ifndef SQLITE_OMIT_LOAD_EXTENSION
20 static SQLITE_EXTENSION_INIT1
21 
22 /*
23 ** The sqr() SQL function returns the square of its input value.
24 */
25 static void sqrFunc(
26   sqlite3_context *context,
27   int argc,
28   sqlite3_value **argv
29 ){
30   double r = sqlite3_value_double(argv[0]);
31   sqlite3_result_double(context, r*r);
32 }
33 
34 /*
35 ** This is the entry point to register the extension for the sqr() function.
36 */
37 static int sqr_init(
38   sqlite3 *db,
39   char **pzErrMsg,
40   const sqlite3_api_routines *pApi
41 ){
42   SQLITE_EXTENSION_INIT2(pApi);
43   sqlite3_create_function(db, "sqr", 1, SQLITE_ANY, 0, sqrFunc, 0, 0);
44   return 0;
45 }
46 
47 /*
48 ** The cube() SQL function returns the cube of its input value.
49 */
50 static void cubeFunc(
51   sqlite3_context *context,
52   int argc,
53   sqlite3_value **argv
54 ){
55   double r = sqlite3_value_double(argv[0]);
56   sqlite3_result_double(context, r*r*r);
57 }
58 
59 /*
60 ** This is the entry point to register the extension for the cube() function.
61 */
62 static int cube_init(
63   sqlite3 *db,
64   char **pzErrMsg,
65   const sqlite3_api_routines *pApi
66 ){
67   SQLITE_EXTENSION_INIT2(pApi);
68   sqlite3_create_function(db, "cube", 1, SQLITE_ANY, 0, cubeFunc, 0, 0);
69   return 0;
70 }
71 
72 /*
73 ** This is a broken extension entry point
74 */
75 static int broken_init(
76   sqlite3 *db,
77   char **pzErrMsg,
78   const sqlite3_api_routines *pApi
79 ){
80   char *zErr;
81   SQLITE_EXTENSION_INIT2(pApi);
82   zErr = sqlite3_mprintf("broken autoext!");
83   *pzErrMsg = zErr;
84   return 1;
85 }
86 
87 /*
88 ** tclcmd:   sqlite3_auto_extension_sqr
89 **
90 ** Register the "sqr" extension to be loaded automatically.
91 */
92 static int autoExtSqrObjCmd(
93   void * clientData,
94   Tcl_Interp *interp,
95   int objc,
96   Tcl_Obj *CONST objv[]
97 ){
98   int rc = sqlite3_auto_extension((void*)sqr_init);
99   Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
100   return SQLITE_OK;
101 }
102 
103 /*
104 ** tclcmd:   sqlite3_auto_extension_cube
105 **
106 ** Register the "cube" extension to be loaded automatically.
107 */
108 static int autoExtCubeObjCmd(
109   void * clientData,
110   Tcl_Interp *interp,
111   int objc,
112   Tcl_Obj *CONST objv[]
113 ){
114   int rc = sqlite3_auto_extension((void*)cube_init);
115   Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
116   return SQLITE_OK;
117 }
118 
119 /*
120 ** tclcmd:   sqlite3_auto_extension_broken
121 **
122 ** Register the broken extension to be loaded automatically.
123 */
124 static int autoExtBrokenObjCmd(
125   void * clientData,
126   Tcl_Interp *interp,
127   int objc,
128   Tcl_Obj *CONST objv[]
129 ){
130   int rc = sqlite3_auto_extension((void*)broken_init);
131   Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
132   return SQLITE_OK;
133 }
134 
135 #endif /* SQLITE_OMIT_LOAD_EXTENSION */
136 
137 
138 /*
139 ** tclcmd:   sqlite3_reset_auto_extension
140 **
141 ** Reset all auto-extensions
142 */
143 static int resetAutoExtObjCmd(
144   void * clientData,
145   Tcl_Interp *interp,
146   int objc,
147   Tcl_Obj *CONST objv[]
148 ){
149   sqlite3_reset_auto_extension();
150   return SQLITE_OK;
151 }
152 
153 
154 /*
155 ** This procedure registers the TCL procs defined in this file.
156 */
157 int Sqlitetest_autoext_Init(Tcl_Interp *interp){
158 #ifndef SQLITE_OMIT_LOAD_EXTENSION
159   Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_sqr",
160           autoExtSqrObjCmd, 0, 0);
161   Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_cube",
162           autoExtCubeObjCmd, 0, 0);
163   Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_broken",
164           autoExtBrokenObjCmd, 0, 0);
165 #endif
166   Tcl_CreateObjCommand(interp, "sqlite3_reset_auto_extension",
167           resetAutoExtObjCmd, 0, 0);
168   return TCL_OK;
169 }
170