diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e7d6c57c..ab44769fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1840,6 +1840,8 @@ set_src(ENGINE_SERVER GLOB_RECURSE src/engine/server authmanager.cpp authmanager.h databases/connection.h + databases/connection_pool.cpp + databases/connection_pool.h databases/mysql.cpp databases/mysql.h name_ban.cpp diff --git a/src/engine/server/databases/connection.h b/src/engine/server/databases/connection.h index 8a5d990b2..a0aff2453 100644 --- a/src/engine/server/databases/connection.h +++ b/src/engine/server/databases/connection.h @@ -25,8 +25,9 @@ public: SUCCESS, ERROR, }; - // returns true if connection was established + // tries to allocate the connection from the pool established virtual Status Connect() = 0; + // has to be called to return the connection back to the pool virtual void Disconnect() = 0; // get exclusive read/write access to the database diff --git a/src/engine/server/databases/connection_pool.cpp b/src/engine/server/databases/connection_pool.cpp new file mode 100644 index 000000000..a787b1b29 --- /dev/null +++ b/src/engine/server/databases/connection_pool.cpp @@ -0,0 +1,42 @@ +#include "connection_pool.h" + +// helper struct to hold thread data +struct CSqlExecData +{ + CSqlExecData( + bool (*pFuncPtr) (IDbConnection *, const ISqlData *), + const ISqlData *pSqlRequestData + ); + ~CSqlExecData(); + + bool (*m_pFuncPtr) (IDbConnection*, const ISqlData *); + std::unique_ptr m_pSqlRequestData; +}; + +CDbConnectionPool::CDbConnectionPool() +{ +} + +CDbConnectionPool::~CDbConnectionPool() +{ +} + +void CDbConnectionPool::RegisterDatabase(std::unique_ptr pDatabase, Mode DatabaseMode) +{ +} + +void CDbConnectionPool::Execute( + bool (*pFuncPtr) (IDbConnection *, const ISqlData *), + std::unique_ptr pSqlRequestData) +{ +} + +void CDbConnectionPool::ExecuteWrite( + bool (*pFuncPtr) (IDbConnection *, const ISqlData *), + std::unique_ptr pSqlRequestData) +{ +} + +void CDbConnectionPool::Shutdown() +{ +} diff --git a/src/engine/server/databases/connection_pool.h b/src/engine/server/databases/connection_pool.h new file mode 100644 index 000000000..8497ccc98 --- /dev/null +++ b/src/engine/server/databases/connection_pool.h @@ -0,0 +1,46 @@ +#ifndef ENGINE_SERVER_DATABASES_CONNECTION_POOL_H +#define ENGINE_SERVER_DATABASES_CONNECTION_POOL_H + +#include "connection.h" + +#include +#include +#include + +struct ISqlData +{ + virtual ~ISqlData(); +}; + +class CDbConnectionPool +{ +public: + CDbConnectionPool(); + ~CDbConnectionPool(); + + enum Mode + { + READ, + WRITE, + WRITE_BACKUP, + NUM_MODES, + }; + + void RegisterDatabase(std::unique_ptr pDatabase, Mode DatabaseMode); + + void Execute( + bool (*pFuncPtr) (IDbConnection *, const ISqlData *), + std::unique_ptr pSqlRequestData); + // writes to WRITE_BACKUP server in case of failure + void ExecuteWrite( + bool (*pFuncPtr) (IDbConnection *, const ISqlData *), + std::unique_ptr pSqlRequestData); + + void Shutdown(); + +private: + std::vector> m_aapDbConnections[NUM_MODES]; + lock m_ConnectionLookupLock[NUM_MODES]; +}; + +#endif // ENGINE_SERVER_DATABASES_CONNECTION_POOL_H