]>
Commit | Line | Data |
---|---|---|
87d7e850 | 1 | <?php |
2ed0d6c4 | 2 | class 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 | } |