From 23b0f411d6f8dc27005bcb4ae142786e6b80d8ee Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sat, 12 Dec 2015 12:43:30 +0100 Subject: [PATCH] Marking TT-RSS read/unread works - for feed. --- src/services/standard/standardserviceroot.cpp | 4 +- src/services/tt-rss/ttrssfeed.cpp | 3 +- src/services/tt-rss/ttrssserviceroot.cpp | 48 ++++++++++++++++++- src/services/tt-rss/ttrssserviceroot.h | 2 + 4 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/services/standard/standardserviceroot.cpp b/src/services/standard/standardserviceroot.cpp index 512288582..97a974fb1 100755 --- a/src/services/standard/standardserviceroot.cpp +++ b/src/services/standard/standardserviceroot.cpp @@ -156,7 +156,7 @@ bool StandardServiceRoot::markFeedsReadUnread(QList items, ReadStatus rea query_read_msg.setForwardOnly(true); if (!query_read_msg.prepare(QString("UPDATE Messages SET is_read = :read " - "WHERE feed IN (%1) AND is_deleted = 0;").arg(textualFeedIds(items).join(QSL(", "))))) { + "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0;").arg(textualFeedIds(items).join(QSL(", "))))) { qWarning("Query preparation failed for feeds read change."); db_handle.rollback(); @@ -172,7 +172,7 @@ bool StandardServiceRoot::markFeedsReadUnread(QList items, ReadStatus rea // Commit changes. if (db_handle.commit()) { - // Messages are cleared, now inform model about need to reload data. + // Messages are switched, now inform model about need to reload data. QList itemss; foreach (Feed *feed, items) { diff --git a/src/services/tt-rss/ttrssfeed.cpp b/src/services/tt-rss/ttrssfeed.cpp index a8b228522..a1e9ce144 100755 --- a/src/services/tt-rss/ttrssfeed.cpp +++ b/src/services/tt-rss/ttrssfeed.cpp @@ -157,8 +157,7 @@ bool TtRssFeed::markAsReadUnread(RootItem::ReadStatus status) { return false; } else { - // TODO: todo - //return Feed::markAsReadUnread(status); + return serviceRoot()->markFeedsReadUnread(QList() << this, status); } } diff --git a/src/services/tt-rss/ttrssserviceroot.cpp b/src/services/tt-rss/ttrssserviceroot.cpp index 4ae0c6e97..099c4e8fa 100755 --- a/src/services/tt-rss/ttrssserviceroot.cpp +++ b/src/services/tt-rss/ttrssserviceroot.cpp @@ -310,6 +310,50 @@ QStringList TtRssServiceRoot::customIDSOfMessagesForItem(RootItem *item) { } } +bool TtRssServiceRoot::markFeedsReadUnread(QList items, RootItem::ReadStatus read) { + QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); + + if (!db_handle.transaction()) { + qWarning("Starting transaction for feeds read change."); + return false; + } + + QSqlQuery query_read_msg(db_handle); + query_read_msg.setForwardOnly(true); + + if (!query_read_msg.prepare(QString("UPDATE Messages SET is_read = :read " + "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0;").arg(textualFeedIds(items).join(QSL(", "))))) { + qWarning("Query preparation failed for feeds read change."); + + db_handle.rollback(); + return false; + } + + query_read_msg.bindValue(QSL(":read"), read == RootItem::Read ? 1 : 0); + + if (!query_read_msg.exec()) { + qDebug("Query execution for feeds read change failed."); + db_handle.rollback(); + } + + // Commit changes. + if (db_handle.commit()) { + QList itemss; + + foreach (Feed *feed, items) { + feed->updateCounts(false); + itemss.append(feed); + } + + itemChanged(itemss); + requestReloadMessageList(read == RootItem::Read); + return true; + } + else { + return db_handle.rollback(); + } +} + void TtRssServiceRoot::saveAccountDataToDatabase() { if (accountId() != NO_PARENT_CATEGORY) { // We are overwritting previously saved data. @@ -477,7 +521,7 @@ QStringList TtRssServiceRoot::textualFeedIds(const QList &feeds) { stringy_ids.reserve(feeds.size()); foreach (Feed *feed, feeds) { - stringy_ids.append(QString("'%1'").arg(QString::number(static_cast(feed)->customId()))); + stringy_ids.append(QString("'%1'").arg(QString::number(qobject_cast(feed)->customId()))); } return stringy_ids; @@ -525,7 +569,7 @@ void TtRssServiceRoot::storeNewFeedTree(RootItem *root) { query_category.bindValue(QSL(":parent_id"), child->parent()->id()); query_category.bindValue(QSL(":title"), child->title()); query_category.bindValue(QSL(":account_id"), accountId()); - query_category.bindValue(QSL(":custom_id"), QString::number(static_cast(child)->customId())); + query_category.bindValue(QSL(":custom_id"), QString::number(qobject_cast(child)->customId())); if (query_category.exec()) { child->setId(query_category.lastInsertId().toInt()); diff --git a/src/services/tt-rss/ttrssserviceroot.h b/src/services/tt-rss/ttrssserviceroot.h index 6dd03a2a7..d1ff3ae38 100755 --- a/src/services/tt-rss/ttrssserviceroot.h +++ b/src/services/tt-rss/ttrssserviceroot.h @@ -73,6 +73,8 @@ class TtRssServiceRoot : public ServiceRoot { // Returns list of custom IDS of all DB messages in given item. QStringList customIDSOfMessagesForItem(RootItem *item); + bool markFeedsReadUnread(QList items, ReadStatus read); + void saveAccountDataToDatabase(); void updateTitle(); void completelyRemoveAllData();