mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 10:31:29 +00:00
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:
parent
345d452a7e
commit
a2310b6d5e
@ -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());
|
||||
}
|
||||
@ -279,6 +279,7 @@ public:
|
||||
|
||||
uint64_t GetNextTableId(const std::string& table_name);
|
||||
void ConvertInventoryToNewUniqueId();
|
||||
void ConvertSharedbankToNewUniqueId();
|
||||
|
||||
private:
|
||||
Mutex Mvarcache;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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) + ")");
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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");
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user