diff options
Diffstat (limited to 'src/server/database/Database')
| -rw-r--r-- | src/server/database/Database/DatabaseEnvFwd.h | 2 | ||||
| -rw-r--r-- | src/server/database/Database/DatabaseWorkerPool.cpp | 2 | ||||
| -rw-r--r-- | src/server/database/Database/DatabaseWorkerPool.h | 2 | ||||
| -rw-r--r-- | src/server/database/Database/QueryHolder.cpp | 11 | ||||
| -rw-r--r-- | src/server/database/Database/QueryHolder.h | 19 |
5 files changed, 34 insertions, 2 deletions
diff --git a/src/server/database/Database/DatabaseEnvFwd.h b/src/server/database/Database/DatabaseEnvFwd.h index f85035cc83a..c72df398cd0 100644 --- a/src/server/database/Database/DatabaseEnvFwd.h +++ b/src/server/database/Database/DatabaseEnvFwd.h @@ -86,6 +86,8 @@ using HotfixDatabaseQueryHolder = SQLQueryHolder<HotfixDatabaseConnection>; using LoginDatabaseQueryHolder = SQLQueryHolder<LoginDatabaseConnection>; using WorldDatabaseQueryHolder = SQLQueryHolder<WorldDatabaseConnection>; +class SQLQueryHolderCallback; + // mysql struct MySQLHandle; struct MySQLResult; diff --git a/src/server/database/Database/DatabaseWorkerPool.cpp b/src/server/database/Database/DatabaseWorkerPool.cpp index 53ca065136e..facb10a5972 100644 --- a/src/server/database/Database/DatabaseWorkerPool.cpp +++ b/src/server/database/Database/DatabaseWorkerPool.cpp @@ -227,7 +227,7 @@ QueryCallback DatabaseWorkerPool<T>::AsyncQuery(PreparedStatement<T>* stmt) } template <class T> -QueryResultHolderFuture DatabaseWorkerPool<T>::DelayQueryHolder(SQLQueryHolder<T>* holder) +SQLQueryHolderCallback DatabaseWorkerPool<T>::DelayQueryHolder(SQLQueryHolder<T>* holder) { SQLQueryHolderTask* task = new SQLQueryHolderTask(holder); // Store future result before enqueueing - task might get already processed and deleted before returning from this method diff --git a/src/server/database/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h index 13d52f99539..f46c0e29c04 100644 --- a/src/server/database/Database/DatabaseWorkerPool.h +++ b/src/server/database/Database/DatabaseWorkerPool.h @@ -160,7 +160,7 @@ class DatabaseWorkerPool //! return object as soon as the query is executed. //! The return value is then processed in ProcessQueryCallback methods. //! Any prepared statements added to this holder need to be prepared with the CONNECTION_ASYNC flag. - QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder<T>* holder); + SQLQueryHolderCallback DelayQueryHolder(SQLQueryHolder<T>* holder); /** Transaction context methods. diff --git a/src/server/database/Database/QueryHolder.cpp b/src/server/database/Database/QueryHolder.cpp index dacd12913da..eb9dbdcca22 100644 --- a/src/server/database/Database/QueryHolder.cpp +++ b/src/server/database/Database/QueryHolder.cpp @@ -92,3 +92,14 @@ bool SQLQueryHolderTask::Execute() m_result.set_value(m_holder); return true; } + +bool SQLQueryHolderCallback::InvokeIfReady() +{ + if (m_future.valid() && m_future.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + { + m_callback(m_future.get()); + return true; + } + + return false; +} diff --git a/src/server/database/Database/QueryHolder.h b/src/server/database/Database/QueryHolder.h index fe4a0e78331..f94eff49d2c 100644 --- a/src/server/database/Database/QueryHolder.h +++ b/src/server/database/Database/QueryHolder.h @@ -63,4 +63,23 @@ class TC_DATABASE_API SQLQueryHolderTask : public SQLOperation QueryResultHolderFuture GetFuture() { return m_result.get_future(); } }; +class TC_DATABASE_API SQLQueryHolderCallback +{ +public: + SQLQueryHolderCallback(QueryResultHolderFuture&& future) : m_future(std::move(future)) { } + SQLQueryHolderCallback(SQLQueryHolderCallback&&) = default; + + SQLQueryHolderCallback& operator=(SQLQueryHolderCallback&&) = default; + + void AfterComplete(std::function<void(SQLQueryHolderBase*)> callback) & + { + m_callback = std::move(callback); + } + + bool InvokeIfReady(); + + QueryResultHolderFuture m_future; + std::function<void(SQLQueryHolderBase*)> m_callback; +}; + #endif |
