فهرست منبع

Fixed caching of databases during runtime (#7275)

* Fixes #7268
Thanks to @jmsngls
Lemongrass3110 2 سال پیش
والد
کامیت
ba9770ce95
1فایلهای تغییر یافته به همراه26 افزوده شده و 4 حذف شده
  1. 26 4
      src/common/database.hpp

+ 26 - 4
src/common/database.hpp

@@ -111,7 +111,7 @@ public:
 		}
 	}
 
-	void put( keytype key, std::shared_ptr<datatype> ptr ){
+	virtual void put( keytype key, std::shared_ptr<datatype> ptr ){
 		this->data[key] = ptr;
 	}
 
@@ -135,7 +135,7 @@ public:
 		return rathena::util::umap_random( this->data );
 	}
 
-	void erase(keytype key) {
+	virtual void erase(keytype key) {
 		this->data.erase(key);
 	}
 };
@@ -143,20 +143,22 @@ public:
 template <typename keytype, typename datatype> class TypesafeCachedYamlDatabase : public TypesafeYamlDatabase<keytype, datatype>{
 private:
 	std::vector<std::shared_ptr<datatype>> cache;
+	bool loaded;
 
 public:
 	TypesafeCachedYamlDatabase( const std::string& type_, uint16 version_, uint16 minimumVersion_ ) : TypesafeYamlDatabase<keytype, datatype>( type_, version_, minimumVersion_ ){
-
+		this->loaded = false;
 	}
 
 	TypesafeCachedYamlDatabase( const std::string& type_, uint16 version_ ) : TypesafeYamlDatabase<keytype, datatype>( type_, version_, version_ ){
-
+		this->loaded = false;
 	}
 
 	void clear() override{
 		TypesafeYamlDatabase<keytype, datatype>::clear();
 		cache.clear();
 		cache.shrink_to_fit();
+		this->loaded = false;
 	}
 
 	std::shared_ptr<datatype> find( keytype key ) override{
@@ -206,6 +208,26 @@ public:
 				break;
 			}
 		}
+
+		this->loaded = true;
+	}
+
+	void erase( keytype key ) override{
+		TypesafeYamlDatabase<keytype, datatype>::erase( key );
+
+		// Prevent excessive usage during loading
+		if( this->loaded ){
+			this->cache[this->calculateCacheKey( key )] = nullptr;
+		}
+	}
+
+	void put( keytype key, std::shared_ptr<datatype> ptr ) override{
+		TypesafeYamlDatabase<keytype, datatype>::put( key, ptr );
+
+		// Prevent excessive usage during loading
+		if( this->loaded ){
+			this->cache[this->calculateCacheKey( key )] = ptr;
+		}
 	}
 };