[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / maj / svn10000.php
index b458dc2..b09918e 100644 (file)
@@ -3,18 +3,25 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2016                                                *
+ *  Copyright (c) 2001-2017                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-if (!defined('_ECRIRE_INC_VERSION')) return;
+/**
+ * Gestion des mises à jour de SPIP, version >= 10000
+ *
+ * Gestion des mises à jour du cœur de SPIP par un tableau global `maj`
+ * indexé par le numero SVN du changement
+ *
+ * @package SPIP\Core\SQL\Upgrade
+ **/
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
-/*--------------------------------------------------------------------- */
-/*     Gestion des MAJ par tableau indexe par le numero SVN du chgt    */
-/*--------------------------------------------------------------------- */
 
 // Type cls et sty pour LaTeX
 $GLOBALS['maj'][10990] = array(array('upgrade_types_documents'));
@@ -32,39 +39,54 @@ $GLOBALS['maj'][11171] = array(
        array('spip_query', "UPDATE spip_types_documents SET upload='oui' WHERE upload IS NULL OR upload!='non'")
 );
 
+/**
+ * Mise à jour 11268 : renommer spip_recherches la mal nommée en spip_resultats
+ **/
 function maj_11268() {
        global $tables_auxiliaires;
        include_spip('base/auxiliaires');
-       $v = $tables_auxiliaires[$k='spip_resultats'];
+       $v = $tables_auxiliaires[$k = 'spip_resultats'];
        sql_create($k, $v['field'], $v['key'], false, false);
 }
-$GLOBALS['maj'][11268] = array(array('maj_11268'));
 
+$GLOBALS['maj'][11268] = array(array('maj_11268'));
 
-function maj_11276 () {
+/**
+ * Mise à jour 11276 : réparer les éventuelles tables spip_documents
+ * en se fondant sur l'extension de la colonne fichier
+ *
+ * @uses maj_1_938()
+ **/
+function maj_11276() {
        include_spip('maj/v019');
        maj_1_938();
 }
+
 $GLOBALS['maj'][11276] = array(array('maj_11276'));
 
-// reparer les referers d'article, qui sont vides depuis [10572]
-function maj_11388 () {
+/**
+ * Mise à jour 11388 : réparer les referers d'article, qui sont vides depuis r10572
+ */
+function maj_11388() {
        $s = sql_select('referer_md5', 'spip_referers_articles', "referer='' OR referer IS NULL");
        while ($t = sql_fetch($s)) {
-               $k = sql_fetsel('referer', 'spip_referers', 'referer_md5='.sql_quote($t['referer_md5']));
+               $k = sql_fetsel('referer', 'spip_referers', 'referer_md5=' . sql_quote($t['referer_md5']));
                if ($k['referer']) {
                        spip_query('UPDATE spip_referers_articles
-                       SET referer='.sql_quote($k['referer']).'
-                       WHERE referer_md5='.sql_quote($t['referer_md5'])
-                       ." AND (referer='' OR referer IS NULL)"
+                       SET referer=' . sql_quote($k['referer']) . '
+                       WHERE referer_md5=' . sql_quote($t['referer_md5'])
+                               . " AND (referer='' OR referer IS NULL)"
                        );
                }
        }
 }
+
 $GLOBALS['maj'][11388] = array(array('maj_11388'));
 
-// reparer spip_mots.type = titre du groupe
-function maj_11431 () {
+/**
+ * Mise à jour 11431 : réparer spip_mots.type = titre du groupe
+ */
+function maj_11431() {
        // mysql only
        // spip_query("UPDATE spip_mots AS a LEFT JOIN spip_groupes_mots AS b ON (a.id_groupe = b.id_groupe) SET a.type=b.titre");
 
@@ -74,17 +96,19 @@ function maj_11431 () {
                array("spip_mots AS a LEFT JOIN spip_groupes_mots AS b ON (a.id_groupe = b.id_groupe)"),
                array("a.type != b.titre"));
        // mise a jour de ces mots la
-       if ($res){
-               while ($r = sql_fetch($res)){
-                       sql_updateq('spip_mots', array('type'=>$r['type']), 'id_mot='.sql_quote($r['id_mot']));
+       if ($res) {
+               while ($r = sql_fetch($res)) {
+                       sql_updateq('spip_mots', array('type' => $r['type']), 'id_mot=' . sql_quote($r['id_mot']));
                }
        }
 }
+
 $GLOBALS['maj'][11431] = array(array('maj_11431'));
 
-// reparer spip_types_documents.id_type
-// qui est parfois encore present
-function maj_11778 () {
+/**
+ * Mise à jour 11778 : réparer spip_types_documents.id_type qui est parfois encore présent
+ */
+function maj_11778() {
        // si presence id_type
        $s = sql_showtable('spip_types_documents');
        if (isset($s['field']['id_type'])) {
@@ -93,10 +117,13 @@ function maj_11778 () {
                sql_alter('TABLE spip_types_documents ADD PRIMARY KEY (extension)');
        }
 }
+
 $GLOBALS['maj'][11778] = array(array('maj_11778'));
 
-// Optimisation des forums
-function maj_11790 () {
+/**
+ * Mise à jour 11790 : Optimisation des forums
+ */
+function maj_11790() {
 #      sql_alter('TABLE spip_forum DROP INDEX id_message id_message');
        sql_alter('TABLE spip_forum ADD INDEX id_parent (id_parent)');
        sql_alter('TABLE spip_forum ADD INDEX id_auteur (id_auteur)');
@@ -108,32 +135,47 @@ $GLOBALS['maj'][11790] = array(array('maj_11790'));
 $GLOBALS['maj'][11794] = array(); // ajout de spip_documents_forum
 
 
-
 $GLOBALS['maj'][11961] = array(
-array('sql_alter',"TABLE spip_groupes_mots CHANGE `tables` tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"), // si tables a ete cree on le renomme
-array('sql_alter',"TABLE spip_groupes_mots ADD tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"), // sinon on l'ajoute
-array('sql_update','spip_groupes_mots',array('tables_liees'=>"''"),"articles REGEXP '.*'"), // si le champ articles est encore la, on reinit la conversion
-array('sql_update','spip_groupes_mots',array('tables_liees'=>"concat(tables_liees,'articles,')"),"articles='oui'"), // sinon ces 4 requetes ne feront rien
-array('sql_update','spip_groupes_mots',array('tables_liees'=>"concat(tables_liees,'breves,')"),"breves='oui'"),
-array('sql_update','spip_groupes_mots',array('tables_liees'=>"concat(tables_liees,'rubriques,')"),"rubriques='oui'"),
-array('sql_update','spip_groupes_mots',array('tables_liees'=>"concat(tables_liees,'syndic,')"),"syndic='oui'"),
+       array('sql_alter', "TABLE spip_groupes_mots CHANGE `tables` tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"),
+       // si tables a ete cree on le renomme
+       array('sql_alter', "TABLE spip_groupes_mots ADD tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"),
+       // sinon on l'ajoute
+       array('sql_update', 'spip_groupes_mots', array('tables_liees' => "''"), "articles REGEXP '.*'"),
+       // si le champ articles est encore la, on reinit la conversion
+       array(
+               'sql_update',
+               'spip_groupes_mots',
+               array('tables_liees' => "concat(tables_liees,'articles,')"),
+               "articles='oui'"
+       ),
+       // sinon ces 4 requetes ne feront rien
+       array('sql_update', 'spip_groupes_mots', array('tables_liees' => "concat(tables_liees,'breves,')"), "breves='oui'"),
+       array(
+               'sql_update',
+               'spip_groupes_mots',
+               array('tables_liees' => "concat(tables_liees,'rubriques,')"),
+               "rubriques='oui'"
+       ),
+       array('sql_update', 'spip_groupes_mots', array('tables_liees' => "concat(tables_liees,'syndic,')"), "syndic='oui'"),
 );
 
 
-
-// Reunir en une seule table les liens de documents
-//  spip_documents_articles et spip_documents_forum
-function maj_12008 () {
+/**
+ * Mise à jour 12008 : Réunir en une seule table les liens de documents
+ * spip_documents_articles et spip_documents_forum
+ */
+function maj_12008() {
        // Creer spip_documents_liens
        global $tables_auxiliaires;
        include_spip('base/auxiliaires');
-       $v = $tables_auxiliaires[$k='spip_documents_liens'];
+       $v = $tables_auxiliaires[$k = 'spip_documents_liens'];
        sql_create($k, $v['field'], $v['key'], false, false);
 
        // Recopier les donnees
        foreach (array('article', 'breve', 'rubrique', 'auteur', 'forum') as $l) {
-               if ($s = sql_select('*', 'spip_documents_'.$l.'s')
-               OR $s = sql_select('*', 'spip_documents_'.$l)) {
+               if ($s = sql_select('*', 'spip_documents_' . $l . 's')
+                       or $s = sql_select('*', 'spip_documents_' . $l)
+               ) {
                        $tampon = array();
                        while ($t = sql_fetch($s)) {
                                // transformer id_xx=N en (id_objet=N, objet=xx)
@@ -142,8 +184,8 @@ function maj_12008 () {
                                unset($t["id_$l"]);
                                unset($t['maj']);
                                $tampon[] = $t;
-                               if (count($tampon)>10000) {
-                                       sql_insertq_multi('spip_documents_liens',$tampon);
+                               if (count($tampon) > 10000) {
+                                       sql_insertq_multi('spip_documents_liens', $tampon);
                                        $tampon = array();
                                }
                        }
@@ -156,42 +198,70 @@ function maj_12008 () {
 
 $GLOBALS['maj'][12008] = array(
 //array('sql_drop_table',"spip_documents_liens"), // tant pis pour ceux qui ont joue a 11974
-array('sql_alter',"TABLE spip_documents_liens DROP PRIMARY KEY"),
-array('sql_alter',"TABLE spip_documents_liens ADD id_objet bigint(21) DEFAULT '0' NOT NULL AFTER id_document"),
-array('sql_alter',"TABLE spip_documents_liens ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"),
-array('sql_update','spip_documents_liens',array('id_objet'=>"id_article",'objet'=>"'article'"),"id_article IS NOT NULL AND id_article>0"),
-array('sql_update','spip_documents_liens',array('id_objet'=>"id_rubrique",'objet'=>"'rubrique'"),"id_rubrique IS NOT NULL AND id_rubrique>0"),
-array('sql_update','spip_documents_liens',array('id_objet'=>"id_breve",'objet'=>"'breve'"),"id_breve IS NOT NULL AND id_breve>0"),
-array('sql_update','spip_documents_liens',array('id_objet'=>"id_auteur",'objet'=>"'auteur'"),"id_auteur IS NOT NULL AND id_auteur>0"),
-array('sql_update','spip_documents_liens',array('id_objet'=>"id_forum",'objet'=>"'forum'"),"id_forum IS NOT NULL AND id_forum>0"),
-array('sql_alter',"TABLE spip_documents_liens ADD PRIMARY KEY  (id_document,id_objet,objet)"),
-array('sql_alter',"TABLE spip_documents_liens DROP id_article"),
-array('sql_alter',"TABLE spip_documents_liens DROP id_rubrique"),
-array('sql_alter',"TABLE spip_documents_liens DROP id_breve"),
-array('sql_alter',"TABLE spip_documents_liens DROP id_auteur"),
-array('sql_alter',"TABLE spip_documents_liens DROP id_forum"),
-array('maj_12008'),
+       array('sql_alter', "TABLE spip_documents_liens DROP PRIMARY KEY"),
+       array('sql_alter', "TABLE spip_documents_liens ADD id_objet bigint(21) DEFAULT '0' NOT NULL AFTER id_document"),
+       array('sql_alter', "TABLE spip_documents_liens ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"),
+       array(
+               'sql_update',
+               'spip_documents_liens',
+               array('id_objet' => "id_article", 'objet' => "'article'"),
+               "id_article IS NOT NULL AND id_article>0"
+       ),
+       array(
+               'sql_update',
+               'spip_documents_liens',
+               array('id_objet' => "id_rubrique", 'objet' => "'rubrique'"),
+               "id_rubrique IS NOT NULL AND id_rubrique>0"
+       ),
+       array(
+               'sql_update',
+               'spip_documents_liens',
+               array('id_objet' => "id_breve", 'objet' => "'breve'"),
+               "id_breve IS NOT NULL AND id_breve>0"
+       ),
+       array(
+               'sql_update',
+               'spip_documents_liens',
+               array('id_objet' => "id_auteur", 'objet' => "'auteur'"),
+               "id_auteur IS NOT NULL AND id_auteur>0"
+       ),
+       array(
+               'sql_update',
+               'spip_documents_liens',
+               array('id_objet' => "id_forum", 'objet' => "'forum'"),
+               "id_forum IS NOT NULL AND id_forum>0"
+       ),
+       array('sql_alter', "TABLE spip_documents_liens ADD PRIMARY KEY  (id_document,id_objet,objet)"),
+       array('sql_alter', "TABLE spip_documents_liens DROP id_article"),
+       array('sql_alter', "TABLE spip_documents_liens DROP id_rubrique"),
+       array('sql_alter', "TABLE spip_documents_liens DROP id_breve"),
+       array('sql_alter', "TABLE spip_documents_liens DROP id_auteur"),
+       array('sql_alter', "TABLE spip_documents_liens DROP id_forum"),
+       array('maj_12008'),
 );
 
 
 // destruction des tables spip_documents_articles etc, cf. 12008
 $GLOBALS['maj'][12009] = array(
-array('sql_drop_table',"spip_documents_articles"),
-array('sql_drop_table',"spip_documents_breves"),
-array('sql_drop_table',"spip_documents_rubriques"),
-array('sql_drop_table',"spip_documents_auteurs"), # plugin #FORMULAIRE_UPLOAD
-array('sql_drop_table',"spip_documents_syndic") # plugin podcast_client
+       array('sql_drop_table', "spip_documents_articles"),
+       array('sql_drop_table', "spip_documents_breves"),
+       array('sql_drop_table', "spip_documents_rubriques"),
+       array('sql_drop_table', "spip_documents_auteurs"), # plugin #FORMULAIRE_UPLOAD
+       array('sql_drop_table', "spip_documents_syndic") # plugin podcast_client
 );
 
 // destruction des champs articles breves rubriques et syndic, cf. 11961
 $GLOBALS['maj'][12010] = array(
-array('sql_alter',"TABLE spip_groupes_mots DROP articles"),
-array('sql_alter',"TABLE spip_groupes_mots DROP breves"),
-array('sql_alter',"TABLE spip_groupes_mots DROP rubriques"),
-array('sql_alter',"TABLE spip_groupes_mots DROP syndic"),
+       array('sql_alter', "TABLE spip_groupes_mots DROP articles"),
+       array('sql_alter', "TABLE spip_groupes_mots DROP breves"),
+       array('sql_alter', "TABLE spip_groupes_mots DROP rubriques"),
+       array('sql_alter', "TABLE spip_groupes_mots DROP syndic"),
 );
 
-function maj_13135 () {
+/**
+ * Mise à jour 13135 : réparer le calcul des rubriques ayant des articles postdatés
+ */
+function maj_13135() {
        include_spip('inc/rubriques');
        calculer_prochain_postdate();
 
@@ -208,20 +278,25 @@ $GLOBALS['maj'][13333] = array(array('upgrade_types_documents'));
 // http://archives.rezo.net/spip-zone.mbox/200903.mbox/%3Cbfc33ad70903141606q2e4c53f2k4fef6b45e611a04f@mail.gmail.com%3E
 
 $GLOBALS['maj'][13833] = array(
-array('sql_alter',"TABLE spip_documents_liens ADD INDEX objet(id_objet,objet)"))
-;
+       array('sql_alter', "TABLE spip_documents_liens ADD INDEX objet(id_objet,objet)")
+);
 
 // Fin upgrade commun branche 2.0
 
 $GLOBALS['maj'][13904] = array(
-array('sql_alter',"TABLE spip_auteurs ADD webmestre varchar(3)  DEFAULT 'non' NOT NULL"),
-array('sql_update','spip_auteurs',array('webmestre'=>"'oui'"),sql_in("id_auteur",defined('_ID_WEBMESTRES')?explode(':',_ID_WEBMESTRES):(autoriser('configurer')?array($GLOBALS['visiteur_session']['id_auteur']):array(0)))) // le webmestre est celui qui fait l'upgrade si rien de defini
-)
-;
+       array('sql_alter', "TABLE spip_auteurs ADD webmestre varchar(3)  DEFAULT 'non' NOT NULL"),
+       array(
+               'sql_update',
+               'spip_auteurs',
+               array('webmestre' => "'oui'"),
+               sql_in("id_auteur", defined('_ID_WEBMESTRES') ? explode(':',
+                       _ID_WEBMESTRES) : (autoriser('configurer') ? array($GLOBALS['visiteur_session']['id_auteur']) : array(0)))
+       ) // le webmestre est celui qui fait l'upgrade si rien de defini
+);
 
 // sites plantes en mode "'su" au lieu de "sus"
 $GLOBALS['maj'][13929] = array(
-       array('sql_update',"spip_syndic",array('syndication'=>"'sus'"),"syndication LIKE '\\'%'")
+       array('sql_update', "spip_syndic", array('syndication' => "'sus'"), "syndication LIKE '\\'%'")
 );
 
 // Types de fichiers m4a/m4b/m4p/m4u/m4v/dv
@@ -230,7 +305,7 @@ $GLOBALS['maj'][14558] = array(array('upgrade_types_documents'));
 
 // refaire les upgrade dont les numeros sont inferieurs a ceux de la branche 2.0
 // etre sur qu'ils sont bien unipotents(?)...
-$GLOBALS['maj'][14559] = $GLOBALS['maj'][13904]+$GLOBALS['maj'][13929]+$GLOBALS['maj'][14558];
+$GLOBALS['maj'][14559] = $GLOBALS['maj'][13904] + $GLOBALS['maj'][13929] + $GLOBALS['maj'][14558];
 
 // La version 14588 etait une mauvaise piste:
 // Retour en arriere pour ceux qui l'ont subi, ne rien faire sinon
@@ -238,16 +313,22 @@ if (@$GLOBALS['meta']['version_installee'] >= 14588) {
 
        // "mode" est un mot-cle d'Oracle
        $GLOBALS['maj'][14588] = array(
-       array('sql_alter',"TABLE spip_documents  DROP INDEX mode"),
-       array('sql_alter',"TABLE spip_documents  CHANGE mode genre ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"),
-       array('sql_alter',"TABLE spip_documents  ADD INDEX genre(genre)")
-                              );
+               array('sql_alter', "TABLE spip_documents  DROP INDEX mode"),
+               array(
+                       'sql_alter',
+                       "TABLE spip_documents  CHANGE mode genre ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"
+               ),
+               array('sql_alter', "TABLE spip_documents  ADD INDEX genre(genre)")
+       );
        // solution moins intrusive au pb de mot-cle d'Oracle, retour avant 14588
        $GLOBALS['maj'][14598] = array(
-       array('sql_alter',"TABLE spip_documents  DROP INDEX genre"),
-       array('sql_alter',"TABLE spip_documents  CHANGE genre mode ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"),
-       array('sql_alter',"TABLE spip_documents  ADD INDEX mode(mode)")
-                              );
+               array('sql_alter', "TABLE spip_documents  DROP INDEX genre"),
+               array(
+                       'sql_alter',
+                       "TABLE spip_documents  CHANGE genre mode ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"
+               ),
+               array('sql_alter', "TABLE spip_documents  ADD INDEX mode(mode)")
+       );
 }
 
 // Restauration correcte des types mime des fichiers Ogg
@@ -260,215 +341,289 @@ $GLOBALS['maj'][15676] = array(array('upgrade_types_documents'));
 $GLOBALS['maj'][15827] = array(array('upgrade_types_documents'));
 
 $GLOBALS['maj'][16428] = array(
-       array('maj_liens','auteur'), // creer la table liens
-       array('maj_liens','auteur','article'),
-       array('sql_drop_table',"spip_auteurs_articles"),
-       array('maj_liens','auteur','rubrique'),
-       array('sql_drop_table',"spip_auteurs_rubriques"),
-       array('maj_liens','auteur','message'),
-       array('sql_drop_table',"spip_auteurs_messages"),
+       array('maj_liens', 'auteur'), // creer la table liens
+       array('maj_liens', 'auteur', 'article'),
+       array('sql_drop_table', "spip_auteurs_articles"),
+       array('maj_liens', 'auteur', 'rubrique'),
+       array('sql_drop_table', "spip_auteurs_rubriques"),
+       array('maj_liens', 'auteur', 'message'),
+       array('sql_drop_table', "spip_auteurs_messages"),
 );
 
-// Reunir en une seule table les liens de documents
-//  spip_documents_articles et spip_documents_forum
-function maj_liens($pivot,$l='') {
-
-       @define('_LOG_FILTRE_GRAVITE',8);
-
-       $exceptions_pluriel = array('forum'=>'forum','syndic'=>'syndic');
-
-       $pivot = preg_replace(',[^\w],','',$pivot); // securite
-       $pivots = (isset($exceptions_pluriel[$pivot])?$exceptions_pluriel[$pivot]:$pivot."s");
-       $liens = "spip_".$pivots."_liens";
-       $id_pivot = "id_".$pivot;
+/**
+ * Mise à jour des tables de liens
+ *
+ * Crée la table de lien au nouveau format (spip_xx_liens) ou insère
+ * les données d'ancien format dans la nouveau format.
+ *
+ * Par exemple pour réunir en une seule table les liens de documents,
+ * spip_documents_articles et spip_documents_forum
+ *
+ * Supprime la table au vieux format une fois les données transférées.
+ *
+ * @uses creer_ou_upgrader_table()
+ * @uses maj_liens_insertq_multi_check()
+ *
+ * @param string $pivot
+ *     Nom de la table pivot, tel que `auteur`
+ * @param string $l
+ *     Vide : crée la table de lien pivot.
+ *     Sinon, nom de la table à lier, tel que `article`, et dans ce cas là,
+ *     remplit spip_auteurs_liens à partir de spip_auteurs_articles.
+ */
+function maj_liens($pivot, $l = '') {
+
+       @define('_LOG_FILTRE_GRAVITE', 8);
+
+       $exceptions_pluriel = array('forum' => 'forum', 'syndic' => 'syndic');
+
+       $pivot = preg_replace(',[^\w],', '', $pivot); // securite
+       $pivots = (isset($exceptions_pluriel[$pivot]) ? $exceptions_pluriel[$pivot] : $pivot . "s");
+       $liens = "spip_" . $pivots . "_liens";
+       $id_pivot = "id_" . $pivot;
        // Creer spip_auteurs_liens
        global $tables_auxiliaires;
        if (!$l) {
                include_spip('base/auxiliaires');
                include_spip('base/create');
                creer_ou_upgrader_table($liens, $tables_auxiliaires[$liens], false);
-       }
-       else {
+       } else {
                // Preparer
-               $l = preg_replace(',[^\w],','',$l); // securite
+               $l = preg_replace(',[^\w],', '', $l); // securite
                $primary = "id_$l";
-               $objet = ($l=='syndic'?'site':$l);
-               $ls = (isset($exceptions_pluriel[$l])?$exceptions_pluriel[$l]:$l."s");
-               $ancienne_table = 'spip_'.$pivots.'_'.$ls;
+               $objet = ($l == 'syndic' ? 'site' : $l);
+               $ls = (isset($exceptions_pluriel[$l]) ? $exceptions_pluriel[$l] : $l . "s");
+               $ancienne_table = 'spip_' . $pivots . '_' . $ls;
                $pool = 400;
 
-               $trouver_table = charger_fonction('trouver_table','base');
-               if (!$desc = $trouver_table($ancienne_table))
+               $trouver_table = charger_fonction('trouver_table', 'base');
+               if (!$desc = $trouver_table($ancienne_table)) {
                        return;
+               }
 
                // securite pour ne pas perdre de donnees
-               if (!$trouver_table($liens))
+               if (!$trouver_table($liens)) {
                        return;
+               }
 
                $champs = $desc['field'];
-               if (isset($champs['maj'])) unset($champs['maj']);
-               if (isset($champs[$primary])) unset($champs[$primary]);
+               if (isset($champs['maj'])) {
+                       unset($champs['maj']);
+               }
+               if (isset($champs[$primary])) {
+                       unset($champs[$primary]);
+               }
 
                $champs = array_keys($champs);
                // ne garder que les champs qui existent sur la table destination
-               if ($desc_cible = $trouver_table($liens)){
-                       $champs = array_intersect($champs,array_keys($desc_cible['field']));
+               if ($desc_cible = $trouver_table($liens)) {
+                       $champs = array_intersect($champs, array_keys($desc_cible['field']));
                }
 
                $champs[] = "$primary as id_objet";
                $champs[] = "'$objet' as objet";
-               $champs = implode(', ',$champs);
+               $champs = implode(', ', $champs);
 
                // Recopier les donnees
                $sub_pool = 100;
-               while ($ids = array_map('reset',sql_allfetsel("$primary",$ancienne_table,'','','',"0,$sub_pool"))){
+               while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) {
                        $insert = array();
-                       foreach($ids as $id){
-                               $n = sql_countsel($liens,"objet='$objet' AND id_objet=".intval($id));
-                               while ($t = sql_allfetsel($champs, $ancienne_table,"$primary=".intval($id),'',$id_pivot,"$n,$pool")) {
-                                       $n+=count($t);
+                       foreach ($ids as $id) {
+                               $n = sql_countsel($liens, "objet='$objet' AND id_objet=" . intval($id));
+                               while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . intval($id), '', $id_pivot, "$n,$pool")) {
+                                       $n += count($t);
                                        // empiler en s'assurant a minima de l'unicite
-                                       while ($r = array_shift($t))
-                                               $insert[$r[$id_pivot].':'.$r['id_objet']] = $r;
-                                       if (count($insert)>=$sub_pool){
-                                               maj_liens_insertq_multi_check($liens,$insert,$tables_auxiliaires[$liens]);
+                                       while ($r = array_shift($t)) {
+                                               $insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r;
+                                       }
+                                       if (count($insert) >= $sub_pool) {
+                                               maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
                                                $insert = array();
                                        }
                                        // si timeout, sortir, la relance nous ramenera dans cette fonction
                                        // et on verifiera/repartira de la
-                                       if (time() >= _TIME_OUT) return;
+                                       if (time() >= _TIME_OUT) {
+                                               return;
+                                       }
                                }
-                               if (time() >= _TIME_OUT) return;
+                               if (time() >= _TIME_OUT) {
+                                       return;
+                               }
+                       }
+                       if (count($insert)) {
+                               maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
                        }
-                       if (count($insert))
-                               maj_liens_insertq_multi_check($liens,$insert,$tables_auxiliaires[$liens]);
-                       sql_delete ($ancienne_table, sql_in($primary,$ids));
+                       sql_delete($ancienne_table, sql_in($primary, $ids));
                }
        }
 }
-function maj_liens_insertq_multi_check($table,$couples,$desc=array()){
+
+/**
+ * Insère des données dans une table de liaison de façon un peu sécurisée
+ *
+ * Si une insertion multiple échoue, on réinsère ligne par ligne.
+ *
+ * @param string $table Table de liaison
+ * @param array $couples Tableau de couples de données à insérer
+ * @param array $desc Description de la table de liaison
+ * @return void
+ **/
+function maj_liens_insertq_multi_check($table, $couples, $desc = array()) {
        $n_before = sql_countsel($table);
-       sql_insertq_multi($table,$couples,$desc);
+       sql_insertq_multi($table, $couples, $desc);
        $n_after = sql_countsel($table);
-       if (($n_after-$n_before)==count($couples))
+       if (($n_after - $n_before) == count($couples)) {
                return;
+       }
        // si ecart, on recommence l'insertion ligne par ligne...
        // moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie
-       foreach($couples as $c)
-               sql_insertq($table,$c,$desc);
+       foreach ($couples as $c) {
+               sql_insertq($table, $c, $desc);
+       }
 }
 
 $GLOBALS['maj'][17311] = array(
-       array('ecrire_meta',"multi_objets",implode(',',
-                                array_diff(
-                                        array($GLOBALS['meta']['multi_rubriques']=='oui'?'spip_rubriques':'',$GLOBALS['meta']['multi_articles']=='oui'?'spip_articles':''),
-                                        array('')
-                                ))),
-       array('ecrire_meta',"gerer_trad_objets",implode(',',
-                                array_diff(
-                                        array($GLOBALS['meta']['gerer_trad']=='oui'?'spip_articles':''),
-                                        array('')
-                                ))),
+       array(
+               'ecrire_meta',
+               "multi_objets",
+               implode(',',
+                       array_diff(
+                               array(
+                                       (isset($GLOBALS['meta']['multi_rubriques']) and $GLOBALS['meta']['multi_rubriques'] == 'oui')
+                                               ? 'spip_rubriques' : '',
+                                       (isset($GLOBALS['meta']['multi_articles']) and $GLOBALS['meta']['multi_articles'] == 'oui')
+                                               ? 'spip_articles' : ''
+                               ),
+                               array('')
+                       ))
+       ),
+       array(
+               'ecrire_meta',
+               "gerer_trad_objets",
+               implode(',',
+                       array_diff(
+                               array(
+                                       (isset($GLOBALS['meta']['gerer_trad']) and $GLOBALS['meta']['gerer_trad'] == 'oui')
+                                               ? 'spip_articles' : ''
+                               ),
+                               array('')
+                       ))
+       ),
 );
 $GLOBALS['maj'][17555] = array(
-       array('sql_alter',"TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"),
-       array('sql_alter',"TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"),
+       array('sql_alter', "TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"),
+       array('sql_alter', "TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"),
 );
 
 $GLOBALS['maj'][17563] = array(
-       array('sql_alter',"TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"),
-       array('sql_update','spip_articles',array('virtuel'=>'SUBSTRING(chapo,2)','chapo'=>"''"),"chapo LIKE '=_%'"),
+       array('sql_alter', "TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"),
+       array('sql_update', 'spip_articles', array('virtuel' => 'SUBSTRING(chapo,2)', 'chapo' => "''"), "chapo LIKE '=_%'"),
 );
 
 $GLOBALS['maj'][17577] = array(
-       array('maj_tables',array('spip_jobs','spip_jobs_liens')),
+       array('maj_tables', array('spip_jobs', 'spip_jobs_liens')),
 );
 
 $GLOBALS['maj'][17743] = array(
-       array('sql_update','spip_auteurs',array('prefs'=>'bio','bio'=>"''"),"statut='nouveau' AND bio<>''"),
+       array('sql_update', 'spip_auteurs', array('prefs' => 'bio', 'bio' => "''"), "statut='nouveau' AND bio<>''"),
 );
 
 $GLOBALS['maj'][18219] = array(
-       array('sql_alter',"TABLE spip_rubriques DROP id_import"),
-       array('sql_alter',"TABLE spip_rubriques DROP export"),
+       array('sql_alter', "TABLE spip_rubriques DROP id_import"),
+       array('sql_alter', "TABLE spip_rubriques DROP export"),
 );
 
 $GLOBALS['maj'][18310] = array(
-       array('sql_alter',"TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"),
+       array('sql_alter', "TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"),
 );
 
 $GLOBALS['maj'][18597] = array(
-       array('sql_alter',"TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"),
+       array('sql_alter', "TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"),
        array('maj_propager_les_secteurs'),
 );
 
 $GLOBALS['maj'][18955] = array(
-       array('sql_alter',"TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)"),
-       array('sql_alter',"TABLE spip_auteurs_liens ADD INDEX objet (objet)"),
+       array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)"),
+       array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX objet (objet)"),
 );
 
-
-function maj_propager_les_secteurs(){
+/**
+ * Mise à jour pour recalculer les secteurs des rubriques
+ *
+ * @uses propager_les_secteurs()
+ **/
+function maj_propager_les_secteurs() {
        include_spip('inc/rubriques');
        propager_les_secteurs();
 }
 
-
-function maj_collation_sqlite(){
+/**
+ * Mise à jour des bdd SQLite pour réparer les collation des champs texte
+ * pour les passer en NOCASE
+ *
+ * @uses base_lister_toutes_tables()
+ * @uses _sqlite_remplacements_definitions_table()
+ **/
+function maj_collation_sqlite() {
 
 
        include_spip('base/dump');
        $tables = base_lister_toutes_tables();
 
        // rien a faire si base non sqlite
-       if (strncmp($GLOBALS['connexions'][0]['type'],'sqlite',6)!==0)
+       if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) !== 0) {
                return;
+       }
 
-       $trouver_table = charger_fonction('trouver_table','base');
+       $trouver_table = charger_fonction('trouver_table', 'base');
        // forcer le vidage de cache
        $trouver_table('');
 
        // cas particulier spip_auteurs : retablir le collate binary sur le login
        $desc = $trouver_table("spip_auteurs");
-       spip_log("spip_auteurs : ".var_export($desc['field'],true),"maj."._LOG_INFO_IMPORTANTE);
-       if (stripos($desc['field']['login'],"BINARY")===false){
-               spip_log("Retablir champ login BINARY sur table spip_auteurs","maj");
+       spip_log("spip_auteurs : " . var_export($desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE);
+       if (stripos($desc['field']['login'], "BINARY") === false) {
+               spip_log("Retablir champ login BINARY sur table spip_auteurs", "maj");
                sql_alter("table spip_auteurs change login login VARCHAR(255) BINARY");
                $trouver_table('');
                $new_desc = $trouver_table("spip_auteurs");
-               spip_log("Apres conversion spip_auteurs : ".var_export($new_desc['field'],true),"maj."._LOG_INFO_IMPORTANTE);
+               spip_log("Apres conversion spip_auteurs : " . var_export($new_desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE);
        }
 
-       foreach ($tables as $table){
-               if (time() >= _TIME_OUT) return;
-               if ($desc = $trouver_table($table)){
+       foreach ($tables as $table) {
+               if (time() >= _TIME_OUT) {
+                       return;
+               }
+               if ($desc = $trouver_table($table)) {
                        $desc_collate = _sqlite_remplacements_definitions_table($desc['field']);
-                       if ($d=array_diff($desc['field'],$desc_collate)){
-                               spip_log("Table $table COLLATE incorrects","maj");
+                       if ($d = array_diff($desc['field'], $desc_collate)) {
+                               spip_log("Table $table COLLATE incorrects", "maj");
 
                                // cas particulier spip_urls :
                                // supprimer les doublons avant conversion sinon echec (on garde les urls les plus recentes)
-                               if ($table=='spip_urls'){
+                               if ($table == 'spip_urls') {
                                        // par date DESC pour conserver les urls les plus recentes
-                                       $data = sql_allfetsel("*","spip_urls",'','','date DESC');
+                                       $data = sql_allfetsel("*", "spip_urls", '', '', 'date DESC');
                                        $urls = array();
-                                       foreach ($data as $d){
-                                               $key = $d['id_parent']."::".strtolower($d['url']);
-                                               if (!isset($urls[$key]))
+                                       foreach ($data as $d) {
+                                               $key = $d['id_parent'] . "::" . strtolower($d['url']);
+                                               if (!isset($urls[$key])) {
                                                        $urls[$key] = true;
-                                               else {
-                                                       spip_log("Suppression doublon dans spip_urls avant conversion : ".serialize($d),"maj."._LOG_INFO_IMPORTANTE);
-                                                       sql_delete("spip_urls","id_parent=".sql_quote($d['id_parent'])." AND url=".sql_quote($d['url']));
+                                               } else {
+                                                       spip_log("Suppression doublon dans spip_urls avant conversion : " . serialize($d),
+                                                               "maj." . _LOG_INFO_IMPORTANTE);
+                                                       sql_delete("spip_urls", "id_parent=" . sql_quote($d['id_parent']) . " AND url=" . sql_quote($d['url']));
                                                }
                                        }
                                }
-                               foreach ($desc['field'] as $field=>$type){
-                                       if ($desc['field'][$field]!==$desc_collate[$field]){
-                                               spip_log("Conversion COLLATE table $table","maj."._LOG_INFO_IMPORTANTE);
-                                               sql_alter("table $table change $field $field ".$desc_collate[$field]);
+                               foreach ($desc['field'] as $field => $type) {
+                                       if ($desc['field'][$field] !== $desc_collate[$field]) {
+                                               spip_log("Conversion COLLATE table $table", "maj." . _LOG_INFO_IMPORTANTE);
+                                               sql_alter("table $table change $field $field " . $desc_collate[$field]);
                                                $trouver_table('');
                                                $new_desc = $trouver_table($table);
-                                               spip_log("Apres conversion $table : ".var_export($new_desc['field'],true),"maj."._LOG_INFO_IMPORTANTE);
+                                               spip_log("Apres conversion $table : " . var_export($new_desc['field'], true),
+                                                       "maj." . _LOG_INFO_IMPORTANTE);
                                                continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite
                                        }
                                }
@@ -483,8 +638,8 @@ function maj_collation_sqlite(){
 
 
 $GLOBALS['maj'][19236] = array(
-       array('sql_updateq','spip_meta',array('impt'=>'oui'),"nom='version_installee'"), // version base principale
-       array('sql_updateq','spip_meta',array('impt'=>'oui'),"nom LIKE '%_base_version'"),  // version base plugins
+       array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom='version_installee'"), // version base principale
+       array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom LIKE '%_base_version'"),  // version base plugins
        array('maj_collation_sqlite'),
 );
 
@@ -492,14 +647,60 @@ $GLOBALS['maj'][19268] = array(
        array('supprimer_toutes_sessions'),
 );
 
-
+/**
+ * Supprime toutes les sessions des auteurs
+ *
+ * Obligera tous les auteurs à se reconnecter !
+ **/
 function supprimer_toutes_sessions() {
        spip_log("supprimer sessions auteur");
-       $dir = opendir(_DIR_SESSIONS);
-       while(($f = readdir($dir)) !== false) {
-               spip_unlink(_DIR_SESSIONS . $f);
-               if (time() >= _TIME_OUT) return;
+       if ($dir = opendir(_DIR_SESSIONS)) {
+               while (($f = readdir($dir)) !== false) {
+                       spip_unlink(_DIR_SESSIONS . $f);
+                       if (time() >= _TIME_OUT) {
+                               return;
+                       }
+               }
        }
 }
 
-?>
+$GLOBALS['maj'][21676] = array(
+       array('ranger_cache_gd2'),
+);
+
+/**
+ * Ranger les images de local/cache-gd2 dans des sous-rep
+ * 
+ * http://core.spip.net/issues/3277
+ */
+function ranger_cache_gd2() {
+       spip_log("ranger_cache_gd2");
+       $base = _DIR_VAR . "cache-gd2/";
+       if (is_dir($base) and is_readable($base)) {
+               if ($dir = opendir($base)) {
+                       while (($f = readdir($dir)) !== false) {
+                               if (!is_dir($base . $f) and strncmp($f, ".", 1) !== 0
+                                       and preg_match(",[0-9a-f]{32}\.\w+,", $f)
+                               ) {
+                                       $sub = substr($f, 0, 2);
+                                       $sub = sous_repertoire($base, $sub);
+                                       @rename($base . $f, $sub . substr($f, 2));
+                                       @unlink($base . $f); // au cas ou le rename a foire (collision)
+                               }
+                               if (time() >= _TIME_OUT) {
+                                       return;
+                               }
+                       }
+               }
+       }
+}
+
+
+$GLOBALS['maj'][21742] = array(
+       array('sql_alter', "TABLE spip_articles CHANGE url_site url_site text DEFAULT '' NOT NULL"),
+       array('sql_alter', "TABLE spip_articles CHANGE virtuel virtuel text DEFAULT '' NOT NULL"),
+);
+
+$GLOBALS['maj'][23375] = array(
+       array('sql_alter', "TABLE spip_auteurs CHANGE prefs prefs text"),
+);