Core/Instances: Add prepared statements for InstanceLockMgr

This commit is contained in:
Shauren
2021-01-17 17:58:11 +01:00
parent cedf09f93c
commit 4ce1c6cdf4
4 changed files with 55 additions and 37 deletions

View File

@@ -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)

View File

@@ -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
};

View File

@@ -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);

View File

@@ -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()],