Line data Source code
1 : #include "UnreadCountReader.h"
2 : #include "FangLogging.h"
3 : #include "ErrorHandling.h"
4 :
5 0 : UnreadCountReader::UnreadCountReader()
6 : {
7 0 : }
8 :
9 4 : void UnreadCountReader::update(QSqlDatabase db, FeedItem *feed)
10 : {
11 4 : if (feed->isSpecialFeed()) {
12 0 : switch (feed->getDbID()) {
13 0 : case FEED_ID_ALLNEWS:
14 0 : feed->setUnreadCount(forAllNews(db));
15 0 : break;
16 :
17 0 : case FEED_ID_PINNED:
18 0 : feed->setUnreadCount(forPinned(db));
19 0 : break;
20 :
21 0 : case FEED_ID_SEARCH:
22 : // Nothing to do, search doesn't support read/unread or bookmarks.
23 0 : break;
24 :
25 0 : default:
26 0 : FANG_UNREACHABLE("UnreadCountReader: Invalid special feed type");
27 : break;
28 : }
29 0 : return;
30 : }
31 :
32 : // All other feed types.
33 4 : if (feed->isFolder()) {
34 4 : feed->setUnreadCount(forFolder(db, feed->getDbID()));
35 : } else {
36 0 : feed->setUnreadCount(forFeed(db, feed->getDbID()));
37 : }
38 : }
39 :
40 0 : qint32 UnreadCountReader::forAllNews(QSqlDatabase db)
41 : {
42 0 : QSqlQuery query(db);
43 0 : query.prepare("SELECT count(id) FROM NewsItemTable N where id > "
44 : "(SELECT bookmark_id from FeedItemTable WHERE id = N.feed_id)");
45 :
46 0 : if (!query.exec() || !query.next()) {
47 0 : qCDebug(logUtility) << "Could not update unread count for all news feed";
48 0 : qCDebug(logUtility) << query.lastError();
49 :
50 0 : return -1;
51 : }
52 :
53 0 : int ret = query.value(0).toInt();
54 0 : return ret;
55 0 : }
56 :
57 0 : qint32 UnreadCountReader::forPinned(QSqlDatabase db)
58 : {
59 0 : QSqlQuery query(db);
60 0 : query.prepare("SELECT count(id) FROM NewsItemTable WHERE pinned");
61 :
62 0 : if (!query.exec() || !query.next()) {
63 0 : qCDebug(logUtility) << "Could not update unread count for pinned news feed";
64 0 : qCDebug(logUtility) << query.lastError();
65 :
66 0 : return -1;
67 : }
68 :
69 0 : int ret = query.value(0).toInt();
70 : //qCDebug(logUtility) << "Unread count for pinned: " << ret;
71 0 : return ret;
72 0 : }
73 :
74 4 : qint32 UnreadCountReader::forFolder(QSqlDatabase db, qint64 folderID)
75 : {
76 4 : QSqlQuery query(db);
77 4 : query.prepare("SELECT count(id) FROM NewsItemTable N WHERE "
78 : "(SELECT parent_folder FROM FeedItemTable WHERE id = N.feed_id) = :folder_id "
79 : "AND id > "
80 : "(SELECT bookmark_id from FeedItemTable WHERE id = N.feed_id)");
81 4 : query.bindValue(":folder_id", folderID);
82 :
83 4 : if (!query.exec() || !query.next()) {
84 0 : qCDebug(logUtility) << "Could not update unread count for folder";
85 0 : qCDebug(logUtility) << query.lastError();
86 :
87 0 : return -1;
88 : }
89 :
90 4 : return query.value(0).toInt();;
91 4 : }
92 :
93 0 : qint32 UnreadCountReader::forFeed(QSqlDatabase db, quint64 id)
94 : {
95 0 : QSqlQuery query(db);
96 0 : query.prepare("SELECT count(id) FROM NewsItemTable WHERE feed_id = :id1 AND "
97 : "id > (SELECT bookmark_id FROM FeedItemTable WHERE id = :id2)");
98 0 : query.bindValue(":id1", id);
99 0 : query.bindValue(":id2", id);
100 :
101 0 : if (!query.exec() || !query.next()) {
102 0 : qCDebug(logUtility) << "Could not update unread count for feed id: " << id;
103 0 : qCDebug(logUtility) << query.lastError();
104 :
105 0 : return -1;
106 : }
107 :
108 0 : int ret = query.value(0).toInt();
109 0 : return ret;
110 0 : }
|