Added bindings to FileCache, also smaller tweaks.

This commit is contained in:
Relintai 2022-06-27 12:26:57 +02:00
parent 3c78c29c17
commit 663cd9d3a2
2 changed files with 105 additions and 12 deletions

View File

@ -3,6 +3,20 @@
#include "core/os/dir_access.h" #include "core/os/dir_access.h"
#include "core/os/file_access.h" #include "core/os/file_access.h"
String FileCache::get_wwwroot() {
return wwwroot;
}
void FileCache::set_wwwroot(const String &val) {
wwwroot = val;
}
int FileCache::get_cache_invalidation_time() {
return cache_invalidation_time;
}
void FileCache::set_cache_invalidation_time(const int &val) {
cache_invalidation_time = val;
}
void FileCache::wwwroot_register_file(const String &file_path) { void FileCache::wwwroot_register_file(const String &file_path) {
registered_files.insert(file_path); registered_files.insert(file_path);
} }
@ -62,12 +76,13 @@ bool FileCache::get_cached_body(const String &path, String *body) {
return false; return false;
} }
int64_t current_timestamp = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count(); if (cache_invalidation_time > 0) {
uint64_t current_timestamp = OS::get_singleton()->get_unix_time();
uint64_t diff = current_timestamp - e->timestamp;
int64_t diff = current_timestamp - e->timestamp; if (diff > cache_invalidation_time) {
return false;
if (diff > cache_invalidation_time) { }
return false;
} }
body->operator+=(e->body); body->operator+=(e->body);
@ -75,17 +90,63 @@ bool FileCache::get_cached_body(const String &path, String *body) {
return true; return true;
} }
bool FileCache::has_cached_body(const String &path) {
//TODO ERROR MACRO body == null
_lock.read_lock();
CacheEntry *e = cache_map[path];
_lock.read_unlock();
if (!e) {
return false;
}
if (cache_invalidation_time > 0) {
uint64_t current_timestamp = OS::get_singleton()->get_unix_time();
uint64_t diff = current_timestamp - e->timestamp;
if (diff > cache_invalidation_time) {
return false;
}
}
return true;
}
String FileCache::get_cached_body_bind(const String &path) {
//TODO ERROR MACRO body == null
_lock.read_lock();
CacheEntry *e = cache_map[path];
_lock.read_unlock();
if (!e) {
return "";
}
if (cache_invalidation_time > 0) {
uint64_t current_timestamp = OS::get_singleton()->get_unix_time();
uint64_t diff = current_timestamp - e->timestamp;
if (diff > cache_invalidation_time) {
return "";
}
}
return e->body;
}
void FileCache::set_cached_body(const String &path, const String &body) { void FileCache::set_cached_body(const String &path, const String &body) {
_lock.write_lock(); _lock.write_lock();
CacheEntry *e = cache_map[path]; CacheEntry *e = cache_map[path];
if (!e) { if (!e) {
e = new CacheEntry(); e = memnew(CacheEntry());
cache_map[path] = e; cache_map[path] = e;
} }
int64_t current_timestamp = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count(); uint64_t current_timestamp = OS::get_singleton()->get_unix_time();
e->timestamp = current_timestamp; e->timestamp = current_timestamp;
e->body = body; e->body = body;
@ -102,7 +163,7 @@ void FileCache::clear() {
CacheEntry *ce = E->get(); CacheEntry *ce = E->get();
if (ce) { if (ce) {
delete ce; memdelete(ce);
} }
} }
@ -112,9 +173,31 @@ void FileCache::clear() {
} }
FileCache::FileCache() { FileCache::FileCache() {
cache_invalidation_time = 1; cache_invalidation_time = 0;
} }
FileCache::~FileCache() { FileCache::~FileCache() {
registered_files.clear(); registered_files.clear();
} }
void FileCache::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_wwwroot"), &FileCache::get_wwwroot);
ClassDB::bind_method(D_METHOD("set_wwwroot", "val"), &FileCache::set_wwwroot);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "wwwroot"), "set_wwwroot", "get_wwwroot");
ClassDB::bind_method(D_METHOD("get_cache_invalidation_time"), &FileCache::get_cache_invalidation_time);
ClassDB::bind_method(D_METHOD("set_cache_invalidation_time", "val"), &FileCache::set_cache_invalidation_time);
ADD_PROPERTY(PropertyInfo(Variant::INT, "cache_invalidation_time"), "set_cache_invalidation_time", "get_cache_invalidation_time");
ClassDB::bind_method(D_METHOD("wwwroot_register_file", "file_path"), &FileCache::wwwroot_register_file);
ClassDB::bind_method(D_METHOD("wwwroot_deregister_file", "file_path"), &FileCache::wwwroot_deregister_file);
ClassDB::bind_method(D_METHOD("wwwroot_has_file", "file_path"), &FileCache::wwwroot_has_file);
ClassDB::bind_method(D_METHOD("wwwroot_refresh_cache"), &FileCache::wwwroot_refresh_cache);
ClassDB::bind_method(D_METHOD("wwwroot_evaluate_dir", "file_path", "should_exist "), &FileCache::wwwroot_evaluate_dir, true);
ClassDB::bind_method(D_METHOD("get_cached_body", "path"), &FileCache::get_cached_body_bind);
ClassDB::bind_method(D_METHOD("has_cached_body", "path"), &FileCache::has_cached_body);
ClassDB::bind_method(D_METHOD("set_cached_body", "path", "body"), &FileCache::set_cached_body);
ClassDB::bind_method(D_METHOD("clear"), &FileCache::clear);
}

View File

@ -13,8 +13,11 @@ class FileCache : public Reference {
GDCLASS(FileCache, Reference); GDCLASS(FileCache, Reference);
public: public:
String wwwroot; String get_wwwroot();
int cache_invalidation_time; void set_wwwroot(const String &val);
int get_cache_invalidation_time();
void set_cache_invalidation_time(const int &val);
//Note: file path should be the url you want to access the file with, inculding lead slash //Note: file path should be the url you want to access the file with, inculding lead slash
//e.g. http://127.0.0.1/a/b/d.jpg -> /a/b/d.jpg //e.g. http://127.0.0.1/a/b/d.jpg -> /a/b/d.jpg
@ -25,6 +28,8 @@ public:
void wwwroot_evaluate_dir(const String &path, const bool should_exist = true); void wwwroot_evaluate_dir(const String &path, const bool should_exist = true);
bool get_cached_body(const String &path, String *body); bool get_cached_body(const String &path, String *body);
bool has_cached_body(const String &path);
String get_cached_body_bind(const String &path);
void set_cached_body(const String &path, const String &body); void set_cached_body(const String &path, const String &body);
void clear(); void clear();
@ -32,11 +37,16 @@ public:
FileCache(); FileCache();
~FileCache(); ~FileCache();
String wwwroot;
int cache_invalidation_time;
Set<String> registered_files; Set<String> registered_files;
protected: protected:
static void _bind_methods();
struct CacheEntry { struct CacheEntry {
int64_t timestamp; uint64_t timestamp;
String body; String body;
CacheEntry() { CacheEntry() {