Completed
Push — master ( fdca64...241762 )
by cam
02:05
created
ecrire/base/abstract_sql.php 1 patch
Indentation   +687 added lines, -687 removed lines patch added patch discarded remove patch
@@ -24,7 +24,7 @@  discard block
 block discarded – undo
24 24
  */
25 25
 
26 26
 if (!defined('_ECRIRE_INC_VERSION')) {
27
-	return;
27
+    return;
28 28
 }
29 29
 
30 30
 /** Version de l'API SQL */
@@ -44,37 +44,37 @@  discard block
 block discarded – undo
44 44
  *     contexte de l'erreur
45 45
  **/
46 46
 function sql_error_backtrace($compil_info = false) {
47
-	$trace = debug_backtrace();
48
-	$caller = array_shift($trace);
49
-	while (count($trace) && (empty($trace[0]['file']) || $trace[0]['file'] === $caller['file'] || $trace[0]['file'] === __FILE__)) {
50
-		array_shift($trace);
51
-	}
52
-
53
-	if ($compil_info) {
54
-		return [
55
-			$trace[0]['file'],// sourcefile
56
-			'', //nom
57
-			(isset($trace[1]) ? $trace[1]['function'] . "(){\n" : '')
58
-			. $trace[0]['function'] . '();'
59
-			. (isset($trace[1]) ? "\n}" : ''), //id_boucle
60
-			$trace[0]['line'], // ligne
61
-			$GLOBALS['spip_lang'], // lang
62
-		];
63
-	}
64
-
65
-	$message = count($trace) ? $trace[0]['file'] . ' L' . $trace[0]['line'] : '';
66
-	$f = [];
67
-	while (count($trace) && ($t = array_shift($trace))) {
68
-		if (in_array($t['function'], ['include_once', 'include_spip', 'find_in_path'])) {
69
-			break;
70
-		}
71
-		$f[] = $t['function'];
72
-	}
73
-	if ($f !== []) {
74
-		$message .= ' [' . implode('(),', $f) . '()]';
75
-	}
76
-
77
-	return $message;
47
+    $trace = debug_backtrace();
48
+    $caller = array_shift($trace);
49
+    while (count($trace) && (empty($trace[0]['file']) || $trace[0]['file'] === $caller['file'] || $trace[0]['file'] === __FILE__)) {
50
+        array_shift($trace);
51
+    }
52
+
53
+    if ($compil_info) {
54
+        return [
55
+            $trace[0]['file'],// sourcefile
56
+            '', //nom
57
+            (isset($trace[1]) ? $trace[1]['function'] . "(){\n" : '')
58
+            . $trace[0]['function'] . '();'
59
+            . (isset($trace[1]) ? "\n}" : ''), //id_boucle
60
+            $trace[0]['line'], // ligne
61
+            $GLOBALS['spip_lang'], // lang
62
+        ];
63
+    }
64
+
65
+    $message = count($trace) ? $trace[0]['file'] . ' L' . $trace[0]['line'] : '';
66
+    $f = [];
67
+    while (count($trace) && ($t = array_shift($trace))) {
68
+        if (in_array($t['function'], ['include_once', 'include_spip', 'find_in_path'])) {
69
+            break;
70
+        }
71
+        $f[] = $t['function'];
72
+    }
73
+    if ($f !== []) {
74
+        $message .= ' [' . implode('(),', $f) . '()]';
75
+    }
76
+
77
+    return $message;
78 78
 }
79 79
 
80 80
 
@@ -99,16 +99,16 @@  discard block
 block discarded – undo
99 99
  *
100 100
  **/
101 101
 function sql_serveur($ins_sql = '', $serveur = '', $continue = false) {
102
-	static $sql_serveur = [];
103
-	if (!isset($sql_serveur[$serveur][$ins_sql])) {
104
-		$f = spip_connect_sql(\SQL_ABSTRACT_VERSION, $ins_sql, $serveur, $continue);
105
-		if (!is_string($f) || !$f) {
106
-			return $f;
107
-		}
108
-		$sql_serveur[$serveur][$ins_sql] = $f;
109
-	}
110
-
111
-	return $sql_serveur[$serveur][$ins_sql];
102
+    static $sql_serveur = [];
103
+    if (!isset($sql_serveur[$serveur][$ins_sql])) {
104
+        $f = spip_connect_sql(\SQL_ABSTRACT_VERSION, $ins_sql, $serveur, $continue);
105
+        if (!is_string($f) || !$f) {
106
+            return $f;
107
+        }
108
+        $sql_serveur[$serveur][$ins_sql] = $f;
109
+    }
110
+
111
+    return $sql_serveur[$serveur][$ins_sql];
112 112
 }
113 113
 
114 114
 /**
@@ -130,22 +130,22 @@  discard block
 block discarded – undo
130 130
  *     Retourne le nom du charset si effectivement trouvé, sinon false.
131 131
  **/
132 132
 function sql_get_charset($charset, $serveur = '', $option = true) {
133
-	// le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc.
134
-	$desc = sql_serveur('', $serveur, true);
135
-	$desc = $desc[\SQL_ABSTRACT_VERSION];
136
-	$c = $desc['charsets'][$charset];
137
-	if (
138
-		$c
139
-		&& function_exists($f = @$desc['get_charset'])
140
-		&& $f($c, $serveur, $option)
141
-	) {
142
-		return $c;
143
-	}
144
-	spip_logger()->warning(
145
-		"SPIP ne connait pas les Charsets disponibles sur le serveur $serveur. Le serveur choisira seul."
146
-	);
147
-
148
-	return false;
133
+    // le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc.
134
+    $desc = sql_serveur('', $serveur, true);
135
+    $desc = $desc[\SQL_ABSTRACT_VERSION];
136
+    $c = $desc['charsets'][$charset];
137
+    if (
138
+        $c
139
+        && function_exists($f = @$desc['get_charset'])
140
+        && $f($c, $serveur, $option)
141
+    ) {
142
+        return $c;
143
+    }
144
+    spip_logger()->warning(
145
+        "SPIP ne connait pas les Charsets disponibles sur le serveur $serveur. Le serveur choisira seul."
146
+    );
147
+
148
+    return false;
149 149
 }
150 150
 
151 151
 
@@ -171,12 +171,12 @@  discard block
 block discarded – undo
171 171
  *    Retourne true si elle reussie.
172 172
  **/
173 173
 function sql_set_charset($charset, $serveur = '', $option = true) {
174
-	$f = sql_serveur('set_charset', $serveur, $option === 'continue' || $option === false);
175
-	if (!is_string($f) || !$f) {
176
-		return false;
177
-	}
174
+    $f = sql_serveur('set_charset', $serveur, $option === 'continue' || $option === false);
175
+    if (!is_string($f) || !$f) {
176
+        return false;
177
+    }
178 178
 
179
-	return $f($charset, $serveur, $option !== false);
179
+    return $f($charset, $serveur, $option !== false);
180 180
 }
181 181
 
182 182
 
@@ -227,59 +227,59 @@  discard block
 block discarded – undo
227 227
  *
228 228
  **/
229 229
 function sql_select(
230
-	$select = [],
231
-	$from = [],
232
-	$where = [],
233
-	$groupby = [],
234
-	$orderby = [],
235
-	$limit = '',
236
-	$having = [],
237
-	$serveur = '',
238
-	$option = true
230
+    $select = [],
231
+    $from = [],
232
+    $where = [],
233
+    $groupby = [],
234
+    $orderby = [],
235
+    $limit = '',
236
+    $having = [],
237
+    $serveur = '',
238
+    $option = true
239 239
 ) {
240
-	$f = sql_serveur('select', $serveur, $option === 'continue' || $option === false);
241
-	if (!is_string($f) || !$f) {
242
-		return false;
243
-	}
244
-
245
-	$debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug');
246
-	if ($option !== false && !$debug) {
247
-		$res = $f(
248
-			$select,
249
-			$from,
250
-			$where,
251
-			$groupby,
252
-			$orderby,
253
-			$limit,
254
-			$having,
255
-			$serveur,
256
-			is_array($option) ? true : $option
257
-		);
258
-	} else {
259
-		$query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
260
-		if (!$option) {
261
-			return $query;
262
-		}
263
-		// le debug, c'est pour ce qui a ete produit par le compilateur
264
-		if (isset($GLOBALS['debug']['aucasou'])) {
265
-			[$table, $id, ] = $GLOBALS['debug']['aucasou'];
266
-			$nom = $GLOBALS['debug_objets']['courant'] . $id;
267
-			$GLOBALS['debug_objets']['requete'][$nom] = $query;
268
-		}
269
-		$res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true);
270
-	}
271
-
272
-	// en cas d'erreur
273
-	if (!is_string($res)) {
274
-		return $res;
275
-	}
276
-	// denoncer l'erreur SQL dans sa version brute
277
-	spip_sql_erreur($serveur);
278
-	// idem dans sa version squelette (prefixe des tables non substitue)
279
-	$contexte_compil = sql_error_backtrace(true);
280
-	erreur_squelette([sql_errno($serveur), sql_error($serveur), $res], $contexte_compil);
281
-
282
-	return false;
240
+    $f = sql_serveur('select', $serveur, $option === 'continue' || $option === false);
241
+    if (!is_string($f) || !$f) {
242
+        return false;
243
+    }
244
+
245
+    $debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug');
246
+    if ($option !== false && !$debug) {
247
+        $res = $f(
248
+            $select,
249
+            $from,
250
+            $where,
251
+            $groupby,
252
+            $orderby,
253
+            $limit,
254
+            $having,
255
+            $serveur,
256
+            is_array($option) ? true : $option
257
+        );
258
+    } else {
259
+        $query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
260
+        if (!$option) {
261
+            return $query;
262
+        }
263
+        // le debug, c'est pour ce qui a ete produit par le compilateur
264
+        if (isset($GLOBALS['debug']['aucasou'])) {
265
+            [$table, $id, ] = $GLOBALS['debug']['aucasou'];
266
+            $nom = $GLOBALS['debug_objets']['courant'] . $id;
267
+            $GLOBALS['debug_objets']['requete'][$nom] = $query;
268
+        }
269
+        $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true);
270
+    }
271
+
272
+    // en cas d'erreur
273
+    if (!is_string($res)) {
274
+        return $res;
275
+    }
276
+    // denoncer l'erreur SQL dans sa version brute
277
+    spip_sql_erreur($serveur);
278
+    // idem dans sa version squelette (prefixe des tables non substitue)
279
+    $contexte_compil = sql_error_backtrace(true);
280
+    erreur_squelette([sql_errno($serveur), sql_error($serveur), $res], $contexte_compil);
281
+
282
+    return false;
283 283
 }
284 284
 
285 285
 
@@ -316,16 +316,16 @@  discard block
 block discarded – undo
316 316
  *
317 317
  **/
318 318
 function sql_get_select(
319
-	$select = [],
320
-	$from = [],
321
-	$where = [],
322
-	$groupby = [],
323
-	$orderby = [],
324
-	$limit = '',
325
-	$having = [],
326
-	$serveur = ''
319
+    $select = [],
320
+    $from = [],
321
+    $where = [],
322
+    $groupby = [],
323
+    $orderby = [],
324
+    $limit = '',
325
+    $having = [],
326
+    $serveur = ''
327 327
 ) {
328
-	return sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
328
+    return sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
329 329
 }
330 330
 
331 331
 
@@ -369,23 +369,23 @@  discard block
 block discarded – undo
369 369
  *
370 370
  **/
371 371
 function sql_countsel(
372
-	$from = [],
373
-	$where = [],
374
-	$groupby = [],
375
-	$having = [],
376
-	$serveur = '',
377
-	$option = true
372
+    $from = [],
373
+    $where = [],
374
+    $groupby = [],
375
+    $having = [],
376
+    $serveur = '',
377
+    $option = true
378 378
 ) {
379
-	$f = sql_serveur('countsel', $serveur, $option === 'continue' || $option === false);
380
-	if (!is_string($f) || !$f) {
381
-		return false;
382
-	}
383
-	$r = $f($from, $where, $groupby, $having, $serveur, $option !== false);
384
-	if ($r === false) {
385
-		spip_sql_erreur($serveur);
386
-	}
387
-
388
-	return $r;
379
+    $f = sql_serveur('countsel', $serveur, $option === 'continue' || $option === false);
380
+    if (!is_string($f) || !$f) {
381
+        return false;
382
+    }
383
+    $r = $f($from, $where, $groupby, $having, $serveur, $option !== false);
384
+    if ($r === false) {
385
+        spip_sql_erreur($serveur);
386
+    }
387
+
388
+    return $r;
389 389
 }
390 390
 
391 391
 /**
@@ -417,16 +417,16 @@  discard block
 block discarded – undo
417 417
  *     Ce retour n'est pas pertinent pour savoir si l'opération est correctement réalisée.
418 418
  **/
419 419
 function sql_alter($q, $serveur = '', $option = true) {
420
-	$f = sql_serveur('alter', $serveur, $option === 'continue' || $option === false);
421
-	if (!is_string($f) || !$f) {
422
-		return false;
423
-	}
424
-	$r = $f($q, $serveur, $option !== false);
425
-	if ($r === false) {
426
-		spip_sql_erreur($serveur);
427
-	}
428
-
429
-	return $r;
420
+    $f = sql_serveur('alter', $serveur, $option === 'continue' || $option === false);
421
+    if (!is_string($f) || !$f) {
422
+        return false;
423
+    }
424
+    $r = $f($q, $serveur, $option !== false);
425
+    if ($r === false) {
426
+        spip_sql_erreur($serveur);
427
+    }
428
+
429
+    return $r;
430 430
 }
431 431
 
432 432
 /**
@@ -449,12 +449,12 @@  discard block
 block discarded – undo
449 449
  *    presentant une ligne de resultat d'une selection
450 450
  */
451 451
 function sql_fetch(mixed $res, $serveur = '', $option = true) {
452
-	$f = sql_serveur('fetch', $serveur, $option === 'continue' || $option === false);
453
-	if (!is_string($f) || !$f) {
454
-		return false;
455
-	}
452
+    $f = sql_serveur('fetch', $serveur, $option === 'continue' || $option === false);
453
+    if (!is_string($f) || !$f) {
454
+        return false;
455
+    }
456 456
 
457
-	return $f($res, null, $serveur, $option !== false);
457
+    return $f($res, null, $serveur, $option !== false);
458 458
 }
459 459
 
460 460
 
@@ -481,20 +481,20 @@  discard block
 block discarded – undo
481 481
  *    presentant une ligne de resultat d'une selection
482 482
  */
483 483
 function sql_fetch_all(mixed $res, $serveur = '', $option = true) {
484
-	$rows = [];
485
-	if (!$res) {
486
-		return $rows;
487
-	}
488
-	$f = sql_serveur('fetch', $serveur, $option === 'continue' || $option === false);
489
-	if (!is_string($f) || !$f) {
490
-		return [];
491
-	}
492
-	while ($r = $f($res, null, $serveur, $option !== false)) {
493
-		$rows[] = $r;
494
-	}
495
-	sql_free($res, $serveur);
496
-
497
-	return $rows;
484
+    $rows = [];
485
+    if (!$res) {
486
+        return $rows;
487
+    }
488
+    $f = sql_serveur('fetch', $serveur, $option === 'continue' || $option === false);
489
+    if (!is_string($f) || !$f) {
490
+        return [];
491
+    }
492
+    while ($r = $f($res, null, $serveur, $option !== false)) {
493
+        $rows[] = $r;
494
+    }
495
+    sql_free($res, $serveur);
496
+
497
+    return $rows;
498 498
 }
499 499
 
500 500
 /**
@@ -522,16 +522,16 @@  discard block
 block discarded – undo
522 522
  *    Operation effectuée (true), sinon false.
523 523
  **/
524 524
 function sql_seek(mixed $res, $row_number, $serveur = '', $option = true) {
525
-	$f = sql_serveur('seek', $serveur, $option === 'continue' || $option === false);
526
-	if (!is_string($f) || !$f) {
527
-		return false;
528
-	}
529
-	$r = $f($res, $row_number, $serveur, $option !== false);
530
-	if ($r === false) {
531
-		spip_sql_erreur($serveur);
532
-	}
533
-
534
-	return $r;
525
+    $f = sql_serveur('seek', $serveur, $option === 'continue' || $option === false);
526
+    if (!is_string($f) || !$f) {
527
+        return false;
528
+    }
529
+    $r = $f($res, $row_number, $serveur, $option !== false);
530
+    if ($r === false) {
531
+        spip_sql_erreur($serveur);
532
+    }
533
+
534
+    return $r;
535 535
 }
536 536
 
537 537
 
@@ -556,16 +556,16 @@  discard block
 block discarded – undo
556 556
  *    False en cas d'erreur.
557 557
  **/
558 558
 function sql_listdbs($serveur = '', $option = true) {
559
-	$f = sql_serveur('listdbs', $serveur, $option === 'continue' || $option === false);
560
-	if (!is_string($f) || !$f) {
561
-		return false;
562
-	}
563
-	$r = $f($serveur);
564
-	if ($r === false) {
565
-		spip_sql_erreur($serveur);
566
-	}
567
-
568
-	return $r;
559
+    $f = sql_serveur('listdbs', $serveur, $option === 'continue' || $option === false);
560
+    if (!is_string($f) || !$f) {
561
+        return false;
562
+    }
563
+    $r = $f($serveur);
564
+    if ($r === false) {
565
+        spip_sql_erreur($serveur);
566
+    }
567
+
568
+    return $r;
569 569
 }
570 570
 
571 571
 
@@ -588,16 +588,16 @@  discard block
 block discarded – undo
588 588
  *     - False en cas d'erreur.
589 589
  **/
590 590
 function sql_selectdb($nom, $serveur = '', $option = true) {
591
-	$f = sql_serveur('selectdb', $serveur, $option === 'continue' || $option === false);
592
-	if (!is_string($f) || !$f) {
593
-		return false;
594
-	}
595
-	$r = $f($nom, $serveur, $option !== false);
596
-	if ($r === false) {
597
-		spip_sql_erreur($serveur);
598
-	}
599
-
600
-	return $r;
591
+    $f = sql_serveur('selectdb', $serveur, $option === 'continue' || $option === false);
592
+    if (!is_string($f) || !$f) {
593
+        return false;
594
+    }
595
+    $r = $f($nom, $serveur, $option !== false);
596
+    if ($r === false) {
597
+        spip_sql_erreur($serveur);
598
+    }
599
+
600
+    return $r;
601 601
 }
602 602
 
603 603
 /**
@@ -622,16 +622,16 @@  discard block
 block discarded – undo
622 622
  *     - false en cas d'erreur.
623 623
  **/
624 624
 function sql_count($res, $serveur = '', $option = true) {
625
-	$f = sql_serveur('count', $serveur, $option === 'continue' || $option === false);
626
-	if (!is_string($f) || !$f) {
627
-		return false;
628
-	}
629
-	$r = $f($res, $serveur, $option !== false);
630
-	if ($r === false) {
631
-		spip_sql_erreur($serveur);
632
-	}
633
-
634
-	return $r;
625
+    $f = sql_serveur('count', $serveur, $option === 'continue' || $option === false);
626
+    if (!is_string($f) || !$f) {
627
+        return false;
628
+    }
629
+    $r = $f($res, $serveur, $option !== false);
630
+    if ($r === false) {
631
+        spip_sql_erreur($serveur);
632
+    }
633
+
634
+    return $r;
635 635
 }
636 636
 
637 637
 /**
@@ -653,12 +653,12 @@  discard block
 block discarded – undo
653 653
  *     True si réussi
654 654
  */
655 655
 function sql_free($res, $serveur = '', $option = true) {
656
-	$f = sql_serveur('free', $serveur, $option === 'continue' || $option === false);
657
-	if (!is_string($f) || !$f) {
658
-		return false;
659
-	}
656
+    $f = sql_serveur('free', $serveur, $option === 'continue' || $option === false);
657
+    if (!is_string($f) || !$f) {
658
+        return false;
659
+    }
660 660
 
661
-	return $f($res);
661
+    return $f($res);
662 662
 }
663 663
 
664 664
 
@@ -696,17 +696,17 @@  discard block
 block discarded – undo
696 696
  *     - False en cas d'erreur.
697 697
  **/
698 698
 function sql_insert($table, $noms, $valeurs, $desc = [], $serveur = '', $option = true) {
699
-	$f = sql_serveur('insert', $serveur, $option === 'continue' || $option === false);
700
-	if (!is_string($f) || !$f) {
701
-		return false;
702
-	}
703
-	$r = $f($table, $noms, $valeurs, $desc, $serveur, $option !== false);
704
-	if ($r === false || $r === null) {
705
-		spip_sql_erreur($serveur);
706
-		$r = false;
707
-	}
708
-
709
-	return $r;
699
+    $f = sql_serveur('insert', $serveur, $option === 'continue' || $option === false);
700
+    if (!is_string($f) || !$f) {
701
+        return false;
702
+    }
703
+    $r = $f($table, $noms, $valeurs, $desc, $serveur, $option !== false);
704
+    if ($r === false || $r === null) {
705
+        spip_sql_erreur($serveur);
706
+        $r = false;
707
+    }
708
+
709
+    return $r;
710 710
 }
711 711
 
712 712
 /**
@@ -747,17 +747,17 @@  discard block
 block discarded – undo
747 747
  *     - False en cas d'erreur.
748 748
  **/
749 749
 function sql_insertq($table, $couples = [], $desc = [], $serveur = '', $option = true) {
750
-	$f = sql_serveur('insertq', $serveur, $option === 'continue' || $option === false);
751
-	if (!is_string($f) || !$f) {
752
-		return false;
753
-	}
754
-	$r = $f($table, $couples, $desc, $serveur, $option !== false);
755
-	if ($r === false || $r === null) {
756
-		spip_sql_erreur($serveur);
757
-		$r = false;
758
-	}
759
-
760
-	return $r;
750
+    $f = sql_serveur('insertq', $serveur, $option === 'continue' || $option === false);
751
+    if (!is_string($f) || !$f) {
752
+        return false;
753
+    }
754
+    $r = $f($table, $couples, $desc, $serveur, $option !== false);
755
+    if ($r === false || $r === null) {
756
+        spip_sql_erreur($serveur);
757
+        $r = false;
758
+    }
759
+
760
+    return $r;
761 761
 }
762 762
 
763 763
 /**
@@ -792,17 +792,17 @@  discard block
 block discarded – undo
792 792
  *     - false en cas d'erreur.
793 793
  **/
794 794
 function sql_insertq_multi($table, $couples = [], $desc = [], $serveur = '', $option = true) {
795
-	$f = sql_serveur('insertq_multi', $serveur, $option === 'continue' || $option === false);
796
-	if (!is_string($f) || !$f) {
797
-		return false;
798
-	}
799
-	$r = $f($table, $couples, $desc, $serveur, $option !== false);
800
-	if ($r === false || $r === null) {
801
-		spip_sql_erreur($serveur);
802
-		$r = false;
803
-	}
804
-
805
-	return $r;
795
+    $f = sql_serveur('insertq_multi', $serveur, $option === 'continue' || $option === false);
796
+    if (!is_string($f) || !$f) {
797
+        return false;
798
+    }
799
+    $r = $f($table, $couples, $desc, $serveur, $option !== false);
800
+    if ($r === false || $r === null) {
801
+        spip_sql_erreur($serveur);
802
+        $r = false;
803
+    }
804
+
805
+    return $r;
806 806
 }
807 807
 
808 808
 /**
@@ -842,16 +842,16 @@  discard block
 block discarded – undo
842 842
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
843 843
  */
844 844
 function sql_update($table, $exp, $where = '', $desc = [], $serveur = '', $option = true) {
845
-	$f = sql_serveur('update', $serveur, $option === 'continue' || $option === false);
846
-	if (!is_string($f) || !$f) {
847
-		return false;
848
-	}
849
-	$r = $f($table, $exp, $where, $desc, $serveur, $option !== false);
850
-	if ($r === false) {
851
-		spip_sql_erreur($serveur);
852
-	}
853
-
854
-	return $r;
845
+    $f = sql_serveur('update', $serveur, $option === 'continue' || $option === false);
846
+    if (!is_string($f) || !$f) {
847
+        return false;
848
+    }
849
+    $r = $f($table, $exp, $where, $desc, $serveur, $option !== false);
850
+    if ($r === false) {
851
+        spip_sql_erreur($serveur);
852
+    }
853
+
854
+    return $r;
855 855
 }
856 856
 
857 857
 
@@ -897,16 +897,16 @@  discard block
 block discarded – undo
897 897
  *     - false en cas d'erreur.
898 898
  **/
899 899
 function sql_updateq($table, $exp, $where = '', $desc = [], $serveur = '', $option = true) {
900
-	$f = sql_serveur('updateq', $serveur, $option === 'continue' || $option === false);
901
-	if (!is_string($f) || !$f) {
902
-		return false;
903
-	}
904
-	$r = $f($table, $exp, $where, $desc, $serveur, $option !== false);
905
-	if ($r === false) {
906
-		spip_sql_erreur($serveur);
907
-	}
908
-
909
-	return $r;
900
+    $f = sql_serveur('updateq', $serveur, $option === 'continue' || $option === false);
901
+    if (!is_string($f) || !$f) {
902
+        return false;
903
+    }
904
+    $r = $f($table, $exp, $where, $desc, $serveur, $option !== false);
905
+    if ($r === false) {
906
+        spip_sql_erreur($serveur);
907
+    }
908
+
909
+    return $r;
910 910
 }
911 911
 
912 912
 /**
@@ -937,16 +937,16 @@  discard block
 block discarded – undo
937 937
  *     - false en cas d'erreur.
938 938
  **/
939 939
 function sql_delete($table, $where = '', $serveur = '', $option = true) {
940
-	$f = sql_serveur('delete', $serveur, $option === 'continue' || $option === false);
941
-	if (!is_string($f) || !$f) {
942
-		return false;
943
-	}
944
-	$r = $f($table, $where, $serveur, $option !== false);
945
-	if ($r === false) {
946
-		spip_sql_erreur($serveur);
947
-	}
948
-
949
-	return $r;
940
+    $f = sql_serveur('delete', $serveur, $option === 'continue' || $option === false);
941
+    if (!is_string($f) || !$f) {
942
+        return false;
943
+    }
944
+    $r = $f($table, $where, $serveur, $option !== false);
945
+    if ($r === false) {
946
+        spip_sql_erreur($serveur);
947
+    }
948
+
949
+    return $r;
950 950
 }
951 951
 
952 952
 /**
@@ -982,16 +982,16 @@  discard block
 block discarded – undo
982 982
  *     - false en cas d'erreur.
983 983
  **/
984 984
 function sql_replace($table, $couples, $desc = [], $serveur = '', $option = true) {
985
-	$f = sql_serveur('replace', $serveur, $option === 'continue' || $option === false);
986
-	if (!is_string($f) || !$f) {
987
-		return false;
988
-	}
989
-	$r = $f($table, $couples, $desc, $serveur, $option !== false);
990
-	if ($r === false) {
991
-		spip_sql_erreur($serveur);
992
-	}
993
-
994
-	return $r;
985
+    $f = sql_serveur('replace', $serveur, $option === 'continue' || $option === false);
986
+    if (!is_string($f) || !$f) {
987
+        return false;
988
+    }
989
+    $r = $f($table, $couples, $desc, $serveur, $option !== false);
990
+    if ($r === false) {
991
+        spip_sql_erreur($serveur);
992
+    }
993
+
994
+    return $r;
995 995
 }
996 996
 
997 997
 
@@ -1029,16 +1029,16 @@  discard block
 block discarded – undo
1029 1029
  *     - false en cas d'erreur.
1030 1030
  **/
1031 1031
 function sql_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $option = true) {
1032
-	$f = sql_serveur('replace_multi', $serveur, $option === 'continue' || $option === false);
1033
-	if (!is_string($f) || !$f) {
1034
-		return false;
1035
-	}
1036
-	$r = $f($table, $tab_couples, $desc, $serveur, $option !== false);
1037
-	if ($r === false) {
1038
-		spip_sql_erreur($serveur);
1039
-	}
1040
-
1041
-	return $r;
1032
+    $f = sql_serveur('replace_multi', $serveur, $option === 'continue' || $option === false);
1033
+    if (!is_string($f) || !$f) {
1034
+        return false;
1035
+    }
1036
+    $r = $f($table, $tab_couples, $desc, $serveur, $option !== false);
1037
+    if ($r === false) {
1038
+        spip_sql_erreur($serveur);
1039
+    }
1040
+
1041
+    return $r;
1042 1042
 }
1043 1043
 
1044 1044
 /**
@@ -1066,16 +1066,16 @@  discard block
 block discarded – undo
1066 1066
  *     - false en cas d'erreur.
1067 1067
  **/
1068 1068
 function sql_drop_table($table, $exist = false, $serveur = '', $option = true) {
1069
-	$f = sql_serveur('drop_table', $serveur, $option === 'continue' || $option === false);
1070
-	if (!is_string($f) || !$f) {
1071
-		return false;
1072
-	}
1073
-	$r = $f($table, $exist, $serveur, $option !== false);
1074
-	if ($r === false) {
1075
-		spip_sql_erreur($serveur);
1076
-	}
1077
-
1078
-	return $r;
1069
+    $f = sql_serveur('drop_table', $serveur, $option === 'continue' || $option === false);
1070
+    if (!is_string($f) || !$f) {
1071
+        return false;
1072
+    }
1073
+    $r = $f($table, $exist, $serveur, $option !== false);
1074
+    if ($r === false) {
1075
+        spip_sql_erreur($serveur);
1076
+    }
1077
+
1078
+    return $r;
1079 1079
 }
1080 1080
 
1081 1081
 /**
@@ -1099,16 +1099,16 @@  discard block
 block discarded – undo
1099 1099
  *     - true si la requête a réussie, false sinon
1100 1100
  */
1101 1101
 function sql_drop_view($table, $exist = false, $serveur = '', $option = true) {
1102
-	$f = sql_serveur('drop_view', $serveur, $option === 'continue' || $option === false);
1103
-	if (!is_string($f) || !$f) {
1104
-		return false;
1105
-	}
1106
-	$r = $f($table, $exist, $serveur, $option !== false);
1107
-	if ($r === false) {
1108
-		spip_sql_erreur($serveur);
1109
-	}
1110
-
1111
-	return $r;
1102
+    $f = sql_serveur('drop_view', $serveur, $option === 'continue' || $option === false);
1103
+    if (!is_string($f) || !$f) {
1104
+        return false;
1105
+    }
1106
+    $r = $f($table, $exist, $serveur, $option !== false);
1107
+    if ($r === false) {
1108
+        spip_sql_erreur($serveur);
1109
+    }
1110
+
1111
+    return $r;
1112 1112
 }
1113 1113
 
1114 1114
 /**
@@ -1132,18 +1132,18 @@  discard block
 block discarded – undo
1132 1132
  *     Ressource à utiliser avec sql_fetch()
1133 1133
  **/
1134 1134
 function sql_showbase($spip = null, $serveur = '', $option = true) {
1135
-	$f = sql_serveur('showbase', $serveur, $option === 'continue' || $option === false);
1136
-	if (!is_string($f) || !$f) {
1137
-		return false;
1138
-	}
1139
-
1140
-	// la globale n'est remplie qu'apres l'appel de sql_serveur.
1141
-	if ($spip == null) {
1142
-		$connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1143
-		$spip = $connexion['prefixe'] . '\_%';
1144
-	}
1145
-
1146
-	return $f($spip, $serveur, $option !== false);
1135
+    $f = sql_serveur('showbase', $serveur, $option === 'continue' || $option === false);
1136
+    if (!is_string($f) || !$f) {
1137
+        return false;
1138
+    }
1139
+
1140
+    // la globale n'est remplie qu'apres l'appel de sql_serveur.
1141
+    if ($spip == null) {
1142
+        $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1143
+        $spip = $connexion['prefixe'] . '\_%';
1144
+    }
1145
+
1146
+    return $f($spip, $serveur, $option !== false);
1147 1147
 }
1148 1148
 
1149 1149
 /**
@@ -1166,15 +1166,15 @@  discard block
 block discarded – undo
1166 1166
  *     Liste des tables SQL
1167 1167
  **/
1168 1168
 function sql_alltable($spip = null, $serveur = '', $option = true) {
1169
-	$q = sql_showbase($spip, $serveur, $option);
1170
-	$r = [];
1171
-	if ($q) {
1172
-		while ($t = sql_fetch($q, $serveur)) {
1173
-			$r[] = array_shift($t);
1174
-		}
1175
-	}
1176
-
1177
-	return $r;
1169
+    $q = sql_showbase($spip, $serveur, $option);
1170
+    $r = [];
1171
+    if ($q) {
1172
+        while ($t = sql_fetch($q, $serveur)) {
1173
+            $r[] = array_shift($t);
1174
+        }
1175
+    }
1176
+
1177
+    return $r;
1178 1178
 }
1179 1179
 
1180 1180
 /**
@@ -1207,31 +1207,31 @@  discard block
 block discarded – undo
1207 1207
  *       - 'join' => array() // jointures, si déclarées.
1208 1208
  **/
1209 1209
 function sql_showtable($table, $table_spip = false, $serveur = '', $option = true) {
1210
-	$f = sql_serveur('showtable', $serveur, $option === 'continue' || $option === false);
1211
-	if (!is_string($f) || !$f) {
1212
-		return false;
1213
-	}
1214
-
1215
-	// la globale n'est remplie qu'apres l'appel de sql_serveur.
1216
-	if ($table_spip) {
1217
-		$connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1218
-		$prefixe = $connexion['prefixe'];
1219
-		$vraie_table = prefixer_table_spip($table, $prefixe);
1220
-	} else {
1221
-		$vraie_table = $table;
1222
-	}
1223
-
1224
-	$f = $f($vraie_table, $serveur, $option !== false);
1225
-	if (!$f) {
1226
-		return [];
1227
-	}
1228
-	if (isset($GLOBALS['tables_principales'][$table]['join'])) {
1229
-		$f['join'] = $GLOBALS['tables_principales'][$table]['join'];
1230
-	} elseif (isset($GLOBALS['tables_auxiliaires'][$table]['join'])) {
1231
-		$f['join'] = $GLOBALS['tables_auxiliaires'][$table]['join'];
1232
-	}
1233
-
1234
-	return $f;
1210
+    $f = sql_serveur('showtable', $serveur, $option === 'continue' || $option === false);
1211
+    if (!is_string($f) || !$f) {
1212
+        return false;
1213
+    }
1214
+
1215
+    // la globale n'est remplie qu'apres l'appel de sql_serveur.
1216
+    if ($table_spip) {
1217
+        $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1218
+        $prefixe = $connexion['prefixe'];
1219
+        $vraie_table = prefixer_table_spip($table, $prefixe);
1220
+    } else {
1221
+        $vraie_table = $table;
1222
+    }
1223
+
1224
+    $f = $f($vraie_table, $serveur, $option !== false);
1225
+    if (!$f) {
1226
+        return [];
1227
+    }
1228
+    if (isset($GLOBALS['tables_principales'][$table]['join'])) {
1229
+        $f['join'] = $GLOBALS['tables_principales'][$table]['join'];
1230
+    } elseif (isset($GLOBALS['tables_auxiliaires'][$table]['join'])) {
1231
+        $f['join'] = $GLOBALS['tables_auxiliaires'][$table]['join'];
1232
+    }
1233
+
1234
+    return $f;
1235 1235
 }
1236 1236
 
1237 1237
 
@@ -1258,21 +1258,21 @@  discard block
 block discarded – undo
1258 1258
  *     - false en cas d'erreur.
1259 1259
  **/
1260 1260
 function sql_table_exists(string $table, bool $table_spip = true, $serveur = '', $option = true) {
1261
-	$f = sql_serveur('table_exists', $serveur, $option === 'continue' || $option === false);
1262
-	if (!is_string($f) || !$f) {
1263
-		return false;
1264
-	}
1265
-
1266
-	// la globale n'est remplie qu'apres l'appel de sql_serveur.
1267
-	if ($table_spip) {
1268
-		$connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1269
-		$prefixe = $connexion['prefixe'];
1270
-		$vraie_table = prefixer_table_spip($table, $prefixe);
1271
-	} else {
1272
-		$vraie_table = $table;
1273
-	}
1274
-
1275
-	return $f($vraie_table, $serveur, $option !== false);
1261
+    $f = sql_serveur('table_exists', $serveur, $option === 'continue' || $option === false);
1262
+    if (!is_string($f) || !$f) {
1263
+        return false;
1264
+    }
1265
+
1266
+    // la globale n'est remplie qu'apres l'appel de sql_serveur.
1267
+    if ($table_spip) {
1268
+        $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1269
+        $prefixe = $connexion['prefixe'];
1270
+        $vraie_table = prefixer_table_spip($table, $prefixe);
1271
+    } else {
1272
+        $vraie_table = $table;
1273
+    }
1274
+
1275
+    return $f($vraie_table, $serveur, $option !== false);
1276 1276
 }
1277 1277
 
1278 1278
 
@@ -1318,24 +1318,24 @@  discard block
 block discarded – undo
1318 1318
  *     true si succès, false en cas d'echec
1319 1319
  **/
1320 1320
 function sql_create(
1321
-	$nom,
1322
-	$champs,
1323
-	$cles = [],
1324
-	$autoinc = false,
1325
-	$temporary = false,
1326
-	$serveur = '',
1327
-	$option = true
1321
+    $nom,
1322
+    $champs,
1323
+    $cles = [],
1324
+    $autoinc = false,
1325
+    $temporary = false,
1326
+    $serveur = '',
1327
+    $option = true
1328 1328
 ) {
1329
-	$f = sql_serveur('create', $serveur, $option === 'continue' || $option === false);
1330
-	if (!is_string($f) || !$f) {
1331
-		return false;
1332
-	}
1333
-	$r = $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option !== false);
1334
-	if ($r === false) {
1335
-		spip_sql_erreur($serveur);
1336
-	}
1337
-
1338
-	return $r;
1329
+    $f = sql_serveur('create', $serveur, $option === 'continue' || $option === false);
1330
+    if (!is_string($f) || !$f) {
1331
+        return false;
1332
+    }
1333
+    $r = $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option !== false);
1334
+    if ($r === false) {
1335
+        spip_sql_erreur($serveur);
1336
+    }
1337
+
1338
+    return $r;
1339 1339
 }
1340 1340
 
1341 1341
 /**
@@ -1353,16 +1353,16 @@  discard block
 block discarded – undo
1353 1353
  * @return bool true si la base est créee.
1354 1354
  **/
1355 1355
 function sql_create_base($nom, $serveur = '', $option = true) {
1356
-	$f = sql_serveur('create_base', $serveur, $option === 'continue' || $option === false);
1357
-	if (!is_string($f) || !$f) {
1358
-		return false;
1359
-	}
1360
-	$r = $f($nom, $serveur, $option !== false);
1361
-	if ($r === false) {
1362
-		spip_sql_erreur($serveur);
1363
-	}
1364
-
1365
-	return $r;
1356
+    $f = sql_serveur('create_base', $serveur, $option === 'continue' || $option === false);
1357
+    if (!is_string($f) || !$f) {
1358
+        return false;
1359
+    }
1360
+    $r = $f($nom, $serveur, $option !== false);
1361
+    if ($r === false) {
1362
+        spip_sql_erreur($serveur);
1363
+    }
1364
+
1365
+    return $r;
1366 1366
 }
1367 1367
 
1368 1368
 
@@ -1392,16 +1392,16 @@  discard block
 block discarded – undo
1392 1392
  *     - false en cas d'échec.
1393 1393
  **/
1394 1394
 function sql_create_view($nom, $select_query, $serveur = '', $option = true) {
1395
-	$f = sql_serveur('create_view', $serveur, $option === 'continue' || $option === false);
1396
-	if (!is_string($f) || !$f) {
1397
-		return false;
1398
-	}
1399
-	$r = $f($nom, $select_query, $serveur, $option !== false);
1400
-	if ($r === false) {
1401
-		spip_sql_erreur($serveur);
1402
-	}
1403
-
1404
-	return $r;
1395
+    $f = sql_serveur('create_view', $serveur, $option === 'continue' || $option === false);
1396
+    if (!is_string($f) || !$f) {
1397
+        return false;
1398
+    }
1399
+    $r = $f($nom, $select_query, $serveur, $option !== false);
1400
+    if ($r === false) {
1401
+        spip_sql_erreur($serveur);
1402
+    }
1403
+
1404
+    return $r;
1405 1405
 }
1406 1406
 
1407 1407
 /**
@@ -1430,12 +1430,12 @@  discard block
 block discarded – undo
1430 1430
  *     texte de sélection pour la requête
1431 1431
  */
1432 1432
 function sql_multi($sel, $lang, $serveur = '', $option = true) {
1433
-	$f = sql_serveur('multi', $serveur, $option === 'continue' || $option === false);
1434
-	if (!is_string($f) || !$f) {
1435
-		return false;
1436
-	}
1433
+    $f = sql_serveur('multi', $serveur, $option === 'continue' || $option === false);
1434
+    if (!is_string($f) || !$f) {
1435
+        return false;
1436
+    }
1437 1437
 
1438
-	return $f($sel, $lang);
1438
+    return $f($sel, $lang);
1439 1439
 }
1440 1440
 
1441 1441
 
@@ -1450,12 +1450,12 @@  discard block
 block discarded – undo
1450 1450
  *      False si le serveur est indisponible
1451 1451
  */
1452 1452
 function sql_error($serveur = '') {
1453
-	$f = sql_serveur('error', $serveur, true);
1454
-	if (!is_string($f) || !$f) {
1455
-		return false;
1456
-	}
1453
+    $f = sql_serveur('error', $serveur, true);
1454
+    if (!is_string($f) || !$f) {
1455
+        return false;
1456
+    }
1457 1457
 
1458
-	return $f('query inconnue', $serveur);
1458
+    return $f('query inconnue', $serveur);
1459 1459
 }
1460 1460
 
1461 1461
 /**
@@ -1469,12 +1469,12 @@  discard block
 block discarded – undo
1469 1469
  *      False si le serveur est indisponible
1470 1470
  */
1471 1471
 function sql_errno($serveur = '') {
1472
-	$f = sql_serveur('errno', $serveur, true);
1473
-	if (!is_string($f) || !$f) {
1474
-		return false;
1475
-	}
1472
+    $f = sql_serveur('errno', $serveur, true);
1473
+    if (!is_string($f) || !$f) {
1474
+        return false;
1475
+    }
1476 1476
 
1477
-	return $f($serveur);
1477
+    return $f($serveur);
1478 1478
 }
1479 1479
 
1480 1480
 /**
@@ -1492,16 +1492,16 @@  discard block
 block discarded – undo
1492 1492
  * @return array|false   Tableau de l'explication
1493 1493
  */
1494 1494
 function sql_explain($q, $serveur = '', $option = true) {
1495
-	$f = sql_serveur('explain', $serveur, true);
1496
-	if (!is_string($f) || !$f) {
1497
-		return false;
1498
-	}
1499
-	$r = $f($q, $serveur, $option !== false);
1500
-	if ($r === false) {
1501
-		spip_sql_erreur($serveur);
1502
-	}
1503
-
1504
-	return $r;
1495
+    $f = sql_serveur('explain', $serveur, true);
1496
+    if (!is_string($f) || !$f) {
1497
+        return false;
1498
+    }
1499
+    $r = $f($q, $serveur, $option !== false);
1500
+    if ($r === false) {
1501
+        spip_sql_erreur($serveur);
1502
+    }
1503
+
1504
+    return $r;
1505 1505
 }
1506 1506
 
1507 1507
 /**
@@ -1519,16 +1519,16 @@  discard block
 block discarded – undo
1519 1519
  * @return bool            Toujours true
1520 1520
  */
1521 1521
 function sql_optimize($table, $serveur = '', $option = true) {
1522
-	$f = sql_serveur('optimize', $serveur, $option === 'continue' || $option === false);
1523
-	if (!is_string($f) || !$f) {
1524
-		return false;
1525
-	}
1526
-	$r = $f($table, $serveur, $option);
1527
-	if ($r === false) {
1528
-		spip_sql_erreur($serveur);
1529
-	}
1530
-
1531
-	return $r;
1522
+    $f = sql_serveur('optimize', $serveur, $option === 'continue' || $option === false);
1523
+    if (!is_string($f) || !$f) {
1524
+        return false;
1525
+    }
1526
+    $r = $f($table, $serveur, $option);
1527
+    if ($r === false) {
1528
+        spip_sql_erreur($serveur);
1529
+    }
1530
+
1531
+    return $r;
1532 1532
 }
1533 1533
 
1534 1534
 /**
@@ -1548,16 +1548,16 @@  discard block
 block discarded – undo
1548 1548
  *     - true si la requête a réussie, false sinon
1549 1549
  */
1550 1550
 function sql_repair($table, $serveur = '', $option = true) {
1551
-	$f = sql_serveur('repair', $serveur, $option === 'continue' || $option === false);
1552
-	if (!is_string($f) || !$f) {
1553
-		return false;
1554
-	}
1555
-	$r = $f($table, $serveur, $option !== false);
1556
-	if ($r === false) {
1557
-		spip_sql_erreur($serveur);
1558
-	}
1559
-
1560
-	return $r;
1551
+    $f = sql_serveur('repair', $serveur, $option === 'continue' || $option === false);
1552
+    if (!is_string($f) || !$f) {
1553
+        return false;
1554
+    }
1555
+    $r = $f($table, $serveur, $option !== false);
1556
+    if ($r === false) {
1557
+        spip_sql_erreur($serveur);
1558
+    }
1559
+
1560
+    return $r;
1561 1561
 }
1562 1562
 
1563 1563
 
@@ -1582,16 +1582,16 @@  discard block
 block discarded – undo
1582 1582
  *     - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1583 1583
  */
1584 1584
 function sql_query($ins, $serveur = '', $option = true) {
1585
-	$f = sql_serveur('query', $serveur, $option === 'continue' || $option === false);
1586
-	if (!is_string($f) || !$f) {
1587
-		return false;
1588
-	}
1589
-	$r = $f($ins, $serveur, $option !== false);
1590
-	if ($r === false) {
1591
-		spip_sql_erreur($serveur);
1592
-	}
1593
-
1594
-	return $r;
1585
+    $f = sql_serveur('query', $serveur, $option === 'continue' || $option === false);
1586
+    if (!is_string($f) || !$f) {
1587
+        return false;
1588
+    }
1589
+    $r = $f($ins, $serveur, $option !== false);
1590
+    if ($r === false) {
1591
+        spip_sql_erreur($serveur);
1592
+    }
1593
+
1594
+    return $r;
1595 1595
 }
1596 1596
 
1597 1597
 /**
@@ -1639,27 +1639,27 @@  discard block
 block discarded – undo
1639 1639
  *
1640 1640
  **/
1641 1641
 function sql_fetsel(
1642
-	$select = [],
1643
-	$from = [],
1644
-	$where = [],
1645
-	$groupby = [],
1646
-	$orderby = [],
1647
-	$limit = '',
1648
-	$having = [],
1649
-	$serveur = '',
1650
-	$option = true
1642
+    $select = [],
1643
+    $from = [],
1644
+    $where = [],
1645
+    $groupby = [],
1646
+    $orderby = [],
1647
+    $limit = '',
1648
+    $having = [],
1649
+    $serveur = '',
1650
+    $option = true
1651 1651
 ) {
1652
-	$q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1653
-	if ($option === false) {
1654
-		return $q;
1655
-	}
1656
-	if (!$q) {
1657
-		return [];
1658
-	}
1659
-	$r = sql_fetch($q, $serveur, $option);
1660
-	sql_free($q, $serveur, $option);
1661
-
1662
-	return $r;
1652
+    $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1653
+    if ($option === false) {
1654
+        return $q;
1655
+    }
1656
+    if (!$q) {
1657
+        return [];
1658
+    }
1659
+    $r = sql_fetch($q, $serveur, $option);
1660
+    sql_free($q, $serveur, $option);
1661
+
1662
+    return $r;
1663 1663
 }
1664 1664
 
1665 1665
 
@@ -1716,22 +1716,22 @@  discard block
 block discarded – undo
1716 1716
  *
1717 1717
  **/
1718 1718
 function sql_allfetsel(
1719
-	$select = [],
1720
-	$from = [],
1721
-	$where = [],
1722
-	$groupby = [],
1723
-	$orderby = [],
1724
-	$limit = '',
1725
-	$having = [],
1726
-	$serveur = '',
1727
-	$option = true
1719
+    $select = [],
1720
+    $from = [],
1721
+    $where = [],
1722
+    $groupby = [],
1723
+    $orderby = [],
1724
+    $limit = '',
1725
+    $having = [],
1726
+    $serveur = '',
1727
+    $option = true
1728 1728
 ) {
1729
-	$q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1730
-	if ($option === false) {
1731
-		return $q;
1732
-	}
1729
+    $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1730
+    if ($option === false) {
1731
+        return $q;
1732
+    }
1733 1733
 
1734
-	return sql_fetch_all($q, $serveur, $option);
1734
+    return sql_fetch_all($q, $serveur, $option);
1735 1735
 }
1736 1736
 
1737 1737
 
@@ -1778,33 +1778,33 @@  discard block
 block discarded – undo
1778 1778
  *
1779 1779
  **/
1780 1780
 function sql_getfetsel(
1781
-	$select,
1782
-	$from = [],
1783
-	$where = [],
1784
-	$groupby = [],
1785
-	$orderby = [],
1786
-	$limit = '',
1787
-	$having = [],
1788
-	$serveur = '',
1789
-	$option = true
1781
+    $select,
1782
+    $from = [],
1783
+    $where = [],
1784
+    $groupby = [],
1785
+    $orderby = [],
1786
+    $limit = '',
1787
+    $having = [],
1788
+    $serveur = '',
1789
+    $option = true
1790 1790
 ) {
1791
-	if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) {
1792
-		$id = $c[1];
1793
-	} elseif (!preg_match('/\W/', $select)) {
1794
-		$id = $select;
1795
-	} else {
1796
-		$id = 'n';
1797
-		$select .= ' AS n';
1798
-	}
1799
-	$r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1800
-	if ($option === false) {
1801
-		return $r;
1802
-	}
1803
-	if (!$r) {
1804
-		return null;
1805
-	}
1806
-
1807
-	return $r[$id];
1791
+    if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) {
1792
+        $id = $c[1];
1793
+    } elseif (!preg_match('/\W/', $select)) {
1794
+        $id = $select;
1795
+    } else {
1796
+        $id = 'n';
1797
+        $select .= ' AS n';
1798
+    }
1799
+    $r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
1800
+    if ($option === false) {
1801
+        return $r;
1802
+    }
1803
+    if (!$r) {
1804
+        return null;
1805
+    }
1806
+
1807
+    return $r[$id];
1808 1808
 }
1809 1809
 
1810 1810
 /**
@@ -1822,9 +1822,9 @@  discard block
 block discarded – undo
1822 1822
  *    Numero de version du serveur SQL
1823 1823
  **/
1824 1824
 function sql_version($serveur = '', $option = true) {
1825
-	$row = sql_fetsel('version() AS n', '', '', '', '', '', '', $serveur);
1825
+    $row = sql_fetsel('version() AS n', '', '', '', '', '', '', $serveur);
1826 1826
 
1827
-	return ($row['n']);
1827
+    return ($row['n']);
1828 1828
 }
1829 1829
 
1830 1830
 /**
@@ -1860,16 +1860,16 @@  discard block
 block discarded – undo
1860 1860
  *    Le serveur SQL prefere t'il des transactions pour les insertions multiples ?
1861 1861
  **/
1862 1862
 function sql_preferer_transaction($serveur = '', $option = true) {
1863
-	$f = sql_serveur('preferer_transaction', $serveur, true);
1864
-	if (!is_string($f) || !$f) {
1865
-		return false;
1866
-	}
1867
-	$r = $f($serveur, $option !== false);
1868
-	if ($r === false) {
1869
-		spip_sql_erreur($serveur);
1870
-	}
1871
-
1872
-	return $r;
1863
+    $f = sql_serveur('preferer_transaction', $serveur, true);
1864
+    if (!is_string($f) || !$f) {
1865
+        return false;
1866
+    }
1867
+    $r = $f($serveur, $option !== false);
1868
+    if ($r === false) {
1869
+        spip_sql_erreur($serveur);
1870
+    }
1871
+
1872
+    return $r;
1873 1873
 }
1874 1874
 
1875 1875
 ;
@@ -1894,16 +1894,16 @@  discard block
 block discarded – undo
1894 1894
  *      false en cas d'erreur
1895 1895
  **/
1896 1896
 function sql_demarrer_transaction($serveur = '', $option = true) {
1897
-	$f = sql_serveur('demarrer_transaction', $serveur, true);
1898
-	if (!is_string($f) || !$f) {
1899
-		return false;
1900
-	}
1901
-	$r = $f($serveur, $option !== false);
1902
-	if ($r === false) {
1903
-		spip_sql_erreur($serveur);
1904
-	}
1905
-
1906
-	return $r;
1897
+    $f = sql_serveur('demarrer_transaction', $serveur, true);
1898
+    if (!is_string($f) || !$f) {
1899
+        return false;
1900
+    }
1901
+    $r = $f($serveur, $option !== false);
1902
+    if ($r === false) {
1903
+        spip_sql_erreur($serveur);
1904
+    }
1905
+
1906
+    return $r;
1907 1907
 }
1908 1908
 
1909 1909
 ;
@@ -1928,16 +1928,16 @@  discard block
 block discarded – undo
1928 1928
  *      false en cas d'erreur
1929 1929
  **/
1930 1930
 function sql_terminer_transaction($serveur = '', $option = true) {
1931
-	$f = sql_serveur('terminer_transaction', $serveur, true);
1932
-	if (!is_string($f) || !$f) {
1933
-		return false;
1934
-	}
1935
-	$r = $f($serveur, $option !== false);
1936
-	if ($r === false) {
1937
-		spip_sql_erreur($serveur);
1938
-	}
1939
-
1940
-	return $r;
1931
+    $f = sql_serveur('terminer_transaction', $serveur, true);
1932
+    if (!is_string($f) || !$f) {
1933
+        return false;
1934
+    }
1935
+    $r = $f($serveur, $option !== false);
1936
+    if ($r === false) {
1937
+        spip_sql_erreur($serveur);
1938
+    }
1939
+
1940
+    return $r;
1941 1941
 }
1942 1942
 
1943 1943
 ;
@@ -1964,12 +1964,12 @@  discard block
 block discarded – undo
1964 1964
  *     Valeur hexadécimale attendue par le serveur SQL
1965 1965
  **/
1966 1966
 function sql_hex($val, $serveur = '', $option = true) {
1967
-	$f = sql_serveur('hex', $serveur, $option === 'continue' || $option === false);
1968
-	if (!is_string($f) || !$f) {
1969
-		return false;
1970
-	}
1967
+    $f = sql_serveur('hex', $serveur, $option === 'continue' || $option === false);
1968
+    if (!is_string($f) || !$f) {
1969
+        return false;
1970
+    }
1971 1971
 
1972
-	return $f($val);
1972
+    return $f($val);
1973 1973
 }
1974 1974
 
1975 1975
 /**
@@ -1995,12 +1995,12 @@  discard block
 block discarded – undo
1995 1995
  *     La chaine echappee
1996 1996
  **/
1997 1997
 function sql_quote($val, $serveur = '', $type = '') {
1998
-	$f = sql_serveur('quote', $serveur, true);
1999
-	if (!is_string($f) || !$f) {
2000
-		$f = '_q';
2001
-	}
1998
+    $f = sql_serveur('quote', $serveur, true);
1999
+    if (!is_string($f) || !$f) {
2000
+        $f = '_q';
2001
+    }
2002 2002
 
2003
-	return $f($val, $type);
2003
+    return $f($val, $type);
2004 2004
 }
2005 2005
 
2006 2006
 /**
@@ -2025,12 +2025,12 @@  discard block
 block discarded – undo
2025 2025
  *     - false si le serveur SQL est indisponible
2026 2026
  **/
2027 2027
 function sql_date_proche($champ, $interval, $unite, $serveur = '', $option = true) {
2028
-	$f = sql_serveur('date_proche', $serveur, true);
2029
-	if (!is_string($f) || !$f) {
2030
-		return false;
2031
-	}
2028
+    $f = sql_serveur('date_proche', $serveur, true);
2029
+    if (!is_string($f) || !$f) {
2030
+        return false;
2031
+    }
2032 2032
 
2033
-	return $f($champ, $interval, $unite);
2033
+    return $f($champ, $interval, $unite);
2034 2034
 }
2035 2035
 
2036 2036
 /**
@@ -2066,26 +2066,26 @@  discard block
 block discarded – undo
2066 2066
  *     Expression de requête SQL
2067 2067
  **/
2068 2068
 function sql_in_quote($champ, $valeurs, $not = '', $serveur = '', $type = '', $option = true) {
2069
-	$quote = sql_serveur('quote', $serveur, true);
2070
-	if (!is_string($quote) || !$quote) {
2071
-		return false;
2072
-	}
2073
-
2074
-	// sql_quote produit une chaine dans tous les cas
2075
-	$valeurs = array_filter($valeurs, fn($v) => !is_array($v));
2076
-	$valeurs = array_unique($valeurs);
2077
-	$valeurs = $quote($valeurs, $type);
2078
-
2079
-	if (!strlen(trim((string) $valeurs))) {
2080
-		return ($not ? '0=0' : '0=1');
2081
-	}
2082
-
2083
-	$f = sql_serveur('in', $serveur, $option === 'continue' || $option === false);
2084
-	if (!is_string($f) || !$f) {
2085
-		return false;
2086
-	}
2087
-
2088
-	return $f($champ, $valeurs, $not ? 'NOT' : '', $serveur, $option !== false);
2069
+    $quote = sql_serveur('quote', $serveur, true);
2070
+    if (!is_string($quote) || !$quote) {
2071
+        return false;
2072
+    }
2073
+
2074
+    // sql_quote produit une chaine dans tous les cas
2075
+    $valeurs = array_filter($valeurs, fn($v) => !is_array($v));
2076
+    $valeurs = array_unique($valeurs);
2077
+    $valeurs = $quote($valeurs, $type);
2078
+
2079
+    if (!strlen(trim((string) $valeurs))) {
2080
+        return ($not ? '0=0' : '0=1');
2081
+    }
2082
+
2083
+    $f = sql_serveur('in', $serveur, $option === 'continue' || $option === false);
2084
+    if (!is_string($f) || !$f) {
2085
+        return false;
2086
+    }
2087
+
2088
+    return $f($champ, $valeurs, $not ? 'NOT' : '', $serveur, $option !== false);
2089 2089
 }
2090 2090
 
2091 2091
 /**
@@ -2102,19 +2102,19 @@  discard block
 block discarded – undo
2102 2102
  * @param bool $option
2103 2103
  */
2104 2104
 function sql_in($champ, $valeurs, $not = '', $serveur = '', $option = true) {
2105
-	$type = '';
2106
-	if (!is_array($valeurs)) {
2107
-		$valeurs = (string) $valeurs;
2108
-		if (isset($valeurs[0]) && $valeurs[0] === ',') {
2109
-			$valeurs = substr($valeurs, 1);
2110
-		}
2111
-		// on explode en tableau pour pouvoir securiser le contenu
2112
-		$valeurs = explode(',', $valeurs);
2113
-		// et on force un cast de type int donc
2114
-		$type = 'int';
2115
-	}
2116
-
2117
-	return sql_in_quote($champ, $valeurs, $not, $serveur, $type, $option);
2105
+    $type = '';
2106
+    if (!is_array($valeurs)) {
2107
+        $valeurs = (string) $valeurs;
2108
+        if (isset($valeurs[0]) && $valeurs[0] === ',') {
2109
+            $valeurs = substr($valeurs, 1);
2110
+        }
2111
+        // on explode en tableau pour pouvoir securiser le contenu
2112
+        $valeurs = explode(',', $valeurs);
2113
+        // et on force un cast de type int donc
2114
+        $type = 'int';
2115
+    }
2116
+
2117
+    return sql_in_quote($champ, $valeurs, $not, $serveur, $type, $option);
2118 2118
 }
2119 2119
 
2120 2120
 
@@ -2155,24 +2155,24 @@  discard block
 block discarded – undo
2155 2155
  *     Expression de requête SQL
2156 2156
  **/
2157 2157
 function sql_in_select(
2158
-	$in,
2159
-	$select,
2160
-	$from = [],
2161
-	$where = [],
2162
-	$groupby = [],
2163
-	$orderby = [],
2164
-	$limit = '',
2165
-	$having = [],
2166
-	$serveur = ''
2158
+    $in,
2159
+    $select,
2160
+    $from = [],
2161
+    $where = [],
2162
+    $groupby = [],
2163
+    $orderby = [],
2164
+    $limit = '',
2165
+    $having = [],
2166
+    $serveur = ''
2167 2167
 ) {
2168
-	$liste = [];
2169
-	$res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur);
2170
-	while ($r = sql_fetch($res)) {
2171
-		$liste[] = array_shift($r);
2172
-	}
2173
-	sql_free($res);
2174
-
2175
-	return sql_in($in, $liste);
2168
+    $liste = [];
2169
+    $res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur);
2170
+    while ($r = sql_fetch($res)) {
2171
+        $liste[] = array_shift($r);
2172
+    }
2173
+    sql_free($res);
2174
+
2175
+    return sql_in($in, $liste);
2176 2176
 }
2177 2177
 
2178 2178
 /**
@@ -2204,29 +2204,29 @@  discard block
 block discarded – undo
2204 2204
  *    Position apres le saut.
2205 2205
  */
2206 2206
 function sql_skip($res, $pos, $saut, $count, $serveur = '', $option = true) {
2207
-	// pas de saut en arriere qu'on ne sait pas faire sans sql_seek
2208
-	if (($saut = (int) $saut) <= 0) {
2209
-		return $pos;
2210
-	}
2211
-
2212
-	$seek = $pos + $saut;
2213
-	// si le saut fait depasser le maxi, on libere la resource
2214
-	// et on sort
2215
-	if ($seek >= $count) {
2216
-		sql_free($res, $serveur, $option);
2217
-
2218
-		return $count;
2219
-	}
2220
-
2221
-	if (sql_seek($res, $seek)) {
2222
-		$pos = $seek;
2223
-	} else {
2224
-		while ($pos < $seek && sql_fetch($res, $serveur, $option)) {
2225
-			$pos++;
2226
-		}
2227
-	}
2228
-
2229
-	return $pos;
2207
+    // pas de saut en arriere qu'on ne sait pas faire sans sql_seek
2208
+    if (($saut = (int) $saut) <= 0) {
2209
+        return $pos;
2210
+    }
2211
+
2212
+    $seek = $pos + $saut;
2213
+    // si le saut fait depasser le maxi, on libere la resource
2214
+    // et on sort
2215
+    if ($seek >= $count) {
2216
+        sql_free($res, $serveur, $option);
2217
+
2218
+        return $count;
2219
+    }
2220
+
2221
+    if (sql_seek($res, $seek)) {
2222
+        $pos = $seek;
2223
+    } else {
2224
+        while ($pos < $seek && sql_fetch($res, $serveur, $option)) {
2225
+            $pos++;
2226
+        }
2227
+    }
2228
+
2229
+    return $pos;
2230 2230
 }
2231 2231
 
2232 2232
 
@@ -2246,7 +2246,7 @@  discard block
 block discarded – undo
2246 2246
  *     True si le champ est de type entier
2247 2247
  */
2248 2248
 function sql_test_int($type, $serveur = '', $option = true) {
2249
-	return preg_match('/^(TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT)/i', trim($type));
2249
+    return preg_match('/^(TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT)/i', trim($type));
2250 2250
 }
2251 2251
 
2252 2252
 /**
@@ -2265,7 +2265,7 @@  discard block
 block discarded – undo
2265 2265
  *     True si le champ est de type entier
2266 2266
  */
2267 2267
 function sql_test_date($type, $serveur = '', $option = true) {
2268
-	return preg_match('/^(DATE|DATETIME|TIMESTAMP|TIME)/i', trim($type));
2268
+    return preg_match('/^(DATE|DATETIME|TIMESTAMP|TIME)/i', trim($type));
2269 2269
 }
2270 2270
 
2271 2271
 /**
@@ -2287,19 +2287,19 @@  discard block
 block discarded – undo
2287 2287
  *     La date formatee
2288 2288
  */
2289 2289
 function sql_format_date($annee = 0, $mois = 0, $jour = 0, $h = 0, $m = 0, $s = 0, $serveur = '') {
2290
-	$annee = sprintf('%04s', $annee);
2291
-	$mois = sprintf('%02s', $mois);
2292
-
2293
-	if ($annee == '0000') {
2294
-		$mois = 0;
2295
-	}
2296
-	if ($mois == '00') {
2297
-		$jour = 0;
2298
-	}
2299
-
2300
-	return sprintf('%04u', $annee) . '-' . sprintf('%02u', $mois) . '-'
2301
-	. sprintf('%02u', $jour) . ' ' . sprintf('%02u', $h) . ':'
2302
-	. sprintf('%02u', $m) . ':' . sprintf('%02u', $s);
2290
+    $annee = sprintf('%04s', $annee);
2291
+    $mois = sprintf('%02s', $mois);
2292
+
2293
+    if ($annee == '0000') {
2294
+        $mois = 0;
2295
+    }
2296
+    if ($mois == '00') {
2297
+        $jour = 0;
2298
+    }
2299
+
2300
+    return sprintf('%04u', $annee) . '-' . sprintf('%02u', $mois) . '-'
2301
+    . sprintf('%02u', $jour) . ' ' . sprintf('%02u', $h) . ':'
2302
+    . sprintf('%02u', $m) . ':' . sprintf('%02u', $s);
2303 2303
 }
2304 2304
 
2305 2305
 
@@ -2322,29 +2322,29 @@  discard block
 block discarded – undo
2322 2322
  **/
2323 2323
 function description_table($nom, $serveur = '') {
2324 2324
 
2325
-	static $trouver_table;
2325
+    static $trouver_table;
2326 2326
 
2327
-	/* toujours utiliser trouver_table
2327
+    /* toujours utiliser trouver_table
2328 2328
 	 qui renverra la description theorique
2329 2329
 	 car sinon on va se comporter differement selon que la table est declaree
2330 2330
 	 ou non
2331 2331
 	 */
2332
-	if (!$trouver_table) {
2333
-		$trouver_table = charger_fonction('trouver_table', 'base');
2334
-	}
2335
-	if ($desc = $trouver_table($nom, $serveur)) {
2336
-		return $desc;
2337
-	}
2338
-
2339
-	// sauf a l'installation :
2340
-	include_spip('base/serial');
2341
-	if (isset($GLOBALS['tables_principales'][$nom])) {
2342
-		return $GLOBALS['tables_principales'][$nom];
2343
-	}
2344
-
2345
-	include_spip('base/auxiliaires');
2346
-
2347
-	return $GLOBALS['tables_auxiliaires'][$nom] ?? false;
2332
+    if (!$trouver_table) {
2333
+        $trouver_table = charger_fonction('trouver_table', 'base');
2334
+    }
2335
+    if ($desc = $trouver_table($nom, $serveur)) {
2336
+        return $desc;
2337
+    }
2338
+
2339
+    // sauf a l'installation :
2340
+    include_spip('base/serial');
2341
+    if (isset($GLOBALS['tables_principales'][$nom])) {
2342
+        return $GLOBALS['tables_principales'][$nom];
2343
+    }
2344
+
2345
+    include_spip('base/auxiliaires');
2346
+
2347
+    return $GLOBALS['tables_auxiliaires'][$nom] ?? false;
2348 2348
 }
2349 2349
 
2350 2350
 /**
@@ -2357,8 +2357,8 @@  discard block
 block discarded – undo
2357 2357
  * @return string Table sql éventuellement renommée
2358 2358
  */
2359 2359
 function prefixer_table_spip($table, $prefixe) {
2360
-	if ($prefixe) {
2361
-		$table = preg_replace('/^spip_/', $prefixe . '_', $table);
2362
-	}
2363
-	return $table;
2360
+    if ($prefixe) {
2361
+        $table = preg_replace('/^spip_/', $prefixe . '_', $table);
2362
+    }
2363
+    return $table;
2364 2364
 }
Please login to merge, or discard this patch.
ecrire/base/connect_sql.php 3 patches
Indentation   +318 added lines, -318 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\SQL
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 require_once _ROOT_RESTREINT . 'base/objets.php';
21 21
 
@@ -41,124 +41,124 @@  discard block
 block discarded – undo
41 41
  **/
42 42
 function spip_connect($serveur = '', $version = '') {
43 43
 
44
-	$serveur = is_string($serveur) ? strtolower($serveur) : '';
45
-	$index = $serveur ?: 0;
46
-	if (!$version) {
47
-		$version = $GLOBALS['spip_sql_version'];
48
-	}
49
-	if (isset($GLOBALS['connexions'][$index][$version])) {
50
-		return $GLOBALS['connexions'][$index];
51
-	}
52
-
53
-	include_spip('base/abstract_sql');
54
-	$install = (_request('exec') == 'install');
55
-
56
-	// Premiere connexion ?
57
-	if (!($old = isset($GLOBALS['connexions'][$index]))) {
58
-		$f = '';
59
-		if ($serveur) {
60
-			// serveur externe et nom de serveur bien ecrit ?
61
-			if (
62
-				defined('_DIR_CONNECT')
63
-				&& preg_match('/^[\w\.]*$/', $serveur)
64
-			) {
65
-				$f = _DIR_CONNECT . $serveur . '.php';
66
-				if (!is_readable($f) && !$install) {
67
-					// chercher une declaration de serveur dans le path
68
-					// qui peut servir à des plugins à declarer des connexions à une base sqlite
69
-					// Ex: sert aux boucles POUR et au plugin-dist dump pour se connecter sur le sqlite du dump
70
-					$f = find_in_path("$serveur.php", 'connect/');
71
-				}
72
-			}
73
-		} else {
74
-			if (defined('_FILE_CONNECT') && _FILE_CONNECT) {
75
-				// init du serveur principal
76
-				$f = _FILE_CONNECT;
77
-			} elseif ($install && defined('_FILE_CONNECT_TMP')) {
78
-				// installation en cours
79
-				$f = _FILE_CONNECT_TMP;
80
-			}
81
-		}
82
-
83
-		unset($GLOBALS['db_ok']);
84
-		unset($GLOBALS['spip_connect_version']);
85
-		if ($f && is_readable($f)) {
86
-			include($f);
87
-			if (!isset($GLOBALS['db_ok'])) {
88
-				spip_logger()->emergency("spip_connect: fichier de connexion '$f' OK mais echec connexion au serveur");
89
-			}
90
-		} else {
91
-			spip_logger()->emergency("spip_connect: fichier de connexion '$f' non trouve, pas de connexion serveur");
92
-		}
93
-		if (!isset($GLOBALS['db_ok'])) {
94
-			// fera mieux la prochaine fois
95
-			if ($install) {
96
-				return false;
97
-			}
98
-			// ne plus reessayer si ce n'est pas l'install
99
-			return $GLOBALS['connexions'][$index] = false;
100
-		}
101
-		$GLOBALS['connexions'][$index] = $GLOBALS['db_ok'];
102
-	}
103
-	// si la connexion a deja ete tentee mais a echoue, le dire!
104
-	if (!$GLOBALS['connexions'][$index]) {
105
-		return false;
106
-	}
107
-
108
-	// la connexion a reussi ou etait deja faite.
109
-	// chargement de la version du jeu de fonctions
110
-	// si pas dans le fichier par defaut
111
-	$type = $GLOBALS['db_ok']['type'];
112
-	$jeu = 'spip_' . $type . '_functions_' . $version;
113
-	if (!isset($GLOBALS[$jeu]) && !find_in_path($type . '_' . $version . '.php', 'req/', true)) {
114
-		spip_logger()->emergency("spip_connect: serveur $index version '$version' non defini pour '$type'");
115
-		// ne plus reessayer
116
-		return $GLOBALS['connexions'][$index][$version] = [];
117
-	}
118
-	$GLOBALS['connexions'][$index][$version] = $GLOBALS[$jeu];
119
-	if ($old) {
120
-		return $GLOBALS['connexions'][$index];
121
-	}
122
-
123
-	$GLOBALS['connexions'][$index]['spip_connect_version'] = $GLOBALS['spip_connect_version'] ?? 0;
124
-
125
-	// initialisation de l'alphabet utilise dans les connexions SQL
126
-	// si l'installation l'a determine.
127
-	// Celui du serveur principal l'impose aux serveurs secondaires
128
-	// s'ils le connaissent
129
-
130
-	if (!$serveur) {
131
-		$charset = spip_connect_main($GLOBALS[$jeu], $GLOBALS['db_ok']['charset']);
132
-		if (!$charset) {
133
-			unset($GLOBALS['connexions'][$index]);
134
-			spip_logger()->warning('spip_connect: absence de charset');
135
-
136
-			return false;
137
-		}
138
-	} else {
139
-		if ($GLOBALS['db_ok']['charset']) {
140
-			$charset = $GLOBALS['db_ok']['charset'];
141
-		}
142
-		// spip_meta n'existe pas toujours dans la base
143
-		// C'est le cas d'un dump sqlite par exemple
144
-		elseif (
145
-			$GLOBALS['connexions'][$index]['spip_connect_version']
146
-			&& sql_showtable('spip_meta', true, $serveur)
147
-			&& ($r = sql_getfetsel('valeur', 'spip_meta', "nom='charset_sql_connexion'", '', '', '', '', $serveur))
148
-		) {
149
-			$charset = $r;
150
-		} else {
151
-			$charset = -1;
152
-		}
153
-	}
154
-	if ($charset != -1) {
155
-		$f = $GLOBALS[$jeu]['set_charset'];
156
-		if (function_exists($f)) {
157
-			$f($charset, $serveur);
158
-		}
159
-	}
160
-
161
-	return $GLOBALS['connexions'][$index];
44
+    $serveur = is_string($serveur) ? strtolower($serveur) : '';
45
+    $index = $serveur ?: 0;
46
+    if (!$version) {
47
+        $version = $GLOBALS['spip_sql_version'];
48
+    }
49
+    if (isset($GLOBALS['connexions'][$index][$version])) {
50
+        return $GLOBALS['connexions'][$index];
51
+    }
52
+
53
+    include_spip('base/abstract_sql');
54
+    $install = (_request('exec') == 'install');
55
+
56
+    // Premiere connexion ?
57
+    if (!($old = isset($GLOBALS['connexions'][$index]))) {
58
+        $f = '';
59
+        if ($serveur) {
60
+            // serveur externe et nom de serveur bien ecrit ?
61
+            if (
62
+                defined('_DIR_CONNECT')
63
+                && preg_match('/^[\w\.]*$/', $serveur)
64
+            ) {
65
+                $f = _DIR_CONNECT . $serveur . '.php';
66
+                if (!is_readable($f) && !$install) {
67
+                    // chercher une declaration de serveur dans le path
68
+                    // qui peut servir à des plugins à declarer des connexions à une base sqlite
69
+                    // Ex: sert aux boucles POUR et au plugin-dist dump pour se connecter sur le sqlite du dump
70
+                    $f = find_in_path("$serveur.php", 'connect/');
71
+                }
72
+            }
73
+        } else {
74
+            if (defined('_FILE_CONNECT') && _FILE_CONNECT) {
75
+                // init du serveur principal
76
+                $f = _FILE_CONNECT;
77
+            } elseif ($install && defined('_FILE_CONNECT_TMP')) {
78
+                // installation en cours
79
+                $f = _FILE_CONNECT_TMP;
80
+            }
81
+        }
82
+
83
+        unset($GLOBALS['db_ok']);
84
+        unset($GLOBALS['spip_connect_version']);
85
+        if ($f && is_readable($f)) {
86
+            include($f);
87
+            if (!isset($GLOBALS['db_ok'])) {
88
+                spip_logger()->emergency("spip_connect: fichier de connexion '$f' OK mais echec connexion au serveur");
89
+            }
90
+        } else {
91
+            spip_logger()->emergency("spip_connect: fichier de connexion '$f' non trouve, pas de connexion serveur");
92
+        }
93
+        if (!isset($GLOBALS['db_ok'])) {
94
+            // fera mieux la prochaine fois
95
+            if ($install) {
96
+                return false;
97
+            }
98
+            // ne plus reessayer si ce n'est pas l'install
99
+            return $GLOBALS['connexions'][$index] = false;
100
+        }
101
+        $GLOBALS['connexions'][$index] = $GLOBALS['db_ok'];
102
+    }
103
+    // si la connexion a deja ete tentee mais a echoue, le dire!
104
+    if (!$GLOBALS['connexions'][$index]) {
105
+        return false;
106
+    }
107
+
108
+    // la connexion a reussi ou etait deja faite.
109
+    // chargement de la version du jeu de fonctions
110
+    // si pas dans le fichier par defaut
111
+    $type = $GLOBALS['db_ok']['type'];
112
+    $jeu = 'spip_' . $type . '_functions_' . $version;
113
+    if (!isset($GLOBALS[$jeu]) && !find_in_path($type . '_' . $version . '.php', 'req/', true)) {
114
+        spip_logger()->emergency("spip_connect: serveur $index version '$version' non defini pour '$type'");
115
+        // ne plus reessayer
116
+        return $GLOBALS['connexions'][$index][$version] = [];
117
+    }
118
+    $GLOBALS['connexions'][$index][$version] = $GLOBALS[$jeu];
119
+    if ($old) {
120
+        return $GLOBALS['connexions'][$index];
121
+    }
122
+
123
+    $GLOBALS['connexions'][$index]['spip_connect_version'] = $GLOBALS['spip_connect_version'] ?? 0;
124
+
125
+    // initialisation de l'alphabet utilise dans les connexions SQL
126
+    // si l'installation l'a determine.
127
+    // Celui du serveur principal l'impose aux serveurs secondaires
128
+    // s'ils le connaissent
129
+
130
+    if (!$serveur) {
131
+        $charset = spip_connect_main($GLOBALS[$jeu], $GLOBALS['db_ok']['charset']);
132
+        if (!$charset) {
133
+            unset($GLOBALS['connexions'][$index]);
134
+            spip_logger()->warning('spip_connect: absence de charset');
135
+
136
+            return false;
137
+        }
138
+    } else {
139
+        if ($GLOBALS['db_ok']['charset']) {
140
+            $charset = $GLOBALS['db_ok']['charset'];
141
+        }
142
+        // spip_meta n'existe pas toujours dans la base
143
+        // C'est le cas d'un dump sqlite par exemple
144
+        elseif (
145
+            $GLOBALS['connexions'][$index]['spip_connect_version']
146
+            && sql_showtable('spip_meta', true, $serveur)
147
+            && ($r = sql_getfetsel('valeur', 'spip_meta', "nom='charset_sql_connexion'", '', '', '', '', $serveur))
148
+        ) {
149
+            $charset = $r;
150
+        } else {
151
+            $charset = -1;
152
+        }
153
+    }
154
+    if ($charset != -1) {
155
+        $f = $GLOBALS[$jeu]['set_charset'];
156
+        if (function_exists($f)) {
157
+            $f($charset, $serveur);
158
+        }
159
+    }
160
+
161
+    return $GLOBALS['connexions'][$index];
162 162
 }
163 163
 
164 164
 /**
@@ -167,12 +167,12 @@  discard block
 block discarded – undo
167 167
  * @param string $serveur Nom du connecteur de bdd utilisé
168 168
  **/
169 169
 function spip_sql_erreur($serveur = '') {
170
-	$connexion = spip_connect($serveur);
171
-	$e = sql_errno($serveur);
172
-	$t = ($connexion['type'] ?? 'sql');
173
-	$m = "Erreur $e de $t: " . sql_error($serveur) . "\nin " . sql_error_backtrace() . "\n" . trim((string) $connexion['last']);
174
-	$f = $t . $serveur;
175
-	spip_logger($f)->error($m);
170
+    $connexion = spip_connect($serveur);
171
+    $e = sql_errno($serveur);
172
+    $t = ($connexion['type'] ?? 'sql');
173
+    $m = "Erreur $e de $t: " . sql_error($serveur) . "\nin " . sql_error_backtrace() . "\n" . trim((string) $connexion['last']);
174
+    $f = $t . $serveur;
175
+    spip_logger($f)->error($m);
176 176
 }
177 177
 
178 178
 /**
@@ -194,23 +194,23 @@  discard block
 block discarded – undo
194 194
  *     - array : description de la connexion, si l'instruction sql est indisponible pour cette connexion
195 195
  **/
196 196
 function spip_connect_sql($version, $ins = '', $serveur = '', $continue = false) {
197
-	$desc = spip_connect($serveur, $version);
198
-	if (
199
-		$desc
200
-		&& ($f = ($desc[$version][$ins] ?? ''))
201
-		&& function_exists($f)
202
-	) {
203
-		return $f;
204
-	}
205
-	if ($continue) {
206
-		return $desc;
207
-	}
208
-	if ($ins) {
209
-		spip_logger()->error("Le serveur '$serveur' version $version n'a pas '$ins'");
210
-	}
211
-	include_spip('inc/minipres');
212
-	echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
213
-	exit;
197
+    $desc = spip_connect($serveur, $version);
198
+    if (
199
+        $desc
200
+        && ($f = ($desc[$version][$ins] ?? ''))
201
+        && function_exists($f)
202
+    ) {
203
+        return $f;
204
+    }
205
+    if ($continue) {
206
+        return $desc;
207
+    }
208
+    if ($ins) {
209
+        spip_logger()->error("Le serveur '$serveur' version $version n'a pas '$ins'");
210
+    }
211
+    include_spip('inc/minipres');
212
+    echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
213
+    exit;
214 214
 }
215 215
 
216 216
 /**
@@ -236,70 +236,70 @@  discard block
 block discarded – undo
236 236
  * @return array|null Description de la connexion
237 237
  */
238 238
 function spip_connect_db(
239
-	$host,
240
-	$port,
241
-	$login,
242
-	#[\SensitiveParameter] $pass,
243
-	$db = '',
244
-	$type = 'mysql',
245
-	$prefixe = '',
246
-	$auth = '',
247
-	$charset = ''
239
+    $host,
240
+    $port,
241
+    $login,
242
+    #[\SensitiveParameter] $pass,
243
+    $db = '',
244
+    $type = 'mysql',
245
+    $prefixe = '',
246
+    $auth = '',
247
+    $charset = ''
248 248
 ) {
249
-	// temps avant nouvelle tentative de connexion
250
-	// suite a une connection echouee
251
-	if (!defined('_CONNECT_RETRY_DELAY')) {
252
-		define('_CONNECT_RETRY_DELAY', 30);
253
-	}
254
-
255
-	$f = '';
256
-	// un fichier de identifiant par combinaison (type,host,port,db)
257
-	// pour ne pas declarer tout indisponible d'un coup
258
-	// si en cours d'installation ou si db=@test@ on ne pose rien
259
-	// car c'est un test de connexion
260
-	if (!defined('_ECRIRE_INSTALL') && $db !== '@test@') {
261
-		$f = _DIR_TMP . $type . '.' . substr(md5($host . $port . $db), 0, 8) . '.out';
262
-	} elseif ($db == '@test@') {
263
-		$db = '';
264
-	}
265
-
266
-	if (
267
-		$f
268
-		&& @file_exists($f)
269
-		&& (time() - @filemtime($f) < _CONNECT_RETRY_DELAY)
270
-	) {
271
-		spip_logger()->emergency("Echec : $f recent. Pas de tentative de connexion");
272
-
273
-		return null;
274
-	}
275
-
276
-	if (!$prefixe) {
277
-		$prefixe = $GLOBALS['table_prefix'] ?? $db;
278
-	}
279
-	$h = charger_fonction($type, 'req', true);
280
-	if (!$h) {
281
-		spip_logger()->emergency("les requetes $type ne sont pas fournies");
282
-
283
-		return null;
284
-	}
285
-	if ($g = $h($host, $port, $login, $pass, $db, $prefixe)) {
286
-		if (!is_array($auth)) {
287
-			// compatibilite version 0.7 initiale
288
-			$g['ldap'] = $auth;
289
-			$auth = ['ldap' => $auth];
290
-		}
291
-		$g['authentification'] = $auth;
292
-		$g['type'] = $type;
293
-		$g['charset'] = $charset;
294
-
295
-		return $GLOBALS['db_ok'] = $g;
296
-	}
297
-	// En cas d'indisponibilite du serveur, eviter de le bombarder
298
-	if ($f) {
299
-		@touch($f);
300
-		spip_logger($type)->emergency("Echec connexion serveur $type : host[$host] port[$port] login[$login] base[$db]");
301
-	}
302
-	return null;
249
+    // temps avant nouvelle tentative de connexion
250
+    // suite a une connection echouee
251
+    if (!defined('_CONNECT_RETRY_DELAY')) {
252
+        define('_CONNECT_RETRY_DELAY', 30);
253
+    }
254
+
255
+    $f = '';
256
+    // un fichier de identifiant par combinaison (type,host,port,db)
257
+    // pour ne pas declarer tout indisponible d'un coup
258
+    // si en cours d'installation ou si db=@test@ on ne pose rien
259
+    // car c'est un test de connexion
260
+    if (!defined('_ECRIRE_INSTALL') && $db !== '@test@') {
261
+        $f = _DIR_TMP . $type . '.' . substr(md5($host . $port . $db), 0, 8) . '.out';
262
+    } elseif ($db == '@test@') {
263
+        $db = '';
264
+    }
265
+
266
+    if (
267
+        $f
268
+        && @file_exists($f)
269
+        && (time() - @filemtime($f) < _CONNECT_RETRY_DELAY)
270
+    ) {
271
+        spip_logger()->emergency("Echec : $f recent. Pas de tentative de connexion");
272
+
273
+        return null;
274
+    }
275
+
276
+    if (!$prefixe) {
277
+        $prefixe = $GLOBALS['table_prefix'] ?? $db;
278
+    }
279
+    $h = charger_fonction($type, 'req', true);
280
+    if (!$h) {
281
+        spip_logger()->emergency("les requetes $type ne sont pas fournies");
282
+
283
+        return null;
284
+    }
285
+    if ($g = $h($host, $port, $login, $pass, $db, $prefixe)) {
286
+        if (!is_array($auth)) {
287
+            // compatibilite version 0.7 initiale
288
+            $g['ldap'] = $auth;
289
+            $auth = ['ldap' => $auth];
290
+        }
291
+        $g['authentification'] = $auth;
292
+        $g['type'] = $type;
293
+        $g['charset'] = $charset;
294
+
295
+        return $GLOBALS['db_ok'] = $g;
296
+    }
297
+    // En cas d'indisponibilite du serveur, eviter de le bombarder
298
+    if ($f) {
299
+        @touch($f);
300
+        spip_logger($type)->emergency("Echec connexion serveur $type : host[$host] port[$port] login[$login] base[$db]");
301
+    }
302
+    return null;
303 303
 }
304 304
 
305 305
 
@@ -331,32 +331,32 @@  discard block
 block discarded – undo
331 331
  *     - nom du charset sinon
332 332
  **/
333 333
 function spip_connect_main($connexion, $charset_sql_connexion = '') {
334
-	if ($GLOBALS['spip_connect_version'] < 0.1 && _DIR_RESTREINT) {
335
-		include_spip('inc/headers');
336
-		redirige_url_ecrire('upgrade', 'reinstall=oui');
337
-	}
338
-
339
-	if (!($f = $connexion['select'])) {
340
-		return false;
341
-	}
342
-	// si le charset est fourni, l'utiliser
343
-	if ($charset_sql_connexion) {
344
-		return $charset_sql_connexion;
345
-	}
346
-	// sinon on regarde la table spip_meta
347
-	// en cas d'erreur select retourne la requette (is_string=true donc)
348
-	if (
349
-		!($r = $f('valeur', 'spip_meta', "nom='charset_sql_connexion'"))
350
-		|| is_string($r)
351
-	) {
352
-		return false;
353
-	}
354
-	if (!($f = $connexion['fetch'])) {
355
-		return false;
356
-	}
357
-	$r = $f($r);
358
-
359
-	return (isset($r['valeur']) && $r['valeur']) ? $r['valeur'] : -1;
334
+    if ($GLOBALS['spip_connect_version'] < 0.1 && _DIR_RESTREINT) {
335
+        include_spip('inc/headers');
336
+        redirige_url_ecrire('upgrade', 'reinstall=oui');
337
+    }
338
+
339
+    if (!($f = $connexion['select'])) {
340
+        return false;
341
+    }
342
+    // si le charset est fourni, l'utiliser
343
+    if ($charset_sql_connexion) {
344
+        return $charset_sql_connexion;
345
+    }
346
+    // sinon on regarde la table spip_meta
347
+    // en cas d'erreur select retourne la requette (is_string=true donc)
348
+    if (
349
+        !($r = $f('valeur', 'spip_meta', "nom='charset_sql_connexion'"))
350
+        || is_string($r)
351
+    ) {
352
+        return false;
353
+    }
354
+    if (!($f = $connexion['fetch'])) {
355
+        return false;
356
+    }
357
+    $r = $f($r);
358
+
359
+    return (isset($r['valeur']) && $r['valeur']) ? $r['valeur'] : -1;
360 360
 }
361 361
 
362 362
 /**
@@ -372,16 +372,16 @@  discard block
 block discarded – undo
372 372
  * @return string Valeur échappée.
373 373
  **/
374 374
 function _q($a): string {
375
-	if (is_numeric($a)) {
376
-		return (string) $a;
377
-	} elseif (is_array($a)) {
378
-		return implode(',', array_map('_q', $a));
379
-	} elseif (is_scalar($a)) {
380
-		return ("'" . addslashes($a) . "'");
381
-	} elseif ($a === null) {
382
-		return "''";
383
-	}
384
-	throw new \RuntimeException('Can’t use _q with ' . gettype($a));
375
+    if (is_numeric($a)) {
376
+        return (string) $a;
377
+    } elseif (is_array($a)) {
378
+        return implode(',', array_map('_q', $a));
379
+    } elseif (is_scalar($a)) {
380
+        return ("'" . addslashes($a) . "'");
381
+    } elseif ($a === null) {
382
+        return "''";
383
+    }
384
+    throw new \RuntimeException('Can’t use _q with ' . gettype($a));
385 385
 }
386 386
 
387 387
 /**
@@ -397,75 +397,75 @@  discard block
 block discarded – undo
397 397
  * @return array
398 398
  */
399 399
 function query_echappe_textes($query, $uniqid = null) {
400
-	static $codeEchappements = null;
401
-	if (is_null($codeEchappements) || $uniqid) {
402
-		if (is_null($uniqid)) {
403
-			$uniqid = uniqid();
404
-		}
405
-		$uniqid = substr(md5((string) $uniqid), 0, 4);
406
-		$codeEchappements = ['\\\\' => "\x1@#{$uniqid}#@\x1", "\\'" => "\x2@#{$uniqid}#@\x2", '\\"' => "\x3@#{$uniqid}#@\x3", '%' => "\x4@#{$uniqid}#@\x4"];
407
-	}
408
-	if ($query === null) {
409
-		return $codeEchappements;
410
-	}
411
-
412
-	// si la query contient deja des codes d'echappement on va s'emmeler les pinceaux et donc on ne touche a rien
413
-	// ce n'est pas un cas legitime
414
-	foreach ($codeEchappements as $codeEchappement) {
415
-		if (str_contains($query, (string) $codeEchappement)) {
416
-			return [$query, []];
417
-		}
418
-	}
419
-
420
-	$query_echappees = str_replace(array_keys($codeEchappements), array_values($codeEchappements), $query);
421
-	if (preg_match_all("/('[^']*')|(\"[^\"]*\")/S", $query_echappees, $textes)) {
422
-		$textes = reset($textes);
423
-
424
-		$parts = [];
425
-		$currentpos = 0;
426
-		$k = 0;
427
-		while (count($textes)) {
428
-			$part = array_shift($textes);
429
-			$nextpos = strpos($query_echappees, (string) $part, $currentpos);
430
-			// si besoin recoller ensemble les doubles '' de sqlite (echappement des ')
431
-			while (count($textes) && str_ends_with((string) $part, "'")) {
432
-				$next = reset($textes);
433
-				if (
434
-					str_starts_with((string) $next, "'")
435
-					&& strpos($query_echappees, $part . $next, $currentpos) === $nextpos
436
-				) {
437
-					$part .= array_shift($textes);
438
-				}
439
-				else {
440
-					break;
441
-				}
442
-			}
443
-			$k++;
444
-			$parts[$k] = [
445
-				'texte' => $part,
446
-				'position' => $nextpos,
447
-				'placeholder' => '%' . $k . '$s',
448
-			];
449
-			$currentpos = $nextpos + strlen((string) $part);
450
-		}
451
-
452
-		// et on replace les parts une par une en commencant par la fin
453
-		while ($k > 0) {
454
-			$query_echappees = substr_replace($query_echappees, $parts[$k]['placeholder'], $parts[$k]['position'], strlen((string) $parts[$k]['texte']));
455
-			$k--;
456
-		}
457
-		$textes = array_column($parts, 'texte');
458
-	} else {
459
-		$textes = [];
460
-	}
461
-
462
-	// si il reste des quotes simples ou doubles, c'est qu'on s'est emmelle les pinceaux
463
-	// dans le doute on ne touche a rien
464
-	if (strpbrk($query_echappees, "'\"") !== false) {
465
-		return [$query, []];
466
-	}
467
-
468
-	return [$query_echappees, $textes];
400
+    static $codeEchappements = null;
401
+    if (is_null($codeEchappements) || $uniqid) {
402
+        if (is_null($uniqid)) {
403
+            $uniqid = uniqid();
404
+        }
405
+        $uniqid = substr(md5((string) $uniqid), 0, 4);
406
+        $codeEchappements = ['\\\\' => "\x1@#{$uniqid}#@\x1", "\\'" => "\x2@#{$uniqid}#@\x2", '\\"' => "\x3@#{$uniqid}#@\x3", '%' => "\x4@#{$uniqid}#@\x4"];
407
+    }
408
+    if ($query === null) {
409
+        return $codeEchappements;
410
+    }
411
+
412
+    // si la query contient deja des codes d'echappement on va s'emmeler les pinceaux et donc on ne touche a rien
413
+    // ce n'est pas un cas legitime
414
+    foreach ($codeEchappements as $codeEchappement) {
415
+        if (str_contains($query, (string) $codeEchappement)) {
416
+            return [$query, []];
417
+        }
418
+    }
419
+
420
+    $query_echappees = str_replace(array_keys($codeEchappements), array_values($codeEchappements), $query);
421
+    if (preg_match_all("/('[^']*')|(\"[^\"]*\")/S", $query_echappees, $textes)) {
422
+        $textes = reset($textes);
423
+
424
+        $parts = [];
425
+        $currentpos = 0;
426
+        $k = 0;
427
+        while (count($textes)) {
428
+            $part = array_shift($textes);
429
+            $nextpos = strpos($query_echappees, (string) $part, $currentpos);
430
+            // si besoin recoller ensemble les doubles '' de sqlite (echappement des ')
431
+            while (count($textes) && str_ends_with((string) $part, "'")) {
432
+                $next = reset($textes);
433
+                if (
434
+                    str_starts_with((string) $next, "'")
435
+                    && strpos($query_echappees, $part . $next, $currentpos) === $nextpos
436
+                ) {
437
+                    $part .= array_shift($textes);
438
+                }
439
+                else {
440
+                    break;
441
+                }
442
+            }
443
+            $k++;
444
+            $parts[$k] = [
445
+                'texte' => $part,
446
+                'position' => $nextpos,
447
+                'placeholder' => '%' . $k . '$s',
448
+            ];
449
+            $currentpos = $nextpos + strlen((string) $part);
450
+        }
451
+
452
+        // et on replace les parts une par une en commencant par la fin
453
+        while ($k > 0) {
454
+            $query_echappees = substr_replace($query_echappees, $parts[$k]['placeholder'], $parts[$k]['position'], strlen((string) $parts[$k]['texte']));
455
+            $k--;
456
+        }
457
+        $textes = array_column($parts, 'texte');
458
+    } else {
459
+        $textes = [];
460
+    }
461
+
462
+    // si il reste des quotes simples ou doubles, c'est qu'on s'est emmelle les pinceaux
463
+    // dans le doute on ne touche a rien
464
+    if (strpbrk($query_echappees, "'\"") !== false) {
465
+        return [$query, []];
466
+    }
467
+
468
+    return [$query_echappees, $textes];
469 469
 }
470 470
 
471 471
 /**
@@ -479,14 +479,14 @@  discard block
 block discarded – undo
479 479
  * @return string
480 480
  */
481 481
 function query_reinjecte_textes($query, $textes) {
482
-	// recuperer les codes echappements
483
-	$codeEchappements = query_echappe_textes(null);
482
+    // recuperer les codes echappements
483
+    $codeEchappements = query_echappe_textes(null);
484 484
 
485
-	if (!empty($textes)) {
486
-		$query = sprintf($query, ...$textes);
487
-	}
485
+    if (!empty($textes)) {
486
+        $query = sprintf($query, ...$textes);
487
+    }
488 488
 
489
-	return str_replace(array_values($codeEchappements), array_keys($codeEchappements), $query);
489
+    return str_replace(array_values($codeEchappements), array_keys($codeEchappements), $query);
490 490
 }
491 491
 
492 492
 
@@ -505,7 +505,7 @@  discard block
 block discarded – undo
505 505
  **/
506 506
 function spip_query($query, $serveur = '') {
507 507
 
508
-	$f = spip_connect_sql($GLOBALS['spip_sql_version'], 'query', $serveur, true);
508
+    $f = spip_connect_sql($GLOBALS['spip_sql_version'], 'query', $serveur, true);
509 509
 
510
-	return function_exists($f) ? $f($query, $serveur) : false;
510
+    return function_exists($f) ? $f($query, $serveur) : false;
511 511
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18 18
 	return;
19 19
 }
20
-require_once _ROOT_RESTREINT . 'base/objets.php';
20
+require_once _ROOT_RESTREINT.'base/objets.php';
21 21
 
22 22
 
23 23
 /**
@@ -62,7 +62,7 @@  discard block
 block discarded – undo
62 62
 				defined('_DIR_CONNECT')
63 63
 				&& preg_match('/^[\w\.]*$/', $serveur)
64 64
 			) {
65
-				$f = _DIR_CONNECT . $serveur . '.php';
65
+				$f = _DIR_CONNECT.$serveur.'.php';
66 66
 				if (!is_readable($f) && !$install) {
67 67
 					// chercher une declaration de serveur dans le path
68 68
 					// qui peut servir à des plugins à declarer des connexions à une base sqlite
@@ -109,8 +109,8 @@  discard block
 block discarded – undo
109 109
 	// chargement de la version du jeu de fonctions
110 110
 	// si pas dans le fichier par defaut
111 111
 	$type = $GLOBALS['db_ok']['type'];
112
-	$jeu = 'spip_' . $type . '_functions_' . $version;
113
-	if (!isset($GLOBALS[$jeu]) && !find_in_path($type . '_' . $version . '.php', 'req/', true)) {
112
+	$jeu = 'spip_'.$type.'_functions_'.$version;
113
+	if (!isset($GLOBALS[$jeu]) && !find_in_path($type.'_'.$version.'.php', 'req/', true)) {
114 114
 		spip_logger()->emergency("spip_connect: serveur $index version '$version' non defini pour '$type'");
115 115
 		// ne plus reessayer
116 116
 		return $GLOBALS['connexions'][$index][$version] = [];
@@ -170,8 +170,8 @@  discard block
 block discarded – undo
170 170
 	$connexion = spip_connect($serveur);
171 171
 	$e = sql_errno($serveur);
172 172
 	$t = ($connexion['type'] ?? 'sql');
173
-	$m = "Erreur $e de $t: " . sql_error($serveur) . "\nin " . sql_error_backtrace() . "\n" . trim((string) $connexion['last']);
174
-	$f = $t . $serveur;
173
+	$m = "Erreur $e de $t: ".sql_error($serveur)."\nin ".sql_error_backtrace()."\n".trim((string) $connexion['last']);
174
+	$f = $t.$serveur;
175 175
 	spip_logger($f)->error($m);
176 176
 }
177 177
 
@@ -258,7 +258,7 @@  discard block
 block discarded – undo
258 258
 	// si en cours d'installation ou si db=@test@ on ne pose rien
259 259
 	// car c'est un test de connexion
260 260
 	if (!defined('_ECRIRE_INSTALL') && $db !== '@test@') {
261
-		$f = _DIR_TMP . $type . '.' . substr(md5($host . $port . $db), 0, 8) . '.out';
261
+		$f = _DIR_TMP.$type.'.'.substr(md5($host.$port.$db), 0, 8).'.out';
262 262
 	} elseif ($db == '@test@') {
263 263
 		$db = '';
264 264
 	}
@@ -377,11 +377,11 @@  discard block
 block discarded – undo
377 377
 	} elseif (is_array($a)) {
378 378
 		return implode(',', array_map('_q', $a));
379 379
 	} elseif (is_scalar($a)) {
380
-		return ("'" . addslashes($a) . "'");
380
+		return ("'".addslashes($a)."'");
381 381
 	} elseif ($a === null) {
382 382
 		return "''";
383 383
 	}
384
-	throw new \RuntimeException('Can’t use _q with ' . gettype($a));
384
+	throw new \RuntimeException('Can’t use _q with '.gettype($a));
385 385
 }
386 386
 
387 387
 /**
@@ -432,7 +432,7 @@  discard block
 block discarded – undo
432 432
 				$next = reset($textes);
433 433
 				if (
434 434
 					str_starts_with((string) $next, "'")
435
-					&& strpos($query_echappees, $part . $next, $currentpos) === $nextpos
435
+					&& strpos($query_echappees, $part.$next, $currentpos) === $nextpos
436 436
 				) {
437 437
 					$part .= array_shift($textes);
438 438
 				}
@@ -444,7 +444,7 @@  discard block
 block discarded – undo
444 444
 			$parts[$k] = [
445 445
 				'texte' => $part,
446 446
 				'position' => $nextpos,
447
-				'placeholder' => '%' . $k . '$s',
447
+				'placeholder' => '%'.$k.'$s',
448 448
 			];
449 449
 			$currentpos = $nextpos + strlen((string) $part);
450 450
 		}
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -435,8 +435,7 @@
 block discarded – undo
435 435
 					&& strpos($query_echappees, $part . $next, $currentpos) === $nextpos
436 436
 				) {
437 437
 					$part .= array_shift($textes);
438
-				}
439
-				else {
438
+				} else {
440 439
 					break;
441 440
 				}
442 441
 			}
Please login to merge, or discard this patch.
ecrire/base/dump.php 2 patches
Indentation   +525 added lines, -525 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  */
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 define('_VERSION_ARCHIVE', '1.3');
@@ -37,7 +37,7 @@  discard block
 block discarded – undo
37 37
  * @return string
38 38
  **/
39 39
 function base_dump_meta_name($rub) {
40
-	return $meta = "status_dump_{$rub}_" . abs($GLOBALS['visiteur_session']['id_auteur']);
40
+    return $meta = "status_dump_{$rub}_" . abs($GLOBALS['visiteur_session']['id_auteur']);
41 41
 }
42 42
 
43 43
 /**
@@ -52,14 +52,14 @@  discard block
 block discarded – undo
52 52
  * @return string
53 53
  **/
54 54
 function base_dump_dir($meta) {
55
-	include_spip('inc/documents');
56
-	// determine upload va aussi initialiser l'index "restreint"
57
-	$maindir = determine_upload();
58
-	if (!$GLOBALS['visiteur_session']['restreint']) {
59
-		$maindir = _DIR_DUMP;
60
-	}
61
-
62
-	return sous_repertoire($maindir, $meta);
55
+    include_spip('inc/documents');
56
+    // determine upload va aussi initialiser l'index "restreint"
57
+    $maindir = determine_upload();
58
+    if (!$GLOBALS['visiteur_session']['restreint']) {
59
+        $maindir = _DIR_DUMP;
60
+    }
61
+
62
+    return sous_repertoire($maindir, $meta);
63 63
 }
64 64
 
65 65
 /**
@@ -73,28 +73,28 @@  discard block
 block discarded – undo
73 73
  * @return array
74 74
  */
75 75
 function base_lister_toutes_tables(
76
-	$serveur = '',
77
-	$tables = [],
78
-	$exclude = [],
79
-	$affiche_vrai_prefixe = false
76
+    $serveur = '',
77
+    $tables = [],
78
+    $exclude = [],
79
+    $affiche_vrai_prefixe = false
80 80
 ) {
81
-	spip_connect($serveur);
82
-	$connexion = $GLOBALS['connexions'][$serveur ?: 0];
83
-	$prefixe = $connexion['prefixe'];
84
-
85
-	$p = '/^' . $prefixe . '/';
86
-	$res = $tables;
87
-	foreach (sql_alltable(null, $serveur) as $t) {
88
-		if (preg_match($p, (string) $t)) {
89
-			$t1 = preg_replace($p, 'spip', (string) $t);
90
-			if (!in_array($t1, $tables) && !in_array($t1, $exclude)) {
91
-				$res[] = ($affiche_vrai_prefixe ? $t : $t1);
92
-			}
93
-		}
94
-	}
95
-	sort($res);
96
-
97
-	return $res;
81
+    spip_connect($serveur);
82
+    $connexion = $GLOBALS['connexions'][$serveur ?: 0];
83
+    $prefixe = $connexion['prefixe'];
84
+
85
+    $p = '/^' . $prefixe . '/';
86
+    $res = $tables;
87
+    foreach (sql_alltable(null, $serveur) as $t) {
88
+        if (preg_match($p, (string) $t)) {
89
+            $t1 = preg_replace($p, 'spip', (string) $t);
90
+            if (!in_array($t1, $tables) && !in_array($t1, $exclude)) {
91
+                $res[] = ($affiche_vrai_prefixe ? $t : $t1);
92
+            }
93
+        }
94
+    }
95
+    sort($res);
96
+
97
+    return $res;
98 98
 }
99 99
 
100 100
 /**
@@ -104,10 +104,10 @@  discard block
 block discarded – undo
104 104
  * @return string
105 105
  */
106 106
 function base_prefixe_tables($serveur = '') {
107
-	spip_connect($serveur);
108
-	$connexion = $GLOBALS['connexions'][$serveur ?: 0];
107
+    spip_connect($serveur);
108
+    $connexion = $GLOBALS['connexions'][$serveur ?: 0];
109 109
 
110
-	return $connexion['prefixe'];
110
+    return $connexion['prefixe'];
111 111
 }
112 112
 
113 113
 
@@ -122,26 +122,26 @@  discard block
 block discarded – undo
122 122
  * @return array
123 123
  */
124 124
 function base_saisie_tables($name, $tables, $exclude = [], $post = null, $serveur = '') {
125
-	include_spip('inc/filtres');
126
-	$res = [];
127
-	foreach ($tables as $k => $t) {
128
-		// par defaut tout est coche sauf les tables dans $exclude
129
-		$check = is_null($post) ? !in_array($t, $exclude) : in_array($t, $post);
130
-
131
-		$res[$k] = "<input type='checkbox' value='$t' name='$name"
132
-			. "[]' id='$name$k'"
133
-			. ($check ? " checked='checked'" : '')
134
-			. "/>\n"
135
-			. "<label for='$name$k'>$t</label>"
136
-			. ' ('
137
-			. sinon(
138
-				singulier_ou_pluriel(sql_countsel($t, '', '', '', $serveur), 'dump:une_donnee', 'dump:nb_donnees'),
139
-				_T('dump:aucune_donnee')
140
-			)
141
-			. ')';
142
-	}
143
-
144
-	return $res;
125
+    include_spip('inc/filtres');
126
+    $res = [];
127
+    foreach ($tables as $k => $t) {
128
+        // par defaut tout est coche sauf les tables dans $exclude
129
+        $check = is_null($post) ? !in_array($t, $exclude) : in_array($t, $post);
130
+
131
+        $res[$k] = "<input type='checkbox' value='$t' name='$name"
132
+            . "[]' id='$name$k'"
133
+            . ($check ? " checked='checked'" : '')
134
+            . "/>\n"
135
+            . "<label for='$name$k'>$t</label>"
136
+            . ' ('
137
+            . sinon(
138
+                singulier_ou_pluriel(sql_countsel($t, '', '', '', $serveur), 'dump:une_donnee', 'dump:nb_donnees'),
139
+                _T('dump:aucune_donnee')
140
+            )
141
+            . ')';
142
+    }
143
+
144
+    return $res;
145 145
 }
146 146
 
147 147
 
@@ -153,27 +153,27 @@  discard block
 block discarded – undo
153 153
  * @return array
154 154
  */
155 155
 function lister_tables_noexport() {
156
-	// par defaut tout est exporte sauf les tables ci-dessous
157
-	static $EXPORT_tables_noexport = null;
158
-	if (!is_null($EXPORT_tables_noexport)) {
159
-		return $EXPORT_tables_noexport;
160
-	}
161
-
162
-	$EXPORT_tables_noexport = [
163
-		'spip_caches', // plugin invalideur
164
-		'spip_resultats', // resultats de recherche ... c'est un cache !
165
-		'spip_test', // c'est un test !
166
-		#'spip_referers',
167
-		#'spip_referers_articles',
168
-		#'spip_visites',
169
-		#'spip_visites_articles',
170
-		#'spip_versions',
171
-		#'spip_versions_fragments'
172
-	];
173
-
174
-	$EXPORT_tables_noexport = pipeline('lister_tables_noexport', $EXPORT_tables_noexport);
175
-
176
-	return $EXPORT_tables_noexport;
156
+    // par defaut tout est exporte sauf les tables ci-dessous
157
+    static $EXPORT_tables_noexport = null;
158
+    if (!is_null($EXPORT_tables_noexport)) {
159
+        return $EXPORT_tables_noexport;
160
+    }
161
+
162
+    $EXPORT_tables_noexport = [
163
+        'spip_caches', // plugin invalideur
164
+        'spip_resultats', // resultats de recherche ... c'est un cache !
165
+        'spip_test', // c'est un test !
166
+        #'spip_referers',
167
+        #'spip_referers_articles',
168
+        #'spip_visites',
169
+        #'spip_visites_articles',
170
+        #'spip_versions',
171
+        #'spip_versions_fragments'
172
+    ];
173
+
174
+    $EXPORT_tables_noexport = pipeline('lister_tables_noexport', $EXPORT_tables_noexport);
175
+
176
+    return $EXPORT_tables_noexport;
177 177
 }
178 178
 
179 179
 /**
@@ -184,25 +184,25 @@  discard block
 block discarded – undo
184 184
  * @return array
185 185
  */
186 186
 function lister_tables_noimport() {
187
-	static $IMPORT_tables_noimport = null;
188
-	if (!is_null($IMPORT_tables_noimport)) {
189
-		return $IMPORT_tables_noimport;
190
-	}
191
-
192
-	$IMPORT_tables_noimport = [];
193
-	// par defaut tout est importe sauf les tables ci-dessous
194
-	// possibiliter de definir cela tables via la meta
195
-	// compatibilite
196
-	if (isset($GLOBALS['meta']['IMPORT_tables_noimport'])) {
197
-		$IMPORT_tables_noimport = unserialize($GLOBALS['meta']['IMPORT_tables_noimport']);
198
-		if (!is_array($IMPORT_tables_noimport)) {
199
-			include_spip('inc/meta');
200
-			effacer_meta('IMPORT_tables_noimport');
201
-		}
202
-	}
203
-	$IMPORT_tables_noimport = pipeline('lister_tables_noimport', $IMPORT_tables_noimport);
204
-
205
-	return $IMPORT_tables_noimport;
187
+    static $IMPORT_tables_noimport = null;
188
+    if (!is_null($IMPORT_tables_noimport)) {
189
+        return $IMPORT_tables_noimport;
190
+    }
191
+
192
+    $IMPORT_tables_noimport = [];
193
+    // par defaut tout est importe sauf les tables ci-dessous
194
+    // possibiliter de definir cela tables via la meta
195
+    // compatibilite
196
+    if (isset($GLOBALS['meta']['IMPORT_tables_noimport'])) {
197
+        $IMPORT_tables_noimport = unserialize($GLOBALS['meta']['IMPORT_tables_noimport']);
198
+        if (!is_array($IMPORT_tables_noimport)) {
199
+            include_spip('inc/meta');
200
+            effacer_meta('IMPORT_tables_noimport');
201
+        }
202
+    }
203
+    $IMPORT_tables_noimport = pipeline('lister_tables_noimport', $IMPORT_tables_noimport);
204
+
205
+    return $IMPORT_tables_noimport;
206 206
 }
207 207
 
208 208
 
@@ -214,23 +214,23 @@  discard block
 block discarded – undo
214 214
  * @return array
215 215
  */
216 216
 function lister_tables_noerase() {
217
-	static $IMPORT_tables_noerase = null;
218
-	if (!is_null($IMPORT_tables_noerase)) {
219
-		return $IMPORT_tables_noerase;
220
-	}
221
-
222
-	$IMPORT_tables_noerase = [
223
-		'spip_meta',
224
-		// par defaut on ne vide pas les stats, car elles ne figurent pas dans les dump
225
-		// et le cas echeant, un bouton dans l'admin permet de les vider a la main...
226
-		'spip_referers',
227
-		'spip_referers_articles',
228
-		'spip_visites',
229
-		'spip_visites_articles'
230
-	];
231
-	$IMPORT_tables_noerase = pipeline('lister_tables_noerase', $IMPORT_tables_noerase);
232
-
233
-	return $IMPORT_tables_noerase;
217
+    static $IMPORT_tables_noerase = null;
218
+    if (!is_null($IMPORT_tables_noerase)) {
219
+        return $IMPORT_tables_noerase;
220
+    }
221
+
222
+    $IMPORT_tables_noerase = [
223
+        'spip_meta',
224
+        // par defaut on ne vide pas les stats, car elles ne figurent pas dans les dump
225
+        // et le cas echeant, un bouton dans l'admin permet de les vider a la main...
226
+        'spip_referers',
227
+        'spip_referers_articles',
228
+        'spip_visites',
229
+        'spip_visites_articles'
230
+    ];
231
+    $IMPORT_tables_noerase = pipeline('lister_tables_noerase', $IMPORT_tables_noerase);
232
+
233
+    return $IMPORT_tables_noerase;
234 234
 }
235 235
 
236 236
 
@@ -244,86 +244,86 @@  discard block
 block discarded – undo
244 244
  * @return array
245 245
  */
246 246
 function base_liste_table_for_dump($exclude_tables = []) {
247
-	$tables_for_dump = [];
248
-	$tables_pointees = [];
249
-	$tables = [];
250
-	$tables_principales = $GLOBALS['tables_principales'];
251
-	$tables_auxiliaires = $GLOBALS['tables_auxiliaires'];
252
-	$tables_jointures = $GLOBALS['tables_jointures'];
253
-
254
-	if (
255
-		include_spip('base/objets')
256
-		&& function_exists('lister_tables_objets_sql')
257
-	) {
258
-		$tables = lister_tables_objets_sql();
259
-		foreach ($tables as $t => $infos) {
260
-			if ($infos['principale'] && !isset($tables_principales[$t])) {
261
-				$tables_principales[$t] = true;
262
-			}
263
-			if (!$infos['principale'] && !isset($tables_auxiliaires[$t])) {
264
-				$tables_auxiliaires[$t] = true;
265
-			}
266
-			if (is_countable($infos['tables_jointures']) ? count($infos['tables_jointures']) : 0) {
267
-				$tables_jointures[$t] = array_merge(
268
-					$tables_jointures[$t] ?? [],
269
-					$infos['tables_jointures']
270
-				);
271
-			}
272
-		}
273
-	}
274
-
275
-	// on construit un index des tables de liens
276
-	// pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees
277
-	$tables_for_link = [];
278
-	foreach ($tables_jointures as $table => $liste_relations) {
279
-		if (is_array($liste_relations)) {
280
-			$nom = $table;
281
-			if (!isset($tables_auxiliaires[$nom]) && !isset($tables_principales[$nom])) {
282
-				$nom = "spip_$table";
283
-			}
284
-			if (isset($tables_auxiliaires[$nom]) || isset($tables_principales[$nom])) {
285
-				foreach ($liste_relations as $link_table) {
286
-					if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/) {
287
-						$tables_for_link[$link_table][] = $nom;
288
-					} else {
289
-						if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/) {
290
-							$tables_for_link["spip_$link_table"][] = $nom;
291
-						}
292
-					}
293
-				}
294
-			}
295
-		}
296
-	}
297
-
298
-	$liste_tables = [...array_keys($tables_principales), ...array_keys($tables_auxiliaires), ...array_keys($tables)];
299
-	foreach ($liste_tables as $table) {
300
-		//		$name = preg_replace("{^spip_}","",$table);
301
-		if (
302
-			!isset($tables_pointees[$table])
303
-			&& !in_array($table, $exclude_tables)
304
-			&& !isset($tables_for_link[$table])
305
-		) {
306
-			$tables_for_dump[] = $table;
307
-			$tables_pointees[$table] = 1;
308
-		}
309
-	}
310
-	foreach ($tables_for_link as $link_table => $liste) {
311
-		$connecte = true;
312
-		foreach ($liste as $connect_table) {
313
-			if (!in_array($connect_table, $tables_for_dump)) {
314
-				$connecte = false;
315
-			}
316
-		}
317
-		if ($connecte) {
318
-			# on ajoute les liaisons en premier
319
-			# si une restauration est interrompue,
320
-			# cela se verra mieux si il manque des objets
321
-			# que des liens
322
-		array_unshift($tables_for_dump, $link_table);
323
-		}
324
-	}
325
-
326
-	return [$tables_for_dump, $tables_for_link];
247
+    $tables_for_dump = [];
248
+    $tables_pointees = [];
249
+    $tables = [];
250
+    $tables_principales = $GLOBALS['tables_principales'];
251
+    $tables_auxiliaires = $GLOBALS['tables_auxiliaires'];
252
+    $tables_jointures = $GLOBALS['tables_jointures'];
253
+
254
+    if (
255
+        include_spip('base/objets')
256
+        && function_exists('lister_tables_objets_sql')
257
+    ) {
258
+        $tables = lister_tables_objets_sql();
259
+        foreach ($tables as $t => $infos) {
260
+            if ($infos['principale'] && !isset($tables_principales[$t])) {
261
+                $tables_principales[$t] = true;
262
+            }
263
+            if (!$infos['principale'] && !isset($tables_auxiliaires[$t])) {
264
+                $tables_auxiliaires[$t] = true;
265
+            }
266
+            if (is_countable($infos['tables_jointures']) ? count($infos['tables_jointures']) : 0) {
267
+                $tables_jointures[$t] = array_merge(
268
+                    $tables_jointures[$t] ?? [],
269
+                    $infos['tables_jointures']
270
+                );
271
+            }
272
+        }
273
+    }
274
+
275
+    // on construit un index des tables de liens
276
+    // pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees
277
+    $tables_for_link = [];
278
+    foreach ($tables_jointures as $table => $liste_relations) {
279
+        if (is_array($liste_relations)) {
280
+            $nom = $table;
281
+            if (!isset($tables_auxiliaires[$nom]) && !isset($tables_principales[$nom])) {
282
+                $nom = "spip_$table";
283
+            }
284
+            if (isset($tables_auxiliaires[$nom]) || isset($tables_principales[$nom])) {
285
+                foreach ($liste_relations as $link_table) {
286
+                    if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/) {
287
+                        $tables_for_link[$link_table][] = $nom;
288
+                    } else {
289
+                        if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/) {
290
+                            $tables_for_link["spip_$link_table"][] = $nom;
291
+                        }
292
+                    }
293
+                }
294
+            }
295
+        }
296
+    }
297
+
298
+    $liste_tables = [...array_keys($tables_principales), ...array_keys($tables_auxiliaires), ...array_keys($tables)];
299
+    foreach ($liste_tables as $table) {
300
+        //		$name = preg_replace("{^spip_}","",$table);
301
+        if (
302
+            !isset($tables_pointees[$table])
303
+            && !in_array($table, $exclude_tables)
304
+            && !isset($tables_for_link[$table])
305
+        ) {
306
+            $tables_for_dump[] = $table;
307
+            $tables_pointees[$table] = 1;
308
+        }
309
+    }
310
+    foreach ($tables_for_link as $link_table => $liste) {
311
+        $connecte = true;
312
+        foreach ($liste as $connect_table) {
313
+            if (!in_array($connect_table, $tables_for_dump)) {
314
+                $connecte = false;
315
+            }
316
+        }
317
+        if ($connecte) {
318
+            # on ajoute les liaisons en premier
319
+            # si une restauration est interrompue,
320
+            # cela se verra mieux si il manque des objets
321
+            # que des liens
322
+        array_unshift($tables_for_dump, $link_table);
323
+        }
324
+    }
325
+
326
+    return [$tables_for_dump, $tables_for_link];
327 327
 }
328 328
 
329 329
 /**
@@ -338,34 +338,34 @@  discard block
 block discarded – undo
338 338
  * @param string $serveur
339 339
  */
340 340
 function base_vider_tables_destination_copie($tables, $exclure_tables = [], $serveur = '') {
341
-	$trouver_table = charger_fonction('trouver_table', 'base');
342
-
343
-	spip_logger('base')->notice(
344
-		'Vider ' . count($tables) . " tables sur serveur '$serveur' : " . implode(', ', $tables),
345
-	);
346
-	foreach ($tables as $table) {
347
-		// sur le serveur principal, il ne faut pas supprimer l'auteur loge !
348
-		if (!in_array($table, $exclure_tables) && ($table != 'spip_auteurs' || $serveur != '')) {
349
-			// regarder si il y a au moins un champ impt='non'
350
-			$desc = $trouver_table($table, $serveur);
351
-			if (isset($desc['field']['impt'])) {
352
-				sql_delete($table, "impt='oui'", $serveur);
353
-			} elseif ($desc) {
354
-				sql_delete($table, '', $serveur);
355
-			}
356
-		}
357
-	}
358
-
359
-	// sur le serveur principal, il ne faut pas supprimer l'auteur loge !
360
-	// Bidouille pour garder l'acces admin actuel pendant toute la restauration
361
-	if (
362
-		$serveur == ''
363
-		&& in_array('spip_auteurs', $tables)
364
-		&& !in_array('spip_auteurs', $exclure_tables)
365
-	) {
366
-		base_conserver_copieur(true, $serveur);
367
-		sql_delete('spip_auteurs', 'id_auteur>0', $serveur);
368
-	}
341
+    $trouver_table = charger_fonction('trouver_table', 'base');
342
+
343
+    spip_logger('base')->notice(
344
+        'Vider ' . count($tables) . " tables sur serveur '$serveur' : " . implode(', ', $tables),
345
+    );
346
+    foreach ($tables as $table) {
347
+        // sur le serveur principal, il ne faut pas supprimer l'auteur loge !
348
+        if (!in_array($table, $exclure_tables) && ($table != 'spip_auteurs' || $serveur != '')) {
349
+            // regarder si il y a au moins un champ impt='non'
350
+            $desc = $trouver_table($table, $serveur);
351
+            if (isset($desc['field']['impt'])) {
352
+                sql_delete($table, "impt='oui'", $serveur);
353
+            } elseif ($desc) {
354
+                sql_delete($table, '', $serveur);
355
+            }
356
+        }
357
+    }
358
+
359
+    // sur le serveur principal, il ne faut pas supprimer l'auteur loge !
360
+    // Bidouille pour garder l'acces admin actuel pendant toute la restauration
361
+    if (
362
+        $serveur == ''
363
+        && in_array('spip_auteurs', $tables)
364
+        && !in_array('spip_auteurs', $exclure_tables)
365
+    ) {
366
+        base_conserver_copieur(true, $serveur);
367
+        sql_delete('spip_auteurs', 'id_auteur>0', $serveur);
368
+    }
369 369
 }
370 370
 
371 371
 /**
@@ -376,35 +376,35 @@  discard block
 block discarded – undo
376 376
  * @return void
377 377
  */
378 378
 function base_conserver_copieur($move = true, $serveur = '') {
379
-	// s'asurer qu'on a pas deja fait la manip !
380
-	if ($GLOBALS['visiteur_session']['id_auteur'] > 0 && sql_countsel('spip_auteurs', 'id_auteur>0')) {
381
-		spip_logger('dump')->notice(
382
-			'Conserver copieur dans id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'] . " pour le serveur '$serveur'",
383
-		);
384
-		sql_delete('spip_auteurs', 'id_auteur<0', $serveur);
385
-		if ($move) {
386
-			sql_updateq(
387
-				'spip_auteurs',
388
-				['id_auteur' => -$GLOBALS['visiteur_session']['id_auteur']],
389
-				'id_auteur=' . (int) $GLOBALS['visiteur_session']['id_auteur'],
390
-				[],
391
-				$serveur
392
-			);
393
-		} else {
394
-			$row = sql_fetsel(
395
-				'*',
396
-				'spip_auteurs',
397
-				'id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'],
398
-				'',
399
-				'',
400
-				'',
401
-				'',
402
-				$serveur
403
-			);
404
-			$row['id_auteur'] = -$GLOBALS['visiteur_session']['id_auteur'];
405
-			sql_insertq('spip_auteurs', $row, [], $serveur);
406
-		}
407
-	}
379
+    // s'asurer qu'on a pas deja fait la manip !
380
+    if ($GLOBALS['visiteur_session']['id_auteur'] > 0 && sql_countsel('spip_auteurs', 'id_auteur>0')) {
381
+        spip_logger('dump')->notice(
382
+            'Conserver copieur dans id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'] . " pour le serveur '$serveur'",
383
+        );
384
+        sql_delete('spip_auteurs', 'id_auteur<0', $serveur);
385
+        if ($move) {
386
+            sql_updateq(
387
+                'spip_auteurs',
388
+                ['id_auteur' => -$GLOBALS['visiteur_session']['id_auteur']],
389
+                'id_auteur=' . (int) $GLOBALS['visiteur_session']['id_auteur'],
390
+                [],
391
+                $serveur
392
+            );
393
+        } else {
394
+            $row = sql_fetsel(
395
+                '*',
396
+                'spip_auteurs',
397
+                'id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'],
398
+                '',
399
+                '',
400
+                '',
401
+                '',
402
+                $serveur
403
+            );
404
+            $row['id_auteur'] = -$GLOBALS['visiteur_session']['id_auteur'];
405
+            sql_insertq('spip_auteurs', $row, [], $serveur);
406
+        }
407
+    }
408 408
 }
409 409
 
410 410
 /**
@@ -419,20 +419,20 @@  discard block
 block discarded – undo
419 419
  * @param string $serveur
420 420
  */
421 421
 function base_detruire_copieur_si_besoin($serveur = '') {
422
-	// rien a faire si ce n'est pas le serveur principal !
423
-	if ($serveur == '') {
424
-		if (sql_countsel('spip_auteurs', 'id_auteur>0')) {
425
-			spip_logger('dump')->notice("Detruire copieur id_auteur<0 pour le serveur '$serveur'");
426
-			sql_delete('spip_auteurs', 'id_auteur<0', $serveur);
427
-		} else {
428
-			spip_logger('dump')->notice(
429
-				"Restaurer copieur id_auteur<0 pour le serveur '$serveur' (aucun autre auteur en base)",
430
-			);
431
-			sql_update('spip_auteurs', ['id_auteur' => '-id_auteur'], 'id_auteur<0');
432
-		}
433
-	} else {
434
-		spip_logger('dump')->notice("Pas de destruction copieur sur serveur '$serveur'");
435
-	}
422
+    // rien a faire si ce n'est pas le serveur principal !
423
+    if ($serveur == '') {
424
+        if (sql_countsel('spip_auteurs', 'id_auteur>0')) {
425
+            spip_logger('dump')->notice("Detruire copieur id_auteur<0 pour le serveur '$serveur'");
426
+            sql_delete('spip_auteurs', 'id_auteur<0', $serveur);
427
+        } else {
428
+            spip_logger('dump')->notice(
429
+                "Restaurer copieur id_auteur<0 pour le serveur '$serveur' (aucun autre auteur en base)",
430
+            );
431
+            sql_update('spip_auteurs', ['id_auteur' => '-id_auteur'], 'id_auteur<0');
432
+        }
433
+    } else {
434
+        spip_logger('dump')->notice("Pas de destruction copieur sur serveur '$serveur'");
435
+    }
436 436
 }
437 437
 
438 438
 /**
@@ -447,40 +447,40 @@  discard block
 block discarded – undo
447 447
  * @return array
448 448
  */
449 449
 function base_preparer_table_dest($table, $desc, $serveur_dest, $init = false) {
450
-	$upgrade = false;
451
-	// si la table existe et qu'on est a l'init, la dropper
452
-	if (($desc_dest = sql_showtable($table, true, $serveur_dest)) && $init) {
453
-		if ($serveur_dest == '' && in_array($table, ['spip_meta', 'spip_auteurs'])) {
454
-			// ne pas dropper auteurs et meta sur le serveur principal
455
-			// faire un simple upgrade a la place
456
-			// pour ajouter les champs manquants
457
-			$upgrade = true;
458
-			// coherence avec le drop sur les autres tables
459
-			base_vider_tables_destination_copie([$table], [], $serveur_dest);
460
-			if ($table == 'spip_meta') {
461
-				// virer les version base qui vont venir avec l'import
462
-				sql_delete($table, "nom like '%_base_version'", $serveur_dest);
463
-				// hum casse la base si pas version_installee a l'import ...
464
-				sql_delete($table, "nom='version_installee'", $serveur_dest);
465
-			}
466
-		} else {
467
-			sql_drop_table($table, '', $serveur_dest);
468
-			spip_logger('dump')->notice("drop table '$table' sur serveur '$serveur_dest'");
469
-		}
470
-		$desc_dest = false;
471
-	}
472
-	// si la table n'existe pas dans la destination, la creer a l'identique !
473
-	if (!$desc_dest) {
474
-		spip_logger('dump')->notice("creation '$table' sur serveur '$serveur_dest'");
475
-		include_spip('base/create');
476
-		creer_ou_upgrader_table($table, $desc, 'auto', $upgrade, $serveur_dest);
477
-		$desc_dest = sql_showtable($table, true, $serveur_dest);
478
-	}
479
-	if (!$desc_dest) {
480
-		spip_logger('dump')->error("Erreur creation '$table' sur serveur '$serveur_dest'" . var_export($desc, 1));
481
-	}
482
-
483
-	return $desc_dest;
450
+    $upgrade = false;
451
+    // si la table existe et qu'on est a l'init, la dropper
452
+    if (($desc_dest = sql_showtable($table, true, $serveur_dest)) && $init) {
453
+        if ($serveur_dest == '' && in_array($table, ['spip_meta', 'spip_auteurs'])) {
454
+            // ne pas dropper auteurs et meta sur le serveur principal
455
+            // faire un simple upgrade a la place
456
+            // pour ajouter les champs manquants
457
+            $upgrade = true;
458
+            // coherence avec le drop sur les autres tables
459
+            base_vider_tables_destination_copie([$table], [], $serveur_dest);
460
+            if ($table == 'spip_meta') {
461
+                // virer les version base qui vont venir avec l'import
462
+                sql_delete($table, "nom like '%_base_version'", $serveur_dest);
463
+                // hum casse la base si pas version_installee a l'import ...
464
+                sql_delete($table, "nom='version_installee'", $serveur_dest);
465
+            }
466
+        } else {
467
+            sql_drop_table($table, '', $serveur_dest);
468
+            spip_logger('dump')->notice("drop table '$table' sur serveur '$serveur_dest'");
469
+        }
470
+        $desc_dest = false;
471
+    }
472
+    // si la table n'existe pas dans la destination, la creer a l'identique !
473
+    if (!$desc_dest) {
474
+        spip_logger('dump')->notice("creation '$table' sur serveur '$serveur_dest'");
475
+        include_spip('base/create');
476
+        creer_ou_upgrader_table($table, $desc, 'auto', $upgrade, $serveur_dest);
477
+        $desc_dest = sql_showtable($table, true, $serveur_dest);
478
+    }
479
+    if (!$desc_dest) {
480
+        spip_logger('dump')->error("Erreur creation '$table' sur serveur '$serveur_dest'" . var_export($desc, 1));
481
+    }
482
+
483
+    return $desc_dest;
484 484
 }
485 485
 
486 486
 /**
@@ -526,210 +526,210 @@  discard block
 block discarded – undo
526 526
  */
527 527
 function base_copier_tables($status_file, $tables, $serveur_source, $serveur_dest, $options = []) {
528 528
 
529
-	$status = [];
530
-	$callback_progression = $options['callback_progression'] ?? '';
531
-	$max_time = $options['max_time'] ?? 0;
532
-	$drop_source = $options['drop_source'] ?? false;
533
-	$no_erase_dest = $options['no_erase_dest'] ?? [];
534
-	$where = $options['where'] ?? [];
535
-	$fonction_base_inserer = $options['fonction_base_inserer'] ?? 'inserer_copie';
536
-	$desc_tables_dest = $options['desc_tables_dest'] ?? [];
537
-	$racine_fonctions = $options['racine_fonctions_dest'] ?? 'base';
538
-	$data_pool = $options['data_pool'] ?? 50 * 1024;
539
-
540
-	$logger = spip_logger('dump');
541
-
542
-	$logger->notice(
543
-		'Copier ' . count($tables) . " tables de '$serveur_source' vers '$serveur_dest'",
544
-	);
545
-
546
-	if (!$inserer_copie = charger_fonction($fonction_base_inserer, $racine_fonctions, true)) {
547
-		$logger->notice("Fonction '{$racine_fonctions}_$fonction_base_inserer' inconnue. Abandon");
548
-
549
-		return true; // echec mais on a fini, donc true
550
-	}
551
-	if (!$preparer_table_dest = charger_fonction('preparer_table_dest', $racine_fonctions, true)) {
552
-		$logger->notice("Fonction '{$racine_fonctions}_$preparer_table_dest' inconnue. Abandon");
553
-
554
-		return true; // echec mais on a fini, donc true
555
-	}
556
-
557
-	if (
558
-		!lire_fichier($status_file, $status)
559
-		|| !($status = unserialize($status))
560
-	) {
561
-		$status = [];
562
-	}
563
-	$status['etape'] = 'basecopie';
564
-
565
-	// puis relister les tables a importer
566
-	// et les vider si besoin, au moment du premier passage ici
567
-	$initialisation_copie = $status['dump_status_copie'] ?? 0;
568
-
569
-	// si init pas encore faite, vider les tables du serveur destination
570
-	if (!$initialisation_copie) {
571
-		if (
572
-			!$vider_tables_destination_copie = charger_fonction(
573
-				'vider_tables_destination_copie',
574
-				$racine_fonctions,
575
-				true
576
-			)
577
-		) {
578
-			$logger->notice(
579
-				"Fonction '{$racine_fonctions}_vider_tables_destination_copie' inconnue. Abandon",
580
-			);
581
-
582
-			return true; // echec mais on a fini, donc true
583
-		}
584
-		$vider_tables_destination_copie($tables, $no_erase_dest, $serveur_dest);
585
-		$status['dump_status_copie'] = 'ok';
586
-		ecrire_fichier($status_file, serialize($status));
587
-	}
588
-
589
-	// les tables auteurs et meta doivent etre copiees en dernier !
590
-	if (in_array('spip_auteurs', $tables)) {
591
-		$tables = array_diff($tables, ['spip_auteurs']);
592
-		$tables[] = 'spip_auteurs';
593
-	}
594
-	if (in_array('spip_meta', $tables)) {
595
-		$tables = array_diff($tables, ['spip_meta']);
596
-		$tables[] = 'spip_meta';
597
-	}
598
-	$logger->info('Tables a copier :' . implode(', ', $tables));
599
-
600
-	$trouver_table = charger_fonction('trouver_table', 'base');
601
-
602
-	foreach ($tables as $table) {
603
-		// si table commence par spip_ c'est une table SPIP, renommer le prefixe si besoin
604
-		// sinon chercher la vraie table
605
-		$desc_source = false;
606
-		if (str_starts_with((string) $table, 'spip_')) {
607
-			$desc_source = $trouver_table(preg_replace(',^spip_,', '', (string) $table), $serveur_source, true);
608
-		}
609
-		if (!$desc_source || !isset($desc_source['exist']) || !$desc_source['exist']) {
610
-			$desc_source = $trouver_table($table, $serveur_source, false);
611
-		}
612
-
613
-		// verifier que la table est presente dans la base source
614
-		if ($desc_source) {
615
-			// $status['tables_copiees'][$table] contient l'avancement
616
-			// de la copie pour la $table : 0 a N et -N quand elle est finie (-1 si vide et finie...)
617
-			if (!isset($status['tables_copiees'][$table])) {
618
-				$status['tables_copiees'][$table] = 0;
619
-			}
620
-
621
-			if (
622
-				is_numeric($status['tables_copiees'][$table])
623
-				&& $status['tables_copiees'][$table] >= 0
624
-				&& ($desc_dest = $preparer_table_dest(
625
-					$table,
626
-					$desc_tables_dest[$table] ?? $desc_source,
627
-					$serveur_dest,
628
-					$status['tables_copiees'][$table] == 0
629
-				))
630
-			) {
631
-				if ($callback_progression) {
632
-					$callback_progression($status['tables_copiees'][$table], 0, $table);
633
-				}
634
-				while (true) {
635
-					$n = (int) $status['tables_copiees'][$table];
636
-					// on copie par lot de 400
637
-					$res = sql_select(
638
-						'*',
639
-						$table,
640
-						$where[$table] ?? '',
641
-						'',
642
-						'',
643
-						"$n,400",
644
-						'',
645
-						$serveur_source
646
-					);
647
-					while ($row = sql_fetch($res, $serveur_source)) {
648
-						$rows = [$row];
649
-						// lire un groupe de donnees si demande en option
650
-						// (permet un envoi par lot vers la destination)
651
-						if ($data_pool > 0) {
652
-							$s = strlen(serialize($row));
653
-							while ($s < $data_pool && ($row = sql_fetch($res, $serveur_source))) {
654
-								$s += strlen(serialize($row));
655
-								$rows[] = $row;
656
-							}
657
-						}
658
-						// si l'enregistrement est deja en base, ca fera un echec ou un doublon
659
-						// mais si ca renvoie false c'est une erreur fatale => abandon
660
-						if ($inserer_copie($table, $rows, $desc_dest, $serveur_dest) === false) {
661
-							// forcer la sortie, charge a l'appelant de gerer l'echec
662
-							$logger->error("Erreur fatale dans $inserer_copie table $table");
663
-							$status['errors'][] = "Erreur fatale  lors de la copie de la table $table";
664
-							ecrire_fichier($status_file, serialize($status));
665
-
666
-							// copie finie
667
-							return true;
668
-						}
669
-						$status['tables_copiees'][$table] += count($rows);
670
-						if ($max_time && time() > $max_time) {
671
-							break;
672
-						}
673
-					}
674
-					if ($n == $status['tables_copiees'][$table]) {
675
-						break;
676
-					}
677
-					$logger->notice("recopie $table " . $status['tables_copiees'][$table]);
678
-					if ($callback_progression) {
679
-						$callback_progression($status['tables_copiees'][$table], 0, $table);
680
-					}
681
-					ecrire_fichier($status_file, serialize($status));
682
-					if ($max_time && time() > $max_time) {
683
-						return false;
684
-					} // on a pas fini, mais le temps imparti est ecoule
685
-				}
686
-				if ($drop_source) {
687
-					sql_drop_table($table, '', $serveur_source);
688
-					$logger->notice("drop $table sur serveur source '$serveur_source'");
689
-				}
690
-				$status['tables_copiees'][$table] = ($status['tables_copiees'][$table] ? -$status['tables_copiees'][$table] : 'zero');
691
-				ecrire_fichier($status_file, serialize($status));
692
-				$logger->info('tables_recopiees ' . implode(',', array_keys($status['tables_copiees'])));
693
-				if ($callback_progression) {
694
-					$callback_progression($status['tables_copiees'][$table], $status['tables_copiees'][$table], $table);
695
-				}
696
-			} else {
697
-				if ($status['tables_copiees'][$table] < 0) {
698
-					$logger->info("Table $table deja copiee : " . $status['tables_copiees'][$table]);
699
-				}
700
-				if ($callback_progression) {
701
-					$callback_progression(
702
-						0,
703
-						$status['tables_copiees'][$table],
704
-						"$table" . ((is_numeric($status['tables_copiees'][$table]) && $status['tables_copiees'][$table] >= 0) ? '[Echec]' : '')
705
-					);
706
-				}
707
-			}
708
-		} else {
709
-			$status['errors'][] = "Impossible de lire la description de la table $table";
710
-			ecrire_fichier($status_file, serialize($status));
711
-			$logger->error("Impossible de lire la description de la table $table");
712
-		}
713
-	}
714
-
715
-	// si le nombre de tables envoyees n'est pas egal au nombre de tables demandees
716
-	// abandonner
717
-	if ((is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) < count($tables)) {
718
-		$logger->error(
719
-			'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables),
720
-		);
721
-		$status['errors'][] = 'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables);
722
-		ecrire_fichier($status_file, serialize($status));
723
-	}
724
-
725
-	if ($detruire_copieur_si_besoin = charger_fonction('detruire_copieur_si_besoin', $racine_fonctions, true)) {
726
-		$detruire_copieur_si_besoin($serveur_dest);
727
-	} else {
728
-		$logger->notice("Fonction '{$racine_fonctions}_detruire_copieur_si_besoin' inconnue.");
729
-	}
730
-
731
-	// OK, copie complete
732
-	return true;
529
+    $status = [];
530
+    $callback_progression = $options['callback_progression'] ?? '';
531
+    $max_time = $options['max_time'] ?? 0;
532
+    $drop_source = $options['drop_source'] ?? false;
533
+    $no_erase_dest = $options['no_erase_dest'] ?? [];
534
+    $where = $options['where'] ?? [];
535
+    $fonction_base_inserer = $options['fonction_base_inserer'] ?? 'inserer_copie';
536
+    $desc_tables_dest = $options['desc_tables_dest'] ?? [];
537
+    $racine_fonctions = $options['racine_fonctions_dest'] ?? 'base';
538
+    $data_pool = $options['data_pool'] ?? 50 * 1024;
539
+
540
+    $logger = spip_logger('dump');
541
+
542
+    $logger->notice(
543
+        'Copier ' . count($tables) . " tables de '$serveur_source' vers '$serveur_dest'",
544
+    );
545
+
546
+    if (!$inserer_copie = charger_fonction($fonction_base_inserer, $racine_fonctions, true)) {
547
+        $logger->notice("Fonction '{$racine_fonctions}_$fonction_base_inserer' inconnue. Abandon");
548
+
549
+        return true; // echec mais on a fini, donc true
550
+    }
551
+    if (!$preparer_table_dest = charger_fonction('preparer_table_dest', $racine_fonctions, true)) {
552
+        $logger->notice("Fonction '{$racine_fonctions}_$preparer_table_dest' inconnue. Abandon");
553
+
554
+        return true; // echec mais on a fini, donc true
555
+    }
556
+
557
+    if (
558
+        !lire_fichier($status_file, $status)
559
+        || !($status = unserialize($status))
560
+    ) {
561
+        $status = [];
562
+    }
563
+    $status['etape'] = 'basecopie';
564
+
565
+    // puis relister les tables a importer
566
+    // et les vider si besoin, au moment du premier passage ici
567
+    $initialisation_copie = $status['dump_status_copie'] ?? 0;
568
+
569
+    // si init pas encore faite, vider les tables du serveur destination
570
+    if (!$initialisation_copie) {
571
+        if (
572
+            !$vider_tables_destination_copie = charger_fonction(
573
+                'vider_tables_destination_copie',
574
+                $racine_fonctions,
575
+                true
576
+            )
577
+        ) {
578
+            $logger->notice(
579
+                "Fonction '{$racine_fonctions}_vider_tables_destination_copie' inconnue. Abandon",
580
+            );
581
+
582
+            return true; // echec mais on a fini, donc true
583
+        }
584
+        $vider_tables_destination_copie($tables, $no_erase_dest, $serveur_dest);
585
+        $status['dump_status_copie'] = 'ok';
586
+        ecrire_fichier($status_file, serialize($status));
587
+    }
588
+
589
+    // les tables auteurs et meta doivent etre copiees en dernier !
590
+    if (in_array('spip_auteurs', $tables)) {
591
+        $tables = array_diff($tables, ['spip_auteurs']);
592
+        $tables[] = 'spip_auteurs';
593
+    }
594
+    if (in_array('spip_meta', $tables)) {
595
+        $tables = array_diff($tables, ['spip_meta']);
596
+        $tables[] = 'spip_meta';
597
+    }
598
+    $logger->info('Tables a copier :' . implode(', ', $tables));
599
+
600
+    $trouver_table = charger_fonction('trouver_table', 'base');
601
+
602
+    foreach ($tables as $table) {
603
+        // si table commence par spip_ c'est une table SPIP, renommer le prefixe si besoin
604
+        // sinon chercher la vraie table
605
+        $desc_source = false;
606
+        if (str_starts_with((string) $table, 'spip_')) {
607
+            $desc_source = $trouver_table(preg_replace(',^spip_,', '', (string) $table), $serveur_source, true);
608
+        }
609
+        if (!$desc_source || !isset($desc_source['exist']) || !$desc_source['exist']) {
610
+            $desc_source = $trouver_table($table, $serveur_source, false);
611
+        }
612
+
613
+        // verifier que la table est presente dans la base source
614
+        if ($desc_source) {
615
+            // $status['tables_copiees'][$table] contient l'avancement
616
+            // de la copie pour la $table : 0 a N et -N quand elle est finie (-1 si vide et finie...)
617
+            if (!isset($status['tables_copiees'][$table])) {
618
+                $status['tables_copiees'][$table] = 0;
619
+            }
620
+
621
+            if (
622
+                is_numeric($status['tables_copiees'][$table])
623
+                && $status['tables_copiees'][$table] >= 0
624
+                && ($desc_dest = $preparer_table_dest(
625
+                    $table,
626
+                    $desc_tables_dest[$table] ?? $desc_source,
627
+                    $serveur_dest,
628
+                    $status['tables_copiees'][$table] == 0
629
+                ))
630
+            ) {
631
+                if ($callback_progression) {
632
+                    $callback_progression($status['tables_copiees'][$table], 0, $table);
633
+                }
634
+                while (true) {
635
+                    $n = (int) $status['tables_copiees'][$table];
636
+                    // on copie par lot de 400
637
+                    $res = sql_select(
638
+                        '*',
639
+                        $table,
640
+                        $where[$table] ?? '',
641
+                        '',
642
+                        '',
643
+                        "$n,400",
644
+                        '',
645
+                        $serveur_source
646
+                    );
647
+                    while ($row = sql_fetch($res, $serveur_source)) {
648
+                        $rows = [$row];
649
+                        // lire un groupe de donnees si demande en option
650
+                        // (permet un envoi par lot vers la destination)
651
+                        if ($data_pool > 0) {
652
+                            $s = strlen(serialize($row));
653
+                            while ($s < $data_pool && ($row = sql_fetch($res, $serveur_source))) {
654
+                                $s += strlen(serialize($row));
655
+                                $rows[] = $row;
656
+                            }
657
+                        }
658
+                        // si l'enregistrement est deja en base, ca fera un echec ou un doublon
659
+                        // mais si ca renvoie false c'est une erreur fatale => abandon
660
+                        if ($inserer_copie($table, $rows, $desc_dest, $serveur_dest) === false) {
661
+                            // forcer la sortie, charge a l'appelant de gerer l'echec
662
+                            $logger->error("Erreur fatale dans $inserer_copie table $table");
663
+                            $status['errors'][] = "Erreur fatale  lors de la copie de la table $table";
664
+                            ecrire_fichier($status_file, serialize($status));
665
+
666
+                            // copie finie
667
+                            return true;
668
+                        }
669
+                        $status['tables_copiees'][$table] += count($rows);
670
+                        if ($max_time && time() > $max_time) {
671
+                            break;
672
+                        }
673
+                    }
674
+                    if ($n == $status['tables_copiees'][$table]) {
675
+                        break;
676
+                    }
677
+                    $logger->notice("recopie $table " . $status['tables_copiees'][$table]);
678
+                    if ($callback_progression) {
679
+                        $callback_progression($status['tables_copiees'][$table], 0, $table);
680
+                    }
681
+                    ecrire_fichier($status_file, serialize($status));
682
+                    if ($max_time && time() > $max_time) {
683
+                        return false;
684
+                    } // on a pas fini, mais le temps imparti est ecoule
685
+                }
686
+                if ($drop_source) {
687
+                    sql_drop_table($table, '', $serveur_source);
688
+                    $logger->notice("drop $table sur serveur source '$serveur_source'");
689
+                }
690
+                $status['tables_copiees'][$table] = ($status['tables_copiees'][$table] ? -$status['tables_copiees'][$table] : 'zero');
691
+                ecrire_fichier($status_file, serialize($status));
692
+                $logger->info('tables_recopiees ' . implode(',', array_keys($status['tables_copiees'])));
693
+                if ($callback_progression) {
694
+                    $callback_progression($status['tables_copiees'][$table], $status['tables_copiees'][$table], $table);
695
+                }
696
+            } else {
697
+                if ($status['tables_copiees'][$table] < 0) {
698
+                    $logger->info("Table $table deja copiee : " . $status['tables_copiees'][$table]);
699
+                }
700
+                if ($callback_progression) {
701
+                    $callback_progression(
702
+                        0,
703
+                        $status['tables_copiees'][$table],
704
+                        "$table" . ((is_numeric($status['tables_copiees'][$table]) && $status['tables_copiees'][$table] >= 0) ? '[Echec]' : '')
705
+                    );
706
+                }
707
+            }
708
+        } else {
709
+            $status['errors'][] = "Impossible de lire la description de la table $table";
710
+            ecrire_fichier($status_file, serialize($status));
711
+            $logger->error("Impossible de lire la description de la table $table");
712
+        }
713
+    }
714
+
715
+    // si le nombre de tables envoyees n'est pas egal au nombre de tables demandees
716
+    // abandonner
717
+    if ((is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) < count($tables)) {
718
+        $logger->error(
719
+            'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables),
720
+        );
721
+        $status['errors'][] = 'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables);
722
+        ecrire_fichier($status_file, serialize($status));
723
+    }
724
+
725
+    if ($detruire_copieur_si_besoin = charger_fonction('detruire_copieur_si_besoin', $racine_fonctions, true)) {
726
+        $detruire_copieur_si_besoin($serveur_dest);
727
+    } else {
728
+        $logger->notice("Fonction '{$racine_fonctions}_detruire_copieur_si_besoin' inconnue.");
729
+    }
730
+
731
+    // OK, copie complete
732
+    return true;
733 733
 }
734 734
 
735 735
 /**
@@ -743,29 +743,29 @@  discard block
 block discarded – undo
743 743
  */
744 744
 function base_inserer_copie($table, $rows, $desc_dest, $serveur_dest) {
745 745
 
746
-	// verifier le nombre d'insertion
747
-	$nb1 = sql_countsel($table, '', '', '', $serveur_dest);
748
-	// si l'enregistrement est deja en base, ca fera un echec ou un doublon
749
-	$r = sql_insertq_multi($table, $rows, $desc_dest, $serveur_dest);
750
-	$nb = sql_countsel($table, '', '', '', $serveur_dest);
751
-	if ($nb - $nb1 < count($rows)) {
752
-		spip_logger('dump')->notice(
753
-			'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . '. On retente 1 par 1',
754
-		);
755
-		foreach ($rows as $row) {
756
-			// si l'enregistrement est deja en base, ca fera un echec ou un doublon
757
-			$r = sql_insertq($table, $row, $desc_dest, $serveur_dest);
758
-		}
759
-		// on reverifie le total
760
-		$r = 0;
761
-		$nb = sql_countsel($table, '', '', '', $serveur_dest);
762
-		if ($nb - $nb1 < count($rows)) {
763
-			spip_logger('dump')->error(
764
-				'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . ' apres insertion 1 par 1',
765
-			);
766
-			$r = false;
767
-		}
768
-	}
769
-
770
-	return $r;
746
+    // verifier le nombre d'insertion
747
+    $nb1 = sql_countsel($table, '', '', '', $serveur_dest);
748
+    // si l'enregistrement est deja en base, ca fera un echec ou un doublon
749
+    $r = sql_insertq_multi($table, $rows, $desc_dest, $serveur_dest);
750
+    $nb = sql_countsel($table, '', '', '', $serveur_dest);
751
+    if ($nb - $nb1 < count($rows)) {
752
+        spip_logger('dump')->notice(
753
+            'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . '. On retente 1 par 1',
754
+        );
755
+        foreach ($rows as $row) {
756
+            // si l'enregistrement est deja en base, ca fera un echec ou un doublon
757
+            $r = sql_insertq($table, $row, $desc_dest, $serveur_dest);
758
+        }
759
+        // on reverifie le total
760
+        $r = 0;
761
+        $nb = sql_countsel($table, '', '', '', $serveur_dest);
762
+        if ($nb - $nb1 < count($rows)) {
763
+            spip_logger('dump')->error(
764
+                'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . ' apres insertion 1 par 1',
765
+            );
766
+            $r = false;
767
+        }
768
+    }
769
+
770
+    return $r;
771 771
 }
Please login to merge, or discard this patch.
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -37,7 +37,7 @@  discard block
 block discarded – undo
37 37
  * @return string
38 38
  **/
39 39
 function base_dump_meta_name($rub) {
40
-	return $meta = "status_dump_{$rub}_" . abs($GLOBALS['visiteur_session']['id_auteur']);
40
+	return $meta = "status_dump_{$rub}_".abs($GLOBALS['visiteur_session']['id_auteur']);
41 41
 }
42 42
 
43 43
 /**
@@ -82,7 +82,7 @@  discard block
 block discarded – undo
82 82
 	$connexion = $GLOBALS['connexions'][$serveur ?: 0];
83 83
 	$prefixe = $connexion['prefixe'];
84 84
 
85
-	$p = '/^' . $prefixe . '/';
85
+	$p = '/^'.$prefixe.'/';
86 86
 	$res = $tables;
87 87
 	foreach (sql_alltable(null, $serveur) as $t) {
88 88
 		if (preg_match($p, (string) $t)) {
@@ -341,7 +341,7 @@  discard block
 block discarded – undo
341 341
 	$trouver_table = charger_fonction('trouver_table', 'base');
342 342
 
343 343
 	spip_logger('base')->notice(
344
-		'Vider ' . count($tables) . " tables sur serveur '$serveur' : " . implode(', ', $tables),
344
+		'Vider '.count($tables)." tables sur serveur '$serveur' : ".implode(', ', $tables),
345 345
 	);
346 346
 	foreach ($tables as $table) {
347 347
 		// sur le serveur principal, il ne faut pas supprimer l'auteur loge !
@@ -379,14 +379,14 @@  discard block
 block discarded – undo
379 379
 	// s'asurer qu'on a pas deja fait la manip !
380 380
 	if ($GLOBALS['visiteur_session']['id_auteur'] > 0 && sql_countsel('spip_auteurs', 'id_auteur>0')) {
381 381
 		spip_logger('dump')->notice(
382
-			'Conserver copieur dans id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'] . " pour le serveur '$serveur'",
382
+			'Conserver copieur dans id_auteur='.$GLOBALS['visiteur_session']['id_auteur']." pour le serveur '$serveur'",
383 383
 		);
384 384
 		sql_delete('spip_auteurs', 'id_auteur<0', $serveur);
385 385
 		if ($move) {
386 386
 			sql_updateq(
387 387
 				'spip_auteurs',
388 388
 				['id_auteur' => -$GLOBALS['visiteur_session']['id_auteur']],
389
-				'id_auteur=' . (int) $GLOBALS['visiteur_session']['id_auteur'],
389
+				'id_auteur='.(int) $GLOBALS['visiteur_session']['id_auteur'],
390 390
 				[],
391 391
 				$serveur
392 392
 			);
@@ -394,7 +394,7 @@  discard block
 block discarded – undo
394 394
 			$row = sql_fetsel(
395 395
 				'*',
396 396
 				'spip_auteurs',
397
-				'id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'],
397
+				'id_auteur='.$GLOBALS['visiteur_session']['id_auteur'],
398 398
 				'',
399 399
 				'',
400 400
 				'',
@@ -477,7 +477,7 @@  discard block
 block discarded – undo
477 477
 		$desc_dest = sql_showtable($table, true, $serveur_dest);
478 478
 	}
479 479
 	if (!$desc_dest) {
480
-		spip_logger('dump')->error("Erreur creation '$table' sur serveur '$serveur_dest'" . var_export($desc, 1));
480
+		spip_logger('dump')->error("Erreur creation '$table' sur serveur '$serveur_dest'".var_export($desc, 1));
481 481
 	}
482 482
 
483 483
 	return $desc_dest;
@@ -540,7 +540,7 @@  discard block
 block discarded – undo
540 540
 	$logger = spip_logger('dump');
541 541
 
542 542
 	$logger->notice(
543
-		'Copier ' . count($tables) . " tables de '$serveur_source' vers '$serveur_dest'",
543
+		'Copier '.count($tables)." tables de '$serveur_source' vers '$serveur_dest'",
544 544
 	);
545 545
 
546 546
 	if (!$inserer_copie = charger_fonction($fonction_base_inserer, $racine_fonctions, true)) {
@@ -595,7 +595,7 @@  discard block
 block discarded – undo
595 595
 		$tables = array_diff($tables, ['spip_meta']);
596 596
 		$tables[] = 'spip_meta';
597 597
 	}
598
-	$logger->info('Tables a copier :' . implode(', ', $tables));
598
+	$logger->info('Tables a copier :'.implode(', ', $tables));
599 599
 
600 600
 	$trouver_table = charger_fonction('trouver_table', 'base');
601 601
 
@@ -674,7 +674,7 @@  discard block
 block discarded – undo
674 674
 					if ($n == $status['tables_copiees'][$table]) {
675 675
 						break;
676 676
 					}
677
-					$logger->notice("recopie $table " . $status['tables_copiees'][$table]);
677
+					$logger->notice("recopie $table ".$status['tables_copiees'][$table]);
678 678
 					if ($callback_progression) {
679 679
 						$callback_progression($status['tables_copiees'][$table], 0, $table);
680 680
 					}
@@ -689,19 +689,19 @@  discard block
 block discarded – undo
689 689
 				}
690 690
 				$status['tables_copiees'][$table] = ($status['tables_copiees'][$table] ? -$status['tables_copiees'][$table] : 'zero');
691 691
 				ecrire_fichier($status_file, serialize($status));
692
-				$logger->info('tables_recopiees ' . implode(',', array_keys($status['tables_copiees'])));
692
+				$logger->info('tables_recopiees '.implode(',', array_keys($status['tables_copiees'])));
693 693
 				if ($callback_progression) {
694 694
 					$callback_progression($status['tables_copiees'][$table], $status['tables_copiees'][$table], $table);
695 695
 				}
696 696
 			} else {
697 697
 				if ($status['tables_copiees'][$table] < 0) {
698
-					$logger->info("Table $table deja copiee : " . $status['tables_copiees'][$table]);
698
+					$logger->info("Table $table deja copiee : ".$status['tables_copiees'][$table]);
699 699
 				}
700 700
 				if ($callback_progression) {
701 701
 					$callback_progression(
702 702
 						0,
703 703
 						$status['tables_copiees'][$table],
704
-						"$table" . ((is_numeric($status['tables_copiees'][$table]) && $status['tables_copiees'][$table] >= 0) ? '[Echec]' : '')
704
+						"$table".((is_numeric($status['tables_copiees'][$table]) && $status['tables_copiees'][$table] >= 0) ? '[Echec]' : '')
705 705
 					);
706 706
 				}
707 707
 			}
@@ -716,9 +716,9 @@  discard block
 block discarded – undo
716 716
 	// abandonner
717 717
 	if ((is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) < count($tables)) {
718 718
 		$logger->error(
719
-			'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables),
719
+			'Nombre de tables copiees incorrect : '.(is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0).'/'.count($tables),
720 720
 		);
721
-		$status['errors'][] = 'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables);
721
+		$status['errors'][] = 'Nombre de tables copiees incorrect : '.(is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0).'/'.count($tables);
722 722
 		ecrire_fichier($status_file, serialize($status));
723 723
 	}
724 724
 
@@ -750,7 +750,7 @@  discard block
 block discarded – undo
750 750
 	$nb = sql_countsel($table, '', '', '', $serveur_dest);
751 751
 	if ($nb - $nb1 < count($rows)) {
752 752
 		spip_logger('dump')->notice(
753
-			'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . '. On retente 1 par 1',
753
+			'base_inserer_copie : '.($nb - $nb1).' insertions au lieu de '.count($rows).'. On retente 1 par 1',
754 754
 		);
755 755
 		foreach ($rows as $row) {
756 756
 			// si l'enregistrement est deja en base, ca fera un echec ou un doublon
@@ -761,7 +761,7 @@  discard block
 block discarded – undo
761 761
 		$nb = sql_countsel($table, '', '', '', $serveur_dest);
762 762
 		if ($nb - $nb1 < count($rows)) {
763 763
 			spip_logger('dump')->error(
764
-				'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . ' apres insertion 1 par 1',
764
+				'base_inserer_copie : '.($nb - $nb1).' insertions au lieu de '.count($rows).' apres insertion 1 par 1',
765 765
 			);
766 766
 			$r = false;
767 767
 		}
Please login to merge, or discard this patch.
ecrire/base/upgrade.php 2 patches
Indentation   +279 added lines, -279 removed lines patch added patch discarded remove patch
@@ -16,17 +16,17 @@  discard block
 block discarded – undo
16 16
  */
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 if (!defined('_UPGRADE_TIME_OUT')) {
23
-	/**
24
-	 * Durée en secondes pour relancer les scripts de mises à jour, x secondes
25
-	 * avant que la durée d'exécution du script provoque un timeout
26
-	 *
27
-	 * @var int
28
-	 **/
29
-	define('_UPGRADE_TIME_OUT', 20);
23
+    /**
24
+     * Durée en secondes pour relancer les scripts de mises à jour, x secondes
25
+     * avant que la durée d'exécution du script provoque un timeout
26
+     *
27
+     * @var int
28
+     **/
29
+    define('_UPGRADE_TIME_OUT', 20);
30 30
 }
31 31
 
32 32
 /**
@@ -49,40 +49,40 @@  discard block
 block discarded – undo
49 49
  * @return void
50 50
  */
51 51
 function base_upgrade_dist($titre = '', $reprise = '') {
52
-	if (!$titre) {
53
-		return;
54
-	} // anti-testeur automatique
55
-	if ($GLOBALS['spip_version_base'] != $GLOBALS['meta']['version_installee']) {
56
-		if (!is_numeric(_request('reinstall'))) {
57
-			include_spip('base/create');
58
-			spip_logger('maj')->notice('recree les tables eventuellement disparues');
59
-			creer_base();
60
-		}
61
-
62
-		// quand on rentre par ici, c'est toujours une mise a jour de SPIP
63
-		// lancement de l'upgrade SPIP
64
-		$res = maj_base();
65
-
66
-		if ($res) {
67
-			// on arrete tout ici !
68
-			exit;
69
-		}
70
-	}
71
-	spip_logger('maj')->notice('Fin de mise a jour SQL. Debut m-a-j acces et config');
72
-
73
-	// supprimer quelques fichiers temporaires qui peuvent se retrouver invalides
74
-	@spip_unlink(_CACHE_RUBRIQUES);
75
-	@spip_unlink(_CACHE_PIPELINES);
76
-	@spip_unlink(_CACHE_PLUGINS_PATH);
77
-	@spip_unlink(_CACHE_PLUGINS_OPT);
78
-	@spip_unlink(_CACHE_PLUGINS_FCT);
79
-	@spip_unlink(_CACHE_CHEMIN);
80
-	@spip_unlink(_DIR_TMP . 'plugin_xml_cache.gz');
81
-
82
-	include_spip('inc/auth');
83
-	auth_synchroniser_distant();
84
-	$config = charger_fonction('config', 'inc');
85
-	$config();
52
+    if (!$titre) {
53
+        return;
54
+    } // anti-testeur automatique
55
+    if ($GLOBALS['spip_version_base'] != $GLOBALS['meta']['version_installee']) {
56
+        if (!is_numeric(_request('reinstall'))) {
57
+            include_spip('base/create');
58
+            spip_logger('maj')->notice('recree les tables eventuellement disparues');
59
+            creer_base();
60
+        }
61
+
62
+        // quand on rentre par ici, c'est toujours une mise a jour de SPIP
63
+        // lancement de l'upgrade SPIP
64
+        $res = maj_base();
65
+
66
+        if ($res) {
67
+            // on arrete tout ici !
68
+            exit;
69
+        }
70
+    }
71
+    spip_logger('maj')->notice('Fin de mise a jour SQL. Debut m-a-j acces et config');
72
+
73
+    // supprimer quelques fichiers temporaires qui peuvent se retrouver invalides
74
+    @spip_unlink(_CACHE_RUBRIQUES);
75
+    @spip_unlink(_CACHE_PIPELINES);
76
+    @spip_unlink(_CACHE_PLUGINS_PATH);
77
+    @spip_unlink(_CACHE_PLUGINS_OPT);
78
+    @spip_unlink(_CACHE_PLUGINS_FCT);
79
+    @spip_unlink(_CACHE_CHEMIN);
80
+    @spip_unlink(_DIR_TMP . 'plugin_xml_cache.gz');
81
+
82
+    include_spip('inc/auth');
83
+    auth_synchroniser_distant();
84
+    $config = charger_fonction('config', 'inc');
85
+    $config();
86 86
 }
87 87
 
88 88
 /**
@@ -113,46 +113,46 @@  discard block
 block discarded – undo
113 113
  */
114 114
 function maj_base($version_cible = 0, $redirect = '', $debut_page = true) {
115 115
 
116
-	$version_installee = $GLOBALS['meta']['version_installee'] ?? null;
117
-
118
-	spip_logger('maj')->notice(
119
-		"Version anterieure: $version_installee. Courante: " . $GLOBALS['spip_version_base'],
120
-	);
121
-	if (!$version_installee || $GLOBALS['spip_version_base'] < $version_installee) {
122
-		sql_replace(
123
-			'spip_meta',
124
-			[
125
-				'nom' => 'version_installee',
126
-				'valeur' => $GLOBALS['spip_version_base'],
127
-				'impt' => 'non'
128
-			]
129
-		);
130
-		return false;
131
-	}
132
-	if (!upgrade_test()) {
133
-		return true;
134
-	}
135
-
136
-	$cible = ($version_cible ?: $GLOBALS['spip_version_base']);
137
-
138
-	if ($version_installee < 2021_01_01_00) {
139
-		include_spip('maj/legacy/v40');
140
-	}
141
-
142
-	include_spip('maj/2021');
143
-
144
-	ksort($GLOBALS['maj']);
145
-	$res = maj_while($version_installee, $cible, $GLOBALS['maj'], 'version_installee', 'meta', $redirect, $debut_page);
146
-	if ($res) {
147
-		if (!is_array($res)) {
148
-			spip_logger('maj')->error("Pb d'acces SQL a la mise a jour");
149
-		} else {
150
-			echo _T('avis_operation_echec') . ' ' . implode(' ', $res);
151
-			echo install_fin_html();
152
-		}
153
-	}
154
-
155
-	return $res;
116
+    $version_installee = $GLOBALS['meta']['version_installee'] ?? null;
117
+
118
+    spip_logger('maj')->notice(
119
+        "Version anterieure: $version_installee. Courante: " . $GLOBALS['spip_version_base'],
120
+    );
121
+    if (!$version_installee || $GLOBALS['spip_version_base'] < $version_installee) {
122
+        sql_replace(
123
+            'spip_meta',
124
+            [
125
+                'nom' => 'version_installee',
126
+                'valeur' => $GLOBALS['spip_version_base'],
127
+                'impt' => 'non'
128
+            ]
129
+        );
130
+        return false;
131
+    }
132
+    if (!upgrade_test()) {
133
+        return true;
134
+    }
135
+
136
+    $cible = ($version_cible ?: $GLOBALS['spip_version_base']);
137
+
138
+    if ($version_installee < 2021_01_01_00) {
139
+        include_spip('maj/legacy/v40');
140
+    }
141
+
142
+    include_spip('maj/2021');
143
+
144
+    ksort($GLOBALS['maj']);
145
+    $res = maj_while($version_installee, $cible, $GLOBALS['maj'], 'version_installee', 'meta', $redirect, $debut_page);
146
+    if ($res) {
147
+        if (!is_array($res)) {
148
+            spip_logger('maj')->error("Pb d'acces SQL a la mise a jour");
149
+        } else {
150
+            echo _T('avis_operation_echec') . ' ' . implode(' ', $res);
151
+            echo install_fin_html();
152
+        }
153
+    }
154
+
155
+    return $res;
156 156
 }
157 157
 
158 158
 /**
@@ -194,53 +194,53 @@  discard block
 block discarded – undo
194 194
  */
195 195
 function maj_plugin($nom_meta_base_version, $version_cible, $maj, $table_meta = 'meta') {
196 196
 
197
-	if ($table_meta !== 'meta') {
198
-		installer_table_meta($table_meta);
199
-	}
200
-
201
-	$current_version = null;
202
-
203
-	if (
204
-		(!isset($GLOBALS[$table_meta][$nom_meta_base_version]))
205
-		|| (!spip_version_compare($current_version = $GLOBALS[$table_meta][$nom_meta_base_version], $version_cible, '='))
206
-	) {
207
-		// $maj['create'] contient les directives propres a la premiere creation de base
208
-		// c'est une operation derogatoire qui fait aboutir directement dans la version_cible
209
-		if (isset($maj['create'])) {
210
-			if (!isset($GLOBALS[$table_meta][$nom_meta_base_version])) {
211
-				// installation : on ne fait que l'operation create
212
-				$maj = ['init' => $maj['create']];
213
-				// et on lui ajoute un appel a inc/config
214
-				// pour creer les metas par defaut
215
-				$config = charger_fonction('config', 'inc');
216
-				$maj[$version_cible] = [[$config]];
217
-			}
218
-			// dans tous les cas enlever cet index du tableau
219
-			unset($maj['create']);
220
-		}
221
-		// si init, deja dans le bon ordre
222
-		if (!isset($maj['init'])) {
223
-			include_spip('inc/plugin'); // pour spip_version_compare
224
-			uksort($maj, 'spip_version_compare');
225
-		}
226
-
227
-		// la redirection se fait par defaut sur la page d'administration des plugins
228
-		// sauf lorsque nous sommes sur l'installation de SPIP
229
-		// ou define _REDIRECT_MAJ_PLUGIN
230
-		$redirect = (defined('_REDIRECT_MAJ_PLUGIN') ? _REDIRECT_MAJ_PLUGIN : generer_url_ecrire('admin_plugin'));
231
-		if (defined('_ECRIRE_INSTALL')) {
232
-			$redirect = parametre_url(generer_url_ecrire('install'), 'etape', _request('etape'));
233
-		}
234
-
235
-		$res = maj_while($current_version, $version_cible, $maj, $nom_meta_base_version, $table_meta, $redirect);
236
-		if ($res) {
237
-			if (!is_array($res)) {
238
-				spip_logger('maj')->error("Pb d'acces SQL a la mise a jour");
239
-			} else {
240
-				echo '<p>' . _T('avis_operation_echec') . ' ' . implode(' ', $res) . '</p>';
241
-			}
242
-		}
243
-	}
197
+    if ($table_meta !== 'meta') {
198
+        installer_table_meta($table_meta);
199
+    }
200
+
201
+    $current_version = null;
202
+
203
+    if (
204
+        (!isset($GLOBALS[$table_meta][$nom_meta_base_version]))
205
+        || (!spip_version_compare($current_version = $GLOBALS[$table_meta][$nom_meta_base_version], $version_cible, '='))
206
+    ) {
207
+        // $maj['create'] contient les directives propres a la premiere creation de base
208
+        // c'est une operation derogatoire qui fait aboutir directement dans la version_cible
209
+        if (isset($maj['create'])) {
210
+            if (!isset($GLOBALS[$table_meta][$nom_meta_base_version])) {
211
+                // installation : on ne fait que l'operation create
212
+                $maj = ['init' => $maj['create']];
213
+                // et on lui ajoute un appel a inc/config
214
+                // pour creer les metas par defaut
215
+                $config = charger_fonction('config', 'inc');
216
+                $maj[$version_cible] = [[$config]];
217
+            }
218
+            // dans tous les cas enlever cet index du tableau
219
+            unset($maj['create']);
220
+        }
221
+        // si init, deja dans le bon ordre
222
+        if (!isset($maj['init'])) {
223
+            include_spip('inc/plugin'); // pour spip_version_compare
224
+            uksort($maj, 'spip_version_compare');
225
+        }
226
+
227
+        // la redirection se fait par defaut sur la page d'administration des plugins
228
+        // sauf lorsque nous sommes sur l'installation de SPIP
229
+        // ou define _REDIRECT_MAJ_PLUGIN
230
+        $redirect = (defined('_REDIRECT_MAJ_PLUGIN') ? _REDIRECT_MAJ_PLUGIN : generer_url_ecrire('admin_plugin'));
231
+        if (defined('_ECRIRE_INSTALL')) {
232
+            $redirect = parametre_url(generer_url_ecrire('install'), 'etape', _request('etape'));
233
+        }
234
+
235
+        $res = maj_while($current_version, $version_cible, $maj, $nom_meta_base_version, $table_meta, $redirect);
236
+        if ($res) {
237
+            if (!is_array($res)) {
238
+                spip_logger('maj')->error("Pb d'acces SQL a la mise a jour");
239
+            } else {
240
+                echo '<p>' . _T('avis_operation_echec') . ' ' . implode(' ', $res) . '</p>';
241
+            }
242
+        }
243
+    }
244 244
 }
245 245
 
246 246
 /**
@@ -257,17 +257,17 @@  discard block
 block discarded – undo
257 257
  * @return void
258 258
  */
259 259
 function relance_maj($meta, $table, $redirect = '') {
260
-	include_spip('inc/headers');
261
-	if (!$redirect) {
262
-		// recuperer la valeur installee en cours
263
-		// on la tronque numeriquement, elle ne sert pas reellement
264
-		// sauf pour verifier que ce n'est pas oui ou non
265
-		// sinon is_numeric va echouer sur un numero de version 1.2.3
266
-		$installee = (int) $GLOBALS[$table][$meta];
267
-		$redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
268
-	}
269
-	echo redirige_formulaire($redirect);
270
-	exit();
260
+    include_spip('inc/headers');
261
+    if (!$redirect) {
262
+        // recuperer la valeur installee en cours
263
+        // on la tronque numeriquement, elle ne sert pas reellement
264
+        // sauf pour verifier que ce n'est pas oui ou non
265
+        // sinon is_numeric va echouer sur un numero de version 1.2.3
266
+        $installee = (int) $GLOBALS[$table][$meta];
267
+        $redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
268
+    }
269
+    echo redirige_formulaire($redirect);
270
+    exit();
271 271
 }
272 272
 
273 273
 /**
@@ -280,29 +280,29 @@  discard block
 block discarded – undo
280 280
  * @return void
281 281
  */
282 282
 function maj_debut_page($installee, $meta, $table) {
283
-	static $done = false;
284
-	if ($done) {
285
-		return;
286
-	}
287
-	include_spip('inc/minipres');
288
-	include_spip('inc/filtres');
289
-	if (function_exists('ini_set')) {
290
-		@ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure
291
-	}
292
-	$timeout = _UPGRADE_TIME_OUT * 2;
293
-	$titre = _T('titre_page_upgrade');
294
-	$balise_img = charger_filtre('balise_img');
295
-	$titre .= $balise_img(chemin_image('loader.svg'), '', 'loader');
296
-	echo(install_debut_html($titre));
297
-	// script de rechargement auto sur timeout
298
-	$redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
299
-	echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . ($timeout * 1000) . ')');
300
-	echo "<div style='text-align: left'>\n";
301
-	if (ob_get_level()) {
302
-		ob_flush();
303
-	}
304
-	flush();
305
-	$done = true;
283
+    static $done = false;
284
+    if ($done) {
285
+        return;
286
+    }
287
+    include_spip('inc/minipres');
288
+    include_spip('inc/filtres');
289
+    if (function_exists('ini_set')) {
290
+        @ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure
291
+    }
292
+    $timeout = _UPGRADE_TIME_OUT * 2;
293
+    $titre = _T('titre_page_upgrade');
294
+    $balise_img = charger_filtre('balise_img');
295
+    $titre .= $balise_img(chemin_image('loader.svg'), '', 'loader');
296
+    echo(install_debut_html($titre));
297
+    // script de rechargement auto sur timeout
298
+    $redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
299
+    echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . ($timeout * 1000) . ')');
300
+    echo "<div style='text-align: left'>\n";
301
+    if (ob_get_level()) {
302
+        ob_flush();
303
+    }
304
+    flush();
305
+    $done = true;
306 306
 }
307 307
 
308 308
 
@@ -346,63 +346,63 @@  discard block
 block discarded – undo
346 346
  *    - tableau vide sinon.
347 347
  */
348 348
 function maj_while($installee, $cible, $maj, $meta = '', $table = 'meta', $redirect = '', $debut_page = false) {
349
-	# inclusions pour que les procedures d'upgrade disposent des fonctions de base
350
-	include_spip('base/create');
351
-	include_spip('base/abstract_sql');
352
-	$trouver_table = charger_fonction('trouver_table', 'base');
353
-	include_spip('inc/plugin'); // pour spip_version_compare
354
-	$n = 0;
355
-	$time = time();
356
-
357
-	if (!defined('_TIME_OUT')) {
358
-		/**
359
-		 * Définir le timeout qui peut-être utilisé dans les fonctions
360
-		 * de mises à jour qui durent trop longtemps
361
-		 *
362
-		 * À utiliser tel que : `if (time() >= _TIME_OUT)`
363
-		 *
364
-		 * @var int
365
-		 */
366
-		define('_TIME_OUT', $time + _UPGRADE_TIME_OUT);
367
-	}
368
-
369
-	foreach ($maj as $v => $operations) {
370
-		// si une maj pour cette version
371
-		if (
372
-			$v == 'init'
373
-			|| spip_version_compare($v, $installee, '>') && spip_version_compare($v, $cible, '<=')
374
-		) {
375
-			if ($debut_page) {
376
-				maj_debut_page($v, $meta, $table);
377
-			}
378
-			echo "MAJ $v";
379
-			$etape = serie_alter($v, $operations, $meta, $table, $redirect);
380
-			$trouver_table(''); // vider le cache des descriptions de table
381
-			# echec sur une etape en cours ?
382
-			# on sort
383
-			if ($etape) {
384
-				return [$v, $etape];
385
-			}
386
-			$n = time() - $time;
387
-			spip_logger('maj')->notice("$table $meta: $v en $n secondes");
388
-			if ($meta) {
389
-				ecrire_meta($meta, $installee = $v, 'oui', $table);
390
-			}
391
-			echo (_IS_CLI ? "\n" : '<br />');
392
-		}
393
-		if (time() >= _TIME_OUT) {
394
-			relance_maj($meta, $table, $redirect);
395
-		}
396
-	}
397
-	$trouver_table(''); // vider le cache des descriptions de table
398
-	// indispensable pour les chgt de versions qui n'ecrivent pas en base
399
-	// tant pis pour la redondance eventuelle avec ci-dessus
400
-	if ($meta) {
401
-		ecrire_meta($meta, $cible, 'oui', $table);
402
-	}
403
-	spip_logger('maj')->notice("MAJ terminee. $meta: $installee");
404
-
405
-	return [];
349
+    # inclusions pour que les procedures d'upgrade disposent des fonctions de base
350
+    include_spip('base/create');
351
+    include_spip('base/abstract_sql');
352
+    $trouver_table = charger_fonction('trouver_table', 'base');
353
+    include_spip('inc/plugin'); // pour spip_version_compare
354
+    $n = 0;
355
+    $time = time();
356
+
357
+    if (!defined('_TIME_OUT')) {
358
+        /**
359
+         * Définir le timeout qui peut-être utilisé dans les fonctions
360
+         * de mises à jour qui durent trop longtemps
361
+         *
362
+         * À utiliser tel que : `if (time() >= _TIME_OUT)`
363
+         *
364
+         * @var int
365
+         */
366
+        define('_TIME_OUT', $time + _UPGRADE_TIME_OUT);
367
+    }
368
+
369
+    foreach ($maj as $v => $operations) {
370
+        // si une maj pour cette version
371
+        if (
372
+            $v == 'init'
373
+            || spip_version_compare($v, $installee, '>') && spip_version_compare($v, $cible, '<=')
374
+        ) {
375
+            if ($debut_page) {
376
+                maj_debut_page($v, $meta, $table);
377
+            }
378
+            echo "MAJ $v";
379
+            $etape = serie_alter($v, $operations, $meta, $table, $redirect);
380
+            $trouver_table(''); // vider le cache des descriptions de table
381
+            # echec sur une etape en cours ?
382
+            # on sort
383
+            if ($etape) {
384
+                return [$v, $etape];
385
+            }
386
+            $n = time() - $time;
387
+            spip_logger('maj')->notice("$table $meta: $v en $n secondes");
388
+            if ($meta) {
389
+                ecrire_meta($meta, $installee = $v, 'oui', $table);
390
+            }
391
+            echo (_IS_CLI ? "\n" : '<br />');
392
+        }
393
+        if (time() >= _TIME_OUT) {
394
+            relance_maj($meta, $table, $redirect);
395
+        }
396
+    }
397
+    $trouver_table(''); // vider le cache des descriptions de table
398
+    // indispensable pour les chgt de versions qui n'ecrivent pas en base
399
+    // tant pis pour la redondance eventuelle avec ci-dessus
400
+    if ($meta) {
401
+        ecrire_meta($meta, $cible, 'oui', $table);
402
+    }
403
+    spip_logger('maj')->notice("MAJ terminee. $meta: $installee");
404
+
405
+    return [];
406 406
 }
407 407
 
408 408
 /**
@@ -425,53 +425,53 @@  discard block
 block discarded – undo
425 425
  * @return int
426 426
  */
427 427
 function serie_alter($serie, $q = [], $meta = '', $table = 'meta', $redirect = '') {
428
-	$meta2 = $meta . '_maj_' . $serie;
429
-	$etape = 0;
430
-	if (isset($GLOBALS[$table][$meta2])) {
431
-		$etape = (int) $GLOBALS[$table][$meta2];
432
-	}
433
-	foreach ($q as $i => $r) {
434
-		if ($i >= $etape) {
435
-			$msg = "maj $table $meta2 etape $i";
436
-			if (
437
-				is_array($r)
438
-				&& function_exists($f = array_shift($r))
439
-			) {
440
-				// note: $r (arguments de la fonction $f) peut avoir des données tabulaires
441
-				spip_logger('maj')->notice("$msg: $f " . @implode(',', $r));
442
-				// pour les fonctions atomiques sql_xx
443
-				// on enregistre le meta avant de lancer la fonction,
444
-				// de maniere a eviter de boucler sur timeout
445
-				// mais pour les fonctions complexes,
446
-				// il faut les rejouer jusqu'a achevement.
447
-				// C'est a elle d'assurer qu'elles progressent a chaque rappel
448
-				if (str_starts_with($f, 'sql_')) {
449
-					ecrire_meta($meta2, $i + 1, 'non', $table);
450
-				}
451
-				echo (_IS_CLI ? '.' : " <span title='$i'>.</span>");
452
-				$f(...$r);
453
-				// si temps imparti depasse, on relance sans ecrire en meta
454
-				// car on est peut etre sorti sur timeout si c'est une fonction longue
455
-				if (time() >= _TIME_OUT) {
456
-					relance_maj($meta, $table, $redirect);
457
-				}
458
-				ecrire_meta($meta2, $i + 1, 'non', $table);
459
-				spip_logger('maj')->notice("$meta2: ok");
460
-			} else {
461
-				if (!is_array($r)) {
462
-					spip_logger('maj')->error("maj $i format incorrect");
463
-				} else {
464
-					spip_logger('maj')->error("maj $i fonction $f non definie");
465
-				}
466
-				// en cas d'erreur serieuse, on s'arrete
467
-				// mais on permet de passer par dessus en rechargeant la page.
468
-				return $i + 1;
469
-			}
470
-		}
471
-	}
472
-	effacer_meta($meta2, $table);
473
-
474
-	return 0;
428
+    $meta2 = $meta . '_maj_' . $serie;
429
+    $etape = 0;
430
+    if (isset($GLOBALS[$table][$meta2])) {
431
+        $etape = (int) $GLOBALS[$table][$meta2];
432
+    }
433
+    foreach ($q as $i => $r) {
434
+        if ($i >= $etape) {
435
+            $msg = "maj $table $meta2 etape $i";
436
+            if (
437
+                is_array($r)
438
+                && function_exists($f = array_shift($r))
439
+            ) {
440
+                // note: $r (arguments de la fonction $f) peut avoir des données tabulaires
441
+                spip_logger('maj')->notice("$msg: $f " . @implode(',', $r));
442
+                // pour les fonctions atomiques sql_xx
443
+                // on enregistre le meta avant de lancer la fonction,
444
+                // de maniere a eviter de boucler sur timeout
445
+                // mais pour les fonctions complexes,
446
+                // il faut les rejouer jusqu'a achevement.
447
+                // C'est a elle d'assurer qu'elles progressent a chaque rappel
448
+                if (str_starts_with($f, 'sql_')) {
449
+                    ecrire_meta($meta2, $i + 1, 'non', $table);
450
+                }
451
+                echo (_IS_CLI ? '.' : " <span title='$i'>.</span>");
452
+                $f(...$r);
453
+                // si temps imparti depasse, on relance sans ecrire en meta
454
+                // car on est peut etre sorti sur timeout si c'est une fonction longue
455
+                if (time() >= _TIME_OUT) {
456
+                    relance_maj($meta, $table, $redirect);
457
+                }
458
+                ecrire_meta($meta2, $i + 1, 'non', $table);
459
+                spip_logger('maj')->notice("$meta2: ok");
460
+            } else {
461
+                if (!is_array($r)) {
462
+                    spip_logger('maj')->error("maj $i format incorrect");
463
+                } else {
464
+                    spip_logger('maj')->error("maj $i fonction $f non definie");
465
+                }
466
+                // en cas d'erreur serieuse, on s'arrete
467
+                // mais on permet de passer par dessus en rechargeant la page.
468
+                return $i + 1;
469
+            }
470
+        }
471
+    }
472
+    effacer_meta($meta2, $table);
473
+
474
+    return 0;
475 475
 }
476 476
 
477 477
 /**
@@ -480,16 +480,16 @@  discard block
 block discarded – undo
480 480
  * @return bool True si possible.
481 481
  **/
482 482
 function upgrade_test() {
483
-	sql_drop_table('spip_test', true);
484
-	sql_create('spip_test', ['a' => 'int']);
485
-	sql_alter('TABLE spip_test ADD b INT');
486
-	sql_insertq('spip_test', ['b' => 1], ['field' => ['b' => 'int']]);
487
-	$result = sql_select('b', 'spip_test');
488
-	// ne pas garder le resultat de la requete sinon sqlite3
489
-	// ne peut pas supprimer la table spip_test lors du sql_alter qui suit
490
-	// car cette table serait alors 'verouillee'
491
-	$result = (bool) $result;
492
-	sql_alter('TABLE spip_test DROP b');
493
-
494
-	return $result;
483
+    sql_drop_table('spip_test', true);
484
+    sql_create('spip_test', ['a' => 'int']);
485
+    sql_alter('TABLE spip_test ADD b INT');
486
+    sql_insertq('spip_test', ['b' => 1], ['field' => ['b' => 'int']]);
487
+    $result = sql_select('b', 'spip_test');
488
+    // ne pas garder le resultat de la requete sinon sqlite3
489
+    // ne peut pas supprimer la table spip_test lors du sql_alter qui suit
490
+    // car cette table serait alors 'verouillee'
491
+    $result = (bool) $result;
492
+    sql_alter('TABLE spip_test DROP b');
493
+
494
+    return $result;
495 495
 }
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -77,7 +77,7 @@  discard block
 block discarded – undo
77 77
 	@spip_unlink(_CACHE_PLUGINS_OPT);
78 78
 	@spip_unlink(_CACHE_PLUGINS_FCT);
79 79
 	@spip_unlink(_CACHE_CHEMIN);
80
-	@spip_unlink(_DIR_TMP . 'plugin_xml_cache.gz');
80
+	@spip_unlink(_DIR_TMP.'plugin_xml_cache.gz');
81 81
 
82 82
 	include_spip('inc/auth');
83 83
 	auth_synchroniser_distant();
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
 	$version_installee = $GLOBALS['meta']['version_installee'] ?? null;
117 117
 
118 118
 	spip_logger('maj')->notice(
119
-		"Version anterieure: $version_installee. Courante: " . $GLOBALS['spip_version_base'],
119
+		"Version anterieure: $version_installee. Courante: ".$GLOBALS['spip_version_base'],
120 120
 	);
121 121
 	if (!$version_installee || $GLOBALS['spip_version_base'] < $version_installee) {
122 122
 		sql_replace(
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
 		if (!is_array($res)) {
148 148
 			spip_logger('maj')->error("Pb d'acces SQL a la mise a jour");
149 149
 		} else {
150
-			echo _T('avis_operation_echec') . ' ' . implode(' ', $res);
150
+			echo _T('avis_operation_echec').' '.implode(' ', $res);
151 151
 			echo install_fin_html();
152 152
 		}
153 153
 	}
@@ -237,7 +237,7 @@  discard block
 block discarded – undo
237 237
 			if (!is_array($res)) {
238 238
 				spip_logger('maj')->error("Pb d'acces SQL a la mise a jour");
239 239
 			} else {
240
-				echo '<p>' . _T('avis_operation_echec') . ' ' . implode(' ', $res) . '</p>';
240
+				echo '<p>'._T('avis_operation_echec').' '.implode(' ', $res).'</p>';
241 241
 			}
242 242
 		}
243 243
 	}
@@ -296,7 +296,7 @@  discard block
 block discarded – undo
296 296
 	echo(install_debut_html($titre));
297 297
 	// script de rechargement auto sur timeout
298 298
 	$redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
299
-	echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . ($timeout * 1000) . ')');
299
+	echo http_script("window.setTimeout('location.href=\"".$redirect."\";',".($timeout * 1000).')');
300 300
 	echo "<div style='text-align: left'>\n";
301 301
 	if (ob_get_level()) {
302 302
 		ob_flush();
@@ -425,7 +425,7 @@  discard block
 block discarded – undo
425 425
  * @return int
426 426
  */
427 427
 function serie_alter($serie, $q = [], $meta = '', $table = 'meta', $redirect = '') {
428
-	$meta2 = $meta . '_maj_' . $serie;
428
+	$meta2 = $meta.'_maj_'.$serie;
429 429
 	$etape = 0;
430 430
 	if (isset($GLOBALS[$table][$meta2])) {
431 431
 		$etape = (int) $GLOBALS[$table][$meta2];
@@ -438,7 +438,7 @@  discard block
 block discarded – undo
438 438
 				&& function_exists($f = array_shift($r))
439 439
 			) {
440 440
 				// note: $r (arguments de la fonction $f) peut avoir des données tabulaires
441
-				spip_logger('maj')->notice("$msg: $f " . @implode(',', $r));
441
+				spip_logger('maj')->notice("$msg: $f ".@implode(',', $r));
442 442
 				// pour les fonctions atomiques sql_xx
443 443
 				// on enregistre le meta avant de lancer la fonction,
444 444
 				// de maniere a eviter de boucler sur timeout
Please login to merge, or discard this patch.
ecrire/base/create.php 2 patches
Indentation   +89 added lines, -89 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Installation
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 include_spip('inc/acces');
@@ -32,18 +32,18 @@  discard block
 block discarded – undo
32 32
  * @return bool
33 33
  */
34 34
 function base_determine_autoinc($table, $desc = []) {
35
-	if (($t = lister_tables_principales()) && isset($t[$table])) {
36
-		$autoinc = true;
37
-	} elseif (($t = lister_tables_auxiliaires()) && isset($t[$table])) {
38
-		$autoinc = false;
39
-	} else {
40
-		// essayer de faire au mieux !
41
-		$autoinc = (isset($desc['key']['PRIMARY KEY'])
42
-			&& !str_contains((string) $desc['key']['PRIMARY KEY'], ',')
43
-			&& !str_contains((string) $desc['field'][$desc['key']['PRIMARY KEY']], 'default'));
44
-	}
35
+    if (($t = lister_tables_principales()) && isset($t[$table])) {
36
+        $autoinc = true;
37
+    } elseif (($t = lister_tables_auxiliaires()) && isset($t[$table])) {
38
+        $autoinc = false;
39
+    } else {
40
+        // essayer de faire au mieux !
41
+        $autoinc = (isset($desc['key']['PRIMARY KEY'])
42
+            && !str_contains((string) $desc['key']['PRIMARY KEY'], ',')
43
+            && !str_contains((string) $desc['field'][$desc['key']['PRIMARY KEY']], 'default'));
44
+    }
45 45
 
46
-	return $autoinc;
46
+    return $autoinc;
47 47
 }
48 48
 
49 49
 /**
@@ -60,49 +60,49 @@  discard block
 block discarded – undo
60 60
  * @return void
61 61
  */
62 62
 function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $serveur = '') {
63
-	$sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false;
64
-	if (!$sql_desc) {
65
-		if ($autoinc === 'auto') {
66
-			$autoinc = base_determine_autoinc($table, $desc);
67
-		}
68
-		if (isset($desc['field']) && isset($desc['key'])) {
69
-			sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
70
-		}
71
-		// verifier la bonne installation de la table (php-fpm es-tu la ?)
72
-		$sql_desc = sql_showtable($table, true, $serveur);
73
-		if (!$sql_desc) {
74
-			// on retente avec un sleep ?
75
-			sleep(1);
76
-			sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
77
-			$sql_desc = sql_showtable($table, true, $serveur);
78
-			if (!$sql_desc) {
79
-				spip_logger('maj')->critical("Echec creation table $table");
80
-			}
81
-		}
82
-	} else {
83
-		// ajouter les champs manquants
84
-		// on ne supprime jamais les champs, car c'est dangereux
85
-		// c'est toujours a faire manuellement
86
-		$last = '';
87
-		if (isset($desc['field'])) {
88
-			foreach ($desc['field'] as $field => $type) {
89
-				if (!isset($sql_desc['field'][$field])) {
90
-					sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ''), $serveur);
91
-				}
92
-				$last = $field;
93
-			}
94
-		}
95
-		if (isset($desc['key'])) {
96
-			foreach ($desc['key'] as $key => $type) {
97
-				// Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
98
-				// par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
99
-				if (!isset($sql_desc['key'][$key]) && !isset($sql_desc['key']["$key $type"])) {
100
-					sql_alter("TABLE $table ADD $key ($type)", $serveur);
101
-				}
102
-				$last = $field;
103
-			}
104
-		}
105
-	}
63
+    $sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false;
64
+    if (!$sql_desc) {
65
+        if ($autoinc === 'auto') {
66
+            $autoinc = base_determine_autoinc($table, $desc);
67
+        }
68
+        if (isset($desc['field']) && isset($desc['key'])) {
69
+            sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
70
+        }
71
+        // verifier la bonne installation de la table (php-fpm es-tu la ?)
72
+        $sql_desc = sql_showtable($table, true, $serveur);
73
+        if (!$sql_desc) {
74
+            // on retente avec un sleep ?
75
+            sleep(1);
76
+            sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
77
+            $sql_desc = sql_showtable($table, true, $serveur);
78
+            if (!$sql_desc) {
79
+                spip_logger('maj')->critical("Echec creation table $table");
80
+            }
81
+        }
82
+    } else {
83
+        // ajouter les champs manquants
84
+        // on ne supprime jamais les champs, car c'est dangereux
85
+        // c'est toujours a faire manuellement
86
+        $last = '';
87
+        if (isset($desc['field'])) {
88
+            foreach ($desc['field'] as $field => $type) {
89
+                if (!isset($sql_desc['field'][$field])) {
90
+                    sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ''), $serveur);
91
+                }
92
+                $last = $field;
93
+            }
94
+        }
95
+        if (isset($desc['key'])) {
96
+            foreach ($desc['key'] as $key => $type) {
97
+                // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
98
+                // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
99
+                if (!isset($sql_desc['key'][$key]) && !isset($sql_desc['key']["$key $type"])) {
100
+                    sql_alter("TABLE $table ADD $key ($type)", $serveur);
101
+                }
102
+                $last = $field;
103
+            }
104
+        }
105
+    }
106 106
 }
107 107
 
108 108
 /**
@@ -124,26 +124,26 @@  discard block
 block discarded – undo
124 124
  * @return void
125 125
  */
126 126
 function alterer_base($tables_inc, $tables_noinc, $up = false, $serveur = '') {
127
-	if ($up === false) {
128
-		$old = false;
129
-		$up = [];
130
-	} else {
131
-		$old = true;
132
-		if (!is_array($up)) {
133
-			$up = [$up];
134
-		}
135
-	}
136
-	foreach ($tables_inc as $k => $v) {
137
-		if (!$old || in_array($k, $up)) {
138
-			creer_ou_upgrader_table($k, $v, true, $old, $serveur);
139
-		}
140
-	}
127
+    if ($up === false) {
128
+        $old = false;
129
+        $up = [];
130
+    } else {
131
+        $old = true;
132
+        if (!is_array($up)) {
133
+            $up = [$up];
134
+        }
135
+    }
136
+    foreach ($tables_inc as $k => $v) {
137
+        if (!$old || in_array($k, $up)) {
138
+            creer_ou_upgrader_table($k, $v, true, $old, $serveur);
139
+        }
140
+    }
141 141
 
142
-	foreach ($tables_noinc as $k => $v) {
143
-		if (!$old || in_array($k, $up)) {
144
-			creer_ou_upgrader_table($k, $v, false, $old, $serveur);
145
-		}
146
-	}
142
+    foreach ($tables_noinc as $k => $v) {
143
+        if (!$old || in_array($k, $up)) {
144
+            creer_ou_upgrader_table($k, $v, false, $old, $serveur);
145
+        }
146
+    }
147 147
 }
148 148
 
149 149
 /**
@@ -163,16 +163,16 @@  discard block
 block discarded – undo
163 163
  */
164 164
 function creer_base($serveur = '') {
165 165
 
166
-	// Note: les mises a jour reexecutent ce code pour s'assurer
167
-	// de la conformite de la base
168
-	// pas de panique sur  "already exists" et "duplicate entry" donc.
166
+    // Note: les mises a jour reexecutent ce code pour s'assurer
167
+    // de la conformite de la base
168
+    // pas de panique sur  "already exists" et "duplicate entry" donc.
169 169
 
170
-	alterer_base(
171
-		lister_tables_principales(),
172
-		lister_tables_auxiliaires(),
173
-		false,
174
-		$serveur
175
-	);
170
+    alterer_base(
171
+        lister_tables_principales(),
172
+        lister_tables_auxiliaires(),
173
+        false,
174
+        $serveur
175
+    );
176 176
 }
177 177
 
178 178
 /**
@@ -192,10 +192,10 @@  discard block
 block discarded – undo
192 192
  * @return void
193 193
  */
194 194
 function maj_tables($upgrade_tables = [], $serveur = '') {
195
-	alterer_base(
196
-		lister_tables_principales(),
197
-		lister_tables_auxiliaires(),
198
-		$upgrade_tables,
199
-		$serveur
200
-	);
195
+    alterer_base(
196
+        lister_tables_principales(),
197
+        lister_tables_auxiliaires(),
198
+        $upgrade_tables,
199
+        $serveur
200
+    );
201 201
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -87,7 +87,7 @@
 block discarded – undo
87 87
 		if (isset($desc['field'])) {
88 88
 			foreach ($desc['field'] as $field => $type) {
89 89
 				if (!isset($sql_desc['field'][$field])) {
90
-					sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ''), $serveur);
90
+					sql_alter("TABLE $table ADD $field $type".($last ? " AFTER $last" : ''), $serveur);
91 91
 				}
92 92
 				$last = $field;
93 93
 			}
Please login to merge, or discard this patch.
ecrire/base/trouver_table.php 2 patches
Indentation   +149 added lines, -149 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  * @package SPIP\Core\SQL\Tables
18 18
  **/
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 include_spip('base/objets');
23 23
 
@@ -69,152 +69,152 @@  discard block
 block discarded – undo
69 69
  *
70 70
  **/
71 71
 function base_trouver_table_dist($nom, $serveur = '', $table_spip = true, array $options = []) {
72
-	$desc_cache = null;
73
-	static $nom_cache_desc_sql = [];
74
-
75
-	if (
76
-		!spip_connect($serveur)
77
-		|| !preg_match('/^[a-zA-Z0-9._-]*/', $nom)
78
-	) {
79
-		return null;
80
-	}
81
-
82
-	$options += [
83
-		// si false, baissera le niveau de log si une table demandée n’existe pas
84
-		'log_missing' => true,
85
-	];
86
-
87
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
88
-	$objets_sql = lister_tables_objets_sql('::md5');
89
-
90
-	// le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
91
-	// ce qui permet une auto invalidation en cas de modif manuelle du fichier
92
-	// de connexion, et tout risque d'ambiguite
93
-	if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
94
-		$nom_cache_desc_sql[$serveur][$objets_sql] =
95
-			_DIR_CACHE . 'sql_desc_'
96
-			. ($serveur ? "{$serveur}_" : '')
97
-			. substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
98
-			. '.txt';
99
-		// nouveau nom de cache = nouvelle version en memoire
100
-		unset($connexion['tables']);
101
-	}
102
-
103
-	// un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
104
-	if (!$nom) {
105
-		spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
106
-		$connexion['tables'] = [];
107
-
108
-		return null;
109
-	}
110
-
111
-	$nom_sql = $nom;
112
-	$nom_sql = preg_match('/\.(.*)$/', $nom, $s) ? $s[1] : $nom;
113
-
114
-	$fdesc = $desc = '';
115
-	$connexion = &$GLOBALS['connexions'][$serveur ?: 0];
116
-
117
-	// base sous SPIP: gerer les abreviations explicites des noms de table
118
-	if (
119
-		$connexion['spip_connect_version']
120
-		&& $table_spip
121
-		&& isset($GLOBALS['table_des_tables'][$nom])
122
-	) {
123
-		$nom = $GLOBALS['table_des_tables'][$nom];
124
-		$nom_sql = 'spip_' . $nom;
125
-	}
126
-
127
-	// si c'est la premiere table qu'on cherche
128
-	// et si on est pas explicitement en recalcul
129
-	// on essaye de recharger le cache des decriptions de ce serveur
130
-	// dans le fichier cache
131
-	if (
132
-		!isset($connexion['tables'][$nom_sql])
133
-		&& defined('_VAR_MODE')
134
-		&& _VAR_MODE !== 'recalcul'
135
-		&& (!isset($connexion['tables']) || !$connexion['tables'])
136
-		&& lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache)
137
-		&& ($desc_cache = unserialize($desc_cache))
138
-	) {
139
-		$connexion['tables'] = $desc_cache;
140
-	}
141
-	if ($table_spip && !isset($connexion['tables'][$nom_sql])) {
142
-		if (isset($GLOBALS['tables_principales'][$nom_sql])) {
143
-			$fdesc = $GLOBALS['tables_principales'][$nom_sql];
144
-		}
145
-		// meme si pas d'abreviation declaree, trouver la table spip_$nom
146
-		// si c'est une table principale,
147
-		// puisqu'on le fait aussi pour les tables auxiliaires
148
-		elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_' . $nom])) {
149
-			$nom_sql = 'spip_' . $nom;
150
-			$fdesc = &$GLOBALS['tables_principales'][$nom_sql];
151
-		} elseif (
152
-			isset($GLOBALS['tables_auxiliaires'][$n = $nom])
153
-			|| isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
154
-		) {
155
-			$nom_sql = $n;
156
-			$fdesc = &$GLOBALS['tables_auxiliaires'][$n];
157
-		}  # table locale a cote de SPIP, comme non SPIP:
158
-	}
159
-	if (!isset($connexion['tables'][$nom_sql])) {
160
-		// La *vraie* base a la priorite
161
-		$exists = sql_table_exists($nom_sql, $table_spip, $serveur);
162
-		if (
163
-			!$exists
164
-			|| !($desc = sql_showtable($nom_sql, $table_spip, $serveur))
165
-			|| !$desc['field']
166
-		) {
167
-			if (!$fdesc) {
168
-				spip_logger('base')->log(
169
-					$options['log_missing'] ? LogLevel::NOTICE : LogLevel::DEBUG,
170
-					"trouver_table: table inconnue '$serveur' '$nom'"
171
-				);
172
-
173
-				return null;
174
-			}
175
-			// on ne sait pas lire la structure de la table :
176
-			// on retombe sur la description donnee dans les fichiers spip
177
-			$desc = $fdesc;
178
-			$desc['exist'] = false;
179
-		} else {
180
-			$desc['exist'] = true;
181
-			// gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
182
-			// pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
183
-			if (! $desc['key']) {
184
-				spip_logger('base')->info("trouver_table: table sans cle '$serveur' '$nom'");
185
-				unset($desc['key']);
186
-			}
187
-		}
188
-
189
-		$desc['table'] = $desc['table_sql'] = $nom_sql;
190
-		$desc['connexion'] = $serveur;
191
-
192
-		// charger les infos declarees pour cette table
193
-		// en lui passant les infos connues
194
-		// $desc est prioritaire pour la description de la table
195
-		$desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
196
-		// s'assurer qu'on a toujours un 'key'
197
-		if (!isset($desc['key']) && !empty($fdesc['key'])) {
198
-			$desc['key'] = $fdesc['key'];
199
-		}
200
-		if (! isset($desc['key'])) {
201
-			$desc['key'] = [];
202
-		}
203
-
204
-		// si tables_objets_sql est bien fini d'init, on peut cacher
205
-		$connexion['tables'][$nom_sql] = $desc;
206
-		$res = &$connexion['tables'][$nom_sql];
207
-		// une nouvelle table a ete decrite
208
-		// mettons donc a jour le cache des descriptions de ce serveur
209
-		if (is_writable(_DIR_CACHE)) {
210
-			ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true);
211
-		}
212
-	} else {
213
-		$res = &$connexion['tables'][$nom_sql];
214
-	}
215
-
216
-	// toujours retourner $nom dans id_table
217
-	$res['id_table'] = $nom;
218
-
219
-	return $res;
72
+    $desc_cache = null;
73
+    static $nom_cache_desc_sql = [];
74
+
75
+    if (
76
+        !spip_connect($serveur)
77
+        || !preg_match('/^[a-zA-Z0-9._-]*/', $nom)
78
+    ) {
79
+        return null;
80
+    }
81
+
82
+    $options += [
83
+        // si false, baissera le niveau de log si une table demandée n’existe pas
84
+        'log_missing' => true,
85
+    ];
86
+
87
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
88
+    $objets_sql = lister_tables_objets_sql('::md5');
89
+
90
+    // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
91
+    // ce qui permet une auto invalidation en cas de modif manuelle du fichier
92
+    // de connexion, et tout risque d'ambiguite
93
+    if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
94
+        $nom_cache_desc_sql[$serveur][$objets_sql] =
95
+            _DIR_CACHE . 'sql_desc_'
96
+            . ($serveur ? "{$serveur}_" : '')
97
+            . substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
98
+            . '.txt';
99
+        // nouveau nom de cache = nouvelle version en memoire
100
+        unset($connexion['tables']);
101
+    }
102
+
103
+    // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
104
+    if (!$nom) {
105
+        spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
106
+        $connexion['tables'] = [];
107
+
108
+        return null;
109
+    }
110
+
111
+    $nom_sql = $nom;
112
+    $nom_sql = preg_match('/\.(.*)$/', $nom, $s) ? $s[1] : $nom;
113
+
114
+    $fdesc = $desc = '';
115
+    $connexion = &$GLOBALS['connexions'][$serveur ?: 0];
116
+
117
+    // base sous SPIP: gerer les abreviations explicites des noms de table
118
+    if (
119
+        $connexion['spip_connect_version']
120
+        && $table_spip
121
+        && isset($GLOBALS['table_des_tables'][$nom])
122
+    ) {
123
+        $nom = $GLOBALS['table_des_tables'][$nom];
124
+        $nom_sql = 'spip_' . $nom;
125
+    }
126
+
127
+    // si c'est la premiere table qu'on cherche
128
+    // et si on est pas explicitement en recalcul
129
+    // on essaye de recharger le cache des decriptions de ce serveur
130
+    // dans le fichier cache
131
+    if (
132
+        !isset($connexion['tables'][$nom_sql])
133
+        && defined('_VAR_MODE')
134
+        && _VAR_MODE !== 'recalcul'
135
+        && (!isset($connexion['tables']) || !$connexion['tables'])
136
+        && lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache)
137
+        && ($desc_cache = unserialize($desc_cache))
138
+    ) {
139
+        $connexion['tables'] = $desc_cache;
140
+    }
141
+    if ($table_spip && !isset($connexion['tables'][$nom_sql])) {
142
+        if (isset($GLOBALS['tables_principales'][$nom_sql])) {
143
+            $fdesc = $GLOBALS['tables_principales'][$nom_sql];
144
+        }
145
+        // meme si pas d'abreviation declaree, trouver la table spip_$nom
146
+        // si c'est une table principale,
147
+        // puisqu'on le fait aussi pour les tables auxiliaires
148
+        elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_' . $nom])) {
149
+            $nom_sql = 'spip_' . $nom;
150
+            $fdesc = &$GLOBALS['tables_principales'][$nom_sql];
151
+        } elseif (
152
+            isset($GLOBALS['tables_auxiliaires'][$n = $nom])
153
+            || isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
154
+        ) {
155
+            $nom_sql = $n;
156
+            $fdesc = &$GLOBALS['tables_auxiliaires'][$n];
157
+        }  # table locale a cote de SPIP, comme non SPIP:
158
+    }
159
+    if (!isset($connexion['tables'][$nom_sql])) {
160
+        // La *vraie* base a la priorite
161
+        $exists = sql_table_exists($nom_sql, $table_spip, $serveur);
162
+        if (
163
+            !$exists
164
+            || !($desc = sql_showtable($nom_sql, $table_spip, $serveur))
165
+            || !$desc['field']
166
+        ) {
167
+            if (!$fdesc) {
168
+                spip_logger('base')->log(
169
+                    $options['log_missing'] ? LogLevel::NOTICE : LogLevel::DEBUG,
170
+                    "trouver_table: table inconnue '$serveur' '$nom'"
171
+                );
172
+
173
+                return null;
174
+            }
175
+            // on ne sait pas lire la structure de la table :
176
+            // on retombe sur la description donnee dans les fichiers spip
177
+            $desc = $fdesc;
178
+            $desc['exist'] = false;
179
+        } else {
180
+            $desc['exist'] = true;
181
+            // gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
182
+            // pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
183
+            if (! $desc['key']) {
184
+                spip_logger('base')->info("trouver_table: table sans cle '$serveur' '$nom'");
185
+                unset($desc['key']);
186
+            }
187
+        }
188
+
189
+        $desc['table'] = $desc['table_sql'] = $nom_sql;
190
+        $desc['connexion'] = $serveur;
191
+
192
+        // charger les infos declarees pour cette table
193
+        // en lui passant les infos connues
194
+        // $desc est prioritaire pour la description de la table
195
+        $desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
196
+        // s'assurer qu'on a toujours un 'key'
197
+        if (!isset($desc['key']) && !empty($fdesc['key'])) {
198
+            $desc['key'] = $fdesc['key'];
199
+        }
200
+        if (! isset($desc['key'])) {
201
+            $desc['key'] = [];
202
+        }
203
+
204
+        // si tables_objets_sql est bien fini d'init, on peut cacher
205
+        $connexion['tables'][$nom_sql] = $desc;
206
+        $res = &$connexion['tables'][$nom_sql];
207
+        // une nouvelle table a ete decrite
208
+        // mettons donc a jour le cache des descriptions de ce serveur
209
+        if (is_writable(_DIR_CACHE)) {
210
+            ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true);
211
+        }
212
+    } else {
213
+        $res = &$connexion['tables'][$nom_sql];
214
+    }
215
+
216
+    // toujours retourner $nom dans id_table
217
+    $res['id_table'] = $nom;
218
+
219
+    return $res;
220 220
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -92,9 +92,9 @@  discard block
 block discarded – undo
92 92
 	// de connexion, et tout risque d'ambiguite
93 93
 	if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
94 94
 		$nom_cache_desc_sql[$serveur][$objets_sql] =
95
-			_DIR_CACHE . 'sql_desc_'
95
+			_DIR_CACHE.'sql_desc_'
96 96
 			. ($serveur ? "{$serveur}_" : '')
97
-			. substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
97
+			. substr(md5($connexion['db'].':'.$connexion['prefixe'].":$objets_sql"), 0, 8)
98 98
 			. '.txt';
99 99
 		// nouveau nom de cache = nouvelle version en memoire
100 100
 		unset($connexion['tables']);
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
 		&& isset($GLOBALS['table_des_tables'][$nom])
122 122
 	) {
123 123
 		$nom = $GLOBALS['table_des_tables'][$nom];
124
-		$nom_sql = 'spip_' . $nom;
124
+		$nom_sql = 'spip_'.$nom;
125 125
 	}
126 126
 
127 127
 	// si c'est la premiere table qu'on cherche
@@ -145,12 +145,12 @@  discard block
 block discarded – undo
145 145
 		// meme si pas d'abreviation declaree, trouver la table spip_$nom
146 146
 		// si c'est une table principale,
147 147
 		// puisqu'on le fait aussi pour les tables auxiliaires
148
-		elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_' . $nom])) {
149
-			$nom_sql = 'spip_' . $nom;
148
+		elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_'.$nom])) {
149
+			$nom_sql = 'spip_'.$nom;
150 150
 			$fdesc = &$GLOBALS['tables_principales'][$nom_sql];
151 151
 		} elseif (
152 152
 			isset($GLOBALS['tables_auxiliaires'][$n = $nom])
153
-			|| isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
153
+			|| isset($GLOBALS['tables_auxiliaires'][$n = 'spip_'.$nom])
154 154
 		) {
155 155
 			$nom_sql = $n;
156 156
 			$fdesc = &$GLOBALS['tables_auxiliaires'][$n];
@@ -180,7 +180,7 @@  discard block
 block discarded – undo
180 180
 			$desc['exist'] = true;
181 181
 			// gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
182 182
 			// pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
183
-			if (! $desc['key']) {
183
+			if (!$desc['key']) {
184 184
 				spip_logger('base')->info("trouver_table: table sans cle '$serveur' '$nom'");
185 185
 				unset($desc['key']);
186 186
 			}
@@ -197,7 +197,7 @@  discard block
 block discarded – undo
197 197
 		if (!isset($desc['key']) && !empty($fdesc['key'])) {
198 198
 			$desc['key'] = $fdesc['key'];
199 199
 		}
200
-		if (! isset($desc['key'])) {
200
+		if (!isset($desc['key'])) {
201 201
 			$desc['key'] = [];
202 202
 		}
203 203
 
Please login to merge, or discard this patch.
ecrire/xml/sax.php 2 patches
Indentation   +244 added lines, -244 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 include_spip('inc/charsets');
@@ -23,215 +23,215 @@  discard block
 block discarded – undo
23 23
  * @return string
24 24
  */
25 25
 function xml_entites_html($texte) {
26
-	if (!is_string($texte) || !$texte || strpbrk($texte, "&\"'<>") == false) {
27
-		return $texte;
28
-	}
26
+    if (!is_string($texte) || !$texte || strpbrk($texte, "&\"'<>") == false) {
27
+        return $texte;
28
+    }
29 29
 
30
-	if (!function_exists('spip_htmlspecialchars')) {
31
-		include_spip('inc/filtres_mini');
32
-	}
30
+    if (!function_exists('spip_htmlspecialchars')) {
31
+        include_spip('inc/filtres_mini');
32
+    }
33 33
 
34
-	return spip_htmlspecialchars($texte, ENT_QUOTES);
34
+    return spip_htmlspecialchars($texte, ENT_QUOTES);
35 35
 }
36 36
 
37 37
 function xml_debutElement($phraseur, $name, $attrs) {
38
-	$depth = $phraseur->depth;
39
-
40
-	$t = $phraseur->ouvrant[$depth] ?? ' ';
41
-	// espace initial signifie: deja integree au resultat
42
-	if ($t[0] != ' ') {
43
-		$phraseur->res .= '<' . $t . '>';
44
-		$phraseur->ouvrant[$depth] = ' ' . $t;
45
-	}
46
-	$t = $phraseur->contenu[$depth];
47
-	// n'indenter que s'il y a un separateur avant
48
-	$phraseur->res .= preg_replace("/[\n\t ]+$/", "\n$depth", $t);
49
-	$phraseur->contenu[$depth] = '';
50
-	$att = '';
51
-	$sep = ' ';
52
-	foreach ($attrs as $k => $v) {
53
-		$delim = str_contains($v, "'") ? '"' : "'";
54
-		$val = xml_entites_html($v);
55
-		$att .= $sep . $k . '=' . $delim
56
-			. ($delim !== '"' ? str_replace('&quot;', '"', $val) : $val)
57
-			. $delim;
58
-		$sep = "\n $depth";
59
-	}
60
-	$phraseur->depth .= '  ';
61
-	$phraseur->contenu[$phraseur->depth] = '';
62
-	$phraseur->ouvrant[$phraseur->depth] = $name . $att;
63
-	$phraseur->reperes[$phraseur->depth] = xml_get_current_line_number($phraseur->sax);
38
+    $depth = $phraseur->depth;
39
+
40
+    $t = $phraseur->ouvrant[$depth] ?? ' ';
41
+    // espace initial signifie: deja integree au resultat
42
+    if ($t[0] != ' ') {
43
+        $phraseur->res .= '<' . $t . '>';
44
+        $phraseur->ouvrant[$depth] = ' ' . $t;
45
+    }
46
+    $t = $phraseur->contenu[$depth];
47
+    // n'indenter que s'il y a un separateur avant
48
+    $phraseur->res .= preg_replace("/[\n\t ]+$/", "\n$depth", $t);
49
+    $phraseur->contenu[$depth] = '';
50
+    $att = '';
51
+    $sep = ' ';
52
+    foreach ($attrs as $k => $v) {
53
+        $delim = str_contains($v, "'") ? '"' : "'";
54
+        $val = xml_entites_html($v);
55
+        $att .= $sep . $k . '=' . $delim
56
+            . ($delim !== '"' ? str_replace('&quot;', '"', $val) : $val)
57
+            . $delim;
58
+        $sep = "\n $depth";
59
+    }
60
+    $phraseur->depth .= '  ';
61
+    $phraseur->contenu[$phraseur->depth] = '';
62
+    $phraseur->ouvrant[$phraseur->depth] = $name . $att;
63
+    $phraseur->reperes[$phraseur->depth] = xml_get_current_line_number($phraseur->sax);
64 64
 }
65 65
 
66 66
 function xml_finElement($phraseur, $name, $fusion_bal = false) {
67
-	$ouv = $phraseur->ouvrant[$phraseur->depth];
68
-
69
-	if ($ouv[0] != ' ') {
70
-		$phraseur->ouvrant[$phraseur->depth] = ' ' . $ouv;
71
-	} else {
72
-		$ouv = '';
73
-	}
74
-	$t = $phraseur->contenu[$phraseur->depth];
75
-	$phraseur->depth = substr($phraseur->depth, 2);
76
-	$t = preg_replace("/[\n\t ]+$/", "\n" . $phraseur->depth, $t);
77
-
78
-	// fusion <balise></balise> en <balise />.
79
-	// ATTENTION,  certains clients http croient que fusion ==> pas d'atttributs
80
-	// en particulier pour les balises Script et A.
81
-	// en presence d'attributs ne le faire que si la DTD est dispo et d'accord
82
-	// (param fusion_bal)
83
-
84
-	if ($t || ($ouv != $name && !$fusion_bal)) {
85
-		$phraseur->res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . '</' . $name . '>';
86
-	} else {
87
-		$phraseur->res .= ($ouv ? ('<' . $ouv . ' />') : ('</' . $name . '>'));
88
-	}
67
+    $ouv = $phraseur->ouvrant[$phraseur->depth];
68
+
69
+    if ($ouv[0] != ' ') {
70
+        $phraseur->ouvrant[$phraseur->depth] = ' ' . $ouv;
71
+    } else {
72
+        $ouv = '';
73
+    }
74
+    $t = $phraseur->contenu[$phraseur->depth];
75
+    $phraseur->depth = substr($phraseur->depth, 2);
76
+    $t = preg_replace("/[\n\t ]+$/", "\n" . $phraseur->depth, $t);
77
+
78
+    // fusion <balise></balise> en <balise />.
79
+    // ATTENTION,  certains clients http croient que fusion ==> pas d'atttributs
80
+    // en particulier pour les balises Script et A.
81
+    // en presence d'attributs ne le faire que si la DTD est dispo et d'accord
82
+    // (param fusion_bal)
83
+
84
+    if ($t || ($ouv != $name && !$fusion_bal)) {
85
+        $phraseur->res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . '</' . $name . '>';
86
+    } else {
87
+        $phraseur->res .= ($ouv ? ('<' . $ouv . ' />') : ('</' . $name . '>'));
88
+    }
89 89
 }
90 90
 
91 91
 function xml_textElement($phraseur, $data) {
92
-	$depth = $phraseur->depth;
93
-	$phraseur->contenu[$depth] .= preg_match('/^script/', $phraseur->ouvrant[$depth])
94
-		? $data
95
-		: xml_entites_html($data);
92
+    $depth = $phraseur->depth;
93
+    $phraseur->contenu[$depth] .= preg_match('/^script/', $phraseur->ouvrant[$depth])
94
+        ? $data
95
+        : xml_entites_html($data);
96 96
 }
97 97
 
98 98
 function xml_piElement($phraseur, $target, $data) {
99
-	$depth = $phraseur->depth;
100
-
101
-	if (strtolower($target) != 'php') {
102
-		$phraseur->contenu[$depth] .= $data;
103
-	} else {
104
-		ob_start();
105
-		eval($data);
106
-		$data = ob_get_contents();
107
-		ob_end_clean();
108
-		$phraseur->contenu[$depth] .= $data;
109
-	}
99
+    $depth = $phraseur->depth;
100
+
101
+    if (strtolower($target) != 'php') {
102
+        $phraseur->contenu[$depth] .= $data;
103
+    } else {
104
+        ob_start();
105
+        eval($data);
106
+        $data = ob_get_contents();
107
+        ob_end_clean();
108
+        $phraseur->contenu[$depth] .= $data;
109
+    }
110 110
 }
111 111
 
112 112
 
113 113
 function xml_defaultElement($phraseur, $data) {
114
-	$depth = $phraseur->depth;
114
+    $depth = $phraseur->depth;
115 115
 
116
-	if (!isset($phraseur->contenu[$depth])) {
117
-		$phraseur->contenu[$depth] = '';
118
-	}
119
-	$phraseur->contenu[$depth] .= $data;
116
+    if (!isset($phraseur->contenu[$depth])) {
117
+        $phraseur->contenu[$depth] = '';
118
+    }
119
+    $phraseur->contenu[$depth] .= $data;
120 120
 }
121 121
 
122 122
 function xml_parsestring($phraseur, $data) {
123
-	$phraseur->contenu[$phraseur->depth] = '';
124
-
125
-	if (!xml_parse($phraseur->sax, $data, true)) {
126
-		coordonnees_erreur(
127
-			$phraseur,
128
-			xml_error_string(xml_get_error_code($phraseur->sax))
129
-			. "<br />\n" .
130
-			($phraseur->depth
131
-				? '(' .
132
-					_T('erreur_balise_non_fermee') .
133
-					' <tt>' .
134
-					$phraseur->ouvrant[$phraseur->depth] .
135
-					'</tt> ' .
136
-					_T('ligne') .
137
-					' ' .
138
-					$phraseur->reperes[$phraseur->depth] .
139
-					") <br />\n"
140
-				: '')
141
-		);
142
-	}
123
+    $phraseur->contenu[$phraseur->depth] = '';
124
+
125
+    if (!xml_parse($phraseur->sax, $data, true)) {
126
+        coordonnees_erreur(
127
+            $phraseur,
128
+            xml_error_string(xml_get_error_code($phraseur->sax))
129
+            . "<br />\n" .
130
+            ($phraseur->depth
131
+                ? '(' .
132
+                    _T('erreur_balise_non_fermee') .
133
+                    ' <tt>' .
134
+                    $phraseur->ouvrant[$phraseur->depth] .
135
+                    '</tt> ' .
136
+                    _T('ligne') .
137
+                    ' ' .
138
+                    $phraseur->reperes[$phraseur->depth] .
139
+                    ") <br />\n"
140
+                : '')
141
+        );
142
+    }
143 143
 }
144 144
 
145 145
 function coordonnees_erreur($phraseur, $msg) {
146
-	$entete_length = substr_count($phraseur->entete, "\n");
147
-	$phraseur->err[] = [
148
-		$msg,
149
-		xml_get_current_line_number($phraseur->sax) + $entete_length,
150
-		xml_get_current_column_number($phraseur->sax)
151
-	];
146
+    $entete_length = substr_count($phraseur->entete, "\n");
147
+    $phraseur->err[] = [
148
+        $msg,
149
+        xml_get_current_line_number($phraseur->sax) + $entete_length,
150
+        xml_get_current_column_number($phraseur->sax)
151
+    ];
152 152
 }
153 153
 
154 154
 function xml_sax_dist($page, $apply = false, $phraseur = null, $doctype = '', $charset = null) {
155
-	if (is_null($charset)) {
156
-		$charset = $GLOBALS['meta']['charset'];
157
-	}
158
-	if ($apply) {
159
-		ob_start();
160
-		$r = is_array($apply) ? $page(...$apply) : $page();
161
-		$page = ob_get_contents();
162
-		ob_end_clean();
163
-		// fonction sans aucun "echo", ca doit etre le resultat
164
-		if (!$page) {
165
-			$page = $r;
166
-		}
167
-	}
168
-
169
-	if (!$page) {
170
-		return '';
171
-	}
172
-	// charger la DTD et transcoder les entites,
173
-	// et escamoter le doctype que sax mange en php5 mais pas en  php4
174
-	if (!$doctype) {
175
-		if (!$r = analyser_doctype($page)) {
176
-			$page = _MESSAGE_DOCTYPE . _DOCTYPE_ECRIRE
177
-				. preg_replace(_REGEXP_DOCTYPE, '', $page);
178
-			$r = analyser_doctype($page);
179
-		}
180
-		[$entete, $avail, $grammaire, $rotlvl] = array_pad($r, 4, null);
181
-		$page = substr($page, strlen($entete));
182
-	} else {
183
-		$avail = 'SYSTEM';
184
-		$grammaire = $doctype;
185
-		$rotlvl = basename($grammaire);
186
-	}
187
-
188
-	include_spip('xml/analyser_dtd');
189
-	$dtc = charger_dtd($grammaire, $avail, $rotlvl);
190
-	$page = sax_bug($page, $dtc, $charset);
191
-
192
-	// compatibilite Tidy espace public
193
-	if (!$phraseur) {
194
-		$indenter_xml = charger_fonction('indenter', 'xml');
195
-
196
-		return $indenter_xml($page, $apply);
197
-	}
198
-
199
-	$xml_parser = xml_parser_create($charset);
200
-
201
-	xml_set_element_handler(
202
-		$xml_parser,
203
-		[$phraseur, 'debutElement'],
204
-		[$phraseur, 'finElement']
205
-	);
206
-
207
-	xml_set_character_data_handler(
208
-		$xml_parser,
209
-		[$phraseur, 'textElement']
210
-	);
211
-
212
-	xml_set_processing_instruction_handler(
213
-		$xml_parser,
214
-		[$phraseur, 'piElement']
215
-	);
216
-
217
-	xml_set_default_handler(
218
-		$xml_parser,
219
-		[$phraseur, 'defaultElement']
220
-	);
221
-
222
-	xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
223
-
224
-	$phraseur->sax = $xml_parser;
225
-	if (isset($entete)) {
226
-		$phraseur->entete = $entete;
227
-	}
228
-	$phraseur->page = $page;
229
-	$phraseur->dtc = $dtc;
230
-	$phraseur->phraserTout($xml_parser, $page);
231
-	xml_parser_free($xml_parser);
232
-	$phraseur->sax = '';
233
-
234
-	return $phraseur;
155
+    if (is_null($charset)) {
156
+        $charset = $GLOBALS['meta']['charset'];
157
+    }
158
+    if ($apply) {
159
+        ob_start();
160
+        $r = is_array($apply) ? $page(...$apply) : $page();
161
+        $page = ob_get_contents();
162
+        ob_end_clean();
163
+        // fonction sans aucun "echo", ca doit etre le resultat
164
+        if (!$page) {
165
+            $page = $r;
166
+        }
167
+    }
168
+
169
+    if (!$page) {
170
+        return '';
171
+    }
172
+    // charger la DTD et transcoder les entites,
173
+    // et escamoter le doctype que sax mange en php5 mais pas en  php4
174
+    if (!$doctype) {
175
+        if (!$r = analyser_doctype($page)) {
176
+            $page = _MESSAGE_DOCTYPE . _DOCTYPE_ECRIRE
177
+                . preg_replace(_REGEXP_DOCTYPE, '', $page);
178
+            $r = analyser_doctype($page);
179
+        }
180
+        [$entete, $avail, $grammaire, $rotlvl] = array_pad($r, 4, null);
181
+        $page = substr($page, strlen($entete));
182
+    } else {
183
+        $avail = 'SYSTEM';
184
+        $grammaire = $doctype;
185
+        $rotlvl = basename($grammaire);
186
+    }
187
+
188
+    include_spip('xml/analyser_dtd');
189
+    $dtc = charger_dtd($grammaire, $avail, $rotlvl);
190
+    $page = sax_bug($page, $dtc, $charset);
191
+
192
+    // compatibilite Tidy espace public
193
+    if (!$phraseur) {
194
+        $indenter_xml = charger_fonction('indenter', 'xml');
195
+
196
+        return $indenter_xml($page, $apply);
197
+    }
198
+
199
+    $xml_parser = xml_parser_create($charset);
200
+
201
+    xml_set_element_handler(
202
+        $xml_parser,
203
+        [$phraseur, 'debutElement'],
204
+        [$phraseur, 'finElement']
205
+    );
206
+
207
+    xml_set_character_data_handler(
208
+        $xml_parser,
209
+        [$phraseur, 'textElement']
210
+    );
211
+
212
+    xml_set_processing_instruction_handler(
213
+        $xml_parser,
214
+        [$phraseur, 'piElement']
215
+    );
216
+
217
+    xml_set_default_handler(
218
+        $xml_parser,
219
+        [$phraseur, 'defaultElement']
220
+    );
221
+
222
+    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
223
+
224
+    $phraseur->sax = $xml_parser;
225
+    if (isset($entete)) {
226
+        $phraseur->entete = $entete;
227
+    }
228
+    $phraseur->page = $page;
229
+    $phraseur->dtc = $dtc;
230
+    $phraseur->phraserTout($xml_parser, $page);
231
+    xml_parser_free($xml_parser);
232
+    $phraseur->sax = '';
233
+
234
+    return $phraseur;
235 235
 }
236 236
 
237 237
 // SAX ne dit pas si une Entite est dans un attribut ou non.
@@ -242,24 +242,24 @@  discard block
 block discarded – undo
242 242
 // sinon on se rabat sur ce qu'en connait SPIP en standard.
243 243
 
244 244
 function sax_bug($data, $dtc, $charset = null) {
245
-	if (is_null($charset)) {
246
-		$charset = $GLOBALS['meta']['charset'];
247
-	}
248
-
249
-	if ($dtc) {
250
-		$trans = [];
251
-
252
-		foreach ($dtc->entites as $k => $v) {
253
-			if (!strpos(' amp lt gt quot ', (string) $k)) {
254
-				$trans["&$k;"] = $v;
255
-			}
256
-		}
257
-		$data = strtr($data, $trans);
258
-	} else {
259
-		$data = html2unicode($data, true);
260
-	}
261
-
262
-	return unicode2charset($data, $charset);
245
+    if (is_null($charset)) {
246
+        $charset = $GLOBALS['meta']['charset'];
247
+    }
248
+
249
+    if ($dtc) {
250
+        $trans = [];
251
+
252
+        foreach ($dtc->entites as $k => $v) {
253
+            if (!strpos(' amp lt gt quot ', (string) $k)) {
254
+                $trans["&$k;"] = $v;
255
+            }
256
+        }
257
+        $data = strtr($data, $trans);
258
+    } else {
259
+        $data = html2unicode($data, true);
260
+    }
261
+
262
+    return unicode2charset($data, $charset);
263 263
 }
264 264
 
265 265
 // Retirer < ? xml... ? > et autre PI, ainsi que les commentaires en debut
@@ -269,48 +269,48 @@  discard block
 block discarded – undo
269 269
 // les autres formats RSS n'ont pas de DTD,
270 270
 // mais un XML Schema que SPIP ne fait pas encore lire.
271 271
 function analyser_doctype($data) {
272
-	if (!preg_match(_REGEXP_DOCTYPE, $data, $page)) {
273
-		if (preg_match(_REGEXP_XML, $data, $page)) {
274
-			[, $entete, $topelement] = $page;
275
-			if ($topelement == 'rss') {
276
-				return [
277
-					$entete,
278
-					'PUBLIC',
279
-					_DOCTYPE_RSS,
280
-					'rss-0.91.dtd'
281
-				];
282
-			} else {
283
-				$dtd = $topelement . '.dtd';
284
-				$f = find_in_path($dtd);
285
-				if (file_exists($f)) {
286
-					return [$entete, 'SYSTEM', $f, $dtd];
287
-				}
288
-			}
289
-		}
290
-		spip_logger()->info('Dtd pas vu pour ' . substr($data, 0, 100));
291
-
292
-		return [];
293
-	}
294
-	[$entete, , $topelement, $avail, $suite] = $page;
295
-
296
-	if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r) && !preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r)) {
297
-		return [];
298
-	}
299
-	[, $rotlvl, $suite] = $r;
300
-
301
-	if (!$suite) {
302
-		if ($avail != 'SYSTEM') {
303
-			return [];
304
-		}
305
-		$grammaire = $rotlvl;
306
-		$rotlvl = '';
307
-	} else {
308
-		if (!preg_match('/^"([^"]*)"\s*$/', $suite, $r) && !preg_match("/^'([^']*)'\s*$/", $suite, $r)) {
309
-			return [];
310
-		}
311
-
312
-		$grammaire = $r[1];
313
-	}
314
-
315
-	return [$entete, $avail, $grammaire, $rotlvl];
272
+    if (!preg_match(_REGEXP_DOCTYPE, $data, $page)) {
273
+        if (preg_match(_REGEXP_XML, $data, $page)) {
274
+            [, $entete, $topelement] = $page;
275
+            if ($topelement == 'rss') {
276
+                return [
277
+                    $entete,
278
+                    'PUBLIC',
279
+                    _DOCTYPE_RSS,
280
+                    'rss-0.91.dtd'
281
+                ];
282
+            } else {
283
+                $dtd = $topelement . '.dtd';
284
+                $f = find_in_path($dtd);
285
+                if (file_exists($f)) {
286
+                    return [$entete, 'SYSTEM', $f, $dtd];
287
+                }
288
+            }
289
+        }
290
+        spip_logger()->info('Dtd pas vu pour ' . substr($data, 0, 100));
291
+
292
+        return [];
293
+    }
294
+    [$entete, , $topelement, $avail, $suite] = $page;
295
+
296
+    if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r) && !preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r)) {
297
+        return [];
298
+    }
299
+    [, $rotlvl, $suite] = $r;
300
+
301
+    if (!$suite) {
302
+        if ($avail != 'SYSTEM') {
303
+            return [];
304
+        }
305
+        $grammaire = $rotlvl;
306
+        $rotlvl = '';
307
+    } else {
308
+        if (!preg_match('/^"([^"]*)"\s*$/', $suite, $r) && !preg_match("/^'([^']*)'\s*$/", $suite, $r)) {
309
+            return [];
310
+        }
311
+
312
+        $grammaire = $r[1];
313
+    }
314
+
315
+    return [$entete, $avail, $grammaire, $rotlvl];
316 316
 }
Please login to merge, or discard this patch.
Spacing   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -40,8 +40,8 @@  discard block
 block discarded – undo
40 40
 	$t = $phraseur->ouvrant[$depth] ?? ' ';
41 41
 	// espace initial signifie: deja integree au resultat
42 42
 	if ($t[0] != ' ') {
43
-		$phraseur->res .= '<' . $t . '>';
44
-		$phraseur->ouvrant[$depth] = ' ' . $t;
43
+		$phraseur->res .= '<'.$t.'>';
44
+		$phraseur->ouvrant[$depth] = ' '.$t;
45 45
 	}
46 46
 	$t = $phraseur->contenu[$depth];
47 47
 	// n'indenter que s'il y a un separateur avant
@@ -52,14 +52,14 @@  discard block
 block discarded – undo
52 52
 	foreach ($attrs as $k => $v) {
53 53
 		$delim = str_contains($v, "'") ? '"' : "'";
54 54
 		$val = xml_entites_html($v);
55
-		$att .= $sep . $k . '=' . $delim
55
+		$att .= $sep.$k.'='.$delim
56 56
 			. ($delim !== '"' ? str_replace('&quot;', '"', $val) : $val)
57 57
 			. $delim;
58 58
 		$sep = "\n $depth";
59 59
 	}
60 60
 	$phraseur->depth .= '  ';
61 61
 	$phraseur->contenu[$phraseur->depth] = '';
62
-	$phraseur->ouvrant[$phraseur->depth] = $name . $att;
62
+	$phraseur->ouvrant[$phraseur->depth] = $name.$att;
63 63
 	$phraseur->reperes[$phraseur->depth] = xml_get_current_line_number($phraseur->sax);
64 64
 }
65 65
 
@@ -67,13 +67,13 @@  discard block
 block discarded – undo
67 67
 	$ouv = $phraseur->ouvrant[$phraseur->depth];
68 68
 
69 69
 	if ($ouv[0] != ' ') {
70
-		$phraseur->ouvrant[$phraseur->depth] = ' ' . $ouv;
70
+		$phraseur->ouvrant[$phraseur->depth] = ' '.$ouv;
71 71
 	} else {
72 72
 		$ouv = '';
73 73
 	}
74 74
 	$t = $phraseur->contenu[$phraseur->depth];
75 75
 	$phraseur->depth = substr($phraseur->depth, 2);
76
-	$t = preg_replace("/[\n\t ]+$/", "\n" . $phraseur->depth, $t);
76
+	$t = preg_replace("/[\n\t ]+$/", "\n".$phraseur->depth, $t);
77 77
 
78 78
 	// fusion <balise></balise> en <balise />.
79 79
 	// ATTENTION,  certains clients http croient que fusion ==> pas d'atttributs
@@ -82,9 +82,9 @@  discard block
 block discarded – undo
82 82
 	// (param fusion_bal)
83 83
 
84 84
 	if ($t || ($ouv != $name && !$fusion_bal)) {
85
-		$phraseur->res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . '</' . $name . '>';
85
+		$phraseur->res .= ($ouv ? ('<'.$ouv.'>') : '').$t.'</'.$name.'>';
86 86
 	} else {
87
-		$phraseur->res .= ($ouv ? ('<' . $ouv . ' />') : ('</' . $name . '>'));
87
+		$phraseur->res .= ($ouv ? ('<'.$ouv.' />') : ('</'.$name.'>'));
88 88
 	}
89 89
 }
90 90
 
@@ -126,16 +126,16 @@  discard block
 block discarded – undo
126 126
 		coordonnees_erreur(
127 127
 			$phraseur,
128 128
 			xml_error_string(xml_get_error_code($phraseur->sax))
129
-			. "<br />\n" .
129
+			. "<br />\n".
130 130
 			($phraseur->depth
131
-				? '(' .
132
-					_T('erreur_balise_non_fermee') .
133
-					' <tt>' .
134
-					$phraseur->ouvrant[$phraseur->depth] .
135
-					'</tt> ' .
136
-					_T('ligne') .
137
-					' ' .
138
-					$phraseur->reperes[$phraseur->depth] .
131
+				? '('.
132
+					_T('erreur_balise_non_fermee').
133
+					' <tt>'.
134
+					$phraseur->ouvrant[$phraseur->depth].
135
+					'</tt> '.
136
+					_T('ligne').
137
+					' '.
138
+					$phraseur->reperes[$phraseur->depth].
139 139
 					") <br />\n"
140 140
 				: '')
141 141
 		);
@@ -173,7 +173,7 @@  discard block
 block discarded – undo
173 173
 	// et escamoter le doctype que sax mange en php5 mais pas en  php4
174 174
 	if (!$doctype) {
175 175
 		if (!$r = analyser_doctype($page)) {
176
-			$page = _MESSAGE_DOCTYPE . _DOCTYPE_ECRIRE
176
+			$page = _MESSAGE_DOCTYPE._DOCTYPE_ECRIRE
177 177
 				. preg_replace(_REGEXP_DOCTYPE, '', $page);
178 178
 			$r = analyser_doctype($page);
179 179
 		}
@@ -280,18 +280,18 @@  discard block
 block discarded – undo
280 280
 					'rss-0.91.dtd'
281 281
 				];
282 282
 			} else {
283
-				$dtd = $topelement . '.dtd';
283
+				$dtd = $topelement.'.dtd';
284 284
 				$f = find_in_path($dtd);
285 285
 				if (file_exists($f)) {
286 286
 					return [$entete, 'SYSTEM', $f, $dtd];
287 287
 				}
288 288
 			}
289 289
 		}
290
-		spip_logger()->info('Dtd pas vu pour ' . substr($data, 0, 100));
290
+		spip_logger()->info('Dtd pas vu pour '.substr($data, 0, 100));
291 291
 
292 292
 		return [];
293 293
 	}
294
-	[$entete, , $topelement, $avail, $suite] = $page;
294
+	[$entete,, $topelement, $avail, $suite] = $page;
295 295
 
296 296
 	if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r) && !preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r)) {
297 297
 		return [];
Please login to merge, or discard this patch.
ecrire/xml/valider.php 1 patch
Indentation   +315 added lines, -315 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 /**
@@ -22,317 +22,317 @@  discard block
 block discarded – undo
22 22
  **/
23 23
 class ValidateurXML
24 24
 {
25
-	public function validerElement($phraseur, $name, $attrs) {
26
-		if (!($p = isset($this->dtc->elements[$name]))) {
27
-			if ($p = strpos((string) $name, ':')) {
28
-				$name = substr((string) $name, $p + 1);
29
-				$p = isset($this->dtc->elements[$name]);
30
-			}
31
-			if (!$p) {
32
-				coordonnees_erreur($this, " <b>$name</b>&nbsp;: "
33
-					. _T('zxml_inconnu_balise'));
34
-
35
-				return;
36
-			}
37
-		}
38
-		// controler les filles illegitimes, ca suffit
39
-		$depth = $this->depth;
40
-		$ouvrant = $this->ouvrant;
41
-		#spip_logger()->info("trouve $name apres " . $ouvrant[$depth]);
42
-		if (isset($ouvrant[$depth]) && preg_match('/^\s*(\w+)/', (string) $ouvrant[$depth], $r)) {
43
-			$pere = $r[1];
44
-			#spip_logger()->info("pere $pere");
45
-			if (isset($this->dtc->elements[$pere])) {
46
-				$fils = $this->dtc->elements[$pere];
47
-				#spip_logger()->info("rejeton $name fils " . @join(',',$fils));
48
-				if (!($p = @in_array($name, $fils)) && ($p = strpos((string) $name, ':'))) {
49
-					$p = substr((string) $name, $p + 1);
50
-					$p = @in_array($p, $fils);
51
-				}
52
-				if (!$p) {
53
-					$bons_peres = @implode('</b>, <b>', $this->dtc->peres[$name]);
54
-					coordonnees_erreur($this, " <b>$name</b> "
55
-						. _T('zxml_non_fils')
56
-						. ' <b>'
57
-						. $pere
58
-						. '</b>'
59
-						. ($bons_peres ? '<p style="font-size: 80%"> ' . _T('zxml_mais_de') . ' <b>' . $bons_peres . '</b></p>' : ''));
60
-				} elseif ($this->dtc->regles[$pere][0] == '/') {
61
-					$frat = substr((string) $depth, 2);
62
-					if (!isset($this->fratrie[$frat])) {
63
-						$this->fratrie[$frat] = '';
64
-					}
65
-					$this->fratrie[$frat] .= "$name ";
66
-				}
67
-			}
68
-		}
69
-		// Init de la suite des balises a memoriser si regle difficile
70
-		if ($this->dtc->regles[$name] && $this->dtc->regles[$name][0] == '/') {
71
-			$this->fratrie[$depth] = '';
72
-		}
73
-		if (isset($this->dtc->attributs[$name])) {
74
-			foreach ($this->dtc->attributs[$name] as $n => $v) {
75
-				if ($v[1] == '#REQUIRED' && !isset($attrs[$n])) {
76
-					coordonnees_erreur($this, " <b>$n</b>"
77
-						. '&nbsp;:&nbsp;'
78
-						. _T('zxml_obligatoire_attribut')
79
-						. " <b>$name</b>");
80
-				}
81
-			}
82
-		}
83
-	}
84
-
85
-	public function validerAttribut($phraseur, $name, $val, $bal) {
86
-		// Si la balise est inconnue, eviter d'insister
87
-		if (!isset($this->dtc->attributs[$bal])) {
88
-			return;
89
-		}
90
-
91
-		$a = $this->dtc->attributs[$bal];
92
-		if (!isset($a[$name])) {
93
-			$bons = implode(', ', array_keys($a));
94
-			if ($bons) {
95
-				$bons = " title=' " .
96
-					_T('zxml_connus_attributs') .
97
-					'&nbsp;: ' .
98
-					$bons .
99
-					"'";
100
-			}
101
-			$bons .= " style='font-weight: bold'";
102
-			coordonnees_erreur($this, " <b>$name</b> "
103
-				. _T('zxml_inconnu_attribut') . ' ' . _T('zxml_de')
104
-				. " <a$bons>$bal</a> ("
105
-				. _T('zxml_survoler')
106
-				. ')');
107
-		} else {
108
-			$type = $a[$name][0];
109
-			if (!preg_match('/^\w+$/', (string) $type)) {
110
-				$this->valider_motif($phraseur, $name, $val, $bal, $type);
111
-			} else {
112
-				if (method_exists($this, $f = 'validerAttribut_' . $type)) {
113
-					$this->$f($phraseur, $name, $val, $bal);
114
-				}
115
-			}
116
-			#		else spip_logger()->info("$type type d'attribut inconnu");
117
-		}
118
-	}
119
-
120
-	public function validerAttribut_NMTOKEN($phraseur, $name, $val, $bal) {
121
-		$this->valider_motif($phraseur, $name, $val, $bal, _REGEXP_NMTOKEN);
122
-	}
123
-
124
-	public function validerAttribut_NMTOKENS($phraseur, $name, $val, $bal) {
125
-		$this->valider_motif($phraseur, $name, $val, $bal, _REGEXP_NMTOKENS);
126
-	}
127
-
128
-	public function validerAttribut_ID($phraseur, $name, $val, $bal) {
129
-		if (isset($this->ids[$val])) {
130
-			[$l, $c] = $this->ids[$val];
131
-			coordonnees_erreur($this, " <p><b>$val</b> "
132
-				. _T('zxml_valeur_attribut')
133
-				. " <b>$name</b> "
134
-				. _T('zxml_de')
135
-				. " <b>$bal</b> "
136
-				. _T('zxml_vu')
137
-				. " (L$l,C$c)");
138
-		} else {
139
-			$this->valider_motif($phraseur, $name, $val, $bal, _REGEXP_ID);
140
-			$this->ids[$val] = [xml_get_current_line_number($phraseur), xml_get_current_column_number($phraseur)];
141
-		}
142
-	}
143
-
144
-	public function validerAttribut_IDREF($phraseur, $name, $val, $bal) {
145
-		$this->idrefs[] = [$val, xml_get_current_line_number($phraseur), xml_get_current_column_number($phraseur)];
146
-	}
147
-
148
-	public function validerAttribut_IDREFS($phraseur, $name, $val, $bal) {
149
-		$this->idrefss[] = [$val, xml_get_current_line_number($phraseur), xml_get_current_column_number($phraseur)];
150
-	}
151
-
152
-	public function valider_motif($phraseur, $name, $val, $bal, $motif) {
153
-		if (!preg_match($motif, (string) $val)) {
154
-			coordonnees_erreur($this, "<b>$val</b> "
155
-				. _T('zxml_valeur_attribut')
156
-				. " <b>$name</b> "
157
-				. _T('zxml_de')
158
-				. " <b>$bal</b> "
159
-				. _T('zxml_non_conforme')
160
-				. '</p><p>'
161
-				. '<b>' . $motif . '</b>');
162
-		}
163
-	}
164
-
165
-	public function valider_idref($nom, $ligne, $col) {
166
-		if (!isset($this->ids[$nom])) {
167
-			$this->err[] = [" <p><b>$nom</b> " . _T('zxml_inconnu_id'), $ligne, $col];
168
-		}
169
-	}
170
-
171
-	public function valider_passe2() {
172
-		if (!$this->err) {
173
-			foreach ($this->idrefs as $idref) {
174
-				[$nom, $ligne, $col] = $idref;
175
-				$this->valider_idref($nom, $ligne, $col);
176
-			}
177
-			foreach ($this->idrefss as $idref) {
178
-				[$noms, $ligne, $col] = $idref;
179
-				foreach (preg_split('/\s+/', (string) $noms) as $nom) {
180
-					$this->valider_idref($nom, $ligne, $col);
181
-				}
182
-			}
183
-		}
184
-	}
185
-
186
-	public function debutElement($phraseur, $name, $attrs) {
187
-		if ($this->dtc->elements) {
188
-			$this->validerElement($phraseur, $name, $attrs);
189
-		}
190
-
191
-		if ($f = $this->process['debut']) {
192
-			$f($this, $name, $attrs);
193
-		}
194
-		$depth = $this->depth;
195
-		$this->debuts[$depth] = strlen((string) $this->res);
196
-		foreach ($attrs as $k => $v) {
197
-			$this->validerAttribut($phraseur, $k, $v, $name);
198
-		}
199
-	}
200
-
201
-	public function finElement($phraseur, $name) {
202
-		$depth = $this->depth;
203
-		$contenu = $this->contenu;
204
-
205
-		$n = strlen((string) $this->res);
206
-		$c = strlen(trim((string) $contenu[$depth]));
207
-		$k = $this->debuts[$depth];
208
-
209
-		$regle = $this->dtc->regles[$name] ?? false;
210
-		$vide = ($regle == 'EMPTY');
211
-		// controler que les balises devant etre vides le sont
212
-		if ($vide) {
213
-			if ($n != $k + $c) {
214
-				coordonnees_erreur($this, " <p><b>$name</b> " . _T('zxml_nonvide_balise'));
215
-			}
216
-			// pour les regles PCDATA ou iteration de disjonction, tout est fait
217
-		} elseif ($regle && $regle != '*') {
218
-			if ($regle == '+') {
219
-				// iteration de disjonction non vide: 1 balise au -
220
-				if ($n == $k) {
221
-					coordonnees_erreur($this, "<p>\n<b>$name</b> "
222
-						. _T('zxml_vide_balise'));
223
-				}
224
-			} else {
225
-				$f = $this->fratrie[substr((string) $depth, 2)] ?? null;
226
-				if (is_null($f) || !preg_match($regle, (string) $f)) {
227
-					coordonnees_erreur(
228
-						$this,
229
-						" <p>\n<b>$name</b> "
230
-						. _T('zxml_succession_fils_incorrecte')
231
-						. '&nbsp;: <b>'
232
-						. $f
233
-						. '</b>'
234
-					);
235
-				}
236
-			}
237
-		}
238
-		if ($f = $this->process['fin']) {
239
-			$f($this, $name, $vide);
240
-		}
241
-	}
242
-
243
-	public function textElement($phraseur, $data) {
244
-		if (trim((string) $data)) {
245
-			$d = $this->depth;
246
-			$d = $this->ouvrant[$d];
247
-			preg_match('/^\s*(\S+)/', (string) $d, $m);
248
-			if (isset($this->dtc->pcdata[$m[1]]) && $this->dtc->pcdata[$m[1]]) {
249
-				coordonnees_erreur($this, ' <p><b>' . $m[1] . '</b> '
250
-					. _T('zxml_nonvide_balise')); // message a affiner
251
-			}
252
-		}
253
-		if ($f = $this->process['text']) {
254
-			$f($this, $data);
255
-		}
256
-	}
257
-
258
-	public function piElement($phraseur, $target, $data) {
259
-		if ($f = $this->process['pi']) {
260
-			$f($this, $target, $data);
261
-		}
262
-	}
263
-
264
-	// Denonciation des entitees XML inconnues
265
-	// Pour contourner le bug de conception de SAX qui ne signale pas si elles
266
-	// sont dans un attribut, les  entites les plus frequentes ont ete
267
-	// transcodees au prealable  (sauf & < > " que SAX traite correctement).
268
-	// On ne les verra donc pas passer a cette etape, contrairement a ce que
269
-	// le source de la page laisse legitimement supposer.
270
-
271
-	public function defaultElement($phraseur, $data) {
272
-		if (
273
-			!preg_match('/^<!--/', (string) $data)
274
-			&& preg_match_all('/&([^;]*)?/', (string) $data, $r, PREG_SET_ORDER)
275
-		) {
276
-			foreach ($r as $m) {
277
-				[$t, $e] = $m;
278
-				if (!isset($this->dtc->entites[$e])) {
279
-					coordonnees_erreur($this, " <b>$e</b> "
280
-						. _T('zxml_inconnu_entite')
281
-						. ' ');
282
-				}
283
-			}
284
-		}
285
-		if (isset($this->process['default']) && ($f = $this->process['default'])) {
286
-			$f($this, $data);
287
-		}
288
-	}
289
-
290
-	public function phraserTout($phraseur, $data) {
291
-		xml_parsestring($this, $data);
292
-
293
-		if (!$this->dtc || preg_match(',^' . _MESSAGE_DOCTYPE . ',', (string) $data)) {
294
-			$this->err[] = ['DOCTYPE ?', 0, 0];
295
-		} else {
296
-			$this->valider_passe2();
297
-		}
298
-	}
299
-
300
-	/**
301
-	 * Constructeur
302
-	 *
303
-	 * @param array $process ?
304
-	 **/
305
-	public function __construct($process = []) {
306
-		if (is_array($process)) {
307
-			$this->process = $process;
308
-		}
309
-	}
310
-
311
-	public $ids = [];
312
-	public $idrefs = [];
313
-	public $idrefss = [];
314
-	public $debuts = [];
315
-	public $fratrie = [];
316
-
317
-	public $dtc = null;
318
-	public $sax = null;
319
-	public $depth = '';
320
-	public $entete = '';
321
-	public $page = '';
322
-	public $res = '';
323
-	public array $err = [];
324
-	public array $contenu = [];
325
-	public array $versions = [];
326
-
327
-	public array $ouvrant = [];
328
-	public array $reperes = [];
329
-	public array $process = [
330
-		'debut' => 'xml_debutElement',
331
-		'fin' => 'xml_finElement',
332
-		'text' => 'xml_textElement',
333
-		'pi' => 'xml_piElement',
334
-		'default' => 'xml_defaultElement'
335
-	];
25
+    public function validerElement($phraseur, $name, $attrs) {
26
+        if (!($p = isset($this->dtc->elements[$name]))) {
27
+            if ($p = strpos((string) $name, ':')) {
28
+                $name = substr((string) $name, $p + 1);
29
+                $p = isset($this->dtc->elements[$name]);
30
+            }
31
+            if (!$p) {
32
+                coordonnees_erreur($this, " <b>$name</b>&nbsp;: "
33
+                    . _T('zxml_inconnu_balise'));
34
+
35
+                return;
36
+            }
37
+        }
38
+        // controler les filles illegitimes, ca suffit
39
+        $depth = $this->depth;
40
+        $ouvrant = $this->ouvrant;
41
+        #spip_logger()->info("trouve $name apres " . $ouvrant[$depth]);
42
+        if (isset($ouvrant[$depth]) && preg_match('/^\s*(\w+)/', (string) $ouvrant[$depth], $r)) {
43
+            $pere = $r[1];
44
+            #spip_logger()->info("pere $pere");
45
+            if (isset($this->dtc->elements[$pere])) {
46
+                $fils = $this->dtc->elements[$pere];
47
+                #spip_logger()->info("rejeton $name fils " . @join(',',$fils));
48
+                if (!($p = @in_array($name, $fils)) && ($p = strpos((string) $name, ':'))) {
49
+                    $p = substr((string) $name, $p + 1);
50
+                    $p = @in_array($p, $fils);
51
+                }
52
+                if (!$p) {
53
+                    $bons_peres = @implode('</b>, <b>', $this->dtc->peres[$name]);
54
+                    coordonnees_erreur($this, " <b>$name</b> "
55
+                        . _T('zxml_non_fils')
56
+                        . ' <b>'
57
+                        . $pere
58
+                        . '</b>'
59
+                        . ($bons_peres ? '<p style="font-size: 80%"> ' . _T('zxml_mais_de') . ' <b>' . $bons_peres . '</b></p>' : ''));
60
+                } elseif ($this->dtc->regles[$pere][0] == '/') {
61
+                    $frat = substr((string) $depth, 2);
62
+                    if (!isset($this->fratrie[$frat])) {
63
+                        $this->fratrie[$frat] = '';
64
+                    }
65
+                    $this->fratrie[$frat] .= "$name ";
66
+                }
67
+            }
68
+        }
69
+        // Init de la suite des balises a memoriser si regle difficile
70
+        if ($this->dtc->regles[$name] && $this->dtc->regles[$name][0] == '/') {
71
+            $this->fratrie[$depth] = '';
72
+        }
73
+        if (isset($this->dtc->attributs[$name])) {
74
+            foreach ($this->dtc->attributs[$name] as $n => $v) {
75
+                if ($v[1] == '#REQUIRED' && !isset($attrs[$n])) {
76
+                    coordonnees_erreur($this, " <b>$n</b>"
77
+                        . '&nbsp;:&nbsp;'
78
+                        . _T('zxml_obligatoire_attribut')
79
+                        . " <b>$name</b>");
80
+                }
81
+            }
82
+        }
83
+    }
84
+
85
+    public function validerAttribut($phraseur, $name, $val, $bal) {
86
+        // Si la balise est inconnue, eviter d'insister
87
+        if (!isset($this->dtc->attributs[$bal])) {
88
+            return;
89
+        }
90
+
91
+        $a = $this->dtc->attributs[$bal];
92
+        if (!isset($a[$name])) {
93
+            $bons = implode(', ', array_keys($a));
94
+            if ($bons) {
95
+                $bons = " title=' " .
96
+                    _T('zxml_connus_attributs') .
97
+                    '&nbsp;: ' .
98
+                    $bons .
99
+                    "'";
100
+            }
101
+            $bons .= " style='font-weight: bold'";
102
+            coordonnees_erreur($this, " <b>$name</b> "
103
+                . _T('zxml_inconnu_attribut') . ' ' . _T('zxml_de')
104
+                . " <a$bons>$bal</a> ("
105
+                . _T('zxml_survoler')
106
+                . ')');
107
+        } else {
108
+            $type = $a[$name][0];
109
+            if (!preg_match('/^\w+$/', (string) $type)) {
110
+                $this->valider_motif($phraseur, $name, $val, $bal, $type);
111
+            } else {
112
+                if (method_exists($this, $f = 'validerAttribut_' . $type)) {
113
+                    $this->$f($phraseur, $name, $val, $bal);
114
+                }
115
+            }
116
+            #		else spip_logger()->info("$type type d'attribut inconnu");
117
+        }
118
+    }
119
+
120
+    public function validerAttribut_NMTOKEN($phraseur, $name, $val, $bal) {
121
+        $this->valider_motif($phraseur, $name, $val, $bal, _REGEXP_NMTOKEN);
122
+    }
123
+
124
+    public function validerAttribut_NMTOKENS($phraseur, $name, $val, $bal) {
125
+        $this->valider_motif($phraseur, $name, $val, $bal, _REGEXP_NMTOKENS);
126
+    }
127
+
128
+    public function validerAttribut_ID($phraseur, $name, $val, $bal) {
129
+        if (isset($this->ids[$val])) {
130
+            [$l, $c] = $this->ids[$val];
131
+            coordonnees_erreur($this, " <p><b>$val</b> "
132
+                . _T('zxml_valeur_attribut')
133
+                . " <b>$name</b> "
134
+                . _T('zxml_de')
135
+                . " <b>$bal</b> "
136
+                . _T('zxml_vu')
137
+                . " (L$l,C$c)");
138
+        } else {
139
+            $this->valider_motif($phraseur, $name, $val, $bal, _REGEXP_ID);
140
+            $this->ids[$val] = [xml_get_current_line_number($phraseur), xml_get_current_column_number($phraseur)];
141
+        }
142
+    }
143
+
144
+    public function validerAttribut_IDREF($phraseur, $name, $val, $bal) {
145
+        $this->idrefs[] = [$val, xml_get_current_line_number($phraseur), xml_get_current_column_number($phraseur)];
146
+    }
147
+
148
+    public function validerAttribut_IDREFS($phraseur, $name, $val, $bal) {
149
+        $this->idrefss[] = [$val, xml_get_current_line_number($phraseur), xml_get_current_column_number($phraseur)];
150
+    }
151
+
152
+    public function valider_motif($phraseur, $name, $val, $bal, $motif) {
153
+        if (!preg_match($motif, (string) $val)) {
154
+            coordonnees_erreur($this, "<b>$val</b> "
155
+                . _T('zxml_valeur_attribut')
156
+                . " <b>$name</b> "
157
+                . _T('zxml_de')
158
+                . " <b>$bal</b> "
159
+                . _T('zxml_non_conforme')
160
+                . '</p><p>'
161
+                . '<b>' . $motif . '</b>');
162
+        }
163
+    }
164
+
165
+    public function valider_idref($nom, $ligne, $col) {
166
+        if (!isset($this->ids[$nom])) {
167
+            $this->err[] = [" <p><b>$nom</b> " . _T('zxml_inconnu_id'), $ligne, $col];
168
+        }
169
+    }
170
+
171
+    public function valider_passe2() {
172
+        if (!$this->err) {
173
+            foreach ($this->idrefs as $idref) {
174
+                [$nom, $ligne, $col] = $idref;
175
+                $this->valider_idref($nom, $ligne, $col);
176
+            }
177
+            foreach ($this->idrefss as $idref) {
178
+                [$noms, $ligne, $col] = $idref;
179
+                foreach (preg_split('/\s+/', (string) $noms) as $nom) {
180
+                    $this->valider_idref($nom, $ligne, $col);
181
+                }
182
+            }
183
+        }
184
+    }
185
+
186
+    public function debutElement($phraseur, $name, $attrs) {
187
+        if ($this->dtc->elements) {
188
+            $this->validerElement($phraseur, $name, $attrs);
189
+        }
190
+
191
+        if ($f = $this->process['debut']) {
192
+            $f($this, $name, $attrs);
193
+        }
194
+        $depth = $this->depth;
195
+        $this->debuts[$depth] = strlen((string) $this->res);
196
+        foreach ($attrs as $k => $v) {
197
+            $this->validerAttribut($phraseur, $k, $v, $name);
198
+        }
199
+    }
200
+
201
+    public function finElement($phraseur, $name) {
202
+        $depth = $this->depth;
203
+        $contenu = $this->contenu;
204
+
205
+        $n = strlen((string) $this->res);
206
+        $c = strlen(trim((string) $contenu[$depth]));
207
+        $k = $this->debuts[$depth];
208
+
209
+        $regle = $this->dtc->regles[$name] ?? false;
210
+        $vide = ($regle == 'EMPTY');
211
+        // controler que les balises devant etre vides le sont
212
+        if ($vide) {
213
+            if ($n != $k + $c) {
214
+                coordonnees_erreur($this, " <p><b>$name</b> " . _T('zxml_nonvide_balise'));
215
+            }
216
+            // pour les regles PCDATA ou iteration de disjonction, tout est fait
217
+        } elseif ($regle && $regle != '*') {
218
+            if ($regle == '+') {
219
+                // iteration de disjonction non vide: 1 balise au -
220
+                if ($n == $k) {
221
+                    coordonnees_erreur($this, "<p>\n<b>$name</b> "
222
+                        . _T('zxml_vide_balise'));
223
+                }
224
+            } else {
225
+                $f = $this->fratrie[substr((string) $depth, 2)] ?? null;
226
+                if (is_null($f) || !preg_match($regle, (string) $f)) {
227
+                    coordonnees_erreur(
228
+                        $this,
229
+                        " <p>\n<b>$name</b> "
230
+                        . _T('zxml_succession_fils_incorrecte')
231
+                        . '&nbsp;: <b>'
232
+                        . $f
233
+                        . '</b>'
234
+                    );
235
+                }
236
+            }
237
+        }
238
+        if ($f = $this->process['fin']) {
239
+            $f($this, $name, $vide);
240
+        }
241
+    }
242
+
243
+    public function textElement($phraseur, $data) {
244
+        if (trim((string) $data)) {
245
+            $d = $this->depth;
246
+            $d = $this->ouvrant[$d];
247
+            preg_match('/^\s*(\S+)/', (string) $d, $m);
248
+            if (isset($this->dtc->pcdata[$m[1]]) && $this->dtc->pcdata[$m[1]]) {
249
+                coordonnees_erreur($this, ' <p><b>' . $m[1] . '</b> '
250
+                    . _T('zxml_nonvide_balise')); // message a affiner
251
+            }
252
+        }
253
+        if ($f = $this->process['text']) {
254
+            $f($this, $data);
255
+        }
256
+    }
257
+
258
+    public function piElement($phraseur, $target, $data) {
259
+        if ($f = $this->process['pi']) {
260
+            $f($this, $target, $data);
261
+        }
262
+    }
263
+
264
+    // Denonciation des entitees XML inconnues
265
+    // Pour contourner le bug de conception de SAX qui ne signale pas si elles
266
+    // sont dans un attribut, les  entites les plus frequentes ont ete
267
+    // transcodees au prealable  (sauf & < > " que SAX traite correctement).
268
+    // On ne les verra donc pas passer a cette etape, contrairement a ce que
269
+    // le source de la page laisse legitimement supposer.
270
+
271
+    public function defaultElement($phraseur, $data) {
272
+        if (
273
+            !preg_match('/^<!--/', (string) $data)
274
+            && preg_match_all('/&([^;]*)?/', (string) $data, $r, PREG_SET_ORDER)
275
+        ) {
276
+            foreach ($r as $m) {
277
+                [$t, $e] = $m;
278
+                if (!isset($this->dtc->entites[$e])) {
279
+                    coordonnees_erreur($this, " <b>$e</b> "
280
+                        . _T('zxml_inconnu_entite')
281
+                        . ' ');
282
+                }
283
+            }
284
+        }
285
+        if (isset($this->process['default']) && ($f = $this->process['default'])) {
286
+            $f($this, $data);
287
+        }
288
+    }
289
+
290
+    public function phraserTout($phraseur, $data) {
291
+        xml_parsestring($this, $data);
292
+
293
+        if (!$this->dtc || preg_match(',^' . _MESSAGE_DOCTYPE . ',', (string) $data)) {
294
+            $this->err[] = ['DOCTYPE ?', 0, 0];
295
+        } else {
296
+            $this->valider_passe2();
297
+        }
298
+    }
299
+
300
+    /**
301
+     * Constructeur
302
+     *
303
+     * @param array $process ?
304
+     **/
305
+    public function __construct($process = []) {
306
+        if (is_array($process)) {
307
+            $this->process = $process;
308
+        }
309
+    }
310
+
311
+    public $ids = [];
312
+    public $idrefs = [];
313
+    public $idrefss = [];
314
+    public $debuts = [];
315
+    public $fratrie = [];
316
+
317
+    public $dtc = null;
318
+    public $sax = null;
319
+    public $depth = '';
320
+    public $entete = '';
321
+    public $page = '';
322
+    public $res = '';
323
+    public array $err = [];
324
+    public array $contenu = [];
325
+    public array $versions = [];
326
+
327
+    public array $ouvrant = [];
328
+    public array $reperes = [];
329
+    public array $process = [
330
+        'debut' => 'xml_debutElement',
331
+        'fin' => 'xml_finElement',
332
+        'text' => 'xml_textElement',
333
+        'pi' => 'xml_piElement',
334
+        'default' => 'xml_defaultElement'
335
+    ];
336 336
 }
337 337
 
338 338
 
@@ -342,8 +342,8 @@  discard block
 block discarded – undo
342 342
  *
343 343
  **/
344 344
 function xml_valider_dist($page, $apply = false, $process = false, $doctype = '', $charset = null) {
345
-	$f = new ValidateurXML($process);
346
-	$sax = charger_fonction('sax', 'xml');
345
+    $f = new ValidateurXML($process);
346
+    $sax = charger_fonction('sax', 'xml');
347 347
 
348
-	return $sax($page, $apply, $f, $doctype, $charset);
348
+    return $sax($page, $apply, $f, $doctype, $charset);
349 349
 }
Please login to merge, or discard this patch.
ecrire/xml/analyser_dtd.php 2 patches
Indentation   +309 added lines, -309 removed lines patch added patch discarded remove patch
@@ -10,58 +10,58 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 include_spip('xml/interfaces');
17 17
 
18 18
 function charger_dtd($grammaire, $avail, $rotlvl) {
19
-	$r = null;
20
-	static $dtd = []; # cache bien utile pour le validateur en boucle
21
-
22
-	if (isset($dtd[$grammaire])) {
23
-		return $dtd[$grammaire];
24
-	}
25
-
26
-	if ($avail == 'SYSTEM') {
27
-		$grammaire = find_in_path($grammaire);
28
-	}
29
-
30
-	$file = _DIR_CACHE_XML . preg_replace('/[^\w.]/', '_', (string) $rotlvl) . '.gz';
31
-
32
-	if (lire_fichier($file, $r)) {
33
-		if (!$grammaire) {
34
-			return [];
35
-		}
36
-		if ($avail == 'SYSTEM' && filemtime($file) < filemtime($grammaire)) {
37
-			$r = false;
38
-		}
39
-	}
40
-
41
-	if ($r) {
42
-		$dtc = unserialize($r);
43
-	} else {
44
-		spip_timer('dtd');
45
-		$dtc = new DTC();
46
-		// L'analyseur retourne un booleen de reussite et modifie $dtc.
47
-		// Retourner vide en cas d'echec
48
-		if (!analyser_dtd($grammaire, $avail, $dtc)) {
49
-			$dtc = [];
50
-		} else {
51
-			// tri final pour presenter les suggestions de corrections
52
-			foreach ($dtc->peres as $k => $v) {
53
-				asort($v);
54
-				$dtc->peres[$k] = $v;
55
-			}
56
-
57
-			spip_logger()->info("Analyser DTD $avail $grammaire (" . spip_timer('dtd') . ') ' . (is_countable($dtc->macros) ? count($dtc->macros) : 0) . ' macros, ' . (is_countable($dtc->elements) ? count($dtc->elements) : 0) . ' elements, ' . (is_countable($dtc->attributs) ? count($dtc->attributs) : 0) . " listes d'attributs, " . (is_countable($dtc->entites) ? count($dtc->entites) : 0) . ' entites');
58
-			#	$r = $dtc->regles; ksort($r);foreach($r as $l => $v) {$t=array_keys($dtc->attributs[$l]);echo "<b>$l</b> '$v' ", count($t), " attributs: ", join (', ',$t);$t=$dtc->peres[$l];echo "<br />",count($t), " peres: ", @join (', ',$t), "<br />\n";}exit;
59
-			ecrire_fichier($file, serialize($dtc), true);
60
-		}
61
-	}
62
-	$dtd[$grammaire] = $dtc;
63
-
64
-	return $dtc;
19
+    $r = null;
20
+    static $dtd = []; # cache bien utile pour le validateur en boucle
21
+
22
+    if (isset($dtd[$grammaire])) {
23
+        return $dtd[$grammaire];
24
+    }
25
+
26
+    if ($avail == 'SYSTEM') {
27
+        $grammaire = find_in_path($grammaire);
28
+    }
29
+
30
+    $file = _DIR_CACHE_XML . preg_replace('/[^\w.]/', '_', (string) $rotlvl) . '.gz';
31
+
32
+    if (lire_fichier($file, $r)) {
33
+        if (!$grammaire) {
34
+            return [];
35
+        }
36
+        if ($avail == 'SYSTEM' && filemtime($file) < filemtime($grammaire)) {
37
+            $r = false;
38
+        }
39
+    }
40
+
41
+    if ($r) {
42
+        $dtc = unserialize($r);
43
+    } else {
44
+        spip_timer('dtd');
45
+        $dtc = new DTC();
46
+        // L'analyseur retourne un booleen de reussite et modifie $dtc.
47
+        // Retourner vide en cas d'echec
48
+        if (!analyser_dtd($grammaire, $avail, $dtc)) {
49
+            $dtc = [];
50
+        } else {
51
+            // tri final pour presenter les suggestions de corrections
52
+            foreach ($dtc->peres as $k => $v) {
53
+                asort($v);
54
+                $dtc->peres[$k] = $v;
55
+            }
56
+
57
+            spip_logger()->info("Analyser DTD $avail $grammaire (" . spip_timer('dtd') . ') ' . (is_countable($dtc->macros) ? count($dtc->macros) : 0) . ' macros, ' . (is_countable($dtc->elements) ? count($dtc->elements) : 0) . ' elements, ' . (is_countable($dtc->attributs) ? count($dtc->attributs) : 0) . " listes d'attributs, " . (is_countable($dtc->entites) ? count($dtc->entites) : 0) . ' entites');
58
+            #	$r = $dtc->regles; ksort($r);foreach($r as $l => $v) {$t=array_keys($dtc->attributs[$l]);echo "<b>$l</b> '$v' ", count($t), " attributs: ", join (', ',$t);$t=$dtc->peres[$l];echo "<br />",count($t), " peres: ", @join (', ',$t), "<br />\n";}exit;
59
+            ecrire_fichier($file, serialize($dtc), true);
60
+        }
61
+    }
62
+    $dtd[$grammaire] = $dtc;
63
+
64
+    return $dtc;
65 65
 }
66 66
 
67 67
 // Compiler une regle de production en une Regexp qu'on appliquera sur la
@@ -73,137 +73,137 @@  discard block
 block discarded – undo
73 73
 // et parentheser le tout pour que  | + * ? s'applique dessus.
74 74
 
75 75
 function compilerRegle($val) {
76
-	return str_replace(
77
-		'()',
78
-		'',
79
-		preg_replace(
80
-			'/\s*,\s*/',
81
-			'',
82
-			preg_replace(
83
-				'/(\w+)\s*/',
84
-				'(?:\1 )',
85
-				preg_replace(
86
-					'/\s*\)/',
87
-					')',
88
-					preg_replace(
89
-						'/\s*([(+*|?])\s*/',
90
-						'\1',
91
-						preg_replace('/\s*#\w+\s*[,|]?\s*/', '', (string) $val)
92
-					)
93
-				)
94
-			)
95
-		)
96
-	);
76
+    return str_replace(
77
+        '()',
78
+        '',
79
+        preg_replace(
80
+            '/\s*,\s*/',
81
+            '',
82
+            preg_replace(
83
+                '/(\w+)\s*/',
84
+                '(?:\1 )',
85
+                preg_replace(
86
+                    '/\s*\)/',
87
+                    ')',
88
+                    preg_replace(
89
+                        '/\s*([(+*|?])\s*/',
90
+                        '\1',
91
+                        preg_replace('/\s*#\w+\s*[,|]?\s*/', '', (string) $val)
92
+                    )
93
+                )
94
+            )
95
+        )
96
+    );
97 97
 }
98 98
 
99 99
 
100 100
 function analyser_dtd($loc, $avail, &$dtc) {
101
-	// creer le repertoire de cache si ce n'est fait
102
-	// (utile aussi pour le resultat de la compil)
103
-	$file = sous_repertoire(_DIR_CACHE_XML);
104
-	// si DTD locale, ignorer ce repertoire pour le moment
105
-	if ($avail == 'SYSTEM') {
106
-		$file = $loc;
107
-		if (_DIR_RACINE && str_starts_with((string) $file, (string) _DIR_RACINE)) {
108
-			$file = substr((string) $file, strlen((string) _DIR_RACINE));
109
-		}
110
-		$file = find_in_path($file);
111
-	} else {
112
-		$file .= preg_replace('/[^\w.]/', '_', (string) $loc);
113
-	}
114
-
115
-	$dtd = '';
116
-	if (@is_readable($file)) {
117
-		lire_fichier($file, $dtd);
118
-	} else {
119
-		if ($avail == 'PUBLIC') {
120
-			include_spip('inc/distant');
121
-			$dtd = recuperer_url($loc);
122
-			$dtd = trim($dtd['page'] ?? '');
123
-			if ($dtd) {
124
-				ecrire_fichier($file, $dtd, true);
125
-			}
126
-		}
127
-	}
128
-
129
-	$dtd = ltrim($dtd);
130
-	if (!$dtd) {
131
-		spip_logger()->info("DTD '$loc' ($file) inaccessible");
132
-
133
-		return false;
134
-	} else {
135
-		spip_logger()->info("analyse de la DTD $loc ");
136
-	}
137
-
138
-	while ($dtd) {
139
-		if ($dtd[0] != '<') {
140
-			$r = analyser_dtd_lexeme($dtd, $dtc, $loc);
141
-		} elseif ($dtd[1] != '!') {
142
-			$r = analyser_dtd_pi($dtd, $dtc, $loc);
143
-		} elseif ($dtd[2] == '[') {
144
-			$r = analyser_dtd_data($dtd, $dtc, $loc);
145
-		} else {
146
-			$r = match ($dtd[3]) {
147
-				'%' => analyser_dtd_data($dtd, $dtc, $loc),
148
-				'T' => analyser_dtd_attlist($dtd, $dtc, $loc),
149
-				'L' => analyser_dtd_element($dtd, $dtc, $loc),
150
-				'N' => analyser_dtd_entity($dtd, $dtc, $loc),
151
-				'O' => analyser_dtd_notation($dtd, $dtc, $loc),
152
-				'-' => analyser_dtd_comment($dtd, $dtc, $loc),
153
-				default => -1,
154
-			};
155
-		}
156
-		if (!is_string($r)) {
157
-			spip_logger()->info("erreur $r dans la DTD  " . substr($dtd, 0, 80) . '.....');
158
-
159
-			return false;
160
-		}
161
-		$dtd = $r;
162
-	}
163
-
164
-	return true;
101
+    // creer le repertoire de cache si ce n'est fait
102
+    // (utile aussi pour le resultat de la compil)
103
+    $file = sous_repertoire(_DIR_CACHE_XML);
104
+    // si DTD locale, ignorer ce repertoire pour le moment
105
+    if ($avail == 'SYSTEM') {
106
+        $file = $loc;
107
+        if (_DIR_RACINE && str_starts_with((string) $file, (string) _DIR_RACINE)) {
108
+            $file = substr((string) $file, strlen((string) _DIR_RACINE));
109
+        }
110
+        $file = find_in_path($file);
111
+    } else {
112
+        $file .= preg_replace('/[^\w.]/', '_', (string) $loc);
113
+    }
114
+
115
+    $dtd = '';
116
+    if (@is_readable($file)) {
117
+        lire_fichier($file, $dtd);
118
+    } else {
119
+        if ($avail == 'PUBLIC') {
120
+            include_spip('inc/distant');
121
+            $dtd = recuperer_url($loc);
122
+            $dtd = trim($dtd['page'] ?? '');
123
+            if ($dtd) {
124
+                ecrire_fichier($file, $dtd, true);
125
+            }
126
+        }
127
+    }
128
+
129
+    $dtd = ltrim($dtd);
130
+    if (!$dtd) {
131
+        spip_logger()->info("DTD '$loc' ($file) inaccessible");
132
+
133
+        return false;
134
+    } else {
135
+        spip_logger()->info("analyse de la DTD $loc ");
136
+    }
137
+
138
+    while ($dtd) {
139
+        if ($dtd[0] != '<') {
140
+            $r = analyser_dtd_lexeme($dtd, $dtc, $loc);
141
+        } elseif ($dtd[1] != '!') {
142
+            $r = analyser_dtd_pi($dtd, $dtc, $loc);
143
+        } elseif ($dtd[2] == '[') {
144
+            $r = analyser_dtd_data($dtd, $dtc, $loc);
145
+        } else {
146
+            $r = match ($dtd[3]) {
147
+                '%' => analyser_dtd_data($dtd, $dtc, $loc),
148
+                'T' => analyser_dtd_attlist($dtd, $dtc, $loc),
149
+                'L' => analyser_dtd_element($dtd, $dtc, $loc),
150
+                'N' => analyser_dtd_entity($dtd, $dtc, $loc),
151
+                'O' => analyser_dtd_notation($dtd, $dtc, $loc),
152
+                '-' => analyser_dtd_comment($dtd, $dtc, $loc),
153
+                default => -1,
154
+            };
155
+        }
156
+        if (!is_string($r)) {
157
+            spip_logger()->info("erreur $r dans la DTD  " . substr($dtd, 0, 80) . '.....');
158
+
159
+            return false;
160
+        }
161
+        $dtd = $r;
162
+    }
163
+
164
+    return true;
165 165
 }
166 166
 
167 167
 function analyser_dtd_comment($dtd, &$dtc, $grammaire) {
168
-	// ejecter les commentaires, surtout quand ils contiennent du code.
169
-	// Option /s car sur plusieurs lignes parfois
168
+    // ejecter les commentaires, surtout quand ils contiennent du code.
169
+    // Option /s car sur plusieurs lignes parfois
170 170
 
171
-	if (!preg_match('/^<!--.*?-->\s*(.*)$/s', (string) $dtd, $m)) {
172
-		return -6;
173
-	}
171
+    if (!preg_match('/^<!--.*?-->\s*(.*)$/s', (string) $dtd, $m)) {
172
+        return -6;
173
+    }
174 174
 
175
-	return $m[1];
175
+    return $m[1];
176 176
 }
177 177
 
178 178
 function analyser_dtd_pi($dtd, &$dtc, $grammaire) {
179
-	if (!preg_match('/^<\?.*?>\s*(.*)$/s', (string) $dtd, $m)) {
180
-		return -10;
181
-	}
179
+    if (!preg_match('/^<\?.*?>\s*(.*)$/s', (string) $dtd, $m)) {
180
+        return -10;
181
+    }
182 182
 
183
-	return $m[1];
183
+    return $m[1];
184 184
 }
185 185
 
186 186
 function analyser_dtd_lexeme($dtd, &$dtc, $grammaire) {
187 187
 
188
-	if (!preg_match(_REGEXP_ENTITY_DEF, (string) $dtd, $m)) {
189
-		return -9;
190
-	}
191
-
192
-	[, $s] = $m;
193
-	$n = $dtc->macros[$s];
194
-
195
-	if (is_array($n)) {
196
-		// en cas d'inclusion, l'espace de nom est le meme
197
-		// mais gaffe aux DTD dont l'URL est relative a l'engloblante
198
-		if (
199
-			$n[0] == 'PUBLIC' && !tester_url_absolue($n[1])
200
-		) {
201
-			$n[1] = substr((string) $grammaire, 0, strrpos((string) $grammaire, '/') + 1) . $n[1];
202
-		}
203
-		analyser_dtd($n[1], $n[0], $dtc);
204
-	}
205
-
206
-	return ltrim(substr((string) $dtd, strlen($m[0])));
188
+    if (!preg_match(_REGEXP_ENTITY_DEF, (string) $dtd, $m)) {
189
+        return -9;
190
+    }
191
+
192
+    [, $s] = $m;
193
+    $n = $dtc->macros[$s];
194
+
195
+    if (is_array($n)) {
196
+        // en cas d'inclusion, l'espace de nom est le meme
197
+        // mais gaffe aux DTD dont l'URL est relative a l'engloblante
198
+        if (
199
+            $n[0] == 'PUBLIC' && !tester_url_absolue($n[1])
200
+        ) {
201
+            $n[1] = substr((string) $grammaire, 0, strrpos((string) $grammaire, '/') + 1) . $n[1];
202
+        }
203
+        analyser_dtd($n[1], $n[0], $dtc);
204
+    }
205
+
206
+    return ltrim(substr((string) $dtd, strlen($m[0])));
207 207
 }
208 208
 
209 209
 // il faudrait gerer plus proprement les niveaux d'inclusion:
@@ -211,78 +211,78 @@  discard block
 block discarded – undo
211 211
 
212 212
 function analyser_dtd_data($dtd, &$dtc, $grammaire) {
213 213
 
214
-	if (!preg_match(_REGEXP_INCLUDE_USE, (string) $dtd, $m)) {
215
-		return -11;
216
-	}
217
-	if (
218
-		!preg_match(
219
-			'/^((\s*<!(\[\s*%\s*[^;]*;\s*\[([^]<]*<[^>]*>)*[^]<]*\]\]>)|([^]>]*>))*[^]<]*)\]\]>\s*/s',
220
-			$m[2],
221
-			$r
222
-		)
223
-	) {
224
-		return -12;
225
-	}
226
-
227
-	return $dtc->macros[$m[1]] == 'INCLUDE'
228
-		? $r[1] . substr($m[2], strlen($r[0]))
229
-		: substr($m[2], strlen($r[0]));
214
+    if (!preg_match(_REGEXP_INCLUDE_USE, (string) $dtd, $m)) {
215
+        return -11;
216
+    }
217
+    if (
218
+        !preg_match(
219
+            '/^((\s*<!(\[\s*%\s*[^;]*;\s*\[([^]<]*<[^>]*>)*[^]<]*\]\]>)|([^]>]*>))*[^]<]*)\]\]>\s*/s',
220
+            $m[2],
221
+            $r
222
+        )
223
+    ) {
224
+        return -12;
225
+    }
226
+
227
+    return $dtc->macros[$m[1]] == 'INCLUDE'
228
+        ? $r[1] . substr($m[2], strlen($r[0]))
229
+        : substr($m[2], strlen($r[0]));
230 230
 }
231 231
 
232 232
 function analyser_dtd_notation($dtd, &$dtc, $grammaire) {
233
-	if (!preg_match('/^<!NOTATION.*?>\s*(.*)$/s', (string) $dtd, $m)) {
234
-		return -8;
235
-	}
236
-	spip_logger()->info('analyser_dtd_notation a ecrire');
233
+    if (!preg_match('/^<!NOTATION.*?>\s*(.*)$/s', (string) $dtd, $m)) {
234
+        return -8;
235
+    }
236
+    spip_logger()->info('analyser_dtd_notation a ecrire');
237 237
 
238
-	return $m[1];
238
+    return $m[1];
239 239
 }
240 240
 
241 241
 function analyser_dtd_entity($dtd, &$dtc, $grammaire) {
242
-	if (!preg_match(_REGEXP_ENTITY_DECL, (string) $dtd, $m)) {
243
-		return -2;
244
-	}
245
-
246
-	[$t, $term, $nom, $type, $k1, $k2, $k3, $k4, $k5, $k6, $c, $q, $alt, $dtd] = $m;
247
-
248
-	if (isset($dtc->macros[$nom]) && $dtc->macros[$nom]) {
249
-		return $dtd;
250
-	}
251
-	if (isset($dtc->entites[$nom])) {
252
-		spip_logger()->info("redefinition de l'entite $nom");
253
-	}
254
-	if ($k6) {
255
-		return $k6 . $dtd;
256
-	} // cas du synonyme complet
257
-	$val = expanserEntite(($k2 ? $k3 : ($k4 ? $k5 : $k6)), $dtc->macros);
258
-
259
-	// cas particulier double evaluation: 'PUBLIC "..." "...."'
260
-	if (preg_match('/(PUBLIC|SYSTEM)\s+"([^"]*)"\s*("([^"]*)")?\s*$/s', $val, $r)) {
261
-		[$t, $type, $val, $q, $alt] = $r;
262
-	}
263
-
264
-	if (!$term) {
265
-		$dtc->entites[$nom] = $val;
266
-	} elseif (!$type) {
267
-		$dtc->macros[$nom] = $val;
268
-	} else {
269
-		if ($type == 'SYSTEM' && !$alt) {
270
-			$alt = $val;
271
-		}
272
-		if (!$alt) {
273
-			$dtc->macros[$nom] = $val;
274
-		} else {
275
-			if (
276
-				$type == 'PUBLIC' && !str_contains($alt, '/')
277
-			) {
278
-				$alt = preg_replace(',/[^/]+$,', '/', (string) $grammaire)
279
-					. $alt;
280
-			}
281
-			$dtc->macros[$nom] = [$type, $alt];
282
-		}
283
-	}
284
-
285
-	return $dtd;
242
+    if (!preg_match(_REGEXP_ENTITY_DECL, (string) $dtd, $m)) {
243
+        return -2;
244
+    }
245
+
246
+    [$t, $term, $nom, $type, $k1, $k2, $k3, $k4, $k5, $k6, $c, $q, $alt, $dtd] = $m;
247
+
248
+    if (isset($dtc->macros[$nom]) && $dtc->macros[$nom]) {
249
+        return $dtd;
250
+    }
251
+    if (isset($dtc->entites[$nom])) {
252
+        spip_logger()->info("redefinition de l'entite $nom");
253
+    }
254
+    if ($k6) {
255
+        return $k6 . $dtd;
256
+    } // cas du synonyme complet
257
+    $val = expanserEntite(($k2 ? $k3 : ($k4 ? $k5 : $k6)), $dtc->macros);
258
+
259
+    // cas particulier double evaluation: 'PUBLIC "..." "...."'
260
+    if (preg_match('/(PUBLIC|SYSTEM)\s+"([^"]*)"\s*("([^"]*)")?\s*$/s', $val, $r)) {
261
+        [$t, $type, $val, $q, $alt] = $r;
262
+    }
263
+
264
+    if (!$term) {
265
+        $dtc->entites[$nom] = $val;
266
+    } elseif (!$type) {
267
+        $dtc->macros[$nom] = $val;
268
+    } else {
269
+        if ($type == 'SYSTEM' && !$alt) {
270
+            $alt = $val;
271
+        }
272
+        if (!$alt) {
273
+            $dtc->macros[$nom] = $val;
274
+        } else {
275
+            if (
276
+                $type == 'PUBLIC' && !str_contains($alt, '/')
277
+            ) {
278
+                $alt = preg_replace(',/[^/]+$,', '/', (string) $grammaire)
279
+                    . $alt;
280
+            }
281
+            $dtc->macros[$nom] = [$type, $alt];
282
+        }
283
+    }
284
+
285
+    return $dtd;
286 286
 }
287 287
 
288 288
 // Dresser le tableau des filles potentielles de l'element
@@ -295,71 +295,71 @@  discard block
 block discarded – undo
295 295
 // Fin du controle en finElement
296 296
 
297 297
 function analyser_dtd_element($dtd, &$dtc, $grammaire) {
298
-	if (!preg_match('/^<!ELEMENT\s+([^>\s]+)([^>]*)>\s*(.*)$/s', (string) $dtd, $m)) {
299
-		return -3;
300
-	}
301
-
302
-	[, $nom, $contenu, $dtd] = $m;
303
-	$nom = expanserEntite($nom, $dtc->macros);
304
-
305
-	if (isset($dtc->elements[$nom])) {
306
-		spip_logger()->info("redefinition de l'element $nom dans la DTD");
307
-
308
-		return -4;
309
-	}
310
-	$filles = [];
311
-	$contenu = expanserEntite($contenu, $dtc->macros);
312
-	$val = $contenu ? compilerRegle($contenu) : '(?:EMPTY )';
313
-	if ($val == '(?:EMPTY )') {
314
-		$dtc->regles[$nom] = 'EMPTY';
315
-	} elseif ($val == '(?:ANY )') {
316
-		$dtc->regles[$nom] = 'ANY';
317
-	} else {
318
-		$last = substr((string) $val, -1);
319
-		$dtc->regles[$nom] = preg_match('/ \w/', (string) $val) || (!empty($last) && !str_contains('*+?', $last))
320
-			? "/^$val$/"
321
-			: $last;
322
-		$filles = array_values(preg_split('/\W+/', (string) $val, -1, PREG_SPLIT_NO_EMPTY));
323
-
324
-		foreach ($filles as $k) {
325
-			if (!isset($dtc->peres[$k])) {
326
-				$dtc->peres[$k] = [];
327
-			}
328
-			if (!in_array($nom, $dtc->peres[$k])) {
329
-				$dtc->peres[$k][] = $nom;
330
-			}
331
-		}
332
-	}
333
-	$dtc->pcdata[$nom] = (!str_contains($contenu, '#PCDATA'));
334
-	$dtc->elements[$nom] = $filles;
335
-
336
-	return $dtd;
298
+    if (!preg_match('/^<!ELEMENT\s+([^>\s]+)([^>]*)>\s*(.*)$/s', (string) $dtd, $m)) {
299
+        return -3;
300
+    }
301
+
302
+    [, $nom, $contenu, $dtd] = $m;
303
+    $nom = expanserEntite($nom, $dtc->macros);
304
+
305
+    if (isset($dtc->elements[$nom])) {
306
+        spip_logger()->info("redefinition de l'element $nom dans la DTD");
307
+
308
+        return -4;
309
+    }
310
+    $filles = [];
311
+    $contenu = expanserEntite($contenu, $dtc->macros);
312
+    $val = $contenu ? compilerRegle($contenu) : '(?:EMPTY )';
313
+    if ($val == '(?:EMPTY )') {
314
+        $dtc->regles[$nom] = 'EMPTY';
315
+    } elseif ($val == '(?:ANY )') {
316
+        $dtc->regles[$nom] = 'ANY';
317
+    } else {
318
+        $last = substr((string) $val, -1);
319
+        $dtc->regles[$nom] = preg_match('/ \w/', (string) $val) || (!empty($last) && !str_contains('*+?', $last))
320
+            ? "/^$val$/"
321
+            : $last;
322
+        $filles = array_values(preg_split('/\W+/', (string) $val, -1, PREG_SPLIT_NO_EMPTY));
323
+
324
+        foreach ($filles as $k) {
325
+            if (!isset($dtc->peres[$k])) {
326
+                $dtc->peres[$k] = [];
327
+            }
328
+            if (!in_array($nom, $dtc->peres[$k])) {
329
+                $dtc->peres[$k][] = $nom;
330
+            }
331
+        }
332
+    }
333
+    $dtc->pcdata[$nom] = (!str_contains($contenu, '#PCDATA'));
334
+    $dtc->elements[$nom] = $filles;
335
+
336
+    return $dtd;
337 337
 }
338 338
 
339 339
 
340 340
 function analyser_dtd_attlist($dtd, &$dtc, $grammaire) {
341
-	if (!preg_match('/^<!ATTLIST\s+(\S+)\s+([^>]*)>\s*(.*)/s', (string) $dtd, $m)) {
342
-		return -5;
343
-	}
344
-
345
-	[, $nom, $val, $dtd] = $m;
346
-	$nom = expanserEntite($nom, $dtc->macros);
347
-	$val = expanserEntite($val, $dtc->macros);
348
-	if (!isset($dtc->attributs[$nom])) {
349
-		$dtc->attributs[$nom] = [];
350
-	}
351
-
352
-	if (preg_match_all("/\s*(\S+)\s+(([(][^)]*[)])|(\S+))\s+([^\s']*)(\s*'[^']*')?/", $val, $r2, PREG_SET_ORDER)) {
353
-		foreach ($r2 as $m2) {
354
-			$v = preg_match('/^\w+$/', $m2[2]) ? $m2[2]
355
-				: ('/^' . preg_replace('/\s+/', '', $m2[2]) . '$/');
356
-			$m21 = expanserEntite($m2[1], $dtc->macros);
357
-			$m25 = expanserEntite($m2[5], $dtc->macros);
358
-			$dtc->attributs[$nom][$m21] = [$v, $m25];
359
-		}
360
-	}
361
-
362
-	return $dtd;
341
+    if (!preg_match('/^<!ATTLIST\s+(\S+)\s+([^>]*)>\s*(.*)/s', (string) $dtd, $m)) {
342
+        return -5;
343
+    }
344
+
345
+    [, $nom, $val, $dtd] = $m;
346
+    $nom = expanserEntite($nom, $dtc->macros);
347
+    $val = expanserEntite($val, $dtc->macros);
348
+    if (!isset($dtc->attributs[$nom])) {
349
+        $dtc->attributs[$nom] = [];
350
+    }
351
+
352
+    if (preg_match_all("/\s*(\S+)\s+(([(][^)]*[)])|(\S+))\s+([^\s']*)(\s*'[^']*')?/", $val, $r2, PREG_SET_ORDER)) {
353
+        foreach ($r2 as $m2) {
354
+            $v = preg_match('/^\w+$/', $m2[2]) ? $m2[2]
355
+                : ('/^' . preg_replace('/\s+/', '', $m2[2]) . '$/');
356
+            $m21 = expanserEntite($m2[1], $dtc->macros);
357
+            $m25 = expanserEntite($m2[5], $dtc->macros);
358
+            $dtc->attributs[$nom][$m21] = [$v, $m25];
359
+        }
360
+    }
361
+
362
+    return $dtd;
363 363
 }
364 364
 
365 365
 
@@ -375,26 +375,26 @@  discard block
 block discarded – undo
375 375
  * @return string|array
376 376
  **/
377 377
 function expanserEntite($val, $macros = []) {
378
-	static $vu = [];
379
-	if (!is_string($val)) {
380
-		return $vu;
381
-	}
382
-
383
-	if (preg_match_all(_REGEXP_ENTITY_USE, $val, $r, PREG_SET_ORDER)) {
384
-		foreach ($r as $m) {
385
-			$ent = $m[1];
386
-			// il peut valoir ""
387
-			if (!isset($macros[$ent])) {
388
-				spip_logger()->info("Entite $ent inconnu");
389
-			} else {
390
-				if (!isset($vu[$ent])) {
391
-					$vu[$ent] = 0;
392
-				}
393
-				++$vu[$ent];
394
-				$val = str_replace($m[0], $macros[$ent], $val);
395
-			}
396
-		}
397
-	}
398
-
399
-	return trim(preg_replace('/\s+/', ' ', $val));
378
+    static $vu = [];
379
+    if (!is_string($val)) {
380
+        return $vu;
381
+    }
382
+
383
+    if (preg_match_all(_REGEXP_ENTITY_USE, $val, $r, PREG_SET_ORDER)) {
384
+        foreach ($r as $m) {
385
+            $ent = $m[1];
386
+            // il peut valoir ""
387
+            if (!isset($macros[$ent])) {
388
+                spip_logger()->info("Entite $ent inconnu");
389
+            } else {
390
+                if (!isset($vu[$ent])) {
391
+                    $vu[$ent] = 0;
392
+                }
393
+                ++$vu[$ent];
394
+                $val = str_replace($m[0], $macros[$ent], $val);
395
+            }
396
+        }
397
+    }
398
+
399
+    return trim(preg_replace('/\s+/', ' ', $val));
400 400
 }
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -27,7 +27,7 @@  discard block
 block discarded – undo
27 27
 		$grammaire = find_in_path($grammaire);
28 28
 	}
29 29
 
30
-	$file = _DIR_CACHE_XML . preg_replace('/[^\w.]/', '_', (string) $rotlvl) . '.gz';
30
+	$file = _DIR_CACHE_XML.preg_replace('/[^\w.]/', '_', (string) $rotlvl).'.gz';
31 31
 
32 32
 	if (lire_fichier($file, $r)) {
33 33
 		if (!$grammaire) {
@@ -54,7 +54,7 @@  discard block
 block discarded – undo
54 54
 				$dtc->peres[$k] = $v;
55 55
 			}
56 56
 
57
-			spip_logger()->info("Analyser DTD $avail $grammaire (" . spip_timer('dtd') . ') ' . (is_countable($dtc->macros) ? count($dtc->macros) : 0) . ' macros, ' . (is_countable($dtc->elements) ? count($dtc->elements) : 0) . ' elements, ' . (is_countable($dtc->attributs) ? count($dtc->attributs) : 0) . " listes d'attributs, " . (is_countable($dtc->entites) ? count($dtc->entites) : 0) . ' entites');
57
+			spip_logger()->info("Analyser DTD $avail $grammaire (".spip_timer('dtd').') '.(is_countable($dtc->macros) ? count($dtc->macros) : 0).' macros, '.(is_countable($dtc->elements) ? count($dtc->elements) : 0).' elements, '.(is_countable($dtc->attributs) ? count($dtc->attributs) : 0)." listes d'attributs, ".(is_countable($dtc->entites) ? count($dtc->entites) : 0).' entites');
58 58
 			#	$r = $dtc->regles; ksort($r);foreach($r as $l => $v) {$t=array_keys($dtc->attributs[$l]);echo "<b>$l</b> '$v' ", count($t), " attributs: ", join (', ',$t);$t=$dtc->peres[$l];echo "<br />",count($t), " peres: ", @join (', ',$t), "<br />\n";}exit;
59 59
 			ecrire_fichier($file, serialize($dtc), true);
60 60
 		}
@@ -154,7 +154,7 @@  discard block
 block discarded – undo
154 154
 			};
155 155
 		}
156 156
 		if (!is_string($r)) {
157
-			spip_logger()->info("erreur $r dans la DTD  " . substr($dtd, 0, 80) . '.....');
157
+			spip_logger()->info("erreur $r dans la DTD  ".substr($dtd, 0, 80).'.....');
158 158
 
159 159
 			return false;
160 160
 		}
@@ -198,7 +198,7 @@  discard block
 block discarded – undo
198 198
 		if (
199 199
 			$n[0] == 'PUBLIC' && !tester_url_absolue($n[1])
200 200
 		) {
201
-			$n[1] = substr((string) $grammaire, 0, strrpos((string) $grammaire, '/') + 1) . $n[1];
201
+			$n[1] = substr((string) $grammaire, 0, strrpos((string) $grammaire, '/') + 1).$n[1];
202 202
 		}
203 203
 		analyser_dtd($n[1], $n[0], $dtc);
204 204
 	}
@@ -225,7 +225,7 @@  discard block
 block discarded – undo
225 225
 	}
226 226
 
227 227
 	return $dtc->macros[$m[1]] == 'INCLUDE'
228
-		? $r[1] . substr($m[2], strlen($r[0]))
228
+		? $r[1].substr($m[2], strlen($r[0]))
229 229
 		: substr($m[2], strlen($r[0]));
230 230
 }
231 231
 
@@ -252,7 +252,7 @@  discard block
 block discarded – undo
252 252
 		spip_logger()->info("redefinition de l'entite $nom");
253 253
 	}
254 254
 	if ($k6) {
255
-		return $k6 . $dtd;
255
+		return $k6.$dtd;
256 256
 	} // cas du synonyme complet
257 257
 	$val = expanserEntite(($k2 ? $k3 : ($k4 ? $k5 : $k6)), $dtc->macros);
258 258
 
@@ -352,7 +352,7 @@  discard block
 block discarded – undo
352 352
 	if (preg_match_all("/\s*(\S+)\s+(([(][^)]*[)])|(\S+))\s+([^\s']*)(\s*'[^']*')?/", $val, $r2, PREG_SET_ORDER)) {
353 353
 		foreach ($r2 as $m2) {
354 354
 			$v = preg_match('/^\w+$/', $m2[2]) ? $m2[2]
355
-				: ('/^' . preg_replace('/\s+/', '', $m2[2]) . '$/');
355
+				: ('/^'.preg_replace('/\s+/', '', $m2[2]).'$/');
356 356
 			$m21 = expanserEntite($m2[1], $dtc->macros);
357 357
 			$m25 = expanserEntite($m2[5], $dtc->macros);
358 358
 			$dtc->attributs[$nom][$m21] = [$v, $m25];
Please login to merge, or discard this patch.