From 843620ca3ce1649755732297babbbf1de46a1ad8 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Thu, 30 Jun 2016 22:20:32 +0100 Subject: [PATCH] Caches: method to save values given a list of keys. --- src/blackmisc/settingscache.cpp | 5 +++++ src/blackmisc/settingscache.h | 3 +++ src/blackmisc/valuecache.cpp | 30 ++++++++++++++++++++++++++++++ src/blackmisc/valuecache.h | 12 ++++++++++++ 4 files changed, 50 insertions(+) diff --git a/src/blackmisc/settingscache.cpp b/src/blackmisc/settingscache.cpp index 5f8c00258..d3dd4b387 100644 --- a/src/blackmisc/settingscache.cpp +++ b/src/blackmisc/settingscache.cpp @@ -38,6 +38,11 @@ namespace BlackMisc return saveToFiles(persistentStore(), keyPrefix); } + BlackMisc::CStatusMessage CSettingsCache::saveToStore(const QStringList &keys) + { + return saveToFiles(persistentStore(), keys); + } + void CSettingsCache::enableLocalSave() { connect(CSettingsCache::instance(), &CSettingsCache::valuesSaveRequested, CSettingsCache::instance(), &CSettingsCache::saveToStoreByPacket); diff --git a/src/blackmisc/settingscache.h b/src/blackmisc/settingscache.h index f4706bf8f..972f9dec5 100644 --- a/src/blackmisc/settingscache.h +++ b/src/blackmisc/settingscache.h @@ -40,6 +40,9 @@ namespace BlackMisc //! Save core settings to disk. BlackMisc::CStatusMessage saveToStore(const QString &keyPrefix = {}); + //! Save core settings to disk. + BlackMisc::CStatusMessage saveToStore(const QStringList &keys); + //! Connects signal CValueCache::valuesSaveRequested to a private slot that saves the values. //! In a dbus distributed scenario, only call this method in the core process. void enableLocalSave(); diff --git a/src/blackmisc/valuecache.cpp b/src/blackmisc/valuecache.cpp index 93f788c50..8cb475dac 100644 --- a/src/blackmisc/valuecache.cpp +++ b/src/blackmisc/valuecache.cpp @@ -181,6 +181,18 @@ namespace BlackMisc return map; } + CVariantMap CValueCache::getAllValues(const QStringList &keys) const + { + QMutexLocker lock(&m_mutex); + CVariantMap map; + for (const auto &key : keys) + { + auto it = m_elements.constFind(key); + if (it != m_elements.cend()) { map.insert(key, (*it)->m_value); } + } + return map; + } + CValueCachePacket CValueCache::getAllValuesWithTimestamps(const QString &keyPrefix) const { QMutexLocker lock(&m_mutex); @@ -299,6 +311,15 @@ namespace BlackMisc return status; } + CStatusMessage CValueCache::saveToFiles(const QString &dir, const QStringList &keys) + { + QMutexLocker lock(&m_mutex); + auto values = getAllValues(keys); + auto status = saveToFiles(dir, values); + if (status.isSuccess()) { markAllAsSaved(keys); } + return status; + } + CStatusMessage CValueCache::saveToFiles(const QString &dir, const CVariantMap &values, const QString &keysMessage) const { QMap namespaces; @@ -398,6 +419,15 @@ namespace BlackMisc } } + void CValueCache::markAllAsSaved(const QStringList &keys) + { + QMutexLocker lock(&m_mutex); + for (const auto &key : keys) + { + getElement(key).m_saved = true; + } + } + QString CValueCache::filenameForKey(const QString &key) { return key.section('/', 0, 0) + ".json"; diff --git a/src/blackmisc/valuecache.h b/src/blackmisc/valuecache.h index c7d00cffa..c00e268cc 100644 --- a/src/blackmisc/valuecache.h +++ b/src/blackmisc/valuecache.h @@ -158,6 +158,10 @@ namespace BlackMisc //! \threadsafe BlackMisc::CVariantMap getAllValues(const QString &keyPrefix = {}) const; + //! Return map containing all given values in the cache. + //! \threadsafe + BlackMisc::CVariantMap getAllValues(const QStringList &keys) const; + //! Return map containing all values in the cache, and timestamps when they were modified. //! \threadsafe BlackMisc::CValueCachePacket getAllValuesWithTimestamps(const QString &keyPrefix = {}) const; @@ -186,6 +190,10 @@ namespace BlackMisc //! \threadsafe CStatusMessage saveToFiles(const QString &directory, const QString &keyPrefix = {}); + //! Save values to Json files in a given directory. + //! \threadsafe + CStatusMessage saveToFiles(const QString &directory, const QStringList &keys); + //! Load all values from Json files in a given directory. //! Values already in the cache will remain in the cache unless they are overwritten. //! \threadsafe @@ -256,6 +264,10 @@ namespace BlackMisc //! \threadsafe void markAllAsSaved(const QString &keyPrefix); + //! Mark all values with given keys as having been saved. + //! \threadsafe + void markAllAsSaved(const QStringList &keys); + //! Mutex protecting operations which are critical on m_elements. mutable QMutex m_mutex { QMutex::Recursive };