d->db.driver()->subscribeToNotification("new_pending_request");
d->db.driver()->subscribeToNotification("new_pending_mylist_update");
d->db.driver()->subscribeToNotification("rename_data_changed");
+ d->db.driver()->subscribeToNotification("config_changed");
}
bool Database::exec(QSqlQuery &query)
{
emit renameDataChanged();
}
+ else if (notification == "config_changed")
+ {
+ emit configChanged();
+ }
}
Settings::Settings(Database *db, QObject *parent) :
QObject(parent)
{
- this->db = db;
+ this->db = 0;
+ setDatabase(db);
}
Database *Settings::database() const
void Settings::setDatabase(Database *db)
{
+ if (this->db == db)
+ return;
+
+ if (this->db)
+ disconnect(this->db, SIGNAL(configChanged()), this, SLOT(settingsChangedInDatabase()));
+
+ if (!db)
+ return;
+
this->db = db;
+ connect(db, SIGNAL(configChanged()), this, SLOT(settingsChangedInDatabase()));
}
QVariant Settings::get(const QString &key) const
{
- if (!settings.contains(key)) readSettings();
+ if (stagedSettings.contains(key))
+ return stagedSettings.value(key);
+
+ if (!settings.contains(key))
+ readSettings();
+
return settings.value(key);
}
void Settings::set(const QString &key, const QVariant &value)
{
- settings[key] = value;
- db->setConfig(key, value);
+ stagedSettings[key] = value;
+}
+
+void Settings::commit()
+{
+ db->transaction();
+ for (auto i = stagedSettings.constBegin(); i != stagedSettings.constEnd(); ++i)
+ {
+ db->setConfig(i.key(), i.value());
+ settings[i.key()] = i.value();
+ }
+ db->commit();
+ stagedSettings.clear();
+ emit settingsChanged();
+}
+
+void Settings::rollback()
+{
+ stagedSettings.clear();
}
void Settings::settingsChangedInDatabase()
{
settings.clear();
+ emit settingsChanged();
}
void Settings::readSettings() const
public slots:
QVariant get(const QString &key) const;
void set(const QString &key, const QVariant &value);
+
+ void commit();
+ void rollback();
void settingsChangedInDatabase();
Database *db;
mutable QVariantMap settings;
+ QVariantMap stagedSettings;
};
} // namespace LocalMyList