Home | History | Annotate | Download | only in src
      1 /*
      2 ** 2007 March 29
      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 **
     13 ** This file contains obscure tests of the C-interface required
     14 ** for completeness. Test code is written in C for these cases
     15 ** as there is not much point in binding to Tcl.
     16 */
     17 #include "sqliteInt.h"
     18 #include "tcl.h"
     19 #include <stdlib.h>
     20 #include <string.h>
     21 
     22 /*
     23 ** c_collation_test
     24 */
     25 static int c_collation_test(
     26   ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
     27   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
     28   int objc,              /* Number of arguments */
     29   Tcl_Obj *CONST objv[]  /* Command arguments */
     30 ){
     31   const char *zErrFunction = "N/A";
     32   sqlite3 *db;
     33 
     34   int rc;
     35   if( objc!=1 ){
     36     Tcl_WrongNumArgs(interp, 1, objv, "");
     37     return TCL_ERROR;
     38   }
     39 
     40   /* Open a database. */
     41   rc = sqlite3_open(":memory:", &db);
     42   if( rc!=SQLITE_OK ){
     43     zErrFunction = "sqlite3_open";
     44     goto error_out;
     45   }
     46 
     47   rc = sqlite3_create_collation(db, "collate", 456, 0, 0);
     48   if( rc!=SQLITE_MISUSE ){
     49     sqlite3_close(db);
     50     zErrFunction = "sqlite3_create_collation";
     51     goto error_out;
     52   }
     53 
     54   sqlite3_close(db);
     55   return TCL_OK;
     56 
     57 error_out:
     58   Tcl_ResetResult(interp);
     59   Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
     60   return TCL_ERROR;
     61 }
     62 
     63 /*
     64 ** c_realloc_test
     65 */
     66 static int c_realloc_test(
     67   ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
     68   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
     69   int objc,              /* Number of arguments */
     70   Tcl_Obj *CONST objv[]  /* Command arguments */
     71 ){
     72   void *p;
     73   const char *zErrFunction = "N/A";
     74 
     75   if( objc!=1 ){
     76     Tcl_WrongNumArgs(interp, 1, objv, "");
     77     return TCL_ERROR;
     78   }
     79 
     80   p = sqlite3_malloc(5);
     81   if( !p ){
     82     zErrFunction = "sqlite3_malloc";
     83     goto error_out;
     84   }
     85 
     86   /* Test that realloc()ing a block of memory to a negative size is
     87   ** the same as free()ing that memory.
     88   */
     89   p = sqlite3_realloc(p, -1);
     90   if( p ){
     91     zErrFunction = "sqlite3_realloc";
     92     goto error_out;
     93   }
     94 
     95   return TCL_OK;
     96 
     97 error_out:
     98   Tcl_ResetResult(interp);
     99   Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
    100   return TCL_ERROR;
    101 }
    102 
    103 
    104 /*
    105 ** c_misuse_test
    106 */
    107 static int c_misuse_test(
    108   ClientData clientData, /* Pointer to sqlite3_enable_XXX function */
    109   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
    110   int objc,              /* Number of arguments */
    111   Tcl_Obj *CONST objv[]  /* Command arguments */
    112 ){
    113   const char *zErrFunction = "N/A";
    114   sqlite3 *db = 0;
    115   sqlite3_stmt *pStmt;
    116   int rc;
    117 
    118   if( objc!=1 ){
    119     Tcl_WrongNumArgs(interp, 1, objv, "");
    120     return TCL_ERROR;
    121   }
    122 
    123   /* Open a database. Then close it again. We need to do this so that
    124   ** we have a "closed database handle" to pass to various API functions.
    125   */
    126   rc = sqlite3_open(":memory:", &db);
    127   if( rc!=SQLITE_OK ){
    128     zErrFunction = "sqlite3_open";
    129     goto error_out;
    130   }
    131   sqlite3_close(db);
    132 
    133 
    134   rc = sqlite3_errcode(db);
    135   if( rc!=SQLITE_MISUSE ){
    136     zErrFunction = "sqlite3_errcode";
    137     goto error_out;
    138   }
    139 
    140   pStmt = (sqlite3_stmt*)1234;
    141   rc = sqlite3_prepare(db, 0, 0, &pStmt, 0);
    142   if( rc!=SQLITE_MISUSE ){
    143     zErrFunction = "sqlite3_prepare";
    144     goto error_out;
    145   }
    146   assert( pStmt==0 ); /* Verify that pStmt is zeroed even on a MISUSE error */
    147 
    148   pStmt = (sqlite3_stmt*)1234;
    149   rc = sqlite3_prepare_v2(db, 0, 0, &pStmt, 0);
    150   if( rc!=SQLITE_MISUSE ){
    151     zErrFunction = "sqlite3_prepare_v2";
    152     goto error_out;
    153   }
    154   assert( pStmt==0 );
    155 
    156 #ifndef SQLITE_OMIT_UTF16
    157   pStmt = (sqlite3_stmt*)1234;
    158   rc = sqlite3_prepare16(db, 0, 0, &pStmt, 0);
    159   if( rc!=SQLITE_MISUSE ){
    160     zErrFunction = "sqlite3_prepare16";
    161     goto error_out;
    162   }
    163   assert( pStmt==0 );
    164   pStmt = (sqlite3_stmt*)1234;
    165   rc = sqlite3_prepare16_v2(db, 0, 0, &pStmt, 0);
    166   if( rc!=SQLITE_MISUSE ){
    167     zErrFunction = "sqlite3_prepare16_v2";
    168     goto error_out;
    169   }
    170   assert( pStmt==0 );
    171 #endif
    172 
    173   return TCL_OK;
    174 
    175 error_out:
    176   Tcl_ResetResult(interp);
    177   Tcl_AppendResult(interp, "Error testing function: ", zErrFunction, 0);
    178   return TCL_ERROR;
    179 }
    180 
    181 /*
    182 ** Register commands with the TCL interpreter.
    183 */
    184 int Sqlitetest9_Init(Tcl_Interp *interp){
    185   static struct {
    186      char *zName;
    187      Tcl_ObjCmdProc *xProc;
    188      void *clientData;
    189   } aObjCmd[] = {
    190      { "c_misuse_test",    c_misuse_test, 0 },
    191      { "c_realloc_test",   c_realloc_test, 0 },
    192      { "c_collation_test", c_collation_test, 0 },
    193   };
    194   int i;
    195   for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){
    196     Tcl_CreateObjCommand(interp, aObjCmd[i].zName,
    197         aObjCmd[i].xProc, aObjCmd[i].clientData, 0);
    198   }
    199   return TCL_OK;
    200 }
    201