[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / maj / svn10000.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Gestion des mises à jour de SPIP, version >= 10000
15 *
16 * Gestion des mises à jour du cœur de SPIP par un tableau global `maj`
17 * indexé par le numero SVN du changement
18 *
19 * @package SPIP\Core\SQL\Upgrade
20 **/
21 if (!defined('_ECRIRE_INC_VERSION')) {
22 return;
23 }
24
25
26 // Type cls et sty pour LaTeX
27 $GLOBALS['maj'][10990] = array(array('upgrade_types_documents'));
28
29 // Type 3gp: http://www.faqs.org/rfcs/rfc3839.html
30 // Aller plus vite pour les vieilles versions en redeclarant une seule les doc
31 unset($GLOBALS['maj'][10990]);
32 $GLOBALS['maj'][11042] = array(array('upgrade_types_documents'));
33
34
35 // Un bug permettait au champ 'upload' d'etre vide, provoquant
36 // l'impossibilite de telecharger une image
37 // http://trac.rezo.net/trac/spip/ticket/1238
38 $GLOBALS['maj'][11171] = array(
39 array('spip_query', "UPDATE spip_types_documents SET upload='oui' WHERE upload IS NULL OR upload!='non'")
40 );
41
42 /**
43 * Mise à jour 11268 : renommer spip_recherches la mal nommée en spip_resultats
44 **/
45 function maj_11268() {
46 global $tables_auxiliaires;
47 include_spip('base/auxiliaires');
48 $v = $tables_auxiliaires[$k = 'spip_resultats'];
49 sql_create($k, $v['field'], $v['key'], false, false);
50 }
51
52 $GLOBALS['maj'][11268] = array(array('maj_11268'));
53
54 /**
55 * Mise à jour 11276 : réparer les éventuelles tables spip_documents
56 * en se fondant sur l'extension de la colonne fichier
57 *
58 * @uses maj_1_938()
59 **/
60 function maj_11276() {
61 include_spip('maj/v019');
62 maj_1_938();
63 }
64
65 $GLOBALS['maj'][11276] = array(array('maj_11276'));
66
67 /**
68 * Mise à jour 11388 : réparer les referers d'article, qui sont vides depuis r10572
69 */
70 function maj_11388() {
71 $s = sql_select('referer_md5', 'spip_referers_articles', "referer='' OR referer IS NULL");
72 while ($t = sql_fetch($s)) {
73 $k = sql_fetsel('referer', 'spip_referers', 'referer_md5=' . sql_quote($t['referer_md5']));
74 if ($k['referer']) {
75 spip_query('UPDATE spip_referers_articles
76 SET referer=' . sql_quote($k['referer']) . '
77 WHERE referer_md5=' . sql_quote($t['referer_md5'])
78 . " AND (referer='' OR referer IS NULL)"
79 );
80 }
81 }
82 }
83
84 $GLOBALS['maj'][11388] = array(array('maj_11388'));
85
86 /**
87 * Mise à jour 11431 : réparer spip_mots.type = titre du groupe
88 */
89 function maj_11431() {
90 // mysql only
91 // 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");
92
93 // selection des mots cles dont le type est different du groupe
94 $res = sql_select(
95 array("a.id_mot AS id_mot", "b.titre AS type"),
96 array("spip_mots AS a LEFT JOIN spip_groupes_mots AS b ON (a.id_groupe = b.id_groupe)"),
97 array("a.type != b.titre"));
98 // mise a jour de ces mots la
99 if ($res) {
100 while ($r = sql_fetch($res)) {
101 sql_updateq('spip_mots', array('type' => $r['type']), 'id_mot=' . sql_quote($r['id_mot']));
102 }
103 }
104 }
105
106 $GLOBALS['maj'][11431] = array(array('maj_11431'));
107
108 /**
109 * Mise à jour 11778 : réparer spip_types_documents.id_type qui est parfois encore présent
110 */
111 function maj_11778() {
112 // si presence id_type
113 $s = sql_showtable('spip_types_documents');
114 if (isset($s['field']['id_type'])) {
115 sql_alter('TABLE spip_types_documents CHANGE id_type id_type BIGINT(21) NOT NULL');
116 sql_alter('TABLE spip_types_documents DROP id_type');
117 sql_alter('TABLE spip_types_documents ADD PRIMARY KEY (extension)');
118 }
119 }
120
121 $GLOBALS['maj'][11778] = array(array('maj_11778'));
122
123 /**
124 * Mise à jour 11790 : Optimisation des forums
125 */
126 function maj_11790() {
127 # sql_alter('TABLE spip_forum DROP INDEX id_message id_message');
128 sql_alter('TABLE spip_forum ADD INDEX id_parent (id_parent)');
129 sql_alter('TABLE spip_forum ADD INDEX id_auteur (id_auteur)');
130 sql_alter('TABLE spip_forum ADD INDEX id_thread (id_thread)');
131 }
132
133 $GLOBALS['maj'][11790] = array(array('maj_11790'));
134
135 $GLOBALS['maj'][11794] = array(); // ajout de spip_documents_forum
136
137
138 $GLOBALS['maj'][11961] = array(
139 array('sql_alter', "TABLE spip_groupes_mots CHANGE `tables` tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"),
140 // si tables a ete cree on le renomme
141 array('sql_alter', "TABLE spip_groupes_mots ADD tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"),
142 // sinon on l'ajoute
143 array('sql_update', 'spip_groupes_mots', array('tables_liees' => "''"), "articles REGEXP '.*'"),
144 // si le champ articles est encore la, on reinit la conversion
145 array(
146 'sql_update',
147 'spip_groupes_mots',
148 array('tables_liees' => "concat(tables_liees,'articles,')"),
149 "articles='oui'"
150 ),
151 // sinon ces 4 requetes ne feront rien
152 array('sql_update', 'spip_groupes_mots', array('tables_liees' => "concat(tables_liees,'breves,')"), "breves='oui'"),
153 array(
154 'sql_update',
155 'spip_groupes_mots',
156 array('tables_liees' => "concat(tables_liees,'rubriques,')"),
157 "rubriques='oui'"
158 ),
159 array('sql_update', 'spip_groupes_mots', array('tables_liees' => "concat(tables_liees,'syndic,')"), "syndic='oui'"),
160 );
161
162
163 /**
164 * Mise à jour 12008 : Réunir en une seule table les liens de documents
165 * spip_documents_articles et spip_documents_forum
166 */
167 function maj_12008() {
168 // Creer spip_documents_liens
169 global $tables_auxiliaires;
170 include_spip('base/auxiliaires');
171 $v = $tables_auxiliaires[$k = 'spip_documents_liens'];
172 sql_create($k, $v['field'], $v['key'], false, false);
173
174 // Recopier les donnees
175 foreach (array('article', 'breve', 'rubrique', 'auteur', 'forum') as $l) {
176 if ($s = sql_select('*', 'spip_documents_' . $l . 's')
177 or $s = sql_select('*', 'spip_documents_' . $l)
178 ) {
179 $tampon = array();
180 while ($t = sql_fetch($s)) {
181 // transformer id_xx=N en (id_objet=N, objet=xx)
182 $t['id_objet'] = $t["id_$l"];
183 $t['objet'] = $l;
184 unset($t["id_$l"]);
185 unset($t['maj']);
186 $tampon[] = $t;
187 if (count($tampon) > 10000) {
188 sql_insertq_multi('spip_documents_liens', $tampon);
189 $tampon = array();
190 }
191 }
192 if (count($tampon)) {
193 sql_insertq_multi('spip_documents_liens', $tampon);
194 }
195 }
196 }
197 }
198
199 $GLOBALS['maj'][12008] = array(
200 //array('sql_drop_table',"spip_documents_liens"), // tant pis pour ceux qui ont joue a 11974
201 array('sql_alter', "TABLE spip_documents_liens DROP PRIMARY KEY"),
202 array('sql_alter', "TABLE spip_documents_liens ADD id_objet bigint(21) DEFAULT '0' NOT NULL AFTER id_document"),
203 array('sql_alter', "TABLE spip_documents_liens ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"),
204 array(
205 'sql_update',
206 'spip_documents_liens',
207 array('id_objet' => "id_article", 'objet' => "'article'"),
208 "id_article IS NOT NULL AND id_article>0"
209 ),
210 array(
211 'sql_update',
212 'spip_documents_liens',
213 array('id_objet' => "id_rubrique", 'objet' => "'rubrique'"),
214 "id_rubrique IS NOT NULL AND id_rubrique>0"
215 ),
216 array(
217 'sql_update',
218 'spip_documents_liens',
219 array('id_objet' => "id_breve", 'objet' => "'breve'"),
220 "id_breve IS NOT NULL AND id_breve>0"
221 ),
222 array(
223 'sql_update',
224 'spip_documents_liens',
225 array('id_objet' => "id_auteur", 'objet' => "'auteur'"),
226 "id_auteur IS NOT NULL AND id_auteur>0"
227 ),
228 array(
229 'sql_update',
230 'spip_documents_liens',
231 array('id_objet' => "id_forum", 'objet' => "'forum'"),
232 "id_forum IS NOT NULL AND id_forum>0"
233 ),
234 array('sql_alter', "TABLE spip_documents_liens ADD PRIMARY KEY (id_document,id_objet,objet)"),
235 array('sql_alter', "TABLE spip_documents_liens DROP id_article"),
236 array('sql_alter', "TABLE spip_documents_liens DROP id_rubrique"),
237 array('sql_alter', "TABLE spip_documents_liens DROP id_breve"),
238 array('sql_alter', "TABLE spip_documents_liens DROP id_auteur"),
239 array('sql_alter', "TABLE spip_documents_liens DROP id_forum"),
240 array('maj_12008'),
241 );
242
243
244 // destruction des tables spip_documents_articles etc, cf. 12008
245 $GLOBALS['maj'][12009] = array(
246 array('sql_drop_table', "spip_documents_articles"),
247 array('sql_drop_table', "spip_documents_breves"),
248 array('sql_drop_table', "spip_documents_rubriques"),
249 array('sql_drop_table', "spip_documents_auteurs"), # plugin #FORMULAIRE_UPLOAD
250 array('sql_drop_table', "spip_documents_syndic") # plugin podcast_client
251 );
252
253 // destruction des champs articles breves rubriques et syndic, cf. 11961
254 $GLOBALS['maj'][12010] = array(
255 array('sql_alter', "TABLE spip_groupes_mots DROP articles"),
256 array('sql_alter', "TABLE spip_groupes_mots DROP breves"),
257 array('sql_alter', "TABLE spip_groupes_mots DROP rubriques"),
258 array('sql_alter', "TABLE spip_groupes_mots DROP syndic"),
259 );
260
261 /**
262 * Mise à jour 13135 : réparer le calcul des rubriques ayant des articles postdatés
263 */
264 function maj_13135() {
265 include_spip('inc/rubriques');
266 calculer_prochain_postdate();
267
268 // supprimer les eventuels vieux cache plugin qui n'utilisaient pas _chemin
269 @spip_unlink(_CACHE_PLUGINS_OPT);
270 @spip_unlink(_CACHE_PLUGINS_FCT);
271 }
272
273 $GLOBALS['maj'][13135] = array(array('maj_13135'));
274
275 // Type flac: http://flac.sourceforge.net
276 $GLOBALS['maj'][13333] = array(array('upgrade_types_documents'));
277
278 // http://archives.rezo.net/spip-zone.mbox/200903.mbox/%3Cbfc33ad70903141606q2e4c53f2k4fef6b45e611a04f@mail.gmail.com%3E
279
280 $GLOBALS['maj'][13833] = array(
281 array('sql_alter', "TABLE spip_documents_liens ADD INDEX objet(id_objet,objet)")
282 );
283
284 // Fin upgrade commun branche 2.0
285
286 $GLOBALS['maj'][13904] = array(
287 array('sql_alter', "TABLE spip_auteurs ADD webmestre varchar(3) DEFAULT 'non' NOT NULL"),
288 array(
289 'sql_update',
290 'spip_auteurs',
291 array('webmestre' => "'oui'"),
292 sql_in("id_auteur", defined('_ID_WEBMESTRES') ? explode(':',
293 _ID_WEBMESTRES) : (autoriser('configurer') ? array($GLOBALS['visiteur_session']['id_auteur']) : array(0)))
294 ) // le webmestre est celui qui fait l'upgrade si rien de defini
295 );
296
297 // sites plantes en mode "'su" au lieu de "sus"
298 $GLOBALS['maj'][13929] = array(
299 array('sql_update', "spip_syndic", array('syndication' => "'sus'"), "syndication LIKE '\\'%'")
300 );
301
302 // Types de fichiers m4a/m4b/m4p/m4u/m4v/dv
303 // Types de fichiers Open XML (cro$oft)
304 $GLOBALS['maj'][14558] = array(array('upgrade_types_documents'));
305
306 // refaire les upgrade dont les numeros sont inferieurs a ceux de la branche 2.0
307 // etre sur qu'ils sont bien unipotents(?)...
308 $GLOBALS['maj'][14559] = $GLOBALS['maj'][13904] + $GLOBALS['maj'][13929] + $GLOBALS['maj'][14558];
309
310 // La version 14588 etait une mauvaise piste:
311 // Retour en arriere pour ceux qui l'ont subi, ne rien faire sinon
312 if (@$GLOBALS['meta']['version_installee'] >= 14588) {
313
314 // "mode" est un mot-cle d'Oracle
315 $GLOBALS['maj'][14588] = array(
316 array('sql_alter', "TABLE spip_documents DROP INDEX mode"),
317 array(
318 'sql_alter',
319 "TABLE spip_documents CHANGE mode genre ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"
320 ),
321 array('sql_alter', "TABLE spip_documents ADD INDEX genre(genre)")
322 );
323 // solution moins intrusive au pb de mot-cle d'Oracle, retour avant 14588
324 $GLOBALS['maj'][14598] = array(
325 array('sql_alter', "TABLE spip_documents DROP INDEX genre"),
326 array(
327 'sql_alter',
328 "TABLE spip_documents CHANGE genre mode ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"
329 ),
330 array('sql_alter', "TABLE spip_documents ADD INDEX mode(mode)")
331 );
332 }
333
334 // Restauration correcte des types mime des fichiers Ogg
335 // http://trac.rezo.net/trac/spip/ticket/1941
336 // + Types de fichiers : f4a/f4b/f4p/f4v/mpc http://en.wikipedia.org/wiki/Flv#File_formats
337 // + Report du commit oublié : http://trac.rezo.net/trac/spip/changeset/14272
338 $GLOBALS['maj'][15676] = array(array('upgrade_types_documents'));
339
340 // Type de fichiers : webm http://en.wikipedia.org/wiki/Flv#File_formats
341 $GLOBALS['maj'][15827] = array(array('upgrade_types_documents'));
342
343 $GLOBALS['maj'][16428] = array(
344 array('maj_liens', 'auteur'), // creer la table liens
345 array('maj_liens', 'auteur', 'article'),
346 array('sql_drop_table', "spip_auteurs_articles"),
347 array('maj_liens', 'auteur', 'rubrique'),
348 array('sql_drop_table', "spip_auteurs_rubriques"),
349 array('maj_liens', 'auteur', 'message'),
350 array('sql_drop_table', "spip_auteurs_messages"),
351 );
352
353 /**
354 * Mise à jour des tables de liens
355 *
356 * Crée la table de lien au nouveau format (spip_xx_liens) ou insère
357 * les données d'ancien format dans la nouveau format.
358 *
359 * Par exemple pour réunir en une seule table les liens de documents,
360 * spip_documents_articles et spip_documents_forum
361 *
362 * Supprime la table au vieux format une fois les données transférées.
363 *
364 * @uses creer_ou_upgrader_table()
365 * @uses maj_liens_insertq_multi_check()
366 *
367 * @param string $pivot
368 * Nom de la table pivot, tel que `auteur`
369 * @param string $l
370 * Vide : crée la table de lien pivot.
371 * Sinon, nom de la table à lier, tel que `article`, et dans ce cas là,
372 * remplit spip_auteurs_liens à partir de spip_auteurs_articles.
373 */
374 function maj_liens($pivot, $l = '') {
375
376 @define('_LOG_FILTRE_GRAVITE', 8);
377
378 $exceptions_pluriel = array('forum' => 'forum', 'syndic' => 'syndic');
379
380 $pivot = preg_replace(',[^\w],', '', $pivot); // securite
381 $pivots = (isset($exceptions_pluriel[$pivot]) ? $exceptions_pluriel[$pivot] : $pivot . "s");
382 $liens = "spip_" . $pivots . "_liens";
383 $id_pivot = "id_" . $pivot;
384 // Creer spip_auteurs_liens
385 global $tables_auxiliaires;
386 if (!$l) {
387 include_spip('base/auxiliaires');
388 include_spip('base/create');
389 creer_ou_upgrader_table($liens, $tables_auxiliaires[$liens], false);
390 } else {
391 // Preparer
392 $l = preg_replace(',[^\w],', '', $l); // securite
393 $primary = "id_$l";
394 $objet = ($l == 'syndic' ? 'site' : $l);
395 $ls = (isset($exceptions_pluriel[$l]) ? $exceptions_pluriel[$l] : $l . "s");
396 $ancienne_table = 'spip_' . $pivots . '_' . $ls;
397 $pool = 400;
398
399 $trouver_table = charger_fonction('trouver_table', 'base');
400 if (!$desc = $trouver_table($ancienne_table)) {
401 return;
402 }
403
404 // securite pour ne pas perdre de donnees
405 if (!$trouver_table($liens)) {
406 return;
407 }
408
409 $champs = $desc['field'];
410 if (isset($champs['maj'])) {
411 unset($champs['maj']);
412 }
413 if (isset($champs[$primary])) {
414 unset($champs[$primary]);
415 }
416
417 $champs = array_keys($champs);
418 // ne garder que les champs qui existent sur la table destination
419 if ($desc_cible = $trouver_table($liens)) {
420 $champs = array_intersect($champs, array_keys($desc_cible['field']));
421 }
422
423 $champs[] = "$primary as id_objet";
424 $champs[] = "'$objet' as objet";
425 $champs = implode(', ', $champs);
426
427 // Recopier les donnees
428 $sub_pool = 100;
429 while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) {
430 $insert = array();
431 foreach ($ids as $id) {
432 $n = sql_countsel($liens, "objet='$objet' AND id_objet=" . intval($id));
433 while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . intval($id), '', $id_pivot, "$n,$pool")) {
434 $n += count($t);
435 // empiler en s'assurant a minima de l'unicite
436 while ($r = array_shift($t)) {
437 $insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r;
438 }
439 if (count($insert) >= $sub_pool) {
440 maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
441 $insert = array();
442 }
443 // si timeout, sortir, la relance nous ramenera dans cette fonction
444 // et on verifiera/repartira de la
445 if (time() >= _TIME_OUT) {
446 return;
447 }
448 }
449 if (time() >= _TIME_OUT) {
450 return;
451 }
452 }
453 if (count($insert)) {
454 maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
455 }
456 sql_delete($ancienne_table, sql_in($primary, $ids));
457 }
458 }
459 }
460
461 /**
462 * Insère des données dans une table de liaison de façon un peu sécurisée
463 *
464 * Si une insertion multiple échoue, on réinsère ligne par ligne.
465 *
466 * @param string $table Table de liaison
467 * @param array $couples Tableau de couples de données à insérer
468 * @param array $desc Description de la table de liaison
469 * @return void
470 **/
471 function maj_liens_insertq_multi_check($table, $couples, $desc = array()) {
472 $n_before = sql_countsel($table);
473 sql_insertq_multi($table, $couples, $desc);
474 $n_after = sql_countsel($table);
475 if (($n_after - $n_before) == count($couples)) {
476 return;
477 }
478 // si ecart, on recommence l'insertion ligne par ligne...
479 // moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie
480 foreach ($couples as $c) {
481 sql_insertq($table, $c, $desc);
482 }
483 }
484
485 $GLOBALS['maj'][17311] = array(
486 array(
487 'ecrire_meta',
488 "multi_objets",
489 implode(',',
490 array_diff(
491 array(
492 (isset($GLOBALS['meta']['multi_rubriques']) and $GLOBALS['meta']['multi_rubriques'] == 'oui')
493 ? 'spip_rubriques' : '',
494 (isset($GLOBALS['meta']['multi_articles']) and $GLOBALS['meta']['multi_articles'] == 'oui')
495 ? 'spip_articles' : ''
496 ),
497 array('')
498 ))
499 ),
500 array(
501 'ecrire_meta',
502 "gerer_trad_objets",
503 implode(',',
504 array_diff(
505 array(
506 (isset($GLOBALS['meta']['gerer_trad']) and $GLOBALS['meta']['gerer_trad'] == 'oui')
507 ? 'spip_articles' : ''
508 ),
509 array('')
510 ))
511 ),
512 );
513 $GLOBALS['maj'][17555] = array(
514 array('sql_alter', "TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"),
515 array('sql_alter', "TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"),
516 );
517
518 $GLOBALS['maj'][17563] = array(
519 array('sql_alter', "TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"),
520 array('sql_update', 'spip_articles', array('virtuel' => 'SUBSTRING(chapo,2)', 'chapo' => "''"), "chapo LIKE '=_%'"),
521 );
522
523 $GLOBALS['maj'][17577] = array(
524 array('maj_tables', array('spip_jobs', 'spip_jobs_liens')),
525 );
526
527 $GLOBALS['maj'][17743] = array(
528 array('sql_update', 'spip_auteurs', array('prefs' => 'bio', 'bio' => "''"), "statut='nouveau' AND bio<>''"),
529 );
530
531 $GLOBALS['maj'][18219] = array(
532 array('sql_alter', "TABLE spip_rubriques DROP id_import"),
533 array('sql_alter', "TABLE spip_rubriques DROP export"),
534 );
535
536 $GLOBALS['maj'][18310] = array(
537 array('sql_alter', "TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"),
538 );
539
540 $GLOBALS['maj'][18597] = array(
541 array('sql_alter', "TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"),
542 array('maj_propager_les_secteurs'),
543 );
544
545 $GLOBALS['maj'][18955] = array(
546 array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)"),
547 array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX objet (objet)"),
548 );
549
550 /**
551 * Mise à jour pour recalculer les secteurs des rubriques
552 *
553 * @uses propager_les_secteurs()
554 **/
555 function maj_propager_les_secteurs() {
556 include_spip('inc/rubriques');
557 propager_les_secteurs();
558 }
559
560 /**
561 * Mise à jour des bdd SQLite pour réparer les collation des champs texte
562 * pour les passer en NOCASE
563 *
564 * @uses base_lister_toutes_tables()
565 * @uses _sqlite_remplacements_definitions_table()
566 **/
567 function maj_collation_sqlite() {
568
569
570 include_spip('base/dump');
571 $tables = base_lister_toutes_tables();
572
573 // rien a faire si base non sqlite
574 if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) !== 0) {
575 return;
576 }
577
578 $trouver_table = charger_fonction('trouver_table', 'base');
579 // forcer le vidage de cache
580 $trouver_table('');
581
582 // cas particulier spip_auteurs : retablir le collate binary sur le login
583 $desc = $trouver_table("spip_auteurs");
584 spip_log("spip_auteurs : " . var_export($desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE);
585 if (stripos($desc['field']['login'], "BINARY") === false) {
586 spip_log("Retablir champ login BINARY sur table spip_auteurs", "maj");
587 sql_alter("table spip_auteurs change login login VARCHAR(255) BINARY");
588 $trouver_table('');
589 $new_desc = $trouver_table("spip_auteurs");
590 spip_log("Apres conversion spip_auteurs : " . var_export($new_desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE);
591 }
592
593 foreach ($tables as $table) {
594 if (time() >= _TIME_OUT) {
595 return;
596 }
597 if ($desc = $trouver_table($table)) {
598 $desc_collate = _sqlite_remplacements_definitions_table($desc['field']);
599 if ($d = array_diff($desc['field'], $desc_collate)) {
600 spip_log("Table $table COLLATE incorrects", "maj");
601
602 // cas particulier spip_urls :
603 // supprimer les doublons avant conversion sinon echec (on garde les urls les plus recentes)
604 if ($table == 'spip_urls') {
605 // par date DESC pour conserver les urls les plus recentes
606 $data = sql_allfetsel("*", "spip_urls", '', '', 'date DESC');
607 $urls = array();
608 foreach ($data as $d) {
609 $key = $d['id_parent'] . "::" . strtolower($d['url']);
610 if (!isset($urls[$key])) {
611 $urls[$key] = true;
612 } else {
613 spip_log("Suppression doublon dans spip_urls avant conversion : " . serialize($d),
614 "maj." . _LOG_INFO_IMPORTANTE);
615 sql_delete("spip_urls", "id_parent=" . sql_quote($d['id_parent']) . " AND url=" . sql_quote($d['url']));
616 }
617 }
618 }
619 foreach ($desc['field'] as $field => $type) {
620 if ($desc['field'][$field] !== $desc_collate[$field]) {
621 spip_log("Conversion COLLATE table $table", "maj." . _LOG_INFO_IMPORTANTE);
622 sql_alter("table $table change $field $field " . $desc_collate[$field]);
623 $trouver_table('');
624 $new_desc = $trouver_table($table);
625 spip_log("Apres conversion $table : " . var_export($new_desc['field'], true),
626 "maj." . _LOG_INFO_IMPORTANTE);
627 continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite
628 }
629 }
630 }
631 }
632 }
633
634 // forcer le vidage de cache
635 $trouver_table('');
636
637 }
638
639
640 $GLOBALS['maj'][19236] = array(
641 array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom='version_installee'"), // version base principale
642 array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom LIKE '%_base_version'"), // version base plugins
643 array('maj_collation_sqlite'),
644 );
645
646 $GLOBALS['maj'][19268] = array(
647 array('supprimer_toutes_sessions'),
648 );
649
650 /**
651 * Supprime toutes les sessions des auteurs
652 *
653 * Obligera tous les auteurs à se reconnecter !
654 **/
655 function supprimer_toutes_sessions() {
656 spip_log("supprimer sessions auteur");
657 if ($dir = opendir(_DIR_SESSIONS)) {
658 while (($f = readdir($dir)) !== false) {
659 spip_unlink(_DIR_SESSIONS . $f);
660 if (time() >= _TIME_OUT) {
661 return;
662 }
663 }
664 }
665 }
666
667 $GLOBALS['maj'][21676] = array(
668 array('ranger_cache_gd2'),
669 );
670
671 /**
672 * Ranger les images de local/cache-gd2 dans des sous-rep
673 *
674 * http://core.spip.net/issues/3277
675 */
676 function ranger_cache_gd2() {
677 spip_log("ranger_cache_gd2");
678 $base = _DIR_VAR . "cache-gd2/";
679 if (is_dir($base) and is_readable($base)) {
680 if ($dir = opendir($base)) {
681 while (($f = readdir($dir)) !== false) {
682 if (!is_dir($base . $f) and strncmp($f, ".", 1) !== 0
683 and preg_match(",[0-9a-f]{32}\.\w+,", $f)
684 ) {
685 $sub = substr($f, 0, 2);
686 $sub = sous_repertoire($base, $sub);
687 @rename($base . $f, $sub . substr($f, 2));
688 @unlink($base . $f); // au cas ou le rename a foire (collision)
689 }
690 if (time() >= _TIME_OUT) {
691 return;
692 }
693 }
694 }
695 }
696 }
697
698
699 $GLOBALS['maj'][21742] = array(
700 array('sql_alter', "TABLE spip_articles CHANGE url_site url_site text DEFAULT '' NOT NULL"),
701 array('sql_alter', "TABLE spip_articles CHANGE virtuel virtuel text DEFAULT '' NOT NULL"),
702 );
703
704 $GLOBALS['maj'][23375] = array(
705 array('sql_alter', "TABLE spip_auteurs CHANGE prefs prefs text"),
706 );