Completed
Push — master ( 3e6f39...ee2ef7 )
by cam
04:21
created

svn10000.php ➔ maj_collation_sqlite()   C

Complexity

Conditions 12
Paths 21

Size

Total Lines 71

Duplication

Lines 11
Ratio 15.49 %

Importance

Changes 0
Metric Value
cc 12
nc 21
nop 0
dl 11
loc 71
rs 6.206
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/***************************************************************************\
4
 *  SPIP, Système de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright © avec tendresse depuis 2001                                 *
7
 *  Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James  *
8
 *                                                                         *
9
 *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
10
 *  Pour plus de détails 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
// https://core.spip.net/issues/1238
38
$GLOBALS['maj'][11171] = array(
39
	array('sql_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
			sql_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
	// sql_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);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
270
	@spip_unlink(_CACHE_PLUGINS_FCT);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
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/archives/spip-zone.mbox/C6RZKNBUNJYN42IOEOC4QKVCA233AMLI/
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
// https://core.spip.net/issues/1941
336
// + Types de fichiers : f4a/f4b/f4p/f4v/mpc http://en.wikipedia.org/wiki/Flv#File_formats
337
// + Report du commit oublié : https://git.spip.net/spip/spip/commit/a6468fa5e3e34483b98b24b0102c4356f2f369a3
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);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
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 View Code Duplication
				foreach ($desc['field'] as $field => $type) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
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
 * https://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));
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
688
					@unlink($base . $f); // au cas ou le rename a foire (collision)
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
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
);
707
708
function upgrade_logo_objet($objet) {
709
	$GLOBALS['logo_migrer_en_base'] = true;
710
	include_spip('ecrire/action/editer_logo');
711
	logo_migrer_en_base($objet, _TIME_OUT);
712
	unset($GLOBALS['logo_migrer_en_base']);
713
}
714
// upgrade des logos
715
$GLOBALS['maj'][24351] = [];
716
$tables_objets_sql = lister_tables_objets_sql();
717
foreach(array_keys($tables_objets_sql) as $table) {
718
	$GLOBALS['maj'][24351][] = ['upgrade_logo_objet', objet_type($table)];
719
};
720
721
// adaptation des timestamp mysql
722
$GLOBALS['maj'][24379] = [['maj_timestamp_mysql']];
723
724
/**
725
 * Mise à jour des bdd Mysql pour réparer les timestamp auto-update absents
726
 *
727
 * @uses base_lister_toutes_tables()
728
 * @uses _mysql_remplacements_definitions_table()
729
 **/
730
function maj_timestamp_mysql($tables = null) {
731
732
	include_spip('base/dump');
733
	if (is_null($tables)) {
734
		$tables = base_lister_toutes_tables();
735
	} elseif (is_string($tables)) {
736
		$tables = [$tables];
737
	} elseif (!is_array($tables)) {
738
		return;
739
	}
740
741
	// rien a faire si base non mysql
742
	if (strncmp($GLOBALS['connexions'][0]['type'], 'mysql', 5) !== 0) {
743
		return;
744
	}
745
746
	$trouver_table = charger_fonction('trouver_table', 'base');
747
	// forcer le vidage de cache
748
	$trouver_table('');
749
750
	foreach ($tables as $table) {
751
		if (time() >= _TIME_OUT) {
752
			return;
753
		}
754
		if ($desc = $trouver_table($table)) {
755
			$fields_corrected = _mysql_remplacements_definitions_table($desc['field']);
756
			$d = array_diff($desc['field'], $fields_corrected);
757
			if ($d) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $d of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
758
				spip_log("Table $table TIMESTAMP incorrect", "maj");
759 View Code Duplication
				foreach ($desc['field'] as $field => $type) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
760
					if ($desc['field'][$field] !== $fields_corrected[$field]) {
761
						spip_log("Adaptation TIMESTAMP table $table", "maj." . _LOG_INFO_IMPORTANTE);
762
						sql_alter("table $table change $field $field " . $fields_corrected[$field]);
763
						$trouver_table('');
764
						$new_desc = $trouver_table($table);
765
						spip_log("Apres conversion $table : " . var_export($new_desc['field'], true),
766
							"maj." . _LOG_INFO_IMPORTANTE);
767
					}
768
				}
769
			}
770
		}
771
	}
772
773
	// forcer le vidage de cache
774
	$trouver_table('');
775
}
776