[Bug Fix] Fix Instance Repository (#2598)

Instance code used to use a `REPLACE INTO`, add an extended repository method to do this so we're not getting `DUPLICATE` errors.
This commit is contained in:
Alex King 2022-11-30 21:31:39 -05:00 committed by GitHub
parent ecc34940b4
commit 85ae36ede5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 25 deletions

View File

@ -49,11 +49,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include <sys/time.h> #include <sys/time.h>
#endif #endif
/**
* @param instance_id
* @param char_id
* @return
*/
bool Database::AddClientToInstance(uint16 instance_id, uint32 character_id) bool Database::AddClientToInstance(uint16 instance_id, uint32 character_id)
{ {
auto e = InstanceListPlayerRepository::NewEntity(); auto e = InstanceListPlayerRepository::NewEntity();
@ -61,7 +56,7 @@ bool Database::AddClientToInstance(uint16 instance_id, uint32 character_id)
e.id = instance_id; e.id = instance_id;
e.charid = character_id; e.charid = character_id;
return InstanceListPlayerRepository::InsertOne(*this, e).id ? true : false; return InstanceListPlayerRepository::ReplaceOne(*this, e);
} }
bool Database::CheckInstanceByCharID(uint16 instance_id, uint32 character_id) bool Database::CheckInstanceByCharID(uint16 instance_id, uint32 character_id)
@ -78,14 +73,15 @@ bool Database::CheckInstanceByCharID(uint16 instance_id, uint32 character_id)
character_id character_id
) )
); );
if (l.empty() || !l[0].id) { if (l.empty()) {
return false; return false;
} }
return true; return true;
} }
bool Database::CheckInstanceExists(uint16 instance_id) { bool Database::CheckInstanceExists(uint16 instance_id)
{
if (!instance_id) { if (!instance_id) {
return false; return false;
} }
@ -129,7 +125,7 @@ bool Database::CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version
e.start_time = std::time(nullptr); e.start_time = std::time(nullptr);
e.duration = duration; e.duration = duration;
return InstanceListRepository::InsertOne(*this, e).id ? true : false; return InstanceListRepository::InsertOne(*this, e).id;
} }
bool Database::GetUnusedInstanceID(uint16 &instance_id) bool Database::GetUnusedInstanceID(uint16 &instance_id)
@ -137,8 +133,8 @@ bool Database::GetUnusedInstanceID(uint16 &instance_id)
uint32 max_reserved_instance_id = RuleI(Instances, ReservedInstances); uint32 max_reserved_instance_id = RuleI(Instances, ReservedInstances);
uint32 max = 32000; uint32 max = 32000;
std::string query = StringFormat( auto query = fmt::format(
"SELECT IFNULL(MAX(id),%u)+1 FROM instance_list WHERE id > %u", "SELECT IFNULL(MAX(id), {}) + 1 FROM instance_list WHERE id > {}",
max_reserved_instance_id, max_reserved_instance_id,
max_reserved_instance_id max_reserved_instance_id
); );
@ -182,7 +178,7 @@ bool Database::GetUnusedInstanceID(uint16 &instance_id)
return true; return true;
} }
query = StringFormat("SELECT id FROM instance_list where id > %u ORDER BY id", max_reserved_instance_id); query = fmt::format("SELECT id FROM instance_list where id > {} ORDER BY id", max_reserved_instance_id);
results = QueryDatabase(query); results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success()) {
@ -196,8 +192,9 @@ bool Database::GetUnusedInstanceID(uint16 &instance_id)
} }
max_reserved_instance_id++; max_reserved_instance_id++;
for (auto row = results.begin(); row != results.end(); ++row) {
if (max_reserved_instance_id < atoi(row[0])) { for (auto row : results) {
if (max_reserved_instance_id < std::stoul(row[0])) {
instance_id = max_reserved_instance_id; instance_id = max_reserved_instance_id;
return true; return true;
} }
@ -226,7 +223,7 @@ bool Database::IsGlobalInstance(uint16 instance_id)
return false; return false;
} }
return i.is_global ? true : false; return i.is_global;
} }
bool Database::RemoveClientFromInstance(uint16 instance_id, uint32 char_id) bool Database::RemoveClientFromInstance(uint16 instance_id, uint32 char_id)
@ -238,15 +235,12 @@ bool Database::RemoveClientFromInstance(uint16 instance_id, uint32 char_id)
instance_id, instance_id,
char_id char_id
) )
) ? );
true :
false;
} }
bool Database::RemoveClientsFromInstance(uint16 instance_id) bool Database::RemoveClientsFromInstance(uint16 instance_id)
{ {
return InstanceListPlayerRepository::DeleteOne(*this, instance_id) ? true : false; return InstanceListPlayerRepository::DeleteOne(*this, instance_id);
} }
bool Database::VerifyInstanceAlive(uint16 instance_id, uint32 character_id) bool Database::VerifyInstanceAlive(uint16 instance_id, uint32 character_id)
@ -274,7 +268,7 @@ bool Database::VerifyZoneInstance(uint32 zone_id, uint16 instance_id)
zone_id zone_id
) )
); );
if (l.empty() || !l[0].id) { if (l.empty()) {
return false; return false;
} }
@ -399,7 +393,7 @@ void Database::AssignGroupToInstance(uint32 group_id, uint32 instance_id)
group_id group_id
) )
); );
if (l.empty() || !l[0].groupid) { if (l.empty()) {
return; return;
} }
@ -422,7 +416,7 @@ void Database::AssignRaidToInstance(uint32 raid_id, uint32 instance_id)
raid_id raid_id
) )
); );
if (l.empty() || !l[0].groupid) { if (l.empty()) {
return; return;
} }
@ -490,7 +484,7 @@ void Database::FlagInstanceByRaidLeader(uint32 zone_id, int16 version, uint32 ch
void Database::GetCharactersInInstance(uint16 instance_id, std::list<uint32> &character_ids) void Database::GetCharactersInInstance(uint16 instance_id, std::list<uint32> &character_ids)
{ {
auto l = InstanceListPlayerRepository::GetWhere(*this, fmt::format("id = {}", instance_id)); auto l = InstanceListPlayerRepository::GetWhere(*this, fmt::format("id = {}", instance_id));
if (l.empty() || !l[0].id) { if (l.empty()) {
return; return;
} }
@ -510,7 +504,7 @@ void Database::PurgeExpiredInstances()
*this, *this,
"(start_time + duration) <= (UNIX_TIMESTAMP() - 86400) AND never_expires = 0" "(start_time + duration) <= (UNIX_TIMESTAMP() - 86400) AND never_expires = 0"
); );
if (l.empty() || !l[0].id) { if (l.empty()) {
return; return;
} }

View File

@ -73,6 +73,27 @@ public:
return (results.Success() ? results.RowsAffected() : 0); return (results.Success() ? results.RowsAffected() : 0);
} }
static bool ReplaceOne(Database& db, InstanceListPlayer e)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.charid));
auto results = db.QueryDatabase(
fmt::format(
"REPLACE INTO {} VALUES ({})",
TableName(),
Strings::Implode(",", v)
)
);
if (results.Success()) {
return true;
}
return false;
}
}; };
#endif //EQEMU_INSTANCE_LIST_PLAYER_REPOSITORY_H #endif //EQEMU_INSTANCE_LIST_PLAYER_REPOSITORY_H