15 logger.log(std::to_string(get_session_id()) +
": " + message);
43 void Server_Client::keep_alive()
50 while (!keep_alive_thread_must_stop)
52 condition.wait_for(lock, keep_alive_interval);
54 if (keep_alive_thread_must_stop)
66 void Server_Client::connect()
69 logger.
log(
"joedb::Server_Client::connect");
84 throw Exception(
"Did not receive \"joedb\" from server");
86 const int64_t server_version =
buffer.
read<int64_t>();
88 if (server_version == 0)
89 throw Exception(
"Client version rejected by server");
91 logger.
log(
"server_version = " + std::to_string(server_version));
94 throw Exception(
"Unsupported server version");
102 else if (mode ==
'W')
105 throw Exception(
"Unexpected server mode");
113 if (keep_alive_interval.count() > 0)
115 keep_alive_thread_must_stop =
false;
116 keep_alive_thread = std::thread([
this](){keep_alive();});
132 *
const_cast<Logger *
>(
static_cast<const Logger *
>(
this))
135 for (int64_t read = 0; read < size;)
137 const int64_t remaining = size - read;
138 const size_t read_size = size_t(std::min(int64_t(buffer.size), remaining));
139 const size_t n = lock->read_some(buffer.data, read_size);
140 writer.write(buffer.data, n);
142 progress_bar.
print(read);
152 std::chrono::milliseconds keep_alive_interval
154 keep_alive_interval(keep_alive_interval),
158 pullonly_server(false)
164 void Server_Client::disconnect() noexcept
170 keep_alive_thread_must_stop =
true;
180 condition.notify_one();
181 if (keep_alive_thread.joinable())
182 keep_alive_thread.join();
char data[size+extra_size]
virtual void log(const std::string &message) noexcept
void print(int64_t current)
int64_t server_checkpoint
Server_Client(Channel &channel, Logger &logger=Logger::dummy_logger, std::chrono::milliseconds keep_alive_interval=std::chrono::seconds(0))
void log(const std::string &message) noexcept override
Thread_Safe< Channel & > channel
void download(Async_Writer &writer, Lock< Channel & > &lock, int64_t size) const
constexpr int protocol_version