Core/DBLayer: Convert callback queries to prepared statements No. 3

This commit is contained in:
leak
2011-12-25 01:27:44 +01:00
parent 275aa8a7d8
commit 08bd2f1a54
5 changed files with 60 additions and 46 deletions
@@ -519,14 +519,17 @@ void WorldSession::HandleListStabledPetsOpcode(WorldPacket & recv_data)
void WorldSession::SendStablePet(uint64 guid) void WorldSession::SendStablePet(uint64 guid)
{ {
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_PET_SLOTS_DETAIL);
stmt->setUInt32(0, _player->GetGUIDLow());
stmt->setUInt8(1, PET_SAVE_FIRST_STABLE_SLOT);
stmt->setUInt8(2, PET_SAVE_LAST_STABLE_SLOT);
_sendStabledPetCallback.SetParam(guid); _sendStabledPetCallback.SetParam(guid);
_sendStabledPetCallback.SetFutureResult( _sendStabledPetCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
CharacterDatabase.AsyncPQuery("SELECT owner, id, entry, level, name FROM character_pet WHERE owner = '%u' AND slot >= '%u' AND slot <= '%u' ORDER BY slot",
_player->GetGUIDLow(), PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT)
);
} }
void WorldSession::SendStablePetCallback(QueryResult result, uint64 guid) void WorldSession::SendStablePetCallback(PreparedQueryResult result, uint64 guid)
{ {
if (!GetPlayer()) if (!GetPlayer())
return; return;
@@ -679,14 +682,18 @@ void WorldSession::HandleUnstablePet(WorldPacket & recv_data)
if (GetPlayer()->HasUnitState(UNIT_STAT_DIED)) if (GetPlayer()->HasUnitState(UNIT_STAT_DIED))
GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_PET_ENTRY);
stmt->setUInt32(0, _player->GetGUIDLow());
stmt->setUInt32(1, petnumber);
stmt->setUInt8(2, PET_SAVE_FIRST_STABLE_SLOT);
stmt->setUInt8(3, PET_SAVE_LAST_STABLE_SLOT);
_unstablePetCallback.SetParam(petnumber); _unstablePetCallback.SetParam(petnumber);
_unstablePetCallback.SetFutureResult( _unstablePetCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
CharacterDatabase.AsyncPQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot >='%u' AND slot <= '%u'",
_player->GetGUIDLow(), petnumber, PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT)
);
} }
void WorldSession::HandleUnstablePetCallback(QueryResult result, uint32 petnumber) void WorldSession::HandleUnstablePetCallback(PreparedQueryResult result, uint32 petnumber)
{ {
if (!GetPlayer()) if (!GetPlayer())
return; return;
@@ -780,9 +787,9 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data)
{ {
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recv CMSG_STABLE_SWAP_PET."); sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recv CMSG_STABLE_SWAP_PET.");
uint64 npcGUID; uint64 npcGUID;
uint32 pet_number; uint32 petId;
recv_data >> npcGUID >> pet_number; recv_data >> npcGUID >> petId;
if (!CheckStableMaster(npcGUID)) if (!CheckStableMaster(npcGUID))
{ {
@@ -802,15 +809,18 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data)
return; return;
} }
// find swapped pet slot in stable // Find swapped pet slot in stable
_stableSwapCallback.SetParam(pet_number);
_stableSwapCallback.SetFutureResult( PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_PET_SLOT_BY_ID);
CharacterDatabase.AsyncPQuery("SELECT slot, entry FROM character_pet WHERE owner = '%u' AND id = '%u'",
_player->GetGUIDLow(), pet_number) stmt->setUInt32(0, _player->GetGUIDLow());
); stmt->setUInt32(1, petId);
_stableSwapCallback.SetParam(petId);
_stableSwapCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
} }
void WorldSession::HandleStableSwapPetCallback(QueryResult result, uint32 petnumber) void WorldSession::HandleStableSwapPetCallback(PreparedQueryResult result, uint32 petId)
{ {
if (!GetPlayer()) if (!GetPlayer())
return; return;
@@ -824,15 +834,15 @@ void WorldSession::HandleStableSwapPetCallback(QueryResult result, uint32 petnum
Field* fields = result->Fetch(); Field* fields = result->Fetch();
uint32 slot = fields[0].GetUInt8(); uint32 slot = fields[0].GetUInt8();
uint32 creature_id = fields[1].GetUInt32(); uint32 petEntry = fields[1].GetUInt32();
if (!creature_id) if (!petEntry)
{ {
SendStableResult(STABLE_ERR_STABLE); SendStableResult(STABLE_ERR_STABLE);
return; return;
} }
CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creature_id); CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(petEntry);
if (!creatureInfo || !creatureInfo->isTameable(_player->CanTameExoticPets())) if (!creatureInfo || !creatureInfo->isTameable(_player->CanTameExoticPets()))
{ {
// if problem in exotic pet // if problem in exotic pet
@@ -850,7 +860,7 @@ void WorldSession::HandleStableSwapPetCallback(QueryResult result, uint32 petnum
// summon unstabled pet // summon unstabled pet
Pet* newpet = new Pet(_player); Pet* newpet = new Pet(_player);
if (!newpet->LoadPetFromDB(_player, creature_id, petnumber)) if (!newpet->LoadPetFromDB(_player, petEntry, petId))
{ {
delete newpet; delete newpet;
SendStableResult(STABLE_ERR_STABLE); SendStableResult(STABLE_ERR_STABLE);
+13 -15
View File
@@ -1008,22 +1008,20 @@ void WorldSession::InitializeQueryCallbackParameters()
void WorldSession::ProcessQueryCallbacks() void WorldSession::ProcessQueryCallbacks()
{ {
QueryResult result; PreparedQueryResult result;
PreparedQueryResult result2;
//! HandleCharEnumOpcode //! HandleCharEnumOpcode
if (_charEnumCallback.ready()) if (_charEnumCallback.ready())
{ {
_charEnumCallback.get(result2); _charEnumCallback.get(result);
HandleCharEnum(result2); HandleCharEnum(result);
_charEnumCallback.cancel(); _charEnumCallback.cancel();
} }
if (_charCreateCallback.IsReady()) if (_charCreateCallback.IsReady())
{ {
PreparedQueryResult pResult; _charCreateCallback.GetResult(result);
_charCreateCallback.GetResult(pResult); HandleCharCreateCallback(result, _charCreateCallback.GetParam());
HandleCharCreateCallback(pResult, _charCreateCallback.GetParam());
// Don't call FreeResult() here, the callback handler will do that depending on the events in the callback chain // Don't call FreeResult() here, the callback handler will do that depending on the events in the callback chain
} }
@@ -1040,8 +1038,8 @@ void WorldSession::ProcessQueryCallbacks()
if (_addFriendCallback.IsReady()) if (_addFriendCallback.IsReady())
{ {
std::string param = _addFriendCallback.GetParam(); std::string param = _addFriendCallback.GetParam();
_addFriendCallback.GetResult(result2); _addFriendCallback.GetResult(result);
HandleAddFriendOpcodeCallBack(result2, param); HandleAddFriendOpcodeCallBack(result, param);
_addFriendCallback.FreeResult(); _addFriendCallback.FreeResult();
} }
@@ -1049,16 +1047,16 @@ void WorldSession::ProcessQueryCallbacks()
if (_charRenameCallback.IsReady()) if (_charRenameCallback.IsReady())
{ {
std::string param = _charRenameCallback.GetParam(); std::string param = _charRenameCallback.GetParam();
_charRenameCallback.GetResult(result2); _charRenameCallback.GetResult(result);
HandleChangePlayerNameOpcodeCallBack(result2, param); HandleChangePlayerNameOpcodeCallBack(result, param);
_charRenameCallback.FreeResult(); _charRenameCallback.FreeResult();
} }
//- HandleCharAddIgnoreOpcode //- HandleCharAddIgnoreOpcode
if (_addIgnoreCallback.ready()) if (_addIgnoreCallback.ready())
{ {
_addIgnoreCallback.get(result2); _addIgnoreCallback.get(result);
HandleAddIgnoreOpcodeCallBack(result2); HandleAddIgnoreOpcodeCallBack(result);
_addIgnoreCallback.cancel(); _addIgnoreCallback.cancel();
} }
@@ -1074,8 +1072,8 @@ void WorldSession::ProcessQueryCallbacks()
//- HandleStablePet //- HandleStablePet
if (_stablePetCallback.ready()) if (_stablePetCallback.ready())
{ {
_stablePetCallback.get(result2); _stablePetCallback.get(result);
HandleStablePetCallback(result2); HandleStablePetCallback(result);
_stablePetCallback.cancel(); _stablePetCallback.cancel();
} }
+6 -6
View File
@@ -301,7 +301,7 @@ class WorldSession
// Pet // Pet
void SendPetNameQuery(uint64 guid, uint32 petnumber); void SendPetNameQuery(uint64 guid, uint32 petnumber);
void SendStablePet(uint64 guid); void SendStablePet(uint64 guid);
void SendStablePetCallback(QueryResult result, uint64 guid); void SendStablePetCallback(PreparedQueryResult result, uint64 guid);
void SendStableResult(uint8 guid); void SendStableResult(uint8 guid);
bool CheckStableMaster(uint64 guid); bool CheckStableMaster(uint64 guid);
@@ -587,11 +587,11 @@ class WorldSession
void HandleStablePet(WorldPacket& recvPacket); void HandleStablePet(WorldPacket& recvPacket);
void HandleStablePetCallback(PreparedQueryResult result); void HandleStablePetCallback(PreparedQueryResult result);
void HandleUnstablePet(WorldPacket& recvPacket); void HandleUnstablePet(WorldPacket& recvPacket);
void HandleUnstablePetCallback(QueryResult result, uint32 petnumber); void HandleUnstablePetCallback(PreparedQueryResult result, uint32 petnumber);
void HandleBuyStableSlot(WorldPacket& recvPacket); void HandleBuyStableSlot(WorldPacket& recvPacket);
void HandleStableRevivePet(WorldPacket& recvPacket); void HandleStableRevivePet(WorldPacket& recvPacket);
void HandleStableSwapPet(WorldPacket& recvPacket); void HandleStableSwapPet(WorldPacket& recvPacket);
void HandleStableSwapPetCallback(QueryResult result, uint32 petnumber); void HandleStableSwapPetCallback(PreparedQueryResult result, uint32 petId);
void HandleDuelAcceptedOpcode(WorldPacket& recvPacket); void HandleDuelAcceptedOpcode(WorldPacket& recvPacket);
void HandleDuelCancelledOpcode(WorldPacket& recvPacket); void HandleDuelCancelledOpcode(WorldPacket& recvPacket);
@@ -898,9 +898,9 @@ class WorldSession
PreparedQueryResultFuture _stablePetCallback; PreparedQueryResultFuture _stablePetCallback;
QueryCallback<PreparedQueryResult, std::string> _charRenameCallback; QueryCallback<PreparedQueryResult, std::string> _charRenameCallback;
QueryCallback<PreparedQueryResult, std::string> _addFriendCallback; QueryCallback<PreparedQueryResult, std::string> _addFriendCallback;
QueryCallback<QueryResult, uint32> _unstablePetCallback; QueryCallback<PreparedQueryResult, uint32> _unstablePetCallback;
QueryCallback<QueryResult, uint32> _stableSwapCallback; QueryCallback<PreparedQueryResult, uint32> _stableSwapCallback;
QueryCallback<QueryResult, uint64> _sendStabledPetCallback; QueryCallback<PreparedQueryResult, uint64> _sendStabledPetCallback;
QueryCallback<PreparedQueryResult, CharacterCreateInfo*, true> _charCreateCallback; QueryCallback<PreparedQueryResult, CharacterCreateInfo*, true> _charCreateCallback;
QueryResultHolderFuture _charLoginCallback; QueryResultHolderFuture _charLoginCallback;
@@ -39,6 +39,9 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_GET_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_GET_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_GET_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_GET_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_GET_PET_SLOTS, "SELECT owner, slot FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_GET_PET_SLOTS, "SELECT owner, slot FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_GET_PET_SLOTS_DETAIL, "SELECT owner, id, entry, level, name FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_GET_PET_ENTRY, "SELECT entry FROM character_pet WHERE owner = ? AND id = ? AND slot >= ? AND slot <= ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_GET_PET_SLOT_BY_ID, "SELECT slot, entry FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_GET_FREE_NAME, "SELECT guid, name FROM characters WHERE guid = ? AND account = ? AND (at_login & ?) = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_GET_FREE_NAME, "SELECT guid, name FROM characters WHERE guid = ? AND account = ? AND (at_login & ?) = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_GET_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_ASYNC); PREPARE_STATEMENT(CHAR_GET_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_ASYNC);
@@ -59,6 +59,9 @@ enum CharacterDatabaseStatements
CHAR_GET_ENUM, CHAR_GET_ENUM,
CHAR_GET_ENUM_DECLINED_NAME, CHAR_GET_ENUM_DECLINED_NAME,
CHAR_GET_PET_SLOTS, CHAR_GET_PET_SLOTS,
CHAR_GET_PET_SLOTS_DETAIL,
CHAR_GET_PET_ENTRY,
CHAR_GET_PET_SLOT_BY_ID,
CHAR_GET_FREE_NAME, CHAR_GET_FREE_NAME,
CHAR_GET_GUID_RACE_ACC_BY_NAME, CHAR_GET_GUID_RACE_ACC_BY_NAME,
CHAR_LOAD_PLAYER, CHAR_LOAD_PLAYER,