]> git.wh0rd.org Git - tt-rss.git/blob - classes/ccache.php
4efb96d97141c04e7f3a47a2949091b781bc09f6
[tt-rss.git] / classes / ccache.php
1 <?php
2 class CCache {
3         /* function ccache_zero($feed_id, $owner_uid) {
4                 db_query("UPDATE ttrss_counters_cache SET
5                         value = 0, updated = NOW() WHERE
6                         feed_id = '$feed_id' AND owner_uid = '$owner_uid'");
7         } */
8
9         static function zero_all($owner_uid) {
10                 db_query("UPDATE ttrss_counters_cache SET
11                         value = 0 WHERE owner_uid = '$owner_uid'");
12
13                 db_query("UPDATE ttrss_cat_counters_cache SET
14                         value = 0 WHERE owner_uid = '$owner_uid'");
15         }
16
17         static function remove($feed_id, $owner_uid, $is_cat = false) {
18
19                 if (!$is_cat) {
20                         $table = "ttrss_counters_cache";
21                 } else {
22                         $table = "ttrss_cat_counters_cache";
23                 }
24
25                 db_query("DELETE FROM $table WHERE
26                         feed_id = '$feed_id' AND owner_uid = '$owner_uid'");
27
28         }
29
30         static function update_all($owner_uid) {
31
32                 if (get_pref('ENABLE_FEED_CATS', $owner_uid)) {
33
34                         $result = db_query("SELECT feed_id FROM ttrss_cat_counters_cache
35                                 WHERE feed_id > 0 AND owner_uid = '$owner_uid'");
36
37                         while ($line = db_fetch_assoc($result)) {
38                                 CCache::update($line["feed_id"], $owner_uid, true);
39                         }
40
41                         /* We have to manually include category 0 */
42
43                         CCache::update(0, $owner_uid, true);
44
45                 } else {
46                         $result = db_query("SELECT feed_id FROM ttrss_counters_cache
47                                 WHERE feed_id > 0 AND owner_uid = '$owner_uid'");
48
49                         while ($line = db_fetch_assoc($result)) {
50                                 print CCache::update($line["feed_id"], $owner_uid);
51
52                         }
53
54                 }
55         }
56
57         static function find($feed_id, $owner_uid, $is_cat = false,
58                                                  $no_update = false) {
59
60                 if (!is_numeric($feed_id)) return;
61
62                 if (!$is_cat) {
63                         $table = "ttrss_counters_cache";
64                         /* if ($feed_id > 0) {
65                                 $tmp_result = db_query("SELECT owner_uid FROM ttrss_feeds
66                                         WHERE id = '$feed_id'");
67                                 $owner_uid = db_fetch_result($tmp_result, 0, "owner_uid");
68                         } */
69                 } else {
70                         $table = "ttrss_cat_counters_cache";
71                 }
72
73                 if (DB_TYPE == "pgsql") {
74                         $date_qpart = "updated > NOW() - INTERVAL '15 minutes'";
75                 } else if (DB_TYPE == "mysql") {
76                         $date_qpart = "updated > DATE_SUB(NOW(), INTERVAL 15 MINUTE)";
77                 }
78
79                 $result = db_query("SELECT value FROM $table
80                         WHERE owner_uid = '$owner_uid' AND feed_id = '$feed_id'
81                         LIMIT 1");
82
83                 if (db_num_rows($result) == 1) {
84                         return db_fetch_result($result, 0, "value");
85                 } else {
86                         if ($no_update) {
87                                 return -1;
88                         } else {
89                                 return CCache::update($feed_id, $owner_uid, $is_cat);
90                         }
91                 }
92
93         }
94
95         static function update($feed_id, $owner_uid, $is_cat = false,
96                                                    $update_pcat = true, $pcat_fast = false) {
97
98                 if (!is_numeric($feed_id)) return;
99
100                 /* if (!$is_cat && $feed_id > 0) {
101                         $tmp_result = db_query("SELECT owner_uid FROM ttrss_feeds
102                                 WHERE id = '$feed_id'");
103                         $owner_uid = db_fetch_result($tmp_result, 0, "owner_uid");
104                 } */
105
106                 $prev_unread = CCache::find($feed_id, $owner_uid, $is_cat, true);
107
108                 /* When updating a label, all we need to do is recalculate feed counters
109                  * because labels are not cached */
110
111                 if ($feed_id < 0) {
112                         CCache::update_all($owner_uid);
113                         return;
114                 }
115
116                 if (!$is_cat) {
117                         $table = "ttrss_counters_cache";
118                 } else {
119                         $table = "ttrss_cat_counters_cache";
120                 }
121
122                 if ($is_cat && $feed_id >= 0) {
123                         if ($feed_id != 0) {
124                                 $cat_qpart = "cat_id = '$feed_id'";
125                         } else {
126                                 $cat_qpart = "cat_id IS NULL";
127                         }
128
129                         /* Recalculate counters for child feeds */
130
131                         if (!$pcat_fast) {
132                                 $result = db_query("SELECT id FROM ttrss_feeds
133                                                 WHERE owner_uid = '$owner_uid' AND $cat_qpart");
134
135                                 while ($line = db_fetch_assoc($result)) {
136                                         CCache::update($line["id"], $owner_uid, false, false);
137                                 }
138                         }
139
140                         $result = db_query("SELECT SUM(value) AS sv
141                                 FROM ttrss_counters_cache, ttrss_feeds
142                                 WHERE id = feed_id AND $cat_qpart AND
143                                 ttrss_counters_cache.owner_uid = $owner_uid AND
144                                 ttrss_feeds.owner_uid = '$owner_uid'");
145
146                         $unread = (int) db_fetch_result($result, 0, "sv");
147
148                 } else {
149                         $unread = (int) Feeds::getFeedArticles($feed_id, $is_cat, true, $owner_uid);
150                 }
151
152                 db_query("BEGIN");
153
154                 $result = db_query("SELECT feed_id FROM $table
155                         WHERE owner_uid = '$owner_uid' AND feed_id = '$feed_id' LIMIT 1");
156
157                 if (db_num_rows($result) == 1) {
158                         db_query("UPDATE $table SET
159                                 value = '$unread', updated = NOW() WHERE
160                                 feed_id = '$feed_id' AND owner_uid = '$owner_uid'");
161
162                 } else {
163                         db_query("INSERT INTO $table
164                                 (feed_id, value, owner_uid, updated)
165                                 VALUES
166                                 ($feed_id, $unread, $owner_uid, NOW())");
167                 }
168
169                 db_query("COMMIT");
170
171                 if ($feed_id > 0 && $prev_unread != $unread) {
172
173                         if (!$is_cat) {
174
175                                 /* Update parent category */
176
177                                 if ($update_pcat) {
178
179                                         $result = db_query("SELECT cat_id FROM ttrss_feeds
180                                                 WHERE owner_uid = '$owner_uid' AND id = '$feed_id'");
181
182                                         $cat_id = (int) db_fetch_result($result, 0, "cat_id");
183
184                                         CCache::update($cat_id, $owner_uid, true, true, true);
185
186                                 }
187                         }
188                 } else if ($feed_id < 0) {
189                         CCache::update_all($owner_uid);
190                 }
191
192                 return $unread;
193         }
194
195         /* function ccache_cleanup($owner_uid) {
196
197                 if (DB_TYPE == "pgsql") {
198                         db_query("DELETE FROM ttrss_counters_cache AS c1 WHERE
199                                 (SELECT count(*) FROM ttrss_counters_cache AS c2
200                                         WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1
201                                         AND owner_uid = '$owner_uid'");
202
203                         db_query("DELETE FROM ttrss_cat_counters_cache AS c1 WHERE
204                                 (SELECT count(*) FROM ttrss_cat_counters_cache AS c2
205                                         WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1
206                                         AND owner_uid = '$owner_uid'");
207                 } else {
208                         db_query("DELETE c1 FROM
209                                         ttrss_counters_cache AS c1,
210                                         ttrss_counters_cache AS c2
211                                 WHERE
212                                         c1.owner_uid = '$owner_uid' AND
213                                         c1.owner_uid = c2.owner_uid AND
214                                         c1.feed_id = c2.feed_id");
215
216                         db_query("DELETE c1 FROM
217                                         ttrss_cat_counters_cache AS c1,
218                                         ttrss_cat_counters_cache AS c2
219                                 WHERE
220                                         c1.owner_uid = '$owner_uid' AND
221                                         c1.owner_uid = c2.owner_uid AND
222                                         c1.feed_id = c2.feed_id");
223
224                 }
225         } */
226
227
228 }