DDraceNetwork Documentation
Loading...
Searching...
No Matches
connection_pool.h
Go to the documentation of this file.
1#ifndef ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
2#define ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
3
4#include <base/tl/threading.h>
5
6#include <atomic>
7#include <memory>
8#include <vector>
9
10class IDbConnection;
11
13{
14 // using atomic_bool to indicate completed sql query since usage_count
15 // from shard_ptr isn't safe in multithreaded environment
16 // the main thread must only access the remaining result data if set to true
17 std::atomic_bool m_Completed{false};
18 // indicate whether the thread indicated a successful completion (returned true)
19 bool m_Success = false;
20
21 virtual ~ISqlResult() = default;
22};
23
25{
26 ISqlData(std::shared_ptr<ISqlResult> pResult) :
27 m_pResult(std::move(pResult))
28 {
29 }
30 virtual ~ISqlData() = default;
31
32 mutable std::shared_ptr<ISqlResult> m_pResult;
33};
34
36{
37 // write everything into the backup db first
39 // now try to write it into remote db
41 // succeeded writing -> remove copy from backup
43 // failed writing -> notify about failure
45};
46
47class IConsole;
48
50{
51 char m_aDatabase[64];
52 char m_aPrefix[64];
53 char m_aUser[64];
54 char m_aPass[64];
55 char m_aIp[64];
56 char m_aBindaddr[128];
57 int m_Port;
58 bool m_Setup;
59};
60
62{
63public:
67
68 // Returns false on success.
69 typedef bool (*FRead)(IDbConnection *, const ISqlData *, char *pError, int ErrorSize);
70 typedef bool (*FWrite)(IDbConnection *, const ISqlData *, Write, char *pError, int ErrorSize);
71
79
80 void Print(IConsole *pConsole, Mode DatabaseMode);
81
82 void RegisterSqliteDatabase(Mode DatabaseMode, const char aFilename[64]);
83 void RegisterMysqlDatabase(Mode DatabaseMode, const CMysqlConfig *pMysqlConfig);
84
85 void Execute(
86 FRead pFunc,
87 std::unique_ptr<const ISqlData> pSqlRequestData,
88 const char *pName);
89 // writes to WRITE_BACKUP first and removes it from there when successfully
90 // executed on WRITE server
91 void ExecuteWrite(
92 FWrite pFunc,
93 std::unique_ptr<const ISqlData> pSqlRequestData,
94 const char *pName);
95
96 void OnShutdown();
97
98 friend class CWorker;
99 friend class CBackup;
100
101private:
102 static bool ExecSqlFunc(IDbConnection *pConnection, struct CSqlExecData *pData, Write w);
103
104 // Only the main thread accesses this variable. It points to the index,
105 // where the next query is added to the queue.
106 int m_InsertIdx = 0;
107
108 bool m_Shutdown = false;
109
111 {
112 // Used as signal that shutdown is in progress from main thread to
113 // speed up the queries by discarding read queries and writing to
114 // the sqlite file instead of the remote mysql server.
115 // The worker thread signals the main thread that all queries are
116 // processed by setting this variable to false again.
117 std::atomic_bool m_Shutdown{false};
118 // Queries go first to the backup thread. This semaphore signals about
119 // new queries.
121 // When the backup thread processed the query, it signals the main
122 // thread with this semaphore about the new query
124
125 // spsc queue with additional backup worker to look at queries first.
126 std::unique_ptr<struct CSqlExecData> m_aQueries[512];
127 };
128
129 std::shared_ptr<CSharedData> m_pShared;
130 void *m_pWorkerThread = nullptr;
131 void *m_pBackupThread = nullptr;
132};
133
134#endif // ENGINE_SERVER_DATABASES_CONNECTION_POOL_H
Mode
Definition connection_pool.h:73
@ NUM_MODES
Definition connection_pool.h:77
@ READ
Definition connection_pool.h:74
@ WRITE_BACKUP
Definition connection_pool.h:76
@ WRITE
Definition connection_pool.h:75
CDbConnectionPool & operator=(const CDbConnectionPool &)=delete
int m_InsertIdx
Definition connection_pool.h:106
friend class CWorker
Definition connection_pool.h:98
void * m_pBackupThread
Definition connection_pool.h:131
void * m_pWorkerThread
Definition connection_pool.h:130
std::shared_ptr< CSharedData > m_pShared
Definition connection_pool.h:129
friend class CBackup
Definition connection_pool.h:99
~CDbConnectionPool()
Definition connection_pool.cpp:485
bool m_Shutdown
Definition connection_pool.h:108
void Execute(FRead pFunc, std::unique_ptr< const ISqlData > pSqlRequestData, const char *pName)
Definition connection_pool.cpp:144
CDbConnectionPool()
Definition connection_pool.cpp:478
void ExecuteWrite(FWrite pFunc, std::unique_ptr< const ISqlData > pSqlRequestData, const char *pName)
Definition connection_pool.cpp:154
static bool ExecSqlFunc(IDbConnection *pConnection, struct CSqlExecData *pData, Write w)
Definition connection_pool.cpp:445
void Print(IConsole *pConsole, Mode DatabaseMode)
Definition connection_pool.cpp:123
bool(* FWrite)(IDbConnection *, const ISqlData *, Write, char *pError, int ErrorSize)
Definition connection_pool.h:70
bool(* FRead)(IDbConnection *, const ISqlData *, char *pError, int ErrorSize)
Definition connection_pool.h:69
void RegisterSqliteDatabase(Mode DatabaseMode, const char aFilename[64])
Definition connection_pool.cpp:130
void RegisterMysqlDatabase(Mode DatabaseMode, const CMysqlConfig *pMysqlConfig)
Definition connection_pool.cpp:137
void OnShutdown()
Definition connection_pool.cpp:164
Definition threading.h:9
Definition console.h:20
Definition connection.h:20
Write
Definition connection_pool.h:36
@ NORMAL_FAILED
Definition connection_pool.h:44
@ NORMAL
Definition connection_pool.h:40
@ BACKUP_FIRST
Definition connection_pool.h:38
@ NORMAL_SUCCEEDED
Definition connection_pool.h:42
Definition connection_pool.h:111
std::unique_ptr< struct CSqlExecData > m_aQueries[512]
Definition connection_pool.h:126
std::atomic_bool m_Shutdown
Definition connection_pool.h:117
CSemaphore m_NumBackup
Definition connection_pool.h:120
CSemaphore m_NumWorker
Definition connection_pool.h:123
Definition connection_pool.h:50
char m_aPass[64]
Definition connection_pool.h:54
bool m_Setup
Definition connection_pool.h:58
char m_aDatabase[64]
Definition connection_pool.h:51
char m_aPrefix[64]
Definition connection_pool.h:52
char m_aIp[64]
Definition connection_pool.h:55
char m_aBindaddr[128]
Definition connection_pool.h:56
char m_aUser[64]
Definition connection_pool.h:53
int m_Port
Definition connection_pool.h:57
Definition connection_pool.cpp:21
Definition connection_pool.h:25
virtual ~ISqlData()=default
std::shared_ptr< ISqlResult > m_pResult
Definition connection_pool.h:32
ISqlData(std::shared_ptr< ISqlResult > pResult)
Definition connection_pool.h:26
Definition connection_pool.h:13
std::atomic_bool m_Completed
Definition connection_pool.h:17
virtual ~ISqlResult()=default
bool m_Success
Definition connection_pool.h:19