diff --git a/src/blackcore/datacache.cpp b/src/blackcore/datacache.cpp index f0c7d038d..510aa0fee 100644 --- a/src/blackcore/datacache.cpp +++ b/src/blackcore/datacache.cpp @@ -46,6 +46,16 @@ namespace BlackCore return dir; } + QString CDataCache::filenameForKey(const QString &key) + { + return persistentStore() + "/" + CValueCache::filenameForKey(key); + } + + QStringList CDataCache::enumerateStore() const + { + return enumerateFiles(persistentStore()); + } + QString lockFileError(const QLockFile &lock) { switch (lock.error()) diff --git a/src/blackcore/datacache.h b/src/blackcore/datacache.h index 7d3389bc7..3318580ad 100644 --- a/src/blackcore/datacache.h +++ b/src/blackcore/datacache.h @@ -34,6 +34,12 @@ namespace BlackCore //! The directory where core data are stored. static const QString &persistentStore(); + //! Return the filename where the value with the given key may be stored. + static QString filenameForKey(const QString &key); + + //! Return all files where data may be stored. + QStringList enumerateStore() const; + private: CDataCache(); @@ -75,6 +81,9 @@ namespace BlackCore //! Reset the data to its default value. void setDefault() { this->set(Trait::defaultValue()); } + + //! Return the file that is used for persistence for this value. + QString getFilename() const { return CDataCache::filenameForKey(this->getKey()); } }; /*! diff --git a/src/blackcore/settingscache.cpp b/src/blackcore/settingscache.cpp index e376cbcb2..f399063fa 100644 --- a/src/blackcore/settingscache.cpp +++ b/src/blackcore/settingscache.cpp @@ -39,4 +39,14 @@ namespace BlackCore return loadFromFiles(persistentStore()); } + QString CSettingsCache::filenameForKey(const QString &key) + { + return persistentStore() + "/" + CValueCache::filenameForKey(key); + } + + QStringList CSettingsCache::enumerateStore() const + { + return enumerateFiles(persistentStore()); + } + } diff --git a/src/blackcore/settingscache.h b/src/blackcore/settingscache.h index 5abfbfaf4..49b64e951 100644 --- a/src/blackcore/settingscache.h +++ b/src/blackcore/settingscache.h @@ -36,6 +36,12 @@ namespace BlackCore //! Load core settings from disk. BlackMisc::CStatusMessage loadFromStore(); + //! Return the filename where the value with the given key may be stored. + static QString filenameForKey(const QString &key); + + //! Return all files where settings may be stored. + QStringList enumerateStore() const; + private: CSettingsCache(); }; @@ -63,6 +69,9 @@ namespace BlackCore //! Reset the setting to its default value. void setDefault() { this->set(Trait::defaultValue()); } + + //! Return the file that is used for persistence for this value. + QString getFilename() const { return CSettingsCache::filenameForKey(this->getKey()); } }; /*! diff --git a/src/blackmisc/valuecache.cpp b/src/blackmisc/valuecache.cpp index 5d1713151..5d8281f1b 100644 --- a/src/blackmisc/valuecache.cpp +++ b/src/blackmisc/valuecache.cpp @@ -278,6 +278,19 @@ namespace BlackMisc return {}; } + QString CValueCache::filenameForKey(const QString &key) + { + return key.section('/', 0, 0) + ".json"; + } + + QStringList CValueCache::enumerateFiles(const QString &dir) const + { + auto values = getAllValues(); + QSet files; + for (auto it = values.begin(); it != values.end(); ++it) { files.insert(dir + "/" + filenameForKey(it.key())); } + return files.toList(); + } + void CValueCache::clearAllValues(const QString &keyPrefix) { QMutexLocker lock(&m_mutex); @@ -393,6 +406,11 @@ namespace BlackMisc return error; } + const QString &CValuePage::getKey(const Element &element) const + { + return element.m_key; + } + qint64 CValuePage::getTimestamp(const Element &element) const { return element.m_timestamp; diff --git a/src/blackmisc/valuecache.h b/src/blackmisc/valuecache.h index 3a3317112..bd84b75e8 100644 --- a/src/blackmisc/valuecache.h +++ b/src/blackmisc/valuecache.h @@ -121,6 +121,16 @@ namespace BlackMisc //! \threadsafe CStatusMessage loadFromFiles(const QString &directory); + //! Return the (relative) filename that may is (or would be) used to save the value with the given key. + //! The file may or may not exist (because it might not have been saved yet). + //! \threadsafe + static QString filenameForKey(const QString &key); + + //! List the Json files which are (or would be) used to save the current values. + //! The files may or may not exist (because they might not have been saved yet). + //! \threadsafe + QStringList enumerateFiles(const QString &directory) const; + //! Clear all values from the cache. //! \threadsafe void clearAllValues(const QString &keyPrefix = {}); @@ -219,6 +229,9 @@ namespace BlackMisc //! Write a new value. Must be called from the thread in which the owner lives. CStatusMessage set(const T &value) { return m_page.setValue(m_element, CVariant::from(value)); } + //! Get the key string of this value. + const QString &getKey() const { return m_page.getKey(m_element); } + //! Return the time when this value was updated. QDateTime getTimestamp() const { return m_page.getTimestamp(m_element); } diff --git a/src/blackmisc/valuecache_private.h b/src/blackmisc/valuecache_private.h index 58f7db9b3..43b7d82bc 100644 --- a/src/blackmisc/valuecache_private.h +++ b/src/blackmisc/valuecache_private.h @@ -64,6 +64,9 @@ namespace BlackMisc //! Write the value corresponding to the element's key and begin synchronizing it to any other pages. CStatusMessage setValue(Element &element, const CVariant &value); + //! Get the key string corresponding to the element. + const QString &getKey(const Element &element) const; + //! Get the timestamp corresponding to the element. qint64 getTimestamp(const Element &element) const;