Save Core settings synchronously and report errors.
authorChristian Schwarz <me@cschwarz.com>
Sat, 18 Mar 2017 19:05:43 +0000 (20:05 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Thu, 13 Apr 2017 20:20:55 +0000 (22:20 +0200)
Resolves GH-281.

src/common/settings.cpp
src/common/settings.h
src/core/core.cpp
src/core/core.h

index c3713d9..cdb152c 100644 (file)
@@ -120,6 +120,17 @@ void Settings::setVersionMinor(const uint versionMinor)
     s.setValue("Config/VersionMinor", versionMinor);
 }
 
+bool Settings::sync() {
+    create_qsettings;
+    s.sync();
+    switch (s.status()) {
+        case QSettings::NoError:
+            return true;
+        default:
+            return false;
+    }
+}
+
 bool Settings::isWritable() {
     create_qsettings;
     return s.isWritable();
index 2193864..72dec75 100644 (file)
@@ -83,6 +83,13 @@ public:
      */
     virtual void setVersionMinor(const uint versionMinor);
 
+    /**
+     * Persist unsaved changes to permanent storage
+     *
+     * @return true if succeeded, false otherwise
+     */
+    bool sync();
+
     /**
      * Check if the configuration storage is writable.
      *
index dadd70a..ad9eab8 100644 (file)
@@ -299,7 +299,9 @@ QString Core::setupCore(const QString &adminUser, const QString &adminPassword,
         return tr("Could not setup storage!");
     }
 
-    saveBackendSettings(backend, setupData);
+    if (!saveBackendSettings(backend, setupData)) {
+        return tr("Could not save backend settings, probably a permission problem.");
+    }
 
     quInfo() << qPrintable(tr("Creating admin user..."));
     _storage->addUser(adminUser, adminPassword);
@@ -705,7 +707,9 @@ bool Core::selectBackend(const QString &backend)
     Storage::State storageState = storage->init(settings);
     switch (storageState) {
     case Storage::IsReady:
-        saveBackendSettings(backend, settings);
+        if (!saveBackendSettings(backend, settings)) {
+            qCritical() << qPrintable(QString("Could not save backend settings, probably a permission problem."));
+        }
         qWarning() << "Switched backend to:" << qPrintable(backend);
         qWarning() << "Backend already initialized. Skipping Migration";
         return true;
@@ -723,7 +727,9 @@ bool Core::selectBackend(const QString &backend)
             return false;
         }
 
-        saveBackendSettings(backend, settings);
+        if (!saveBackendSettings(backend, settings)) {
+            qCritical() << qPrintable(QString("Could not save backend settings, probably a permission problem."));
+        }
         qWarning() << "Switched backend to:" << qPrintable(backend);
         break;
     }
@@ -739,7 +745,10 @@ bool Core::selectBackend(const QString &backend)
         storage = 0;
         if (reader->migrateTo(writer)) {
             qDebug() << "Migration finished!";
-            saveBackendSettings(backend, settings);
+            if (!saveBackendSettings(backend, settings)) {
+                qCritical() << qPrintable(QString("Could not save backend settings, probably a permission problem."));
+                return false;
+            }
             return true;
         }
         return false;
@@ -886,12 +895,14 @@ AbstractSqlMigrationWriter *Core::getMigrationWriter(Storage *storage)
 }
 
 
-void Core::saveBackendSettings(const QString &backend, const QVariantMap &settings)
+bool Core::saveBackendSettings(const QString &backend, const QVariantMap &settings)
 {
     QVariantMap dbsettings;
     dbsettings["Backend"] = backend;
     dbsettings["ConnectionProperties"] = settings;
-    CoreSettings().setStorageSettings(dbsettings);
+    CoreSettings s = CoreSettings();
+    s.setStorageSettings(dbsettings);
+    return s.sync();
 }
 
 
index 88b398a..f974645 100644 (file)
@@ -573,7 +573,7 @@ private:
     void unregisterStorageBackend(Storage *);
     bool selectBackend(const QString &backend);
     bool createUser();
-    void saveBackendSettings(const QString &backend, const QVariantMap &settings);
+    bool saveBackendSettings(const QString &backend, const QVariantMap &settings);
     QVariantMap promptForSettings(const Storage *storage);
 
 private: