aboutsummaryrefslogtreecommitdiff
path: root/app/controllers
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-11-16 21:03:25 +0100
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-11-16 21:03:25 +0100
commit32306a78d2e53bbbc864f3eabda9a2f1a3dd2322 (patch)
tree8d3ee43aa98981ebeada93d31930c1b91fae9395 /app/controllers
parent770ea63258d9cb138e86d7545b2bccc046666f95 (diff)
SQL : grosse mise à jour avec mise en cache du nombre d'articles lus/non-lus
* Mise en cache du nombre d'articles lus et non-lus par flux, via `f.cache_nbEntries, f.cache_nbUnreads` pour de biens meilleures performances * Implémente https://github.com/marienfressinaud/FreshRSS/issues/268 * Révision de la plupart des requêtes de modification en conséquence * En cas d'affichage `not_read`, évite de faire une requête si on sait déjà qu'il n'y a pas d'article non lu et fait directement un affichage `all`. * Appelle `cleanOldEntries` seulement une fois de temps en temps aléatoirement (1 fois sur 30 actuellement) pour économiser les ressources, et avant les insertions pour plus de robustesse. * Utilisation des transactions lors de mises à jour multiples et liées * Lors de requêtes de modifications, retourne le nombre de lignes impactées plutôt qu'un booléen en cas de succès * Suppression de code oublié relatif à is_public qui n'est plus utilisé
Diffstat (limited to 'app/controllers')
-rwxr-xr-xapp/controllers/entryController.php14
-rwxr-xr-xapp/controllers/feedController.php22
-rwxr-xr-xapp/controllers/indexController.php27
3 files changed, 50 insertions, 13 deletions
diff --git a/app/controllers/entryController.php b/app/controllers/entryController.php
index 1ba9cc3cd..4d2d92c1b 100755
--- a/app/controllers/entryController.php
+++ b/app/controllers/entryController.php
@@ -43,28 +43,27 @@ class entryController extends ActionController {
$entryDAO = new EntryDAO ();
if ($id == false) {
if (!$get) {
- $entryDAO->markReadEntries ($is_read, $dateMax);
+ $entryDAO->markReadEntries ($dateMax);
} else {
$typeGet = $get[0];
$get = substr ($get, 2);
if ($typeGet == 'c') {
- $entryDAO->markReadCat ($get, $is_read, $dateMax);
+ $entryDAO->markReadCat ($get, $dateMax);
$this->params = array ('get' => $nextGet);
} elseif ($typeGet == 'f') {
- $entryDAO->markReadFeed ($get, $is_read, $dateMax);
+ $entryDAO->markReadFeed ($get, $dateMax);
$this->params = array ('get' => $nextGet);
}
}
- // notif
$notif = array (
'type' => 'good',
'content' => Translate::t ('feeds_marked_read')
);
Session::_param ('notification', $notif);
} else {
- $entryDAO->updateEntry ($id, array ('is_read' => $is_read));
+ $entryDAO->markRead ($id, $is_read);
}
}
@@ -74,10 +73,7 @@ class entryController extends ActionController {
$id = Request::param ('id');
if ($id) {
$entryDAO = new EntryDAO ();
- $values = array (
- 'is_favorite' => (bool)(Request::param ('is_favorite')),
- );
- $entryDAO->updateEntry ($id, $values);
+ $entryDAO->markFavorite ($id, Request::param ('is_favorite'));
}
}
diff --git a/app/controllers/feedController.php b/app/controllers/feedController.php
index 76fca8828..0ba82631c 100755
--- a/app/controllers/feedController.php
+++ b/app/controllers/feedController.php
@@ -33,6 +33,7 @@ class feedController extends ActionController {
$pass = Request::param ('password');
$params = array ();
+ $transactionStarted = false;
try {
$feed = new Feed ($url);
$feed->_category ($cat);
@@ -79,6 +80,8 @@ class feedController extends ActionController {
$nb_month_old = $this->view->conf->oldEntries ();
$date_min = time () - (60 * 60 * 24 * 30 * $nb_month_old);
+ $transactionStarted = true;
+ $feedDAO->beginTransaction ();
// on ajoute les articles en masse sans vérification
foreach ($entries as $entry) {
if ($entry->date (true) >= $date_min ||
@@ -87,6 +90,9 @@ class feedController extends ActionController {
$entryDAO->addEntry ($values);
}
}
+ $feedDAO->updateLastUpdate ($feed->id ());
+ $feedDAO->commit ();
+ $transactionStarted = false;
// ok, ajout terminé
$notif = array (
@@ -121,6 +127,9 @@ class feedController extends ActionController {
);
Session::_param ('notification', $notif);
}
+ if ($transactionStarted) {
+ $feedDAO->rollBack ();
+ }
Request::forward (array ('c' => 'configure', 'a' => 'feed', 'params' => $params), true);
}
@@ -149,6 +158,13 @@ class feedController extends ActionController {
// on calcule la date des articles les plus anciens qu'on accepte
$nb_month_old = $this->view->conf->oldEntries ();
$date_min = time () - (60 * 60 * 24 * 30 * $nb_month_old);
+ if (rand(0, 30) === 1) {
+ Minz_Log::record ('CleanOldEntries', Minz_Log::NOTICE); //TODO: Remove
+ if ($entryDAO->cleanOldEntries ($date_min) > 0) {
+ Minz_Log::record ('UpdateCachedValues', Minz_Log::NOTICE); //TODO: Remove
+ $feedDAO->updateCachedValues ();
+ }
+ }
$i = 0;
$flux_update = 0;
@@ -165,6 +181,7 @@ class feedController extends ActionController {
// car demanderait plus de ressources
// La BDD refusera l'ajout de son côté car l'id doit être
// unique
+ $feedDAO->beginTransaction ();
foreach ($entries as $entry) {
if ((!isset ($existingIds[$entry->id ()])) &&
($entry->date (true) >= $date_min ||
@@ -176,10 +193,11 @@ class feedController extends ActionController {
// on indique que le flux vient d'être mis à jour en BDD
$feedDAO->updateLastUpdate ($feed->id ());
+ $feedDAO->commit ();
$flux_update++;
} catch (FeedException $e) {
Minz_Log::record ($e->getMessage (), Minz_Log::ERROR);
- $feedDAO->isInError ($feed->id ());
+ $feedDAO->updateLastUpdate ($feed->id (), 1);
}
// On arrête à 10 flux pour ne pas surcharger le serveur
@@ -190,8 +208,6 @@ class feedController extends ActionController {
}
}
- $entryDAO->cleanOldEntries ($nb_month_old);
-
$url = array ();
if ($flux_update === 1) {
// on a mis un seul flux à jour
diff --git a/app/controllers/indexController.php b/app/controllers/indexController.php
index 7b5dbd264..10c29bc7b 100755
--- a/app/controllers/indexController.php
+++ b/app/controllers/indexController.php
@@ -90,6 +90,30 @@ class indexController extends ActionController {
$nb = Request::param ('nb', $this->view->conf->postsPerPage ());
$first = Request::param ('next', '');
+ if ($state === 'not_read') { //Any unread article in this category at all?
+ switch ($type['type']) {
+ case 'all':
+ $hasUnread = $this->view->nb_not_read > 0;
+ break;
+ case 'favoris':
+ $hasUnread = $this->view->nb_favorites['unread'] > 0;
+ break;
+ case 'c':
+ $hasUnread = (!isset($this->view->cat_aside[$type['id']])) || ($this->view->cat_aside[$type['id']]->nbNotRead() > 0);
+ break;
+ case 'f':
+ $myFeed = HelperCategory::findFeed($this->view->cat_aside, $type['id']);
+ $hasUnread = ($myFeed === null) || ($myFeed->nbNotRead() > 0);
+ break;
+ default:
+ $hasUnread = true;
+ break;
+ }
+ if (!$hasUnread) {
+ $this->view->state = $state = 'all';
+ }
+ }
+
try {
// EntriesGetter permet de déporter la complexité du filtrage
$getter = new EntriesGetter ($type, $state, $filter, $order, $nb, $first);
@@ -98,7 +122,8 @@ class indexController extends ActionController {
// Si on a récupéré aucun article "non lus"
// on essaye de récupérer tous les articles
- if ($state == 'not_read' && $entries->isEmpty ()) {
+ if ($state === 'not_read' && $entries->isEmpty ()) { //TODO: Remove in v0.8
+ Minz_Log::record ('Conflicting information about nbNotRead!', Minz_Log::NOTICE); //TODO: Consider adding a Minz_Log::DEBUG level
$this->view->state = 'all';
$getter->_state ('all');
$getter->execute ();