AryaWu/sqlite
0
1/*2** 2006 August 233**4** The author disclaims copyright to this source code. In place of5** 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 "tclsqlite.h"15#include "sqlite3ext.h"16 17#ifndef SQLITE_OMIT_LOAD_EXTENSION18SQLITE_EXTENSION_INIT119 20/*21** The sqr() SQL function returns the square of its input value.22*/23static void sqrFunc(24 sqlite3_context *context,25 int argc,26 sqlite3_value **argv27){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*/35static int sqr_init(36 sqlite3 *db, 37 char **pzErrMsg, 38 const sqlite3_api_routines *pApi39){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*/48static void cubeFunc(49 sqlite3_context *context,50 int argc,51 sqlite3_value **argv52){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*/60static int cube_init(61 sqlite3 *db, 62 char **pzErrMsg, 63 const sqlite3_api_routines *pApi64){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 point72*/73static int broken_init(74 sqlite3 *db, 75 char **pzErrMsg, 76 const sqlite3_api_routines *pApi77){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_sqr87**88** Register the "sqr" extension to be loaded automatically.89*/90static int SQLITE_TCLAPI autoExtSqrObjCmd(91 void * clientData,92 Tcl_Interp *interp,93 int objc,94 Tcl_Obj *CONST objv[]95){96 int rc = sqlite3_auto_extension((void(*)(void))sqr_init);97 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));98 return SQLITE_OK;99}100 101/*102** tclcmd: sqlite3_cancel_auto_extension_sqr103**104** Unregister the "sqr" extension.105*/106static int SQLITE_TCLAPI 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(*)(void))sqr_init);113 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));114 return SQLITE_OK;115}116 117/*118** tclcmd: sqlite3_auto_extension_cube119**120** Register the "cube" extension to be loaded automatically.121*/122static int SQLITE_TCLAPI autoExtCubeObjCmd(123 void * clientData,124 Tcl_Interp *interp,125 int objc,126 Tcl_Obj *CONST objv[]127){128 int rc = sqlite3_auto_extension((void(*)(void))cube_init);129 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));130 return SQLITE_OK;131}132 133/*134** tclcmd: sqlite3_cancel_auto_extension_cube135**136** Unregister the "cube" extension.137*/138static int SQLITE_TCLAPI 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(*)(void))cube_init);145 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));146 return SQLITE_OK;147}148 149/*150** tclcmd: sqlite3_auto_extension_broken151**152** Register the broken extension to be loaded automatically.153*/154static int SQLITE_TCLAPI autoExtBrokenObjCmd(155 void * clientData,156 Tcl_Interp *interp,157 int objc,158 Tcl_Obj *CONST objv[]159){160 int rc = sqlite3_auto_extension((void(*)(void))broken_init);161 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc));162 return SQLITE_OK;163}164 165/*166** tclcmd: sqlite3_cancel_auto_extension_broken167**168** Unregister the broken extension.169*/170static int SQLITE_TCLAPI 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(*)(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_extension186**187** Reset all auto-extensions188*/189static int SQLITE_TCLAPI 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*/203int Sqlitetest_autoext_Init(Tcl_Interp *interp){204#ifndef SQLITE_OMIT_LOAD_EXTENSION205 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#endif218 Tcl_CreateObjCommand(interp, "sqlite3_reset_auto_extension",219 resetAutoExtObjCmd, 0, 0);220 return TCL_OK;221}222 