Annotation of embedaddon/sqlite3/src/test_devsym.c, revision 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>