| /* | |
| ** 2006 August 23 | |
| ** | |
| ** The author disclaims copyright to this source code. In place of | |
| ** a legal notice, here is a blessing: | |
| ** | |
| ** May you do good and not evil. | |
| ** May you find forgiveness for yourself and forgive others. | |
| ** May you share freely, never taking more than you give. | |
| ** | |
| ************************************************************************* | |
| ** Test extension for testing the sqlite3_auto_extension() function. | |
| */ | |
| #if defined(INCLUDE_SQLITE_TCL_H) | |
| # include "sqlite_tcl.h" | |
| #else | |
| # include "tcl.h" | |
| # ifndef SQLITE_TCLAPI | |
| # define SQLITE_TCLAPI | |
| # endif | |
| #endif | |
| #include "sqlite3ext.h" | |
| #ifndef SQLITE_OMIT_LOAD_EXTENSION | |
| SQLITE_EXTENSION_INIT1 | |
| /* | |
| ** The sqr() SQL function returns the square of its input value. | |
| */ | |
| static void sqrFunc( | |
| sqlite3_context *context, | |
| int argc, | |
| sqlite3_value **argv | |
| ){ | |
| double r = sqlite3_value_double(argv[0]); | |
| sqlite3_result_double(context, r*r); | |
| } | |
| /* | |
| ** This is the entry point to register the extension for the sqr() function. | |
| */ | |
| static int sqr_init( | |
| sqlite3 *db, | |
| char **pzErrMsg, | |
| const sqlite3_api_routines *pApi | |
| ){ | |
| SQLITE_EXTENSION_INIT2(pApi); | |
| sqlite3_create_function(db, "sqr", 1, SQLITE_ANY, 0, sqrFunc, 0, 0); | |
| return 0; | |
| } | |
| /* | |
| ** The cube() SQL function returns the cube of its input value. | |
| */ | |
| static void cubeFunc( | |
| sqlite3_context *context, | |
| int argc, | |
| sqlite3_value **argv | |
| ){ | |
| double r = sqlite3_value_double(argv[0]); | |
| sqlite3_result_double(context, r*r*r); | |
| } | |
| /* | |
| ** This is the entry point to register the extension for the cube() function. | |
| */ | |
| static int cube_init( | |
| sqlite3 *db, | |
| char **pzErrMsg, | |
| const sqlite3_api_routines *pApi | |
| ){ | |
| SQLITE_EXTENSION_INIT2(pApi); | |
| sqlite3_create_function(db, "cube", 1, SQLITE_ANY, 0, cubeFunc, 0, 0); | |
| return 0; | |
| } | |
| /* | |
| ** This is a broken extension entry point | |
| */ | |
| static int broken_init( | |
| sqlite3 *db, | |
| char **pzErrMsg, | |
| const sqlite3_api_routines *pApi | |
| ){ | |
| char *zErr; | |
| SQLITE_EXTENSION_INIT2(pApi); | |
| zErr = sqlite3_mprintf("broken autoext!"); | |
| *pzErrMsg = zErr; | |
| return 1; | |
| } | |
| /* | |
| ** tclcmd: sqlite3_auto_extension_sqr | |
| ** | |
| ** Register the "sqr" extension to be loaded automatically. | |
| */ | |
| static int SQLITE_TCLAPI autoExtSqrObjCmd( | |
| void * clientData, | |
| Tcl_Interp *interp, | |
| int objc, | |
| Tcl_Obj *CONST objv[] | |
| ){ | |
| int rc = sqlite3_auto_extension((void(*)(void))sqr_init); | |
| Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
| return SQLITE_OK; | |
| } | |
| /* | |
| ** tclcmd: sqlite3_cancel_auto_extension_sqr | |
| ** | |
| ** Unregister the "sqr" extension. | |
| */ | |
| static int SQLITE_TCLAPI cancelAutoExtSqrObjCmd( | |
| void * clientData, | |
| Tcl_Interp *interp, | |
| int objc, | |
| Tcl_Obj *CONST objv[] | |
| ){ | |
| int rc = sqlite3_cancel_auto_extension((void(*)(void))sqr_init); | |
| Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
| return SQLITE_OK; | |
| } | |
| /* | |
| ** tclcmd: sqlite3_auto_extension_cube | |
| ** | |
| ** Register the "cube" extension to be loaded automatically. | |
| */ | |
| static int SQLITE_TCLAPI autoExtCubeObjCmd( | |
| void * clientData, | |
| Tcl_Interp *interp, | |
| int objc, | |
| Tcl_Obj *CONST objv[] | |
| ){ | |
| int rc = sqlite3_auto_extension((void(*)(void))cube_init); | |
| Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
| return SQLITE_OK; | |
| } | |
| /* | |
| ** tclcmd: sqlite3_cancel_auto_extension_cube | |
| ** | |
| ** Unregister the "cube" extension. | |
| */ | |
| static int SQLITE_TCLAPI cancelAutoExtCubeObjCmd( | |
| void * clientData, | |
| Tcl_Interp *interp, | |
| int objc, | |
| Tcl_Obj *CONST objv[] | |
| ){ | |
| int rc = sqlite3_cancel_auto_extension((void(*)(void))cube_init); | |
| Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
| return SQLITE_OK; | |
| } | |
| /* | |
| ** tclcmd: sqlite3_auto_extension_broken | |
| ** | |
| ** Register the broken extension to be loaded automatically. | |
| */ | |
| static int SQLITE_TCLAPI autoExtBrokenObjCmd( | |
| void * clientData, | |
| Tcl_Interp *interp, | |
| int objc, | |
| Tcl_Obj *CONST objv[] | |
| ){ | |
| int rc = sqlite3_auto_extension((void(*)(void))broken_init); | |
| Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
| return SQLITE_OK; | |
| } | |
| /* | |
| ** tclcmd: sqlite3_cancel_auto_extension_broken | |
| ** | |
| ** Unregister the broken extension. | |
| */ | |
| static int SQLITE_TCLAPI cancelAutoExtBrokenObjCmd( | |
| void * clientData, | |
| Tcl_Interp *interp, | |
| int objc, | |
| Tcl_Obj *CONST objv[] | |
| ){ | |
| int rc = sqlite3_cancel_auto_extension((void(*)(void))broken_init); | |
| Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); | |
| return SQLITE_OK; | |
| } | |
| #endif /* SQLITE_OMIT_LOAD_EXTENSION */ | |
| /* | |
| ** tclcmd: sqlite3_reset_auto_extension | |
| ** | |
| ** Reset all auto-extensions | |
| */ | |
| static int SQLITE_TCLAPI resetAutoExtObjCmd( | |
| void * clientData, | |
| Tcl_Interp *interp, | |
| int objc, | |
| Tcl_Obj *CONST objv[] | |
| ){ | |
| sqlite3_reset_auto_extension(); | |
| return SQLITE_OK; | |
| } | |
| /* | |
| ** This procedure registers the TCL procs defined in this file. | |
| */ | |
| int Sqlitetest_autoext_Init(Tcl_Interp *interp){ | |
| #ifndef SQLITE_OMIT_LOAD_EXTENSION | |
| Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_sqr", | |
| autoExtSqrObjCmd, 0, 0); | |
| Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_cube", | |
| autoExtCubeObjCmd, 0, 0); | |
| Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_broken", | |
| autoExtBrokenObjCmd, 0, 0); | |
| Tcl_CreateObjCommand(interp, "sqlite3_cancel_auto_extension_sqr", | |
| cancelAutoExtSqrObjCmd, 0, 0); | |
| Tcl_CreateObjCommand(interp, "sqlite3_cancel_auto_extension_cube", | |
| cancelAutoExtCubeObjCmd, 0, 0); | |
| Tcl_CreateObjCommand(interp, "sqlite3_cancel_auto_extension_broken", | |
| cancelAutoExtBrokenObjCmd, 0, 0); | |
| #endif | |
| Tcl_CreateObjCommand(interp, "sqlite3_reset_auto_extension", | |
| resetAutoExtObjCmd, 0, 0); | |
| return TCL_OK; | |
| } |