diff options
Diffstat (limited to 'src/server/database/Database/QueryCallback.h')
-rw-r--r-- | src/server/database/Database/QueryCallback.h | 218 |
1 files changed, 20 insertions, 198 deletions
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 <future> #include "QueryResult.h" +#include <future> -typedef std::future<QueryResult> QueryResultFuture; -typedef std::promise<QueryResult> QueryResultPromise; -typedef std::future<PreparedQueryResult> PreparedQueryResultFuture; -typedef std::promise<PreparedQueryResult> PreparedQueryResultPromise; - -#define CALLBACK_STAGE_INVALID uint8(-1) - -class TC_DATABASE_API QueryCallbackNew +class TC_DATABASE_API QueryCallback { public: - explicit QueryCallbackNew(std::future<QueryResult>&& result); - explicit QueryCallbackNew(std::future<PreparedQueryResult>&& result); - QueryCallbackNew(QueryCallbackNew&& right); - QueryCallbackNew& operator=(QueryCallbackNew&& right); - ~QueryCallbackNew(); + explicit QueryCallback(std::future<QueryResult>&& result); + explicit QueryCallback(std::future<PreparedQueryResult>&& result); + QueryCallback(QueryCallback&& right); + QueryCallback& operator=(QueryCallback&& right); + ~QueryCallback(); + + QueryCallback&& WithCallback(std::function<void(QueryResult)>&& callback); + QueryCallback&& WithPreparedCallback(std::function<void(PreparedQueryResult)>&& callback); + + QueryCallback&& WithChainingCallback(std::function<void(QueryCallback&, QueryResult)>&& callback); + QueryCallback&& WithChainingPreparedCallback(std::function<void(QueryCallback&, PreparedQueryResult)>&& callback); - QueryCallbackNew&& WithCallback(std::function<void(QueryResult)>&& callback); - QueryCallbackNew&& WithPreparedCallback(std::function<void(PreparedQueryResult)>&& 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<typename T> friend void MoveFrom(T& to, T&& from); - template<typename T> friend void DestroyActiveMember(T& obj); + template<typename T> friend void ConstructActiveMember(T* obj); + template<typename T> friend void DestroyActiveMember(T* obj); + template<typename T> friend void MoveFrom(T* to, T&& from); union { @@ -67,182 +67,4 @@ private: std::queue<QueryCallbackData, std::list<QueryCallbackData>> _callbacks; }; -template <typename Result, typename ParamType, bool chain = false> -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<Result> value) - { - _result = std::move(value); - } - - std::future<Result>& 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> _result; - ParamType _param; - uint8 _stage; - - QueryCallback(QueryCallback const& right) = delete; - QueryCallback& operator=(QueryCallback const& right) = delete; -}; - -template <typename Result, typename ParamType1, typename ParamType2, bool chain = false> -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<Result> value) - { - _result = std::move(value); - } - - std::future<Result>& 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> _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 |