diff --git a/Src/Client/AssetsManager.hpp b/Src/Client/AssetsManager.hpp index 8337b3b..8492ac7 100644 --- a/Src/Client/AssetsManager.hpp +++ b/Src/Client/AssetsManager.hpp @@ -82,10 +82,10 @@ public: /* Менеджер предоставления ресурсов. Управляет ресурс паками - и хранением кешированных ресурсов сервера. + и хранением кешированных ресурсов с сервера. Интерфейс однопоточный. - Обработка файлов в отдельном потоке + Обработка файлов в отдельном потоке. */ class AssetsManager : public IAsyncDestructible { public: @@ -153,12 +153,38 @@ public: // После этого вызова уже нельзя будет обращатся ко внешним ресурсам void shutdown() { + assert(NeedShutdown); OffThread.join(); } + bool hasError() { + return IssuedAnError; + } + private: Logger LOG = "Client>ResourceHandler"; - const fs::path CachePath; + const fs::path + CachePath, + PathDatabase = CachePath / "db.sqlite3", + PathFiles = CachePath / "blobs"; + static constexpr size_t SMALL_RESOURCE = 1 << 21; + + sqlite3 *DB = nullptr; // База хранения кеша меньше 2мб и информации о кеше на диске + sqlite3_stmt + *STMT_DISK_INSERT = nullptr, // Вставка записи о хеше + *STMT_DISK_UPDATE_TIME = nullptr, // Обновить дату последнего использования + *STMT_DISK_REMOVE = nullptr, // Удалить хеш + *STMT_DISK_CONTAINS = nullptr, // Проверка наличия хеша + *STMT_DISK_SUM = nullptr, // Вычисляет занятое место на диске + *STMT_DISK_COUNT = nullptr, // Возвращает количество записей + + *STMT_INLINE_INSERT = nullptr, // Вставка ресурса + *STMT_INLINE_GET = nullptr, // Поиск ресурса по хешу + *STMT_INLINE_UPDATE_TIME = nullptr, // Обновить дату последнего использования + *STMT_INLINE_SUM = nullptr, // Размер внутреннего хранилища + *STMT_INLINE_COUNT = nullptr; // Возвращает количество записей + + // Полный размер данных на диске (насколько известно) volatile size_t DatabaseSize = 0; // Очередь задач на чтение @@ -179,7 +205,7 @@ private: TOS::SpinlockObject Changes; - bool NeedShutdown = false; + bool NeedShutdown = false, IssuedAnError = false; std::thread OffThread; diff --git a/Src/Common/Abstract.cpp b/Src/Common/Abstract.cpp index b6aa1fd..eec3ea8 100644 --- a/Src/Common/Abstract.cpp +++ b/Src/Common/Abstract.cpp @@ -1992,7 +1992,7 @@ struct Resource::InlineMMap { }; struct Resource::InlinePtr { - std::vector Data; + std::u8string Data; Hash_t Hash; InlinePtr(const uint8_t* data, size_t size) { @@ -2001,6 +2001,11 @@ struct Resource::InlinePtr { Hash = sha2::sha256(data, size); } + InlinePtr(std::u8string&& data) { + Data = std::move(data); + Hash = sha2::sha256((const uint8_t*) Data.data(), Data.size()); + } + const std::byte* data() const { return (const std::byte*) Data.data(); } size_t size() const { return Data.size(); } }; @@ -2014,10 +2019,28 @@ Resource::Resource(const uint8_t* data, size_t size) : In(std::make_shared>(InlinePtr(data, size))) {} +Resource::Resource(const std::u8string& data) + : In(std::make_shared>(InlinePtr((const uint8_t*) data.data(), data.size()))) +{} + +Resource::Resource(std::u8string&& data) { + +} + const std::byte* Resource::data() const { assert(In); return std::visit([](auto& obj){ return obj.data(); }, *In); } size_t Resource::size() const { assert(In); return std::visit([](auto& obj){ return obj.size(); }, *In); } Hash_t Resource::hash() const { assert(In); return std::visit([](auto& obj){ return obj.Hash; }, *In); } +Resource Resource::convertToMem() const { + if(InlineMMap* ptr = std::get_if(&*In)) { + std::u8string data(ptr->size(), '\0'); + std::copy(ptr->data(), ptr->data()+ptr->size(), (std::byte*) data.data()); + return Resource(std::move(data)); + } else { + return *this; + } +} + auto Resource::operator<=>(const Resource&) const = default; } \ No newline at end of file diff --git a/Src/Common/Abstract.hpp b/Src/Common/Abstract.hpp index 07975e1..5116c68 100644 --- a/Src/Common/Abstract.hpp +++ b/Src/Common/Abstract.hpp @@ -700,8 +700,11 @@ private: std::shared_ptr> In; public: + Resource() = default; Resource(std::filesystem::path path); Resource(const uint8_t* data, size_t size); + Resource(const std::u8string& data); + Resource(std::u8string&& data); Resource(const Resource&) = default; Resource(Resource&&) = default; @@ -712,6 +715,12 @@ public: const std::byte* data() const; size_t size() const; Hash_t hash() const; + + Resource convertToMem() const; + + operator bool() const { + return (bool) In; + } }; }