aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/Models/FeedDAO.php13
-rw-r--r--app/Models/FeedDAOPGSQL.php42
2 files changed, 45 insertions, 10 deletions
diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php
index ddc2057db..dcabf337b 100644
--- a/app/Models/FeedDAO.php
+++ b/app/Models/FeedDAO.php
@@ -497,16 +497,9 @@ SQL;
GROUP BY id_feed
)
UPDATE `_feed`
- SET `cache_nbEntries` = COALESCE((
- SELECT c.total_entries
- FROM entry_counts AS c
- WHERE c.id_feed = `_feed`.id
- ), 0),
- `cache_nbUnreads` = COALESCE((
- SELECT c.unread_entries
- FROM entry_counts AS c
- WHERE c.id_feed = `_feed`.id
- ), 0)
+ LEFT JOIN entry_counts ON entry_counts.id_feed = `_feed`.id
+ SET `cache_nbEntries` = COALESCE(entry_counts.total_entries, 0),
+ `cache_nbUnreads` = COALESCE(entry_counts.unread_entries, 0)
WHERE $whereFeedIds
SQL;
$stm = $this->pdo->prepare($sql);
diff --git a/app/Models/FeedDAOPGSQL.php b/app/Models/FeedDAOPGSQL.php
index f436a2ec4..d09d2e1c9 100644
--- a/app/Models/FeedDAOPGSQL.php
+++ b/app/Models/FeedDAOPGSQL.php
@@ -10,4 +10,46 @@ SELECT setval('`_feed_id_seq`', COALESCE(MAX(id), 0) + 1, false) FROM `_feed`
SQL;
return $this->pdo->exec($sql) !== false;
}
+
+ #[\Override]
+ public function updateCachedValues(int ...$feedIds): int|false {
+ if (empty($feedIds)) {
+ $whereFeedIds = 'true';
+ $whereEntryIdFeeds = 'true';
+ } else {
+ $whereFeedIds = 'id IN (' . str_repeat('?,', count($feedIds) - 1) . '?)';
+ $whereEntryIdFeeds = 'id_feed IN (' . str_repeat('?,', count($feedIds) - 1) . '?)';
+ }
+ $sql = <<<SQL
+ WITH entry_counts AS (
+ SELECT
+ id_feed,
+ COUNT(*) AS total_entries,
+ SUM(CASE WHEN is_read = 0 THEN 1 ELSE 0 END) AS unread_entries
+ FROM `_entry`
+ WHERE $whereEntryIdFeeds
+ GROUP BY id_feed
+ )
+ UPDATE `_feed`
+ SET `cache_nbEntries` = COALESCE((
+ SELECT c.total_entries
+ FROM entry_counts AS c
+ WHERE c.id_feed = `_feed`.id
+ ), 0),
+ `cache_nbUnreads` = COALESCE((
+ SELECT c.unread_entries
+ FROM entry_counts AS c
+ WHERE c.id_feed = `_feed`.id
+ ), 0)
+ WHERE $whereFeedIds
+ SQL;
+ $stm = $this->pdo->prepare($sql);
+ if ($stm !== false && $stm->execute(array_merge($feedIds, $feedIds))) {
+ return $stm->rowCount();
+ } else {
+ $info = $stm === false ? $this->pdo->errorInfo() : $stm->errorInfo();
+ Minz_Log::error('SQL error ' . __METHOD__ . json_encode($info));
+ return false;
+ }
+ }
}