Implement bazaar item identity and offline trading rework

This commit is contained in:
Vayle
2026-03-19 22:18:32 -04:00
90 changed files with 5379 additions and 2165 deletions
@@ -0,0 +1,68 @@
#pragma once
#include "common/database.h"
#include "common/strings.h"
#include "common/item_instance.h"
class ItemUniqueIdReservationsRepository {
public:
static bool Reserve(Database &db, const std::string &item_unique_id)
{
if (item_unique_id.empty()) {
return false;
}
auto results = db.QueryDatabase(
fmt::format(
"INSERT IGNORE INTO item_unique_id_reservations (item_unique_id, reserved_at) VALUES ('{}', NOW())",
Strings::Escape(item_unique_id)
)
);
return results.Success();
}
static std::string ReserveNew(Database &db, uint32 max_attempts = 64)
{
for (uint32 attempt = 0; attempt < max_attempts; ++attempt) {
auto candidate = EQ::UniqueHashGenerator::generate();
auto results = db.QueryDatabase(
fmt::format(
"INSERT INTO item_unique_id_reservations (item_unique_id, reserved_at) VALUES ('{}', NOW())",
Strings::Escape(candidate)
)
);
if (results.Success()) {
return candidate;
}
if (results.ErrorNumber() != 1062) {
LogError(
"Failed reserving item_unique_id [{}] (attempt {}): ({}) {}",
candidate,
attempt + 1,
results.ErrorNumber(),
results.ErrorMessage()
);
break;
}
}
return {};
}
static bool PopulateFromTable(Database &db, const std::string &table_name, const std::string &column_name)
{
auto results = db.QueryDatabase(
fmt::format(
"INSERT IGNORE INTO item_unique_id_reservations (item_unique_id, reserved_at) "
"SELECT DISTINCT {1}, NOW() FROM {0} WHERE {1} IS NOT NULL AND {1} <> ''",
table_name,
column_name
)
);
return results.Success();
}
};