diff --git a/src/services/abstract/recyclebin.cpp b/src/services/abstract/recyclebin.cpp index dc29f0117..e7528a06b 100755 --- a/src/services/abstract/recyclebin.cpp +++ b/src/services/abstract/recyclebin.cpp @@ -19,6 +19,9 @@ #include "miscellaneous/application.h" #include "miscellaneous/iconfactory.h" +#include "services/abstract/serviceroot.h" + +#include RecycleBin::RecycleBin(RootItem *parent_item) : RootItem(parent_item) { @@ -41,3 +44,73 @@ QVariant RecycleBin::data(int column, int role) const { return RootItem::data(column, role); } } + +bool RecycleBin::empty() { + QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); + + if (!db_handle.transaction()) { + qWarning("Starting transaction for recycle bin emptying."); + return false; + } + + ServiceRoot *parent_root = getParentServiceRoot(); + QSqlQuery query_empty_bin(db_handle); + + query_empty_bin.setForwardOnly(true); + 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()) { + qWarning("Query execution failed for recycle bin emptying."); + + db_handle.rollback(); + return false; + } + + // Commit changes. + if (db_handle.commit()) { + updateCounts(true); + parent_root->itemChanged(QList() << this); + parent_root->requestReloadMessageList(true); + return true; + } + else { + return db_handle.rollback(); + } +} + +bool RecycleBin::restore() { + QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); + + if (!db_handle.transaction()) { + qWarning("Starting transaction for recycle bin restoring."); + return false; + } + + 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()) { + qWarning("Query execution failed for recycle bin restoring."); + + db_handle.rollback(); + return false; + } + + // Commit changes. + if (db_handle.commit()) { + parent_root->updateCounts(true); + parent_root->itemChanged(parent_root->getSubTree()); + parent_root->requestReloadMessageList(true); + parent_root->requestFeedReadFilterReload(); + return true; + } + else { + return db_handle.rollback(); + } +} diff --git a/src/services/abstract/recyclebin.h b/src/services/abstract/recyclebin.h index ba3d5241b..fa360aade 100755 --- a/src/services/abstract/recyclebin.h +++ b/src/services/abstract/recyclebin.h @@ -38,10 +38,10 @@ class RecycleBin : public RootItem { // Empties the bin - removes all messages from it (does not remove // them from DB, just permanently hide them, so that they are not // re-downloaded). - virtual bool empty() = 0; + virtual bool empty(); // Performs complete restoration of all messages contained in the bin - virtual bool restore() = 0; + virtual bool restore(); ///////////////////////////////////////// // Members to override. */ diff --git a/src/services/standard/standardrecyclebin.cpp b/src/services/standard/standardrecyclebin.cpp index bd0df5175..64781a656 100755 --- a/src/services/standard/standardrecyclebin.cpp +++ b/src/services/standard/standardrecyclebin.cpp @@ -50,11 +50,11 @@ bool StandardRecycleBin::markAsReadUnread(RootItem::ReadStatus status) { } bool StandardRecycleBin::empty() { - return serviceRoot()->emptyBin(); + return RecycleBin::empty(); } bool StandardRecycleBin::restore() { - return serviceRoot()->restoreBin(); + return RecycleBin::restore(); } void StandardRecycleBin::updateCounts(bool update_total_count) { diff --git a/src/services/standard/standardserviceroot.cpp b/src/services/standard/standardserviceroot.cpp index 0b500bbc9..6c62e789c 100755 --- a/src/services/standard/standardserviceroot.cpp +++ b/src/services/standard/standardserviceroot.cpp @@ -268,67 +268,6 @@ bool StandardServiceRoot::cleanFeeds(QList items, bool clean_read_only) { } } -bool StandardServiceRoot::restoreBin() { - QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); - - if (!db_handle.transaction()) { - qWarning("Starting transaction for recycle bin restoring."); - return false; - } - - QSqlQuery query_empty_bin(db_handle); - query_empty_bin.setForwardOnly(true); - - if (!query_empty_bin.exec(QString("UPDATE Messages SET is_deleted = 0 WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = %1;").arg(accountId()))) { - qWarning("Query execution failed for recycle bin restoring."); - - db_handle.rollback(); - return false; - } - - // Commit changes. - if (db_handle.commit()) { - updateCounts(true); - itemChanged(getSubTree()); - requestReloadMessageList(true); - requestFeedReadFilterReload(); - return true; - } - else { - return db_handle.rollback(); - } -} - -bool StandardServiceRoot::emptyBin() { - QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); - - if (!db_handle.transaction()) { - qWarning("Starting transaction for recycle bin emptying."); - return false; - } - - QSqlQuery query_empty_bin(db_handle); - query_empty_bin.setForwardOnly(true); - - if (!query_empty_bin.exec(QString("UPDATE Messages SET is_pdeleted = 1 WHERE is_deleted = 1 AND account_id = %1;").arg(accountId()))) { - qWarning("Query execution failed for recycle bin emptying."); - - db_handle.rollback(); - return false; - } - - // Commit changes. - if (db_handle.commit()) { - m_recycleBin->updateCounts(true); - itemChanged(QList() << m_recycleBin); - requestReloadMessageList(true); - return true; - } - else { - return db_handle.rollback(); - } -} - void StandardServiceRoot::loadFromDatabase(){ QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); Assignment categories; diff --git a/src/services/standard/standardserviceroot.h b/src/services/standard/standardserviceroot.h index 55552ff54..56044aadb 100755 --- a/src/services/standard/standardserviceroot.h +++ b/src/services/standard/standardserviceroot.h @@ -95,9 +95,6 @@ class StandardServiceRoot : public ServiceRoot { bool markRecycleBinReadUnread(ReadStatus read); bool cleanFeeds(QList items, bool clean_read_only); - bool restoreBin(); - bool emptyBin(); - void loadFromDatabase(); public slots: