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 18static SQLITE_EXTENSION_INIT1 19 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 **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*/ 35static 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*/ 48static 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*/ 60static 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*/ 73static 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*/ 90static 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*/ 106static 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*/ 122static 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*/ 141static 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*/ 155int 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