diff options
Diffstat (limited to 'src/server/database/Database/Transaction.h')
-rw-r--r-- | src/server/database/Database/Transaction.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/server/database/Database/Transaction.h b/src/server/database/Database/Transaction.h index 16fc08fb0d8..36f7d3ec749 100644 --- a/src/server/database/Database/Transaction.h +++ b/src/server/database/Database/Transaction.h @@ -22,6 +22,7 @@ #include "DatabaseEnvFwd.h" #include "SQLOperation.h" #include "StringFormat.h" +#include <functional> #include <mutex> #include <vector> @@ -72,6 +73,7 @@ class TC_DATABASE_API TransactionTask : public SQLOperation { template <class T> friend class DatabaseWorkerPool; friend class DatabaseWorker; + friend class TransactionCallback; public: TransactionTask(std::shared_ptr<TransactionBase> trans) : m_trans(trans) { } @@ -79,9 +81,43 @@ class TC_DATABASE_API TransactionTask : public SQLOperation protected: bool Execute() override; + int TryExecute(); + void CleanupOnFailure(); std::shared_ptr<TransactionBase> m_trans; static std::mutex _deadlockLock; }; +class TC_DATABASE_API TransactionWithResultTask : public TransactionTask +{ +public: + TransactionWithResultTask(std::shared_ptr<TransactionBase> trans) : TransactionTask(trans) { } + + TransactionFuture GetFuture() { return m_result.get_future(); } + +protected: + bool Execute() override; + + TransactionPromise m_result; +}; + +class TC_DATABASE_API TransactionCallback +{ +public: + TransactionCallback(TransactionFuture&& future) : m_future(std::move(future)) { } + TransactionCallback(TransactionCallback&&) = default; + + TransactionCallback& operator=(TransactionCallback&&) = default; + + void AfterComplete(std::function<void(bool)> callback) & + { + m_callback = std::move(callback); + } + + bool InvokeIfReady(); + + TransactionFuture m_future; + std::function<void(bool)> m_callback; +}; + #endif |