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