From 4476dcf811b98191eec223fac21b955cd4a58f7a Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sun, 15 Aug 2021 20:06:50 +0200 Subject: [PATCH] fix #465 --- src/librssguard/database/databasequeries.cpp | 14 ++++++---- src/librssguard/database/databasequeries.h | 2 +- .../services/abstract/serviceroot.cpp | 26 ++++++++++++------- .../services/abstract/serviceroot.h | 10 ++++--- .../services/feedly/feedlyserviceroot.cpp | 2 +- .../services/greader/greaderserviceroot.cpp | 2 +- .../services/tt-rss/ttrssserviceroot.cpp | 2 +- 7 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/librssguard/database/databasequeries.cpp b/src/librssguard/database/databasequeries.cpp index 0a1b1cbbd..5d54dd61b 100755 --- a/src/librssguard/database/databasequeries.cpp +++ b/src/librssguard/database/databasequeries.cpp @@ -1524,7 +1524,10 @@ bool DatabaseQueries::deleteAccount(const QSqlDatabase& db, int account_id) { return true; } -bool DatabaseQueries::deleteAccountData(const QSqlDatabase& db, int account_id, bool delete_messages_too) { +bool DatabaseQueries::deleteAccountData(const QSqlDatabase& db, + int account_id, + bool delete_messages_too, + bool delete_labels_too) { bool result = true; QSqlQuery q(db); @@ -1545,15 +1548,16 @@ bool DatabaseQueries::deleteAccountData(const QSqlDatabase& db, int account_id, result &= q.exec(); if (delete_messages_too) { - // If we delete message, make sure to delete message/label assignments too. q.prepare(QSL("DELETE FROM LabelsInMessages WHERE account_id = :account_id;")); q.bindValue(QSL(":account_id"), account_id); result &= q.exec(); } - q.prepare(QSL("DELETE FROM Labels WHERE account_id = :account_id;")); - q.bindValue(QSL(":account_id"), account_id); - result &= q.exec(); + if (delete_labels_too) { + q.prepare(QSL("DELETE FROM Labels WHERE account_id = :account_id;")); + q.bindValue(QSL(":account_id"), account_id); + result &= q.exec(); + } return result; } diff --git a/src/librssguard/database/databasequeries.h b/src/librssguard/database/databasequeries.h index b0455d883..296e4007e 100644 --- a/src/librssguard/database/databasequeries.h +++ b/src/librssguard/database/databasequeries.h @@ -116,7 +116,7 @@ class DatabaseQueries { static QPair updateMessages(QSqlDatabase db, const QList& messages, Feed* feed, bool force_update, bool* ok = nullptr); static bool deleteAccount(const QSqlDatabase& db, int account_id); - static bool deleteAccountData(const QSqlDatabase& db, int account_id, bool delete_messages_too); + static bool deleteAccountData(const QSqlDatabase& db, int account_id, bool delete_messages_too, bool delete_labels_too); static bool cleanLabelledMessages(const QSqlDatabase& db, bool clean_read_only, Label* label); static bool cleanImportantMessages(const QSqlDatabase& db, bool clean_read_only, int account_id); static bool cleanUnreadMessages(const QSqlDatabase& db, int account_id); diff --git a/src/librssguard/services/abstract/serviceroot.cpp b/src/librssguard/services/abstract/serviceroot.cpp index 7f5d8fcda..c26afc73d 100644 --- a/src/librssguard/services/abstract/serviceroot.cpp +++ b/src/librssguard/services/abstract/serviceroot.cpp @@ -167,10 +167,10 @@ bool ServiceRoot::canBeDeleted() const { void ServiceRoot::completelyRemoveAllData() { // Purge old data from SQL and clean all model items. - cleanAllItemsFromModel(); - removeOldAccountFromDatabase(true); + cleanAllItemsFromModel(true); + removeOldAccountFromDatabase(true, true); updateCounts(true); - itemChanged(QList() << this); + itemChanged({ this }); requestReloadMessageList(true); } @@ -188,13 +188,16 @@ QIcon ServiceRoot::feedIconForMessage(const QString& feed_custom_id) const { } } -void ServiceRoot::removeOldAccountFromDatabase(bool including_messages) { +void ServiceRoot::removeOldAccountFromDatabase(bool delete_messages_too, bool delete_labels_too) { QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className()); - DatabaseQueries::deleteAccountData(database, accountId(), including_messages); + DatabaseQueries::deleteAccountData(database, + accountId(), + delete_messages_too, + delete_labels_too); } -void ServiceRoot::cleanAllItemsFromModel() { +void ServiceRoot::cleanAllItemsFromModel(bool clean_labels_too) { auto chi = childItems(); for (RootItem* top_level_item : qAsConst(chi)) { @@ -206,7 +209,7 @@ void ServiceRoot::cleanAllItemsFromModel() { } } - if (labelsNode() != nullptr) { + if (labelsNode() != nullptr && clean_labels_too) { auto lbl_chi = labelsNode()->childItems(); for (RootItem* lbl : qAsConst(lbl_chi)) { @@ -425,8 +428,13 @@ void ServiceRoot::syncIn() { auto feed_custom_data = storeCustomFeedsData(); // Remove from feeds model, then from SQL but leave messages intact. - cleanAllItemsFromModel(); - removeOldAccountFromDatabase(false); + bool uses_remote_labels = (supportedLabelOperations() & LabelOperation::Synchronised) == LabelOperation::Synchronised; + + // Remove stuff. + cleanAllItemsFromModel(uses_remote_labels); + removeOldAccountFromDatabase(false, uses_remote_labels); + + // Restore some local settings to feeds etc. restoreCustomFeedsData(feed_custom_data, new_tree->getHashedSubTreeFeeds()); // Model is clean, now store new tree into DB and diff --git a/src/librssguard/services/abstract/serviceroot.h b/src/librssguard/services/abstract/serviceroot.h index 03b84b89f..d57b0ac85 100644 --- a/src/librssguard/services/abstract/serviceroot.h +++ b/src/librssguard/services/abstract/serviceroot.h @@ -33,7 +33,11 @@ class ServiceRoot : public RootItem { enum class LabelOperation { Adding = 1, Editing = 2, - Deleting = 4 + Deleting = 4, + + // NOTE: Service fetches list of labels from remote source + // and does not use local offline labels. + Synchronised = 8 }; enum class BagOfMessages { @@ -226,9 +230,9 @@ class ServiceRoot : public RootItem { // Removes all messages/categories/feeds which are // associated with this account. - void removeOldAccountFromDatabase(bool including_messages); + void removeOldAccountFromDatabase(bool delete_messages_too, bool delete_labels_too); void storeNewFeedTree(RootItem* root); - void cleanAllItemsFromModel(); + void cleanAllItemsFromModel(bool clean_labels_too); void appendCommonNodes(); // Removes messages which do not belong to any diff --git a/src/librssguard/services/feedly/feedlyserviceroot.cpp b/src/librssguard/services/feedly/feedlyserviceroot.cpp index 3fe7689b3..a17a5886b 100755 --- a/src/librssguard/services/feedly/feedlyserviceroot.cpp +++ b/src/librssguard/services/feedly/feedlyserviceroot.cpp @@ -233,7 +233,7 @@ void FeedlyServiceRoot::saveAllCachedData(bool ignore_errors) { } ServiceRoot::LabelOperation FeedlyServiceRoot::supportedLabelOperations() const { - return LabelOperation(0); + return ServiceRoot::LabelOperation::Synchronised; } void FeedlyServiceRoot::updateTitle() { diff --git a/src/librssguard/services/greader/greaderserviceroot.cpp b/src/librssguard/services/greader/greaderserviceroot.cpp index 18259153f..bd584e68c 100755 --- a/src/librssguard/services/greader/greaderserviceroot.cpp +++ b/src/librssguard/services/greader/greaderserviceroot.cpp @@ -257,7 +257,7 @@ void GreaderServiceRoot::saveAllCachedData(bool ignore_errors) { } ServiceRoot::LabelOperation GreaderServiceRoot::supportedLabelOperations() const { - return LabelOperation(0); + return ServiceRoot::LabelOperation::Synchronised; } void GreaderServiceRoot::updateTitleIcon() { diff --git a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp index 222218710..dd320cdb4 100644 --- a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp +++ b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp @@ -34,7 +34,7 @@ TtRssServiceRoot::~TtRssServiceRoot() { } ServiceRoot::LabelOperation TtRssServiceRoot::supportedLabelOperations() const { - return ServiceRoot::LabelOperation(0); + return ServiceRoot::LabelOperation::Synchronised; } void TtRssServiceRoot::start(bool freshly_activated) {