mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 19:03:43 +00:00
The world and master servers pass the client's res/cdclient.fdb to CDClientManager. When it opens, these three tables, all looked up by their first column, find rows through the fdb's buckets instead of each process caching the whole table: ComponentsRegistry keeps nothing, ItemComponent and Objects keep only the entries asked for (their API returns references). Ids whose rows CDServer.sqlite changes are loaded from SQLite at startup and win. Without an fdb (or with one whose columns don't match) the tables load from CDServer.sqlite as before. ItemComponent and Objects now fill entries from one template for both sources instead of copies of the same field list. Tests cover the SQLite changes on top of the fdb, the no-fdb and unmapped paths, and, when DLU_CLIENT_RES points at a client, every id of the three tables through the fdb against CDServer.sqlite. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
#ifndef __CDCLIENTMANAGER__H__
|
|
#define __CDCLIENTMANAGER__H__
|
|
|
|
#define UNUSED_TABLE(v)
|
|
|
|
#include <filesystem>
|
|
|
|
/**
|
|
* Initialize the CDClient tables so they are all loaded into memory.
|
|
*/
|
|
namespace CDClientManager {
|
|
/**
|
|
* @param fdbPath The client's cdclient.fdb. When it opens, the tables looked up by their first
|
|
* column read their rows from it (shared between processes) instead of caching them. Empty, or
|
|
* a file that doesn't open, keeps every table on CDServer.sqlite.
|
|
*/
|
|
void LoadValuesFromDatabase(const std::filesystem::path& fdbPath = {});
|
|
void LoadValuesFromDefaults();
|
|
|
|
/**
|
|
* Fetch a table from CDClient
|
|
*
|
|
* @tparam Table type to fetch
|
|
* @return A pointer to the requested table.
|
|
*/
|
|
template<typename T>
|
|
T* GetTable();
|
|
|
|
/**
|
|
* Fetch a table from CDClient
|
|
* Note: Calling this function without a template specialization in CDClientManager.cpp will cause a linker error.
|
|
*
|
|
* @tparam Table type to fetch
|
|
* @return A pointer to the requested table.
|
|
*/
|
|
template<typename T>
|
|
typename T::StorageType& GetEntriesMutable();
|
|
};
|
|
|
|
|
|
// These are included after the CDClientManager namespace declaration as CDTable as of Jan 29 2024 relies on CDClientManager in Templated code.
|
|
#include "CDTable.h"
|
|
|
|
#include "Singleton.h"
|
|
|
|
template<typename T>
|
|
T* CDClientManager::GetTable() {
|
|
return &T::Instance();
|
|
};
|
|
|
|
#endif //!__CDCLIENTMANAGER__H__
|