diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-01-17 17:58:11 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-10-04 00:19:38 +0200 |
commit | 4ce1c6cdf419b52b889ad9dac7fb69d0059a1fe6 (patch) | |
tree | 13718e7dc010dabb053e9176fc78d19d1a5e59a3 | |
parent | cedf09f93c44be2abf1c2b40e0e4c51f95f2975c (diff) |
Core/Instances: Add prepared statements for InstanceLockMgr
4 files changed, 55 insertions, 37 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 723e85311b5..5cc1a8ed01f 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -600,7 +600,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHAR_AURA, "DELETE FROM character_aura WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_AURA_EFFECT, "DELETE FROM character_aura_effect WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_GIFT, "DELETE FROM character_gifts WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CHAR_INSTANCE, "DELETE FROM character_instance_lock WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_INVENTORY, "DELETE FROM character_inventory WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, "DELETE FROM character_queststatus_rewarded WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_REPUTATION, "DELETE FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC); @@ -757,6 +756,14 @@ void CharacterDatabaseConnection::DoPrepareStatements() // War mode PrepareStatement(CHAR_SEL_WAR_MODE_TUNING, "SELECT race, COUNT(guid) FROM characters WHERE ((playerFlags & ?) = ?) AND logout_time >= (UNIX_TIMESTAMP() - 604800) GROUP BY race", CONNECTION_SYNCH); + + // Instance locks + PrepareStatement(CHAR_DEL_CHARACTER_INSTANCE_LOCK, "DELETE FROM character_instance_lock WHERE guid = ? AND mapId = ? AND lockId = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CHARACTER_INSTANCE_LOCK_BY_GUID, "DELETE FROM character_instance_lock WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHARACTER_INSTANCE_LOCK, "INSERT INTO character_instance_lock (guid, mapId, lockId, instanceId, difficulty, data, completedEncountersMask, entranceWorldSafeLocId, expiryTime, extended) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_CHARACTER_INSTANCE_LOCK_EXTENSION, "UPDATE character_instance_lock SET extended = ? WHERE guid = ? AND mapId = ? AND lockId = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_INSTANCE, "DELETE FROM instance WHERE instanceId = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_INSTANCE, "INSERT INTO instance (instanceId, data, completedEncountersMask, entranceWorldSafeLocId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); } CharacterDatabaseConnection::CharacterDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo) diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 26ec666a5d7..80e7f76337c 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -484,7 +484,6 @@ enum CharacterDatabaseStatements : uint32 CHAR_DEL_CHAR_AURA, CHAR_DEL_CHAR_AURA_EFFECT, CHAR_DEL_CHAR_GIFT, - CHAR_DEL_CHAR_INSTANCE, CHAR_DEL_CHAR_INVENTORY, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, CHAR_DEL_CHAR_REPUTATION, @@ -626,6 +625,13 @@ enum CharacterDatabaseStatements : uint32 CHAR_SEL_WAR_MODE_TUNING, + CHAR_DEL_CHARACTER_INSTANCE_LOCK, + CHAR_DEL_CHARACTER_INSTANCE_LOCK_BY_GUID, + CHAR_INS_CHARACTER_INSTANCE_LOCK, + CHAR_UPD_CHARACTER_INSTANCE_LOCK_EXTENSION, + CHAR_DEL_INSTANCE, + CHAR_INS_INSTANCE, + MAX_CHARACTERDATABASE_STATEMENTS }; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index acc9a53f9f9..121fa09436b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4016,7 +4016,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_INSTANCE_LOCK_BY_GUID); stmt->setUInt64(0, guid); trans->Append(stmt); diff --git a/src/server/game/Instances/InstanceLockMgr.cpp b/src/server/game/Instances/InstanceLockMgr.cpp index 3b66f39eadc..7443a7f192d 100644 --- a/src/server/game/Instances/InstanceLockMgr.cpp +++ b/src/server/game/Instances/InstanceLockMgr.cpp @@ -144,7 +144,7 @@ void InstanceLockMgr::Load() if (sharedDataItr == instanceLockDataById.end()) { TC_LOG_ERROR("instance.locks", "Missing instance data for instance id based lock (id %u)", instanceId); - CharacterDatabase.PQuery("DELETE FROM character_instance_lock WHERE instanceId = %u", instanceId); + CharacterDatabase.PExecute("DELETE FROM character_instance_lock WHERE instanceId = %u", instanceId); continue; } @@ -371,24 +371,24 @@ InstanceLock* InstanceLockMgr::UpdateInstanceLockForPlayer(CharacterDatabaseTran playerGuid.ToString().c_str(), updateEvent.InstanceId); } - // TODO: DB SAVE IN TRANSACTION - trans->PAppend("DELETE FROM character_instance_lock WHERE guid=" UI64FMTD " AND mapId=%u AND lockId=%d", - playerGuid.GetCounter(), - entries.MapDifficulty->MapID, - entries.MapDifficulty->LockID); - std::string escapedData = instanceLock->GetData()->Data; - CharacterDatabase.EscapeString(escapedData); - trans->PAppend("INSERT INTO character_instance_lock (guid, mapId, lockId, instanceId, difficulty, data, completedEncountersMask, entranceWorldSafeLocId, expiryTime, extended) VALUES (" UI64FMTD ", %u, %d, %u, %d, \"%s\", %u, %u, " UI64FMTD ", %d)", - playerGuid.GetCounter(), - entries.MapDifficulty->MapID, - entries.MapDifficulty->LockID, - instanceLock->GetInstanceId(), - entries.MapDifficulty->DifficultyID, - escapedData.c_str(), - instanceLock->GetData()->CompletedEncountersMask, - instanceLock->GetData()->EntranceWorldSafeLocId, - uint64(std::chrono::system_clock::to_time_t(instanceLock->GetExpiryTime())), - instanceLock->IsExtended() ? 1 : 0); + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_INSTANCE_LOCK); + stmt->setUInt64(0, playerGuid.GetCounter()); + stmt->setUInt32(1, entries.MapDifficulty->MapID); + stmt->setUInt32(2, entries.MapDifficulty->LockID); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_INSTANCE_LOCK); + stmt->setUInt64(0, playerGuid.GetCounter()); + stmt->setUInt32(1, entries.MapDifficulty->MapID); + stmt->setUInt32(2, entries.MapDifficulty->LockID); + stmt->setUInt32(3, instanceLock->GetInstanceId()); + stmt->setUInt8(4, entries.MapDifficulty->DifficultyID); + stmt->setString(5, instanceLock->GetData()->Data); + stmt->setUInt32(6, instanceLock->GetData()->CompletedEncountersMask); + stmt->setUInt32(7, instanceLock->GetData()->EntranceWorldSafeLocId); + stmt->setUInt64(8, uint64(std::chrono::system_clock::to_time_t(instanceLock->GetExpiryTime()))); + stmt->setUInt8(9, instanceLock->IsExtended() ? 1 : 0); + trans->Append(stmt); return instanceLock; } @@ -410,15 +410,16 @@ void InstanceLockMgr::UpdateSharedInstanceLock(CharacterDatabaseTransaction tran if (updateEvent.EntranceWorldSafeLocId) sharedData->EntranceWorldSafeLocId = *updateEvent.EntranceWorldSafeLocId; - trans->PAppend("DELETE FROM instance2 WHERE instanceId=%u", - sharedData->InstanceId); - std::string escapedData = sharedData->Data; - CharacterDatabase.EscapeString(escapedData); - trans->PAppend("INSERT INTO instance2 (instanceId, data, completedEncountersMask, entranceWorldSafeLocId) VALUES (%u, \"%s\", %u, %u)", - sharedData->InstanceId, - escapedData.c_str(), - sharedData->CompletedEncountersMask, - sharedData->EntranceWorldSafeLocId); + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INSTANCE); + stmt->setUInt32(0, sharedData->InstanceId); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_INSTANCE); + stmt->setUInt32(0, sharedData->InstanceId); + stmt->setString(1, sharedData->Data); + stmt->setUInt32(2, sharedData->CompletedEncountersMask); + stmt->setUInt32(3, sharedData->EntranceWorldSafeLocId); + trans->Append(stmt); } void InstanceLockMgr::OnSharedInstanceLockDataDelete(uint32 instanceId) @@ -427,7 +428,9 @@ void InstanceLockMgr::OnSharedInstanceLockDataDelete(uint32 instanceId) return; _instanceLockDataById.erase(instanceId); - CharacterDatabase.PExecute("DELETE FROM instance2 WHERE instanceId=%u", instanceId); + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INSTANCE); + stmt->setUInt32(0, instanceId); + CharacterDatabase.Execute(stmt); TC_LOG_DEBUG("instance.locks", "Deleting instance %u as it is no longer referenced by any player", instanceId); } @@ -438,11 +441,13 @@ std::pair<InstanceResetTimePoint, InstanceResetTimePoint> InstanceLockMgr::Updat { InstanceResetTimePoint oldExpiryTime = instanceLock->GetEffectiveExpiryTime(); instanceLock->SetExtended(extended); - CharacterDatabase.PExecute("UPDATE character_instance_lock SET extended = %d WHERE guid = " UI64FMTD " AND mapId = %u AND lockId = %d", - extended ? 1 : 0, - playerGuid.GetCounter(), - entries.MapDifficulty->MapID, - entries.MapDifficulty->LockID); + + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER_INSTANCE_LOCK_EXTENSION); + stmt->setUInt8(0, extended ? 1 : 0); + stmt->setUInt64(1, playerGuid.GetCounter()); + stmt->setUInt32(2, entries.MapDifficulty->MapID); + stmt->setUInt32(3, entries.MapDifficulty->LockID); + CharacterDatabase.Execute(stmt); TC_LOG_DEBUG("instance.locks", "[%u-%s | %u-%s] Instance lock for %s is %s extended", entries.Map->ID, entries.Map->MapName[sWorld->GetDefaultDbcLocale()], |