aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/MySQLConnection.cpp35
-rw-r--r--src/server/database/Database/SQLOperation.h44
-rw-r--r--src/server/database/Database/Transaction.cpp26
-rw-r--r--src/server/database/Database/Transaction.h19
4 files changed, 28 insertions, 96 deletions
diff --git a/src/server/database/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp
index 56e384520c2..ab16d560ec2 100644
--- a/src/server/database/Database/MySQLConnection.cpp
+++ b/src/server/database/Database/MySQLConnection.cpp
@@ -382,7 +382,7 @@ void MySQLConnection::CommitTransaction()
int MySQLConnection::ExecuteTransaction(std::shared_ptr<TransactionBase> transaction)
{
- std::vector<SQLElementData> const& queries = transaction->m_queries;
+ std::vector<TransactionData> const& queries = transaction->m_queries;
if (queries.empty())
return -1;
@@ -390,35 +390,12 @@ int MySQLConnection::ExecuteTransaction(std::shared_ptr<TransactionBase> transac
for (auto itr = queries.begin(); itr != queries.end(); ++itr)
{
- SQLElementData const& data = *itr;
- switch (itr->type)
+ if (!std::visit([this](auto&& data) { return this->Execute(TransactionData::ToExecutable(data)); }, itr->query))
{
- case SQL_ELEMENT_PREPARED:
- {
- PreparedStatementBase* stmt = data.element.stmt;
- ASSERT(stmt);
- if (!Execute(stmt))
- {
- TC_LOG_WARN("sql.sql", "Transaction aborted. {} queries not executed.", (uint32)queries.size());
- int errorCode = GetLastError();
- RollbackTransaction();
- return errorCode;
- }
- }
- break;
- case SQL_ELEMENT_RAW:
- {
- char const* sql = data.element.query;
- ASSERT(sql);
- if (!Execute(sql))
- {
- TC_LOG_WARN("sql.sql", "Transaction aborted. {} queries not executed.", (uint32)queries.size());
- int errorCode = GetLastError();
- RollbackTransaction();
- return errorCode;
- }
- }
- break;
+ TC_LOG_WARN("sql.sql", "Transaction aborted. {} queries not executed.", queries.size());
+ int errorCode = GetLastError();
+ RollbackTransaction();
+ return errorCode;
}
}
diff --git a/src/server/database/Database/SQLOperation.h b/src/server/database/Database/SQLOperation.h
deleted file mode 100644
index c4b5d325576..00000000000
--- a/src/server/database/Database/SQLOperation.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef _SQLOPERATION_H
-#define _SQLOPERATION_H
-
-#include "DatabaseEnvFwd.h"
-
-//- Union that holds element data
-union SQLElementUnion
-{
- PreparedStatementBase* stmt;
- char const* query;
-};
-
-//- Type specifier of our element data
-enum SQLElementDataType
-{
- SQL_ELEMENT_RAW,
- SQL_ELEMENT_PREPARED
-};
-
-//- The element
-struct SQLElementData
-{
- SQLElementUnion element;
- SQLElementDataType type;
-};
-
-#endif
diff --git a/src/server/database/Database/Transaction.cpp b/src/server/database/Database/Transaction.cpp
index 00ab5cbc7fa..f1ddb608c6c 100644
--- a/src/server/database/Database/Transaction.cpp
+++ b/src/server/database/Database/Transaction.cpp
@@ -16,6 +16,7 @@
*/
#include "Transaction.h"
+#include "Errors.h"
#include "Log.h"
#include "MySQLConnection.h"
#include "PreparedStatement.h"
@@ -32,19 +33,15 @@ std::mutex TransactionTask::_deadlockLock;
//- Append a raw ad-hoc query to the transaction
void TransactionBase::Append(char const* sql)
{
- SQLElementData data;
- data.type = SQL_ELEMENT_RAW;
- data.element.query = strdup(sql);
- m_queries.push_back(data);
+ ASSERT(sql);
+ m_queries.emplace_back(std::in_place_type<std::string>, sql);
}
//- Append a prepared statement to the transaction
void TransactionBase::AppendPreparedStatement(PreparedStatementBase* stmt)
{
- SQLElementData data;
- data.type = SQL_ELEMENT_PREPARED;
- data.element.stmt = stmt;
- m_queries.push_back(data);
+ ASSERT(stmt);
+ m_queries.emplace_back(std::in_place_type<std::unique_ptr<PreparedStatementBase>>, stmt);
}
void TransactionBase::Cleanup()
@@ -53,19 +50,6 @@ void TransactionBase::Cleanup()
if (_cleanedUp)
return;
- for (SQLElementData const& data : m_queries)
- {
- switch (data.type)
- {
- case SQL_ELEMENT_PREPARED:
- delete data.element.stmt;
- break;
- case SQL_ELEMENT_RAW:
- free((void*)(data.element.query));
- break;
- }
- }
-
m_queries.clear();
_cleanedUp = true;
}
diff --git a/src/server/database/Database/Transaction.h b/src/server/database/Database/Transaction.h
index 5fc81bd05c9..f4dcb9fae34 100644
--- a/src/server/database/Database/Transaction.h
+++ b/src/server/database/Database/Transaction.h
@@ -20,14 +20,25 @@
#include "Define.h"
#include "DatabaseEnvFwd.h"
-#include "SQLOperation.h"
#include "StringFormat.h"
#include <functional>
#include <mutex>
+#include <variant>
#include <vector>
class MySQLConnection;
+struct TransactionData
+{
+ std::variant<std::unique_ptr<PreparedStatementBase>, std::string> query;
+
+ template<typename... Args>
+ TransactionData(Args&&... args) : query(std::forward<Args>(args)...) { }
+
+ static PreparedStatementBase* ToExecutable(std::unique_ptr<PreparedStatementBase> const& stmt) { return stmt.get(); }
+ static char const* ToExecutable(std::string const& sql) { return sql.c_str(); }
+};
+
/*! Transactions, high level class. */
class TC_DATABASE_API TransactionBase
{
@@ -39,6 +50,10 @@ class TC_DATABASE_API TransactionBase
public:
TransactionBase() : _cleanedUp(false) { }
+ TransactionBase(TransactionBase const&) = delete;
+ TransactionBase(TransactionBase &&) noexcept = default;
+ TransactionBase& operator=(TransactionBase const&) = delete;
+ TransactionBase& operator=(TransactionBase &&) noexcept = default;
virtual ~TransactionBase() { Cleanup(); }
void Append(char const* sql);
@@ -53,7 +68,7 @@ class TC_DATABASE_API TransactionBase
protected:
void AppendPreparedStatement(PreparedStatementBase* statement);
void Cleanup();
- std::vector<SQLElementData> m_queries;
+ std::vector<TransactionData> m_queries;
private:
bool _cleanedUp;