Annotation of embedaddon/sqlite3/src/test_init.c, revision 1.1.1.1

1.1       misho       1: /*
                      2: ** 2009 August 17
                      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: ** The code in this file is used for testing SQLite. It is not part of
                     14: ** the source code used in production systems.
                     15: **
                     16: ** Specifically, this file tests the effect of errors while initializing
                     17: ** the various pluggable sub-systems from within sqlite3_initialize().
                     18: ** If an error occurs in sqlite3_initialize() the following should be
                     19: ** true:
                     20: **
                     21: **   1) An error code is returned to the user, and
                     22: **   2) A subsequent call to sqlite3_shutdown() calls the shutdown method
                     23: **      of those subsystems that were initialized, and
                     24: **   3) A subsequent call to sqlite3_initialize() attempts to initialize
                     25: **      the remaining, uninitialized, subsystems.
                     26: */
                     27: 
                     28: #include "sqliteInt.h"
                     29: #include <string.h>
                     30: #include <tcl.h>
                     31: 
                     32: static struct Wrapped {
                     33:   sqlite3_pcache_methods2 pcache;
                     34:   sqlite3_mem_methods     mem;
                     35:   sqlite3_mutex_methods   mutex;
                     36: 
                     37:   int mem_init;                /* True if mem subsystem is initalized */
                     38:   int mem_fail;                /* True to fail mem subsystem inialization */
                     39:   int mutex_init;              /* True if mutex subsystem is initalized */
                     40:   int mutex_fail;              /* True to fail mutex subsystem inialization */
                     41:   int pcache_init;             /* True if pcache subsystem is initalized */
                     42:   int pcache_fail;             /* True to fail pcache subsystem inialization */
                     43: } wrapped;
                     44: 
                     45: static int wrMemInit(void *pAppData){
                     46:   int rc;
                     47:   if( wrapped.mem_fail ){
                     48:     rc = SQLITE_ERROR;
                     49:   }else{
                     50:     rc = wrapped.mem.xInit(wrapped.mem.pAppData);
                     51:   }
                     52:   if( rc==SQLITE_OK ){
                     53:     wrapped.mem_init = 1;
                     54:   }
                     55:   return rc;
                     56: }
                     57: static void wrMemShutdown(void *pAppData){
                     58:   wrapped.mem.xShutdown(wrapped.mem.pAppData);
                     59:   wrapped.mem_init = 0;
                     60: }
                     61: static void *wrMemMalloc(int n)           {return wrapped.mem.xMalloc(n);}
                     62: static void wrMemFree(void *p)            {wrapped.mem.xFree(p);}
                     63: static void *wrMemRealloc(void *p, int n) {return wrapped.mem.xRealloc(p, n);}
                     64: static int wrMemSize(void *p)             {return wrapped.mem.xSize(p);}
                     65: static int wrMemRoundup(int n)            {return wrapped.mem.xRoundup(n);}
                     66: 
                     67: 
                     68: static int wrMutexInit(void){
                     69:   int rc;
                     70:   if( wrapped.mutex_fail ){
                     71:     rc = SQLITE_ERROR;
                     72:   }else{
                     73:     rc = wrapped.mutex.xMutexInit();
                     74:   }
                     75:   if( rc==SQLITE_OK ){
                     76:     wrapped.mutex_init = 1;
                     77:   }
                     78:   return rc;
                     79: }
                     80: static int wrMutexEnd(void){
                     81:   wrapped.mutex.xMutexEnd();
                     82:   wrapped.mutex_init = 0;
                     83:   return SQLITE_OK;
                     84: }
                     85: static sqlite3_mutex *wrMutexAlloc(int e){
                     86:   return wrapped.mutex.xMutexAlloc(e);
                     87: }
                     88: static void wrMutexFree(sqlite3_mutex *p){
                     89:   wrapped.mutex.xMutexFree(p);
                     90: }
                     91: static void wrMutexEnter(sqlite3_mutex *p){
                     92:   wrapped.mutex.xMutexEnter(p);
                     93: }
                     94: static int wrMutexTry(sqlite3_mutex *p){
                     95:   return wrapped.mutex.xMutexTry(p);
                     96: }
                     97: static void wrMutexLeave(sqlite3_mutex *p){
                     98:   wrapped.mutex.xMutexLeave(p);
                     99: }
                    100: static int wrMutexHeld(sqlite3_mutex *p){
                    101:   return wrapped.mutex.xMutexHeld(p);
                    102: }
                    103: static int wrMutexNotheld(sqlite3_mutex *p){
                    104:   return wrapped.mutex.xMutexNotheld(p);
                    105: }
                    106: 
                    107: 
                    108: 
                    109: static int wrPCacheInit(void *pArg){
                    110:   int rc;
                    111:   if( wrapped.pcache_fail ){
                    112:     rc = SQLITE_ERROR;
                    113:   }else{
                    114:     rc = wrapped.pcache.xInit(wrapped.pcache.pArg);
                    115:   }
                    116:   if( rc==SQLITE_OK ){
                    117:     wrapped.pcache_init = 1;
                    118:   }
                    119:   return rc;
                    120: }
                    121: static void wrPCacheShutdown(void *pArg){
                    122:   wrapped.pcache.xShutdown(wrapped.pcache.pArg);
                    123:   wrapped.pcache_init = 0;
                    124: }
                    125: 
                    126: static sqlite3_pcache *wrPCacheCreate(int a, int b, int c){
                    127:   return wrapped.pcache.xCreate(a, b, c);
                    128: }  
                    129: static void wrPCacheCachesize(sqlite3_pcache *p, int n){
                    130:   wrapped.pcache.xCachesize(p, n);
                    131: }  
                    132: static int wrPCachePagecount(sqlite3_pcache *p){
                    133:   return wrapped.pcache.xPagecount(p);
                    134: }  
                    135: static sqlite3_pcache_page *wrPCacheFetch(sqlite3_pcache *p, unsigned a, int b){
                    136:   return wrapped.pcache.xFetch(p, a, b);
                    137: }  
                    138: static void wrPCacheUnpin(sqlite3_pcache *p, sqlite3_pcache_page *a, int b){
                    139:   wrapped.pcache.xUnpin(p, a, b);
                    140: }  
                    141: static void wrPCacheRekey(
                    142:   sqlite3_pcache *p, 
                    143:   sqlite3_pcache_page *a, 
                    144:   unsigned b, 
                    145:   unsigned c
                    146: ){
                    147:   wrapped.pcache.xRekey(p, a, b, c);
                    148: }  
                    149: static void wrPCacheTruncate(sqlite3_pcache *p, unsigned a){
                    150:   wrapped.pcache.xTruncate(p, a);
                    151: }  
                    152: static void wrPCacheDestroy(sqlite3_pcache *p){
                    153:   wrapped.pcache.xDestroy(p);
                    154: }  
                    155: 
                    156: static void installInitWrappers(void){
                    157:   sqlite3_mutex_methods mutexmethods = {
                    158:     wrMutexInit,  wrMutexEnd,   wrMutexAlloc,
                    159:     wrMutexFree,  wrMutexEnter, wrMutexTry,
                    160:     wrMutexLeave, wrMutexHeld,  wrMutexNotheld
                    161:   };
                    162:   sqlite3_pcache_methods2 pcachemethods = {
                    163:     1, 0,
                    164:     wrPCacheInit,      wrPCacheShutdown,  wrPCacheCreate, 
                    165:     wrPCacheCachesize, wrPCachePagecount, wrPCacheFetch,
                    166:     wrPCacheUnpin,     wrPCacheRekey,     wrPCacheTruncate,  
                    167:     wrPCacheDestroy
                    168:   };
                    169:   sqlite3_mem_methods memmethods = {
                    170:     wrMemMalloc,   wrMemFree,    wrMemRealloc,
                    171:     wrMemSize,     wrMemRoundup, wrMemInit,
                    172:     wrMemShutdown,
                    173:     0
                    174:   };
                    175: 
                    176:   memset(&wrapped, 0, sizeof(wrapped));
                    177: 
                    178:   sqlite3_shutdown();
                    179:   sqlite3_config(SQLITE_CONFIG_GETMUTEX, &wrapped.mutex);
                    180:   sqlite3_config(SQLITE_CONFIG_GETMALLOC, &wrapped.mem);
                    181:   sqlite3_config(SQLITE_CONFIG_GETPCACHE2, &wrapped.pcache);
                    182:   sqlite3_config(SQLITE_CONFIG_MUTEX, &mutexmethods);
                    183:   sqlite3_config(SQLITE_CONFIG_MALLOC, &memmethods);
                    184:   sqlite3_config(SQLITE_CONFIG_PCACHE2, &pcachemethods);
                    185: }
                    186: 
                    187: static int init_wrapper_install(
                    188:   ClientData clientData, /* Unused */
                    189:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    190:   int objc,              /* Number of arguments */
                    191:   Tcl_Obj *CONST objv[]  /* Command arguments */
                    192: ){
                    193:   int i;
                    194:   installInitWrappers();
                    195:   for(i=1; i<objc; i++){
                    196:     char *z = Tcl_GetString(objv[i]);
                    197:     if( strcmp(z, "mem")==0 ){
                    198:       wrapped.mem_fail = 1;
                    199:     }else if( strcmp(z, "mutex")==0 ){
                    200:       wrapped.mutex_fail = 1;
                    201:     }else if( strcmp(z, "pcache")==0 ){
                    202:       wrapped.pcache_fail = 1;
                    203:     }else{
                    204:       Tcl_AppendResult(interp, "Unknown argument: \"", z, "\"");
                    205:       return TCL_ERROR;
                    206:     }
                    207:   }
                    208:   return TCL_OK;
                    209: }
                    210: 
                    211: static int init_wrapper_uninstall(
                    212:   ClientData clientData, /* Unused */
                    213:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    214:   int objc,              /* Number of arguments */
                    215:   Tcl_Obj *CONST objv[]  /* Command arguments */
                    216: ){
                    217:   if( objc!=1 ){
                    218:     Tcl_WrongNumArgs(interp, 1, objv, "");
                    219:     return TCL_ERROR;
                    220:   }
                    221: 
                    222:   memset(&wrapped, 0, sizeof(&wrapped));
                    223:   sqlite3_shutdown();
                    224:   sqlite3_config(SQLITE_CONFIG_MUTEX, &wrapped.mutex);
                    225:   sqlite3_config(SQLITE_CONFIG_MALLOC, &wrapped.mem);
                    226:   sqlite3_config(SQLITE_CONFIG_PCACHE2, &wrapped.pcache);
                    227:   return TCL_OK;
                    228: }
                    229: 
                    230: static int init_wrapper_clear(
                    231:   ClientData clientData, /* Unused */
                    232:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    233:   int objc,              /* Number of arguments */
                    234:   Tcl_Obj *CONST objv[]  /* Command arguments */
                    235: ){
                    236:   if( objc!=1 ){
                    237:     Tcl_WrongNumArgs(interp, 1, objv, "");
                    238:     return TCL_ERROR;
                    239:   }
                    240: 
                    241:   wrapped.mem_fail = 0;
                    242:   wrapped.mutex_fail = 0;
                    243:   wrapped.pcache_fail = 0;
                    244:   return TCL_OK;
                    245: }
                    246: 
                    247: static int init_wrapper_query(
                    248:   ClientData clientData, /* Unused */
                    249:   Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
                    250:   int objc,              /* Number of arguments */
                    251:   Tcl_Obj *CONST objv[]  /* Command arguments */
                    252: ){
                    253:   Tcl_Obj *pRet;
                    254: 
                    255:   if( objc!=1 ){
                    256:     Tcl_WrongNumArgs(interp, 1, objv, "");
                    257:     return TCL_ERROR;
                    258:   }
                    259: 
                    260:   pRet = Tcl_NewObj();
                    261:   if( wrapped.mutex_init ){
                    262:     Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj("mutex", -1));
                    263:   }
                    264:   if( wrapped.mem_init ){
                    265:     Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj("mem", -1));
                    266:   }
                    267:   if( wrapped.pcache_init ){
                    268:     Tcl_ListObjAppendElement(interp, pRet, Tcl_NewStringObj("pcache", -1));
                    269:   }
                    270: 
                    271:   Tcl_SetObjResult(interp, pRet);
                    272:   return TCL_OK;
                    273: }
                    274: 
                    275: int Sqlitetest_init_Init(Tcl_Interp *interp){
                    276:   static struct {
                    277:      char *zName;
                    278:      Tcl_ObjCmdProc *xProc;
                    279:   } aObjCmd[] = {
                    280:     {"init_wrapper_install",   init_wrapper_install},
                    281:     {"init_wrapper_query",     init_wrapper_query  },
                    282:     {"init_wrapper_uninstall", init_wrapper_uninstall},
                    283:     {"init_wrapper_clear",     init_wrapper_clear}
                    284:   };
                    285:   int i;
                    286: 
                    287:   for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){
                    288:     Tcl_CreateObjCommand(interp, aObjCmd[i].zName, aObjCmd[i].xProc, 0, 0);
                    289:   }
                    290: 
                    291:   return TCL_OK;
                    292: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>