Files
TCPlayerbotCore/src/server/database/Database/MySQLConnection.h
T

120 lines
4.4 KiB
C++
Raw Normal View History

2010-10-07 15:54:07 +02:00
/*
2020-01-02 06:44:10 +01:00
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
2010-10-07 15:54:07 +02:00
*
* 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/>.
2010-08-18 02:25:52 +02:00
*/
#ifndef _MYSQLCONNECTION_H
#define _MYSQLCONNECTION_H
2017-05-12 18:49:51 +02:00
#include "Define.h"
#include "DatabaseEnvFwd.h"
#include <memory>
#include <mutex>
#include <string>
#include <vector>
template <typename T>
class ProducerConsumerQueue;
2010-12-13 09:18:49 +01:00
class DatabaseWorker;
2010-09-02 20:54:43 +02:00
class MySQLPreparedStatement;
2017-05-12 18:49:51 +02:00
class SQLOperation;
2010-08-18 02:25:52 +02:00
enum ConnectionFlags
{
CONNECTION_ASYNC = 0x1,
CONNECTION_SYNCH = 0x2,
CONNECTION_BOTH = CONNECTION_ASYNC | CONNECTION_SYNCH
};
struct TC_DATABASE_API MySQLConnectionInfo
{
2017-05-12 18:49:51 +02:00
explicit MySQLConnectionInfo(std::string const& infoString);
std::string user;
std::string password;
std::string database;
std::string host;
std::string port_or_socket;
std::string ssl;
};
class TC_DATABASE_API MySQLConnection
2010-08-18 02:25:52 +02:00
{
2010-09-02 17:47:50 +02:00
template <class T> friend class DatabaseWorkerPool;
2010-09-27 00:20:56 +02:00
friend class PingOperation;
2010-08-18 02:25:52 +02:00
public:
MySQLConnection(MySQLConnectionInfo& connInfo); //! Constructor for synchronous connections.
MySQLConnection(ProducerConsumerQueue<SQLOperation*>* queue, MySQLConnectionInfo& connInfo); //! Constructor for asynchronous connections.
2011-05-07 19:08:50 +02:00
virtual ~MySQLConnection();
2010-08-18 02:25:52 +02:00
virtual uint32 Open();
2010-09-27 00:20:56 +02:00
void Close();
2010-08-18 02:25:52 +02:00
bool PrepareStatements();
bool Execute(char const* sql);
bool Execute(PreparedStatementBase* stmt);
ResultSet* Query(char const* sql);
PreparedResultSet* Query(PreparedStatementBase* stmt);
bool _Query(char const* sql, MySQLResult** pResult, MySQLField** pFields, uint64* pRowCount, uint32* pFieldCount);
bool _Query(PreparedStatementBase* stmt, MySQLPreparedStatement** mysqlStmt, MySQLResult** pResult, uint64* pRowCount, uint32* pFieldCount);
2010-08-18 02:25:52 +02:00
void BeginTransaction();
void RollbackTransaction();
void CommitTransaction();
int ExecuteTransaction(std::shared_ptr<TransactionBase> transaction);
2019-11-01 16:21:14 +01:00
size_t EscapeString(char* to, const char* from, size_t length);
2017-05-12 18:49:51 +02:00
void Ping();
2010-08-18 02:25:52 +02:00
2017-05-12 18:49:51 +02:00
uint32 GetLastError();
2011-01-13 20:07:09 +01:00
2010-08-18 02:25:52 +02:00
protected:
2017-05-12 18:49:51 +02:00
/// Tries to acquire lock. If lock is acquired by another thread
/// the calling parent will just try another connection
bool LockIfReady();
/// Called by parent databasepool. Will let other threads access this connection
void Unlock();
2010-09-27 00:20:56 +02:00
2019-11-01 16:21:14 +01:00
uint32 GetServerVersion() const;
2010-12-19 15:48:55 +01:00
MySQLPreparedStatement* GetPreparedStatement(uint32 index);
void PrepareStatement(uint32 index, std::string const& sql, ConnectionFlags flags);
2010-12-19 15:48:55 +01:00
virtual void DoPrepareStatements() = 0;
typedef std::vector<std::unique_ptr<MySQLPreparedStatement>> PreparedStatementContainer;
PreparedStatementContainer m_stmts; //! PreparedStatements storage
bool m_reconnecting; //! Are we reconnecting?
bool m_prepareError; //! Was there any error while preparing statements?
2010-12-19 15:48:55 +01:00
private:
bool _HandleMySQLErrno(uint32 errNo, uint8 attempts = 5);
2010-12-19 15:48:55 +01:00
ProducerConsumerQueue<SQLOperation*>* m_queue; //! Queue shared with other asynchronous connections.
std::unique_ptr<DatabaseWorker> m_worker; //! Core worker task.
2019-11-01 16:21:14 +01:00
MySQLHandle* m_Mysql; //! MySQL Handle.
MySQLConnectionInfo& m_connectionInfo; //! Connection info (used for logging)
ConnectionFlags m_connectionFlags; //! Connection flags (for preparing relevant statements)
2014-07-01 00:54:09 +02:00
std::mutex m_Mutex;
2014-04-20 16:48:35 +02:00
MySQLConnection(MySQLConnection const& right) = delete;
MySQLConnection& operator=(MySQLConnection const& right) = delete;
2010-08-18 02:25:52 +02:00
};
#endif