forked from galaxywiz/RoseServer
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDBManager.cpp
More file actions
86 lines (70 loc) · 1.86 KB
/
Copy pathDBManager.cpp
File metadata and controls
86 lines (70 loc) · 1.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "stdafx.h"
DBManager::DBManager()
{
xml_t config;
if (!loadConfig(&config)) {
return;
}
this->initialize(&config);
}
void DBManager::initialize(xml_t *config)
{
xmlNode_t *root = config->FirstChildElement("App")->FirstChildElement("DataBase");
if (!root) {
SLog(L"@ not exist database setting");
return;
}
xmlNode_t *elem = root->FirstChildElement("ThreadCount");
sscanf_s(elem->GetText(), "%d", &workerCount_);
array<WCHAR, SIZE_256> tmp;
elem = root->FirstChildElement("ServerName");
StrConvA2W((char *) elem->GetText(), tmp.data(), tmp.max_size());
serverName_ = tmp.data();
elem = root->FirstChildElement("DB");
StrConvA2W((char *) elem->GetText(), tmp.data(), tmp.max_size());
dbName_ = tmp.data();
elem = root->FirstChildElement("Login");
StrConvA2W((char *) elem->GetText(), tmp.data(), tmp.max_size());
login_ = tmp.data();
elem = root->FirstChildElement("Password");
StrConvA2W((char *) elem->GetText(), tmp.data(), tmp.max_size());
password_ = tmp.data();
queryPool_ = new ThreadJobQueue<Query *>(L"DBQueueJob");
for (int i = 0; i < workerCount_; ++i) {
array<WCHAR, SIZE_128> patch = { 0, };
ADODatabase *adodb = new ADODatabase();
dbPool_.push_back(adodb);
}
}
DBManager::~DBManager()
{
SAFE_DELETE(queryPool_);
for (auto db : dbPool_) {
db->disconnect();
SAFE_DELETE(db);
}
}
size_t DBManager::runQueryCount()
{
return queryPool_->size();
}
void DBManager::pushQuery(Query *query)
{
queryPool_->push(query);
}
bool DBManager::popQuery(Query **query)
{
return queryPool_->pop(*query);
}
void DBManager::run()
{
for (auto db : dbPool_) {
if (db->state() != DB_STOP) {
continue;
}
if (!db->connect(serverName_.c_str(), dbName_.c_str(), login_.c_str(), password_.c_str())) {
SErrLog(L"! db[%s] connection error", dbName_.c_str());
}
db->run();
}
}