aboutsummaryrefslogtreecommitdiff
path: root/jiddb.cpp
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-08-10 00:07:47 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-08-10 00:08:24 +0200
commit37c205999f77fc175d70bf0d286ebe5c77b540f1 (patch)
treeec20f4365fd6b938cb234997f7989c629aae347b /jiddb.cpp
parent05b2584fa4d773f5a88ed3ce98f5dd8304e11c34 (diff)
Make some errors non-fatal
Diffstat (limited to 'jiddb.cpp')
-rw-r--r--jiddb.cpp82
1 files changed, 61 insertions, 21 deletions
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::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)