diff --git a/src/miscellaneous/databasequeries.cpp b/src/miscellaneous/databasequeries.cpp index 0d5ab92e1..05f7d7d73 100644 --- a/src/miscellaneous/databasequeries.cpp +++ b/src/miscellaneous/databasequeries.cpp @@ -23,15 +23,15 @@ bool DatabaseQueries::markMessagesRead(QSqlDatabase db, const QStringList &ids, RootItem::ReadStatus read) { - QSqlQuery query_read_msg(db); - query_read_msg.setForwardOnly(true); + QSqlQuery q(db); + q.setForwardOnly(true); - return query_read_msg.exec(QString(QSL("UPDATE Messages SET is_read = %2 WHERE id IN (%1);")) - .arg(ids.join(QSL(", ")), read == RootItem::Read ? QSL("1") : QSL("0"))); + return q.exec(QString(QSL("UPDATE Messages SET is_read = %2 WHERE id IN (%1);")) + .arg(ids.join(QSL(", ")), read == RootItem::Read ? QSL("1") : QSL("0"))); } bool DatabaseQueries::markMessageImportant(QSqlDatabase db, int id, RootItem::Importance importance) { - QSqlQuery q;(db); + QSqlQuery q(db); q.setForwardOnly(true); if (!q.prepare(QSL("UPDATE Messages SET is_important = :important WHERE id = :id;"))) { @@ -46,6 +46,18 @@ bool DatabaseQueries::markMessageImportant(QSqlDatabase db, int id, RootItem::Im return q.exec(); } +bool DatabaseQueries::markBinReadUnread(QSqlDatabase db, int account_id, RootItem::ReadStatus read) { + QSqlQuery q(db); + q.setForwardOnly(true); + q.prepare("UPDATE Messages SET is_read = :read " + "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); + + q.bindValue(QSL(":read"), read == RootItem::Read ? 1 : 0); + q.bindValue(QSL(":account_id"), account_id); + + return q.exec(); +} + bool DatabaseQueries::switchMessagesImportance(QSqlDatabase db, const QStringList &ids) { QSqlQuery q(db); q.setForwardOnly(true); @@ -68,41 +80,51 @@ bool DatabaseQueries::deleteOrRestoreMessagesToFromBin(QSqlDatabase db, const QS QString::number(deleted ? 1 : 0))); } -bool DatabaseQueries::purgeImportantMessages(QSqlDatabase db) { - QSqlQuery query = QSqlQuery(db); - query.setForwardOnly(true); - query.prepare(QSL("DELETE FROM Messages WHERE is_important = 1;")); +bool DatabaseQueries::restoreBin(QSqlDatabase db, int account_id) { + QSqlQuery q(db); + q.setForwardOnly(true); + q.prepare("UPDATE Messages SET is_deleted = 0 " + "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); + q.bindValue(QSL(":account_id"), account_id); - return query.exec(); + return q.exec(); +} + +bool DatabaseQueries::purgeImportantMessages(QSqlDatabase db) { + QSqlQuery q(db); + q.setForwardOnly(true); + q.prepare(QSL("DELETE FROM Messages WHERE is_important = 1;")); + + return q.exec(); } bool DatabaseQueries::purgeReadMessages(QSqlDatabase db) { - QSqlQuery query = QSqlQuery(db); - query.setForwardOnly(true); - query.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND is_deleted = :is_deleted AND is_read = :is_read;")); - query.bindValue(QSL(":is_read"), 1); + QSqlQuery q(db); + q.setForwardOnly(true); + q.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND is_deleted = :is_deleted AND is_read = :is_read;")); + q.bindValue(QSL(":is_read"), 1); // Remove only messages which are NOT in recycle bin. - query.bindValue(QSL(":is_deleted"), 0); + q.bindValue(QSL(":is_deleted"), 0); // Remove only messages which are NOT starred. - query.bindValue(QSL(":is_important"), 0); + q.bindValue(QSL(":is_important"), 0); - return query.exec(); + return q.exec(); } bool DatabaseQueries::purgeOldMessages(QSqlDatabase db, int older_than_days) { - QSqlQuery query = QSqlQuery(db); + QSqlQuery q = QSqlQuery(db); const qint64 since_epoch = QDateTime::currentDateTimeUtc().addDays(-older_than_days).toMSecsSinceEpoch(); - query.setForwardOnly(true); - query.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND date_created < :date_created;")); - query.bindValue(QSL(":date_created"), since_epoch); + q.setForwardOnly(true); + q.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND date_created < :date_created;")); + q.bindValue(QSL(":date_created"), since_epoch); // Remove only messages which are NOT starred. - query.bindValue(QSL(":is_important"), 0); + q.bindValue(QSL(":is_important"), 0); - return query.exec(); + return q.exec(); } bool DatabaseQueries::purgeRecycleBin(QSqlDatabase db) { @@ -223,7 +245,7 @@ int DatabaseQueries::getMessageCountsForBin(QSqlDatabase db, int account_id, boo } } -QList DatabaseQueries::getUndeletedMessages(QSqlDatabase db, int feed_custom_id, int account_id, bool *ok) { +QList DatabaseQueries::getUndeletedMessagesForFeed(QSqlDatabase db, int feed_custom_id, int account_id, bool *ok) { QList messages; QSqlQuery q(db); q.setForwardOnly(true); @@ -257,6 +279,39 @@ QList DatabaseQueries::getUndeletedMessages(QSqlDatabase db, int feed_c return messages; } +QList DatabaseQueries::getUndeletedMessagesForBin(QSqlDatabase db, int account_id, bool *ok) { + QList messages; + QSqlQuery q(db); + q.setForwardOnly(true); + q.prepare("SELECT * " + "FROM Messages " + "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); + + q.bindValue(QSL(":account_id"), account_id); + + if (q.exec()) { + while (q.next()) { + bool decoded; + Message message = Message::fromSqlRecord(q.record(), &decoded); + + if (decoded) { + messages.append(message); + } + } + + if (ok != NULL) { + *ok = true; + } + } + else { + if (ok != NULL) { + *ok = false; + } + } + + return messages; +} + int DatabaseQueries::updateMessages(QSqlDatabase db, const QList &messages, int feed_custom_id, @@ -444,5 +499,22 @@ int DatabaseQueries::updateMessages(QSqlDatabase db, return updated_messages; } +bool DatabaseQueries::cleanMessagesFromBin(QSqlDatabase db, bool clear_only_read, int account_id) { + QSqlQuery query_empty_bin(db); + query_empty_bin.setForwardOnly(true); + + if (clear_only_read) { + query_empty_bin.prepare("UPDATE Messages SET is_pdeleted = 1 " + "WHERE is_read = 1 AND is_deleted = 1 AND account_id = :account_id;"); + } + else { + query_empty_bin.prepare(QSL("UPDATE Messages SET is_pdeleted = 1 WHERE is_deleted = 1 AND account_id = :account_id;")); + } + + query_empty_bin.bindValue(QSL(":account_id"), account_id); + + return query_empty_bin.exec(); +} + DatabaseQueries::DatabaseQueries() { } diff --git a/src/miscellaneous/databasequeries.h b/src/miscellaneous/databasequeries.h index 0e20c0895..eb57ab98b 100644 --- a/src/miscellaneous/databasequeries.h +++ b/src/miscellaneous/databasequeries.h @@ -27,9 +27,11 @@ class DatabaseQueries { public: static bool markMessagesRead(QSqlDatabase db, const QStringList &ids, RootItem::ReadStatus read); static bool markMessageImportant(QSqlDatabase db, int id, RootItem::Importance importance); + static bool markBinReadUnread(QSqlDatabase db, int account_id, RootItem::ReadStatus read); static bool switchMessagesImportance(QSqlDatabase db, const QStringList &ids); static bool permanentlyDeleteMessages(QSqlDatabase db, const QStringList &ids); static bool deleteOrRestoreMessagesToFromBin(QSqlDatabase db, const QStringList &ids, bool deleted); + static bool restoreBin(QSqlDatabase db, int account_id); static bool purgeImportantMessages(QSqlDatabase db); static bool purgeReadMessages(QSqlDatabase db); static bool purgeOldMessages(QSqlDatabase db, int older_than_days); @@ -39,9 +41,11 @@ class DatabaseQueries { static int getMessageCountsForFeed(QSqlDatabase db, int feed_custom_id, int account_id, bool including_total_counts, bool *ok = NULL); static int getMessageCountsForBin(QSqlDatabase db, int account_id, bool including_total_counts, bool *ok = NULL); - static QList getUndeletedMessages(QSqlDatabase db, int feed_custom_id, int account_id, bool *ok = NULL); + static QList getUndeletedMessagesForFeed(QSqlDatabase db, int feed_custom_id, int account_id, bool *ok = NULL); + static QList getUndeletedMessagesForBin(QSqlDatabase db, int account_id, bool *ok = NULL); static int updateMessages(QSqlDatabase db, const QList &messages, int feed_custom_id, int account_id, const QString &url, bool *any_message_changed, bool *ok = NULL); + static bool cleanMessagesFromBin(QSqlDatabase db, bool clear_only_read, int account_id); private: explicit DatabaseQueries(); diff --git a/src/services/abstract/feed.cpp b/src/services/abstract/feed.cpp index f8ed435f6..d8b8aaff1 100755 --- a/src/services/abstract/feed.cpp +++ b/src/services/abstract/feed.cpp @@ -36,7 +36,7 @@ Feed::~Feed() { QList Feed::undeletedMessages() const { QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); - return DatabaseQueries::getUndeletedMessages(database, customId(), getParentServiceRoot()->accountId()); + return DatabaseQueries::getUndeletedMessagesForFeed(database, customId(), getParentServiceRoot()->accountId()); } QVariant Feed::data(int column, int role) const { diff --git a/src/services/abstract/recyclebin.cpp b/src/services/abstract/recyclebin.cpp index 7a99bf032..51683d2b4 100755 --- a/src/services/abstract/recyclebin.cpp +++ b/src/services/abstract/recyclebin.cpp @@ -84,48 +84,18 @@ QList RecycleBin::contextMenu() { } QList RecycleBin::undeletedMessages() const { - QList messages; const int account_id = getParentServiceRoot()->accountId(); QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); - QSqlQuery query_read_msg(database); - query_read_msg.setForwardOnly(true); - query_read_msg.prepare("SELECT * " - "FROM Messages " - "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); - query_read_msg.bindValue(QSL(":account_id"), account_id); - - if (query_read_msg.exec()) { - while (query_read_msg.next()) { - bool decoded; - Message message = Message::fromSqlRecord(query_read_msg.record(), &decoded); - - if (decoded) { - messages.append(message); - } - - messages.append(message); - } - } - - return messages; + return DatabaseQueries::getUndeletedMessagesForBin(database, account_id); } bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) { - QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); - QSqlQuery query_read_msg(db_handle); + QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); ServiceRoot *parent_root = getParentServiceRoot(); - query_read_msg.setForwardOnly(true); - query_read_msg.prepare("UPDATE Messages SET is_read = :read " - "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); - - query_read_msg.bindValue(QSL(":read"), status == RootItem::Read ? 1 : 0); - query_read_msg.bindValue(QSL(":account_id"), parent_root->accountId()); - - if (query_read_msg.exec()) { + if (DatabaseQueries::markBinReadUnread(database, parent_root->accountId(), status)) { updateCounts(false); - parent_root->itemChanged(QList() << this); parent_root->requestReloadMessageList(status == RootItem::Read); return true; @@ -136,23 +106,10 @@ bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) { } bool RecycleBin::cleanMessages(bool clear_only_read) { - QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); + QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); ServiceRoot *parent_root = getParentServiceRoot(); - QSqlQuery query_empty_bin(db_handle); - query_empty_bin.setForwardOnly(true); - - if (clear_only_read) { - query_empty_bin.prepare("UPDATE Messages SET is_pdeleted = 1 " - "WHERE is_read = 1 AND is_deleted = 1 AND account_id = :account_id;"); - } - else { - query_empty_bin.prepare(QSL("UPDATE Messages SET is_pdeleted = 1 WHERE is_deleted = 1 AND account_id = :account_id;")); - } - - query_empty_bin.bindValue(QSL(":account_id"), parent_root->accountId()); - - if (query_empty_bin.exec()) { + if (DatabaseQueries::cleanMessagesFromBin(database, clear_only_read, parent_root->accountId())) { updateCounts(true); parent_root->itemChanged(QList() << this); parent_root->requestReloadMessageList(true); @@ -168,16 +125,10 @@ bool RecycleBin::empty() { } bool RecycleBin::restore() { - QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); + QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); ServiceRoot *parent_root = getParentServiceRoot(); - QSqlQuery query_empty_bin(db_handle); - query_empty_bin.setForwardOnly(true); - query_empty_bin.prepare("UPDATE Messages SET is_deleted = 0 " - "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;"); - query_empty_bin.bindValue(QSL(":account_id"), parent_root->accountId()); - - if (query_empty_bin.exec()) { + if (DatabaseQueries::restoreBin(database, parent_root->accountId())) { parent_root->updateCounts(true); parent_root->itemChanged(parent_root->getSubTree()); parent_root->requestReloadMessageList(true);