]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Changes to make pragma synchronous sticky when SQLITE_DEFAULT_WAL_SAFETYLEVEL is...
authoradam <adam@noemail.net>
Sat, 25 Jun 2011 21:43:15 +0000 (21:43 +0000)
committeradam <adam@noemail.net>
Sat, 25 Jun 2011 21:43:15 +0000 (21:43 +0000)
FossilOrigin-Name: c6158b254fabd02a3d58b1a047a3c5fa979b41a8

manifest
manifest.uuid
src/btree.c
src/pragma.c
src/sqliteInt.h

index d5c4c7ec0ae1e4cb02fb1b4270d5a9204d1e9f22..3708a4362ebb35505d0d30353ec5ef4dd54246ba 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\stest\scases\sso\sthat\sthey\swork\swith\sSQLITE_DEFAULT_WAL_SAFETYLEVEL\sdefined.
-D 2011-06-25T16:35:41.980
+C Changes\sto\smake\spragma\ssynchronous\ssticky\swhen\sSQLITE_DEFAULT_WAL_SAFETYLEVEL\sis\sused
+D 2011-06-25T21:43:15.946
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 8410b02448997eb43bdf0ffa482c9bc2d2624e45
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -127,7 +127,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
 F src/backup.c 986c15232757f2873dff35ee3b35cbf935fc573c
 F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef
 F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
-F src/btree.c 43581d03fc1b0fc8afa7790a26bf680161394d13
+F src/btree.c e09181860cc8b32ac3c767b0747a5ee66104817b
 F src/btree.h f5d775cd6cfc7ac32a2535b70e8d2af48ef5f2ce
 F src/btreeInt.h 67978c014fa4f7cc874032dd3aacadd8db656bc3
 F src/build.c 5a428625d21ad409514afb40ad083bee25dd957a
@@ -176,7 +176,7 @@ F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58
 F src/pcache.c 49e718c095810c6b3334e3a6d89970aceaddefce
 F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050
 F src/pcache1.c 912bd5687d6df344698d8e69560f347b6e21c18a
-F src/pragma.c a1010255cd602e2d0cd7fa6f63f9de338ce8ac78
+F src/pragma.c 66661dbe8428dd3215bd4c8f8a43dd3326e0bf6f
 F src/prepare.c 9d7403fe75fefa134351b41400d09ba1b189134b
 F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1
 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
@@ -187,7 +187,7 @@ F src/shell.c 0e0173b3e79d956368013e759f084caa7995ecb1
 F src/sqlite.h.in dc26f18c71a30680b163317aa3d068e3aa02980c
 F src/sqlite3_private.h 1d18557420cb0cc51ff31ec0a3fcce11e5cd6f5a
 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
-F src/sqliteInt.h 7b72f7c6929757c0678d94524dbc7e7e3d6dc398
+F src/sqliteInt.h 7240bba17d8f49a667d67bdbbe4cdf898536fc61
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf
 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -954,7 +954,7 @@ F tool/symbols.sh bc2a3709940d47c8ac8e0a1fdf17ec801f015a00
 F tool/tostr.awk 11760e1b94a5d3dcd42378f3cc18544c06cfa576
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings.sh 347d974d143cf132f953b565fbc03026f19fcb4d
-P 97729542d53a407de1bdfeb5fa6d80bbdb4813b6
-R b0d94ba47dd23ef5ad400f41b1e77ddd
-U dan
-Z 21e66d4037d33761682c45f3b2e0d19c
+P 8f8b373eed7052e6e93c1805fc1effcf1db09366
+R e151aa11e88480c804b5ef43a2ab643c
+U adam
+Z 3111cbbb811aa7ac12c37845c0ffea17
index 9cf83a0b420c47d9a405dbb1a93c54332a7045bc..54617e53b2a303a6b35c6a9d4c46f8d958776051 100644 (file)
@@ -1 +1 @@
-8f8b373eed7052e6e93c1805fc1effcf1db09366
\ No newline at end of file
+c6158b254fabd02a3d58b1a047a3c5fa979b41a8
\ No newline at end of file
index a63759bfb9f93d691416b6fc502c6d95e8cc5291..256221daee9871746b03343ba487d8deff0c06c5 100644 (file)
@@ -2362,11 +2362,14 @@ static int lockBtree(BtShared *pBt){
           int iDb;
           sqlite3 *db = pBt->db;
           Db *aDb = db->aDb;
+          u8 level = 0;
           for(iDb=0; iDb<db->nDb; iDb++){
             if( aDb[iDb].pBt && aDb[iDb].pBt->pBt==pBt ) break;
           }
           assert( iDb<db->nDb );
-          if( aDb[iDb].safety_level != SQLITE_DEFAULT_WAL_SAFETYLEVEL) {
+          level = db->aDb[iDb].safety_level;
+          if( !SQLITE_DbSafetyLevelIsFixed(level) && 
+             (SQLITE_DbSafetyLevelValue(level) != SQLITE_DEFAULT_WAL_SAFETYLEVEL) ){
             aDb[iDb].safety_level = SQLITE_DEFAULT_WAL_SAFETYLEVEL;
             sqlite3PagerSetSafetyLevel(pBt->pPager, SQLITE_DEFAULT_WAL_SAFETYLEVEL, 
                                        (db->flags&SQLITE_FullFSync)!=0,
index a4eb40449914e775c7765146b55362dd422430d1..86ce1c86c8c52ae02d6aa672b565ddf4b7f27634 100644 (file)
@@ -565,11 +565,17 @@ void sqlite3Pragma(
       pId2->n = 1;
     }
 #ifdef SQLITE_DEFAULT_WAL_SAFETYLEVEL
-    if (eMode == PAGER_JOURNALMODE_WAL) {
-      /* when entering wal mode, immediately switch the safety_level
-       * so that a query to pragma synchronous returns the correct value
-       */
-      pDb->safety_level = SQLITE_DEFAULT_WAL_SAFETYLEVEL;
+    if( ! SQLITE_DbSafetyLevelIsFixed(pDb->safety_level) ){
+      if( eMode == PAGER_JOURNALMODE_WAL ){
+        /* when entering wal mode, immediately switch the safety_level
+        ** so that a query to pragma synchronous returns the correct value */
+      
+        pDb->safety_level = SQLITE_DEFAULT_WAL_SAFETYLEVEL;
+      }else{
+        /* If the user hasn't overridden the synchronous setting, use the 
+        ** default for non-wal databases */
+        pDb->safety_level = 3;
+      }
     }
 #endif /* SQLITE_DEFAULT_WAL_SAFETYLEVEL */
     for(ii=db->nDb-1; ii>=0; ii--){
@@ -841,14 +847,16 @@ void sqlite3Pragma(
   if( sqlite3StrICmp(zLeft,"synchronous")==0 ){
     if( sqlite3ReadSchema(pParse) ) goto pragma_out;
     if( !zRight ){
-      i64 safetyLevel = pDb->safety_level-1;
+      u8 level = pDb->safety_level;
+      i64 safetyLevel = (i64)(SQLITE_DbSafetyLevelValue(level)-1);
       returnSingleInt(pParse, "synchronous", &safetyLevel);
     }else{
       if( !db->autoCommit ){
         sqlite3ErrorMsg(pParse, 
             "Safety level may not be changed inside a transaction");
       }else{
-        pDb->safety_level = getSafetyLevel(zRight)+1;
+        u8 level = getSafetyLevel(zRight)+1;
+        pDb->safety_level = (level | SQLITE_SAFETYLEVEL_FIXED);
       }
     }
   }else
@@ -1527,7 +1535,7 @@ void sqlite3Pragma(
   */
 #ifndef SQLITE_OMIT_PAGER_PRAGMAS
   if( db->autoCommit ){
-    sqlite3BtreeSetSafetyLevel(pDb->pBt, pDb->safety_level,
+    sqlite3BtreeSetSafetyLevel(pDb->pBt, SQLITE_DbSafetyLevelValue(pDb->safety_level),
                (db->flags&SQLITE_FullFSync)!=0,
                (db->flags&SQLITE_CkptFullFSync)!=0);
   }
index 09f64b79396bda257705393cd8d05961ba58a15b..051b95e10c53666fcfdf4eb5a2b09d00cf6a10dc 100644 (file)
@@ -651,6 +651,16 @@ typedef struct WhereLevel WhereLevel;
 #include "os.h"
 #include "mutex.h"
 
+/* When using a default wal safety level, the safety level should only 
+** change with the journal mode if the user hasn't manually specified 
+** pragma synchronous, if they have the defaults shouldn't be applied.
+** The SQLITE_SAFETYLEVEL_FIXED value is ORed into the Db->safety_level
+** field when the user has specified a synchronous setting via pragma.
+*/
+#define SQLITE_SAFETYLEVEL_FIXED 0x10
+#define SQLITE_SAFETYLEVEL_VALUE_MASK 0x03
+#define SQLITE_DbSafetyLevelValue(level) (level&SQLITE_SAFETYLEVEL_VALUE_MASK)
+#define SQLITE_DbSafetyLevelIsFixed(level) (level&SQLITE_SAFETYLEVEL_FIXED)
 
 /*
 ** Each database file to be accessed by the system is an instance