ddnet/src/engine/server/databases/connection_pool.h

86 lines
2 KiB
C
Raw Normal View History

2020-07-04 10:09:40 +00:00
#ifndef ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
#define ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
#include <atomic>
#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;
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
{
ISqlData(std::shared_ptr<ISqlResult> pResult) :
m_pResult(std::move(pResult))
{
}
virtual ~ISqlData(){};
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();
CDbConnectionPool &operator=(const CDbConnectionPool &) = delete;
2020-07-04 10:09:40 +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(
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(
FWrite pFunc,
std::unique_ptr<const ISqlData> pSqlRequestData,
const char *pName);
2020-07-04 10:09:40 +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-08 19:31:34 +00:00
static void Worker(void *pUser);
void Worker();
bool ExecSqlFunc(IDbConnection *pConnection, struct CSqlExecData *pData, bool Failure);
2020-07-10 23:28:37 +00:00
std::atomic_bool m_Shutdown;
CSemaphore m_NumElem;
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