-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
- C Merge\sin\sall\schanges\sto\sthe\strunk\sthrough\sversion\s3.7.4rc3.
- D 2010-12-07T15:49:03
-C SQLite\sversion\s3.7.5\srelease\scandidate\s1
-D 2011-01-27T14:35:01.967
++C Pull\sin\sall\sthe\schanges\sfrom\strunk\sup\sthrough\sthe\sversion\s3.7.5\s\nrelease\scandidate\s1.
++D 2011-01-27T18:48:02.799
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
- F Makefile.in dec697a7eb6ee9d6c04f77f4e46b1aff020d2662
-F Makefile.in de6498556d536ae60bb8bb10e8c1ba011448658c
++F Makefile.in 0df5f50f0d224a6265a2922f8922cda77b02c89a
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F Makefile.vxworks c85ec1d8597fe2f7bc225af12ac1666e21379151
F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
F src/expr.c 1810f3056b11de99cc10e24629edf00e5fbd3a75
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
F src/fkey.c 17950a28f28b23e8ad3feaac5fc88c324d2f600a
- F src/func.c 3856c6899fa4a9cb2da7b00cf5796171d88e34ae
-F src/func.c cb41f614edc43b00bfeb030f9768e80eaff47edd
++F src/func.c 343c0bd8579d42ce80915c4f258638c1cebc26ea
F src/global.c 02335177cf6946fe5525c6f0755cf181140debf3
F src/hash.c 458488dcc159c301b8e7686280ab209f1fb915af
F src/hash.h 2894c932d84d9f892d4b4023a75e501f83050970
F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
F src/insert.c a4995747c062256582a90b4f87f716e11b067050
F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e
-F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
+F src/legacy.c 015826a958f690302d27e096a68d50b3657e4201
F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
F src/loadext.c 8af9fcc75708d60b88636ccba38b4a7b3c155c3e
- F src/main.c 657885e071f21e601abb727bf4794e55c0722df8
- F src/malloc.c 3d7284cd9346ab6e3945535761e68c23c6cf40ef
-F src/main.c 6653e46db7ecb5a7449d8a12900147192f748b97
++F src/main.c de8fd6a086591cfcdf155a315e607509c293fad0
+ F src/malloc.c 92d59a007d7a42857d4e9454aa25b6b703286be1
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
-F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206
+F src/mem1.c 46095d62b241466ef51970e592aa3a7a87e443e1
F src/mem2.c e307323e86b5da1853d7111b68fd6b84ad6f09cf
F src/mem3.c 9b237d911ba9904142a804be727cc6664873f8a3
F src/mem5.c 6fe00f46997bebb690397cb029719f711e7640e3
F src/os.c 22ac61d06e72a0dac900400147333b07b13d8e1d
F src/os.h 9dbed8c2b9c1f2f2ebabc09e49829d4777c26bf9
F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f
- F src/os_os2.c 72d0b2e562952a2464308c4ce5f7913ac10bef3e
- F src/os_unix.c 49f8334f45bd3f44970e9afd8a70e8dd0f8a2282
- F src/os_win.c 2f90f7bdec714fad51cd31b4ecad3cc1b4bb5aad
- F src/pager.c c0aca5c733c15a16fe158c3215d857841a4e5381
+ F src/os_os2.c 2e452c9f2ca507623ad351c33a8a8b27849b1863
-F src/os_unix.c 1be46a35bad4bec5171e4de88aaff817260eb378
++F src/os_unix.c 9b2e17514578abddb9b6577424de39577a3e48f0
+ F src/os_win.c 9abdcdd925416d854eabb0996c96debd92abfef5
+ F src/pager.c 37696d876b1c23aa95d8ad7e4afd72d8675984fa
F src/pager.h 0ea59db2a33bc6c2c02cae34de33367e1effdf76
F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58
F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa
F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050
- F src/pcache1.c e9578a3beac26f229ee558a4e16c863f2498185f
+ F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e
-F src/pragma.c 8a6cd3c787f882fa44f6490d2411fc26839ce8f3
-F src/prepare.c 395b3fab1b93f45b6aa194b23ebc201221c47b99
+F src/pragma.c 3ff495d7f9c51c58d33269dfb8d5bd9f82c3d566
- F src/prepare.c 7f225d1bf1670fdfb37c9c63b342e4206a252c29
- F src/printf.c 8ae5082dd38a1b5456030c3755ec3a392cd51506
++F src/prepare.c ce4af845101308f785087a7071758bc4449f25b2
+ F src/printf.c df2ff3bb5409e8958136933342c46464fbd017e7
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
F src/select.c 8a7ba246b0b4bb45df7fbc52681728a0e3deaaa7
- F src/shell.c 8517fc1f9c59ae4007e6cc8b9af91ab231ea2056
- F src/sqlite.h.in b7e8a4e4749cfae9c99e1fbe3f9f87763cbbf7a2
+ F src/shell.c 83c6f0cc5a79a081c7b9ddfe4f557b47e0bad976
+ F src/sqlite.h.in 76955fcd1c5371268ecc8afe0ce6c49ea750ae38
+F src/sqlite3_private.h 2a814d17913732831acf13e7e87860105a3416e4
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
- F src/sqliteInt.h b96d5ddb8b419a2ed7cf69a7778b53872d73e8a7
+ F src/sqliteInt.h 45926deaf59b1ce3f55d21d5f91a8cecb6a7eb4c
F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44
- F src/status.c 496913d4e8441195f6f2a75b1c95993a45b9b30b
+ F src/status.c 4997380fbb915426fef9e500b4872e79c99267fc
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
- F src/tclsqlite.c 77c5c4b8ac7b2d94ee480e1ad626fbd921d948e4
- F src/test1.c 665cd9008b5e491e69076e4c58f540d29393ca76
+ F src/tclsqlite.c 549859dc2c143f3deb6a92636a2d27973652c164
-F src/test1.c 771407a49ae199241f0efb7055634e4a1899c026
++F src/test1.c ffc41da99a715c662cad62920106ac8d9aaf32ef
F src/test2.c 80d323d11e909cf0eb1b6fbb4ac22276483bcf31
F src/test3.c 056093cfef69ff4227a6bdb9108564dc7f45e4bc
F src/test4.c 0528360b5025688002a5feb6be906ddce52eaaee
F src/test9.c bea1e8cf52aa93695487badedd6e1886c321ea60
F src/test_async.c 0612a752896fad42d55c3999a5122af10dcf22ad
F src/test_autoext.c 30e7bd98ab6d70a62bb9ba572e4c7df347fe645e
-F src/test_backup.c c129c91127e9b46e335715ae2e75756e25ba27de
+F src/test_backup.c 64fd6173ad99daade1227aa17c3ca0d18fa5e5fa
F src/test_btree.c 47cd771250f09cdc6e12dda5bc71bc0b3abc96e2
- F src/test_config.c c3ba770a9924181aeed1717efb724b5ff17ccf34
-F src/test_config.c 9f025a7f3686c94e82dc6d6bd3cbf0f89cd67487
++F src/test_config.c 4c093dae195323e9b9a5482d48a34ba912cefd8e
F src/test_demovfs.c 0aed671636735116fc872c5b03706fd5612488b5
F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc
F src/test_func.c 13b582345fb1185a93e46c53310fae8547dcce20
F src/utf.c 1baeeac91707a4df97ccc6141ec0f808278af685
F src/util.c ab1c92426494f499f42b9e307537b03e923d75c1
F src/vacuum.c 924bd1bcee2dfb05376f79845bd3b4cec7b54b2f
-F src/vdbe.c 5d310eaf1a4d8383602126fa82e01291ab7d3cf3
+F src/vdbe.c 624c618542806c2075588ee5d2bdf43d91e34c21
F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2
- F src/vdbeInt.h 1f2137b905969f4de0648256aeb73abdf88f9213
- F src/vdbeapi.c 09ebd299007972e9262dec825d8fc3baedf0d239
- F src/vdbeaux.c b810a66902ee40c71cdb9c64f43760da516c91df
+ F src/vdbeInt.h 6e6f28e9bccc6c703dca1372fd661c57b5c15fb0
-F src/vdbeapi.c 8e9324fd35eb70d0b5904bd1af40f2598744dc4d
++F src/vdbeapi.c 35553aa4e234c173858606665f28bafafea22ae1
+ F src/vdbeaux.c 33448d23b857654dd69ed2103611f5c733606f68
F src/vdbeblob.c 18955f0ee6b133cd08e1592010cb9a6b11e9984c
F src/vdbemem.c 411649a35686f54268ccabeda175322c4697f5a6
- F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2
+ F src/vdbetrace.c 3ba13bc32bdf16d2bdea523245fd16736bed67b5
F src/vtab.c b297e8fa656ab5e66244ab15680d68db0adbec30
- F src/wal.c f26b8d297bd11cb792e609917f9d4c6718ac8e0e
+ F src/wal.c dbca424f71678f663a286ab2a98f947af1d412a7
F src/wal.h c1aac6593a0b02b15dc625987e619edeab39292e
F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
- F src/where.c fa22d45b2577c77146f2e894d58011d472d64103
+ F src/where.c af069e6b53234118014dabfece96a9515b69d76b
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
F test/all.test 51756962d522e474338e9b2ebb26e7364d4aa125
F test/enc4.test 4b575ef09e0eff896e73bd24076f96c2aa6a42de
F test/eqp.test 69670e7919030f21de29fb99bf1d68f97aedcbdb
F test/eval.test bc269c365ba877554948441e91ad5373f9f91be3
-F test/exclusive.test 53e1841b422e554cecf0160f937c473d6d0e3062
+F test/exclusive.test 897074dc6706b0c4f3b1dc4580ffddffe2a79206
- F test/exclusive2.test 76e63c05349cb70d09d60b99d2ae625525ff5155
+ F test/exclusive2.test b65264c3e76e1db6c6eda15c02000a40743f6541
F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
F test/expr.test 620a636cf7b7d4e5834a0b9d83a4da372e24a7b7
-F test/fallocate.test 43dc34b8c24be6baffadc3b4401ee15710ce83c6
+F test/fallocate.test a9927b638567e2e776c112f54d701402a0e74023
F test/filectrl.test 97003734290887566e01dded09dc9e99cb937e9e
F test/filefmt.test f77c92141960b7933bc6691631d2ad62257ef40a
F test/fkey1.test 01c7de578e11747e720c2d9aeef27f239853c4da
F test/join6.test bf82cf3f979e9eade83ad0d056a66c5ed71d1901
F test/journal1.test 36f2d1bb9bf03f790f43fbdb439e44c0657fab19
F test/journal2.test 50a3604768494d4a337f194f0a9480e7c57dcb72
-F test/journal3.test ff175219be1b02d2f7e54297ad7e491b7533edb6
+F test/journal3.test 7cfbd86429305c96c9d985665320db5364764d96
F test/jrnlmode.test e3fe6c4a2c3213d285650dc8e33aab7eaaa5ce53
F test/jrnlmode2.test a19e28de1a6ec898067e46a122f1b71c9323bf00
- F test/jrnlmode3.test cfcdb12b90e640a23b92785a002d96c0624c8710
+ F test/jrnlmode3.test c6522b276ba315fd1416198de6fc1da9e72409fb
F test/keyword1.test a2400977a2e4fde43bf33754c2929fda34dbca05
F test/lastinsert.test 474d519c68cb79d07ecae56a763aa7f322c72f51
F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200
F test/lock2.test 5242d8ac4e2d59c403aebff606af449b455aceff
F test/lock3.test f271375930711ae044080f4fe6d6eda930870d00
F test/lock4.test c82268c031d39345d05efa672f80b025481b3ae5
-F test/lock5.test b2abb5e711bc59b0eae00f6c97a36ec9f458fada
-F test/lock6.test ad5b387a3a8096afd3c68a55b9535056431b0cf5
+F test/lock5.test d0d313f059ae5661726d3f197ba6ed8f69257d8e
+F test/lock6.test 83434ae8ca1d1c5e2eaf74d4e44aa24ab62b291c
F test/lock7.test 64006c84c1c616657e237c7ad6532b765611cf64
F test/lock_common.tcl d279887a0ab16cdb6d935c1203e64113c5a000e9
- F test/lookaside.test 382e7bc2fab23d902c8eafb1b9ed7ababfff75a6
+F test/lock_proxy.test 95be9c32d79be25cf643b4e41a0aa0e53aa21621
-F test/main.test 9d7bbfcc1b52c88ba7b2ba6554068ecf9939f252
+ F test/lookaside.test 93f07bac140c5bb1d49f3892d2684decafdc7af2
+F test/main.test 753e2b772c041bd8dbd17c7e4132b3981378eaab
F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9
F test/malloc.test 927e6c8668a1d48c23aa6189bda02aff5a1b83de
F test/malloc3.test 4128b1e6ffa506103b278ad97af89174f310c7ca
F test/mallocI.test a88c2b9627c8506bf4703d8397420043a786cdb6
F test/mallocJ.test b5d1839da331d96223e5f458856f8ffe1366f62e
F test/mallocK.test d79968641d1b70d88f6c01bdb9a7eb4a55582cc9
- F test/malloc_common.tcl 2c807f3ca596a1a41fc5d7131e12eed913f60824
-F test/malloc_common.tcl 660b82ab528521cc4a48ff6df05ca3b6a00d47c5
-F test/manydb.test b3d3bc4c25657e7f68d157f031eb4db7b3df0d3c
-F test/memdb.test 0825155b2290e900264daaaf0334b6dfe69ea498
++F test/malloc_common.tcl 4c63cf4e38cca5d1f21910e38a15ab78899678e8
+F test/manydb.test 7faa0df55bbab2b14c25f323801db336c4e7ce3a
+F test/memdb.test f773146f66ee2c635854a8264317f39a6cc3e18c
F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2
- F test/memsubsys1.test 6827c7d06d5d60eda7a23c8d0b75d6922bd539dc
-F test/memsubsys1.test 679db68394a5692791737b150852173b3e2fea10
++F test/memsubsys1.test 7abc5c90b20e25040e2c800e3d95703d59d843a2
F test/memsubsys2.test 72a731225997ad5e8df89fdbeae9224616b6aecc
F test/minmax.test 722d80816f7e096bf2c04f4111f1a6c1ba65453d
F test/minmax2.test 33504c01a03bd99226144e4b03f7631a274d66e0
F test/notnull.test cc7c78340328e6112a13c3e311a9ab3127114347
F test/null.test a8b09b8ed87852742343b33441a9240022108993
F test/openv2.test af02ed0a9cbc0d2a61b8f35171d4d117e588e4ec
- F test/pager1.test e066fb2e2dc1ac1cd9ef2b44a28ae3cc79a9150f
- F test/pager2.test 0fbb6b6dc40ce1fecfe758c555a748ad2e9beaa3
+ F test/pager1.test 7006a8b5dd3df1fe0d51d7da014333d7dc099778
+ F test/pager2.test 745b911dde3d1f24ae0870bd433dfa83d7c658c1
F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f
-F test/pagerfault.test 9de4d3e0c59970b4c6cb8dac511fa242f335d8a7
+F test/pagerfault.test bea066b9162e1ab6843c2c1524ebb0965715e956
F test/pagerfault2.test 1f79ea40d1133b2683a2f811b00f2399f7ec2401
F test/pageropt.test 8146bf448cf09e87bb1867c2217b921fb5857806
F test/pagesize.test 76aa9f23ecb0741a4ed9d2e16c5fa82671f28efb
- F test/pcache.test 4118a183908ecaed343a06fcef3ba82e87e0129d
+ F test/pcache.test 065aa286e722ab24f2e51792c1f093bf60656b16
F test/pcache2.test 0d85f2ab6963aee28c671d4c71bec038c00a1d16
F test/permutations.test c0ce0f3b741dd92a6d4c2671dbacba4b92dd81eb
-F test/pragma.test fdfc09067ea104a0c247a1a79d8093b56656f850
+F test/pragma.test 88048136eed6baa2097dd7ab5145d3288128ca70
F test/pragma2.test 5364893491b9231dd170e3459bfc2e2342658b47
F test/printf.test 05970cde31b1a9f54bd75af60597be75a5c54fea
F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301
F tool/mkkeywordhash.c d2e6b4a5965e23afb80fbe74bb54648cd371f309
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
-F tool/mksqlite3c.tcl e0db70c2c52b0e3d0867ca931229e5b90ffe7837
+F tool/mksqlite3c.tcl 136c838dba145ad65296522ff27cdd792657eaa0
- F tool/mksqlite3h.tcl 03b6ca938c833814923674d8a160e91fcedb4571
+ F tool/mksqlite3h.tcl d76c226a5e8e1f3b5f6593bcabe5e98b3b1ec9ff
F tool/mksqlite3internalh.tcl 7b43894e21bcb1bb39e11547ce7e38a063357e87
F tool/omittest.tcl 27d6f6e3b1e95aeb26a1c140e6eb57771c6d794a
F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
- P c8bc057c7def6bbbebd89ee52b582bad75fb0509 11c74c0dae0e302f248ec4af6dc8a9376203b034
- R f56fc98cc45db5c78ece2f3f120ef0e8
-P 6f2c72a0f6579db3f40c079436ca40e3e52bd6d9
-R 59a65e1de1a8ae7d9445e2c547dd8236
++P d2ccf7fc0673e875ff7b84cd37b89c65df4bec7f 35ac78f55159705af140b949ee33852aedd62816
++R 4156a032d04be89bfd81b2f0d3b7a3a1
U drh
- Z 2f1441de3189b083ad6152c4d3e98a30
-Z 98b20f33ccda8aca8fd5329534c7e6b1
++Z 3878aa782505f9e49d943ef2cef669a8
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
- iD8DBQFM/ldyoxKgR168RlERAlUOAJoCRDoVTFpbr6OE7/Ud5TIa2NWEOACeIlqf
- qmpiDDfSfUooUtaCFjP2Gzg=
- =y70I
-iD8DBQFNQYKZoxKgR168RlERAoZXAJwJ1Csq9EFTXieXNgpSf4QMSqUs5QCfcNG/
-DEbh0HvWPBsaT4iBPcr+lKE=
-=bDRk
++iD8DBQFNQb3moxKgR168RlERAqESAJ910BVGm3bFKLOAlkRsiysh65xHwQCeNSAx
++HeSBjjtzBA0KoGQfQkL0aKA=
++=epZr
-----END PGP SIGNATURE-----
return proxyFileControl(id,op,pArg);
}
#endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */
+#if (SQLITE_ENABLE_APPLE_SPI>0) && defined(__APPLE__)
+ case SQLITE_TRUNCATE_DATABASE: {
+ unixFile *pFile = (unixFile*)id;
+ int trc = SQLITE_OK;
+ int eFileLock = pFile->eFileLock;
+ int rc = SQLITE_OK;
+ char jPath[MAXPATHLEN+9];
+ size_t jLen;
+
+ if( eFileLock<SQLITE_LOCK_SHARED ){
+ rc = pFile->pMethod->xLock(id, SQLITE_LOCK_SHARED);
+ }
+ if( !rc && eFileLock<SQLITE_LOCK_EXCLUSIVE ){
+ rc = pFile->pMethod->xLock(id, SQLITE_LOCK_EXCLUSIVE);
+ }
+ if( rc ){
+ if( pFile->eFileLock > eFileLock ){
+ pFile->pMethod->xUnlock(id, eFileLock);
+ }
+ return rc;
+ }
+ rc = pFile->pMethod->xTruncate(id, ((pFile->fsFlags & SQLITE_FSFLAGS_IS_MSDOS) != 0) ? 1L : 0L);
+ if( !rc && (SQLITE_OK==getDbPathForUnixFile(pFile, jPath)) ){
+ jLen = strlcat(jPath, "-journal", MAXPATHLEN+9);
+ if( jLen < MAXPATHLEN+9 ){
+ int jfd = open(jPath, O_TRUNC);
+ if( (jfd == -1) ){
+ if ( errno!=ENOENT ){
+ perror(jPath);
+ }
+ } else {
+ fsync(jfd);
+ close(jfd);
+ }
+ }
+ }else{
+ trc=rc;
+ }
+ if( !trc ){
+ trc = pFile->pMethod->xSync(id, SQLITE_SYNC_FULL);
+ }
+ if( pFile->eFileLock > eFileLock ){
+ int unlockRC = pFile->pMethod->xUnlock(id, SQLITE_LOCK_SHARED);
+ if (!rc) rc = unlockRC;
+ }
+ if( pFile->eFileLock > eFileLock ){
+ int unlockRC = pFile->pMethod->xUnlock(id, SQLITE_LOCK_NONE);
+ if (!rc) rc = unlockRC;
+ }
+ if( trc ){
+ return trc;
+ }
+ return rc;
+ }
+
+ case SQLITE_REPLACE_DATABASE: {
+ unixFile *pFile = (unixFile*)id;
+ int trc = SQLITE_OK;
+ int eFileLock = pFile->eFileLock;
+ int rc = SQLITE_OK;
+ char jPath[MAXPATHLEN+9];
+ size_t jLen;
+ sqlite3 *srcdb = (sqlite3 *)pArg;
+ Btree *pSrcBtree = NULL;
+ int eSrcFileLock = SQLITE_LOCK_NONE;
+ int srcLockRC = -1;
+ sqlite3_file *src_file = NULL;
+ unixFile *pSrcFile = NULL;
+
+ if( !sqlite3SafetyCheckOk(srcdb) ){
+ return SQLITE_MISUSE;
+ }
+ if( eFileLock<SQLITE_LOCK_SHARED ){
+ rc = pFile->pMethod->xLock(id, SQLITE_LOCK_SHARED);
+ }
+ if( !rc && eFileLock<SQLITE_LOCK_EXCLUSIVE ){
+ rc = pFile->pMethod->xLock(id, SQLITE_LOCK_EXCLUSIVE);
+ }
+ if( !rc ){
+ /* get the src file descriptor adhering to the db struct access rules
+ ** this code is modeled after sqlite3_file_control() in main.c
+ */
+ sqlite3_mutex_enter(srcdb->mutex);
+ if( srcdb->nDb>0 ){
+ pSrcBtree = srcdb->aDb[0].pBt;
+ }
+ if( pSrcBtree ){
+ Pager *pSrcPager;
+ sqlite3BtreeEnter(pSrcBtree);
+ pSrcPager = sqlite3BtreePager(pSrcBtree);
+ assert( pSrcPager!=0 );
+ src_file = sqlite3PagerFile(pSrcPager);
+ assert( src_file!=0 );
+ if( src_file->pMethods ){
+ pSrcFile = (unixFile *)src_file;
+ eSrcFileLock = pSrcFile->eFileLock;
+ if( eSrcFileLock<SQLITE_LOCK_SHARED ){
+ rc = pSrcFile->pMethod->xLock(src_file, SQLITE_LOCK_SHARED);
+ srcLockRC = rc; /* SQLITE_OK means we need to unlock later */
+ } else if( eSrcFileLock==SQLITE_LOCK_EXCLUSIVE ){
+ /* if the src database has an exclusive lock, verify that the
+ ** it doesn't have a journal file with open transactions
+ */
+ if( getDbPathForUnixFile(pSrcFile, jPath) ){
+ rc = SQLITE_INTERNAL;
+ }else{
+ jLen = strlcat(jPath, "-journal", MAXPATHLEN+9);
+ if( jLen < MAXPATHLEN+9 ){
+ int jfd = open(jPath, O_RDONLY);
+ if( jfd==-1 ){
+ if( errno!=ENOENT ){
+ pFile->lastErrno = errno;
+ rc = SQLITE_IOERR;
+ }
+ }else{
+ /* if the journal exists ensure there's no pending
+ ** transaction by checking the journal header */
+ char magic[8];
+ ssize_t rlen = pread(jfd, magic, 8, 0);
+ if( rlen<0 ){
+ pFile->lastErrno = errno;
+ rc = SQLITE_IOERR;
+ }else if( rlen==8 ){
+ char test[8] = {'\0','\0','\0','\0','\0','\0','\0','\0'};
+ if( memcmp(magic,test,8) ){
+ rc = SQLITE_LOCKED;
+ }
+ }else if( rlen!=0 ){
+ rc = SQLITE_INTERNAL;
+ }
+ close(jfd);
+ }
+ }
+ }
+ }
+ }else{
+ rc = SQLITE_MISUSE;
+ }
+ if( rc ){
+ if( srcLockRC==SQLITE_OK ){
+ pSrcFile->pMethod->xUnlock(src_file, eSrcFileLock);
+ }
+ sqlite3BtreeLeave(pSrcBtree);
+ }
+ }
+ if( pSrcFile==NULL || (pSrcFile->h<0) ){
+ rc = SQLITE_INTERNAL;
+ sqlite3_mutex_leave(srcdb->mutex);
+ }
+ }
+ if( rc ){
+ /* unroll state changes and return error code */
+ if( pFile->eFileLock > eFileLock ){
+ pFile->pMethod->xUnlock(id, eFileLock);
+ }
+ return rc;
+ }else{
+ /* both databases are locked appropriately, copy file data
+ ** and then unroll the locks we added.
+ */
+ copyfile_state_t s;
+
+ s = copyfile_state_alloc();
+ if( fcopyfile(pSrcFile->h, pFile->h, s, COPYFILE_ALL) ){
+ switch(errno) {
+ case ENOMEM:
+ rc = SQLITE_NOMEM;
+ break;
+ default:
+ rc = SQLITE_INTERNAL;
+ }
+ }
+ copyfile_state_free(s);
+ if( srcLockRC==SQLITE_OK ){
+ pSrcFile->pMethod->xUnlock(src_file, eSrcFileLock);
+ }
+ sqlite3BtreeLeave(pSrcBtree);
+ sqlite3_mutex_leave(srcdb->mutex);
+ }
+
+ if( !rc && (SQLITE_OK==getDbPathForUnixFile(pFile, jPath)) ){
+ jLen = strlcat(jPath, "-journal", MAXPATHLEN+9);
+ if( jLen < MAXPATHLEN+9 ){
+ int jfd = open(jPath, O_TRUNC);
+ if( (jfd == -1) ){
+ if ( errno!=ENOENT ){
+ perror(jPath);
+ }
+ } else {
+ fsync(jfd);
+ close(jfd);
+ }
+ }
+ }else{
+ trc=rc;
+ }
+ if( !trc ){
+ trc = pFile->pMethod->xSync(id, SQLITE_SYNC_FULL);
+ }
+ if( pFile->eFileLock > eFileLock ){
+ int unlockRC = pFile->pMethod->xUnlock(id, SQLITE_LOCK_SHARED);
+ if (!rc) rc = unlockRC;
+ }
+ if( pFile->eFileLock > eFileLock ){
+ int unlockRC = pFile->pMethod->xUnlock(id, SQLITE_LOCK_NONE);
+ if (!rc) rc = unlockRC;
+ }
+ if( trc ){
+ return trc;
+ }
+ return rc;
+ }
+#endif /* (SQLITE_ENABLE_APPLE_SPI>0) && defined(__APPLE__) */
+ case SQLITE_FCNTL_SYNC_OMITTED: {
+ return SQLITE_OK; /* A no-op */
+ }
}
- return SQLITE_ERROR;
+ return SQLITE_NOTFOUND;
}
/*