From b6048613d4b62f2af911b411f23aef0fbe5a88f8 Mon Sep 17 00:00:00 2001 From: Saturneric Date: Thu, 13 Jul 2023 14:49:36 +0800 Subject: feat: add CacheManager to deal with cache --- src/core/function/CacheManager.h | 75 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) (limited to 'src/core/function/CacheManager.h') 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 + +#include "core/GpgFunctionObject.h" + namespace GpgFrontend { -class CacheManager { +template +class ThreadSafeMap { public: - static void SaveCache(std::string key, const nlohmann::json &value); + using MapType = std::map; + using IteratorType = typename MapType::iterator; + + void insert(const Key& key, const Value& value) { + std::unique_lock lock(mutex_); + map_[key] = value; + } + + std::optional 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 { + 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 cache_storage_; + nlohmann::json key_storage_; + QTimer* m_timer_; + const std::string drk_key_ = "__cache_manage_data_register_key_list"; }; } // namespace GpgFrontend -- cgit v1.2.3