From: drh Date: Fri, 11 Dec 2015 12:53:26 +0000 (+0000) Subject: Merge recent trunk enhancements, and in particular the snapshot interface. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=68b203fe4e8e0c0a0ed1cdf3d7e40b1b4d1518ad;p=thirdparty%2Fsqlite.git Merge recent trunk enhancements, and in particular the snapshot interface. FossilOrigin-Name: 7e7b24064510001ca4a0c8295fa7d0138bde8dae --- 68b203fe4e8e0c0a0ed1cdf3d7e40b1b4d1518ad diff --cc manifest index ca458b008f,04d3534b4d..e723acf5c5 --- a/manifest +++ b/manifest @@@ -1,6 -1,6 +1,6 @@@ - C Merge\sall\srecent\strunk\senhancements,\sespecially\sthe\sunix\sVFS\schanges. - D 2015-12-02T20:22:38.912 - F Makefile.in 28325f17527ba422645ebf98901f8876c312a825 -C Add\sthe\sexperimental\ssnapshot\sinterface.\s\sBecause\sit\sis\sexperimental,\sit\sis\nsubject\sto\schange\sor\sremoval\sat\sa\slater\sdate. -D 2015-12-11T12:44:52.505 -F Makefile.in 28bcd6149e050dff35d4dcfd97e890cd387a499d ++C Merge\srecent\strunk\senhancements,\sand\sin\sparticular\sthe\ssnapshot\sinterface. ++D 2015-12-11T12:53:26.994 ++F Makefile.in 2b14d1b2c0d8b4c6fd84536d3d7860e1ddc03efc F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc e8fdca1cb89a1b58b5f4d3a130ea9a3d28cb314d F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 @@@ -266,7 -263,7 +266,7 @@@ F ext/userauth/userauth.c 5fa3bdb492f48 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 - F main.mk 6693ea5f978d0175d056baa83ace9f8aac56814e -F main.mk ed77cbb97848c8dae1ab928245432f74b0580162 ++F main.mk 2f7ba9f9e044ecfa95eb0a446eebe1b37a6b565a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@@ -285,7 -282,7 +285,7 @@@ F src/auth.c b56c78ebe40a2110fd361379f7 F src/backup.c 2869a76c03eb393ee795416e2387005553df72bc F src/bitvec.c 1a78d450a17c5016710eec900bedfc5729bf9bdf F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 - F src/btree.c 59c8f28530850c9f94be62aa4c020d39a4de10d2 -F src/btree.c 450950ce366159c3215736ae43d1062e7c06f741 ++F src/btree.c 1b90ae050612380659db1ebce870fccee738e845 F src/btree.h 2d76dee44704c47eed323356a758662724b674a0 F src/btreeInt.h 3ab435ed27adea54d040584b0bcc488ee7db1e38 F src/build.c e83da4d004a4e050c01acbb821ff7a7b1019c29b @@@ -305,10 -302,10 +305,10 @@@ F src/hash.h c8f3c31722cf3277d037139097 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 F src/insert.c e1d20ae8979e25519c2670233718676bedcfedc9 F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d -F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e +F src/legacy.c 9c17d86e06522c261307f0eb6bcb1254c8b04a59 - F src/loadext.c 18586e45a215325f15096821e9c082035d4fb810 - F src/main.c 66b67b2b3b0f972d4c5aee89d5d31e2f863606e9 - F src/malloc.c 337bbe9c7d436ef9b7d06b5dd10bbfc8f3025972 + F src/loadext.c 84996d7d70a605597d79c1f1d7b2012a5fd34f2b -F src/main.c 2f33510a6a392c606fe64964e695e55ad124242f ++F src/main.c 3b6c60fd72b862fe941af074811f54bcdffe109e + F src/malloc.c 8f787669e79de26efc42272b5797bc00fff527c6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 6919bcf12f221868ea066eec27e579fed95ce98b F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@@ -326,34 -323,33 +326,34 @@@ F src/os.c 5822c2b843a77219bba1e28887cd F src/os.h 3e57a24e2794a94d3cf2342c6d9a884888cd96bf F src/os_common.h abdb9a191a367793268fe553d25bab894e986a0e F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa - F src/os_unix.c 325d29171a7031739931be1a7baf18ebf3ca391f -F src/os_unix.c 0ca6d8710366fbb01a275160f018334cd347cbda -F src/os_win.c 386fba30419e8458b13209781c2af5590eab2811 ++F src/os_unix.c 90d83aaad8ffcbe4569a41b8fcc2821f308316cc +F src/os_win.c d5f32f015c52888b76c8919a8b3fa5c532dff497 F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca - F src/pager.c f286cbf210d862543635057132da176f4d69ac75 - F src/pager.h 3bb11e11eb1a9f4819bb0d91ede24b039916d8fd -F src/pager.c 58d2593612acb6b542de6715b4af397ea1fa0a35 -F src/pager.h bf25005b4656cd805af43487c3139fca9678d0cc ++F src/pager.c 25186b68d3180891dfa849bb9c0b7cd5d370fce3 ++F src/pager.h a038f5d7d5b17a8463e312d45f92b17e6928339e F src/parse.y 23737e649c26ce327603799e57f5c2ff50e5e6ba F src/pcache.c 73895411fa6b7bd6f0091212feabbe833b358d23 F src/pcache.h 1ff11adce609ba7de139b6abfabaf9a2bac947b5 F src/pcache1.c 46a110be31a8d9f9b41431733836822ca0dd27ab -F src/pragma.c f3e7147299ca05ef4304a36f1fd6e002729c72c6 +F src/pragma.c c1ab37e1576d22715d3bae4f51658326240a8161 F src/pragma.h 3d94aebbebd2089899fecc01909bf2608b39507d -F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 +F src/prepare.c 176b060bcf36041193c2807f2b045dce1effa4bb - F src/printf.c ca05561795ad6c2fa47acdd007702586282f7feb + F src/printf.c af589a27b7d40f6f4f704e9eea99f02f18ad6d32 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 - F src/resolve.c f4c897ca76ca6d5e0b3f0499c627392ffe657c8e + F src/resolve.c a83b41104e6ff69855d03cd0aaa09e93927ec39f F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e - F src/select.c 1611828a7116e5f6cc1e69cd07d59b0d2c662ea9 - F src/shell.c 2796237990d42e6a5a7beafee65ef70cc8767d21 - F src/sqlite.h.in 050e7ee3bb7e7f04bceb94b5c883eda435efdcf7 + F src/select.c f8fded11fc443a9f5a73cc5db069d06b34460e2f + F src/shell.c abbc74ea43dbf2f306ea18282d666683fb5efab2 -F src/sqlite.h.in 7d87d71b9a4689c51fa092f48f16590ff71558e3 ++F src/sqlite.h.in 52db0e5240e6c3d355937cdc187b61999d884aff F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad +F src/sqlite3_private.h a81a9c5f97c095cc3e86914a05f8fabe0011f4a1 - F src/sqlite3ext.h 41ef50b0418a7c5ad1337bb80db5a7928dee764f - F src/sqliteInt.h 753af29810be999593fe14bb2276b79dddccd8a6 + F src/sqlite3ext.h dfbe62ffd95b99afe2140d8c35b180d11924072d -F src/sqliteInt.h beb4a63b94428f52a3d7c7af2ba8bdc7d4682a03 ++F src/sqliteInt.h 8cde64521e8a71ee56b2adf018fa4119d0ceae1c F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e F src/tclsqlite.c d9439b6a910985b7fff43ba6756bcef00de22649 - F src/test1.c 5abe6505544d173c8daf020c276e4a7670683cc1 -F src/test1.c 4f1b42699068b7806af3111786f5ad760c2c1ff7 ++F src/test1.c f51730220589f17d95dbd6f821e1cb6377d4554c F src/test2.c 5586f43fcd9a1be0830793cf9d354082c261b25b F src/test3.c a8887dabbbee3059af338f20d290084a63ed1b0f F src/test4.c d168f83cc78d02e8d35567bb5630e40dcd85ac1e @@@ -367,10 -363,10 +367,10 @@@ F src/test_autoext.c dea8a01a7153b9adc9 F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803 F src/test_blob.c e5a7a81d61a780da79101aeb1e60d300af169e07 F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f - F src/test_config.c 8ab92facea822bd4fc6d0198487d7638072e1ec9 -F src/test_config.c 0dee90328e3dedf8ba002ee94b6a7e7ea7726fe4 ++F src/test_config.c f569bb9c62cb98ffc7968d7f557703197fb4027e F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc - F src/test_fs.c aab47ac456316502faa265daadf9ac832fea12b9 + F src/test_fs.c 993c7eab65bed6add4bb48cca29775e963f710cf F src/test_func.c 0d9c25956152adefee8881c6fadc8354793764d0 F src/test_hexio.c abfdecb6fa58c354623978efceb088ca18e379cd F src/test_init.c 66b33120ffe9cd853b5a905ec850d51151337b32 @@@ -408,19 -404,19 +408,19 @@@ F src/update.c 17332f9fe818cbc0444c36a8 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c e802e8e311a0d6c48cd1b3e89db164f6f0248d70 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 -F src/vdbe.c 4d75375fa8bf911aa76ab8383d6f7eea0dec0fda +F src/vdbe.c 5cd1221f8a9ee01574124986ac2d0ec97504ea50 F src/vdbe.h efb7a8c1459e31f3ea4377824c6a7e4cb5068637 F src/vdbeInt.h 75c2e82ee3357e9210c06474f8d9bdf12c81105d -F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca -F src/vdbeaux.c 864b9ec26adca0562a32fb8dee7b0b366304bfd9 +F src/vdbeapi.c b13f483b1375467c367de486edf2be05234e27bb - F src/vdbeaux.c e189aaf40871062c8451bbc28ce7a275b77979d0 ++F src/vdbeaux.c 192fba4a5adea9a2f1160ad172a86a354bd135ce F src/vdbeblob.c fdc4a81605ae7a35ae94a55bd768b66d6be16f15 F src/vdbemem.c fdd1578e47bea61390d472de53c565781d81e045 F src/vdbesort.c a7ec02da4494c59dfd071126dd3726be5a11459d F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 F src/vtab.c 2a8b44aa372c33f6154208e7a7f6c44254549806 F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb - F src/wal.c e93f9b7fdf5d2f6d11f0864200a8fe66ed30c8ec - F src/wal.h 6b3a67ecd7172dcc9f18fc9cd4d76dc4c2166e68 -F src/wal.c cb709aa42fc11b1ea92a00c8c7e6214de0995fa3 -F src/wal.h 907943dfdef10b583e81906679a347e0ec6f1b1b ++F src/wal.c 360acd6c7c35550f59ee2db3c92cbe6712d5f0b6 ++F src/wal.h 074df251e14dffb0ea9ce958a4328dff1a68c9d7 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c b18edbb9e5afabb77f4f27550c471c5c824e0fe7 F src/whereInt.h e20801d89e34de1912bb6a3babb30c390da27add @@@ -938,8 -933,8 +938,8 @@@ F test/pcache.test 9a04fa260cb47dd4fdc5 F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff F test/permutations.test 4ea119731c62d2f7d0aa86dd5b184cbb61ca411b -F test/pragma.test a44253f911e7d50127d4a08f927f47c861a4c772 +F test/pragma.test fc0c3c0ca53ad82b32c02db7000c1c6ba4449fce - F test/pragma2.test 00065068eeab2d15ea55465ec0f1e0a70e2c369e + F test/pragma2.test a9400a7289605280576098b97f5cde3f204075c0 F test/pragma3.test 6f849ccffeee7e496d2f2b5e74152306c0b8757c F test/printf.test b3ff34e73d59124140eaf89f7672e21bc2ca5fcc F test/printf2.test 0b61566dd1c0f0b802f59dffa228c5dc5aa6b054 @@@ -1413,7 -1410,8 +1415,7 @@@ F tool/vdbe_profile.tcl 246d0da094856d7 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f - P 2c9e5436bd9146f0d76eb58e75cb76109d074ff7 4f2bcff94c672312805be1400050a7026f93a9d7 - R 1c500c6cf448d5bf63a82e6dfd2aaad7 -P 96d3e99ffe59b5280b8b7fc269c94a72e15c345b 843c15a552657ca43ff200edb7da7566752d7941 -R 1e8a48e65f87836435758a04b37e3926 -T +closed 843c15a552657ca43ff200edb7da7566752d7941 ++P e1fb33c7d2bfd8ea115e667d7671a7529cd116aa 9b124a5a310aec0145495c9980bc0c1308fcca02 ++R c83274922244e0ad0a3abe3112b65b7b U drh - Z 126ab2bbf11a0fdb5ff4a3332b3c23bf -Z f796eddbea3599c0fdbed9d3e73688d6 ++Z d11cb9f98a9186557910b93b1d6aca34 diff --cc manifest.uuid index 4cd9ac6f7f,bcf7d5193b..54490d40e0 --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - e1fb33c7d2bfd8ea115e667d7671a7529cd116aa -9b124a5a310aec0145495c9980bc0c1308fcca02 ++7e7b24064510001ca4a0c8295fa7d0138bde8dae diff --cc src/main.c index 197d701eb8,5b2130511e..dd5b9523d2 --- a/src/main.c +++ b/src/main.c @@@ -3993,30 -3866,86 +3994,111 @@@ int sqlite3_db_readonly(sqlite3 *db, co pBt = sqlite3DbNameToBtree(db, zDbName); return pBt ? sqlite3BtreeIsReadonly(pBt) : -1; } - +#if (SQLITE_ENABLE_APPLE_SPI>0) && defined(__APPLE__) + +#include "sqlite3_private.h" + +/* +** Testing a file path for sqlite locks held by a process ID. +** Returns SQLITE_LOCKSTATE_ON if locks are present on path +** that would prevent writing to the database. +*/ +int _sqlite3_lockstate(const char *path, pid_t pid){ + sqlite3 *db = NULL; + + if( sqlite3_open_v2(path, &db, SQLITE_OPEN_READONLY, NULL) == SQLITE_OK ){ + LockstatePID lockstate = {pid, -1}; + sqlite3_file_control(db, NULL, SQLITE_FCNTL_LOCKSTATE_PID, &lockstate); + sqlite3_close(db); + int state = lockstate.state; + return state; + } + if( NULL!=db ){ + sqlite3_close(db); /* need to close even if open returns an error */ + } + return SQLITE_LOCKSTATE_ERROR; +} + +#endif /* SQLITE_ENABLE_APPLE_SPI */ + + #ifdef SQLITE_ENABLE_SNAPSHOT + /* + ** Obtain a snapshot handle for the snapshot of database zDb currently + ** being read by handle db. + */ + int sqlite3_snapshot_get( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot **ppSnapshot + ){ + int rc = SQLITE_ERROR; + #ifndef SQLITE_OMIT_WAL + int iDb; + + #ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + #endif + sqlite3_mutex_enter(db->mutex); + + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); + } + } + } + + sqlite3_mutex_leave(db->mutex); + #endif /* SQLITE_OMIT_WAL */ + return rc; + } + + /* + ** Open a read-transaction on the snapshot idendified by pSnapshot. + */ + int sqlite3_snapshot_open( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot *pSnapshot + ){ + int rc = SQLITE_ERROR; + #ifndef SQLITE_OMIT_WAL + + #ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + #endif + sqlite3_mutex_enter(db->mutex); + if( db->autoCommit==0 ){ + int iDb; + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInReadTrans(pBt) ){ + rc = sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), pSnapshot); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), 0); + } + } + } + } + + sqlite3_mutex_leave(db->mutex); + #endif /* SQLITE_OMIT_WAL */ + return rc; + } + + /* + ** Free a snapshot handle obtained from sqlite3_snapshot_get(). + */ + void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ + sqlite3_free(pSnapshot); + } + #endif /* SQLITE_ENABLE_SNAPSHOT */ -