diff --git a/src/services/abstract/feed.cpp b/src/services/abstract/feed.cpp index 5dde95f59..508a50ad7 100755 --- a/src/services/abstract/feed.cpp +++ b/src/services/abstract/feed.cpp @@ -132,6 +132,40 @@ void Feed::setAutoUpdateRemainingInterval(int auto_update_remaining_interval) { m_autoUpdateRemainingInterval = auto_update_remaining_interval; } +void Feed::updateCounts(bool including_total_count) { + QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); + QSqlQuery query_all(database); + + query_all.setForwardOnly(true); + + if (including_total_count) { + query_all.prepare("SELECT count(*) FROM Messages " + "WHERE feed = :feed AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"); + query_all.bindValue(QSL(":feed"), customId()); + query_all.bindValue(QSL(":account_id"), getParentServiceRoot()->accountId()); + + if (query_all.exec() && query_all.next()) { + setCountOfAllMessages(query_all.value(0).toInt()); + } + } + + query_all.prepare("SELECT count(*) FROM Messages " + "WHERE feed = :feed AND is_deleted = 0 AND is_pdeleted = 0 AND is_read = 0 AND account_id = :account_id;"); + query_all.bindValue(QSL(":feed"), customId()); + query_all.bindValue(QSL(":account_id"), getParentServiceRoot()->accountId()); + + // Obtain count of unread messages. + if (query_all.exec() && query_all.next()) { + int new_unread_count = query_all.value(0).toInt(); + + if (status() == NewMessages && new_unread_count < countOfUnreadMessages()) { + setStatus(Normal); + } + + setCountOfUnreadMessages(new_unread_count); + } +} + int Feed::updateMessages(const QList &messages) { if (messages.isEmpty()) { return 0; diff --git a/src/services/abstract/feed.h b/src/services/abstract/feed.h index c55232b5b..f825de2ab 100755 --- a/src/services/abstract/feed.h +++ b/src/services/abstract/feed.h @@ -94,6 +94,8 @@ class Feed : public RootItem { m_url = url; } + void updateCounts(bool including_total_count); + virtual int messageForeignKeyId() const = 0; protected: diff --git a/src/services/abstract/serviceroot.cpp b/src/services/abstract/serviceroot.cpp index 39971d898..ec138bb16 100755 --- a/src/services/abstract/serviceroot.cpp +++ b/src/services/abstract/serviceroot.cpp @@ -127,6 +127,52 @@ void ServiceRoot::cleanAllItems() { } } +bool ServiceRoot::cleanFeeds(QList items, bool clean_read_only) { + QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); + QSqlQuery query_delete_msg(db_handle); + int account_id = accountId(); + query_delete_msg.setForwardOnly(true); + + if (clean_read_only) { + query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " + "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND is_read = 1 AND account_id = :account_id;") + .arg(textualFeedIds(items).join(QSL(", ")))); + } + else { + query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " + "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;") + .arg(textualFeedIds(items).join(QSL(", ")))); + } + + query_delete_msg.bindValue(QSL(":deleted"), 1); + query_delete_msg.bindValue(QSL(":account_id"), account_id); + + if (query_delete_msg.exec()) { + // Messages are cleared, now inform model about need to reload data. + QList itemss; + + foreach (Feed *feed, items) { + feed->updateCounts(true); + itemss.append(feed); + } + + RecycleBin *bin = recycleBin(); + + if (bin != NULL) { + bin->updateCounts(true); + itemss.append(bin); + } + + itemChanged(itemss); + requestReloadMessageList(true); + return true; + } + else { + qDebug("Cleaning of feeds failed: '%s'.", qPrintable(query_delete_msg.lastError().text())); + return false; + } +} + void ServiceRoot::storeNewFeedTree(RootItem *root) { QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); QSqlQuery query_category(database); diff --git a/src/services/abstract/serviceroot.h b/src/services/abstract/serviceroot.h index ba4d7ca99..93ebdec0d 100755 --- a/src/services/abstract/serviceroot.h +++ b/src/services/abstract/serviceroot.h @@ -88,6 +88,9 @@ class ServiceRoot : public RootItem { // NOTE: Keep in sync with ServiceEntryRoot::code(). virtual QString code() const = 0; + // Removes all/read only messages from given underlying feeds. + bool cleanFeeds(QList items, bool clean_read_only); + // This method should prepare messages for given "item" (download them maybe?) // into predefined "Messages" table // and then use method QSqlTableModel::setFilter(....). diff --git a/src/services/owncloud/network/owncloudnetworkfactory.cpp b/src/services/owncloud/network/owncloudnetworkfactory.cpp index e11118ba4..b9c6b324f 100755 --- a/src/services/owncloud/network/owncloudnetworkfactory.cpp +++ b/src/services/owncloud/network/owncloudnetworkfactory.cpp @@ -352,7 +352,7 @@ QList OwnCloudGetMessagesResponse::messages() const { msg.m_author = message_map["author"].toString(); msg.m_contents = message_map["body"].toString(); - msg.m_created = TextFactory::parseDateTime(message_map["pubDate"].value()); + msg.m_created = TextFactory::parseDateTime(message_map["pubDate"].value() * 1000); msg.m_createdFromFeed = true; msg.m_customId = message_map["id"].toString(); diff --git a/src/services/standard/standardfeed.cpp b/src/services/standard/standardfeed.cpp index 565fc1e60..b345a9bcb 100755 --- a/src/services/standard/standardfeed.cpp +++ b/src/services/standard/standardfeed.cpp @@ -185,37 +185,6 @@ QString StandardFeed::typeToString(StandardFeed::Type type) { } } -void StandardFeed::updateCounts(bool including_total_count) { - QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); - QSqlQuery query(database); - query.setForwardOnly(true); - - if (including_total_count) { - query.prepare(QSL("SELECT count(*) FROM Messages WHERE feed = :feed AND is_pdeleted = 0 AND is_deleted = 0 AND account_id = :account_id;")); - query.bindValue(QSL(":feed"), id()); - query.bindValue(QSL(":account_id"), serviceRoot()->accountId()); - - if (query.exec() && query.next()) { - setCountOfAllMessages(query.value(0).toInt()); - } - } - - // Obtain count of unread messages. - query.prepare(QSL("SELECT count(*) FROM Messages WHERE feed = :feed AND is_pdeleted = 0 AND is_deleted = 0 AND is_read = 0 AND account_id = :account_id;")); - query.bindValue(QSL(":feed"), id()); - query.bindValue(QSL(":account_id"), serviceRoot()->accountId()); - - if (query.exec() && query.next()) { - int new_unread_count = query.value(0).toInt(); - - if (status() == NewMessages && new_unread_count < countOfUnreadMessages()) { - setStatus(Normal); - } - - setCountOfUnreadMessages(new_unread_count); - } -} - void StandardFeed::fetchMetadataForItself() { QPair metadata = guessFeed(url(), username(), password()); diff --git a/src/services/standard/standardfeed.h b/src/services/standard/standardfeed.h index c2e05868a..90ef38d9b 100755 --- a/src/services/standard/standardfeed.h +++ b/src/services/standard/standardfeed.h @@ -76,9 +76,6 @@ class StandardFeed : public Feed { Qt::ItemFlags additionalFlags() const; bool performDragDropChange(RootItem *target_item); - // Updates counts of all/unread messages for this feed. - void updateCounts(bool including_total_count); - // Removes this standard feed from persistent // storage. bool removeItself(); diff --git a/src/services/standard/standardserviceroot.cpp b/src/services/standard/standardserviceroot.cpp index 65db58637..e0843bf3f 100755 --- a/src/services/standard/standardserviceroot.cpp +++ b/src/services/standard/standardserviceroot.cpp @@ -199,48 +199,6 @@ bool StandardServiceRoot::markFeedsReadUnread(QList items, ReadStatus rea } } -bool StandardServiceRoot::cleanFeeds(QList items, bool clean_read_only) { - QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); - QSqlQuery query_delete_msg(db_handle); - int account_id = accountId(); - query_delete_msg.setForwardOnly(true); - - if (clean_read_only) { - query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " - "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND is_read = 1 AND account_id = :account_id;") - .arg(textualFeedIds(items).join(QSL(", ")))); - } - else { - query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " - "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;") - .arg(textualFeedIds(items).join(QSL(", ")))); - } - - query_delete_msg.bindValue(QSL(":deleted"), 1); - query_delete_msg.bindValue(QSL(":account_id"), account_id); - - if (query_delete_msg.exec()) { - // Messages are cleared, now inform model about need to reload data. - QList itemss; - - foreach (Feed *feed, items) { - feed->updateCounts(true); - itemss.append(feed); - } - - m_recycleBin->updateCounts(true); - itemss.append(m_recycleBin); - - itemChanged(itemss); - requestReloadMessageList(true); - return true; - } - else { - qDebug("Cleaning of feeds failed: '%s'.", qPrintable(query_delete_msg.lastError().text())); - return false; - } -} - 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 76a619783..5fa25e790 100755 --- a/src/services/standard/standardserviceroot.h +++ b/src/services/standard/standardserviceroot.h @@ -70,7 +70,6 @@ class StandardServiceRoot : public ServiceRoot { bool mergeImportExportModel(FeedsImportExportModel *model, RootItem *target_root_node, QString &output_message); bool markFeedsReadUnread(QList items, ReadStatus read); - bool cleanFeeds(QList items, bool clean_read_only); void loadFromDatabase(); void checkArgumentForFeedAdding(const QString &argument); diff --git a/src/services/tt-rss/ttrssfeed.cpp b/src/services/tt-rss/ttrssfeed.cpp index b5f00c3e1..66b75f869 100755 --- a/src/services/tt-rss/ttrssfeed.cpp +++ b/src/services/tt-rss/ttrssfeed.cpp @@ -101,40 +101,6 @@ QVariant TtRssFeed::data(int column, int role) const { } } -void TtRssFeed::updateCounts(bool including_total_count) { - QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); - QSqlQuery query_all(database); - - query_all.setForwardOnly(true); - - if (including_total_count) { - query_all.prepare("SELECT count(*) FROM Messages " - "WHERE feed = :feed AND is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;"); - query_all.bindValue(QSL(":feed"), customId()); - query_all.bindValue(QSL(":account_id"), serviceRoot()->accountId()); - - if (query_all.exec() && query_all.next()) { - setCountOfAllMessages(query_all.value(0).toInt()); - } - } - - query_all.prepare("SELECT count(*) FROM Messages " - "WHERE feed = :feed AND is_deleted = 0 AND is_pdeleted = 0 AND is_read = 0 AND account_id = :account_id;"); - query_all.bindValue(QSL(":feed"), customId()); - query_all.bindValue(QSL(":account_id"), serviceRoot()->accountId()); - - // Obtain count of unread messages. - if (query_all.exec() && query_all.next()) { - int new_unread_count = query_all.value(0).toInt(); - - if (status() == NewMessages && new_unread_count < countOfUnreadMessages()) { - setStatus(Normal); - } - - setCountOfUnreadMessages(new_unread_count); - } -} - bool TtRssFeed::canBeEdited() const { return true; } diff --git a/src/services/tt-rss/ttrssfeed.h b/src/services/tt-rss/ttrssfeed.h index 47bfffc35..72736ceda 100755 --- a/src/services/tt-rss/ttrssfeed.h +++ b/src/services/tt-rss/ttrssfeed.h @@ -36,7 +36,6 @@ class TtRssFeed : public Feed { int messageForeignKeyId() const; TtRssServiceRoot *serviceRoot() const; QVariant data(int column, int role) const; - void updateCounts(bool including_total_count); bool canBeEdited() const; bool editViaGui(); bool canBeDeleted() const; diff --git a/src/services/tt-rss/ttrssserviceroot.cpp b/src/services/tt-rss/ttrssserviceroot.cpp index b2aa4dd68..aec8bdd80 100755 --- a/src/services/tt-rss/ttrssserviceroot.cpp +++ b/src/services/tt-rss/ttrssserviceroot.cpp @@ -319,50 +319,6 @@ bool TtRssServiceRoot::markFeedsReadUnread(QList items, RootItem::ReadSta } } -bool TtRssServiceRoot::cleanFeeds(QList items, bool clean_read_only) { - QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); - QSqlQuery query_delete_msg(db_handle); - query_delete_msg.setForwardOnly(true); - - if (clean_read_only) { - if (!query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " - "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0 AND is_read = 1;").arg(textualFeedIds(items).join(QSL(", "))))) { - qWarning("Query preparation failed for feeds clearing."); - return false; - } - } - else { - if (!query_delete_msg.prepare(QString("UPDATE Messages SET is_deleted = :deleted " - "WHERE feed IN (%1) AND is_deleted = 0 AND is_pdeleted = 0;").arg(textualFeedIds(items).join(QSL(", "))))) { - qWarning("Query preparation failed for feeds clearing."); - return false; - } - } - - query_delete_msg.bindValue(QSL(":deleted"), 1); - - if (!query_delete_msg.exec()) { - qDebug("Query execution for feeds clearing failed."); - return false; - } - else { - // Messages are cleared, now inform model about need to reload data. - QList itemss; - - foreach (Feed *feed, items) { - feed->updateCounts(true); - itemss.append(feed); - } - - m_recycleBin->updateCounts(true); - itemss.append(m_recycleBin); - - itemChanged(itemss); - requestReloadMessageList(true); - return true; - } -} - void TtRssServiceRoot::saveAccountDataToDatabase() { if (accountId() != NO_PARENT_CATEGORY) { // We are overwritting previously saved data. diff --git a/src/services/tt-rss/ttrssserviceroot.h b/src/services/tt-rss/ttrssserviceroot.h index cbf000168..b33dec465 100755 --- a/src/services/tt-rss/ttrssserviceroot.h +++ b/src/services/tt-rss/ttrssserviceroot.h @@ -59,7 +59,6 @@ class TtRssServiceRoot : public ServiceRoot { QStringList customIDSOfMessagesForItem(RootItem *item); bool markFeedsReadUnread(QList items, ReadStatus read); - bool cleanFeeds(QList items, bool clean_read_only); void saveAccountDataToDatabase(); void updateTitle();