Core/Databases: Removed ACE dependencies on some of the database handling code.

This commit is contained in:
Subv
2014-06-24 13:17:23 -05:00
parent 0a592dd9db
commit f03d49705d
12 changed files with 72 additions and 76 deletions

View File

@@ -1105,27 +1105,23 @@ void WorldSession::ProcessQueryCallbacks()
PreparedQueryResult result;
//! HandleCharEnumOpcode
if (_charEnumCallback.ready())
if (_charEnumCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
{
_charEnumCallback.get(result);
result = _charEnumCallback.get();
HandleCharEnum(result);
_charEnumCallback.cancel();
}
if (_charCreateCallback.IsReady())
{
_charCreateCallback.GetResult(result);
HandleCharCreateCallback(result, _charCreateCallback.GetParam());
// Don't call FreeResult() here, the callback handler will do that depending on the events in the callback chain
}
//! HandlePlayerLoginOpcode
if (_charLoginCallback.ready())
if (_charLoginCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
{
SQLQueryHolder* param;
_charLoginCallback.get(param);
SQLQueryHolder* param = _charLoginCallback.get();
HandlePlayerLogin((LoginQueryHolder*)param);
_charLoginCallback.cancel();
}
//! HandleAddFriendOpcode
@@ -1147,11 +1143,10 @@ void WorldSession::ProcessQueryCallbacks()
}
//- HandleCharAddIgnoreOpcode
if (_addIgnoreCallback.ready())
if (_addIgnoreCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
{
_addIgnoreCallback.get(result);
result = _addIgnoreCallback.get();
HandleAddIgnoreOpcodeCallBack(result);
_addIgnoreCallback.cancel();
}
//- SendStabledPet
@@ -1164,11 +1159,10 @@ void WorldSession::ProcessQueryCallbacks()
}
//- HandleStablePet
if (_stablePetCallback.ready())
if (_stablePetCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
{
_stablePetCallback.get(result);
result = _stablePetCallback.get();
HandleStablePetCallback(result);
_stablePetCallback.cancel();
}
//- HandleUnstablePet

View File

@@ -2731,7 +2731,7 @@ void World::UpdateRealmCharCount(uint32 accountId)
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_COUNT);
stmt->setUInt32(0, accountId);
PreparedQueryResultFuture result = CharacterDatabase.AsyncQuery(stmt);
m_realmCharCallbacks.insert(result);
m_realmCharCallbacks.push_back(std::move(result));
}
void World::_UpdateRealmCharCount(PreparedQueryResult resultCharCount)
@@ -3088,19 +3088,17 @@ void World::ProcessQueryCallbacks()
{
PreparedQueryResult result;
while (!m_realmCharCallbacks.is_empty())
for (std::deque<std::future<PreparedQueryResult>>::iterator itr = m_realmCharCallbacks.begin(); itr != m_realmCharCallbacks.end(); )
{
ACE_Future<PreparedQueryResult> lResult;
ACE_Time_Value timeout = ACE_Time_Value::zero;
if (m_realmCharCallbacks.next_readable(lResult, &timeout) != 1)
break;
if (lResult.ready())
if ((*itr).wait_for(std::chrono::seconds(0)) != std::future_status::ready)
{
lResult.get(result);
_UpdateRealmCharCount(result);
lResult.cancel();
++itr;
continue;
}
result = (*itr).get();
_UpdateRealmCharCount(result);
itr = m_realmCharCallbacks.erase(itr);
}
}

View File

@@ -839,7 +839,7 @@ class World
void LoadCharacterNameData();
void ProcessQueryCallbacks();
ACE_Future_Set<PreparedQueryResult> m_realmCharCallbacks;
std::deque<std::future<PreparedQueryResult>> m_realmCharCallbacks;
};
extern uint32 realmID;

View File

@@ -25,9 +25,9 @@ m_has_result(false)
m_sql = strdup(sql);
}
BasicStatementTask::BasicStatementTask(const char* sql, QueryResultFuture result) :
BasicStatementTask::BasicStatementTask(const char* sql, QueryResultPromise& result) :
m_has_result(true),
m_result(result)
m_result(std::move(result))
{
m_sql = strdup(sql);
}
@@ -45,11 +45,11 @@ bool BasicStatementTask::Execute()
if (!result || !result->GetRowCount() || !result->NextRow())
{
delete result;
m_result.set(QueryResult(NULL));
m_result.set_value(QueryResult(NULL));
return false;
}
m_result.set(QueryResult(result));
m_result.set_value(QueryResult(result));
return true;
}

View File

@@ -18,24 +18,26 @@
#ifndef _ADHOCSTATEMENT_H
#define _ADHOCSTATEMENT_H
#include <ace/Future.h>
#include <future>
#include "SQLOperation.h"
typedef ACE_Future<QueryResult> QueryResultFuture;
typedef std::future<QueryResult> QueryResultFuture;
typedef std::promise<QueryResult> QueryResultPromise;
/*! Raw, ad-hoc query. */
class BasicStatementTask : public SQLOperation
{
public:
BasicStatementTask(const char* sql);
BasicStatementTask(const char* sql, QueryResultFuture result);
BasicStatementTask(const char* sql, QueryResultPromise& result);
~BasicStatementTask();
bool Execute();
bool Execute() override;
private:
const char* m_sql; //- Raw query to be executed
bool m_has_result;
QueryResultFuture m_result;
QueryResultPromise m_result;
};
#endif

View File

@@ -307,10 +307,10 @@ class DatabaseWorkerPool
//! The return value is then processed in ProcessQueryCallback methods.
QueryResultFuture AsyncQuery(const char* sql)
{
QueryResultFuture res;
QueryResultPromise res;
BasicStatementTask* task = new BasicStatementTask(sql, res);
Enqueue(task);
return res; //! Actual return value has no use yet
return res.get_future(); //! Actual return value has no use yet
}
//! Enqueues a query in string format -with variable args- that will set the value of the QueryResultFuture return object as soon as the query is executed.
@@ -331,10 +331,10 @@ class DatabaseWorkerPool
//! Statement must be prepared with CONNECTION_ASYNC flag.
PreparedQueryResultFuture AsyncQuery(PreparedStatement* stmt)
{
PreparedQueryResultFuture res;
PreparedQueryResultPromise res;
PreparedStatementTask* task = new PreparedStatementTask(stmt, res);
Enqueue(task);
return res;
return res.get_future();
}
//! Enqueues a vector of SQL operations (can be both adhoc and prepared) that will set the value of the QueryResultHolderFuture
@@ -343,10 +343,10 @@ class DatabaseWorkerPool
//! Any prepared statements added to this holder need to be prepared with the CONNECTION_ASYNC flag.
QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder* holder)
{
QueryResultHolderFuture res;
QueryResultHolderPromise res;
SQLQueryHolderTask* task = new SQLQueryHolderTask(holder, res);
Enqueue(task);
return res; //! Fool compiler, has no use yet
return res.get_future(); //! Fool compiler, has no use yet
}
/**

View File

@@ -34,6 +34,8 @@
#include "Timer.h"
#include "Log.h"
#include <ace/OS_NS_unistd.h>
MySQLConnection::MySQLConnection(MySQLConnectionInfo& connInfo) :
m_reconnecting(false),
m_prepareError(false),

View File

@@ -449,10 +449,10 @@ PreparedStatementTask::PreparedStatementTask(PreparedStatement* stmt) :
m_stmt(stmt),
m_has_result(false) { }
PreparedStatementTask::PreparedStatementTask(PreparedStatement* stmt, PreparedQueryResultFuture result) :
PreparedStatementTask::PreparedStatementTask(PreparedStatement* stmt, PreparedQueryResultPromise& result) :
m_stmt(stmt),
m_has_result(true),
m_result(result) { }
m_result(std::move(result)) { }
PreparedStatementTask::~PreparedStatementTask()
@@ -468,10 +468,10 @@ bool PreparedStatementTask::Execute()
if (!result || !result->GetRowCount())
{
delete result;
m_result.set(PreparedQueryResult(NULL));
m_result.set_value(PreparedQueryResult(NULL));
return false;
}
m_result.set(PreparedQueryResult(result));
m_result.set_value(PreparedQueryResult(result));
return true;
}

View File

@@ -18,8 +18,8 @@
#ifndef _PREPAREDSTATEMENT_H
#define _PREPAREDSTATEMENT_H
#include <future>
#include "SQLOperation.h"
#include <ace/Future.h>
#ifdef __APPLE__
#undef TYPE_BOOL
@@ -153,14 +153,15 @@ class MySQLPreparedStatement
MySQLPreparedStatement& operator=(MySQLPreparedStatement const& right) = delete;
};
typedef ACE_Future<PreparedQueryResult> PreparedQueryResultFuture;
typedef std::future<PreparedQueryResult> PreparedQueryResultFuture;
typedef std::promise<PreparedQueryResult> PreparedQueryResultPromise;
//- Lower-level class, enqueuable operation
class PreparedStatementTask : public SQLOperation
{
public:
PreparedStatementTask(PreparedStatement* stmt);
PreparedStatementTask(PreparedStatement* stmt, PreparedQueryResultFuture result);
PreparedStatementTask(PreparedStatement* stmt, PreparedQueryResultPromise& result);
~PreparedStatementTask();
bool Execute();
@@ -168,6 +169,6 @@ class PreparedStatementTask : public SQLOperation
protected:
PreparedStatement* m_stmt;
bool m_has_result;
PreparedQueryResultFuture m_result;
PreparedQueryResultPromise m_result;
};
#endif

View File

@@ -168,9 +168,6 @@ void SQLQueryHolder::SetSize(size_t size)
bool SQLQueryHolderTask::Execute()
{
//the result can't be ready as we are processing it right now
ASSERT(!m_result.ready());
if (!m_holder)
return false;
@@ -202,6 +199,6 @@ bool SQLQueryHolderTask::Execute()
}
}
m_result.set(m_holder);
m_result.set_value(m_holder);
return true;
}

View File

@@ -18,7 +18,7 @@
#ifndef _QUERYHOLDER_H
#define _QUERYHOLDER_H
#include <ace/Future.h>
#include <future>
class SQLQueryHolder
{
@@ -39,17 +39,18 @@ class SQLQueryHolder
void SetPreparedResult(size_t index, PreparedResultSet* result);
};
typedef ACE_Future<SQLQueryHolder*> QueryResultHolderFuture;
typedef std::future<SQLQueryHolder*> QueryResultHolderFuture;
typedef std::promise<SQLQueryHolder*> QueryResultHolderPromise;
class SQLQueryHolderTask : public SQLOperation
{
private:
SQLQueryHolder * m_holder;
QueryResultHolderFuture m_result;
QueryResultHolderPromise m_result;
public:
SQLQueryHolderTask(SQLQueryHolder *holder, QueryResultHolderFuture res)
: m_holder(holder), m_result(res){ };
SQLQueryHolderTask(SQLQueryHolder *holder, QueryResultHolderPromise& res)
: m_holder(holder), m_result(std::move(res)){ };
bool Execute();
};

View File

@@ -18,12 +18,13 @@
#ifndef _CALLBACK_H
#define _CALLBACK_H
#include <ace/Future.h>
#include <ace/Future_Set.h>
#include <future>
#include "QueryResult.h"
typedef ACE_Future<QueryResult> QueryResultFuture;
typedef ACE_Future<PreparedQueryResult> PreparedQueryResultFuture;
typedef std::future<QueryResult> QueryResultFuture;
typedef std::promise<QueryResult> QueryResultPromise;
typedef std::future<PreparedQueryResult> PreparedQueryResultFuture;
typedef std::promise<PreparedQueryResult> PreparedQueryResultPromise;
/*! A simple template using ACE_Future to manage callbacks from the thread and object that
issued the request. <ParamType> is variable type of parameter that is used as parameter
@@ -38,29 +39,29 @@ class QueryCallback
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(ACE_Future<Result> value)
void SetFutureResult(std::future<Result>& value)
{
_result = value;
_result = std::move(value);
}
ACE_Future<Result> GetFutureResult()
std::future<Result>& GetFutureResult()
{
return _result;
}
int IsReady()
{
return _result.ready();
return _result.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
}
void GetResult(Result& res)
{
_result.get(res);
res = _result.get();
}
void FreeResult()
{
_result.cancel();
// Nothing to do here, the constructor of std::future will take care of the cleanup
}
void SetParam(ParamType value)
@@ -106,7 +107,7 @@ class QueryCallback
}
private:
ACE_Future<Result> _result;
std::future<Result> _result;
ParamType _param;
uint8 _stage;
@@ -121,29 +122,29 @@ class QueryCallback_2
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(ACE_Future<Result> value)
void SetFutureResult(std::future<Result>& value)
{
_result = value;
_result = std::move(value);
}
ACE_Future<Result> GetFutureResult()
std::future<Result>& GetFutureResult()
{
return _result;
}
int IsReady()
{
return _result.ready();
return _result.wait_for(std::chrono::seconds(0)) == std::future_status::ready;
}
void GetResult(Result& res)
{
_result.get(res);
res = _result.get();
}
void FreeResult()
{
_result.cancel();
// Nothing to do here, the constructor of std::future will take care of the cleanup
}
void SetFirstParam(ParamType1 value)
@@ -200,7 +201,7 @@ class QueryCallback_2
}
private:
ACE_Future<Result> _result;
std::future<Result> _result;
ParamType1 _param_1;
ParamType2 _param_2;
uint8 _stage;