aboutsummaryrefslogtreecommitdiff
path: root/app/Models/EntryDAOPGSQL.php
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-08-02 22:49:35 +0200
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2016-08-02 22:49:35 +0200
commit7c1b5e322cca0134f57b3a436129985ba9170b9f (patch)
tree48e17355367549337a9bb2ba00237a5dbec2e240 /app/Models/EntryDAOPGSQL.php
parent4a516aef583f4292293026ebc1d1a3984b75b4e8 (diff)
PostgreSQL draft
https://github.com/FreshRSS/FreshRSS/issues/416 Based on @Damstre work https://github.com/FreshRSS/FreshRSS/pull/1071 Not tested
Diffstat (limited to 'app/Models/EntryDAOPGSQL.php')
-rw-r--r--app/Models/EntryDAOPGSQL.php92
1 files changed, 92 insertions, 0 deletions
diff --git a/app/Models/EntryDAOPGSQL.php b/app/Models/EntryDAOPGSQL.php
new file mode 100644
index 000000000..95c12ff5d
--- /dev/null
+++ b/app/Models/EntryDAOPGSQL.php
@@ -0,0 +1,92 @@
+<?php
+
+class FreshRSS_EntryDAOPGSQL extends FreshRSS_EntryDAO {
+
+ protected function addColumn($name) {
+ return false;
+ }
+
+ protected function updateCacheUnreads($catId = false, $feedId = false) {
+ return true; //done via triggers
+ }
+
+ /**
+ * Mark all the articles in a feed as read.
+ * There is a fail safe to prevent to mark as read articles that are
+ * loaded during the mark as read action. Then the cache is updated.
+ *
+ * If $idMax equals 0, a deprecated debug message is logged
+ *
+ * @param integer $id_feed feed ID
+ * @param integer $idMax fail safe article ID
+ * @return integer affected rows
+ */
+ public function markReadFeed($id_feed, $idMax = 0) {
+ if ($idMax == 0) {
+ $idMax = time() . '000000';
+ Minz_Log::debug('Calling markReadFeed(0) is deprecated!');
+ }
+ $this->bd->beginTransaction();
+
+ $sql = 'UPDATE "' . $this->prefix . 'entry" '
+ . 'SET is_read=:is_read '
+ . 'WHERE id_feed=:id_feed AND NOT is_read AND id <= :idmax';
+ $values = array($id_feed, $idMax);
+ $stm = $this->bd->prepare($sql);
+ $stm->bindValue(':is_read', true, PDO::PARAM_BOOL);
+ $stm->bindValue(':id_feed', $id_feed);
+ $stm->bindValue(':idmax', $idMax);
+
+ if (!($stm && $stm->execute())) {
+ $info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo();
+ Minz_Log::error('SQL error markReadFeed: ' . $info[2]);
+ $this->bd->rollBack();
+ return false;
+ }
+ $affected = $stm->rowCount();
+
+ $this->bd->commit();
+ return $affected;
+ }
+
+ public function listHashForFeedGuids($id_feed, $guids) {
+ if (count($guids) < 1) {
+ return array();
+ }
+ $sql = 'SELECT guid, hash AS hexHash FROM "' . $this->prefix . 'entry" WHERE id_feed=? AND guid IN (' . str_repeat('?,', count($guids) - 1). '?)';
+ $stm = $this->bd->prepare($sql);
+ $values = array($id_feed);
+ $values = array_merge($values, $guids);
+ if ($stm && $stm->execute($values)) {
+ $result = array();
+ $rows = $stm->fetchAll(PDO::FETCH_ASSOC);
+ foreach ($rows as $row) {
+ $result[$row['guid']] = $row['hexHash'];
+ }
+ return $result;
+ } else {
+ $info = $stm == null ? array(0 => '', 1 => '', 2 => 'syntax error') : $stm->errorInfo();
+ if ($this->autoAddColumn($info)) {
+ return $this->listHashForFeedGuids($id_feed, $guids);
+ }
+ Minz_Log::error('SQL error listHashForFeedGuids: ' . $info[0] . ': ' . $info[1] . ' ' . $info[2]
+ . ' while querying feed ' . $id_feed);
+ return false;
+ }
+ }
+
+ public function optimizeTable() {
+ return null;
+ }
+
+ public function size($all = true) {
+ $db = FreshRSS_Context::$system_conf->db;
+ $sql = 'SELECT pg_size_pretty(pg_database_size(?))';
+ $values = array($db['base']);
+ $stm = $this->bd->prepare($sql);
+ $stm->execute($values);
+ $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
+ return $res[0];
+ }
+
+}