From e7cd0688cb7eaff3be7dfe68fbfda88d79fe5af4 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Mon, 20 Aug 2007 06:41:19 +0000
Subject: [PATCH] =?UTF-8?q?#209:=20la=20fonction=20'''calculer=5Frubriques?=
 =?UTF-8?q?'''=20n'est=20plus=20appel=C3=A9e=20que=20dans=20le=20cas=20d'u?=
 =?UTF-8?q?ne=20importation,=20et=20celle-ci=20est=20garantie=20de=20s'ex?=
 =?UTF-8?q?=C3=A9cuter=20en=20solo=20(identifiant=20de=20session=20introdu?=
 =?UTF-8?q?it=20par=20[9903]=20et=20refus=20des=20connexions=20de=20l'espa?=
 =?UTF-8?q?ce=20priv=C3=A9=20des=20non=20admins=20pendant=20une=20restaura?=
 =?UTF-8?q?tion=20=C3=A0=20pr=C3=A9sent).=20Grace=20=C3=A0=20=C3=A7a,=20le?=
 =?UTF-8?q?=20verrou=20MySQL=20de=20'''calculer=5Frubriques'''=20disparait?=
 =?UTF-8?q?.=20En=20revanche=20cette=20fonction=20est=20d=C3=A9sormais=20a?=
 =?UTF-8?q?ppel=C3=A9e=20=C3=A0=20la=20fin=20de=20'''admin=5Frepair'''=20p?=
 =?UTF-8?q?our=20r=C3=A9tablir=20la=20coh=C3=A9rence=20en=20cas=20de=20cra?=
 =?UTF-8?q?sh=20ou=20autre=20probl=C3=A8me.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Pour les plugins qui appellent cette fonction, il faut soit l'encapsuler par
'''spip_get_lock''' et '''spip_release_lock''' (mais ça ne marchera que dans
la version MySQL l'absence de transactionnel reste un problème), soit appeler les fonctions spécfiques à la situation: '''calculer_rubriques_if''', '''publier_branche_rubrique''' ou '''depublier_branche_rubrique_if'''. Lire leur description dans le fichier source:spip/ecrire/inc/rubriques.php.
---
 ecrire/base/admin_repair.php |  3 +++
 ecrire/inc/rubriques.php     | 24 ++++++++++++------------
 ecrire/index.php             | 10 +++++-----
 3 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/ecrire/base/admin_repair.php b/ecrire/base/admin_repair.php
index 10497da29e..0cf4b1c5fb 100644
--- a/ecrire/base/admin_repair.php
+++ b/ecrire/base/admin_repair.php
@@ -45,6 +45,9 @@ function base_admin_repair_dist() {
 	  }
 	}
 
+	include_spip('inc/rubriques');
+	calculer_rubriques();
+
 	if (!$res) {
 		$res = "<br /><br /><span style='color: red; font-weight: bold;'><tt>"._T('avis_erreur_mysql').' '.sql_errno().': '.sql_error() ."</tt></span><br /><br /><br />\n";
 	}
diff --git a/ecrire/inc/rubriques.php b/ecrire/inc/rubriques.php
index 24a60d0136..8a36d3c6a5 100644
--- a/ecrire/inc/rubriques.php
+++ b/ecrire/inc/rubriques.php
@@ -15,17 +15,19 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 include_spip('inc/meta');
 
 // Fonction a appeler lorsque le statut d'un objet change dans une rubrique
+// ou que la rubrique est déplacee.
+// Le 2e arg est un tableau ayant un index "statut" (indiquant le nouveau)
+// et eventuellement un index "id_rubrique" (indiquant le deplacement)
 
-// Si l'objet passe a "publie"
-// consequence sur ses parentes et les langues
-// Idem s'il est depublie'
-// s'il est deplace' alors qu'il etait publieé, double consequence.
-// (a refaire a terme par une Cascade SQL)
+// Si le statut passe a "publie", la rubrique et ses parents y passent aussi
+// et les langues utilisées sont recalculées. 
+// Conséquences symétriques s'il est depublie'.
+// S'il est deplace' alors qu'il etait publieé, double consequence.
+// Tout cela devrait passer en SQL, sous forme de Cascade SQL.
 
 // http://doc.spip.org/@calculer_rubriques_if
 function calculer_rubriques_if ($id_rubrique, $modifs, $statut_ancien='')
 {
-
 	$neuf = false;
 	if ($statut_ancien == 'publie') {
 		if (isset($modifs['statut']) OR isset($modifs['id_rubrique']))
@@ -102,12 +104,12 @@ function depublier_branche_rubrique_if($id_rubrique)
 }
 
 //
-// Fonction appelee lorsqu'on (de)publie dans une rubrique.
-// Restreindre ses appels le plus possible
-//
+// Fonction appelee apres importation:
+// calculer les meta-donnes resultantes,
+// remettre de la cohérence au cas où la base importee en manquait
+// Cette fonction doit etre invoque sans processus concurrent potentiel.
 // http://doc.spip.org/@calculer_rubriques
 function calculer_rubriques() {
-	if (!spip_get_lock($t="calcul_rubriques")) return;
 
 	calculer_rubriques_publiees();
 
@@ -121,8 +123,6 @@ function calculer_rubriques() {
 
 	// on calcule la date du prochain article post-date
 	calculer_prochain_postdate(); // fera le ecrire_metas();
-
-	spip_release_lock($t);
 }
 
 // Recalcule l'ensemble des donnees associees a l'arborescence des rubriques
diff --git a/ecrire/index.php b/ecrire/index.php
index e3d52fee4c..d3c6ce3fb5 100644
--- a/ecrire/index.php
+++ b/ecrire/index.php
@@ -129,11 +129,11 @@ AND ($GLOBALS['spip_version'] != (str_replace(',','.',$GLOBALS['meta']['version_
 	$exec = 'demande_mise_a_jour';
 
 // Si interruption d'une longue restauration
-// detourner le script demande pour qu'il reprenne le boulot
-// mais virer les Ajax pour eviter plusieurs restaurations en parallele
-elseif (isset($_COOKIE['spip_admin'])
-AND isset($GLOBALS['meta']["import_all"])) {
-	if (isset($var_ajaxcharset)) exit;
+// detourner le script demande pour qu'il reprenne le boulot, et
+// refuser Ajax et non-admin pour eviter des restaurations paralleles
+elseif (isset($GLOBALS['meta']["import_all"])) {
+	if (isset($var_ajaxcharset) OR !isset($_COOKIE['spip_admin']))
+		die('Importation en cours, revenez plus tard.');
 	$exec = 'import_all';
 }
 // si nom pas plausible, prendre le script par defaut
-- 
GitLab