From 2e9d26edc1c677188467415a03d258c45829990f Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 16 Apr 2025 10:42:23 +0200 Subject: [PATCH] clear etag values after feed purge --- .../src/standardserviceroot.cpp | 15 ++++++++++++--- .../src/standardserviceroot.h | 3 ++- src/librssguard/core/feedsmodel.cpp | 10 ++++++++++ src/librssguard/services/abstract/serviceroot.cpp | 4 ++++ src/librssguard/services/abstract/serviceroot.h | 3 +++ 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/librssguard-standard/src/standardserviceroot.cpp b/src/librssguard-standard/src/standardserviceroot.cpp index fc566ac22..0a4b765b1 100644 --- a/src/librssguard-standard/src/standardserviceroot.cpp +++ b/src/librssguard-standard/src/standardserviceroot.cpp @@ -61,6 +61,12 @@ void StandardServiceRoot::onDatabaseCleanup() { } } +void StandardServiceRoot::onAfterFeedsPurged(const QList& feeds) { + for (Feed* fd : feeds) { + static_cast(fd)->setLastEtag(QString()); + } +} + void StandardServiceRoot::start(bool freshly_activated) { DatabaseQueries::loadRootFromDatabase(this); @@ -227,7 +233,8 @@ void StandardServiceRoot::spaceHost(const QString& host, const QString& url) { m_spacingMutex.unlock(); if (secs_to_wait > 0) { - qDebugNN << LOGSEC_STANDARD << "Freezing feed with URL" << QUOTE_W_SPACE(url) << "for" << NONQUOTE_W_SPACE(secs_to_wait) + qDebugNN << LOGSEC_STANDARD << "Freezing feed with URL" << QUOTE_W_SPACE(url) << "for" + << NONQUOTE_W_SPACE(secs_to_wait) << "seconds, because its host was used for fetching another feed during the spacing period."; QThread::sleep(ulong(secs_to_wait)); qDebugNN << LOGSEC_STANDARD << "Freezing feed with URL" << QUOTE_W_SPACE(url) << "is done."; @@ -319,7 +326,8 @@ QList StandardServiceRoot::obtainNewMessages(Feed* feed, feed_contents = StandardFeed::generateFeedFileWithScript(feed->source(), download_timeout); } catch (const ScriptException& ex) { - qCriticalNN << LOGSEC_STANDARD << "Custom script for generating feed file failed:" << QUOTE_W_SPACE_DOT(ex.message()); + qCriticalNN << LOGSEC_STANDARD + << "Custom script for generating feed file failed:" << QUOTE_W_SPACE_DOT(ex.message()); throw FeedFetchException(Feed::Status::OtherError, ex.message()); } @@ -353,7 +361,8 @@ QList StandardServiceRoot::obtainNewMessages(Feed* feed, StandardFeed::postProcessFeedFileWithScript(f->postProcessScript(), feed_contents, download_timeout); } catch (const ScriptException& ex) { - qCriticalNN << LOGSEC_STANDARD << "Post-processing script for feed file failed:" << QUOTE_W_SPACE_DOT(ex.message()); + qCriticalNN << LOGSEC_STANDARD + << "Post-processing script for feed file failed:" << QUOTE_W_SPACE_DOT(ex.message()); throw FeedFetchException(Feed::Status::OtherError, ex.message()); } diff --git a/src/librssguard-standard/src/standardserviceroot.h b/src/librssguard-standard/src/standardserviceroot.h index 393dbabf5..ec84d6509 100644 --- a/src/librssguard-standard/src/standardserviceroot.h +++ b/src/librssguard-standard/src/standardserviceroot.h @@ -27,6 +27,7 @@ class StandardServiceRoot : public ServiceRoot { virtual FormAccountDetails* accountSetupDialog() const; virtual void onDatabaseCleanup(); + virtual void onAfterFeedsPurged(const QList& feeds); virtual void start(bool freshly_activated); virtual void stop(); virtual QString code() const; @@ -45,7 +46,7 @@ class StandardServiceRoot : public ServiceRoot { QList getContextMenuForFeed(StandardFeed* feed); void spaceHost(const QString& host, const QString& url); - void resetHostSpacing(const QString& host, const QDateTime &next_dt); + void resetHostSpacing(const QString& host, const QDateTime& next_dt); // If set to number > 0, then requests to fetch feeds // will be spaced by the given number (in seconds). diff --git a/src/librssguard/core/feedsmodel.cpp b/src/librssguard/core/feedsmodel.cpp index e8b796d40..163d8dfc4 100644 --- a/src/librssguard/core/feedsmodel.cpp +++ b/src/librssguard/core/feedsmodel.cpp @@ -536,6 +536,16 @@ bool FeedsModel::purgeArticles(const QList& feeds) { bool anything_purged = DatabaseQueries::purgeFeedArticles(database, feeds); if (anything_purged) { + QMultiHash feeds_per_root; + + for (auto* fd : feeds) { + feeds_per_root.insert(fd->getParentServiceRoot(), fd); + } + + for (auto* acc : feeds_per_root.uniqueKeys()) { + acc->onAfterFeedsPurged(feeds_per_root.values(acc)); + } + reloadCountsOfWholeModel(); emit reloadMessageListRequested(false); return true; diff --git a/src/librssguard/services/abstract/serviceroot.cpp b/src/librssguard/services/abstract/serviceroot.cpp index 2507551d6..476568459 100644 --- a/src/librssguard/services/abstract/serviceroot.cpp +++ b/src/librssguard/services/abstract/serviceroot.cpp @@ -1184,6 +1184,10 @@ bool ServiceRoot::onAfterMessagesRestoredFromBin(RootItem* selected_item, const return true; } +void ServiceRoot::onAfterFeedsPurged(const QList& feeds) { + Q_UNUSED(feeds) +} + CacheForServiceRoot* ServiceRoot::toCache() const { return dynamic_cast(const_cast(this)); } diff --git a/src/librssguard/services/abstract/serviceroot.h b/src/librssguard/services/abstract/serviceroot.h index 22c4dd4b3..b5a4fb446 100644 --- a/src/librssguard/services/abstract/serviceroot.h +++ b/src/librssguard/services/abstract/serviceroot.h @@ -189,6 +189,9 @@ class RSSGUARD_DLLSPEC ServiceRoot : public RootItem { // Selected item is naturally recycle bin. virtual bool onAfterMessagesRestoredFromBin(RootItem* selected_item, const QList& messages); + // Called AFTER articles of these feeds are purged from the database. + virtual void onAfterFeedsPurged(const QList& feeds); + // Returns the UNIQUE code of the given service. // NOTE: Keep in sync with ServiceEntryRoot::code(). virtual QString code() const = 0;