15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2008 Jan 22 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. In place of 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you do good and not evil. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you find forgiveness for yourself and forgive others. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you share freely, never taking more than you give. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)****************************************************************************** 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains code that modified the OS layer in order to simulate 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** different device types (by overriding the return values of the 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** xDeviceCharacteristics() and xSectorSize() methods). 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_TEST /* This file is used for testing only */ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqlite3.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Maximum pathname length supported by the devsym backend. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEVSYM_MAX_PATHNAME 512 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Name used to identify this VFS. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEVSYM_VFS_NAME "devsym" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct devsym_file devsym_file; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct devsym_file { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_file base; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_file *pReal; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Method declarations for devsym_file. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymClose(sqlite3_file*); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymTruncate(sqlite3_file*, sqlite3_int64 size); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymSync(sqlite3_file*, int flags); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymFileSize(sqlite3_file*, sqlite3_int64 *pSize); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymLock(sqlite3_file*, int); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymUnlock(sqlite3_file*, int); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymCheckReservedLock(sqlite3_file*, int *); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymFileControl(sqlite3_file*, int op, void *pArg); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymSectorSize(sqlite3_file*); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymDeviceCharacteristics(sqlite3_file*); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymShmLock(sqlite3_file*,int,int,int); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymShmMap(sqlite3_file*,int,int,int, void volatile **); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void devsymShmBarrier(sqlite3_file*); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymShmUnmap(sqlite3_file*,int); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Method declarations for devsym_vfs. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymDelete(sqlite3_vfs*, const char *zName, int syncDir); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymAccess(sqlite3_vfs*, const char *zName, int flags, int *); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_LOAD_EXTENSION 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *devsymDlOpen(sqlite3_vfs*, const char *zFilename); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void devsymDlError(sqlite3_vfs*, int nByte, char *zErrMsg); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void (*devsymDlSym(sqlite3_vfs*,void*, const char *zSymbol))(void); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void devsymDlClose(sqlite3_vfs*, void*); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_LOAD_EXTENSION */ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymRandomness(sqlite3_vfs*, int nByte, char *zOut); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymSleep(sqlite3_vfs*, int microseconds); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymCurrentTime(sqlite3_vfs*, double*); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static sqlite3_vfs devsym_vfs = { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, /* iVersion */ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(devsym_file), /* szOsFile */ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEVSYM_MAX_PATHNAME, /* mxPathname */ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* pNext */ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEVSYM_VFS_NAME, /* zName */ 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* pAppData */ 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymOpen, /* xOpen */ 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymDelete, /* xDelete */ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymAccess, /* xAccess */ 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymFullPathname, /* xFullPathname */ 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_LOAD_EXTENSION 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymDlOpen, /* xDlOpen */ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymDlError, /* xDlError */ 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymDlSym, /* xDlSym */ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymDlClose, /* xDlClose */ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* xDlOpen */ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* xDlError */ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* xDlSym */ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* xDlClose */ 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_LOAD_EXTENSION */ 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymRandomness, /* xRandomness */ 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymSleep, /* xSleep */ 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymCurrentTime, /* xCurrentTime */ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* xGetLastError */ 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 /* xCurrentTimeInt64 */ 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static sqlite3_io_methods devsym_io_methods = { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, /* iVersion */ 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymClose, /* xClose */ 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymRead, /* xRead */ 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymWrite, /* xWrite */ 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymTruncate, /* xTruncate */ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymSync, /* xSync */ 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymFileSize, /* xFileSize */ 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymLock, /* xLock */ 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymUnlock, /* xUnlock */ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymCheckReservedLock, /* xCheckReservedLock */ 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymFileControl, /* xFileControl */ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymSectorSize, /* xSectorSize */ 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymDeviceCharacteristics, /* xDeviceCharacteristics */ 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymShmMap, /* xShmMap */ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymShmLock, /* xShmLock */ 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymShmBarrier, /* xShmBarrier */ 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsymShmUnmap /* xShmUnmap */ 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DevsymGlobal { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDeviceChar; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSectorSize; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DevsymGlobal g = {0, 0, 512}; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Close an devsym-file. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymClose(sqlite3_file *pFile){ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsClose(p->pReal); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Read data from an devsym-file. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymRead( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_file *pFile, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *zBuf, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iAmt, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite_int64 iOfst 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsRead(p->pReal, zBuf, iAmt, iOfst); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write data to an devsym-file. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymWrite( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_file *pFile, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *zBuf, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iAmt, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite_int64 iOfst 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Truncate an devsym-file. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymTruncate(sqlite3_file *pFile, sqlite_int64 size){ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsTruncate(p->pReal, size); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Sync an devsym-file. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymSync(sqlite3_file *pFile, int flags){ 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsSync(p->pReal, flags); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the current file-size of an devsym-file. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsFileSize(p->pReal, pSize); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Lock an devsym-file. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymLock(sqlite3_file *pFile, int eLock){ 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsLock(p->pReal, eLock); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Unlock an devsym-file. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymUnlock(sqlite3_file *pFile, int eLock){ 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsUnlock(p->pReal, eLock); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check if another file-handle holds a RESERVED lock on an devsym-file. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymCheckReservedLock(sqlite3_file *pFile, int *pResOut){ 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsCheckReservedLock(p->pReal, pResOut); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** File control method. For custom operations on an devsym-file. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymFileControl(sqlite3_file *pFile, int op, void *pArg){ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsFileControl(p->pReal, op, pArg); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the sector-size in bytes for an devsym-file. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymSectorSize(sqlite3_file *pFile){ 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g.iSectorSize; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the device characteristic flags supported by an devsym-file. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymDeviceCharacteristics(sqlite3_file *pFile){ 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g.iDeviceChar; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Shared-memory methods are all pass-thrus. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymShmLock(sqlite3_file *pFile, int ofst, int n, int flags){ 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsShmLock(p->pReal, ofst, n, flags); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymShmMap( 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_file *pFile, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iRegion, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int szRegion, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isWrite, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void volatile **pp 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsShmMap(p->pReal, iRegion, szRegion, isWrite, pp); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void devsymShmBarrier(sqlite3_file *pFile){ 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsShmBarrier(p->pReal); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymShmUnmap(sqlite3_file *pFile, int delFlag){ 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsShmUnmap(p->pReal, delFlag); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Open an devsym file handle. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymOpen( 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zName, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_file *pFile, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pOutFlags 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_file *p = (devsym_file *)pFile; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pReal = (sqlite3_file *)&p[1]; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3OsOpen(g.pVfs, zName, p->pReal, flags, pOutFlags); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pReal->pMethods ){ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFile->pMethods = &devsym_io_methods; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete the file located at zPath. If the dirSync argument is true, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ensure the file-system modifications are synced to disk before 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returning. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsDelete(g.pVfs, zPath, dirSync); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test for access permissions. Return true if the requested permission 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is available, or false otherwise. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymAccess( 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zPath, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pResOut 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsAccess(g.pVfs, zPath, flags, pResOut); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Populate buffer zOut with the full canonical pathname corresponding 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the pathname in zPath. zOut is guaranteed to point to a buffer 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of at least (DEVSYM_MAX_PATHNAME+1) bytes. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymFullPathname( 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zPath, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nOut, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zOut 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsFullPathname(g.pVfs, zPath, nOut, zOut); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_LOAD_EXTENSION 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Open the dynamic library located at zPath and return a handle. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *devsymDlOpen(sqlite3_vfs *pVfs, const char *zPath){ 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsDlOpen(g.pVfs, zPath); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Populate the buffer zErrMsg (size nByte bytes) with a human readable 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** utf-8 string describing the most recent error encountered associated 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with dynamic libraries. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void devsymDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsDlError(g.pVfs, nByte, zErrMsg); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a pointer to the symbol zSymbol in the dynamic library pHandle. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void (*devsymDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){ 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsDlSym(g.pVfs, p, zSym); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Close the dynamic library handle pHandle. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void devsymDlClose(sqlite3_vfs *pVfs, void *pHandle){ 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsDlClose(g.pVfs, pHandle); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_LOAD_EXTENSION */ 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Populate the buffer pointed to by zBufOut with nByte bytes of 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** random data. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsRandomness(g.pVfs, nByte, zBufOut); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Sleep for nMicro microseconds. Return the number of microseconds 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** actually slept. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymSleep(sqlite3_vfs *pVfs, int nMicro){ 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3OsSleep(g.pVfs, nMicro); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the current time as a Julian Day number in *pTimeOut. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int devsymCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g.pVfs->xCurrentTime(g.pVfs, pTimeOut); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This procedure registers the devsym vfs with SQLite. If the argument is 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** true, the devsym vfs becomes the new default vfs. It is the only publicly 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** available function in this file. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void devsym_register(int iDeviceChar, int iSectorSize){ 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( g.pVfs==0 ){ 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g.pVfs = sqlite3_vfs_find(0); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) devsym_vfs.szOsFile += g.pVfs->szOsFile; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register(&devsym_vfs, 0); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iDeviceChar>=0 ){ 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g.iDeviceChar = iDeviceChar; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g.iDeviceChar = 0; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iSectorSize>=0 ){ 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g.iSectorSize = iSectorSize; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g.iSectorSize = 512; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 399