From fcabeed7544285f3244465ccfc5337c59e63c6b0 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 11 Jan 2017 23:45:03 +0100 Subject: Core/DBLayer: Added new async query callback api --- src/server/database/Database/QueryCallback.cpp | 98 ++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/server/database/Database/QueryCallback.cpp (limited to 'src/server/database/Database/QueryCallback.cpp') diff --git a/src/server/database/Database/QueryCallback.cpp b/src/server/database/Database/QueryCallback.cpp new file mode 100644 index 00000000000..92bb80a0b60 --- /dev/null +++ b/src/server/database/Database/QueryCallback.cpp @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2008-2017 TrinityCore + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "QueryCallback.h" + +QueryCallbackNew::QueryCallbackNew(std::future&& result) : _string(std::move(result)), _isPrepared(false) +{ +} + +QueryCallbackNew::QueryCallbackNew(std::future&& result) : _prepared(std::move(result)), _isPrepared(true) +{ +} + +QueryCallbackNew::QueryCallbackNew(QueryCallbackNew&& right) +{ + MoveFrom(std::move(right)); +} + +QueryCallbackNew& QueryCallbackNew::operator=(QueryCallbackNew&& right) +{ + MoveFrom(std::move(right)); + return *this; +} + +QueryCallbackNew::~QueryCallbackNew() +{ + DestroyCurrentMember(); +} + +QueryCallbackNew&& QueryCallbackNew::WithCallback(std::function&& callback) +{ + ASSERT(!_isPrepared, "Attempted to set callback function for string query on a prepared async query"); + _string.Callback = std::move(callback); + return std::move(*this); +} + +QueryCallbackNew&& QueryCallbackNew::WithPreparedCallback(std::function&& callback) +{ + ASSERT(_isPrepared, "Attempted to set callback function for prepared query on a string async query"); + _prepared.Callback = std::move(callback); + return std::move(*this); +} + +QueryCallbackNew::Status QueryCallbackNew::InvokeIfReady() +{ + if (!_isPrepared) + { + if (_string.Result.valid() && _string.Result.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + { + std::function cb(std::move(_string.Callback)); + cb(_string.Result.get()); + return !_string.Callback ? Completed : NextStep; + } + } + else + { + if (_prepared.Result.valid() && _prepared.Result.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + { + std::function cb(std::move(_prepared.Callback)); + cb(_prepared.Result.get()); + return !_prepared.Callback ? Completed : NextStep; + } + } + + return NotReady; +} + +void QueryCallbackNew::MoveFrom(QueryCallbackNew&& other) +{ + DestroyCurrentMember(); + _isPrepared = other._isPrepared; + if (!_isPrepared) + _string = std::move(other._string); + else + _prepared = std::move(other._prepared); +} + +void QueryCallbackNew::DestroyCurrentMember() +{ + if (!_isPrepared) + _string.~String(); + else + _prepared.~Prepared(); +} -- cgit v1.2.3