Skip to content

Commit e5a1755

Browse files
committed
save database to file during server stop + some refactoring
1 parent f9d2058 commit e5a1755

File tree

3 files changed

+69
-34
lines changed

3 files changed

+69
-34
lines changed

BackgroundWorker.cpp

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,8 @@ void BackgroundWorker::run(const DataEngine& engine, const std::string& database
4040
{
4141
const auto saveSecondsElapsed = std::chrono::duration_cast<std::chrono::seconds>(saveTime - lastSaveTime);
4242
LOG_INFO << "BackgroundWorker: save data to file after " << saveSecondsElapsed.count() << " seconds" << std::endl;
43-
44-
DataSerializer::Document document;
45-
46-
const std::function<DataEngine::EnumerateVisitorProc> visitor =
47-
[&document](const std::string_view name, const std::string_view value)
48-
{
49-
document.add(name, value);
50-
return;
51-
};
52-
engine.enumerate(visitor);
53-
54-
DataSerializer::save(databaseFilename, document);
43+
const size_t savedRecordCount = store_data(engine, databaseFilename);
44+
LOG_INFO << "BackgroundWorker: saved " << savedRecordCount << " DB records to file " << databaseFilename << std::endl;
5545
lastSaveTime = saveTime;
5646
}
5747

@@ -84,3 +74,48 @@ void BackgroundWorker::stop_notify()
8474

8575
LOG_INFO << "BackgroundWorker: stop_notify: end" << std::endl;
8676
}
77+
78+
size_t BackgroundWorker::initial_load_data(DataEngine& engine, const std::string& databaseFilename)
79+
{
80+
size_t recordCount = 0;
81+
auto loadVisitor = [&engine, &recordCount](const std::string_view name, const std::string_view value)
82+
{
83+
engine.initial_set(name, value);
84+
++recordCount;
85+
return;
86+
};
87+
88+
const bool ok = DataSerializer::load(databaseFilename, loadVisitor);
89+
if (!ok)
90+
{
91+
LOG_ERROR << "DataSerializer::load() failed" << std::endl;
92+
return recordCount;
93+
}
94+
95+
return recordCount;
96+
}
97+
98+
size_t BackgroundWorker::store_data(const DataEngine& engine, const std::string& databaseFilename)
99+
{
100+
size_t recordCount = 0;
101+
DataSerializer::Document document;
102+
103+
const std::function<DataEngine::EnumerateVisitorProc> visitor =
104+
[&document, &recordCount](const std::string_view name, const std::string_view value)
105+
{
106+
document.add(name, value);
107+
++recordCount;
108+
return;
109+
};
110+
111+
engine.enumerate(visitor);
112+
113+
const bool ok = DataSerializer::save(databaseFilename, document);
114+
if (!ok)
115+
{
116+
LOG_ERROR << "DataSerializer::save() failed" << std::endl;
117+
return recordCount;
118+
}
119+
120+
return recordCount;
121+
}

BackgroundWorker.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ class BackgroundWorker
1515

1616
void stop_notify();
1717

18+
public:
19+
static size_t initial_load_data(DataEngine& engine, const std::string& databaseFilename);
20+
static size_t store_data(const DataEngine& engine, const std::string& databaseFilename);
21+
1822
protected:
1923
std::mutex m_protect;
2024
std::condition_variable m_conditional;

main.cpp

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include "BackgroundWorker.h"
22
#include "DataEngine.h"
3-
#include "DataSerializer.h"
43
#include "HttpServer.h"
54
#include "Logger.h"
65

@@ -11,7 +10,7 @@
1110
#include <thread>
1211

1312

14-
int main(const int argc, const char * const * const argv)
13+
int main(const int argc, const char* const* const argv)
1514
{
1615
LOG_INFO << "main: begin" << std::endl;
1716
const std::string arg1 = argc > 1 ? argv[1] : "";
@@ -30,36 +29,33 @@ int main(const int argc, const char * const * const argv)
3029
DataEngine engine;
3130

3231
LOG_INFO << "main: load data" << std::endl;
32+
const size_t loadedRecordCount = BackgroundWorker::initial_load_data(engine, databaseFilename);
33+
LOG_INFO << "main: loaded " << loadedRecordCount << " DB records from file " << databaseFilename << std::endl;
3334

3435
{
35-
size_t recordCount = 0;
36-
auto loadVisitor = [&engine, &recordCount](const std::string_view name, const std::string_view value)
36+
BackgroundWorker worker;
37+
38+
auto backgroundWorkerProc = [&worker, &engine, &databaseFilename]()
3739
{
38-
engine.initial_set(name, value);
39-
++recordCount;
40+
worker.run(engine, databaseFilename);
4041
};
41-
DataSerializer::load(databaseFilename, loadVisitor);
42-
LOG_INFO << "main: loaded " << recordCount << " DB records from file " << databaseFilename << std::endl;
43-
}
4442

45-
BackgroundWorker worker;
43+
auto backgroundWorkerFuture = std::async(std::launch::async, backgroundWorkerProc);
4644

47-
auto backgroundWorkerProc = [&worker, &engine, &databaseFilename]()
48-
{
49-
worker.run(engine, databaseFilename);
50-
};
45+
LOG_INFO << "main: listening connections: begin" << std::endl;
5146

52-
auto backgroundWorkerFuture = std::async(std::launch::async, backgroundWorkerProc);
47+
HttpServer server;
48+
server.run(listenHost, listenPort, engine, logEachRequest);
5349

54-
LOG_INFO << "main: listening connections: begin" << std::endl;
50+
LOG_INFO << "main: listening connections: end" << std::endl;
5551

56-
HttpServer server;
57-
server.run(listenHost, listenPort, engine, logEachRequest);
58-
59-
LOG_INFO << "main: listening connections: end" << std::endl;
52+
worker.stop_notify();
53+
backgroundWorkerFuture.wait();
54+
}
6055

61-
worker.stop_notify();
62-
backgroundWorkerFuture.wait();
56+
LOG_INFO << "main: save data to file before process exit" << std::endl;
57+
const size_t savedRecordCount = BackgroundWorker::store_data(engine, databaseFilename);
58+
LOG_INFO << "main: saved " << savedRecordCount << " DB records to file " << databaseFilename << std::endl;
6359

6460
LOG_INFO << "main: end" << std::endl;
6561

0 commit comments

Comments
 (0)