Joedb 10.4.1
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 buffer.index = 0;
29 buffer.write<char>('D');
30 buffer.write<int64_t>(0);
31 buffer.write<int64_t>(0);
32 lock->write(buffer.data, buffer.index);
33 lock->read(buffer.data, 9);
34 }
35
36 ////////////////////////////////////////////////////////////////////////////
37 void Server_Client::connect()
38 ////////////////////////////////////////////////////////////////////////////
39 {
40 logger.log("joedb::Server_Client::connect");
41
42 buffer.index = 0;
43 buffer.write<std::array<char, 5>>(Header::joedb);
45
46 {
47 Lock<Channel&> lock(channel);
48 lock->write(buffer.data, buffer.index);
49 lock->read(buffer.data, 5 + 8 + 8 + 8 + 1);
50 }
51
52 buffer.index = 0;
53
54 if (buffer.read<std::array<char, 5>>() != Header::joedb)
55 throw Exception("Did not receive \"joedb\" from server");
56
57 const int64_t server_version = buffer.read<int64_t>();
58
59 if (server_version == 0)
60 throw Exception("Client version rejected by server");
61
62 logger.log("server_version = " + std::to_string(server_version));
63
64 if (server_version < protocol_version)
65 throw Exception("Unsupported server version");
66
67 session_id = buffer.read<int64_t>();
68 server_checkpoint = buffer.read<int64_t>();
69 const char mode = buffer.read<char>();
70
71 if (mode == 'R')
72 pullonly_server = true;
73 else if (mode == 'W')
74 pullonly_server = false;
75 else
76 throw Exception("Unexpected server mode");
77
78 log
79 (
80 "server_checkpoint = " + std::to_string(server_checkpoint) +
81 "; mode = " + mode
82 );
83 }
84
85 ////////////////////////////////////////////////////////////////////////////
87 ////////////////////////////////////////////////////////////////////////////
88 (
89 Async_Writer &writer,
90 Lock<Channel&> &lock,
91 int64_t size
92 ) const
93 {
94 Progress_Bar progress_bar
95 (
96 size,
97 *const_cast<Logger *>(static_cast<const Logger *>(this))
98 );
99
100 for (int64_t read = 0; read < size;)
101 {
102 const int64_t remaining = size - read;
103 const size_t read_size = size_t(std::min(int64_t(buffer.size), remaining));
104 const size_t n = lock->read_some(buffer.data, read_size);
105 writer.write(buffer.data, n);
106 read += int64_t(n);
107 progress_bar.print(read);
108 }
109 }
110
111 ////////////////////////////////////////////////////////////////////////////
113 ////////////////////////////////////////////////////////////////////////////
114 (
115 Channel &channel,
116 Logger &logger,
117 std::chrono::milliseconds keep_alive_interval
118 ):
119 keep_alive(*this, keep_alive_interval),
120 channel(channel),
121 logger(logger),
122 session_id(-1),
123 pullonly_server(false)
124 {
125 connect();
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
void 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