From 37c205999f77fc175d70bf0d286ebe5c77b540f1 Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Thu, 10 Aug 2023 00:07:47 +0200 Subject: Make some errors non-fatal --- jiddb.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 21 deletions(-) (limited to 'jiddb.cpp') diff --git a/jiddb.cpp b/jiddb.cpp index 3102e81..7d0d6da 100644 --- a/jiddb.cpp +++ b/jiddb.cpp @@ -33,20 +33,27 @@ JidDb::JidDb(const QString &jid) : std::cerr << "JidDb::JidDb: query exec failed" << std::endl; } -void JidDb::addToRoster(const QString &jid) +int JidDb::addToRoster(const QString &jid) { QSqlQuery q(db); if (!q.exec("insert or ignore into roster (jid) values ('" + jid + "');")) - throw std::runtime_error("JidDb::addToRoster: query exec failed"); + { + std::cerr << "JidDb::addToRoster: query exec failed" << std::endl; + return -1; + } Q_EMIT addedToRoster(jid); + return 0; } -void JidDb::addToRoster(const QStringList &roster) +int JidDb::addToRoster(const QStringList &roster) { for (const auto &r : roster) - addToRoster(r); + if (addToRoster(r)) + return -1; + + return 0; } QStringList JidDb::roster() const @@ -63,31 +70,43 @@ QStringList JidDb::roster() const return ret; } -void JidDb::ensureContactDb(const QString &jid) const +int JidDb::ensureContactDb(const QString &jid) const { QSqlQuery q(db); if (!q.exec("create table if not exists '" + jid + "' (direction TEXT, time INTEGER, body TEXT) strict;")) - throw std::runtime_error("JidDb::storeMessage: query exec failed"); + { + std::cerr << "JidDb::storeMessage: query exec failed" << std::endl; + return -1; + } + + return 0; } QList JidDb::getMessages(const QString &jid, const int tail) const { - QList ret; QSqlQuery q(db); - ensureContactDb(jid); - - if (tail < 0) + if (ensureContactDb(jid)) + return QList(); + else if (tail < 0) { if (!q.exec("select * from '" + jid + "' order by time;")) - throw std::runtime_error("JidDb::getMessages: query exec failed"); + { + std::cerr << "JidDb::getMessages: query exec failed"; + return QList(); + } } else if (!q.exec("select * from '" + jid + "' order by time desc limit " + QString::number(tail) + ";")) - throw std::runtime_error("JidDb::getMessages: query exec failed"); + { + std::cerr << "JidDb::getMessages: query exec failed" << std::endl; + return QList(); + } + + QList ret; while (q.next()) { @@ -96,7 +115,11 @@ QList JidDb::getMessages(const QString &jid, qlonglong t = q.value("time").toLongLong(&ok); if (!ok) - throw std::runtime_error("JidDb::getMessages: invalid time"); + { + std::cerr << "JidDb::getMessages: invalid time" << std::endl; + // Attempt to read other messages. + continue; + } m.body = q.value("body").toString(); m.dt = QDateTime::fromSecsSinceEpoch(t, QTimeZone::systemTimeZone()); @@ -108,7 +131,11 @@ QList JidDb::getMessages(const QString &jid, else if (dirstr == "out") m.direction = Direction::Out; else - throw std::invalid_argument("JidDb::getMessages: invalid direction"); + { + std::cerr << "JidDb::getMessages: invalid direction" << std::endl; + // Attempt to read other messages. + continue; + } ret << m; } @@ -116,8 +143,7 @@ QList JidDb::getMessages(const QString &jid, return ret; } -void JidDb::storeMessage(const JidDb::Message &msg) - const +int JidDb::storeMessage(const JidDb::Message &msg) const { QSqlQuery q(db); QString dir; @@ -140,22 +166,36 @@ void JidDb::storeMessage(const JidDb::Message &msg) "('" + dir + "', " + QString::number(msg.dt.toSecsSinceEpoch()) + ", " "'" + msg.body + "')")) - throw std::runtime_error("JidDb::storeMessage: query exec 2 failed"); + { + std::cerr << "JidDb::storeMessage: query exec 2 failed" << std::endl; + return -1; + } + + return 0; } -QList JidDb::getConversations() const +QStringList JidDb::tables() const { QSqlQuery q(db); if (!q.exec("select name from sqlite_schema where " "type = 'table' and name not like 'sqlite_%'")) - throw std::runtime_error("JidDb::getConversations: query failed"); + { + std::cerr << "JidDb::getConversations: query failed" << std::endl; + return QStringList(); + } - QStringList conversations; + QStringList ret; while (q.next()) - conversations << q.value("name").toString(); + ret << q.value("name").toString(); + return ret; +} + +QList JidDb::getConversations() const +{ + const auto conversations = tables(); QList ret; for (const auto &jid : conversations) -- cgit v1.2.3