Sqlite: Use FULL synchronous mode with non-WAL journal
authorChristian Kamm <mail@ckamm.de>
Wed, 23 Jan 2019 08:50:21 +0000 (09:50 +0100)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:48 +0000 (10:58 +0100)
According to the documentation DELETE+NORMAL isn't safe from corruption
on older file systems.

src/common/syncjournaldb.cpp

index b22e041cecf42b7efa3e88c337104e233acd3384..c5c6a459a40fad3ff92f8e46a6f6c8f9ccc8d9a7 100644 (file)
@@ -333,10 +333,18 @@ bool SyncJournalDb::checkConnect()
         qCInfo(lcDb) << "sqlite3 with temp_store =" << env_temp_store;
     }
 
-    pragma1.prepare("PRAGMA synchronous = 1;");
+    // With WAL journal the NORMAL sync mode is safe from corruption,
+    // otherwise use the standard FULL mode.
+    QByteArray synchronousMode = "FULL";
+    if (QString::fromUtf8(_journalMode).compare(QStringLiteral("wal"), Qt::CaseInsensitive) == 0)
+        synchronousMode = "NORMAL";
+    pragma1.prepare("PRAGMA synchronous = " + synchronousMode + ";");
     if (!pragma1.exec()) {
         return sqlFail("Set PRAGMA synchronous", pragma1);
+    } else {
+        qCInfo(lcDb) << "sqlite3 synchronous=" << synchronousMode;
     }
+
     pragma1.prepare("PRAGMA case_sensitive_like = ON;");
     if (!pragma1.exec()) {
         return sqlFail("Set PRAGMA case_sensitivity", pragma1);