aboutsummaryrefslogtreecommitdiffstats
path: root/src/core/function/CacheManager.h
diff options
context:
space:
mode:
authorSaturneric <[email protected]>2023-07-13 06:49:36 +0000
committerSaturneric <[email protected]>2023-07-13 06:49:36 +0000
commitb6048613d4b62f2af911b411f23aef0fbe5a88f8 (patch)
tree8838cf23fc247acda5ab6049fbc85a3ea76f92bd /src/core/function/CacheManager.h
parentfix: recommand not require (diff)
downloadGpgFrontend-b6048613d4b62f2af911b411f23aef0fbe5a88f8.tar.gz
GpgFrontend-b6048613d4b62f2af911b411f23aef0fbe5a88f8.zip
feat: add CacheManager to deal with cache
Diffstat (limited to 'src/core/function/CacheManager.h')
-rw-r--r--src/core/function/CacheManager.h75
1 files changed, 71 insertions, 4 deletions
diff --git a/src/core/function/CacheManager.h b/src/core/function/CacheManager.h
index e489182f..7a175586 100644
--- a/src/core/function/CacheManager.h
+++ b/src/core/function/CacheManager.h
@@ -29,15 +29,82 @@
#ifndef GPGFRONTEND_CACHEMANAGER_H
#define GPGFRONTEND_CACHEMANAGER_H
+#include <string>
+
+#include "core/GpgFunctionObject.h"
+
namespace GpgFrontend {
-class CacheManager {
+template <typename Key, typename Value>
+class ThreadSafeMap {
public:
- static void SaveCache(std::string key, const nlohmann::json &value);
+ using MapType = std::map<Key, Value>;
+ using IteratorType = typename MapType::iterator;
+
+ void insert(const Key& key, const Value& value) {
+ std::unique_lock lock(mutex_);
+ map_[key] = value;
+ }
+
+ std::optional<Value> get(const Key& key) {
+ std::shared_lock lock(mutex_);
+ auto it = map_.find(key);
+ if (it != map_.end()) {
+ return it->second;
+ }
+ return std::nullopt;
+ }
+
+ bool exists(const Key& key) {
+ std::shared_lock lock(mutex_);
+ return map_.count(key) > 0;
+ }
+
+ IteratorType begin() { return map_mirror_.begin(); }
+
+ IteratorType end() { return map_mirror_.end(); }
+
+ ThreadSafeMap& mirror() {
+ std::shared_lock lock(mutex_);
+ map_mirror_ = map_;
+ return *this;
+ }
+
+ private:
+ MapType map_mirror_;
+ MapType map_;
+ mutable std::shared_mutex mutex_;
+};
+
+class GPGFRONTEND_CORE_EXPORT CacheManager
+ : public QObject,
+ public SingletonFunctionObject<CacheManager> {
+ Q_OBJECT
+ public:
+ CacheManager(int channel = SingletonFunctionObject::GetDefaultChannel());
+
+ void SaveCache(std::string key, const nlohmann::json& value);
+
+ nlohmann::json LoadCache(std::string key);
+
+ nlohmann::json LoadCache(std::string key, nlohmann::json default_value);
+
+ private:
+ std::string get_data_object_key(std::string key);
+
+ nlohmann::json load_cache_storage(std::string key,
+ nlohmann::json default_value);
+
+ void load_all_cache_storage();
+
+ void flush_cache_storage();
- static nlohmann::json LoadCache(std::string name);
+ void register_cache_key(std::string key);
- static void ClearAllCache();
+ ThreadSafeMap<std::string, nlohmann::json> cache_storage_;
+ nlohmann::json key_storage_;
+ QTimer* m_timer_;
+ const std::string drk_key_ = "__cache_manage_data_register_key_list";
};
} // namespace GpgFrontend