aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-01-17 17:58:11 +0100
committerShauren <shauren.trinity@gmail.com>2022-10-04 00:19:38 +0200
commit4ce1c6cdf419b52b889ad9dac7fb69d0059a1fe6 (patch)
tree13718e7dc010dabb053e9176fc78d19d1a5e59a3 /src
parentcedf09f93c44be2abf1c2b40e0e4c51f95f2975c (diff)
Core/Instances: Add prepared statements for InstanceLockMgr
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp9
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.h8
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Instances/InstanceLockMgr.cpp73
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()],