Joedb 10.4.3
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Server_Client.cpp
Go to the documentation of this file.
6
7namespace joedb
8{
9 ////////////////////////////////////////////////////////////////////////////
10 void Server_Client::log(beman::cstring_view message) noexcept
11 ////////////////////////////////////////////////////////////////////////////
12 {
13 try
14 {
15 std::string s = std::to_string(get_session_id()) + ": ";
16 s += message;
17 logger.log(s);
18 }
19 catch (...)
20 {
21 }
22 }
23
24 ////////////////////////////////////////////////////////////////////////////
25 void Server_Client::locked_ping(Lock<Channel&> &lock)
26 ////////////////////////////////////////////////////////////////////////////
27 {
28 static const std::array<char, 17> write_buffer = {'D'};
29 lock->write(write_buffer.data(), write_buffer.size());
30
31 std::array<char, 9> read_buffer;
32 lock->read(read_buffer.data(), read_buffer.size());
33 }
34
35 ////////////////////////////////////////////////////////////////////////////
36 void Server_Client::connect()
37 ////////////////////////////////////////////////////////////////////////////
38 {
39 logger.log("joedb::Server_Client::connect");
40
41 buffer.index = 0;
42 buffer.write<std::array<char, 5>>(Header::joedb);
44
45 {
46 Lock<Channel&> lock(channel);
47 lock->write(buffer.data, buffer.index);
48 lock->read(buffer.data, 5 + 8 + 8 + 8 + 1);
49 }
50
51 buffer.index = 0;
52
53 if (buffer.read<std::array<char, 5>>() != Header::joedb)
54 throw Exception("Did not receive \"joedb\" from server");
55
56 const int64_t server_version = buffer.read<int64_t>();
57
58 if (server_version == 0)
59 throw Exception("Client version rejected by server");
60
61 logger.log("server_version = " + std::to_string(server_version));
62
63 if (server_version < protocol_version)
64 throw Exception("Unsupported server version");
65
66 session_id = buffer.read<int64_t>();
67 server_checkpoint = buffer.read<int64_t>();
68 const char mode = buffer.read<char>();
69
70 if (mode == 'R')
71 pullonly_server = true;
72 else if (mode == 'W')
73 pullonly_server = false;
74 else
75 throw Exception("Unexpected server mode");
76
77 log
78 (
79 "server_checkpoint = " + std::to_string(server_checkpoint) +
80 "; mode = " + mode
81 );
82 }
83
84 ////////////////////////////////////////////////////////////////////////////
86 ////////////////////////////////////////////////////////////////////////////
87 (
88 Async_Writer &writer,
89 Lock<Channel&> &lock,
90 int64_t size
91 ) const
92 {
93 Progress_Bar progress_bar
94 (
95 size,
96 *const_cast<Logger *>(static_cast<const Logger *>(this))
97 );
98
99 for (int64_t read = 0; read < size;)
100 {
101 const int64_t remaining = size - read;
102 const size_t read_size = size_t(std::min(int64_t(buffer.size), remaining));
103 const size_t n = lock->read_some(buffer.data, read_size);
104 writer.write(buffer.data, n);
105 read += int64_t(n);
106 progress_bar.print(read);
107 }
108 }
109
110 ////////////////////////////////////////////////////////////////////////////
112 ////////////////////////////////////////////////////////////////////////////
113 (
114 Channel &channel,
115 Logger &logger,
116 std::chrono::milliseconds keep_alive_interval
117 ):
118 keep_alive(*this, keep_alive_interval),
119 channel(channel),
120 logger(logger),
121 session_id(-1),
122 pullonly_server(false)
123 {
124 connect();
125 keep_alive.start();
126 }
127
128 ////////////////////////////////////////////////////////////////////////////
129 void Server_Client::disconnect()
130 ////////////////////////////////////////////////////////////////////////////
131 {
132 {
134 buffer.data[0] = 'Q';
135 lock->write(buffer.data, 1);
136 }
137
138 keep_alive.stop();
139 }
140
141 ////////////////////////////////////////////////////////////////////////////
143 ////////////////////////////////////////////////////////////////////////////
144 {
145 try {disconnect();} catch (...) {}
146 }
147}
size_t index
Definition Buffer.h:20
void write(T x)
Definition Buffer.h:23
char data[size+extra_size]
Definition Buffer.h:19
virtual void log(beman::cstring_view message) noexcept
Definition Logger.h:12
bool print(int64_t current)
void log(beman::cstring_view message) noexcept override
Thread_Safe< Channel & > channel
Server_Client(Channel &channel, Logger &logger=Logger::dummy_logger, std::chrono::milliseconds keep_alive_interval=std::chrono::milliseconds(0))
void download(Async_Writer &writer, Lock< Channel & > &lock, int64_t size) const
constexpr int protocol_version
static constexpr std::array< char, 5 > joedb
Definition Header.h:17