diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-08-10 00:07:47 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-08-10 00:08:24 +0200 |
| commit | 37c205999f77fc175d70bf0d286ebe5c77b540f1 (patch) | |
| tree | ec20f4365fd6b938cb234997f7989c629aae347b | |
| parent | 05b2584fa4d773f5a88ed3ce98f5dd8304e11c34 (diff) | |
Make some errors non-fatal
| -rw-r--r-- | jiddb.cpp | 82 | ||||
| -rw-r--r-- | jiddb.h | 12 |
2 files changed, 68 insertions, 26 deletions
@@ -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::Message> JidDb::getMessages(const QString &jid, const int tail) const { - QList<Message> ret; QSqlQuery q(db); - ensureContactDb(jid); - - if (tail < 0) + if (ensureContactDb(jid)) + return QList<Message>(); + 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<Message>(); + } } 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<Message>(); + } + + QList<Message> ret; while (q.next()) { @@ -96,7 +115,11 @@ QList<JidDb::Message> 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::Message> 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::Message> 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::Conversation> 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::Conversation> JidDb::getConversations() const +{ + const auto conversations = tables(); QList<Conversation> ret; for (const auto &jid : conversations) @@ -36,17 +36,19 @@ public: public Q_SLOTS: QList<Conversation> getConversations() const; - QList<Message> getMessages(const QString &jid, int tail = -1) const; - void storeMessage(const Message &msg) const; - void addToRoster(const QString &jid); - void addToRoster(const QStringList &roster); + QList<Message> getMessages(const QString &jid, + int tail = -1) const; + int storeMessage(const Message &msg) const; + int addToRoster(const QString &jid); + int addToRoster(const QStringList &roster); Q_SIGNALS: void addedToRoster(QString jid); private: QSqlDatabase db; - void ensureContactDb(const QString &jid) const; + int ensureContactDb(const QString &jid) const; + QStringList tables() const; }; #endif |
