aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2010-07-01 19:45:34 +0000
committerdrh <drh@noemail.net>2010-07-01 19:45:34 +0000
commit32f29643907cf278c627fc5df1b884b6d524694d (patch)
treece23e33a6ca2c9357fbcaf8f11af22797ff3696c /src
parentd0b0d4dc23145c922d23713785155ccbf48743b4 (diff)
downloadsqlite-32f29643907cf278c627fc5df1b884b6d524694d.tar.gz
sqlite-32f29643907cf278c627fc5df1b884b6d524694d.zip
If you delete a database file but not its *-wal file, then open the database
(thus creating a new empty database file) the *-wal file is automatically deleted. FossilOrigin-Name: 95c69dfbddaf4367cd699dfe8fcf8e06030c1f53
Diffstat (limited to 'src')
-rw-r--r--src/pager.c51
1 files changed, 39 insertions, 12 deletions
diff --git a/src/pager.c b/src/pager.c
index b2e148712..f7fcd6172 100644
--- a/src/pager.c
+++ b/src/pager.c
@@ -2414,12 +2414,19 @@ static int pagerBeginReadTransaction(Pager *pPager){
}
/*
-** Check if the *-wal file that corresponds to the database opened by pPager
-** exists. Assuming no error occurs, set *pExists to 1 if the file exists,
-** or 0 otherwise and return SQLITE_OK. If an IO or OOM error occurs, return
+** Check for the existence of or delete the *-wal file that corresponds to
+** the database opened by pPager.
+**
+** When pExists!=NULL, set *pExists to 1 if the *-wal file exists, or 0
+** if the *-wal file does not exist.
+**
+** When pExists==NULL, delete the *-wal file if it exists, or the do
+** nothing if the *-wal file does not exist.
+**
+** Return SQLITE_OK on success. If on an IO or OOM error occurs, return
** an SQLite error code.
*/
-static int pagerHasWAL(Pager *pPager, int *pExists){
+static int pagerCheckForOrDeleteWAL(Pager *pPager, int *pExists){
int rc; /* Return code */
char *zWal; /* Name of the WAL file */
@@ -2428,7 +2435,11 @@ static int pagerHasWAL(Pager *pPager, int *pExists){
if( !zWal ){
rc = SQLITE_NOMEM;
}else{
- rc = sqlite3OsAccess(pPager->pVfs, zWal, SQLITE_ACCESS_EXISTS, pExists);
+ if( pExists ){
+ rc = sqlite3OsAccess(pPager->pVfs, zWal, SQLITE_ACCESS_EXISTS, pExists);
+ }else{
+ rc = sqlite3OsDelete(pPager->pVfs, zWal, 0);
+ }
sqlite3_free(zWal);
}
return rc;
@@ -2436,22 +2447,38 @@ static int pagerHasWAL(Pager *pPager, int *pExists){
/*
** Check if the *-wal file that corresponds to the database opened by pPager
-** exists. If it does, open the pager in WAL mode. Otherwise, if no error
-** occurs, make sure Pager.journalMode is not set to PAGER_JOURNALMODE_WAL.
-** If an IO or OOM error occurs, return an SQLite error code.
+** exists if the database is not empy, or verify that the *-wal file does
+** not exist (by deleting it) if the database file is empty.
+**
+** If the database is not empty and the *-wal file exists, open the pager
+** in WAL mode. If the database is empty or if no *-wal file exists and
+** if no error occurs, make sure Pager.journalMode is not set to
+** PAGER_JOURNALMODE_WAL.
+**
+** Return SQLITE_OK or an error code.
**
** If the WAL file is opened, also open a snapshot (read transaction).
**
** The caller must hold a SHARED lock on the database file to call this
** function. Because an EXCLUSIVE lock on the db file is required to delete
-** a WAL, this ensures there is no race condition between the xAccess()
-** below and an xDelete() being executed by some other connection.
+** a WAL on a none-empty database, this ensures there is no race condition
+** between the xAccess() below and an xDelete() being executed by some
+** other connection.
*/
static int pagerOpenWalIfPresent(Pager *pPager){
int rc = SQLITE_OK;
if( !pPager->tempFile ){
int isWal; /* True if WAL file exists */
- rc = pagerHasWAL(pPager, &isWal);
+ int nPage; /* Size of the database file */
+ assert( pPager->state>=SHARED_LOCK );
+ rc = sqlite3PagerPagecount(pPager, &nPage);
+ if( rc ) return rc;
+ if( nPage==0 ){
+ rc = pagerCheckForOrDeleteWAL(pPager, 0);
+ isWal = 0;
+ }else{
+ rc = pagerCheckForOrDeleteWAL(pPager, &isWal);
+ }
if( rc==SQLITE_OK ){
if( isWal ){
pager_reset(pPager);
@@ -6071,7 +6098,7 @@ int sqlite3PagerCloseWal(Pager *pPager){
int logexists = 0;
rc = sqlite3OsLock(pPager->fd, SQLITE_LOCK_SHARED);
if( rc==SQLITE_OK ){
- rc = pagerHasWAL(pPager, &logexists);
+ rc = pagerCheckForOrDeleteWAL(pPager, &logexists);
}
if( rc==SQLITE_OK && logexists ){
rc = sqlite3WalOpen(pPager->pVfs, pPager->fd,