From: dan Date: Mon, 9 Dec 2013 20:42:03 +0000 (+0000) Subject: Modify the way some internal file-controls are invoked. In order to support multi... X-Git-Tag: version-3.8.3~101^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=999cd08aae0e93ac3890f8dcf065a70378d7bb67;p=thirdparty%2Fsqlite.git Modify the way some internal file-controls are invoked. In order to support multi-file transactions in the zipvfs extension. FossilOrigin-Name: 32fb1784af4594161d954343e3787db702000a4d --- diff --git a/manifest b/manifest index eb6e212626..49f2c98b68 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\stest\snumber\sin\sthe\soutput\sof\sthe\sspeedtest1.c\sprogram.\s\sNo\nchanges\sto\sthe\stest\salgorithms. -D 2013-12-09T12:24:23.629 +C Modify\sthe\sway\ssome\sinternal\sfile-controls\sare\sinvoked.\sIn\sorder\sto\ssupport\smulti-file\stransactions\sin\sthe\szipvfs\sextension. +D 2013-12-09T20:42:03.163 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -163,7 +163,7 @@ F src/alter.c 2af0330bb1b601af7a7789bf7229675fd772a083 F src/analyze.c 581d5c18ce89c6f45d4dca65914d0de5b4dad41f F src/attach.c 0a17c9364895316ca4f52d06a97a72c0af1ae8b3 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 -F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 +F src/backup.c 6cb4c4ee1d302621eb18ad93a4216fed387b2568 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 F src/btree.c 432c3e22ff76e8ee1caf57ff88ba9f8af1fcfc30 @@ -207,8 +207,8 @@ F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f F src/os_win.c 4323dd0bac4f7a7037fc4cf87fb4692d17f0b108 -F src/pager.c 061d0b41354a8446256f5d765771e2a026ec8ed2 -F src/pager.h f094af9f6ececfaa8a1e93876905a4f34233fb0c +F src/pager.c b28711af0f595414a7017f6993d4e6f90a3d2114 +F src/pager.h 6a790b64a9ea79bc2c849bdefdd39e2344bca94a F src/parse.y acee1a9958539e21263362b194594c5255ad2fca F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 @@ -221,7 +221,7 @@ F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758 -F src/sqlite.h.in 125dc0b76f0116f1cd6f13536db52ba981e1c5bd +F src/sqlite.h.in 767b7475655de093182ec3d7b1f66a0cf5f1c390 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h f3a5d663fe9c6c0b2ee7fc2e20a6204eaea5bc7c @@ -234,7 +234,7 @@ F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35 F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df F src/test5.c a6d1ac55ac054d0b2b8f37b5e655b6c92645a013 -F src/test6.c 4f958b71334695e65746d357dac77709732b28db +F src/test6.c 6884dcfb1d04c26083ffb441ab329043967c09e5 F src/test7.c 72b732baa5642f795655ba1126ea032af46ecfd2 F src/test8.c c7aab1d9fbbf54fc33d43b73aa24aa55f9eaf534 F src/test9.c bea1e8cf52aa93695487badedd6e1886c321ea60 @@ -841,7 +841,7 @@ F test/tclsqlite.test 37a61c2da7e3bfe3b8c1a2867199f6b860df5d43 F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptrigger.test 8ec228b0db5d7ebc4ee9b458fc28cb9e7873f5e1 -F test/tester.tcl 2a7cce4abf404557c09323a84a2444b189835d0f +F test/tester.tcl 08e9f317afe60d398fa900993503ecaef3295bad F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5 F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1146,7 +1146,10 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 2d6dd7c2eb5a64f8994162b564a99ef0014b7460 -R 9b7d54400c77029a626c96270fd35702 -U drh -Z a893e863f82f8a1033dbfe922fa06c0b +P fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 +R e8a2a861e9953d868791659025627e6a +T *branch * zipvfs-multifile-commit +T *sym-zipvfs-multifile-commit * +T -sym-trunk * +U dan +Z 19770b8e4b3ab930c64ec8e320e02ae3 diff --git a/manifest.uuid b/manifest.uuid index 7d8b23433a..c4279a2bfe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 \ No newline at end of file +32fb1784af4594161d954343e3787db702000a4d \ No newline at end of file diff --git a/src/backup.c b/src/backup.c index 1bac821f3f..292f3f456c 100644 --- a/src/backup.c +++ b/src/backup.c @@ -526,7 +526,7 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){ /* Sync the database file to disk. */ if( rc==SQLITE_OK ){ - rc = sqlite3PagerSync(pDestPager); + rc = sqlite3PagerSync(pDestPager, 0); } }else{ sqlite3PagerTruncateImage(pDestPager, nDestTruncate); diff --git a/src/pager.c b/src/pager.c index 7f79bd7eca..3a59ca29e1 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1249,6 +1249,7 @@ static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){ || szJ<16 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) || len>=nMaster + || len==0 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) || memcmp(aMagic, aJournalMagic, 8) @@ -2018,6 +2019,11 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ rc = pager_truncate(pPager, pPager->dbSize); } + if( rc==SQLITE_OK && bCommit && isOpen(pPager->fd) ){ + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + } + if( !pPager->exclusiveMode && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0)) ){ @@ -2831,7 +2837,7 @@ end_playback: if( rc==SQLITE_OK && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) ){ - rc = sqlite3PagerSync(pPager); + rc = sqlite3PagerSync(pPager, 0); } if( rc==SQLITE_OK ){ rc = pager_end_transaction(pPager, zMaster[0]!='\0', 0); @@ -6006,17 +6012,17 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ ** If successful, or if called on a pager for which it is a no-op, this ** function returns SQLITE_OK. Otherwise, an IO error code is returned. */ -int sqlite3PagerSync(Pager *pPager){ +int sqlite3PagerSync(Pager *pPager, const char *zMaster){ int rc = SQLITE_OK; + + if( isOpen(pPager->fd) ){ + void *pArg = (void*)zMaster; + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, pArg); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; + } if( !pPager->noSync ){ assert( !MEMDB ); rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); - }else if( isOpen(pPager->fd) ){ - assert( !MEMDB ); - rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, 0); - if( rc==SQLITE_NOTFOUND ){ - rc = SQLITE_OK; - } } return rc; } @@ -6215,7 +6221,7 @@ int sqlite3PagerCommitPhaseOne( /* Finally, sync the database file. */ if( !noSync ){ - rc = sqlite3PagerSync(pPager); + rc = sqlite3PagerSync(pPager, zMaster); } IOTRACE(("DBSYNC %p\n", pPager)) } diff --git a/src/pager.h b/src/pager.h index 7851d28345..55988a8486 100644 --- a/src/pager.h +++ b/src/pager.h @@ -150,7 +150,7 @@ void sqlite3PagerPagecount(Pager*, int*); int sqlite3PagerBegin(Pager*, int exFlag, int); int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); int sqlite3PagerExclusiveLock(Pager*); -int sqlite3PagerSync(Pager *pPager); +int sqlite3PagerSync(Pager *pPager, const char *zMaster); int sqlite3PagerCommitPhaseTwo(Pager*); int sqlite3PagerRollback(Pager*); int sqlite3PagerOpenSavepoint(Pager *pPager, int n); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 1ad181e740..9616adcd38 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -946,6 +946,8 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_TRACE 19 #define SQLITE_FCNTL_HAS_MOVED 20 +#define SQLITE_FCNTL_COMMIT_PHASETWO 21 + /* ** CAPI3REF: Mutex Handle ** diff --git a/src/test6.c b/src/test6.c index 6ea03b0f1c..fb94363c36 100644 --- a/src/test6.c +++ b/src/test6.c @@ -409,13 +409,17 @@ static int cfRead( sqlite_int64 iOfst ){ CrashFile *pCrash = (CrashFile *)pFile; + int nCopy = (int)MIN((i64)iAmt, (pCrash->iSize - iOfst)); + + if( nCopy>0 ){ + memcpy(zBuf, &pCrash->zData[iOfst], nCopy); + } /* Check the file-size to see if this is a short-read */ - if( pCrash->iSize<(iOfst+iAmt) ){ + if( nCopyzData[iOfst], iAmt); return SQLITE_OK; } diff --git a/test/tester.tcl b/test/tester.tcl index 771ca91442..109fb310a9 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -1251,6 +1251,7 @@ proc crashsql {args} { set blocksize "" set crashdelay 1 set prngseed 0 + set opendb { sqlite3 db test.db -vfs crash } set tclbody {} set crashfile "" set dc "" @@ -1262,6 +1263,7 @@ proc crashsql {args} { set z2 [lindex $args [expr $ii+1]] if {$n>1 && [string first $z -delay]==0} {set crashdelay $z2} \ + elseif {$n>1 && [string first $z -opendb]==0} {set opendb $z2} \ elseif {$n>1 && [string first $z -seed]==0} {set prngseed $z2} \ elseif {$n>1 && [string first $z -file]==0} {set crashfile $z2} \ elseif {$n>1 && [string first $z -tclbody]==0} {set tclbody $z2} \ @@ -1283,7 +1285,7 @@ proc crashsql {args} { puts $f "sqlite3_crash_enable 1" puts $f "sqlite3_crashparams $blocksize $dc $crashdelay $cfile" puts $f "sqlite3_test_control_pending_byte $::sqlite_pending_byte" - puts $f "sqlite3 db test.db -vfs crash" + puts $f $opendb # This block sets the cache size of the main database to 10 # pages. This is done in case the build is configured to omit @@ -1291,6 +1293,7 @@ proc crashsql {args} { puts $f {db eval {SELECT * FROM sqlite_master;}} puts $f {set bt [btree_from_db db]} puts $f {btree_set_cache_size $bt 10} + if {$prngseed} { set seed [expr {$prngseed%10007+1}] # puts seed=$seed