Home | History | Annotate | Download | only in src
      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