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

1.1       misho       1: /*
                      2: ** 2008 Jan 22
                      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 code that modified the OS layer in order to simulate
                     14: ** different device types (by overriding the return values of the 
                     15: ** xDeviceCharacteristics() and xSectorSize() methods).
                     16: */
                     17: #if SQLITE_TEST          /* This file is used for testing only */
                     18: 
                     19: #include "sqlite3.h"
                     20: #include "sqliteInt.h"
                     21: 
                     22: /*
                     23: ** Maximum pathname length supported by the devsym backend.
                     24: */
                     25: #define DEVSYM_MAX_PATHNAME 512
                     26: 
                     27: /*
                     28: ** Name used to identify this VFS.
                     29: */
                     30: #define DEVSYM_VFS_NAME "devsym"
                     31: 
                     32: typedef struct devsym_file devsym_file;
                     33: struct devsym_file {
                     34:   sqlite3_file base;
                     35:   sqlite3_file *pReal;
                     36: };
                     37: 
                     38: /*
                     39: ** Method declarations for devsym_file.
                     40: */
                     41: static int devsymClose(sqlite3_file*);
                     42: static int devsymRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
                     43: static int devsymWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst);
                     44: static int devsymTruncate(sqlite3_file*, sqlite3_int64 size);
                     45: static int devsymSync(sqlite3_file*, int flags);
                     46: static int devsymFileSize(sqlite3_file*, sqlite3_int64 *pSize);
                     47: static int devsymLock(sqlite3_file*, int);
                     48: static int devsymUnlock(sqlite3_file*, int);
                     49: static int devsymCheckReservedLock(sqlite3_file*, int *);
                     50: static int devsymFileControl(sqlite3_file*, int op, void *pArg);
                     51: static int devsymSectorSize(sqlite3_file*);
                     52: static int devsymDeviceCharacteristics(sqlite3_file*);
                     53: static int devsymShmLock(sqlite3_file*,int,int,int);
                     54: static int devsymShmMap(sqlite3_file*,int,int,int, void volatile **);
                     55: static void devsymShmBarrier(sqlite3_file*);
                     56: static int devsymShmUnmap(sqlite3_file*,int);
                     57: 
                     58: /*
                     59: ** Method declarations for devsym_vfs.
                     60: */
                     61: static int devsymOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *);
                     62: static int devsymDelete(sqlite3_vfs*, const char *zName, int syncDir);
                     63: static int devsymAccess(sqlite3_vfs*, const char *zName, int flags, int *);
                     64: static int devsymFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut);
                     65: #ifndef SQLITE_OMIT_LOAD_EXTENSION
                     66: static void *devsymDlOpen(sqlite3_vfs*, const char *zFilename);
                     67: static void devsymDlError(sqlite3_vfs*, int nByte, char *zErrMsg);
                     68: static void (*devsymDlSym(sqlite3_vfs*,void*, const char *zSymbol))(void);
                     69: static void devsymDlClose(sqlite3_vfs*, void*);
                     70: #endif /* SQLITE_OMIT_LOAD_EXTENSION */
                     71: static int devsymRandomness(sqlite3_vfs*, int nByte, char *zOut);
                     72: static int devsymSleep(sqlite3_vfs*, int microseconds);
                     73: static int devsymCurrentTime(sqlite3_vfs*, double*);
                     74: 
                     75: static sqlite3_vfs devsym_vfs = {
                     76:   2,                     /* iVersion */
                     77:   sizeof(devsym_file),      /* szOsFile */
                     78:   DEVSYM_MAX_PATHNAME,      /* mxPathname */
                     79:   0,                     /* pNext */
                     80:   DEVSYM_VFS_NAME,          /* zName */
                     81:   0,                     /* pAppData */
                     82:   devsymOpen,               /* xOpen */
                     83:   devsymDelete,             /* xDelete */
                     84:   devsymAccess,             /* xAccess */
                     85:   devsymFullPathname,       /* xFullPathname */
                     86: #ifndef SQLITE_OMIT_LOAD_EXTENSION
                     87:   devsymDlOpen,             /* xDlOpen */
                     88:   devsymDlError,            /* xDlError */
                     89:   devsymDlSym,              /* xDlSym */
                     90:   devsymDlClose,            /* xDlClose */
                     91: #else
                     92:   0,                        /* xDlOpen */
                     93:   0,                        /* xDlError */
                     94:   0,                        /* xDlSym */
                     95:   0,                        /* xDlClose */
                     96: #endif /* SQLITE_OMIT_LOAD_EXTENSION */
                     97:   devsymRandomness,         /* xRandomness */
                     98:   devsymSleep,              /* xSleep */
                     99:   devsymCurrentTime,        /* xCurrentTime */
                    100:   0,                        /* xGetLastError */
                    101:   0                         /* xCurrentTimeInt64 */
                    102: };
                    103: 
                    104: static sqlite3_io_methods devsym_io_methods = {
                    105:   2,                                /* iVersion */
                    106:   devsymClose,                      /* xClose */
                    107:   devsymRead,                       /* xRead */
                    108:   devsymWrite,                      /* xWrite */
                    109:   devsymTruncate,                   /* xTruncate */
                    110:   devsymSync,                       /* xSync */
                    111:   devsymFileSize,                   /* xFileSize */
                    112:   devsymLock,                       /* xLock */
                    113:   devsymUnlock,                     /* xUnlock */
                    114:   devsymCheckReservedLock,          /* xCheckReservedLock */
                    115:   devsymFileControl,                /* xFileControl */
                    116:   devsymSectorSize,                 /* xSectorSize */
                    117:   devsymDeviceCharacteristics,      /* xDeviceCharacteristics */
                    118:   devsymShmMap,                     /* xShmMap */
                    119:   devsymShmLock,                    /* xShmLock */
                    120:   devsymShmBarrier,                 /* xShmBarrier */
                    121:   devsymShmUnmap                    /* xShmUnmap */
                    122: };
                    123: 
                    124: struct DevsymGlobal {
                    125:   sqlite3_vfs *pVfs;
                    126:   int iDeviceChar;
                    127:   int iSectorSize;
                    128: };
                    129: struct DevsymGlobal g = {0, 0, 512};
                    130: 
                    131: /*
                    132: ** Close an devsym-file.
                    133: */
                    134: static int devsymClose(sqlite3_file *pFile){
                    135:   devsym_file *p = (devsym_file *)pFile;
                    136:   return sqlite3OsClose(p->pReal);
                    137: }
                    138: 
                    139: /*
                    140: ** Read data from an devsym-file.
                    141: */
                    142: static int devsymRead(
                    143:   sqlite3_file *pFile, 
                    144:   void *zBuf, 
                    145:   int iAmt, 
                    146:   sqlite_int64 iOfst
                    147: ){
                    148:   devsym_file *p = (devsym_file *)pFile;
                    149:   return sqlite3OsRead(p->pReal, zBuf, iAmt, iOfst);
                    150: }
                    151: 
                    152: /*
                    153: ** Write data to an devsym-file.
                    154: */
                    155: static int devsymWrite(
                    156:   sqlite3_file *pFile, 
                    157:   const void *zBuf, 
                    158:   int iAmt, 
                    159:   sqlite_int64 iOfst
                    160: ){
                    161:   devsym_file *p = (devsym_file *)pFile;
                    162:   return sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst);
                    163: }
                    164: 
                    165: /*
                    166: ** Truncate an devsym-file.
                    167: */
                    168: static int devsymTruncate(sqlite3_file *pFile, sqlite_int64 size){
                    169:   devsym_file *p = (devsym_file *)pFile;
                    170:   return sqlite3OsTruncate(p->pReal, size);
                    171: }
                    172: 
                    173: /*
                    174: ** Sync an devsym-file.
                    175: */
                    176: static int devsymSync(sqlite3_file *pFile, int flags){
                    177:   devsym_file *p = (devsym_file *)pFile;
                    178:   return sqlite3OsSync(p->pReal, flags);
                    179: }
                    180: 
                    181: /*
                    182: ** Return the current file-size of an devsym-file.
                    183: */
                    184: static int devsymFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){
                    185:   devsym_file *p = (devsym_file *)pFile;
                    186:   return sqlite3OsFileSize(p->pReal, pSize);
                    187: }
                    188: 
                    189: /*
                    190: ** Lock an devsym-file.
                    191: */
                    192: static int devsymLock(sqlite3_file *pFile, int eLock){
                    193:   devsym_file *p = (devsym_file *)pFile;
                    194:   return sqlite3OsLock(p->pReal, eLock);
                    195: }
                    196: 
                    197: /*
                    198: ** Unlock an devsym-file.
                    199: */
                    200: static int devsymUnlock(sqlite3_file *pFile, int eLock){
                    201:   devsym_file *p = (devsym_file *)pFile;
                    202:   return sqlite3OsUnlock(p->pReal, eLock);
                    203: }
                    204: 
                    205: /*
                    206: ** Check if another file-handle holds a RESERVED lock on an devsym-file.
                    207: */
                    208: static int devsymCheckReservedLock(sqlite3_file *pFile, int *pResOut){
                    209:   devsym_file *p = (devsym_file *)pFile;
                    210:   return sqlite3OsCheckReservedLock(p->pReal, pResOut);
                    211: }
                    212: 
                    213: /*
                    214: ** File control method. For custom operations on an devsym-file.
                    215: */
                    216: static int devsymFileControl(sqlite3_file *pFile, int op, void *pArg){
                    217:   devsym_file *p = (devsym_file *)pFile;
                    218:   return sqlite3OsFileControl(p->pReal, op, pArg);
                    219: }
                    220: 
                    221: /*
                    222: ** Return the sector-size in bytes for an devsym-file.
                    223: */
                    224: static int devsymSectorSize(sqlite3_file *pFile){
                    225:   return g.iSectorSize;
                    226: }
                    227: 
                    228: /*
                    229: ** Return the device characteristic flags supported by an devsym-file.
                    230: */
                    231: static int devsymDeviceCharacteristics(sqlite3_file *pFile){
                    232:   return g.iDeviceChar;
                    233: }
                    234: 
                    235: /*
                    236: ** Shared-memory methods are all pass-thrus.
                    237: */
                    238: static int devsymShmLock(sqlite3_file *pFile, int ofst, int n, int flags){
                    239:   devsym_file *p = (devsym_file *)pFile;
                    240:   return sqlite3OsShmLock(p->pReal, ofst, n, flags);
                    241: }
                    242: static int devsymShmMap(
                    243:   sqlite3_file *pFile, 
                    244:   int iRegion, 
                    245:   int szRegion, 
                    246:   int isWrite, 
                    247:   void volatile **pp
                    248: ){
                    249:   devsym_file *p = (devsym_file *)pFile;
                    250:   return sqlite3OsShmMap(p->pReal, iRegion, szRegion, isWrite, pp);
                    251: }
                    252: static void devsymShmBarrier(sqlite3_file *pFile){
                    253:   devsym_file *p = (devsym_file *)pFile;
                    254:   sqlite3OsShmBarrier(p->pReal);
                    255: }
                    256: static int devsymShmUnmap(sqlite3_file *pFile, int delFlag){
                    257:   devsym_file *p = (devsym_file *)pFile;
                    258:   return sqlite3OsShmUnmap(p->pReal, delFlag);
                    259: }
                    260: 
                    261: 
                    262: 
                    263: /*
                    264: ** Open an devsym file handle.
                    265: */
                    266: static int devsymOpen(
                    267:   sqlite3_vfs *pVfs,
                    268:   const char *zName,
                    269:   sqlite3_file *pFile,
                    270:   int flags,
                    271:   int *pOutFlags
                    272: ){
                    273:   int rc;
                    274:   devsym_file *p = (devsym_file *)pFile;
                    275:   p->pReal = (sqlite3_file *)&p[1];
                    276:   rc = sqlite3OsOpen(g.pVfs, zName, p->pReal, flags, pOutFlags);
                    277:   if( p->pReal->pMethods ){
                    278:     pFile->pMethods = &devsym_io_methods;
                    279:   }
                    280:   return rc;
                    281: }
                    282: 
                    283: /*
                    284: ** Delete the file located at zPath. If the dirSync argument is true,
                    285: ** ensure the file-system modifications are synced to disk before
                    286: ** returning.
                    287: */
                    288: static int devsymDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
                    289:   return sqlite3OsDelete(g.pVfs, zPath, dirSync);
                    290: }
                    291: 
                    292: /*
                    293: ** Test for access permissions. Return true if the requested permission
                    294: ** is available, or false otherwise.
                    295: */
                    296: static int devsymAccess(
                    297:   sqlite3_vfs *pVfs, 
                    298:   const char *zPath, 
                    299:   int flags, 
                    300:   int *pResOut
                    301: ){
                    302:   return sqlite3OsAccess(g.pVfs, zPath, flags, pResOut);
                    303: }
                    304: 
                    305: /*
                    306: ** Populate buffer zOut with the full canonical pathname corresponding
                    307: ** to the pathname in zPath. zOut is guaranteed to point to a buffer
                    308: ** of at least (DEVSYM_MAX_PATHNAME+1) bytes.
                    309: */
                    310: static int devsymFullPathname(
                    311:   sqlite3_vfs *pVfs, 
                    312:   const char *zPath, 
                    313:   int nOut, 
                    314:   char *zOut
                    315: ){
                    316:   return sqlite3OsFullPathname(g.pVfs, zPath, nOut, zOut);
                    317: }
                    318: 
                    319: #ifndef SQLITE_OMIT_LOAD_EXTENSION
                    320: /*
                    321: ** Open the dynamic library located at zPath and return a handle.
                    322: */
                    323: static void *devsymDlOpen(sqlite3_vfs *pVfs, const char *zPath){
                    324:   return sqlite3OsDlOpen(g.pVfs, zPath);
                    325: }
                    326: 
                    327: /*
                    328: ** Populate the buffer zErrMsg (size nByte bytes) with a human readable
                    329: ** utf-8 string describing the most recent error encountered associated 
                    330: ** with dynamic libraries.
                    331: */
                    332: static void devsymDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){
                    333:   sqlite3OsDlError(g.pVfs, nByte, zErrMsg);
                    334: }
                    335: 
                    336: /*
                    337: ** Return a pointer to the symbol zSymbol in the dynamic library pHandle.
                    338: */
                    339: static void (*devsymDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){
                    340:   return sqlite3OsDlSym(g.pVfs, p, zSym);
                    341: }
                    342: 
                    343: /*
                    344: ** Close the dynamic library handle pHandle.
                    345: */
                    346: static void devsymDlClose(sqlite3_vfs *pVfs, void *pHandle){
                    347:   sqlite3OsDlClose(g.pVfs, pHandle);
                    348: }
                    349: #endif /* SQLITE_OMIT_LOAD_EXTENSION */
                    350: 
                    351: /*
                    352: ** Populate the buffer pointed to by zBufOut with nByte bytes of 
                    353: ** random data.
                    354: */
                    355: static int devsymRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
                    356:   return sqlite3OsRandomness(g.pVfs, nByte, zBufOut);
                    357: }
                    358: 
                    359: /*
                    360: ** Sleep for nMicro microseconds. Return the number of microseconds 
                    361: ** actually slept.
                    362: */
                    363: static int devsymSleep(sqlite3_vfs *pVfs, int nMicro){
                    364:   return sqlite3OsSleep(g.pVfs, nMicro);
                    365: }
                    366: 
                    367: /*
                    368: ** Return the current time as a Julian Day number in *pTimeOut.
                    369: */
                    370: static int devsymCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
                    371:   return g.pVfs->xCurrentTime(g.pVfs, pTimeOut);
                    372: }
                    373: 
                    374: 
                    375: /*
                    376: ** This procedure registers the devsym vfs with SQLite. If the argument is
                    377: ** true, the devsym vfs becomes the new default vfs. It is the only publicly
                    378: ** available function in this file.
                    379: */
                    380: void devsym_register(int iDeviceChar, int iSectorSize){
                    381:   if( g.pVfs==0 ){
                    382:     g.pVfs = sqlite3_vfs_find(0);
                    383:     devsym_vfs.szOsFile += g.pVfs->szOsFile;
                    384:     sqlite3_vfs_register(&devsym_vfs, 0);
                    385:   }
                    386:   if( iDeviceChar>=0 ){
                    387:     g.iDeviceChar = iDeviceChar;
                    388:   }else{
                    389:     g.iDeviceChar = 0;
                    390:   }
                    391:   if( iSectorSize>=0 ){
                    392:     g.iSectorSize = iSectorSize;
                    393:   }else{
                    394:     g.iSectorSize = 512;
                    395:   }
                    396: }
                    397: 
                    398: #endif

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