diff options
| author | Shauren <shauren.trinity@gmail.com> | 2019-07-27 10:52:33 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-07-27 10:52:33 +0200 |
| commit | f6e2b8cdc1c8a3dd291947f67566b41dac116622 (patch) | |
| tree | 22a01cb91b2d47827ae73b48fcace3926587a341 /src/server/database/Database/Transaction.h | |
| parent | e8e89f58fb800014f53341f12505f60ee2b5fb6f (diff) | |
Core/DBLayer: Prevent committing transactions started on a different database
Diffstat (limited to 'src/server/database/Database/Transaction.h')
| -rw-r--r-- | src/server/database/Database/Transaction.h | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/server/database/Database/Transaction.h b/src/server/database/Database/Transaction.h index 164dcb2d82a..26d1fa5910d 100644 --- a/src/server/database/Database/Transaction.h +++ b/src/server/database/Database/Transaction.h @@ -26,7 +26,7 @@ #include <vector> /*! Transactions, high level class. */ -class TC_DATABASE_API Transaction +class TC_DATABASE_API TransactionBase { friend class TransactionTask; friend class MySQLConnection; @@ -35,10 +35,9 @@ class TC_DATABASE_API Transaction friend class DatabaseWorkerPool; public: - Transaction() : _cleanedUp(false) { } - ~Transaction() { Cleanup(); } + TransactionBase() : _cleanedUp(false) { } + virtual ~TransactionBase() { Cleanup(); } - void Append(PreparedStatementBase* statement); void Append(const char* sql); template<typename Format, typename... Args> void PAppend(Format&& sql, Args&&... args) @@ -49,12 +48,23 @@ class TC_DATABASE_API Transaction std::size_t GetSize() const { return m_queries.size(); } protected: + void AppendPreparedStatement(PreparedStatementBase* statement); void Cleanup(); std::vector<SQLElementData> m_queries; private: bool _cleanedUp; +}; +template<typename T> +class Transaction : public TransactionBase +{ +public: + using TransactionBase::Append; + void Append(PreparedStatement<T>* statement) + { + AppendPreparedStatement(statement); + } }; /*! Low level class*/ @@ -64,13 +74,13 @@ class TC_DATABASE_API TransactionTask : public SQLOperation friend class DatabaseWorker; public: - TransactionTask(SQLTransaction trans) : m_trans(trans) { } + TransactionTask(std::shared_ptr<TransactionBase> trans) : m_trans(trans) { } ~TransactionTask() { } protected: bool Execute() override; - SQLTransaction m_trans; + std::shared_ptr<TransactionBase> m_trans; static std::mutex _deadlockLock; }; |
