aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2017-03-26 14:07:06 +0200
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2017-03-26 14:07:06 +0200
commite956aee53d561fbdc11a78a50ad7cc041108e5b5 (patch)
tree2ebad34d81f49f3ac3cbc1568e13e60f9659d55a
parenta20fd9db9f0ed0e27c65671bb10402ced10587b1 (diff)
More defered insertion. New SQL index
New index entry_feed_read_index TODO: Auto add this index to existing version
-rwxr-xr-xapp/Controllers/feedController.php8
-rw-r--r--app/Models/EntryDAO.php1
-rw-r--r--app/Models/Factory.php9
-rw-r--r--app/Models/FeedDAO.php56
-rw-r--r--app/Models/FeedDAOSQLite.php19
-rw-r--r--app/SQL/install.sql.mysql.php1
-rw-r--r--app/SQL/install.sql.pgsql.php1
-rw-r--r--app/SQL/install.sql.sqlite.php1
8 files changed, 37 insertions, 59 deletions
diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php
index b565d0439..bfc8b2045 100755
--- a/app/Controllers/feedController.php
+++ b/app/Controllers/feedController.php
@@ -393,7 +393,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
}
}
- $feedDAO->updateLastUpdate($feed->id(), false, $entryDAO->inTransaction(), $mtime);
+ $feedDAO->updateLastUpdate($feed->id(), false, $mtime);
if ($entryDAO->inTransaction()) {
$entryDAO->commit();
}
@@ -435,8 +435,14 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
}
}
if (!$noCommit) {
+ if (!$entryDAO->inTransaction()) {
+ $entryDAO->beginTransaction();
+ }
$entryDAO->commitNewEntries();
$feedDAO->updateCachedValues(); //TODO: Optimize
+ if ($entryDAO->inTransaction()) {
+ $entryDAO->commit();
+ }
}
return array($updated_feeds, reset($feeds));
}
diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php
index 9d11cec6a..39c00f01c 100644
--- a/app/Models/EntryDAO.php
+++ b/app/Models/EntryDAO.php
@@ -121,7 +121,6 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
}
protected function autoUpdateDb($errorInfo) {
- Minz_Log::warning('FreshRSS_EntryDAO::autoUpdateDb: ' . print_r($errorInfo, true));
if (isset($errorInfo[0])) {
if ($errorInfo[0] === '42S22') { //ER_BAD_FIELD_ERROR
//autoAddColumn
diff --git a/app/Models/Factory.php b/app/Models/Factory.php
index 6502c38b7..dfccc883e 100644
--- a/app/Models/Factory.php
+++ b/app/Models/Factory.php
@@ -3,14 +3,7 @@
class FreshRSS_Factory {
public static function createFeedDao($username = null) {
- $conf = Minz_Configuration::get('system');
- switch ($conf->db['type']) {
- case 'sqlite':
- case 'pgsql':
- return new FreshRSS_FeedDAOSQLite($username);
- default:
- return new FreshRSS_FeedDAO($username);
- }
+ return new FreshRSS_FeedDAO($username);
}
public static function createEntryDao($username = null) {
diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php
index 0168aebd9..d278122e3 100644
--- a/app/Models/FeedDAO.php
+++ b/app/Models/FeedDAO.php
@@ -92,29 +92,15 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
}
}
- public function updateLastUpdate($id, $inError = false, $updateCache = true, $mtime = 0) {
- if ($updateCache) {
- $sql = 'UPDATE `' . $this->prefix . 'feed` ' //2 sub-requests with FOREIGN KEY(e.id_feed), INDEX(e.is_read) faster than 1 request with GROUP BY or CASE
- . 'SET `cache_nbEntries`=(SELECT COUNT(e1.id) FROM `' . $this->prefix . 'entry` e1 WHERE e1.id_feed=`' . $this->prefix . 'feed`.id),'
- . '`cache_nbUnreads`=(SELECT COUNT(e2.id) FROM `' . $this->prefix . 'entry` e2 WHERE e2.id_feed=`' . $this->prefix . 'feed`.id AND e2.is_read=0),'
- . '`lastUpdate`=?, error=? '
- . 'WHERE id=?';
- } else {
- $sql = 'UPDATE `' . $this->prefix . 'feed` '
- . 'SET `lastUpdate`=?, error=? '
- . 'WHERE id=?';
- }
-
- if ($mtime <= 0) {
- $mtime = time();
- }
-
+ public function updateLastUpdate($id, $inError = false, $mtime = 0) { //See also updateCachedValue()
+ $sql = 'UPDATE `' . $this->prefix . 'feed` '
+ . 'SET `lastUpdate`=?, error=? '
+ . 'WHERE id=?';
$values = array(
- $mtime,
+ $mtime <= 0 ? time() : $mtime,
$inError ? 1 : 0,
$id,
);
-
$stm = $this->bd->prepare($sql);
if ($stm && $stm->execute($values)) {
@@ -294,18 +280,28 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
return $res[0]['count'];
}
- public function updateCachedValues() { //For one single feed, call updateLastUpdate($id)
- $sql = 'UPDATE `' . $this->prefix . 'feed` f '
- . 'INNER JOIN ('
- . 'SELECT e.id_feed, '
- . 'COUNT(CASE WHEN e.is_read = 0 THEN 1 END) AS nbUnreads, '
- . 'COUNT(e.id) AS nbEntries '
- . 'FROM `' . $this->prefix . 'entry` e '
- . 'GROUP BY e.id_feed'
- . ') x ON x.id_feed=f.id '
- . 'SET f.`cache_nbEntries`=x.nbEntries, f.`cache_nbUnreads`=x.nbUnreads';
+ public function updateCachedValue($id) { //For multiple feeds, call updateCachedValues()
+ $sql = 'UPDATE `' . $this->prefix . 'feed` ' //2 sub-requests with FOREIGN KEY(e.id_feed), INDEX(e.is_read) faster than 1 request with GROUP BY or CASE
+ . 'SET `cache_nbEntries`=(SELECT COUNT(e1.id) FROM `' . $this->prefix . 'entry` e1 WHERE e1.id_feed=`' . $this->prefix . 'feed`.id),'
+ . '`cache_nbUnreads`=(SELECT COUNT(e2.id) FROM `' . $this->prefix . 'entry` e2 WHERE e2.id_feed=`' . $this->prefix . 'feed`.id AND e2.is_read=0) '
+ . 'WHERE id=?';
+ $values = array($id);
$stm = $this->bd->prepare($sql);
+ if ($stm && $stm->execute($values)) {
+ return $stm->rowCount();
+ } else {
+ $info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo();
+ Minz_Log::error('SQL error updateCachedValue: ' . $info[2]);
+ return false;
+ }
+ }
+
+ public function updateCachedValues() { //For one single feed, call updateCachedValue($id)
+ $sql = 'UPDATE `' . $this->prefix . 'feed` '
+ . 'SET `cache_nbEntries`=(SELECT COUNT(e1.id) FROM `' . $this->prefix . 'entry` e1 WHERE e1.id_feed=`' . $this->prefix . 'feed`.id),'
+ . '`cache_nbUnreads`=(SELECT COUNT(e2.id) FROM `' . $this->prefix . 'entry` e2 WHERE e2.id_feed=`' . $this->prefix . 'feed`.id AND e2.is_read=0)';
+ $stm = $this->bd->prepare($sql);
if ($stm && $stm->execute()) {
return $stm->rowCount();
} else {
@@ -343,7 +339,7 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable {
return $affected;
}
- public function cleanOldEntries($id, $date_min, $keep = 15) { //Remember to call updateLastUpdate($id) or updateCachedValues() just after
+ public function cleanOldEntries($id, $date_min, $keep = 15) { //Remember to call updateCachedValue($id) or updateCachedValues() just after
$sql = 'DELETE FROM `' . $this->prefix . 'entry` '
. 'WHERE id_feed=:id_feed AND id<=:id_max '
. 'AND is_favorite=0 ' //Do not remove favourites
diff --git a/app/Models/FeedDAOSQLite.php b/app/Models/FeedDAOSQLite.php
deleted file mode 100644
index 440ae74da..000000000
--- a/app/Models/FeedDAOSQLite.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-class FreshRSS_FeedDAOSQLite extends FreshRSS_FeedDAO {
-
- public function updateCachedValues() { //For one single feed, call updateLastUpdate($id)
- $sql = 'UPDATE `' . $this->prefix . 'feed` '
- . 'SET `cache_nbEntries`=(SELECT COUNT(e1.id) FROM `' . $this->prefix . 'entry` e1 WHERE e1.id_feed=`' . $this->prefix . 'feed`.id),'
- . '`cache_nbUnreads`=(SELECT COUNT(e2.id) FROM `' . $this->prefix . 'entry` e2 WHERE e2.id_feed=`' . $this->prefix . 'feed`.id AND e2.is_read=0)';
- $stm = $this->bd->prepare($sql);
- if ($stm && $stm->execute()) {
- return $stm->rowCount();
- } else {
- $info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo();
- Minz_Log::error('SQL error updateCachedValues: ' . $info[2]);
- return false;
- }
- }
-
-}
diff --git a/app/SQL/install.sql.mysql.php b/app/SQL/install.sql.mysql.php
index f42e08ad3..3ad68173f 100644
--- a/app/SQL/install.sql.mysql.php
+++ b/app/SQL/install.sql.mysql.php
@@ -55,6 +55,7 @@ CREATE TABLE IF NOT EXISTS `%1$sentry` (
INDEX (`is_favorite`), -- v0.7
INDEX (`is_read`), -- v0.7
INDEX `entry_lastSeen_index` (`lastSeen`) -- v1.1.1
+ INDEX `entry_feed_read_index` (`id_feed`,`is_read`) -- v1.7 //TODO: Auto add this index to existing version
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
ENGINE = INNODB;
diff --git a/app/SQL/install.sql.pgsql.php b/app/SQL/install.sql.pgsql.php
index 1a666cb8a..ca4dfa925 100644
--- a/app/SQL/install.sql.pgsql.php
+++ b/app/SQL/install.sql.pgsql.php
@@ -50,6 +50,7 @@ $SQL_CREATE_TABLES = array(
'CREATE INDEX %1$sis_favorite_index ON "%1$sentry" ("is_favorite");',
'CREATE INDEX %1$sis_read_index ON "%1$sentry" ("is_read");',
'CREATE INDEX %1$sentry_lastSeen_index ON "%1$sentry" ("lastSeen");',
+'CREATE INDEX %1$sentry_feed_read_index ON "%1$sentry" ("id_feed","is_read");', //v1.7 //TODO: Auto add this index to existing version
'INSERT INTO "%1$scategory" (name) SELECT \'%2$s\' WHERE NOT EXISTS (SELECT id FROM "%1$scategory" WHERE id = 1);',
);
diff --git a/app/SQL/install.sql.sqlite.php b/app/SQL/install.sql.sqlite.php
index ad7d525fd..dcb7a351a 100644
--- a/app/SQL/install.sql.sqlite.php
+++ b/app/SQL/install.sql.sqlite.php
@@ -53,6 +53,7 @@ $SQL_CREATE_TABLES = array(
'CREATE INDEX IF NOT EXISTS entry_is_favorite_index ON `entry`(`is_favorite`);',
'CREATE INDEX IF NOT EXISTS entry_is_read_index ON `entry`(`is_read`);',
'CREATE INDEX IF NOT EXISTS entry_lastSeen_index ON `entry`(`lastSeen`);', //v1.1.1
+'CREATE INDEX IF NOT EXISTS entry_feed_read_index ON `entry`(`id_feed`,`is_read`);', //v1.7 //TODO: Auto add this index to existing version
'INSERT OR IGNORE INTO `category` (id, name) VALUES(1, "%2$s");',
);