summaryrefslogtreecommitdiff
path: root/classes
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2017-05-04 15:22:57 +0300
committerAndrew Dolgov <[email protected]>2017-05-04 15:22:57 +0300
commit2ed0d6c433c9ef5a6b9137725030f64b4b38392e (patch)
tree1ce20d942027d0b8d3d9b90bbd16fad631e760ce /classes
parentaeb1abedb2cb5051c2a94e287f114bdbdaa467ff (diff)
move counter cache to a separate class
fix references to get_article_tags
Diffstat (limited to 'classes')
-rw-r--r--classes/api.php2
-rw-r--r--classes/article.php6
-rw-r--r--classes/ccache.php228
-rwxr-xr-xclasses/feeds.php6
-rw-r--r--classes/handler/public.php2
-rwxr-xr-xclasses/pref/feeds.php14
6 files changed, 243 insertions, 15 deletions
diff --git a/classes/api.php b/classes/api.php
index 6c7823a8f..31dd3c086 100644
--- a/classes/api.php
+++ b/classes/api.php
@@ -297,7 +297,7 @@ class API extends Handler {
WHERE ref_id IN ($article_ids)");
while ($line = $this->dbh->fetch_assoc($result)) {
- ccache_update($line["feed_id"], $_SESSION["uid"]);
+ CCache::update($line["feed_id"], $_SESSION["uid"]);
}
}
diff --git a/classes/article.php b/classes/article.php
index 7924ded35..6d881f50e 100644
--- a/classes/article.php
+++ b/classes/article.php
@@ -81,7 +81,7 @@ class Article extends Handler_Protected {
}
$feed_id = $this->getArticleFeed($id);
- ccache_update($feed_id, $_SESSION["uid"]);
+ CCache::update($feed_id, $_SESSION["uid"]);
}
static function create_published_article($title, $url, $content, $labels_str,
@@ -544,7 +544,7 @@ class Article extends Handler_Protected {
SET unread = false,last_read = NOW()
WHERE ref_id = '$id' AND owner_uid = $owner_uid");
- ccache_update($feed_id, $owner_uid);
+ CCache::update($feed_id, $owner_uid);
}
$result = db_query("SELECT id,title,link,content,feed_id,comments,int_id,lang,
@@ -909,7 +909,7 @@ class Article extends Handler_Protected {
WHERE ($ids_qpart) AND owner_uid = $owner_uid");
while ($line = db_fetch_assoc($result)) {
- ccache_update($line["feed_id"], $owner_uid);
+ CCache::update($line["feed_id"], $owner_uid);
}
}
diff --git a/classes/ccache.php b/classes/ccache.php
new file mode 100644
index 000000000..4efb96d97
--- /dev/null
+++ b/classes/ccache.php
@@ -0,0 +1,228 @@
+<?php
+class CCache {
+ /* function ccache_zero($feed_id, $owner_uid) {
+ db_query("UPDATE ttrss_counters_cache SET
+ value = 0, updated = NOW() WHERE
+ feed_id = '$feed_id' AND owner_uid = '$owner_uid'");
+ } */
+
+ static function zero_all($owner_uid) {
+ db_query("UPDATE ttrss_counters_cache SET
+ value = 0 WHERE owner_uid = '$owner_uid'");
+
+ db_query("UPDATE ttrss_cat_counters_cache SET
+ value = 0 WHERE owner_uid = '$owner_uid'");
+ }
+
+ static function remove($feed_id, $owner_uid, $is_cat = false) {
+
+ if (!$is_cat) {
+ $table = "ttrss_counters_cache";
+ } else {
+ $table = "ttrss_cat_counters_cache";
+ }
+
+ db_query("DELETE FROM $table WHERE
+ feed_id = '$feed_id' AND owner_uid = '$owner_uid'");
+
+ }
+
+ static function update_all($owner_uid) {
+
+ if (get_pref('ENABLE_FEED_CATS', $owner_uid)) {
+
+ $result = db_query("SELECT feed_id FROM ttrss_cat_counters_cache
+ WHERE feed_id > 0 AND owner_uid = '$owner_uid'");
+
+ while ($line = db_fetch_assoc($result)) {
+ CCache::update($line["feed_id"], $owner_uid, true);
+ }
+
+ /* We have to manually include category 0 */
+
+ CCache::update(0, $owner_uid, true);
+
+ } else {
+ $result = db_query("SELECT feed_id FROM ttrss_counters_cache
+ WHERE feed_id > 0 AND owner_uid = '$owner_uid'");
+
+ while ($line = db_fetch_assoc($result)) {
+ print CCache::update($line["feed_id"], $owner_uid);
+
+ }
+
+ }
+ }
+
+ static function find($feed_id, $owner_uid, $is_cat = false,
+ $no_update = false) {
+
+ if (!is_numeric($feed_id)) return;
+
+ if (!$is_cat) {
+ $table = "ttrss_counters_cache";
+ /* if ($feed_id > 0) {
+ $tmp_result = db_query("SELECT owner_uid FROM ttrss_feeds
+ WHERE id = '$feed_id'");
+ $owner_uid = db_fetch_result($tmp_result, 0, "owner_uid");
+ } */
+ } else {
+ $table = "ttrss_cat_counters_cache";
+ }
+
+ if (DB_TYPE == "pgsql") {
+ $date_qpart = "updated > NOW() - INTERVAL '15 minutes'";
+ } else if (DB_TYPE == "mysql") {
+ $date_qpart = "updated > DATE_SUB(NOW(), INTERVAL 15 MINUTE)";
+ }
+
+ $result = db_query("SELECT value FROM $table
+ WHERE owner_uid = '$owner_uid' AND feed_id = '$feed_id'
+ LIMIT 1");
+
+ if (db_num_rows($result) == 1) {
+ return db_fetch_result($result, 0, "value");
+ } else {
+ if ($no_update) {
+ return -1;
+ } else {
+ return CCache::update($feed_id, $owner_uid, $is_cat);
+ }
+ }
+
+ }
+
+ static function update($feed_id, $owner_uid, $is_cat = false,
+ $update_pcat = true, $pcat_fast = false) {
+
+ if (!is_numeric($feed_id)) return;
+
+ /* if (!$is_cat && $feed_id > 0) {
+ $tmp_result = db_query("SELECT owner_uid FROM ttrss_feeds
+ WHERE id = '$feed_id'");
+ $owner_uid = db_fetch_result($tmp_result, 0, "owner_uid");
+ } */
+
+ $prev_unread = CCache::find($feed_id, $owner_uid, $is_cat, true);
+
+ /* When updating a label, all we need to do is recalculate feed counters
+ * because labels are not cached */
+
+ if ($feed_id < 0) {
+ CCache::update_all($owner_uid);
+ return;
+ }
+
+ if (!$is_cat) {
+ $table = "ttrss_counters_cache";
+ } else {
+ $table = "ttrss_cat_counters_cache";
+ }
+
+ if ($is_cat && $feed_id >= 0) {
+ if ($feed_id != 0) {
+ $cat_qpart = "cat_id = '$feed_id'";
+ } else {
+ $cat_qpart = "cat_id IS NULL";
+ }
+
+ /* Recalculate counters for child feeds */
+
+ if (!$pcat_fast) {
+ $result = db_query("SELECT id FROM ttrss_feeds
+ WHERE owner_uid = '$owner_uid' AND $cat_qpart");
+
+ while ($line = db_fetch_assoc($result)) {
+ CCache::update($line["id"], $owner_uid, false, false);
+ }
+ }
+
+ $result = db_query("SELECT SUM(value) AS sv
+ FROM ttrss_counters_cache, ttrss_feeds
+ WHERE id = feed_id AND $cat_qpart AND
+ ttrss_counters_cache.owner_uid = $owner_uid AND
+ ttrss_feeds.owner_uid = '$owner_uid'");
+
+ $unread = (int) db_fetch_result($result, 0, "sv");
+
+ } else {
+ $unread = (int) Feeds::getFeedArticles($feed_id, $is_cat, true, $owner_uid);
+ }
+
+ db_query("BEGIN");
+
+ $result = db_query("SELECT feed_id FROM $table
+ WHERE owner_uid = '$owner_uid' AND feed_id = '$feed_id' LIMIT 1");
+
+ if (db_num_rows($result) == 1) {
+ db_query("UPDATE $table SET
+ value = '$unread', updated = NOW() WHERE
+ feed_id = '$feed_id' AND owner_uid = '$owner_uid'");
+
+ } else {
+ db_query("INSERT INTO $table
+ (feed_id, value, owner_uid, updated)
+ VALUES
+ ($feed_id, $unread, $owner_uid, NOW())");
+ }
+
+ db_query("COMMIT");
+
+ if ($feed_id > 0 && $prev_unread != $unread) {
+
+ if (!$is_cat) {
+
+ /* Update parent category */
+
+ if ($update_pcat) {
+
+ $result = db_query("SELECT cat_id FROM ttrss_feeds
+ WHERE owner_uid = '$owner_uid' AND id = '$feed_id'");
+
+ $cat_id = (int) db_fetch_result($result, 0, "cat_id");
+
+ CCache::update($cat_id, $owner_uid, true, true, true);
+
+ }
+ }
+ } else if ($feed_id < 0) {
+ CCache::update_all($owner_uid);
+ }
+
+ return $unread;
+ }
+
+ /* function ccache_cleanup($owner_uid) {
+
+ if (DB_TYPE == "pgsql") {
+ db_query("DELETE FROM ttrss_counters_cache AS c1 WHERE
+ (SELECT count(*) FROM ttrss_counters_cache AS c2
+ WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1
+ AND owner_uid = '$owner_uid'");
+
+ db_query("DELETE FROM ttrss_cat_counters_cache AS c1 WHERE
+ (SELECT count(*) FROM ttrss_cat_counters_cache AS c2
+ WHERE c1.feed_id = c2.feed_id AND c2.owner_uid = c1.owner_uid) > 1
+ AND owner_uid = '$owner_uid'");
+ } else {
+ db_query("DELETE c1 FROM
+ ttrss_counters_cache AS c1,
+ ttrss_counters_cache AS c2
+ WHERE
+ c1.owner_uid = '$owner_uid' AND
+ c1.owner_uid = c2.owner_uid AND
+ c1.feed_id = c2.feed_id");
+
+ db_query("DELETE c1 FROM
+ ttrss_cat_counters_cache AS c1,
+ ttrss_cat_counters_cache AS c2
+ WHERE
+ c1.owner_uid = '$owner_uid' AND
+ c1.owner_uid = c2.owner_uid AND
+ c1.feed_id = c2.feed_id");
+
+ }
+ } */
+
+
+} \ No newline at end of file
diff --git a/classes/feeds.php b/classes/feeds.php
index 0b326d2bf..23571c369 100755
--- a/classes/feeds.php
+++ b/classes/feeds.php
@@ -836,7 +836,7 @@ class Feeds extends Handler_Protected {
function catchupAll() {
$this->dbh->query("UPDATE ttrss_user_entries SET
last_read = NOW(), unread = false WHERE unread = true AND owner_uid = " . $_SESSION["uid"]);
- ccache_zero_all($_SESSION["uid"]);
+ CCache::zero_all($_SESSION["uid"]);
}
function view() {
@@ -890,7 +890,7 @@ class Feeds extends Handler_Protected {
* so for performance reasons we don't do that here */
if ($feed >= 0) {
- ccache_update($feed, $_SESSION["uid"], $cat_view);
+ CCache::update($feed, $_SESSION["uid"], $cat_view);
}
set_pref("_DEFAULT_VIEW_MODE", $view_mode);
@@ -1365,7 +1365,7 @@ class Feeds extends Handler_Protected {
}
- ccache_update($feed, $owner_uid, $cat_view);
+ CCache::update($feed, $owner_uid, $cat_view);
} else { // tag
db_query("UPDATE ttrss_user_entries
diff --git a/classes/handler/public.php b/classes/handler/public.php
index ec0c0fc60..d525bc54c 100644
--- a/classes/handler/public.php
+++ b/classes/handler/public.php
@@ -227,7 +227,7 @@ class Handler_Public extends Handler {
if ($line['note']) $article['note'] = $line['note'];
if ($article['author']) $article['author'] = $line['author'];
- $tags = get_article_tags($line["id"], $owner_uid);
+ $tags = Article::get_article_tags($line["id"], $owner_uid);
if (count($tags) > 0) {
$article['tags'] = array();
diff --git a/classes/pref/feeds.php b/classes/pref/feeds.php
index f3df0297d..c12e76f6b 100755
--- a/classes/pref/feeds.php
+++ b/classes/pref/feeds.php
@@ -1168,7 +1168,7 @@ class Pref_Feeds extends Handler_Protected {
while ($line = $this->dbh->fetch_assoc($result)) {
- $tags = get_article_tags($line["ref_id"]);
+ $tags = Article::get_article_tags($line["ref_id"]);
$article_filters = get_article_filters($filters, $line['title'],
$line['content'], $line['link'], strtotime($line['updated']),
@@ -1225,7 +1225,7 @@ class Pref_Feeds extends Handler_Protected {
while ($line = $this->dbh->fetch_assoc($tmp_result)) {
- $tags = get_article_tags($line["ref_id"]);
+ $tags = Article::get_article_tags($line["ref_id"]);
$article_filters = get_article_filters($filters, $line['title'],
$line['content'], $line['link'], strtotime($line['updated']),
@@ -1535,7 +1535,7 @@ class Pref_Feeds extends Handler_Protected {
$cat_id = (int) $cat_id;
if ($cat_id > 0) {
- $cat_unread = ccache_find($cat_id, $_SESSION["uid"], true);
+ $cat_unread = CCache::find($cat_id, $_SESSION["uid"], true);
} else if ($cat_id == 0 || $cat_id == -2) {
$cat_unread = Feeds::getCategoryUnread($cat_id);
}
@@ -1740,7 +1740,7 @@ class Pref_Feeds extends Handler_Protected {
$result = $this->dbh->query("DELETE FROM ttrss_entries WHERE
(SELECT COUNT(int_id) FROM ttrss_user_entries WHERE ref_id = id) = 0");
- ccache_update($id, $_SESSION['uid']);
+ CCache::update($id, $_SESSION['uid']);
} // function clear_feed_articles
private function remove_feed_category($id, $owner_uid) {
@@ -1748,7 +1748,7 @@ class Pref_Feeds extends Handler_Protected {
$this->dbh->query("DELETE FROM ttrss_feed_categories
WHERE id = '$id' AND owner_uid = $owner_uid");
- ccache_remove($id, $owner_uid, true);
+ CCache::remove($id, $owner_uid, true);
}
static function remove_feed($id, $owner_uid) {
@@ -1803,11 +1803,11 @@ class Pref_Feeds extends Handler_Protected {
unlink(ICONS_DIR . "/$id.ico");
}
- ccache_remove($id, $owner_uid);
+ CCache::remove($id, $owner_uid);
} else {
label_remove(feed_to_label_id($id), $owner_uid);
- //ccache_remove($id, $owner_uid); don't think labels are cached
+ //CCache::remove($id, $owner_uid); don't think labels are cached
}
}