mirror of https://github.com/djcb/mu.git
server: support flushing the output
So we can get some progress output
This commit is contained in:
parent
05393ba797
commit
b6d7d142f6
|
@ -78,12 +78,15 @@ struct Server::Private {
|
||||||
//
|
//
|
||||||
// output
|
// output
|
||||||
//
|
//
|
||||||
void output_sexp(Sexp&& sexp) const
|
void output_sexp(Sexp&& sexp, bool flush = false) const
|
||||||
{
|
{
|
||||||
if (output_)
|
if (output_)
|
||||||
output_(std::move(sexp));
|
output_(std::move(sexp), flush);
|
||||||
|
}
|
||||||
|
void output_sexp(Sexp::List&& lst, bool flush = false) const
|
||||||
|
{
|
||||||
|
output_sexp(Sexp::make_list(std::move(lst)), flush);
|
||||||
}
|
}
|
||||||
void output_sexp(Sexp::List&& lst) const { output_sexp(Sexp::make_list(std::move(lst))); }
|
|
||||||
size_t output_results(const QueryResults& qres, size_t batch_size) const;
|
size_t output_results(const QueryResults& qres, size_t batch_size) const;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -33,8 +33,8 @@ namespace Mu {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class Server {
|
class Server {
|
||||||
public:
|
public:
|
||||||
using Output = std::function<void(Sexp&& sexp)>;
|
using Output = std::function<void(Sexp&& sexp, bool flush)>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new server
|
* Construct a new server
|
||||||
|
@ -59,7 +59,7 @@ class Server {
|
||||||
*/
|
*/
|
||||||
bool invoke(const std::string& expr) noexcept;
|
bool invoke(const std::string& expr) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Private;
|
struct Private;
|
||||||
std::unique_ptr<Private> priv_;
|
std::unique_ptr<Private> priv_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -82,7 +82,7 @@ cookie(size_t n)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
output_sexp_stdout(Sexp&& sexp)
|
output_sexp_stdout(Sexp&& sexp, bool flush = false)
|
||||||
{
|
{
|
||||||
const auto str{sexp.to_sexp_string()};
|
const auto str{sexp.to_sexp_string()};
|
||||||
cookie(str.size() + 1);
|
cookie(str.size() + 1);
|
||||||
|
@ -90,6 +90,9 @@ output_sexp_stdout(Sexp&& sexp)
|
||||||
g_critical("failed to write output '%s'", str.c_str());
|
g_critical("failed to write output '%s'", str.c_str());
|
||||||
::raise(SIGTERM); /* terminate ourselves */
|
::raise(SIGTERM); /* terminate ourselves */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flush)
|
||||||
|
::fflush(::stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -100,7 +103,7 @@ report_error(const Mu::Error& err) noexcept
|
||||||
e.add_prop(":error", Sexp::make_number(static_cast<size_t>(err.code())));
|
e.add_prop(":error", Sexp::make_number(static_cast<size_t>(err.code())));
|
||||||
e.add_prop(":message", Sexp::make_string(err.what()));
|
e.add_prop(":message", Sexp::make_string(err.what()));
|
||||||
|
|
||||||
output_sexp_stdout(Sexp::make_list(std::move(e)));
|
output_sexp_stdout(Sexp::make_list(std::move(e)), true /*flush*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
MuError
|
MuError
|
||||||
|
|
Loading…
Reference in New Issue