Browse Source

#209: la fonction '''calculer_rubriques''' n'est plus appelée que dans le cas d'une importation, et celle-ci est garantie de s'exécuter en solo (identifiant de session introduit par [9903] et refus des connexions de l'espace privé des non admins pendant une restauration à présent). Grace à ça, le verrou MySQL de '''calculer_rubriques''' disparait. En revanche cette fonction est désormais appelée à la fin de '''admin_repair''' pour rétablir la cohérence en cas de crash ou autre problème.

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.
2.0
Committo,Ergo:sum 16 years ago
parent
commit
e7cd0688cb
  1. 3
      ecrire/base/admin_repair.php
  2. 24
      ecrire/inc/rubriques.php
  3. 10
      ecrire/index.php

3
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";
}

24
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

10
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

Loading…
Cancel
Save