aboutsummaryrefslogtreecommitdiff
path: root/src/server/database/Database/MySQLConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/database/Database/MySQLConnection.cpp')
-rw-r--r--src/server/database/Database/MySQLConnection.cpp91
1 files changed, 62 insertions, 29 deletions
diff --git a/src/server/database/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp
index 6e862ae6abe..75e6362f87f 100644
--- a/src/server/database/Database/MySQLConnection.cpp
+++ b/src/server/database/Database/MySQLConnection.cpp
@@ -15,29 +15,43 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
+#include "MySQLConnection.h"
#include "Common.h"
-
-#ifdef _WIN32
- #include <winsock2.h>
+#include "DatabaseWorker.h"
+#include "Log.h"
+#include "PreparedStatement.h"
+#include "QueryResult.h"
+#include "Timer.h"
+#include "Transaction.h"
+#include "Util.h"
+#include <errmsg.h>
+#ifdef _WIN32 // hack for broken mysql.h not including the correct winsock header for SOCKET definition, fixed in 5.7
+#include <winsock2.h>
#endif
#include <mysql.h>
-#include <errmsg.h>
+#include <mysqld_error.h>
-#include "MySQLConnection.h"
-#include "QueryResult.h"
-#include "SQLOperation.h"
-#include "PreparedStatement.h"
-#include "DatabaseWorker.h"
-#include "Timer.h"
-#include "Log.h"
-#include "ProducerConsumerQueue.h"
+MySQLConnectionInfo::MySQLConnectionInfo(std::string const& infoString)
+{
+ Tokenizer tokens(infoString, ';');
+
+ if (tokens.size() != 5)
+ return;
+
+ uint8 i = 0;
+
+ host.assign(tokens[i++]);
+ port_or_socket.assign(tokens[i++]);
+ user.assign(tokens[i++]);
+ password.assign(tokens[i++]);
+ database.assign(tokens[i++]);
+}
MySQLConnection::MySQLConnection(MySQLConnectionInfo& connInfo) :
m_reconnecting(false),
m_prepareError(false),
-m_queue(NULL),
-m_Mysql(NULL),
+m_queue(nullptr),
+m_Mysql(nullptr),
m_connectionInfo(connInfo),
m_connectionFlags(CONNECTION_SYNCH) { }
@@ -45,7 +59,7 @@ MySQLConnection::MySQLConnection(ProducerConsumerQueue<SQLOperation*>* queue, My
m_reconnecting(false),
m_prepareError(false),
m_queue(queue),
-m_Mysql(NULL),
+m_Mysql(nullptr),
m_connectionInfo(connInfo),
m_connectionFlags(CONNECTION_ASYNC)
{
@@ -74,7 +88,7 @@ void MySQLConnection::Close()
uint32 MySQLConnection::Open()
{
MYSQL *mysqlInit;
- mysqlInit = mysql_init(NULL);
+ mysqlInit = mysql_init(nullptr);
if (!mysqlInit)
{
TC_LOG_ERROR("sql.sql", "Could not initialize Mysql connection to database `%s`", m_connectionInfo.database.c_str());
@@ -152,7 +166,7 @@ bool MySQLConnection::PrepareStatements()
return !m_prepareError;
}
-bool MySQLConnection::Execute(const char* sql)
+bool MySQLConnection::Execute(char const* sql)
{
if (!m_Mysql)
return false;
@@ -281,18 +295,18 @@ bool MySQLConnection::_Query(PreparedStatement* stmt, MYSQL_RES **pResult, uint6
return true;
}
-ResultSet* MySQLConnection::Query(const char* sql)
+ResultSet* MySQLConnection::Query(char const* sql)
{
if (!sql)
- return NULL;
+ return nullptr;
- MYSQL_RES *result = NULL;
- MYSQL_FIELD *fields = NULL;
+ MYSQL_RES *result = nullptr;
+ MYSQL_FIELD *fields = nullptr;
uint64 rowCount = 0;
uint32 fieldCount = 0;
if (!_Query(sql, &result, &fields, &rowCount, &fieldCount))
- return NULL;
+ return nullptr;
return new ResultSet(result, fields, rowCount, fieldCount);
}
@@ -355,14 +369,13 @@ void MySQLConnection::CommitTransaction()
int MySQLConnection::ExecuteTransaction(SQLTransaction& transaction)
{
- std::list<SQLElementData> const& queries = transaction->m_queries;
+ std::vector<SQLElementData> const& queries = transaction->m_queries;
if (queries.empty())
return -1;
BeginTransaction();
- std::list<SQLElementData>::const_iterator itr;
- for (itr = queries.begin(); itr != queries.end(); ++itr)
+ for (auto itr = queries.begin(); itr != queries.end(); ++itr)
{
SQLElementData const& data = *itr;
switch (itr->type)
@@ -382,7 +395,7 @@ int MySQLConnection::ExecuteTransaction(SQLTransaction& transaction)
break;
case SQL_ELEMENT_RAW:
{
- const char* sql = data.element.query;
+ char const* sql = data.element.query;
ASSERT(sql);
if (!Execute(sql))
{
@@ -405,6 +418,26 @@ int MySQLConnection::ExecuteTransaction(SQLTransaction& transaction)
return 0;
}
+void MySQLConnection::Ping()
+{
+ mysql_ping(m_Mysql);
+}
+
+uint32 MySQLConnection::GetLastError()
+{
+ return mysql_errno(m_Mysql);
+}
+
+bool MySQLConnection::LockIfReady()
+{
+ return m_Mutex.try_lock();
+}
+
+void MySQLConnection::Unlock()
+{
+ m_Mutex.unlock();
+}
+
MySQLPreparedStatement* MySQLConnection::GetPreparedStatement(uint32 index)
{
ASSERT(index < m_stmts.size());
@@ -450,12 +483,12 @@ void MySQLConnection::PrepareStatement(uint32 index, std::string const& sql, Con
PreparedResultSet* MySQLConnection::Query(PreparedStatement* stmt)
{
- MYSQL_RES *result = NULL;
+ MYSQL_RES *result = nullptr;
uint64 rowCount = 0;
uint32 fieldCount = 0;
if (!_Query(stmt, &result, &rowCount, &fieldCount))
- return NULL;
+ return nullptr;
if (mysql_more_results(m_Mysql))
{