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 18 static SQLITE_EXTENSION_INIT1 19 20 /* 21 ** The sqr() SQL function returns the square of its input value. 22 */ 23 static 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 */ 35 static 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 */ 48 static 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 */ 60 static 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 */ 73 static 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 */ 90 static 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 */ 106 static 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 */ 122 static 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 */ 141 static 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 */ 155 int 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