From 4c27203c8f36dd2a5df0a4ae69fbdc4c9140b29d Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 13 Jan 2017 21:38:03 +0100 Subject: Core/DBLayer: Convert async queries to new query callbacks and remove old callback handling (cherry picked from commit 8e2634b2b49eb814b8cc425a060b2f160dbb49b7) Conflicts: src/server/bnetserver/Server/Session.cpp src/server/bnetserver/Server/Session.h src/server/database/Database/QueryCallback.cpp src/server/game/Handlers/CharacterHandler.cpp src/server/game/Handlers/SocialHandler.cpp src/server/game/Server/WorldSession.cpp src/server/game/Server/WorldSession.h src/server/game/Server/WorldSocket.cpp src/server/game/Server/WorldSocket.h src/server/game/World/World.cpp src/server/game/World/World.h --- src/server/database/Database/QueryCallback.h | 218 +++------------------------ 1 file changed, 20 insertions(+), 198 deletions(-) (limited to 'src/server/database/Database/QueryCallback.h') diff --git a/src/server/database/Database/QueryCallback.h b/src/server/database/Database/QueryCallback.h index 6c4a8a81b4e..f9c93000da7 100644 --- a/src/server/database/Database/QueryCallback.h +++ b/src/server/database/Database/QueryCallback.h @@ -18,27 +18,26 @@ #ifndef _QUERY_CALLBACK_H #define _QUERY_CALLBACK_H -#include #include "QueryResult.h" +#include -typedef std::future QueryResultFuture; -typedef std::promise QueryResultPromise; -typedef std::future PreparedQueryResultFuture; -typedef std::promise PreparedQueryResultPromise; - -#define CALLBACK_STAGE_INVALID uint8(-1) - -class TC_DATABASE_API QueryCallbackNew +class TC_DATABASE_API QueryCallback { public: - explicit QueryCallbackNew(std::future&& result); - explicit QueryCallbackNew(std::future&& result); - QueryCallbackNew(QueryCallbackNew&& right); - QueryCallbackNew& operator=(QueryCallbackNew&& right); - ~QueryCallbackNew(); + explicit QueryCallback(std::future&& result); + explicit QueryCallback(std::future&& result); + QueryCallback(QueryCallback&& right); + QueryCallback& operator=(QueryCallback&& right); + ~QueryCallback(); + + QueryCallback&& WithCallback(std::function&& callback); + QueryCallback&& WithPreparedCallback(std::function&& callback); + + QueryCallback&& WithChainingCallback(std::function&& callback); + QueryCallback&& WithChainingPreparedCallback(std::function&& callback); - QueryCallbackNew&& WithCallback(std::function&& callback); - QueryCallbackNew&& WithPreparedCallback(std::function&& callback); + // Moves std::future from next to this object + void SetNextQuery(QueryCallback&& next); enum Status { @@ -50,11 +49,12 @@ public: Status InvokeIfReady(); private: - QueryCallbackNew(QueryCallbackNew const& right) = delete; - QueryCallbackNew& operator=(QueryCallbackNew const& right) = delete; + QueryCallback(QueryCallback const& right) = delete; + QueryCallback& operator=(QueryCallback const& right) = delete; - template friend void MoveFrom(T& to, T&& from); - template friend void DestroyActiveMember(T& obj); + template friend void ConstructActiveMember(T* obj); + template friend void DestroyActiveMember(T* obj); + template friend void MoveFrom(T* to, T&& from); union { @@ -67,182 +67,4 @@ private: std::queue> _callbacks; }; -template -class QueryCallback -{ - public: - QueryCallback() : _param(), _stage(chain ? 0 : CALLBACK_STAGE_INVALID) { } - - //! The parameter of this function should be a resultset returned from either .AsyncQuery or .AsyncPQuery - void SetFutureResult(std::future value) - { - _result = std::move(value); - } - - std::future& GetFutureResult() - { - return _result; - } - - bool IsReady() - { - return _result.valid() && _result.wait_for(std::chrono::seconds(0)) == std::future_status::ready; - } - - void GetResult(Result& res) - { - res = _result.get(); - } - - void FreeResult() - { - // Nothing to do here, the constructor of std::future will take care of the cleanup - } - - void SetParam(ParamType value) - { - _param = value; - } - - ParamType GetParam() - { - return _param; - } - - //! Resets the stage of the callback chain - void ResetStage() - { - if (!chain) - return; - - _stage = 0; - } - - //! Advances the callback chain to the next stage, so upper level code can act on its results accordingly - void NextStage() - { - if (!chain) - return; - - ++_stage; - } - - //! Returns the callback stage (or CALLBACK_STAGE_INVALID if invalid) - uint8 GetStage() - { - return _stage; - } - - //! Resets all underlying variables (param, result and stage) - void Reset() - { - SetParam(ParamType()); - FreeResult(); - ResetStage(); - } - - private: - std::future _result; - ParamType _param; - uint8 _stage; - - QueryCallback(QueryCallback const& right) = delete; - QueryCallback& operator=(QueryCallback const& right) = delete; -}; - -template -class QueryCallback_2 -{ - public: - QueryCallback_2() : _stage(chain ? 0 : CALLBACK_STAGE_INVALID) { } - - //! The parameter of this function should be a resultset returned from either .AsyncQuery or .AsyncPQuery - void SetFutureResult(std::future value) - { - _result = std::move(value); - } - - std::future& GetFutureResult() - { - return _result; - } - - bool IsReady() - { - return _result.valid() && _result.wait_for(std::chrono::seconds(0)) == std::future_status::ready; - } - - void GetResult(Result& res) - { - res = _result.get(); - } - - void FreeResult() - { - // Nothing to do here, the constructor of std::future will take care of the cleanup - } - - void SetFirstParam(ParamType1 value) - { - _param_1 = value; - } - - void SetSecondParam(ParamType2 value) - { - _param_2 = value; - } - - ParamType1 GetFirstParam() - { - return _param_1; - } - - ParamType2 GetSecondParam() - { - return _param_2; - } - - //! Resets the stage of the callback chain - void ResetStage() - { - if (!chain) - return; - - _stage = 0; - } - - //! Advances the callback chain to the next stage, so upper level code can act on its results accordingly - void NextStage() - { - if (!chain) - return; - - ++_stage; - } - - //! Returns the callback stage (or CALLBACK_STAGE_INVALID if invalid) - uint8 GetStage() - { - return _stage; - } - - //! Resets all underlying variables (param, result and stage) - void Reset() - { - SetFirstParam(NULL); - SetSecondParam(NULL); - FreeResult(); - ResetStage(); - } - - private: - std::future _result; - ParamType1 _param_1; - ParamType2 _param_2; - uint8 _stage; - - QueryCallback_2(QueryCallback_2 const& right) = delete; - QueryCallback_2& operator=(QueryCallback_2 const& right) = delete; -}; - #endif // _QUERY_CALLBACK_H -- cgit v1.2.3