mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-11 07:13:44 +00:00
perf(cdclient): read ComponentsRegistry, ItemComponent and Objects from the fdb
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>
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
// Custom Classes
|
||||
#include "CDTable.h"
|
||||
#include "dCommonVars.h"
|
||||
#include "FdbReader.h"
|
||||
|
||||
struct CDItemComponent {
|
||||
uint32_t id; //!< The Component ID
|
||||
@@ -52,10 +53,20 @@ struct CDItemComponent {
|
||||
class CDItemComponentTable : public CDTable<CDItemComponentTable, std::map<uint32_t, CDItemComponent>> {
|
||||
public:
|
||||
void LoadValuesFromDatabase();
|
||||
|
||||
// Reads rows from the client's fdb from now on, if it is open; false keeps the table on CDServer.sqlite
|
||||
bool LoadFromFdb();
|
||||
|
||||
static std::map<LOT, uint32_t> ParseCraftingCurrencies(const CDItemComponent& itemComponent);
|
||||
|
||||
// Gets an entry by ID
|
||||
const CDItemComponent& GetItemComponentByID(uint32_t skillID);
|
||||
|
||||
static CDItemComponent Default;
|
||||
|
||||
private:
|
||||
// Caches the entry of one id from CDServer.sqlite (Default when there is none) and returns it
|
||||
const CDItemComponent& LoadFromSqlite(uint32_t id);
|
||||
|
||||
const FdbReader::Table* m_FdbTable = nullptr;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user