diff options
author | Machiavelli <none@none> | 2010-08-25 21:03:28 +0200 |
---|---|---|
committer | Machiavelli <none@none> | 2010-08-25 21:03:28 +0200 |
commit | bb5f7b64927713911331f81f9c0a5abc33e0c3ab (patch) | |
tree | 976f2ec685f066cc3540acd6ba01472eeb3de5ed /src | |
parent | 91ebad0016d102ee9a10c5804ace08b41e6ac4e2 (diff) |
More async queries in stable master opcode handlers instead of blocking queries
Please report any issues that pop up.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Server/Protocol/Handlers/NPCHandler.cpp | 52 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 6 |
3 files changed, 67 insertions, 17 deletions
diff --git a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp index 0619b98684e..aa05a964ebe 100644 --- a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp @@ -613,10 +613,14 @@ void WorldSession::HandleStablePet(WorldPacket & recv_data) return; } - uint32 free_slot = 1; - - QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT owner,slot,id FROM character_pet WHERE owner = '%u' AND slot >= '%u' AND slot <= '%u' ORDER BY slot ", + m_stablePetCallback = CharacterDatabase.AsyncPQuery("SELECT owner,slot,id 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::HandleStablePetCallback(QueryResult_AutoPtr result) +{ + uint32 free_slot = 1; if (result) { do @@ -631,13 +635,14 @@ void WorldSession::HandleStablePet(WorldPacket & recv_data) // this slot not free, skip ++free_slot; - }while (result->NextRow()); + } + while (result->NextRow()); } WorldPacket data(SMSG_STABLE_RESULT, 1); if (free_slot > 0 && free_slot <= GetPlayer()->m_stableSlots) { - _player->RemovePet(pet,PetSaveMode(free_slot)); + _player->RemovePet(_player->GetPet(), PetSaveMode(free_slot)); SendStableResult(STABLE_SUCCESS_STABLE); } else @@ -662,16 +667,20 @@ void WorldSession::HandleUnstablePet(WorldPacket & recv_data) if (GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); - uint32 creature_id = 0; + m_unstablePetCallback.SetParam(petnumber); + m_unstablePetCallback.SetFutureResult( + 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_AutoPtr result, uint32 petnumber) +{ + uint32 creature_id = 0; + if (result) { - QueryResult_AutoPtr result = CharacterDatabase.PQuery("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); - if (result) - { - Field *fields = result->Fetch(); - creature_id = fields[0].GetUInt32(); - } + Field *fields = result->Fetch(); + creature_id = fields[0].GetUInt32(); } if (!creature_id) @@ -779,8 +788,15 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data) } // find swapped pet slot in stable - QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT slot,entry FROM character_pet WHERE owner = '%u' AND id = '%u'", - _player->GetGUIDLow(),pet_number); + m_stableSwapCallback.SetParam(pet_number); + m_stableSwapCallback.SetFutureResult( + CharacterDatabase.PQuery("SELECT slot,entry FROM character_pet WHERE owner = '%u' AND id = '%u'", + _player->GetGUIDLow(), pet_number) + ); +} + +void WorldSession::HandleStableSwapPetCallback(QueryResult_AutoPtr result, uint32 petnumber) +{ if (!result) { SendStableResult(STABLE_ERR_STABLE); @@ -810,11 +826,13 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data) } // move alive pet to slot or delete dead pet - _player->RemovePet(pet,pet->isAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED); + Pet* pet = _player->GetPet(); + + _player->RemovePet(pet, pet->isAlive() ? PetSaveMode(slot) : PET_SAVE_AS_DELETED); // summon unstabled pet Pet *newpet = new Pet(_player); - if (!newpet->LoadPetFromDB(_player,creature_id,pet_number)) + if (!newpet->LoadPetFromDB(_player,creature_id, petnumber)) { delete newpet; SendStableResult(STABLE_ERR_STABLE); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index f77b1c0e2c8..f68cf739947 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -1024,4 +1024,30 @@ void WorldSession::ProcessQueryCallbacks() SendStablePetCallback(result, param); m_sendStabledPetCallback.FreeResult(); } + + //- HandleStablePet + if (m_stablePetCallback.ready()) + { + m_stablePetCallback.get(result); + HandleStablePetCallback(result); + m_stablePetCallback.cancel(); + } + + //- HandleUnstablePet + if (m_unstablePetCallback.IsReady()) + { + uint32 param = m_unstablePetCallback.GetParam(); + m_unstablePetCallback.GetResult(result); + HandleUnstablePetCallback(result, param); + m_unstablePetCallback.FreeResult(); + } + + //- HandleStableSwapPet + if (m_stableSwapCallback.IsReady()) + { + uint32 param = m_stableSwapCallback.GetParam(); + m_stableSwapCallback.GetResult(result); + HandleStableSwapPetCallback(result, param); + m_stableSwapCallback.FreeResult(); + } } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index b19cfea9f5e..ccc97fad75b 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -508,10 +508,13 @@ class WorldSession void HandleBinderActivateOpcode(WorldPacket& recvPacket); void HandleListStabledPetsOpcode(WorldPacket& recvPacket); void HandleStablePet(WorldPacket& recvPacket); + void HandleStablePetCallback(QueryResult_AutoPtr result); void HandleUnstablePet(WorldPacket& recvPacket); + void HandleUnstablePetCallback(QueryResult_AutoPtr result, uint32 petnumber); void HandleBuyStableSlot(WorldPacket& recvPacket); void HandleStableRevivePet(WorldPacket& recvPacket); void HandleStableSwapPet(WorldPacket& recvPacket); + void HandleStableSwapPetCallback(QueryResult_AutoPtr result, uint32 petnumber); void HandleDuelAcceptedOpcode(WorldPacket& recvPacket); void HandleDuelCancelledOpcode(WorldPacket& recvPacket); @@ -804,8 +807,11 @@ class WorldSession ACE_Future_Set<QueryResult_AutoPtr> m_nameQueryCallbacks; QueryResultFuture m_charEnumCallback; QueryResultFuture m_addIgnoreCallback; + QueryResultFuture m_stablePetCallback; QueryCallback<std::string> m_charRenameCallback; QueryCallback<std::string> m_addFriendCallback; + QueryCallback<uint32> m_unstablePetCallback; + QueryCallback<uint32> m_stableSwapCallback; QueryCallback<uint64> m_sendStabledPetCallback; QueryResultHolderFuture m_charLoginCallback; |