#ifndef ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
#define ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
#include "connection.h"
#include
#include
#include
#include
struct ISqlData
{
virtual ~ISqlData() {};
};
class IConsole;
class CDbConnectionPool
{
public:
CDbConnectionPool();
~CDbConnectionPool();
CDbConnectionPool& operator=(const CDbConnectionPool&) = delete;
typedef bool (*FRead)(IDbConnection *, const ISqlData *);
typedef bool (*FWrite)(IDbConnection *, const ISqlData *, bool);
enum Mode
{
READ,
WRITE,
WRITE_BACKUP,
NUM_MODES,
};
void Print(IConsole *pConsole, Mode DatabaseMode);
void RegisterDatabase(std::unique_ptr pDatabase, Mode DatabaseMode);
void Execute(
FRead pFunc,
std::unique_ptr pSqlRequestData,
const char *pName);
// writes to WRITE_BACKUP server in case of failure
void ExecuteWrite(
FWrite pFunc,
std::unique_ptr pSqlRequestData,
const char *pName);
void OnShutdown();
private:
std::vector> m_aapDbConnections[NUM_MODES];
static void Worker(void *pUser);
void Worker();
bool ExecSqlFunc(IDbConnection *pConnection, struct CSqlExecData *pData, bool Failure);
std::atomic_bool m_Shutdown;
semaphore m_NumElem;
int FirstElem;
int LastElem;
std::unique_ptr m_aTasks[512];
};
#endif // ENGINE_SERVER_DATABASES_CONNECTION_POOL_H