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)";
46 void Client_Command_Processor::pull
50 std::chrono::milliseconds wait
53 const int64_t byte_count = client.pull(wait);
56 out <<
"pulled " << byte_count <<
" bytes, checkpoint = ";
57 out << client.get_journal_checkpoint() <<
'\n';
68 out <<
". Sleeping for " << seconds <<
" seconds...\n";
71 std::this_thread::sleep_for(std::chrono::seconds(1));
79 const std::string &command,
80 std::istream ¶meters,
85 if (command ==
"help")
93 pull_every [<wait_seconds>] [<sleep_seconds>]
95 if (!client.is_pullonly())
96 out <<
" push\n push_every [<sleep_seconds>]\n";
101 else if (command ==
"db")
110 database = &rdc->get_database();
112 database = &wdc->get_database();
119 run_interpreter(interpreter, in, out);
125 run_interpreter(interpreter, in, out);
128 else if (command ==
"pull")
130 float wait_seconds = 0;
131 parameters >> wait_seconds;
132 pull(out, std::chrono::milliseconds(std::lround(wait_seconds * 1000)));
134 else if (command ==
"pull_every")
136 float wait_seconds = 1;
137 int sleep_seconds = 0;
138 parameters >> wait_seconds >> sleep_seconds;
145 pull(out, std::chrono::milliseconds(std::lround(wait_seconds * 1000)));
146 sleep(sleep_seconds, out);
149 else if (command ==
"push" && !client.is_pullonly())
151 client.push_if_ahead();
153 else if (command ==
"push_every" && !client.is_pullonly())
155 int sleep_seconds = 1;
156 parameters >> sleep_seconds;
163 client.push_if_ahead();
164 sleep(sleep_seconds, out);
177 const std::string &command,
178 std::istream ¶meters,
183 if (command ==
"help")
187 out << R
"RRR(Writable Client
190 set_valid_data <true|false>
191 set_timestamp <true|false>
192 set_hard_checkpoint <true|false>
198 else if (command ==
"transaction")
200 auto *
const wdc =
dynamic_cast<Writable_Database_Client *
>(&client);
201 auto *
const wjc =
dynamic_cast<Writable_Journal_Client *
>(&client);
205 wdc->transaction([&](
const Readable &readable, Writable &writable)
208 interpreter.set_prompt_string(
"transaction");
209 run_interpreter(interpreter, in, out);
214 wjc->transaction([&](Writable_Journal &journal)
216 Writable_Interpreter interpreter(journal);
217 interpreter.set_prompt_string(
"transaction(journal)");
218 run_interpreter(interpreter, in, out);
222 out <<
"Client is not writable, cannot run transaction\n";
224 else if (command ==
"set_valid_data")
226 get_writable_client().set_valid_data(
read_boolean(parameters));
228 else if (command ==
"set_timestamp")
230 get_writable_client().set_timestamp(
read_boolean(parameters));
232 else if (command ==
"set_hard_checkpoint")
234 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)