| Index: third_party/sqlite/src/src/os.c
|
| diff --git a/third_party/sqlite/src/src/os.c b/third_party/sqlite/src/src/os.c
|
| index 2a2cf13c5ee06abafc260d13eee3d91872401b2c..5cf001479468d747bcf5ca32406aeb4f594d30e9 100644
|
| --- a/third_party/sqlite/src/src/os.c
|
| +++ b/third_party/sqlite/src/src/os.c
|
| @@ -13,9 +13,29 @@
|
| ** This file contains OS interface code that is common to all
|
| ** architectures.
|
| */
|
| -#define _SQLITE_OS_C_ 1
|
| #include "sqliteInt.h"
|
| -#undef _SQLITE_OS_C_
|
| +
|
| +/*
|
| +** If we compile with the SQLITE_TEST macro set, then the following block
|
| +** of code will give us the ability to simulate a disk I/O error. This
|
| +** is used for testing the I/O recovery logic.
|
| +*/
|
| +#if defined(SQLITE_TEST)
|
| +int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */
|
| +int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */
|
| +int sqlite3_io_error_pending = 0; /* Count down to first I/O error */
|
| +int sqlite3_io_error_persist = 0; /* True if I/O errors persist */
|
| +int sqlite3_io_error_benign = 0; /* True if errors are benign */
|
| +int sqlite3_diskfull_pending = 0;
|
| +int sqlite3_diskfull = 0;
|
| +#endif /* defined(SQLITE_TEST) */
|
| +
|
| +/*
|
| +** When testing, also keep a count of the number of open files.
|
| +*/
|
| +#if defined(SQLITE_TEST)
|
| +int sqlite3_open_file_count = 0;
|
| +#endif /* defined(SQLITE_TEST) */
|
|
|
| /*
|
| ** The default SQLite sqlite3_vfs implementations do not allocate
|
| @@ -24,7 +44,7 @@
|
| ** So we test the effects of a malloc() failing and the sqlite3OsXXX()
|
| ** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro.
|
| **
|
| -** The following functions are instrumented for malloc() failure
|
| +** The following functions are instrumented for malloc() failure
|
| ** testing:
|
| **
|
| ** sqlite3OsRead()
|
| @@ -44,9 +64,9 @@
|
| #if defined(SQLITE_TEST)
|
| int sqlite3_memdebug_vfs_oom_test = 1;
|
| #define DO_OS_MALLOC_TEST(x) \
|
| - if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3IsMemJournal(x))) { \
|
| + if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3JournalIsInMemory(x))) { \
|
| void *pTstAlloc = sqlite3Malloc(10); \
|
| - if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \
|
| + if (!pTstAlloc) return SQLITE_IOERR_NOMEM_BKPT; \
|
| sqlite3_free(pTstAlloc); \
|
| }
|
| #else
|
| @@ -59,13 +79,11 @@ int sqlite3_memdebug_vfs_oom_test = 1;
|
| ** of this would be completely automatic if SQLite were coded using
|
| ** C++ instead of plain old C.
|
| */
|
| -int sqlite3OsClose(sqlite3_file *pId){
|
| - int rc = SQLITE_OK;
|
| +void sqlite3OsClose(sqlite3_file *pId){
|
| if( pId->pMethods ){
|
| - rc = pId->pMethods->xClose(pId);
|
| + pId->pMethods->xClose(pId);
|
| pId->pMethods = 0;
|
| }
|
| - return rc;
|
| }
|
| int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){
|
| DO_OS_MALLOC_TEST(id);
|
| @@ -110,8 +128,8 @@ int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){
|
| #ifdef SQLITE_TEST
|
| if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){
|
| /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite
|
| - ** is using a regular VFS, it is called after the corresponding
|
| - ** transaction has been committed. Injecting a fault at this point
|
| + ** is using a regular VFS, it is called after the corresponding
|
| + ** transaction has been committed. Injecting a fault at this point
|
| ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM
|
| ** but the transaction is committed anyway.
|
| **
|
| @@ -180,10 +198,10 @@ int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){
|
| ** VFS methods.
|
| */
|
| int sqlite3OsOpen(
|
| - sqlite3_vfs *pVfs,
|
| - const char *zPath,
|
| - sqlite3_file *pFile,
|
| - int flags,
|
| + sqlite3_vfs *pVfs,
|
| + const char *zPath,
|
| + sqlite3_file *pFile,
|
| + int flags,
|
| int *pFlagsOut
|
| ){
|
| int rc;
|
| @@ -202,18 +220,18 @@ int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
|
| return pVfs->xDelete(pVfs, zPath, dirSync);
|
| }
|
| int sqlite3OsAccess(
|
| - sqlite3_vfs *pVfs,
|
| - const char *zPath,
|
| - int flags,
|
| + sqlite3_vfs *pVfs,
|
| + const char *zPath,
|
| + int flags,
|
| int *pResOut
|
| ){
|
| DO_OS_MALLOC_TEST(0);
|
| return pVfs->xAccess(pVfs, zPath, flags, pResOut);
|
| }
|
| int sqlite3OsFullPathname(
|
| - sqlite3_vfs *pVfs,
|
| - const char *zPath,
|
| - int nPathOut,
|
| + sqlite3_vfs *pVfs,
|
| + const char *zPath,
|
| + int nPathOut,
|
| char *zPathOut
|
| ){
|
| DO_OS_MALLOC_TEST(0);
|
| @@ -240,6 +258,9 @@ int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
|
| int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){
|
| return pVfs->xSleep(pVfs, nMicro);
|
| }
|
| +int sqlite3OsGetLastError(sqlite3_vfs *pVfs){
|
| + return pVfs->xGetLastError ? pVfs->xGetLastError(pVfs, 0, 0) : 0;
|
| +}
|
| int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){
|
| int rc;
|
| /* IMPLEMENTATION-OF: R-49045-42493 SQLite will use the xCurrentTimeInt64()
|
| @@ -259,13 +280,13 @@ int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){
|
| }
|
|
|
| int sqlite3OsOpenMalloc(
|
| - sqlite3_vfs *pVfs,
|
| - const char *zFile,
|
| - sqlite3_file **ppFile,
|
| + sqlite3_vfs *pVfs,
|
| + const char *zFile,
|
| + sqlite3_file **ppFile,
|
| int flags,
|
| int *pOutFlags
|
| ){
|
| - int rc = SQLITE_NOMEM;
|
| + int rc;
|
| sqlite3_file *pFile;
|
| pFile = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile);
|
| if( pFile ){
|
| @@ -275,15 +296,15 @@ int sqlite3OsOpenMalloc(
|
| }else{
|
| *ppFile = pFile;
|
| }
|
| + }else{
|
| + rc = SQLITE_NOMEM_BKPT;
|
| }
|
| return rc;
|
| }
|
| -int sqlite3OsCloseFree(sqlite3_file *pFile){
|
| - int rc = SQLITE_OK;
|
| +void sqlite3OsCloseFree(sqlite3_file *pFile){
|
| assert( pFile );
|
| - rc = sqlite3OsClose(pFile);
|
| + sqlite3OsClose(pFile);
|
| sqlite3_free(pFile);
|
| - return rc;
|
| }
|
|
|
| /*
|
| @@ -294,7 +315,7 @@ int sqlite3OsCloseFree(sqlite3_file *pFile){
|
| */
|
| int sqlite3OsInit(void){
|
| void *p = sqlite3_malloc(10);
|
| - if( p==0 ) return SQLITE_NOMEM;
|
| + if( p==0 ) return SQLITE_NOMEM_BKPT;
|
| sqlite3_free(p);
|
| return sqlite3_os_init();
|
| }
|
|
|