From 5b81d97bdaa54ee22e9a3534bcaf68ef938ed732 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 24 Jun 2020 14:12:03 +0200 Subject: [PATCH] save, work on filter loading, some cleanups --- resources/sql/db_init_mysql.sql | 2 +- resources/sql/db_init_sqlite.sql | 2 +- resources/sql/db_update_mysql_14_15.sql | 2 +- resources/sql/db_update_sqlite_14_15.sql | 2 +- src/librssguard/core/feeddownloader.cpp | 4 +- .../miscellaneous/databasequeries.cpp | 6 +++ .../miscellaneous/databasequeries.h | 39 +++++++++++++------ src/librssguard/miscellaneous/feedreader.cpp | 4 ++ src/librssguard/miscellaneous/feedreader.h | 2 + src/librssguard/services/abstract/feed.cpp | 16 +++++--- src/librssguard/services/abstract/feed.h | 7 ++-- .../services/gmail/gmailserviceroot.cpp | 2 +- .../inoreader/inoreaderserviceroot.cpp | 2 +- .../services/owncloud/owncloudserviceroot.cpp | 2 +- .../services/standard/standardserviceroot.cpp | 2 +- .../services/tt-rss/ttrssserviceroot.cpp | 2 +- 16 files changed, 64 insertions(+), 32 deletions(-) diff --git a/resources/sql/db_init_mysql.sql b/resources/sql/db_init_mysql.sql index c17ccef1b..c243700d1 100644 --- a/resources/sql/db_init_mysql.sql +++ b/resources/sql/db_init_mysql.sql @@ -137,7 +137,7 @@ CREATE TABLE IF NOT EXISTS MessageFilters ( -- ! CREATE TABLE IF NOT EXISTS MessageFiltersInFeeds ( filter INTEGER NOT NULL, - feed_custom_id INTEGER NOT NULL, + feed_custom_id TEXT NOT NULL, account_id INTEGER NOT NULL, FOREIGN KEY (filter) REFERENCES MessageFilters (id) ON DELETE CASCADE, diff --git a/resources/sql/db_init_sqlite.sql b/resources/sql/db_init_sqlite.sql index a6764b384..f63eb891e 100644 --- a/resources/sql/db_init_sqlite.sql +++ b/resources/sql/db_init_sqlite.sql @@ -131,7 +131,7 @@ CREATE TABLE IF NOT EXISTS MessageFilters ( -- ! CREATE TABLE IF NOT EXISTS MessageFiltersInFeeds ( filter INTEGER NOT NULL, - feed_custom_id INTEGER NOT NULL, + feed_custom_id TEXT NOT NULL, account_id INTEGER NOT NULL, FOREIGN KEY (filter) REFERENCES MessageFilters (id) ON DELETE CASCADE, diff --git a/resources/sql/db_update_mysql_14_15.sql b/resources/sql/db_update_mysql_14_15.sql index 693b52ce1..ec7275f3b 100755 --- a/resources/sql/db_update_mysql_14_15.sql +++ b/resources/sql/db_update_mysql_14_15.sql @@ -6,7 +6,7 @@ CREATE TABLE IF NOT EXISTS MessageFilters ( -- ! CREATE TABLE IF NOT EXISTS MessageFiltersInFeeds ( filter INTEGER NOT NULL, - feed_custom_id INTEGER NOT NULL, + feed_custom_id TEXT NOT NULL, account_id INTEGER NOT NULL, FOREIGN KEY (filter) REFERENCES MessageFilters (id) ON DELETE CASCADE, diff --git a/resources/sql/db_update_sqlite_14_15.sql b/resources/sql/db_update_sqlite_14_15.sql index 701558fc2..6be1d92c2 100755 --- a/resources/sql/db_update_sqlite_14_15.sql +++ b/resources/sql/db_update_sqlite_14_15.sql @@ -6,7 +6,7 @@ CREATE TABLE IF NOT EXISTS MessageFilters ( -- ! CREATE TABLE IF NOT EXISTS MessageFiltersInFeeds ( filter INTEGER NOT NULL, - feed_custom_id INTEGER NOT NULL, + feed_custom_id TEXT NOT NULL, account_id INTEGER NOT NULL, FOREIGN KEY (filter) REFERENCES MessageFilters (id) ON DELETE CASCADE, diff --git a/src/librssguard/core/feeddownloader.cpp b/src/librssguard/core/feeddownloader.cpp index a16dca377..2614e0046 100644 --- a/src/librssguard/core/feeddownloader.cpp +++ b/src/librssguard/core/feeddownloader.cpp @@ -101,7 +101,7 @@ void FeedDownloader::updateOneFeed(Feed* feed) { .remove(QRegularExpression(QSL("([\\n\\r])|(^\\s)"))); } - if (!feed->filters().isEmpty()) { + if (!feed->messageFilters().isEmpty()) { // Perform per-message filtering. QJSEngine filter_engine; @@ -117,7 +117,7 @@ void FeedDownloader::updateOneFeed(Feed* feed) { // Attach live message object to wrapper. msg_obj.setMessage(&msgs[i]); - auto feed_filters = feed->filters(); + auto feed_filters = feed->messageFilters(); for (int i = 0; i < feed_filters.size(); i++) { QPointer filter = feed_filters.at(i); diff --git a/src/librssguard/miscellaneous/databasequeries.cpp b/src/librssguard/miscellaneous/databasequeries.cpp index 887974969..60dd38950 100755 --- a/src/librssguard/miscellaneous/databasequeries.cpp +++ b/src/librssguard/miscellaneous/databasequeries.cpp @@ -1427,6 +1427,12 @@ QList DatabaseQueries::getMessageFilters(const QSqlDatabase& db, return filters; } +QMultiMap DatabaseQueries::messageFiltersInFeeds(const QSqlDatabase& db, int account_id, bool* ok) { + // TODO: return list of relations + + return {}; +} + QList DatabaseQueries::getStandardAccounts(const QSqlDatabase& db, bool* ok) { QSqlQuery q(db); QList roots; diff --git a/src/librssguard/miscellaneous/databasequeries.h b/src/librssguard/miscellaneous/databasequeries.h index f7961e15b..ccbb8c360 100644 --- a/src/librssguard/miscellaneous/databasequeries.h +++ b/src/librssguard/miscellaneous/databasequeries.h @@ -10,6 +10,7 @@ #include "services/abstract/serviceroot.h" #include "services/standard/standardfeed.h" +#include #include #include @@ -82,10 +83,12 @@ class DatabaseQueries { static Assignment getCategories(const QSqlDatabase& db, int account_id, bool* ok = nullptr); template - static Assignment getFeeds(const QSqlDatabase& db, int account_id, bool* ok = nullptr); + static Assignment getFeeds(const QSqlDatabase& db, const QList& global_filters, + int account_id, bool* ok = nullptr); // Message filters operators. static QList getMessageFilters(const QSqlDatabase& db, bool* ok = nullptr); + static QMultiMap messageFiltersInFeeds(const QSqlDatabase& db, int account_id, bool* ok = nullptr); // Standard account. static bool deleteFeed(const QSqlDatabase& db, int feed_custom_id, int account_id); @@ -216,18 +219,20 @@ Assignment DatabaseQueries::getCategories(const QSqlDatabase& db, int account_id } template -Assignment DatabaseQueries::getFeeds(const QSqlDatabase& db, int account_id, bool* ok) { +Assignment DatabaseQueries::getFeeds(const QSqlDatabase& db, const QList& global_filters, + int account_id, bool* ok) { Assignment feeds; // All categories are now loaded. - QSqlQuery query_feeds(db); + QSqlQuery query(db); + auto filters_in_feeds = messageFiltersInFeeds(db, account_id); - query_feeds.setForwardOnly(true); - query_feeds.prepare(QSL("SELECT * FROM Feeds WHERE account_id = :account_id;")); - query_feeds.bindValue(QSL(":account_id"), account_id); + query.setForwardOnly(true); + query.prepare(QSL("SELECT * FROM Feeds WHERE account_id = :account_id;")); + query.bindValue(QSL(":account_id"), account_id); - if (!query_feeds.exec()) { - qFatal("Query for obtaining feeds failed. Error message: '%s'.", qPrintable(query_feeds.lastError().text())); + if (!query.exec()) { + qFatal("Query for obtaining feeds failed. Error message: '%s'.", qPrintable(query.lastError().text())); if (ok != nullptr) { *ok = false; @@ -239,14 +244,24 @@ Assignment DatabaseQueries::getFeeds(const QSqlDatabase& db, int account_id, boo } } - while (query_feeds.next()) { + while (query.next()) { AssignmentItem pair; - pair.first = query_feeds.value(FDS_DB_CATEGORY_INDEX).toInt(); + pair.first = query.value(FDS_DB_CATEGORY_INDEX).toInt(); - T* feed = new T(query_feeds.record()); + Feed* feed = new T(query.record()); - fillFeedData(feed, query_feeds.record()); + if (filters_in_feeds.contains(feed->customId())) { + auto all_filters_for_this_feed = filters_in_feeds.values(feed->customId()); + + for (MessageFilter* fltr : global_filters) { + if (all_filters_for_this_feed.contains(fltr->id())) { + feed->appendMessageFilter(fltr); + } + } + } + + fillFeedData(static_cast(feed), query.record()); pair.second = feed; diff --git a/src/librssguard/miscellaneous/feedreader.cpp b/src/librssguard/miscellaneous/feedreader.cpp index 48565e92a..08109942b 100644 --- a/src/librssguard/miscellaneous/feedreader.cpp +++ b/src/librssguard/miscellaneous/feedreader.cpp @@ -235,6 +235,10 @@ void FeedReader::asyncCacheSaveFinished() { }); } +QList FeedReader::messageFilters() const { + return m_messageFilters; +} + void FeedReader::quit() { if (m_autoUpdateTimer->isActive()) { m_autoUpdateTimer->stop(); diff --git a/src/librssguard/miscellaneous/feedreader.h b/src/librssguard/miscellaneous/feedreader.h index 182fc37fd..d930a03bd 100644 --- a/src/librssguard/miscellaneous/feedreader.h +++ b/src/librssguard/miscellaneous/feedreader.h @@ -52,6 +52,8 @@ class RSSGUARD_DLLSPEC FeedReader : public QObject { void loadSaveMessageFilters(); + QList messageFilters() const; + public slots: void updateAllFeeds(); void stopRunningFeedUpdate(); diff --git a/src/librssguard/services/abstract/feed.cpp b/src/librssguard/services/abstract/feed.cpp index 7bfc7d5aa..1de515805 100755 --- a/src/librssguard/services/abstract/feed.cpp +++ b/src/librssguard/services/abstract/feed.cpp @@ -19,7 +19,7 @@ Feed::Feed(RootItem* parent) : RootItem(parent), m_url(QString()), m_status(Normal), m_autoUpdateType(DefaultAutoUpdate), m_autoUpdateInitialInterval(DEFAULT_AUTO_UPDATE_INTERVAL), m_autoUpdateRemainingInterval(DEFAULT_AUTO_UPDATE_INTERVAL), - m_filters(QList>()) { + m_messageFilters(QList>()) { setKind(RootItemKind::Feed); } @@ -52,7 +52,7 @@ Feed::Feed(const Feed& other) : RootItem(other) { setAutoUpdateType(other.autoUpdateType()); setAutoUpdateInitialInterval(other.autoUpdateInitialInterval()); setAutoUpdateRemainingInterval(other.autoUpdateRemainingInterval()); - setFilters(other.filters()); + setFilters(other.messageFilters()); } Feed::~Feed() = default; @@ -148,6 +148,10 @@ void Feed::setUrl(const QString& url) { m_url = url; } +void Feed::appendMessageFilter(MessageFilter* filter) { + m_messageFilters.append(QPointer(filter)); +} + void Feed::updateCounts(bool including_total_count) { bool is_main_thread = QThread::currentThread() == qApp->thread(); QSqlDatabase database = is_main_thread ? @@ -280,18 +284,18 @@ QString Feed::getStatusDescription() const { } } -QList> Feed::filters() const { - return m_filters; +QList> Feed::messageFilters() const { + return m_messageFilters; } void Feed::setFilters(const QList>& filters) { - m_filters = filters; + m_messageFilters = filters; } QString Feed::additionalTooltip() const { return tr("Auto-update status: %1\n" "Active message filters: %2\n" "Status: %3").arg(getAutoUpdateStatusDescription(), - QString::number(m_filters.size()), + QString::number(m_messageFilters.size()), getStatusDescription()); } diff --git a/src/librssguard/services/abstract/feed.h b/src/librssguard/services/abstract/feed.h index 8bb93ff05..1b9edcffe 100644 --- a/src/librssguard/services/abstract/feed.h +++ b/src/librssguard/services/abstract/feed.h @@ -69,8 +69,9 @@ class Feed : public RootItem { QString url() const; void setUrl(const QString& url); - QList> filters() const; - void setFilters(const QList>& filters); + void appendMessageFilter(MessageFilter* filter); + QList> messageFilters() const; + void setFilters(const QList>& messageFilters); bool markAsReadUnread(ReadStatus status); bool cleanMessages(bool clean_read_only); @@ -93,7 +94,7 @@ class Feed : public RootItem { int m_autoUpdateRemainingInterval{}; int m_totalCount{}; int m_unreadCount{}; - QList> m_filters; + QList> m_messageFilters; }; Q_DECLARE_METATYPE(Feed::AutoUpdateType) diff --git a/src/librssguard/services/gmail/gmailserviceroot.cpp b/src/librssguard/services/gmail/gmailserviceroot.cpp index 4c19d059d..9863439de 100644 --- a/src/librssguard/services/gmail/gmailserviceroot.cpp +++ b/src/librssguard/services/gmail/gmailserviceroot.cpp @@ -57,7 +57,7 @@ void GmailServiceRoot::writeNewEmail() { void GmailServiceRoot::loadFromDatabase() { QSqlDatabase database = qApp->database()->connection(metaObject()->className()); Assignment categories = DatabaseQueries::getCategories(database, accountId()); - Assignment feeds = DatabaseQueries::getFeeds(database, accountId()); + Assignment feeds = DatabaseQueries::getFeeds(database, qApp->feedReader()->messageFilters(), accountId()); // All data are now obtained, lets create the hierarchy. assembleCategories(categories); diff --git a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp index 9ae5b3243..b6ccf66d2 100644 --- a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp +++ b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp @@ -51,7 +51,7 @@ void InoreaderServiceRoot::updateTitle() { void InoreaderServiceRoot::loadFromDatabase() { QSqlDatabase database = qApp->database()->connection(metaObject()->className()); Assignment categories = DatabaseQueries::getCategories(database, accountId()); - Assignment feeds = DatabaseQueries::getFeeds(database, accountId()); + Assignment feeds = DatabaseQueries::getFeeds(database, qApp->feedReader()->messageFilters(), accountId()); // All data are now obtained, lets create the hierarchy. assembleCategories(categories); diff --git a/src/librssguard/services/owncloud/owncloudserviceroot.cpp b/src/librssguard/services/owncloud/owncloudserviceroot.cpp index 07e5f3067..80f0900d4 100644 --- a/src/librssguard/services/owncloud/owncloudserviceroot.cpp +++ b/src/librssguard/services/owncloud/owncloudserviceroot.cpp @@ -196,7 +196,7 @@ RootItem* OwnCloudServiceRoot::obtainNewTreeForSyncIn() const { void OwnCloudServiceRoot::loadFromDatabase() { QSqlDatabase database = qApp->database()->connection(metaObject()->className()); Assignment categories = DatabaseQueries::getCategories(database, accountId()); - Assignment feeds = DatabaseQueries::getFeeds(database, accountId()); + Assignment feeds = DatabaseQueries::getFeeds(database, qApp->feedReader()->messageFilters(), accountId()); // All data are now obtained, lets create the hierarchy. assembleCategories(categories); diff --git a/src/librssguard/services/standard/standardserviceroot.cpp b/src/librssguard/services/standard/standardserviceroot.cpp index 4043ba1c5..5352eead9 100644 --- a/src/librssguard/services/standard/standardserviceroot.cpp +++ b/src/librssguard/services/standard/standardserviceroot.cpp @@ -133,7 +133,7 @@ Qt::ItemFlags StandardServiceRoot::additionalFlags() const { void StandardServiceRoot::loadFromDatabase() { QSqlDatabase database = qApp->database()->connection(metaObject()->className()); Assignment categories = DatabaseQueries::getCategories(database, accountId()); - Assignment feeds = DatabaseQueries::getFeeds(database, accountId()); + Assignment feeds = DatabaseQueries::getFeeds(database, qApp->feedReader()->messageFilters(), accountId()); // All data are now obtained, lets create the hierarchy. assembleCategories(categories); diff --git a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp index addb318fd..cd3ece626 100644 --- a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp +++ b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp @@ -207,7 +207,7 @@ void TtRssServiceRoot::saveAccountDataToDatabase() { void TtRssServiceRoot::loadFromDatabase() { QSqlDatabase database = qApp->database()->connection(metaObject()->className()); Assignment categories = DatabaseQueries::getCategories(database, accountId()); - Assignment feeds = DatabaseQueries::getFeeds(database, accountId()); + Assignment feeds = DatabaseQueries::getFeeds(database, qApp->feedReader()->messageFilters(), accountId()); // All data are now obtained, lets create the hierarchy. assembleCategories(categories);