From 5c531a4aabce7f5a1f60ec87576f24092259a848 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 16 Dec 2011 01:21:31 +0000 Subject: [PATCH] A better solution to being unable to find a unique master-journal filename: just delete an existing master-journal and reuse it. FossilOrigin-Name: 2685c2b949061f18bf6a4940eac8c8148873abb6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 15 +++++++-------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index c6cfc989a6..322d293528 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\santipenultimate\scharacter\sof\smaster-journal\sfilenames\sis\sa\s"9"\nin\sorder\sto\savoid\scollisions\swith\sother\sfiles\sin\s8+3\sfilename\smode.\s\sAlso,\nlimit\sthe\snumber\sof\sattempts\sat\sfinding\sa\sunique\smaster-journal\sfilename. -D 2011-12-16T00:33:04.352 +C A\sbetter\ssolution\sto\sbeing\sunable\sto\sfind\sa\sunique\smaster-journal\sfilename:\njust\sdelete\san\sexisting\smaster-journal\sand\sreuse\sit. +D 2011-12-16T01:21:31.882 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -243,7 +243,7 @@ F src/vdbe.c a7ab9993ec5a4d9479dc99671faec061fbf9b889 F src/vdbe.h f0725ee997db869ecae5bb70a71612aabeca7755 F src/vdbeInt.h 9498fc98a2c9e349a4ef13455ff5a3e898f40176 F src/vdbeapi.c 4dbba7f94f127f6ea8d2d0505ee1f98e5ffbf546 -F src/vdbeaux.c 896ce3c48bf1bf27a1330589a20daa2db0222381 +F src/vdbeaux.c 7bae4d94d7e41e8005824a6d1da54b73d47f52b1 F src/vdbeblob.c 32f2a4899d67f69634ea4dd93e3f651936d732cb F src/vdbemem.c 2fc78b3e0fabcc1eaa23cd79dd2e30e6dcfe1e56 F src/vdbesort.c 468d43c057063e54da4f1988b38b4f46d60e7790 @@ -978,7 +978,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 -P 3af1feaa35d3fb2e7be550cd32a727001b874938 -R 398b3e3805c532cf24ac8d99750e0da2 +P 34a0483605d36e6cf03065ed0df33fb1f7c8a272 +R dac1ae186d64bf5089bb1df4a91a9793 U drh -Z ebbc2fb95389a75c4e570b61ca8c6d99 +Z cdecba57f424e5a33e7e2e3955b5bd95 diff --git a/manifest.uuid b/manifest.uuid index b3c3bab442..6fdf08c334 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -34a0483605d36e6cf03065ed0df33fb1f7c8a272 \ No newline at end of file +2685c2b949061f18bf6a4940eac8c8148873abb6 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 2e01c982e5..6e183d0b8c 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1825,25 +1825,24 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ i64 offset = 0; int res; int retryCount = 0; + int nMainFile; /* Select a master journal file name */ + nMainFile = sqlite3Strlen30(zMainFile); + zMaster = sqlite3MPrintf(db, "%s-mjXXXXXX9XX", zMainFile); + if( zMaster==0 ) return SQLITE_NOMEM; do { u32 iRandom; if( retryCount++>100 ){ - sqlite3_log(SQLITE_FULL, "cannot create a master journal filename"); - rc = SQLITE_FULL; + sqlite3OsDelete(pVfs, zMaster, 0); break; } - sqlite3DbFree(db, zMaster); sqlite3_randomness(sizeof(iRandom), &iRandom); - zMaster = sqlite3MPrintf(db, "%s-mj%06X9%02X", zMainFile, + sqlite3_snprintf(13, &zMaster[nMainFile], "-mj%06X9%02X", (iRandom>>8)&0xffffff, iRandom&0xff); - if( !zMaster ){ - return SQLITE_NOMEM; - } /* The antipenultimate character of the master journal name must ** be "9" to avoid name collisions when using 8+3 filenames. */ - assert( zMaster[strlen(zMaster)-3]=='9' ); + assert( zMaster[sqlite3Strlen30(zMaster)-3]=='9' ); sqlite3FileSuffix3(zMainFile, zMaster); rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res); }while( rc==SQLITE_OK && res );