2020-07-04 10:09:40 +00:00
|
|
|
#ifndef ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
|
|
|
|
#define ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
|
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
#include <atomic>
|
2020-09-26 19:41:58 +00:00
|
|
|
#include <base/tl/threading.h>
|
2020-07-04 10:09:40 +00:00
|
|
|
#include <memory>
|
|
|
|
#include <vector>
|
|
|
|
|
2020-08-09 15:54:25 +00:00
|
|
|
class IDbConnection;
|
|
|
|
|
2020-12-08 11:03:43 +00:00
|
|
|
struct ISqlResult
|
|
|
|
{
|
|
|
|
// using atomic_bool to indicate completed sql query since usage_count
|
|
|
|
// from shard_ptr isn't safe in multithreaded environment
|
|
|
|
// the main thread must only access the remaining result data if set to true
|
|
|
|
std::atomic_bool m_Completed{false};
|
|
|
|
// indicate whether the thread indicated a successful completion (returned true)
|
|
|
|
bool m_Success = false;
|
|
|
|
|
|
|
|
virtual ~ISqlResult() = default;
|
|
|
|
};
|
|
|
|
|
2020-07-04 10:09:40 +00:00
|
|
|
struct ISqlData
|
|
|
|
{
|
2020-12-08 11:03:43 +00:00
|
|
|
ISqlData(std::shared_ptr<ISqlResult> pResult) :
|
|
|
|
m_pResult(std::move(pResult))
|
|
|
|
{
|
|
|
|
}
|
2020-09-26 19:41:58 +00:00
|
|
|
virtual ~ISqlData(){};
|
2020-12-08 11:03:43 +00:00
|
|
|
|
|
|
|
mutable std::shared_ptr<ISqlResult> m_pResult;
|
2020-07-04 10:09:40 +00:00
|
|
|
};
|
|
|
|
|
2020-08-03 14:18:22 +00:00
|
|
|
class IConsole;
|
|
|
|
|
2020-07-04 10:09:40 +00:00
|
|
|
class CDbConnectionPool
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CDbConnectionPool();
|
|
|
|
~CDbConnectionPool();
|
2020-09-26 19:41:58 +00:00
|
|
|
CDbConnectionPool &operator=(const CDbConnectionPool &) = delete;
|
2020-07-04 10:09:40 +00:00
|
|
|
|
2021-01-31 16:58:30 +00:00
|
|
|
// Returns false on success.
|
|
|
|
typedef bool (*FRead)(IDbConnection *, const ISqlData *, char *pError, int ErrorSize);
|
|
|
|
typedef bool (*FWrite)(IDbConnection *, const ISqlData *, bool, char *pError, int ErrorSize);
|
2020-07-08 19:31:34 +00:00
|
|
|
|
2020-07-04 10:09:40 +00:00
|
|
|
enum Mode
|
|
|
|
{
|
|
|
|
READ,
|
|
|
|
WRITE,
|
|
|
|
WRITE_BACKUP,
|
|
|
|
NUM_MODES,
|
|
|
|
};
|
|
|
|
|
2020-08-03 14:18:22 +00:00
|
|
|
void Print(IConsole *pConsole, Mode DatabaseMode);
|
|
|
|
|
2020-07-04 10:09:40 +00:00
|
|
|
void RegisterDatabase(std::unique_ptr<IDbConnection> pDatabase, Mode DatabaseMode);
|
|
|
|
|
|
|
|
void Execute(
|
2020-09-26 19:41:58 +00:00
|
|
|
FRead pFunc,
|
|
|
|
std::unique_ptr<const ISqlData> pSqlRequestData,
|
|
|
|
const char *pName);
|
2020-07-04 10:09:40 +00:00
|
|
|
// writes to WRITE_BACKUP server in case of failure
|
|
|
|
void ExecuteWrite(
|
2020-09-26 19:41:58 +00:00
|
|
|
FWrite pFunc,
|
|
|
|
std::unique_ptr<const ISqlData> pSqlRequestData,
|
|
|
|
const char *pName);
|
2020-07-04 10:09:40 +00:00
|
|
|
|
2020-07-04 17:53:27 +00:00
|
|
|
void OnShutdown();
|
2020-07-04 10:09:40 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
std::vector<std::unique_ptr<IDbConnection>> m_aapDbConnections[NUM_MODES];
|
2020-07-04 17:53:27 +00:00
|
|
|
|
2020-07-08 19:31:34 +00:00
|
|
|
static void Worker(void *pUser);
|
|
|
|
void Worker();
|
2020-07-04 17:53:27 +00:00
|
|
|
bool ExecSqlFunc(IDbConnection *pConnection, struct CSqlExecData *pData, bool Failure);
|
|
|
|
|
2022-01-09 15:22:19 +00:00
|
|
|
std::atomic_bool m_Shutdown{false};
|
2020-11-29 16:53:54 +00:00
|
|
|
CSemaphore m_NumElem;
|
2020-07-04 17:53:27 +00:00
|
|
|
int FirstElem;
|
|
|
|
int LastElem;
|
|
|
|
std::unique_ptr<struct CSqlExecData> m_aTasks[512];
|
2020-07-04 10:09:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
|