From 635b8d52d58f7d502fc249c11c1044923e80935f Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 27 Jul 2019 10:52:33 +0200 Subject: Core/DBLayer: Prevent committing transactions started on a different database (cherry picked from commit f6e2b8cdc1c8a3dd291947f67566b41dac116622) # Conflicts: # src/server/bnetserver/REST/LoginRESTService.cpp # src/server/database/Database/DatabaseWorkerPool.cpp # src/server/database/Database/DatabaseWorkerPool.h # src/server/database/Database/Implementation/HotfixDatabase.h # src/server/database/Database/MySQLConnection.h # src/server/database/Database/Transaction.cpp # src/server/database/Database/Transaction.h # src/server/game/Achievements/AchievementMgr.cpp # src/server/game/Achievements/AchievementMgr.h # src/server/game/AuctionHouse/AuctionHouseMgr.cpp # src/server/game/AuctionHouse/AuctionHouseMgr.h # src/server/game/BattlePets/BattlePetMgr.cpp # src/server/game/BattlePets/BattlePetMgr.h # src/server/game/BlackMarket/BlackMarketMgr.cpp # src/server/game/BlackMarket/BlackMarketMgr.h # src/server/game/Entities/Creature/Creature.cpp # src/server/game/Entities/Item/Item.cpp # src/server/game/Entities/Item/Item.h # src/server/game/Entities/Player/CollectionMgr.cpp # src/server/game/Entities/Player/CollectionMgr.h # src/server/game/Entities/Player/Player.cpp # src/server/game/Entities/Player/Player.h # src/server/game/Garrison/Garrison.cpp # src/server/game/Garrison/Garrison.h # src/server/game/Groups/Group.cpp # src/server/game/Guilds/Guild.cpp # src/server/game/Guilds/Guild.h # src/server/game/Guilds/GuildFinderMgr.cpp # src/server/game/Handlers/BlackMarketHandler.cpp # src/server/game/Handlers/CalendarHandler.cpp # src/server/game/Handlers/CharacterHandler.cpp # src/server/game/Handlers/MailHandler.cpp # src/server/game/Handlers/PetHandler.cpp # src/server/game/Handlers/PetitionsHandler.cpp # src/server/game/Mails/Mail.cpp # src/server/game/Pools/PoolMgr.cpp # src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp # src/server/game/Quests/QuestObjectiveCriteriaMgr.h # src/server/game/Scenarios/InstanceScenario.cpp # src/server/game/Server/WorldSession.cpp # src/server/game/Server/WorldSession.h # src/server/game/Spells/SpellHistory.cpp # src/server/game/Support/SupportMgr.cpp # src/server/game/Tools/PlayerDump.cpp # src/server/scripts/Commands/cs_misc.cpp --- src/server/database/Database/Transaction.h | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'src/server/database/Database/Transaction.h') diff --git a/src/server/database/Database/Transaction.h b/src/server/database/Database/Transaction.h index 0a926f1e55d..b11f94ce14e 100644 --- a/src/server/database/Database/Transaction.h +++ b/src/server/database/Database/Transaction.h @@ -26,7 +26,7 @@ #include /*! 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(char const* sql); template 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 m_queries; private: bool _cleanedUp; +}; +template +class Transaction : public TransactionBase +{ +public: + using TransactionBase::Append; + void Append(PreparedStatement* 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 trans) : m_trans(trans) { } ~TransactionTask() { } protected: bool Execute() override; - SQLTransaction m_trans; + std::shared_ptr m_trans; static std::mutex _deadlockLock; }; -- cgit v1.2.3