diff options
author | drh <drh@noemail.net> | 2013-12-06 17:23:38 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2013-12-06 17:23:38 +0000 |
commit | 3fee8a63c8bea86450439c3320cb1d5f9050413a (patch) | |
tree | 4b8c3b24c3fc501384418b757fc87fd6b7c1b3a2 /src | |
parent | 1b1f30bb5e9fe8e508c8953f4d29d29cb155a510 (diff) | |
download | sqlite-3fee8a63c8bea86450439c3320cb1d5f9050413a.tar.gz sqlite-3fee8a63c8bea86450439c3320cb1d5f9050413a.zip |
Only error out on a database file move when attempting to start a write
transaction. Assume read transactions are still safe. And make the error
SQLITE_READONLY_DBMOVED instead of SQLITE_IOERR_NODB.
FossilOrigin-Name: 28348f2ada98c616241a51aecb70b63e87e6ddbb
Diffstat (limited to 'src')
-rw-r--r-- | src/pager.c | 28 | ||||
-rw-r--r-- | src/sqlite.h.in | 2 | ||||
-rw-r--r-- | src/test_vfstrace.c | 2 |
3 files changed, 17 insertions, 15 deletions
diff --git a/src/pager.c b/src/pager.c index 78cb78ab2..5803b2927 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4799,7 +4799,7 @@ int sqlite3PagerOpen( /* Verify that the database file has not be deleted or renamed out from ** under the pager. Return SQLITE_OK if the database is still were it ought -** to be on disk. Return non-zero (SQLITE_IOERR_NODB or some other error +** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error ** code from sqlite3OsAccess()) if the database has gone missing. */ static int databaseIsUnmoved(Pager *pPager){ @@ -4814,7 +4814,7 @@ static int databaseIsUnmoved(Pager *pPager){ dc = sqlite3OsDeviceCharacteristics(pPager->fd); if( (dc&fixedFlags)==fixedFlags ) return SQLITE_OK; rc = sqlite3OsAccess(pPager->pVfs, pPager->zFilename, SQLITE_ACCESS_EXISTS, &x); - if( rc==SQLITE_OK && !x ) rc = SQLITE_IOERR_NODB; + if( rc==SQLITE_OK && !x ) rc = SQLITE_READONLY_DBMOVED; return rc; } @@ -4991,10 +4991,6 @@ int sqlite3PagerSharedLock(Pager *pPager){ goto failed; } - /* Verify that the database is unmoved and undeleted */ - rc = databaseIsUnmoved(pPager); - if( rc ) goto failed; - /* If a journal file exists, and there is no RESERVED lock on the ** database file, then it either needs to be played back or deleted. */ @@ -5498,13 +5494,19 @@ static int pager_open_journal(Pager *pPager){ (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL): (SQLITE_OPEN_MAIN_JOURNAL) ); - #ifdef SQLITE_ENABLE_ATOMIC_WRITE - rc = sqlite3JournalOpen( - pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) - ); - #else - rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); - #endif + + /* Verify that the database still has the same name as it did when + ** it was originally opened. */ + rc = databaseIsUnmoved(pPager); + if( rc==SQLITE_OK ){ +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + rc = sqlite3JournalOpen( + pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) + ); +#else + rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); +#endif + } } assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index de6b59b0b..f4692f286 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -475,7 +475,6 @@ int sqlite3_exec( #define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) #define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) #define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) -#define SQLITE_IOERR_NODB (SQLITE_IOERR | (27<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) @@ -487,6 +486,7 @@ int sqlite3_exec( #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) +#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) #define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) #define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) diff --git a/src/test_vfstrace.c b/src/test_vfstrace.c index 8d56cf894..c1792f116 100644 --- a/src/test_vfstrace.c +++ b/src/test_vfstrace.c @@ -262,7 +262,7 @@ static void vfstrace_print_errcode( case SQLITE_IOERR_SEEK: zVal = "SQLITE_IOERR_SEEK"; break; case SQLITE_IOERR_GETTEMPPATH: zVal = "SQLITE_IOERR_GETTEMPPATH"; break; case SQLITE_IOERR_CONVPATH: zVal = "SQLITE_IOERR_CONVPATH"; break; - case SQLITE_IOERR_NODB: zVal = "SQLITE_IOERR_NODB"; break; + case SQLITE_READONLY_DBMOVED: zVal = "SQLITE_READONLY_DBMOVED"; break; case SQLITE_LOCKED_SHAREDCACHE: zVal = "SQLITE_LOCKED_SHAREDCACHE"; break; case SQLITE_BUSY_RECOVERY: zVal = "SQLITE_BUSY_RECOVERY"; break; case SQLITE_CANTOPEN_NOTEMPDIR: zVal = "SQLITE_CANTOPEN_NOTEMPDIR"; break; |