14 Dumper::Dumper (
const QString& from,
const QString& to, QObject *parent)
16 , Dumper_ {
new QProcess {
this } }
17 , Restorer_ {
new QProcess {
this } }
19 Iface_.reportStarted ();
21 Dumper_->setStandardOutputProcess (Restorer_);
24 &QProcess::errorOccurred,
26 [
this] { HandleProcessError (Dumper_); });
28 &QProcess::errorOccurred,
30 [
this] { HandleProcessError (Restorer_); });
32 qOverload<int, QProcess::ExitStatus> (&QProcess::finished),
34 [
this] { HandleProcessFinished (Dumper_); });
36 qOverload<int, QProcess::ExitStatus> (&QProcess::finished),
38 [
this] { HandleProcessFinished (Restorer_); });
40 static const QString sqliteExecutable = QStringLiteral (
"sqlite3");
41 Dumper_->start (sqliteExecutable, { from, QStringLiteral (
".dump") });
42 Restorer_->start (sqliteExecutable, { to });
47 return Iface_.future ();
50 void Dumper::HandleProcessFinished (QProcess *process)
52 const auto& stderr = QString::fromUtf8 (process->readAllStandardError ());
53 const auto exitCode = process->exitCode ();
55 qDebug () << Q_FUNC_INFO
56 << process->exitStatus ()
60 switch (process->exitStatus ())
62 case QProcess::CrashExit:
68 auto errMsg = tr (
"Dumping process crashed: %1.")
69 .arg (stderr.isEmpty () ?
70 process->errorString () :
72 ReportResult (
Error { std::move (errMsg) });
75 case QProcess::NormalExit:
79 auto errMsg = tr (
"Dumping process finished with error: %1 (%2).")
82 ReportResult (
Error { std::move (errMsg) });
84 else if (++FinishedCount_ == 2)
94 void Dumper::HandleProcessError (
const QProcess *process)
96 qWarning () << Q_FUNC_INFO
98 << process->errorString ();
105 const auto& errMsg = process->error () == QProcess::FailedToStart ?
106 tr (
"Unable to start dumping process: %1. Do you have sqlite3 installed?") :
107 tr (
"Unable to dump the database: %1.");
108 ReportResult (Error { errMsg.arg (process->errorString ()) });
111 void Dumper::ReportResult (
const Result_t& result)
113 Iface_.reportFinished (&result);