23 out << get_name() <<
'(';
25 const int64_t journal_checkpoint = client.get_journal_checkpoint();
26 const int64_t connection_checkpoint = client.get_connection_checkpoint();
27 const int64_t diff = connection_checkpoint - journal_checkpoint;
29 out << journal_checkpoint;
31 out <<
'+' << diff <<
")(pull to sync)";
36 if (client.is_pullonly())
37 out <<
"(cannot push)";
39 out <<
"(push to sync)";
44 if (client.get_journal().get_position() > journal_checkpoint)
50 void Client_Command_Processor::pull
54 std::chrono::milliseconds wait
57 const int64_t byte_count = client.pull(wait);
60 out <<
"pulled " << byte_count <<
" bytes, checkpoint = ";
61 out << client.get_journal_checkpoint() <<
'\n';
72 out <<
". Sleeping for " << seconds <<
" seconds...\n";
75 std::this_thread::sleep_for(std::chrono::seconds(1));
83 const std::string &command,
84 std::istream ¶meters,
89 if (command ==
"help")
97 pull_every [<wait_seconds>] [<sleep_seconds>]
99 if (!client.is_pullonly())
100 out <<
" push\n push_every [<sleep_seconds>]\n";
105 else if (command ==
"db")
114 database = &rdc->get_database();
116 database = &wdc->get_database();
123 run_interpreter(interpreter, in, out);
129 run_interpreter(interpreter, in, out);
132 else if (command ==
"pull")
134 float wait_seconds = 0;
135 parameters >> wait_seconds;
136 pull(out, std::chrono::milliseconds(std::lround(wait_seconds * 1000)));
138 else if (command ==
"pull_every")
140 float wait_seconds = 1;
141 int sleep_seconds = 0;
142 parameters >> wait_seconds >> sleep_seconds;
149 pull(out, std::chrono::milliseconds(std::lround(wait_seconds * 1000)));
150 sleep(sleep_seconds, out);
153 else if (command ==
"push" && !client.is_pullonly())
155 client.push_if_ahead();
157 else if (command ==
"push_every" && !client.is_pullonly())
159 int sleep_seconds = 1;
160 parameters >> sleep_seconds;
167 client.push_if_ahead();
168 sleep(sleep_seconds, out);
181 const std::string &command,
182 std::istream ¶meters,
187 if (command ==
"help")
191 out << R
"RRR(Writable Client
194 set_valid_data <true|false>
195 set_timestamp <true|false>
196 set_hard_checkpoint <true|false>
202 else if (command ==
"transaction")
204 auto *
const wdc =
dynamic_cast<Writable_Database_Client *
>(&client);
205 auto *
const wjc =
dynamic_cast<Writable_Journal_Client *
>(&client);
209 wdc->transaction([&](
const Readable &readable, Writable &writable)
212 interpreter.set_prompt_string(
"transaction");
213 run_interpreter(interpreter, in, out);
218 wjc->transaction([&](Writable_Journal &journal)
220 Writable_Interpreter interpreter(journal);
221 interpreter.set_prompt_string(
"transaction(journal)");
222 run_interpreter(interpreter, in, out);
226 out <<
"Client is not writable, cannot run transaction\n";
228 else if (command ==
"set_valid_data")
230 get_writable_client().set_valid_data(
read_boolean(parameters));
232 else if (command ==
"set_timestamp")
234 get_writable_client().set_timestamp(
read_boolean(parameters));
236 else if (command ==
"set_hard_checkpoint")
238 get_writable_client().set_hard_checkpoint(
read_boolean(parameters));
Status process_command(const std::string &command, std::istream ¶meters, std::istream &in, std::ostream &out) override
void write_prompt(std::ostream &out) const override
static void sleep(int seconds, std::ostream &out)
void set_prompt_string(std::string s)
Status process_command(const std::string &command, std::istream ¶meters, std::istream &in, std::ostream &out) override
static const Record_Id null
static constexpr int no_signal
static void set_signal(int status)
Status process_command(const std::string &command, std::istream ¶meters, std::istream &in, std::ostream &out) override
std::string get_time_string_of_now()
bool read_boolean(std::istream &in)