Updated inventory_snapshots to correct a test case. Working as intended now.

Added sharedbank conversion to create unique item ids on world load.
This commit is contained in:
Mitch Freeman 2025-08-11 20:06:33 -07:00
parent 345d452a7e
commit a2310b6d5e
6 changed files with 44 additions and 15 deletions

View File

@ -52,6 +52,7 @@
#include "../common/repositories/variables_repository.h"
#include "../common/repositories/character_pet_name_repository.h"
#include "../common/events/player_event_logs.h"
#include "../common/repositories/sharedbank_repository.h"
// Disgrace: for windows compile
#ifdef _WINDOWS
@ -2327,3 +2328,37 @@ void Database::ConvertInventoryToNewUniqueId()
TransactionCommit();
LogInfo("Converted {} records", results.size());
}
void Database::ConvertSharedbankToNewUniqueId()
{
LogInfo("Converting shared bank entries with NULL item_unique_id");
auto results = SharedbankRepository::GetWhere(*this, "`item_unique_id` IS NULL");
if (results.empty()) {
return;
}
TransactionBegin();
uint32 index = 0;
const uint32 batch_size = 1000;
std::vector<SharedbankRepository::Sharedbank> queue{};
queue.reserve(batch_size);
for (auto &r: results) {
r.item_unique_id = EQ::UniqueHashGenerator::generate();
queue.push_back(r);
index++;
if (index >= batch_size) {
SharedbankRepository::ReplaceMany(*this, queue);
index = 0;
queue.clear();
}
}
if (!queue.empty()) {
SharedbankRepository::ReplaceMany(*this, queue);
}
TransactionCommit();
LogInfo("Converted {} records", results.size());
}

View File

@ -279,6 +279,7 @@ public:
uint64_t GetNextTableId(const std::string& table_name);
void ConvertInventoryToNewUniqueId();
void ConvertSharedbankToNewUniqueId();
private:
Mutex Mvarcache;

View File

@ -7219,7 +7219,9 @@ ALTER TABLE `inventory_snapshots`
ADD COLUMN `item_unique_id` VARCHAR(16) NULL DEFAULT NULL AFTER `ornament_hero_model`;
ALTER TABLE `inventory_snapshots`
DROP PRIMARY KEY;
DROP PRIMARY KEY,
DROP COLUMN `guid`,
ADD COLUMN `item_unique_id` VARCHAR(16) NULL DEFAULT NULL AFTER `ornament_hero_model`;
ALTER TABLE `inventory_snapshots`
ADD PRIMARY KEY (`time_index`, `character_id`, `slot_id`) USING BTREE;

View File

@ -37,7 +37,6 @@ public:
uint32_t ornament_idfile;
int32_t ornament_hero_model;
std::string item_unique_id;
uint64_t guid;
};
static std::string PrimaryKey()
@ -66,7 +65,6 @@ public:
"ornament_idfile",
"ornament_hero_model",
"item_unique_id",
"guid",
};
}
@ -91,7 +89,6 @@ public:
"ornament_idfile",
"ornament_hero_model",
"item_unique_id",
"guid",
};
}
@ -150,7 +147,6 @@ public:
e.ornament_idfile = 0;
e.ornament_hero_model = 0;
e.item_unique_id = "";
e.guid = 0;
return e;
}
@ -205,7 +201,6 @@ public:
e.ornament_idfile = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.ornament_hero_model = row[16] ? static_cast<int32_t>(atoi(row[16])) : 0;
e.item_unique_id = row[17] ? row[17] : "";
e.guid = row[18] ? strtoull(row[18], nullptr, 10) : 0;
return e;
}
@ -257,7 +252,6 @@ public:
v.push_back(columns[15] + " = " + std::to_string(e.ornament_idfile));
v.push_back(columns[16] + " = " + std::to_string(e.ornament_hero_model));
v.push_back(columns[17] + " = '" + Strings::Escape(e.item_unique_id) + "'");
v.push_back(columns[18] + " = " + std::to_string(e.guid));
auto results = db.QueryDatabase(
fmt::format(
@ -297,7 +291,6 @@ public:
v.push_back(std::to_string(e.ornament_idfile));
v.push_back(std::to_string(e.ornament_hero_model));
v.push_back("'" + Strings::Escape(e.item_unique_id) + "'");
v.push_back(std::to_string(e.guid));
auto results = db.QueryDatabase(
fmt::format(
@ -345,7 +338,6 @@ public:
v.push_back(std::to_string(e.ornament_idfile));
v.push_back(std::to_string(e.ornament_hero_model));
v.push_back("'" + Strings::Escape(e.item_unique_id) + "'");
v.push_back(std::to_string(e.guid));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
@ -397,7 +389,6 @@ public:
e.ornament_idfile = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.ornament_hero_model = row[16] ? static_cast<int32_t>(atoi(row[16])) : 0;
e.item_unique_id = row[17] ? row[17] : "";
e.guid = row[18] ? strtoull(row[18], nullptr, 10) : 0;
all_entries.push_back(e);
}
@ -440,7 +431,6 @@ public:
e.ornament_idfile = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
e.ornament_hero_model = row[16] ? static_cast<int32_t>(atoi(row[16])) : 0;
e.item_unique_id = row[17] ? row[17] : "";
e.guid = row[18] ? strtoull(row[18], nullptr, 10) : 0;
all_entries.push_back(e);
}
@ -533,7 +523,6 @@ public:
v.push_back(std::to_string(e.ornament_idfile));
v.push_back(std::to_string(e.ornament_hero_model));
v.push_back("'" + Strings::Escape(e.item_unique_id) + "'");
v.push_back(std::to_string(e.guid));
auto results = db.QueryDatabase(
fmt::format(
@ -574,7 +563,6 @@ public:
v.push_back(std::to_string(e.ornament_idfile));
v.push_back(std::to_string(e.ornament_hero_model));
v.push_back("'" + Strings::Escape(e.item_unique_id) + "'");
v.push_back(std::to_string(e.guid));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}

View File

@ -245,6 +245,7 @@ public:
s.ornament_idfile = i.ornament_idfile;
s.slot_id = i.slot_id;
s.time_index = time_index;
s.item_unique_id = i.item_unique_id;
queue.push_back(s);
}
@ -264,8 +265,6 @@ public:
static bool RestoreCharacterInvSnapshot(Database &db, uint32 character_id, uint32 timestamp)
{
InventoryRepository::DeleteWhere(db, fmt::format("`character_id` = {}", character_id));
auto snapshot = GetWhere(db, fmt::format("`character_id` = {} AND `time_index` = {}", character_id, timestamp));
if (snapshot.empty()) {
LogError("The snapshot requested could not be found. Restore failed for character id [{}] @ [{}] failed",
@ -295,6 +294,7 @@ public:
e.ornament_icon = i.ornament_icon;
e.ornament_idfile = i.ornament_idfile;
e.slot_id = i.slot_id;
e.item_unique_id = i.item_unique_id;
queue.push_back(e);
}
@ -303,6 +303,8 @@ public:
return false;
}
InventoryRepository::DeleteWhere(db, fmt::format("`character_id` = {}", character_id));
if (!InventoryRepository::InsertMany(db, queue)) {
LogError("A database error occurred. Restore failed for character id [{}] @ [{}] failed", character_id, timestamp);
return false;

View File

@ -296,6 +296,7 @@ bool WorldBoot::DatabaseLoadRoutines(int argc, char **argv)
LogInfo("Clearing buyer table details");
database.ConvertInventoryToNewUniqueId();
database.ConvertSharedbankToNewUniqueId();
if (RuleB(Bots, Enabled)) {
LogInfo("Clearing [bot_pet_buffs] table of stale entries");