Browse Source

Merge pull request #11208 from Chocobo1/storage

Improve SettingsStorage behavior
adaptive-webui-19844
Mike Tzou 5 years ago committed by GitHub
parent
commit
b144d3b797
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 51
      src/base/settingsstorage.cpp
  2. 3
      src/base/settingvalue.h

51
src/base/settingsstorage.cpp

@ -51,16 +51,16 @@ namespace
{ {
} }
QVariantHash read(); QVariantHash read() const;
bool write(const QVariantHash &data); bool write(const QVariantHash &data) const;
private: private:
// we return actual file names used by QSettings because // we return actual file names used by QSettings because
// there is no other way to get that name except // there is no other way to get that name except
// actually create a QSettings object. // actually create a QSettings object.
// if serialization operation was not successful we return empty string // if serialization operation was not successful we return empty string
QString deserialize(const QString &name, QVariantHash &data); QString deserialize(const QString &name, QVariantHash &data) const;
QString serialize(const QString &name, const QVariantHash &data); QString serialize(const QString &name, const QVariantHash &data) const;
const QString m_name; const QString m_name;
}; };
@ -186,33 +186,35 @@ SettingsStorage *SettingsStorage::instance()
bool SettingsStorage::save() bool SettingsStorage::save()
{ {
if (!m_dirty) return false; // Obtaining the lock is expensive, let's check early if (!m_dirty) return true; // Obtaining the lock is expensive, let's check early
QWriteLocker locker(&m_lock); const QWriteLocker locker(&m_lock); // to guard for `m_dirty`
if (!m_dirty) return false; // something might have changed while we were getting the lock if (!m_dirty) return true; // something might have changed while we were getting the lock
TransactionalSettings settings(QLatin1String("qBittorrent")); const TransactionalSettings settings(QLatin1String("qBittorrent"));
if (settings.write(m_data)) { if (!settings.write(m_data)) {
m_dirty = false; m_timer.start();
return true; return false;
} }
m_timer.start(); m_dirty = false;
return false; return true;
} }
QVariant SettingsStorage::loadValue(const QString &key, const QVariant &defaultValue) const QVariant SettingsStorage::loadValue(const QString &key, const QVariant &defaultValue) const
{ {
QReadLocker locker(&m_lock); const QReadLocker locker(&m_lock);
return m_data.value(mapKey(key), defaultValue); return m_data.value(mapKey(key), defaultValue);
} }
void SettingsStorage::storeValue(const QString &key, const QVariant &value) void SettingsStorage::storeValue(const QString &key, const QVariant &value)
{ {
const QString realKey = mapKey(key); const QString realKey = mapKey(key);
QWriteLocker locker(&m_lock); const QWriteLocker locker(&m_lock);
if (m_data.value(realKey) != value) {
QVariant &currentValue = m_data[realKey];
if (currentValue != value) {
m_dirty = true; m_dirty = true;
m_data.insert(realKey, value); currentValue = value;
m_timer.start(); m_timer.start();
} }
} }
@ -220,15 +222,14 @@ void SettingsStorage::storeValue(const QString &key, const QVariant &value)
void SettingsStorage::removeValue(const QString &key) void SettingsStorage::removeValue(const QString &key)
{ {
const QString realKey = mapKey(key); const QString realKey = mapKey(key);
QWriteLocker locker(&m_lock); const QWriteLocker locker(&m_lock);
if (m_data.contains(realKey)) { if (m_data.remove(realKey) > 0) {
m_dirty = true; m_dirty = true;
m_data.remove(realKey);
m_timer.start(); m_timer.start();
} }
} }
QVariantHash TransactionalSettings::read() QVariantHash TransactionalSettings::read() const
{ {
QVariantHash res; QVariantHash res;
@ -256,7 +257,7 @@ QVariantHash TransactionalSettings::read()
return res; return res;
} }
bool TransactionalSettings::write(const QVariantHash &data) bool TransactionalSettings::write(const QVariantHash &data) const
{ {
// QSettings deletes the file before writing it out. This can result in problems // QSettings deletes the file before writing it out. This can result in problems
// if the disk is full or a power outage occurs. Those events might occur // if the disk is full or a power outage occurs. Those events might occur
@ -277,7 +278,7 @@ bool TransactionalSettings::write(const QVariantHash &data)
return QFile::rename(newPath, finalPath); return QFile::rename(newPath, finalPath);
} }
QString TransactionalSettings::deserialize(const QString &name, QVariantHash &data) QString TransactionalSettings::deserialize(const QString &name, QVariantHash &data) const
{ {
SettingsPtr settings = Profile::instance().applicationSettings(name); SettingsPtr settings = Profile::instance().applicationSettings(name);
@ -293,7 +294,7 @@ QString TransactionalSettings::deserialize(const QString &name, QVariantHash &da
return settings->fileName(); return settings->fileName();
} }
QString TransactionalSettings::serialize(const QString &name, const QVariantHash &data) QString TransactionalSettings::serialize(const QString &name, const QVariantHash &data) const
{ {
SettingsPtr settings = Profile::instance().applicationSettings(name); SettingsPtr settings = Profile::instance().applicationSettings(name);
for (auto i = data.begin(); i != data.end(); ++i) for (auto i = data.begin(); i != data.end(); ++i)

3
src/base/settingvalue.h

@ -68,6 +68,9 @@ public:
CachedSettingValue<T> &operator=(const T &newValue) CachedSettingValue<T> &operator=(const T &newValue)
{ {
if (m_value == newValue)
return *this;
m_value = newValue; m_value = newValue;
storeValue(m_value); storeValue(m_value);
return *this; return *this;

Loading…
Cancel
Save