11409be69Sdrh /*
21409be69Sdrh ** 2006 August 23
31409be69Sdrh **
41409be69Sdrh ** The author disclaims copyright to this source code. In place of
51409be69Sdrh ** a legal notice, here is a blessing:
61409be69Sdrh **
71409be69Sdrh ** May you do good and not evil.
81409be69Sdrh ** May you find forgiveness for yourself and forgive others.
91409be69Sdrh ** May you share freely, never taking more than you give.
101409be69Sdrh **
111409be69Sdrh *************************************************************************
121409be69Sdrh ** Test extension for testing the sqlite3_auto_extension() function.
131409be69Sdrh */
1452b1dbb5Smistachkin #if defined(INCLUDE_SQLITE_TCL_H)
1552b1dbb5Smistachkin # include "sqlite_tcl.h"
1652b1dbb5Smistachkin #else
171409be69Sdrh # include "tcl.h"
187617e4a8Smistachkin # ifndef SQLITE_TCLAPI
197617e4a8Smistachkin # define SQLITE_TCLAPI
207617e4a8Smistachkin # endif
2152b1dbb5Smistachkin #endif
221409be69Sdrh #include "sqlite3ext.h"
239323f761Smlcreech
249323f761Smlcreech #ifndef SQLITE_OMIT_LOAD_EXTENSION
2508ef8d73Sdrh SQLITE_EXTENSION_INIT1
261409be69Sdrh
271409be69Sdrh /*
281409be69Sdrh ** The sqr() SQL function returns the square of its input value.
291409be69Sdrh */
sqrFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)301409be69Sdrh static void sqrFunc(
311409be69Sdrh sqlite3_context *context,
321409be69Sdrh int argc,
331409be69Sdrh sqlite3_value **argv
341409be69Sdrh ){
351409be69Sdrh double r = sqlite3_value_double(argv[0]);
361409be69Sdrh sqlite3_result_double(context, r*r);
371409be69Sdrh }
381409be69Sdrh
391409be69Sdrh /*
401409be69Sdrh ** This is the entry point to register the extension for the sqr() function.
411409be69Sdrh */
sqr_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)421409be69Sdrh static int sqr_init(
431409be69Sdrh sqlite3 *db,
441409be69Sdrh char **pzErrMsg,
451409be69Sdrh const sqlite3_api_routines *pApi
461409be69Sdrh ){
471409be69Sdrh SQLITE_EXTENSION_INIT2(pApi);
481409be69Sdrh sqlite3_create_function(db, "sqr", 1, SQLITE_ANY, 0, sqrFunc, 0, 0);
491409be69Sdrh return 0;
501409be69Sdrh }
511409be69Sdrh
521409be69Sdrh /*
531409be69Sdrh ** The cube() SQL function returns the cube of its input value.
541409be69Sdrh */
cubeFunc(sqlite3_context * context,int argc,sqlite3_value ** argv)551409be69Sdrh static void cubeFunc(
561409be69Sdrh sqlite3_context *context,
571409be69Sdrh int argc,
581409be69Sdrh sqlite3_value **argv
591409be69Sdrh ){
601409be69Sdrh double r = sqlite3_value_double(argv[0]);
611409be69Sdrh sqlite3_result_double(context, r*r*r);
621409be69Sdrh }
631409be69Sdrh
641409be69Sdrh /*
651409be69Sdrh ** This is the entry point to register the extension for the cube() function.
661409be69Sdrh */
cube_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)671409be69Sdrh static int cube_init(
681409be69Sdrh sqlite3 *db,
691409be69Sdrh char **pzErrMsg,
701409be69Sdrh const sqlite3_api_routines *pApi
711409be69Sdrh ){
721409be69Sdrh SQLITE_EXTENSION_INIT2(pApi);
731409be69Sdrh sqlite3_create_function(db, "cube", 1, SQLITE_ANY, 0, cubeFunc, 0, 0);
741409be69Sdrh return 0;
751409be69Sdrh }
761409be69Sdrh
771409be69Sdrh /*
781409be69Sdrh ** This is a broken extension entry point
791409be69Sdrh */
broken_init(sqlite3 * db,char ** pzErrMsg,const sqlite3_api_routines * pApi)801409be69Sdrh static int broken_init(
811409be69Sdrh sqlite3 *db,
821409be69Sdrh char **pzErrMsg,
831409be69Sdrh const sqlite3_api_routines *pApi
841409be69Sdrh ){
851409be69Sdrh char *zErr;
861409be69Sdrh SQLITE_EXTENSION_INIT2(pApi);
871409be69Sdrh zErr = sqlite3_mprintf("broken autoext!");
881409be69Sdrh *pzErrMsg = zErr;
891409be69Sdrh return 1;
901409be69Sdrh }
911409be69Sdrh
921409be69Sdrh /*
931409be69Sdrh ** tclcmd: sqlite3_auto_extension_sqr
941409be69Sdrh **
951409be69Sdrh ** Register the "sqr" extension to be loaded automatically.
961409be69Sdrh */
autoExtSqrObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])977617e4a8Smistachkin static int SQLITE_TCLAPI autoExtSqrObjCmd(
981409be69Sdrh void * clientData,
991409be69Sdrh Tcl_Interp *interp,
1001409be69Sdrh int objc,
1011409be69Sdrh Tcl_Obj *CONST objv[]
1021409be69Sdrh ){
103*32c83c8bSdrh int rc = sqlite3_auto_extension((void(*)(void))sqr_init);
104c8d75674Sdrh Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
1051409be69Sdrh return SQLITE_OK;
1061409be69Sdrh }
1071409be69Sdrh
1081409be69Sdrh /*
109425e27dbSdrh ** tclcmd: sqlite3_cancel_auto_extension_sqr
110425e27dbSdrh **
111425e27dbSdrh ** Unregister the "sqr" extension.
112425e27dbSdrh */
cancelAutoExtSqrObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])1137617e4a8Smistachkin static int SQLITE_TCLAPI cancelAutoExtSqrObjCmd(
114425e27dbSdrh void * clientData,
115425e27dbSdrh Tcl_Interp *interp,
116425e27dbSdrh int objc,
117425e27dbSdrh Tcl_Obj *CONST objv[]
118425e27dbSdrh ){
119*32c83c8bSdrh int rc = sqlite3_cancel_auto_extension((void(*)(void))sqr_init);
120425e27dbSdrh Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
121425e27dbSdrh return SQLITE_OK;
122425e27dbSdrh }
123425e27dbSdrh
124425e27dbSdrh /*
1251409be69Sdrh ** tclcmd: sqlite3_auto_extension_cube
1261409be69Sdrh **
1271409be69Sdrh ** Register the "cube" extension to be loaded automatically.
1281409be69Sdrh */
autoExtCubeObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])1297617e4a8Smistachkin static int SQLITE_TCLAPI autoExtCubeObjCmd(
1301409be69Sdrh void * clientData,
1311409be69Sdrh Tcl_Interp *interp,
1321409be69Sdrh int objc,
1331409be69Sdrh Tcl_Obj *CONST objv[]
1341409be69Sdrh ){
135*32c83c8bSdrh int rc = sqlite3_auto_extension((void(*)(void))cube_init);
136c8d75674Sdrh Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
1371409be69Sdrh return SQLITE_OK;
1381409be69Sdrh }
1391409be69Sdrh
1401409be69Sdrh /*
141425e27dbSdrh ** tclcmd: sqlite3_cancel_auto_extension_cube
142425e27dbSdrh **
143425e27dbSdrh ** Unregister the "cube" extension.
144425e27dbSdrh */
cancelAutoExtCubeObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])1457617e4a8Smistachkin static int SQLITE_TCLAPI cancelAutoExtCubeObjCmd(
146425e27dbSdrh void * clientData,
147425e27dbSdrh Tcl_Interp *interp,
148425e27dbSdrh int objc,
149425e27dbSdrh Tcl_Obj *CONST objv[]
150425e27dbSdrh ){
151*32c83c8bSdrh int rc = sqlite3_cancel_auto_extension((void(*)(void))cube_init);
152425e27dbSdrh Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
153425e27dbSdrh return SQLITE_OK;
154425e27dbSdrh }
155425e27dbSdrh
156425e27dbSdrh /*
1571409be69Sdrh ** tclcmd: sqlite3_auto_extension_broken
1581409be69Sdrh **
1591409be69Sdrh ** Register the broken extension to be loaded automatically.
1601409be69Sdrh */
autoExtBrokenObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])1617617e4a8Smistachkin static int SQLITE_TCLAPI autoExtBrokenObjCmd(
1621409be69Sdrh void * clientData,
1631409be69Sdrh Tcl_Interp *interp,
1641409be69Sdrh int objc,
1651409be69Sdrh Tcl_Obj *CONST objv[]
1661409be69Sdrh ){
167*32c83c8bSdrh int rc = sqlite3_auto_extension((void(*)(void))broken_init);
168c8d75674Sdrh Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
1691409be69Sdrh return SQLITE_OK;
1701409be69Sdrh }
1711409be69Sdrh
172425e27dbSdrh /*
173425e27dbSdrh ** tclcmd: sqlite3_cancel_auto_extension_broken
174425e27dbSdrh **
175425e27dbSdrh ** Unregister the broken extension.
176425e27dbSdrh */
cancelAutoExtBrokenObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])1777617e4a8Smistachkin static int SQLITE_TCLAPI cancelAutoExtBrokenObjCmd(
178425e27dbSdrh void * clientData,
179425e27dbSdrh Tcl_Interp *interp,
180425e27dbSdrh int objc,
181425e27dbSdrh Tcl_Obj *CONST objv[]
182425e27dbSdrh ){
183*32c83c8bSdrh int rc = sqlite3_cancel_auto_extension((void(*)(void))broken_init);
184425e27dbSdrh Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));
185425e27dbSdrh return SQLITE_OK;
186425e27dbSdrh }
187425e27dbSdrh
1889323f761Smlcreech #endif /* SQLITE_OMIT_LOAD_EXTENSION */
1899323f761Smlcreech
1909323f761Smlcreech
1911409be69Sdrh /*
1921409be69Sdrh ** tclcmd: sqlite3_reset_auto_extension
1931409be69Sdrh **
1941409be69Sdrh ** Reset all auto-extensions
1951409be69Sdrh */
resetAutoExtObjCmd(void * clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])1967617e4a8Smistachkin static int SQLITE_TCLAPI resetAutoExtObjCmd(
1971409be69Sdrh void * clientData,
1981409be69Sdrh Tcl_Interp *interp,
1991409be69Sdrh int objc,
2001409be69Sdrh Tcl_Obj *CONST objv[]
2011409be69Sdrh ){
2021409be69Sdrh sqlite3_reset_auto_extension();
2031409be69Sdrh return SQLITE_OK;
2041409be69Sdrh }
2051409be69Sdrh
2061409be69Sdrh
2071409be69Sdrh /*
2081409be69Sdrh ** This procedure registers the TCL procs defined in this file.
2091409be69Sdrh */
Sqlitetest_autoext_Init(Tcl_Interp * interp)2101409be69Sdrh int Sqlitetest_autoext_Init(Tcl_Interp *interp){
2111409be69Sdrh #ifndef SQLITE_OMIT_LOAD_EXTENSION
2121409be69Sdrh Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_sqr",
2131409be69Sdrh autoExtSqrObjCmd, 0, 0);
2141409be69Sdrh Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_cube",
2151409be69Sdrh autoExtCubeObjCmd, 0, 0);
2161409be69Sdrh Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_broken",
2171409be69Sdrh autoExtBrokenObjCmd, 0, 0);
218425e27dbSdrh Tcl_CreateObjCommand(interp, "sqlite3_cancel_auto_extension_sqr",
219425e27dbSdrh cancelAutoExtSqrObjCmd, 0, 0);
220425e27dbSdrh Tcl_CreateObjCommand(interp, "sqlite3_cancel_auto_extension_cube",
221425e27dbSdrh cancelAutoExtCubeObjCmd, 0, 0);
222425e27dbSdrh Tcl_CreateObjCommand(interp, "sqlite3_cancel_auto_extension_broken",
223425e27dbSdrh cancelAutoExtBrokenObjCmd, 0, 0);
224d3f49641Sdrh #endif
2251409be69Sdrh Tcl_CreateObjCommand(interp, "sqlite3_reset_auto_extension",
2261409be69Sdrh resetAutoExtObjCmd, 0, 0);
2271409be69Sdrh return TCL_OK;
2281409be69Sdrh }
229