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 ** $Id: test_autoext.c,v 1.5 2008/07/08 02:12:37 drh Exp $ 15 */ 16 #include "tcl.h" 17 #include "sqlite3ext.h" 18 19 #ifndef SQLITE_OMIT_LOAD_EXTENSION 20 static SQLITE_EXTENSION_INIT1 21 22 /* 23 ** The sqr() SQL function returns the square of its input value. 24 */ 25 static void sqrFunc( 26 sqlite3_context *context, 27 int argc, 28 sqlite3_value **argv 29 ){ 30 double r = sqlite3_value_double(argv[0]); 31 sqlite3_result_double(context, r*r); 32 } 33 34 /* 35 ** This is the entry point to register the extension for the sqr() function. 36 */ 37 static int sqr_init( 38 sqlite3 *db, 39 char **pzErrMsg, 40 const sqlite3_api_routines *pApi 41 ){ 42 SQLITE_EXTENSION_INIT2(pApi); 43 sqlite3_create_function(db, "sqr", 1, SQLITE_ANY, 0, sqrFunc, 0, 0); 44 return 0; 45 } 46 47 /* 48 ** The cube() SQL function returns the cube of its input value. 49 */ 50 static void cubeFunc( 51 sqlite3_context *context, 52 int argc, 53 sqlite3_value **argv 54 ){ 55 double r = sqlite3_value_double(argv[0]); 56 sqlite3_result_double(context, r*r*r); 57 } 58 59 /* 60 ** This is the entry point to register the extension for the cube() function. 61 */ 62 static int cube_init( 63 sqlite3 *db, 64 char **pzErrMsg, 65 const sqlite3_api_routines *pApi 66 ){ 67 SQLITE_EXTENSION_INIT2(pApi); 68 sqlite3_create_function(db, "cube", 1, SQLITE_ANY, 0, cubeFunc, 0, 0); 69 return 0; 70 } 71 72 /* 73 ** This is a broken extension entry point 74 */ 75 static int broken_init( 76 sqlite3 *db, 77 char **pzErrMsg, 78 const sqlite3_api_routines *pApi 79 ){ 80 char *zErr; 81 SQLITE_EXTENSION_INIT2(pApi); 82 zErr = sqlite3_mprintf("broken autoext!"); 83 *pzErrMsg = zErr; 84 return 1; 85 } 86 87 /* 88 ** tclcmd: sqlite3_auto_extension_sqr 89 ** 90 ** Register the "sqr" extension to be loaded automatically. 91 */ 92 static int autoExtSqrObjCmd( 93 void * clientData, 94 Tcl_Interp *interp, 95 int objc, 96 Tcl_Obj *CONST objv[] 97 ){ 98 int rc = sqlite3_auto_extension((void*)sqr_init); 99 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); 100 return SQLITE_OK; 101 } 102 103 /* 104 ** tclcmd: sqlite3_auto_extension_cube 105 ** 106 ** Register the "cube" extension to be loaded automatically. 107 */ 108 static int autoExtCubeObjCmd( 109 void * clientData, 110 Tcl_Interp *interp, 111 int objc, 112 Tcl_Obj *CONST objv[] 113 ){ 114 int rc = sqlite3_auto_extension((void*)cube_init); 115 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); 116 return SQLITE_OK; 117 } 118 119 /* 120 ** tclcmd: sqlite3_auto_extension_broken 121 ** 122 ** Register the broken extension to be loaded automatically. 123 */ 124 static int autoExtBrokenObjCmd( 125 void * clientData, 126 Tcl_Interp *interp, 127 int objc, 128 Tcl_Obj *CONST objv[] 129 ){ 130 int rc = sqlite3_auto_extension((void*)broken_init); 131 Tcl_SetObjResult(interp, Tcl_NewIntObj(rc)); 132 return SQLITE_OK; 133 } 134 135 #endif /* SQLITE_OMIT_LOAD_EXTENSION */ 136 137 138 /* 139 ** tclcmd: sqlite3_reset_auto_extension 140 ** 141 ** Reset all auto-extensions 142 */ 143 static int resetAutoExtObjCmd( 144 void * clientData, 145 Tcl_Interp *interp, 146 int objc, 147 Tcl_Obj *CONST objv[] 148 ){ 149 sqlite3_reset_auto_extension(); 150 return SQLITE_OK; 151 } 152 153 154 /* 155 ** This procedure registers the TCL procs defined in this file. 156 */ 157 int Sqlitetest_autoext_Init(Tcl_Interp *interp){ 158 #ifndef SQLITE_OMIT_LOAD_EXTENSION 159 Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_sqr", 160 autoExtSqrObjCmd, 0, 0); 161 Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_cube", 162 autoExtCubeObjCmd, 0, 0); 163 Tcl_CreateObjCommand(interp, "sqlite3_auto_extension_broken", 164 autoExtBrokenObjCmd, 0, 0); 165 #endif 166 Tcl_CreateObjCommand(interp, "sqlite3_reset_auto_extension", 167 resetAutoExtObjCmd, 0, 0); 168 return TCL_OK; 169 } 170