summaryrefslogtreecommitdiff
path: root/classes/counters.php
diff options
context:
space:
mode:
Diffstat (limited to 'classes/counters.php')
-rw-r--r--classes/counters.php230
1 files changed, 151 insertions, 79 deletions
diff --git a/classes/counters.php b/classes/counters.php
index 59605df18..b4602825c 100644
--- a/classes/counters.php
+++ b/classes/counters.php
@@ -1,18 +1,27 @@
<?php
class Counters {
- static function getAllCounters() {
- $data = self::getGlobalCounters();
-
- $data = array_merge($data, self::getVirtCounters());
- $data = array_merge($data, self::getLabelCounters());
- $data = array_merge($data, self::getFeedCounters());
- $data = array_merge($data, self::getCategoryCounters());
+ static function get_all() {
+ return array_merge(
+ self::get_global(),
+ self::get_virt(),
+ self::get_labels(),
+ self::get_feeds(),
+ self::get_cats()
+ );
+ }
- return $data;
+ static function get_conditional(array $feed_ids = null, array $label_ids = null) {
+ return array_merge(
+ self::get_global(),
+ self::get_virt(),
+ self::get_labels($label_ids),
+ self::get_feeds($feed_ids),
+ self::get_cats(is_array($feed_ids) ? Feeds::_cats_of($feed_ids, $_SESSION["uid"], true) : null)
+ );
}
- static private function getCategoryChildrenCounters($cat_id, $owner_uid) {
+ static private function get_cat_children($cat_id, $owner_uid) {
$pdo = Db::pdo();
$sth = $pdo->prepare("SELECT id FROM ttrss_feed_categories WHERE parent_cat = ?
@@ -23,52 +32,86 @@ class Counters {
$marked = 0;
while ($line = $sth->fetch()) {
- list ($tmp_unread, $tmp_marked) = self::getCategoryChildrenCounters($line["id"], $owner_uid);
+ list ($tmp_unread, $tmp_marked) = self::get_cat_children($line["id"], $owner_uid);
- $unread += $tmp_unread + Feeds::getCategoryUnread($line["id"], $owner_uid);
- $marked += $tmp_marked + Feeds::getCategoryMarked($line["id"], $owner_uid);
+ $unread += $tmp_unread + Feeds::_get_cat_unread($line["id"], $owner_uid);
+ $marked += $tmp_marked + Feeds::_get_cat_marked($line["id"], $owner_uid);
}
return [$unread, $marked];
}
- static function getCategoryCounters() {
+ private static function get_cats(array $cat_ids = null) {
$ret = [];
/* Labels category */
$cv = array("id" => -2, "kind" => "cat",
- "counter" => Feeds::getCategoryUnread(-2));
+ "counter" => Feeds::_get_cat_unread(-2));
array_push($ret, $cv);
$pdo = Db::pdo();
- $sth = $pdo->prepare("SELECT fc.id,
- SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count,
- SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS count_marked,
- (SELECT COUNT(id) FROM ttrss_feed_categories fcc
- WHERE fcc.parent_cat = fc.id) AS num_children
- FROM ttrss_feed_categories fc
- LEFT JOIN ttrss_feeds f ON (f.cat_id = fc.id)
- LEFT JOIN ttrss_user_entries ue ON (ue.feed_id = f.id)
- WHERE fc.owner_uid = :uid
- GROUP BY fc.id
- UNION
- SELECT 0,
- SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count,
- SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS count_marked,
- 0
- FROM ttrss_feeds f, ttrss_user_entries ue
- WHERE f.cat_id IS NULL AND
- ue.feed_id = f.id AND
- ue.owner_uid = :uid");
-
- $sth->execute(["uid" => $_SESSION['uid']]);
+ if (is_array($cat_ids)) {
+ if (count($cat_ids) == 0)
+ return [];
+
+ $cat_ids_qmarks = arr_qmarks($cat_ids);
+
+ $sth = $pdo->prepare("SELECT fc.id,
+ SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count,
+ SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS count_marked,
+ (SELECT COUNT(id) FROM ttrss_feed_categories fcc
+ WHERE fcc.parent_cat = fc.id) AS num_children
+ FROM ttrss_feed_categories fc
+ LEFT JOIN ttrss_feeds f ON (f.cat_id = fc.id)
+ LEFT JOIN ttrss_user_entries ue ON (ue.feed_id = f.id)
+ WHERE fc.owner_uid = ? AND fc.id IN ($cat_ids_qmarks)
+ GROUP BY fc.id
+ UNION
+ SELECT 0,
+ SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count,
+ SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS count_marked,
+ 0
+ FROM ttrss_feeds f, ttrss_user_entries ue
+ WHERE f.cat_id IS NULL AND
+ ue.feed_id = f.id AND
+ ue.owner_uid = ?");
+
+ $sth->execute(array_merge(
+ [$_SESSION['uid']],
+ $cat_ids,
+ [$_SESSION['uid']]
+ ));
+
+ } else {
+ $sth = $pdo->prepare("SELECT fc.id,
+ SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count,
+ SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS count_marked,
+ (SELECT COUNT(id) FROM ttrss_feed_categories fcc
+ WHERE fcc.parent_cat = fc.id) AS num_children
+ FROM ttrss_feed_categories fc
+ LEFT JOIN ttrss_feeds f ON (f.cat_id = fc.id)
+ LEFT JOIN ttrss_user_entries ue ON (ue.feed_id = f.id)
+ WHERE fc.owner_uid = :uid
+ GROUP BY fc.id
+ UNION
+ SELECT 0,
+ SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count,
+ SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS count_marked,
+ 0
+ FROM ttrss_feeds f, ttrss_user_entries ue
+ WHERE f.cat_id IS NULL AND
+ ue.feed_id = f.id AND
+ ue.owner_uid = :uid");
+
+ $sth->execute(["uid" => $_SESSION['uid']]);
+ }
while ($line = $sth->fetch()) {
if ($line["num_children"] > 0) {
- list ($child_counter, $child_marked_counter) = self::getCategoryChildrenCounters($line["id"], $_SESSION["uid"]);
+ list ($child_counter, $child_marked_counter) = self::get_cat_children($line["id"], $_SESSION["uid"]);
} else {
$child_counter = 0;
$child_marked_counter = 0;
@@ -84,38 +127,53 @@ class Counters {
array_push($ret, $cv);
}
- array_push($ret, $cv);
-
return $ret;
}
-
- static function getFeedCounters($active_feed = false) {
+ private static function get_feeds(array $feed_ids = null) {
$ret = [];
$pdo = Db::pdo();
- $sth = $pdo->prepare("SELECT f.id,
- f.title,
- ".SUBSTRING_FOR_DATE."(f.last_updated,1,19) AS last_updated,
- f.last_error,
- SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count,
- SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS count_marked
- FROM ttrss_feeds f, ttrss_user_entries ue
- WHERE f.id = ue.feed_id AND ue.owner_uid = :uid
- GROUP BY f.id");
-
- $sth->execute(["uid" => $_SESSION['uid']]);
+ if (is_array($feed_ids)) {
+ if (count($feed_ids) == 0)
+ return [];
+
+ $feed_ids_qmarks = arr_qmarks($feed_ids);
+
+ $sth = $pdo->prepare("SELECT f.id,
+ f.title,
+ ".SUBSTRING_FOR_DATE."(f.last_updated,1,19) AS last_updated,
+ f.last_error,
+ SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count,
+ SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS count_marked
+ FROM ttrss_feeds f, ttrss_user_entries ue
+ WHERE f.id = ue.feed_id AND ue.owner_uid = ? AND f.id IN ($feed_ids_qmarks)
+ GROUP BY f.id");
+
+ $sth->execute(array_merge([$_SESSION['uid']], $feed_ids));
+ } else {
+ $sth = $pdo->prepare("SELECT f.id,
+ f.title,
+ ".SUBSTRING_FOR_DATE."(f.last_updated,1,19) AS last_updated,
+ f.last_error,
+ SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count,
+ SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS count_marked
+ FROM ttrss_feeds f, ttrss_user_entries ue
+ WHERE f.id = ue.feed_id AND ue.owner_uid = :uid
+ GROUP BY f.id");
+
+ $sth->execute(["uid" => $_SESSION['uid']]);
+ }
while ($line = $sth->fetch()) {
$id = $line["id"];
- $last_error = htmlspecialchars($line["last_error"]);
$last_updated = TimeHelper::make_local_datetime($line['last_updated'], false);
- if (Feeds::feedHasIcon($id)) {
- $has_img = filemtime(Feeds::getIconFile($id));
+ if (Feeds::_has_icon($id)) {
+ $has_img = filemtime(Feeds::_get_icon_file($id));
} else {
$has_img = false;
}
@@ -132,11 +190,8 @@ class Counters {
"has_img" => (int) $has_img
];
- if ($last_error)
- $cv["error"] = $last_error;
-
- if ($active_feed && $id == $active_feed)
- $cv["title"] = truncate_string($line["title"], 30);
+ $cv["error"] = $line["last_error"];
+ $cv["title"] = truncate_string($line["title"], 30);
array_push($ret, $cv);
@@ -145,11 +200,11 @@ class Counters {
return $ret;
}
- static function getGlobalCounters($global_unread = -1) {
+ private static function get_global($global_unread = -1) {
$ret = [];
if ($global_unread == -1) {
- $global_unread = Feeds::getGlobalUnread();
+ $global_unread = Feeds::_get_global_unread();
}
$cv = [
@@ -178,7 +233,7 @@ class Counters {
return $ret;
}
- static function getVirtCounters() {
+ private static function get_virt() {
$ret = [];
@@ -187,7 +242,7 @@ class Counters {
$count = getFeedUnread($i);
if ($i == 0 || $i == -1 || $i == -2)
- $auxctr = Feeds::getFeedArticles($i, false);
+ $auxctr = Feeds::_get_counters($i, false);
else
$auxctr = 0;
@@ -222,23 +277,42 @@ class Counters {
return $ret;
}
- static function getLabelCounters($descriptions = false) {
+ static function get_labels(array $label_ids = null) {
$ret = [];
$pdo = Db::pdo();
- $sth = $pdo->prepare("SELECT id,
- caption,
- SUM(CASE WHEN u1.unread = true THEN 1 ELSE 0 END) AS count_unread,
- SUM(CASE WHEN u1.marked = true THEN 1 ELSE 0 END) AS count_marked,
- COUNT(u1.unread) AS total
- FROM ttrss_labels2 LEFT JOIN ttrss_user_labels2 ON
- (ttrss_labels2.id = label_id)
- LEFT JOIN ttrss_user_entries AS u1 ON u1.ref_id = article_id AND u1.owner_uid = :uid
- WHERE ttrss_labels2.owner_uid = :uid
- GROUP BY ttrss_labels2.id, ttrss_labels2.caption");
- $sth->execute([":uid" => $_SESSION['uid']]);
+ if (is_array($label_ids)) {
+ if (count($label_ids) == 0)
+ return [];
+
+ $label_ids_qmarks = arr_qmarks($label_ids);
+
+ $sth = $pdo->prepare("SELECT id,
+ caption,
+ SUM(CASE WHEN u1.unread = true THEN 1 ELSE 0 END) AS count_unread,
+ SUM(CASE WHEN u1.marked = true THEN 1 ELSE 0 END) AS count_marked,
+ COUNT(u1.unread) AS total
+ FROM ttrss_labels2 LEFT JOIN ttrss_user_labels2 ON
+ (ttrss_labels2.id = label_id)
+ LEFT JOIN ttrss_user_entries AS u1 ON u1.ref_id = article_id AND u1.owner_uid = ?
+ WHERE ttrss_labels2.owner_uid = ? AND ttrss_labels2.id IN ($label_ids_qmarks)
+ GROUP BY ttrss_labels2.id, ttrss_labels2.caption");
+ $sth->execute(array_merge([$_SESSION["uid"], $_SESSION["uid"]], $label_ids));
+ } else {
+ $sth = $pdo->prepare("SELECT id,
+ caption,
+ SUM(CASE WHEN u1.unread = true THEN 1 ELSE 0 END) AS count_unread,
+ SUM(CASE WHEN u1.marked = true THEN 1 ELSE 0 END) AS count_marked,
+ COUNT(u1.unread) AS total
+ FROM ttrss_labels2 LEFT JOIN ttrss_user_labels2 ON
+ (ttrss_labels2.id = label_id)
+ LEFT JOIN ttrss_user_entries AS u1 ON u1.ref_id = article_id AND u1.owner_uid = :uid
+ WHERE ttrss_labels2.owner_uid = :uid
+ GROUP BY ttrss_labels2.id, ttrss_labels2.caption");
+ $sth->execute([":uid" => $_SESSION['uid']]);
+ }
while ($line = $sth->fetch()) {
@@ -248,12 +322,10 @@ class Counters {
"id" => $id,
"counter" => (int) $line["count_unread"],
"auxcounter" => (int) $line["total"],
- "markedcounter" => (int) $line["count_marked"]
+ "markedcounter" => (int) $line["count_marked"],
+ "description" => $line["caption"]
];
- if ($descriptions)
- $cv["description"] = $line["caption"];
-
array_push($ret, $cv);
}