*
This commit is contained in:
@@ -82,10 +82,10 @@ public:
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Менеджер предоставления ресурсов. Управляет ресурс паками
|
Менеджер предоставления ресурсов. Управляет ресурс паками
|
||||||
и хранением кешированных ресурсов сервера.
|
и хранением кешированных ресурсов с сервера.
|
||||||
Интерфейс однопоточный.
|
Интерфейс однопоточный.
|
||||||
|
|
||||||
Обработка файлов в отдельном потоке
|
Обработка файлов в отдельном потоке.
|
||||||
*/
|
*/
|
||||||
class AssetsManager : public IAsyncDestructible {
|
class AssetsManager : public IAsyncDestructible {
|
||||||
public:
|
public:
|
||||||
@@ -153,12 +153,38 @@ public:
|
|||||||
|
|
||||||
// После этого вызова уже нельзя будет обращатся ко внешним ресурсам
|
// После этого вызова уже нельзя будет обращатся ко внешним ресурсам
|
||||||
void shutdown() {
|
void shutdown() {
|
||||||
|
assert(NeedShutdown);
|
||||||
OffThread.join();
|
OffThread.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool hasError() {
|
||||||
|
return IssuedAnError;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Logger LOG = "Client>ResourceHandler";
|
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;
|
volatile size_t DatabaseSize = 0;
|
||||||
|
|
||||||
// Очередь задач на чтение
|
// Очередь задач на чтение
|
||||||
@@ -179,7 +205,7 @@ private:
|
|||||||
|
|
||||||
TOS::SpinlockObject<Changes_t> Changes;
|
TOS::SpinlockObject<Changes_t> Changes;
|
||||||
|
|
||||||
bool NeedShutdown = false;
|
bool NeedShutdown = false, IssuedAnError = false;
|
||||||
std::thread OffThread;
|
std::thread OffThread;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1992,7 +1992,7 @@ struct Resource::InlineMMap {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Resource::InlinePtr {
|
struct Resource::InlinePtr {
|
||||||
std::vector<uint8_t> Data;
|
std::u8string Data;
|
||||||
Hash_t Hash;
|
Hash_t Hash;
|
||||||
|
|
||||||
InlinePtr(const uint8_t* data, size_t size) {
|
InlinePtr(const uint8_t* data, size_t size) {
|
||||||
@@ -2001,6 +2001,11 @@ struct Resource::InlinePtr {
|
|||||||
Hash = sha2::sha256(data, size);
|
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(); }
|
const std::byte* data() const { return (const std::byte*) Data.data(); }
|
||||||
size_t size() const { return Data.size(); }
|
size_t size() const { return Data.size(); }
|
||||||
};
|
};
|
||||||
@@ -2014,10 +2019,28 @@ Resource::Resource(const uint8_t* data, size_t size)
|
|||||||
: In(std::make_shared<std::variant<InlineMMap, InlinePtr>>(InlinePtr(data, size)))
|
: In(std::make_shared<std::variant<InlineMMap, InlinePtr>>(InlinePtr(data, size)))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
Resource::Resource(const std::u8string& data)
|
||||||
|
: In(std::make_shared<std::variant<InlineMMap, InlinePtr>>(InlinePtr((const uint8_t*) data.data(), data.size())))
|
||||||
|
{}
|
||||||
|
|
||||||
|
Resource::Resource(std::u8string&& data) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
const std::byte* Resource::data() const { assert(In); return std::visit<const std::byte*>([](auto& obj){ return obj.data(); }, *In); }
|
const std::byte* Resource::data() const { assert(In); return std::visit<const std::byte*>([](auto& obj){ return obj.data(); }, *In); }
|
||||||
size_t Resource::size() const { assert(In); return std::visit<size_t>([](auto& obj){ return obj.size(); }, *In); }
|
size_t Resource::size() const { assert(In); return std::visit<size_t>([](auto& obj){ return obj.size(); }, *In); }
|
||||||
Hash_t Resource::hash() const { assert(In); return std::visit<Hash_t>([](auto& obj){ return obj.Hash; }, *In); }
|
Hash_t Resource::hash() const { assert(In); return std::visit<Hash_t>([](auto& obj){ return obj.Hash; }, *In); }
|
||||||
|
|
||||||
|
Resource Resource::convertToMem() const {
|
||||||
|
if(InlineMMap* ptr = std::get_if<InlineMMap>(&*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;
|
auto Resource::operator<=>(const Resource&) const = default;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -700,8 +700,11 @@ private:
|
|||||||
std::shared_ptr<std::variant<InlineMMap, InlinePtr>> In;
|
std::shared_ptr<std::variant<InlineMMap, InlinePtr>> In;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Resource() = default;
|
||||||
Resource(std::filesystem::path path);
|
Resource(std::filesystem::path path);
|
||||||
Resource(const uint8_t* data, size_t size);
|
Resource(const uint8_t* data, size_t size);
|
||||||
|
Resource(const std::u8string& data);
|
||||||
|
Resource(std::u8string&& data);
|
||||||
|
|
||||||
Resource(const Resource&) = default;
|
Resource(const Resource&) = default;
|
||||||
Resource(Resource&&) = default;
|
Resource(Resource&&) = default;
|
||||||
@@ -712,6 +715,12 @@ public:
|
|||||||
const std::byte* data() const;
|
const std::byte* data() const;
|
||||||
size_t size() const;
|
size_t size() const;
|
||||||
Hash_t hash() const;
|
Hash_t hash() const;
|
||||||
|
|
||||||
|
Resource convertToMem() const;
|
||||||
|
|
||||||
|
operator bool() const {
|
||||||
|
return (bool) In;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user