1 /* 2 ** 2005 November 29 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 OS interface code that is common to all 14 ** architectures. 15 */ 16 #define _SQLITE_OS_C_ 1 17 #include "sqliteInt.h" 18 #include "os.h" 19 #undef _SQLITE_OS_C_ 20 21 /* 22 ** The following routines are convenience wrappers around methods 23 ** of the OsFile object. This is mostly just syntactic sugar. All 24 ** of this would be completely automatic if SQLite were coded using 25 ** C++ instead of plain old C. 26 */ 27 int sqlite3OsClose(OsFile **pId){ 28 OsFile *id; 29 if( pId!=0 && (id = *pId)!=0 ){ 30 return id->pMethod->xClose(pId); 31 }else{ 32 return SQLITE_OK; 33 } 34 } 35 int sqlite3OsOpenDirectory(OsFile *id, const char *zName){ 36 return id->pMethod->xOpenDirectory(id, zName); 37 } 38 int sqlite3OsRead(OsFile *id, void *pBuf, int amt){ 39 return id->pMethod->xRead(id, pBuf, amt); 40 } 41 int sqlite3OsWrite(OsFile *id, const void *pBuf, int amt){ 42 return id->pMethod->xWrite(id, pBuf, amt); 43 } 44 int sqlite3OsSeek(OsFile *id, i64 offset){ 45 return id->pMethod->xSeek(id, offset); 46 } 47 int sqlite3OsTruncate(OsFile *id, i64 size){ 48 return id->pMethod->xTruncate(id, size); 49 } 50 int sqlite3OsSync(OsFile *id, int fullsync){ 51 return id->pMethod->xSync(id, fullsync); 52 } 53 void sqlite3OsSetFullSync(OsFile *id, int value){ 54 id->pMethod->xSetFullSync(id, value); 55 } 56 int sqlite3OsFileSize(OsFile *id, i64 *pSize){ 57 return id->pMethod->xFileSize(id, pSize); 58 } 59 int sqlite3OsLock(OsFile *id, int lockType){ 60 return id->pMethod->xLock(id, lockType); 61 } 62 int sqlite3OsUnlock(OsFile *id, int lockType){ 63 return id->pMethod->xUnlock(id, lockType); 64 } 65 int sqlite3OsCheckReservedLock(OsFile *id){ 66 return id->pMethod->xCheckReservedLock(id); 67 } 68 int sqlite3OsSectorSize(OsFile *id){ 69 int (*xSectorSize)(OsFile*) = id->pMethod->xSectorSize; 70 return xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE; 71 } 72 73 #if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) 74 /* These methods are currently only used for testing and debugging. */ 75 int sqlite3OsFileHandle(OsFile *id){ 76 return id->pMethod->xFileHandle(id); 77 } 78 int sqlite3OsLockState(OsFile *id){ 79 return id->pMethod->xLockState(id); 80 } 81 #endif 82 83 #ifdef SQLITE_ENABLE_REDEF_IO 84 /* 85 ** A function to return a pointer to the virtual function table. 86 ** This routine really does not accomplish very much since the 87 ** virtual function table is a global variable and anybody who 88 ** can call this function can just as easily access the variable 89 ** for themselves. Nevertheless, we include this routine for 90 ** backwards compatibility with an earlier redefinable I/O 91 ** interface design. 92 */ 93 struct sqlite3OsVtbl *sqlite3_os_switch(void){ 94 return &sqlite3Os; 95 } 96 #endif 97