ccache.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. static function zero_all($owner_uid) {
  9. db_query("UPDATE ttrss_counters_cache SET
  10. value = 0 WHERE owner_uid = '$owner_uid'");
  11. db_query("UPDATE ttrss_cat_counters_cache SET
  12. value = 0 WHERE owner_uid = '$owner_uid'");
  13. }
  14. static function remove($feed_id, $owner_uid, $is_cat = false) {
  15. if (!$is_cat) {
  16. $table = "ttrss_counters_cache";
  17. } else {
  18. $table = "ttrss_cat_counters_cache";
  19. }
  20. db_query("DELETE FROM $table WHERE
  21. feed_id = '$feed_id' AND owner_uid = '$owner_uid'");
  22. }
  23. static function update_all($owner_uid) {
  24. if (get_pref('ENABLE_FEED_CATS', $owner_uid)) {
  25. $result = db_query("SELECT feed_id FROM ttrss_cat_counters_cache
  26. WHERE feed_id > 0 AND owner_uid = '$owner_uid'");
  27. while ($line = db_fetch_assoc($result)) {
  28. CCache::update($line["feed_id"], $owner_uid, true);
  29. }
  30. /* We have to manually include category 0 */
  31. CCache::update(0, $owner_uid, true);
  32. } else {
  33. $result = db_query("SELECT feed_id FROM ttrss_counters_cache
  34. WHERE feed_id > 0 AND owner_uid = '$owner_uid'");
  35. while ($line = db_fetch_assoc($result)) {
  36. print CCache::update($line["feed_id"], $owner_uid);
  37. }
  38. }
  39. }
  40. static function find($feed_id, $owner_uid, $is_cat = false,
  41. $no_update = false) {
  42. if (!is_numeric($feed_id)) return;
  43. if (!$is_cat) {
  44. $table = "ttrss_counters_cache";
  45. /* if ($feed_id > 0) {
  46. $tmp_result = db_query("SELECT owner_uid FROM ttrss_feeds
  47. WHERE id = '$feed_id'");
  48. $owner_uid = db_fetch_result($tmp_result, 0, "owner_uid");
  49. } */
  50. } else {
  51. $table = "ttrss_cat_counters_cache";
  52. }
  53. if (DB_TYPE == "pgsql") {
  54. $date_qpart = "updated > NOW() - INTERVAL '15 minutes'";
  55. } else if (DB_TYPE == "mysql") {
  56. $date_qpart = "updated > DATE_SUB(NOW(), INTERVAL 15 MINUTE)";
  57. }
  58. $result = db_query("SELECT value FROM $table
  59. WHERE owner_uid = '$owner_uid' AND feed_id = '$feed_id'
  60. LIMIT 1");
  61. if (db_num_rows($result) == 1) {
  62. return db_fetch_result($result, 0, "value");
  63. } else {
  64. if ($no_update) {
  65. return -1;
  66. } else {
  67. return CCache::update($feed_id, $owner_uid, $is_cat);
  68. }
  69. }
  70. }
  71. static function update($feed_id, $owner_uid, $is_cat = false,
  72. $update_pcat = true, $pcat_fast = false) {
  73. if (!is_numeric($feed_id)) return;
  74. /* if (!$is_cat && $feed_id > 0) {
  75. $tmp_result = db_query("SELECT owner_uid FROM ttrss_feeds
  76. WHERE id = '$feed_id'");
  77. $owner_uid = db_fetch_result($tmp_result, 0, "owner_uid");
  78. } */
  79. $prev_unread = CCache::find($feed_id, $owner_uid, $is_cat, true);
  80. /* When updating a label, all we need to do is recalculate feed counters
  81. * because labels are not cached */
  82. if ($feed_id < 0) {
  83. CCache::update_all($owner_uid);
  84. return;
  85. }
  86. if (!$is_cat) {
  87. $table = "ttrss_counters_cache";
  88. } else {
  89. $table = "ttrss_cat_counters_cache";
  90. }
  91. if ($is_cat && $feed_id >= 0) {
  92. if ($feed_id != 0) {
  93. $cat_qpart = "cat_id = '$feed_id'";
  94. } else {
  95. $cat_qpart = "cat_id IS NULL";
  96. }
  97. /* Recalculate counters for child feeds */
  98. if (!$pcat_fast) {
  99. $result = db_query("SELECT id FROM ttrss_feeds
  100. WHERE owner_uid = '$owner_uid' AND $cat_qpart");
  101. while ($line = db_fetch_assoc($result)) {
  102. CCache::update($line["id"], $owner_uid, false, false);
  103. }
  104. }
  105. $result = db_query("SELECT SUM(value) AS sv
  106. FROM ttrss_counters_cache, ttrss_feeds
  107. WHERE id = feed_id AND $cat_qpart AND
  108. ttrss_counters_cache.owner_uid = $owner_uid AND
  109. ttrss_feeds.owner_uid = '$owner_uid'");
  110. $unread = (int) db_fetch_result($result, 0, "sv");
  111. } else {
  112. $unread = (int) Feeds::getFeedArticles($feed_id, $is_cat, true, $owner_uid);
  113. }
  114. db_query("BEGIN");
  115. $result = db_query("SELECT feed_id FROM $table
  116. WHERE owner_uid = '$owner_uid' AND feed_id = '$feed_id' LIMIT 1");
  117. if (db_num_rows($result) == 1) {
  118. db_query("UPDATE $table SET
  119. value = '$unread', updated = NOW() WHERE
  120. feed_id = '$feed_id' AND owner_uid = '$owner_uid'");
  121. } else {
  122. db_query("INSERT INTO $table
  123. (feed_id, value, owner_uid, updated)
  124. VALUES
  125. ($feed_id, $unread, $owner_uid, NOW())");
  126. }
  127. db_query("COMMIT");
  128. if ($feed_id > 0 && $prev_unread != $unread) {
  129. if (!$is_cat) {
  130. /* Update parent category */
  131. if ($update_pcat) {
  132. $result = db_query("SELECT cat_id FROM ttrss_feeds
  133. WHERE owner_uid = '$owner_uid' AND id = '$feed_id'");
  134. $cat_id = (int) db_fetch_result($result, 0, "cat_id");
  135. CCache::update($cat_id, $owner_uid, true, true, true);
  136. }
  137. }
  138. } else if ($feed_id < 0) {
  139. CCache::update_all($owner_uid);
  140. }
  141. return $unread;
  142. }
  143. /* function ccache_cleanup($owner_uid) {
  144. if (DB_TYPE == "pgsql") {
  145. db_query("DELETE FROM ttrss_counters_cache AS c1 WHERE
  146. (SELECT count(*) FROM ttrss_counters_cache AS c2
  147. WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1
  148. AND owner_uid = '$owner_uid'");
  149. db_query("DELETE FROM ttrss_cat_counters_cache AS c1 WHERE
  150. (SELECT count(*) FROM ttrss_cat_counters_cache AS c2
  151. WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1
  152. AND owner_uid = '$owner_uid'");
  153. } else {
  154. db_query("DELETE c1 FROM
  155. ttrss_counters_cache AS c1,
  156. ttrss_counters_cache AS c2
  157. WHERE
  158. c1.owner_uid = '$owner_uid' AND
  159. c1.owner_uid = c2.owner_uid AND
  160. c1.feed_id = c2.feed_id");
  161. db_query("DELETE c1 FROM
  162. ttrss_cat_counters_cache AS c1,
  163. ttrss_cat_counters_cache AS c2
  164. WHERE
  165. c1.owner_uid = '$owner_uid' AND
  166. c1.owner_uid = c2.owner_uid AND
  167. c1.feed_id = c2.feed_id");
  168. }
  169. } */
  170. }