]> git.wh0rd.org - tt-rss.git/blame - classes/ccache.php
rssutils: PDO
[tt-rss.git] / classes / ccache.php
CommitLineData
87d7e850 1<?php
2ed0d6c4 2class CCache {
2ed0d6c4 3 static function zero_all($owner_uid) {
933ff559
AD
4 $pdo = Db::pdo();
5
6 $sth = $pdo->prepare("UPDATE ttrss_counters_cache SET
7 value = 0 WHERE owner_uid = ?");
8 $sth->execute([$owner_uid]);
87d7e850 9
933ff559
AD
10 $sth = $pdo->prepare("UPDATE ttrss_cat_counters_cache SET
11 value = 0 WHERE owner_uid = ?");
12 $sth->execute([$owner_uid]);
87d7e850
AD
13 }
14
2ed0d6c4 15 static function remove($feed_id, $owner_uid, $is_cat = false) {
87d7e850
AD
16
17 if (!$is_cat) {
18 $table = "ttrss_counters_cache";
19 } else {
20 $table = "ttrss_cat_counters_cache";
21 }
22
933ff559
AD
23 $pdo = Db::pdo();
24
25 $sth = $pdo->prepare("DELETE FROM $table WHERE
26 feed_id = ? AND owner_uid = ?");
27 $sth->execute([$feed_id, $owner_uid]);
87d7e850
AD
28
29 }
30
2ed0d6c4 31 static function update_all($owner_uid) {
87d7e850 32
933ff559
AD
33 $pdo = Db::pdo();
34
a42c55f0 35 if (get_pref('ENABLE_FEED_CATS', $owner_uid)) {
87d7e850 36
933ff559
AD
37 $sth = $pdo->prepare("SELECT feed_id FROM ttrss_cat_counters_cache
38 WHERE feed_id > 0 AND owner_uid = ?");
39 $sth->execute([$owner_uid]);
87d7e850 40
933ff559 41 while ($line = $sth->fetch()) {
2ed0d6c4 42 CCache::update($line["feed_id"], $owner_uid, true);
87d7e850
AD
43 }
44
45 /* We have to manually include category 0 */
46
2ed0d6c4 47 CCache::update(0, $owner_uid, true);
87d7e850
AD
48
49 } else {
933ff559
AD
50 $sth = $pdo->prepare("SELECT feed_id FROM ttrss_counters_cache
51 WHERE feed_id > 0 AND owner_uid = ?");
52 $sth->execute([$owner_uid]);
87d7e850 53
933ff559 54 while ($line = $sth->fetch()) {
2ed0d6c4 55 print CCache::update($line["feed_id"], $owner_uid);
87d7e850
AD
56
57 }
58
59 }
60 }
61
2ed0d6c4
AD
62 static function find($feed_id, $owner_uid, $is_cat = false,
63 $no_update = false) {
87d7e850
AD
64
65 if (!is_numeric($feed_id)) return;
66
67 if (!$is_cat) {
68 $table = "ttrss_counters_cache";
87d7e850
AD
69 } else {
70 $table = "ttrss_cat_counters_cache";
71 }
72
933ff559 73 $pdo = Db::pdo();
87d7e850 74
933ff559
AD
75 $sth = $pdo->prepare("SELECT value FROM $table
76 WHERE owner_uid = ? AND feed_id = ?
87d7e850
AD
77 LIMIT 1");
78
933ff559
AD
79 $sth->execute([$owner_uid, $feed_id]);
80
81 if ($row = $sth->fetch()) {
82 return $row["value"];
87d7e850
AD
83 } else {
84 if ($no_update) {
85 return -1;
86 } else {
2ed0d6c4 87 return CCache::update($feed_id, $owner_uid, $is_cat);
87d7e850
AD
88 }
89 }
90
91 }
92
2ed0d6c4
AD
93 static function update($feed_id, $owner_uid, $is_cat = false,
94 $update_pcat = true, $pcat_fast = false) {
87d7e850
AD
95
96 if (!is_numeric($feed_id)) return;
97
2ed0d6c4 98 $prev_unread = CCache::find($feed_id, $owner_uid, $is_cat, true);
87d7e850
AD
99
100 /* When updating a label, all we need to do is recalculate feed counters
101 * because labels are not cached */
102
103 if ($feed_id < 0) {
2ed0d6c4 104 CCache::update_all($owner_uid);
87d7e850
AD
105 return;
106 }
107
108 if (!$is_cat) {
109 $table = "ttrss_counters_cache";
110 } else {
111 $table = "ttrss_cat_counters_cache";
112 }
113
933ff559 114 $pdo = Db::pdo();
87d7e850 115
933ff559 116 if ($is_cat && $feed_id >= 0) {
87d7e850
AD
117 /* Recalculate counters for child feeds */
118
b66be03a 119 if (!$pcat_fast) {
933ff559 120 $sth = $pdo->prepare("SELECT id FROM ttrss_feeds
cc9450c3
AD
121 WHERE owner_uid = :uid AND
122 (cat_id = :cat OR (:cat = 0 AND cat_id IS NULL))");
933ff559 123 $sth->execute([":uid" => $owner_uid, ":cat" => $feed_id]);
87d7e850 124
933ff559 125 while ($line = $sth->fetch()) {
2ed0d6c4 126 CCache::update($line["id"], $owner_uid, false, false);
b66be03a 127 }
d0e9c40a 128 }
87d7e850 129
933ff559 130 $sth = $pdo->prepare("SELECT SUM(value) AS sv
87d7e850 131 FROM ttrss_counters_cache, ttrss_feeds
933ff559 132 WHERE id = feed_id AND
cc9450c3 133 (cat_id = :cat OR (:cat = 0 AND cat_id IS NULL)) AND
933ff559
AD
134 ttrss_counters_cache.owner_uid = :uid AND
135 ttrss_feeds.owner_uid = :uid");
136 $sth->execute([":uid" => $owner_uid, ":cat" => $feed_id]);
137 $row = $sth->fetch();
87d7e850 138
933ff559 139 $unread = (int) $row["sv"];
87d7e850
AD
140
141 } else {
86a8351c 142 $unread = (int) Feeds::getFeedArticles($feed_id, $is_cat, true, $owner_uid);
87d7e850
AD
143 }
144
0567016b
AD
145 $tr_in_progress = false;
146
147 try {
148 $pdo->beginTransaction();
149 } catch (Exception $e) {
150 $tr_in_progress = true;
151 }
87d7e850 152
933ff559
AD
153 $sth = $pdo->prepare("SELECT feed_id FROM $table
154 WHERE owner_uid = ? AND feed_id = ? LIMIT 1");
155 $sth->execute([$owner_uid, $feed_id]);
87d7e850 156
933ff559
AD
157 if ($sth->fetch()) {
158
159 $sth = $pdo->prepare("UPDATE $table SET
160 value = ?, updated = NOW() WHERE
161 feed_id = ? AND owner_uid = ?");
162
163 $sth->execute([$unread, $feed_id, $owner_uid]);
87d7e850
AD
164
165 } else {
933ff559 166 $sth = $pdo->prepare("INSERT INTO $table
87d7e850
AD
167 (feed_id, value, owner_uid, updated)
168 VALUES
933ff559
AD
169 (?, ?, ?, NOW())");
170 $sth->execute([$feed_id, $unread, $owner_uid]);
87d7e850
AD
171 }
172
0567016b 173 if (!$tr_in_progress) $pdo->commit();
87d7e850
AD
174
175 if ($feed_id > 0 && $prev_unread != $unread) {
176
177 if (!$is_cat) {
178
179 /* Update parent category */
180
181 if ($update_pcat) {
182
933ff559
AD
183 $sth = $pdo->prepare("SELECT cat_id FROM ttrss_feeds
184 WHERE owner_uid = ? AND id = ?");
185 $sth->execute([$owner_uid, $feed_id]);
87d7e850 186
933ff559
AD
187 if ($row = $sth->fetch()) {
188 CCache::update($row["cat_id"], $owner_uid, true, true, true);
189 }
87d7e850
AD
190 }
191 }
192 } else if ($feed_id < 0) {
2ed0d6c4 193 CCache::update_all($owner_uid);
87d7e850
AD
194 }
195
196 return $unread;
197 }
198
2ed0d6c4 199}