Index: third_party/sqlite/src/src/test_journal.c |
diff --git a/third_party/sqlite/src/src/test_journal.c b/third_party/sqlite/src/src/test_journal.c |
index 6e320b7abb0cacdfb22633b4a19c5a81a030b1f0..4e63bccf76735f99ec145e8d47ded75ad8a146c9 100644 |
--- a/third_party/sqlite/src/src/test_journal.c |
+++ b/third_party/sqlite/src/src/test_journal.c |
@@ -160,6 +160,7 @@ static int jtRandomness(sqlite3_vfs*, int nByte, char *zOut); |
static int jtSleep(sqlite3_vfs*, int microseconds); |
static int jtCurrentTime(sqlite3_vfs*, double*); |
static int jtCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); |
+static int jtGetLastError(sqlite3_vfs*, int, char*); |
static sqlite3_vfs jt_vfs = { |
2, /* iVersion */ |
@@ -179,7 +180,7 @@ static sqlite3_vfs jt_vfs = { |
jtRandomness, /* xRandomness */ |
jtSleep, /* xSleep */ |
jtCurrentTime, /* xCurrentTime */ |
- 0, /* xGetLastError */ |
+ jtGetLastError, /* xGetLastError */ |
jtCurrentTimeInt64 /* xCurrentTimeInt64 */ |
}; |
@@ -256,7 +257,8 @@ static int jtClose(sqlite3_file *pFile){ |
*pp = p->pNext; |
} |
leaveJtMutex(); |
- return sqlite3OsClose(p->pReal); |
+ sqlite3OsClose(p->pReal); |
+ return SQLITE_OK; |
} |
/* |
@@ -284,9 +286,10 @@ static int jtRead( |
** b) The file-name specified when the file was opened matches |
** all but the final 8 characters of the journal file name. |
** |
-** c) There is currently a reserved lock on the file. |
+** c) There is currently a reserved lock on the file. This |
+** condition is waived if the noLock argument is non-zero. |
**/ |
-static jt_file *locateDatabaseHandle(const char *zJournal){ |
+static jt_file *locateDatabaseHandle(const char *zJournal, int noLock){ |
jt_file *pMain = 0; |
enterJtMutex(); |
for(pMain=g.pList; pMain; pMain=pMain->pNext){ |
@@ -294,7 +297,7 @@ static jt_file *locateDatabaseHandle(const char *zJournal){ |
if( (pMain->flags&SQLITE_OPEN_MAIN_DB) |
&& ((int)strlen(pMain->zName)==nName) |
&& 0==memcmp(pMain->zName, zJournal, nName) |
- && (pMain->eLock>=SQLITE_LOCK_RESERVED) |
+ && ((pMain->eLock>=SQLITE_LOCK_RESERVED) || noLock) |
){ |
break; |
} |
@@ -516,7 +519,7 @@ static int jtWrite( |
jt_file *p = (jt_file *)pFile; |
if( p->flags&SQLITE_OPEN_MAIN_JOURNAL ){ |
if( iOfst==0 ){ |
- jt_file *pMain = locateDatabaseHandle(p->zName); |
+ jt_file *pMain = locateDatabaseHandle(p->zName, 0); |
assert( pMain ); |
if( iAmt==28 ){ |
@@ -561,7 +564,7 @@ static int jtWrite( |
rc = sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst); |
if( (p->flags&SQLITE_OPEN_MAIN_JOURNAL) && iAmt==12 ){ |
- jt_file *pMain = locateDatabaseHandle(p->zName); |
+ jt_file *pMain = locateDatabaseHandle(p->zName, 0); |
int rc2 = readJournalFile(p, pMain); |
if( rc==SQLITE_OK ) rc = rc2; |
} |
@@ -575,7 +578,7 @@ static int jtTruncate(sqlite3_file *pFile, sqlite_int64 size){ |
jt_file *p = (jt_file *)pFile; |
if( p->flags&SQLITE_OPEN_MAIN_JOURNAL && size==0 ){ |
/* Truncating a journal file. This is the end of a transaction. */ |
- jt_file *pMain = locateDatabaseHandle(p->zName); |
+ jt_file *pMain = locateDatabaseHandle(p->zName, 0); |
closeTransaction(pMain); |
} |
if( p->flags&SQLITE_OPEN_MAIN_DB && p->pWritable ){ |
@@ -603,11 +606,10 @@ static int jtSync(sqlite3_file *pFile, int flags){ |
** jt_file.pWritable bitvec of the main database file associated with |
** this journal file. |
*/ |
- pMain = locateDatabaseHandle(p->zName); |
- assert(pMain); |
+ pMain = locateDatabaseHandle(p->zName, 0); |
/* Set the bitvec values */ |
- if( pMain->pWritable ){ |
+ if( pMain && pMain->pWritable ){ |
pMain->nSync++; |
rc = readJournalFile(p, pMain); |
if( rc!=SQLITE_OK ){ |
@@ -729,7 +731,7 @@ static int jtDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ |
int nPath = (int)strlen(zPath); |
if( nPath>8 && 0==strcmp("-journal", &zPath[nPath-8]) ){ |
/* Deleting a journal file. The end of a transaction. */ |
- jt_file *pMain = locateDatabaseHandle(zPath); |
+ jt_file *pMain = locateDatabaseHandle(zPath, 0); |
if( pMain ){ |
closeTransaction(pMain); |
} |
@@ -824,6 +826,10 @@ static int jtCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){ |
return g.pVfs->xCurrentTimeInt64(g.pVfs, pTimeOut); |
} |
+static int jtGetLastError(sqlite3_vfs *pVfs, int n, char *z){ |
+ return g.pVfs->xGetLastError(g.pVfs, n, z); |
+} |
+ |
/************************************************************************** |
** Start of public API. |
*/ |