Completed
Push — master ( 3fe97a...7569f9 )
by cam
02:24
created
ecrire/inc/presentation_mini.php 1 patch
Indentation   +139 added lines, -139 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Affichage
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 /**
@@ -24,7 +24,7 @@  discard block
 block discarded – undo
24 24
  * @return string Code HTML
25 25
  */
26 26
 function debut_grand_cadre() {
27
- return "\n<div class = 'table_page'>\n";
27
+    return "\n<div class = 'table_page'>\n";
28 28
 }
29 29
 
30 30
 /**
@@ -33,7 +33,7 @@  discard block
 block discarded – undo
33 33
  * @return string Code HTML
34 34
  */
35 35
 function fin_grand_cadre() {
36
- return "\n</div>";
36
+    return "\n</div>";
37 37
 }
38 38
 
39 39
 // Debut de la colonne de gauche
@@ -48,7 +48,7 @@  discard block
 block discarded – undo
48 48
  * @return string Code HTML
49 49
  */
50 50
 function debut_gauche() {
51
-	return "<div id = 'conteneur' class = ''>\n<div id = 'navigation' class = 'lat' role = 'contentinfo'>\n";
51
+    return "<div id = 'conteneur' class = ''>\n<div id = 'navigation' class = 'lat' role = 'contentinfo'>\n";
52 52
 }
53 53
 
54 54
 /**
@@ -57,7 +57,7 @@  discard block
 block discarded – undo
57 57
  * @return string Code HTML
58 58
  */
59 59
 function fin_gauche() {
60
- return "</div></div><br class = 'nettoyeur' />";
60
+    return "</div></div><br class = 'nettoyeur' />";
61 61
 }
62 62
 
63 63
 /**
@@ -66,13 +66,13 @@  discard block
 block discarded – undo
66 66
  * @return string Code HTML
67 67
  */
68 68
 function creer_colonne_droite() {
69
-	static $deja_colonne_droite;
70
-	if ($deja_colonne_droite) {
71
-		return '';
72
-	}
73
-	$deja_colonne_droite = true;
69
+    static $deja_colonne_droite;
70
+    if ($deja_colonne_droite) {
71
+        return '';
72
+    }
73
+    $deja_colonne_droite = true;
74 74
 
75
-	return "\n</div><div id='extra' class='lat' role='complementary'>";
75
+    return "\n</div><div id='extra' class='lat' role='complementary'>";
76 76
 }
77 77
 
78 78
 /**
@@ -81,10 +81,10 @@  discard block
 block discarded – undo
81 81
  * @return string Code HTML
82 82
  */
83 83
 function debut_droite() {
84
-	return liste_objets_bloques(_request('exec'))
85
-	. creer_colonne_droite()
86
-	. '</div>'
87
-	. "\n<div id='contenu'>";
84
+    return liste_objets_bloques(_request('exec'))
85
+    . creer_colonne_droite()
86
+    . '</div>'
87
+    . "\n<div id='contenu'>";
88 88
 }
89 89
 
90 90
 /**
@@ -106,32 +106,32 @@  discard block
 block discarded – undo
106 106
  *     Code HTML
107 107
  **/
108 108
 function liste_objets_bloques($exec, $contexte = [], $auteur = null): string {
109
-	$res = '';
110
-	include_spip('inc/config');
111
-	if (lire_config('articles_modif', 'non') !== 'non') {
112
-		include_spip('inc/drapeau_edition');
113
-		if (is_null($auteur)) {
114
-			$auteur = $GLOBALS['visiteur_session'];
115
-		}
116
-		if (
117
-			($en_cours = trouver_objet_exec($exec))
118
-			&& $en_cours['edition']
119
-			&& ($type = $en_cours['type'])
120
-			&& (isset($contexte[$en_cours['id_table_objet']])
121
-			&& ($id = $contexte[$en_cours['id_table_objet']]) || ($id = _request($en_cours['id_table_objet'])))
122
-		) {
123
-			// marquer le fait que l'objet est ouvert en edition par toto
124
-			// a telle date ; une alerte sera donnee aux autres redacteurs
125
-			signale_edition($id, $auteur, $type);
126
-		}
127
-
128
-		$objets_ouverts = liste_drapeau_edition($auteur['id_auteur']);
129
-		if ($objets_ouverts !== []) {
130
-			$res .= recuperer_fond('prive/objets/liste/objets-en-edition', [], ['ajax' => true]);
131
-		}
132
-	}
133
-
134
-	return $res;
109
+    $res = '';
110
+    include_spip('inc/config');
111
+    if (lire_config('articles_modif', 'non') !== 'non') {
112
+        include_spip('inc/drapeau_edition');
113
+        if (is_null($auteur)) {
114
+            $auteur = $GLOBALS['visiteur_session'];
115
+        }
116
+        if (
117
+            ($en_cours = trouver_objet_exec($exec))
118
+            && $en_cours['edition']
119
+            && ($type = $en_cours['type'])
120
+            && (isset($contexte[$en_cours['id_table_objet']])
121
+            && ($id = $contexte[$en_cours['id_table_objet']]) || ($id = _request($en_cours['id_table_objet'])))
122
+        ) {
123
+            // marquer le fait que l'objet est ouvert en edition par toto
124
+            // a telle date ; une alerte sera donnee aux autres redacteurs
125
+            signale_edition($id, $auteur, $type);
126
+        }
127
+
128
+        $objets_ouverts = liste_drapeau_edition($auteur['id_auteur']);
129
+        if ($objets_ouverts !== []) {
130
+            $res .= recuperer_fond('prive/objets/liste/objets-en-edition', [], ['ajax' => true]);
131
+        }
132
+    }
133
+
134
+    return $res;
135 135
 }
136 136
 
137 137
 
@@ -145,23 +145,23 @@  discard block
 block discarded – undo
145 145
  * @return string Code HTML
146 146
  **/
147 147
 function fin_page() {
148
-	include_spip('inc/pipelines');
149
-	// avec &var_profile=1 on a le tableau de mesures SQL
150
-	$debug = (_request('exec') !== 'valider_xml'
151
-		&& (
152
-			_request('var_mode') == 'debug'
153
-			|| isset($GLOBALS['tableau_des_temps']) && $GLOBALS['tableau_des_temps']
154
-			&& isset($_COOKIE['spip_admin'])
155
-		)
156
-	);
157
-	$t = '</div><div id="pied"><div class="largeur">'
158
-		. recuperer_fond('prive/squelettes/inclure/pied')
159
-		. '</div>'
160
-		. '</div></div>' // cf. div#page et div.largeur ouvertes dans conmmencer_page()
161
-		. ($debug ? erreur_squelette() : '')
162
-		. "</body></html>\n";
163
-
164
-	return f_queue($t);
148
+    include_spip('inc/pipelines');
149
+    // avec &var_profile=1 on a le tableau de mesures SQL
150
+    $debug = (_request('exec') !== 'valider_xml'
151
+        && (
152
+            _request('var_mode') == 'debug'
153
+            || isset($GLOBALS['tableau_des_temps']) && $GLOBALS['tableau_des_temps']
154
+            && isset($_COOKIE['spip_admin'])
155
+        )
156
+    );
157
+    $t = '</div><div id="pied"><div class="largeur">'
158
+        . recuperer_fond('prive/squelettes/inclure/pied')
159
+        . '</div>'
160
+        . '</div></div>' // cf. div#page et div.largeur ouvertes dans conmmencer_page()
161
+        . ($debug ? erreur_squelette() : '')
162
+        . "</body></html>\n";
163
+
164
+    return f_queue($t);
165 165
 }
166 166
 
167 167
 /**
@@ -176,22 +176,22 @@  discard block
 block discarded – undo
176 176
  * @return string Code HTML
177 177
  **/
178 178
 function html_tests_js() {
179
-	if (_SPIP_AJAX && !defined('_TESTER_NOSCRIPT')) {
180
-		// pour le pied de page (deja defini si on est validation XML)
181
-		define(
182
-			'_TESTER_NOSCRIPT',
183
-			"<noscript>\n<div style='display:none;'><img src='"
184
-			. generer_url_ecrire('test_ajax', 'js=-1')
185
-			. "' width='1' height='1' alt='' /></div></noscript>\n"
186
-		);
187
-	}
188
-
189
-	$rejouer = '';
190
-	if (defined('_SESSION_REJOUER')) {
191
-		$rejouer = (_SESSION_REJOUER === true) ? rejouer_session() : _SESSION_REJOUER;
192
-	}
193
-
194
-	return $rejouer . (defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : '');
179
+    if (_SPIP_AJAX && !defined('_TESTER_NOSCRIPT')) {
180
+        // pour le pied de page (deja defini si on est validation XML)
181
+        define(
182
+            '_TESTER_NOSCRIPT',
183
+            "<noscript>\n<div style='display:none;'><img src='"
184
+            . generer_url_ecrire('test_ajax', 'js=-1')
185
+            . "' width='1' height='1' alt='' /></div></noscript>\n"
186
+        );
187
+    }
188
+
189
+    $rejouer = '';
190
+    if (defined('_SESSION_REJOUER')) {
191
+        $rejouer = (_SESSION_REJOUER === true) ? rejouer_session() : _SESSION_REJOUER;
192
+    }
193
+
194
+    return $rejouer . (defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : '');
195 195
 }
196 196
 
197 197
 /**
@@ -201,25 +201,25 @@  discard block
 block discarded – undo
201 201
  **/
202 202
 function info_maj_spip() {
203 203
 
204
-	$maj = $GLOBALS['meta']['info_maj_spip'] ?? null;
205
-	if (!$maj) {
206
-		return '';
207
-	}
204
+    $maj = $GLOBALS['meta']['info_maj_spip'] ?? null;
205
+    if (!$maj) {
206
+        return '';
207
+    }
208 208
 
209
-	$maj = explode('|', (string) $maj);
210
-	// c'est une ancienne notif, on a fait la maj depuis !
211
-	if ($GLOBALS['spip_version_branche'] !== reset($maj)) {
212
-		return '';
213
-	}
209
+    $maj = explode('|', (string) $maj);
210
+    // c'est une ancienne notif, on a fait la maj depuis !
211
+    if ($GLOBALS['spip_version_branche'] !== reset($maj)) {
212
+        return '';
213
+    }
214 214
 
215
-	if (!autoriser('webmestre')) {
216
-		return '';
217
-	}
215
+    if (!autoriser('webmestre')) {
216
+        return '';
217
+    }
218 218
 
219
-	array_shift($maj);
220
-	$maj = implode('|', $maj);
219
+    array_shift($maj);
220
+    $maj = implode('|', $maj);
221 221
 
222
-	return "$maj<br />";
222
+    return "$maj<br />";
223 223
 }
224 224
 
225 225
 /**
@@ -230,43 +230,43 @@  discard block
 block discarded – undo
230 230
  **/
231 231
 function info_copyright() {
232 232
 
233
-	$version = $GLOBALS['spip_version_affichee'];
234
-
235
-	//
236
-	// Mention, le cas echeant, de la revision SVN courante
237
-	//
238
-	if ($vcs = version_vcs_courante(_DIR_RACINE, true)) {
239
-		if ($vcs['vcs'] === 'GIT') {
240
-			$url = 'https://git.spip.net/spip/spip/commit/' . $vcs['commit'];
241
-		} elseif ($vcs['vcs'] === 'SVN') {
242
-			$url = 'https://core.spip.net/projects/spip/repository/revisions/' . $vcs['commit'];
243
-		} else {
244
-			$url = '';
245
-		}
246
-		// affichage "GIT [master: abcdef]"
247
-		$commit = $vcs['commit_short'] ?? $vcs['commit'];
248
-		if ($url) {
249
-			$commit = "<a href=\"$url\" target=\"_blank\" rel=\"noopener noreferrer\">$commit</a>";
250
-		}
251
-		if ($vcs['branch']) {
252
-			$commit = $vcs['branch'] . ': ' . $commit;
253
-		}
254
-		$version .= " {$vcs['vcs']} [$commit]";
255
-	}
256
-
257
-	// et la version de l'ecran de securite
258
-	$secu = defined('_ECRAN_SECURITE')
259
-		? '<br />' . _T('ecran_securite', ['version' => _ECRAN_SECURITE])
260
-		: '';
261
-
262
-	return _T(
263
-		'info_copyright',
264
-		[
265
-			'spip' => "<b>SPIP $version</b> ",
266
-			'lien_gpl' => '<a href="https://www.gnu.org/licenses/gpl-3.0.html">' . _T('info_copyright_gpl') . '</a>'
267
-		]
268
-	)
269
-	. $secu;
233
+    $version = $GLOBALS['spip_version_affichee'];
234
+
235
+    //
236
+    // Mention, le cas echeant, de la revision SVN courante
237
+    //
238
+    if ($vcs = version_vcs_courante(_DIR_RACINE, true)) {
239
+        if ($vcs['vcs'] === 'GIT') {
240
+            $url = 'https://git.spip.net/spip/spip/commit/' . $vcs['commit'];
241
+        } elseif ($vcs['vcs'] === 'SVN') {
242
+            $url = 'https://core.spip.net/projects/spip/repository/revisions/' . $vcs['commit'];
243
+        } else {
244
+            $url = '';
245
+        }
246
+        // affichage "GIT [master: abcdef]"
247
+        $commit = $vcs['commit_short'] ?? $vcs['commit'];
248
+        if ($url) {
249
+            $commit = "<a href=\"$url\" target=\"_blank\" rel=\"noopener noreferrer\">$commit</a>";
250
+        }
251
+        if ($vcs['branch']) {
252
+            $commit = $vcs['branch'] . ': ' . $commit;
253
+        }
254
+        $version .= " {$vcs['vcs']} [$commit]";
255
+    }
256
+
257
+    // et la version de l'ecran de securite
258
+    $secu = defined('_ECRAN_SECURITE')
259
+        ? '<br />' . _T('ecran_securite', ['version' => _ECRAN_SECURITE])
260
+        : '';
261
+
262
+    return _T(
263
+        'info_copyright',
264
+        [
265
+            'spip' => "<b>SPIP $version</b> ",
266
+            'lien_gpl' => '<a href="https://www.gnu.org/licenses/gpl-3.0.html">' . _T('info_copyright_gpl') . '</a>'
267
+        ]
268
+    )
269
+    . $secu;
270 270
 }
271 271
 
272 272
 /**
@@ -281,17 +281,17 @@  discard block
 block discarded – undo
281 281
  * @return string             Code HTML
282 282
  **/
283 283
 function formulaire_recherche($page, $complement = '') {
284
-	$recherche = _request('recherche');
285
-	$recherche_aff = entites_html($recherche);
286
-	if (!strlen((string) $recherche)) {
287
-		$recherche_aff = _T('info_rechercher');
288
-		$onfocus = " onfocus=\"this.value='';\"";
289
-	} else {
290
-		$onfocus = '';
291
-	}
292
-
293
-	$form = '<input type="text" size="10" value="' . $recherche_aff . '" name="recherche" class="recherche" accesskey="r"' . $onfocus . ' />';
294
-	$form .= "<input type='image' src='" . chemin_image('rechercher-20.png') . "' name='submit' class='submit' alt='" . _T('info_rechercher') . "' />";
295
-
296
-	return "<div class='spip_recherche'>" . generer_form_ecrire($page, $form . $complement, " method='get'") . '</div>';
284
+    $recherche = _request('recherche');
285
+    $recherche_aff = entites_html($recherche);
286
+    if (!strlen((string) $recherche)) {
287
+        $recherche_aff = _T('info_rechercher');
288
+        $onfocus = " onfocus=\"this.value='';\"";
289
+    } else {
290
+        $onfocus = '';
291
+    }
292
+
293
+    $form = '<input type="text" size="10" value="' . $recherche_aff . '" name="recherche" class="recherche" accesskey="r"' . $onfocus . ' />';
294
+    $form .= "<input type='image' src='" . chemin_image('rechercher-20.png') . "' name='submit' class='submit' alt='" . _T('info_rechercher') . "' />";
295
+
296
+    return "<div class='spip_recherche'>" . generer_form_ecrire($page, $form . $complement, " method='get'") . '</div>';
297 297
 }
Please login to merge, or discard this patch.
ecrire/base/repair.php 1 patch
Indentation   +63 added lines, -63 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
 /**
@@ -35,20 +35,20 @@  discard block
 block discarded – undo
35 35
  **/
36 36
 function base_repair_dist($titre = '', $reprise = '') {
37 37
 
38
-	$res = admin_repair_tables();
39
-	if (!$res) {
40
-		$res = "<div class='error'>" . _T('avis_erreur_mysql') . ' ' . sql_errno() . ': ' . sql_error() . "</div>\n";
41
-	} else {
42
-		include_spip('inc/rubriques');
43
-		calculer_rubriques();
44
-		propager_les_secteurs();
45
-	}
46
-	include_spip('inc/minipres');
47
-	$res .= pipeline('base_admin_repair', $res);
48
-	echo minipres(
49
-		_T('texte_tentative_recuperation'),
50
-		$res . generer_form_ecrire('accueil', '', '', _T('public:accueil_site'))
51
-	);
38
+    $res = admin_repair_tables();
39
+    if (!$res) {
40
+        $res = "<div class='error'>" . _T('avis_erreur_mysql') . ' ' . sql_errno() . ': ' . sql_error() . "</div>\n";
41
+    } else {
42
+        include_spip('inc/rubriques');
43
+        calculer_rubriques();
44
+        propager_les_secteurs();
45
+    }
46
+    include_spip('inc/minipres');
47
+    $res .= pipeline('base_admin_repair', $res);
48
+    echo minipres(
49
+        _T('texte_tentative_recuperation'),
50
+        $res . generer_form_ecrire('accueil', '', '', _T('public:accueil_site'))
51
+    );
52 52
 }
53 53
 
54 54
 /**
@@ -62,60 +62,60 @@  discard block
 block discarded – undo
62 62
  **/
63 63
 function admin_repair_tables() {
64 64
 
65
-	$repair = sql_serveur('repair', '', true);
65
+    $repair = sql_serveur('repair', '', true);
66 66
 
67
-	// recreer les tables manquantes eventuelles
68
-	include_spip('base/create');
69
-	creer_base();
70
-	$tables = sql_alltable();
67
+    // recreer les tables manquantes eventuelles
68
+    include_spip('base/create');
69
+    creer_base();
70
+    $tables = sql_alltable();
71 71
 
72
-	$res = '';
73
-	foreach ($tables as $tab) {
74
-		$class = '';
75
-		$m = "<strong>$tab</strong> ";
76
-		spip_log("Repare $tab", _LOG_INFO_IMPORTANTE);
77
-		// supprimer la meta avant de lancer la reparation
78
-		// car le repair peut etre long ; on ne veut pas boucler
79
-		effacer_meta('admin_repair');
80
-		if ($repair) {
81
-			$result_repair = sql_repair($tab);
82
-			if (!$result_repair) {
83
-				return false;
84
-			}
85
-		}
72
+    $res = '';
73
+    foreach ($tables as $tab) {
74
+        $class = '';
75
+        $m = "<strong>$tab</strong> ";
76
+        spip_log("Repare $tab", _LOG_INFO_IMPORTANTE);
77
+        // supprimer la meta avant de lancer la reparation
78
+        // car le repair peut etre long ; on ne veut pas boucler
79
+        effacer_meta('admin_repair');
80
+        if ($repair) {
81
+            $result_repair = sql_repair($tab);
82
+            if (!$result_repair) {
83
+                return false;
84
+            }
85
+        }
86 86
 
87
-		// essayer de maj la table (creation de champs manquants)
88
-		maj_tables($tab);
87
+        // essayer de maj la table (creation de champs manquants)
88
+        maj_tables($tab);
89 89
 
90
-		$count = sql_countsel($tab);
90
+        $count = sql_countsel($tab);
91 91
 
92
-		if ($count > 1) {
93
-			$m .= '(' . _T('texte_compte_elements', ['count' => $count]) . ")\n";
94
-		} else {
95
-			if ($count == 1) {
96
-				$m .= '(' . _T('texte_compte_element', ['count' => $count]) . ")\n";
97
-			} else {
98
-				$m .= '(' . _T('texte_vide') . ")\n";
99
-			}
100
-		}
92
+        if ($count > 1) {
93
+            $m .= '(' . _T('texte_compte_elements', ['count' => $count]) . ")\n";
94
+        } else {
95
+            if ($count == 1) {
96
+                $m .= '(' . _T('texte_compte_element', ['count' => $count]) . ")\n";
97
+            } else {
98
+                $m .= '(' . _T('texte_vide') . ")\n";
99
+            }
100
+        }
101 101
 
102
-		if (
103
-			$repair
104
-			&& $result_repair
105
-			&& ($msg = implode(
106
-				' ',
107
-				(is_resource($result_repair) || is_object($result_repair)) ? sql_fetch($result_repair) : $result_repair
108
-			) . ' ')
109
-			&& !str_contains($msg, ' OK ')
110
-		) {
111
-			$class = " class='notice'";
112
-			$m .= '<br /><tt>' . spip_htmlentities($msg) . "</tt>\n";
113
-		} else {
114
-			$m .= ' ' . _T('texte_table_ok');
115
-		}
102
+        if (
103
+            $repair
104
+            && $result_repair
105
+            && ($msg = implode(
106
+                ' ',
107
+                (is_resource($result_repair) || is_object($result_repair)) ? sql_fetch($result_repair) : $result_repair
108
+            ) . ' ')
109
+            && !str_contains($msg, ' OK ')
110
+        ) {
111
+            $class = " class='notice'";
112
+            $m .= '<br /><tt>' . spip_htmlentities($msg) . "</tt>\n";
113
+        } else {
114
+            $m .= ' ' . _T('texte_table_ok');
115
+        }
116 116
 
117
-		$res .= "<div$class>$m</div>";
118
-	}
117
+        $res .= "<div$class>$m</div>";
118
+    }
119 119
 
120
-	return $res;
120
+    return $res;
121 121
 }
Please login to merge, or discard this patch.
ecrire/base/delete_all.php 1 patch
Indentation   +22 added lines, -22 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
 /**
@@ -28,27 +28,27 @@  discard block
 block discarded – undo
28 28
  * @param string $titre Inutilisé
29 29
  **/
30 30
 function base_delete_all_dist($titre) {
31
-	$delete = _request('delete');
32
-	$res = [];
33
-	if (is_array($delete)) {
34
-		foreach ($delete as $table) {
35
-			if (sql_drop_table($table)) {
36
-				$res[] = $table;
37
-			} else {
38
-				spip_log("SPIP n'a pas pu detruire $table.", _LOG_ERREUR);
39
-			}
40
-		}
31
+    $delete = _request('delete');
32
+    $res = [];
33
+    if (is_array($delete)) {
34
+        foreach ($delete as $table) {
35
+            if (sql_drop_table($table)) {
36
+                $res[] = $table;
37
+            } else {
38
+                spip_log("SPIP n'a pas pu detruire $table.", _LOG_ERREUR);
39
+            }
40
+        }
41 41
 
42
-		// un pipeline pour detruire les tables installees par les plugins
43
-		pipeline('delete_tables', '');
42
+        // un pipeline pour detruire les tables installees par les plugins
43
+        pipeline('delete_tables', '');
44 44
 
45
-		spip_unlink(_FILE_CONNECT);
46
-		spip_unlink(_FILE_CHMOD);
47
-		spip_unlink(_FILE_META);
48
-		spip_unlink(_ACCESS_FILE_NAME);
49
-		spip_unlink(_CACHE_RUBRIQUES);
50
-	}
51
-	$d = is_countable($delete) ? count($delete) : 0;
52
-	$r = count($res);
53
-	spip_log("Tables detruites: $r sur $d: " . implode(', ', $res), _LOG_INFO_IMPORTANTE);
45
+        spip_unlink(_FILE_CONNECT);
46
+        spip_unlink(_FILE_CHMOD);
47
+        spip_unlink(_FILE_META);
48
+        spip_unlink(_ACCESS_FILE_NAME);
49
+        spip_unlink(_CACHE_RUBRIQUES);
50
+    }
51
+    $d = is_countable($delete) ? count($delete) : 0;
52
+    $r = count($res);
53
+    spip_log("Tables detruites: $r sur $d: " . implode(', ', $res), _LOG_INFO_IMPORTANTE);
54 54
 }
Please login to merge, or discard this patch.
ecrire/base/dump.php 1 patch
Indentation   +531 added lines, -531 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,35 +338,35 @@  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_log(
344
-		'Vider ' . count($tables) . " tables sur serveur '$serveur' : " . implode(', ', $tables),
345
-		'base.' . _LOG_INFO_IMPORTANTE
346
-	);
347
-	foreach ($tables as $table) {
348
-		// sur le serveur principal, il ne faut pas supprimer l'auteur loge !
349
-		if (!in_array($table, $exclure_tables) && ($table != 'spip_auteurs' || $serveur != '')) {
350
-			// regarder si il y a au moins un champ impt='non'
351
-			$desc = $trouver_table($table, $serveur);
352
-			if (isset($desc['field']['impt'])) {
353
-				sql_delete($table, "impt='oui'", $serveur);
354
-			} elseif ($desc) {
355
-				sql_delete($table, '', $serveur);
356
-			}
357
-		}
358
-	}
359
-
360
-	// sur le serveur principal, il ne faut pas supprimer l'auteur loge !
361
-	// Bidouille pour garder l'acces admin actuel pendant toute la restauration
362
-	if (
363
-		$serveur == ''
364
-		&& in_array('spip_auteurs', $tables)
365
-		&& !in_array('spip_auteurs', $exclure_tables)
366
-	) {
367
-		base_conserver_copieur(true, $serveur);
368
-		sql_delete('spip_auteurs', 'id_auteur>0', $serveur);
369
-	}
341
+    $trouver_table = charger_fonction('trouver_table', 'base');
342
+
343
+    spip_log(
344
+        'Vider ' . count($tables) . " tables sur serveur '$serveur' : " . implode(', ', $tables),
345
+        'base.' . _LOG_INFO_IMPORTANTE
346
+    );
347
+    foreach ($tables as $table) {
348
+        // sur le serveur principal, il ne faut pas supprimer l'auteur loge !
349
+        if (!in_array($table, $exclure_tables) && ($table != 'spip_auteurs' || $serveur != '')) {
350
+            // regarder si il y a au moins un champ impt='non'
351
+            $desc = $trouver_table($table, $serveur);
352
+            if (isset($desc['field']['impt'])) {
353
+                sql_delete($table, "impt='oui'", $serveur);
354
+            } elseif ($desc) {
355
+                sql_delete($table, '', $serveur);
356
+            }
357
+        }
358
+    }
359
+
360
+    // sur le serveur principal, il ne faut pas supprimer l'auteur loge !
361
+    // Bidouille pour garder l'acces admin actuel pendant toute la restauration
362
+    if (
363
+        $serveur == ''
364
+        && in_array('spip_auteurs', $tables)
365
+        && !in_array('spip_auteurs', $exclure_tables)
366
+    ) {
367
+        base_conserver_copieur(true, $serveur);
368
+        sql_delete('spip_auteurs', 'id_auteur>0', $serveur);
369
+    }
370 370
 }
371 371
 
372 372
 /**
@@ -377,36 +377,36 @@  discard block
 block discarded – undo
377 377
  * @return void
378 378
  */
379 379
 function base_conserver_copieur($move = true, $serveur = '') {
380
-	// s'asurer qu'on a pas deja fait la manip !
381
-	if ($GLOBALS['visiteur_session']['id_auteur'] > 0 && sql_countsel('spip_auteurs', 'id_auteur>0')) {
382
-		spip_log(
383
-			'Conserver copieur dans id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'] . " pour le serveur '$serveur'",
384
-			'dump.' . _LOG_INFO_IMPORTANTE
385
-		);
386
-		sql_delete('spip_auteurs', 'id_auteur<0', $serveur);
387
-		if ($move) {
388
-			sql_updateq(
389
-				'spip_auteurs',
390
-				['id_auteur' => -$GLOBALS['visiteur_session']['id_auteur']],
391
-				'id_auteur=' . (int) $GLOBALS['visiteur_session']['id_auteur'],
392
-				[],
393
-				$serveur
394
-			);
395
-		} else {
396
-			$row = sql_fetsel(
397
-				'*',
398
-				'spip_auteurs',
399
-				'id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'],
400
-				'',
401
-				'',
402
-				'',
403
-				'',
404
-				$serveur
405
-			);
406
-			$row['id_auteur'] = -$GLOBALS['visiteur_session']['id_auteur'];
407
-			sql_insertq('spip_auteurs', $row, [], $serveur);
408
-		}
409
-	}
380
+    // s'asurer qu'on a pas deja fait la manip !
381
+    if ($GLOBALS['visiteur_session']['id_auteur'] > 0 && sql_countsel('spip_auteurs', 'id_auteur>0')) {
382
+        spip_log(
383
+            'Conserver copieur dans id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'] . " pour le serveur '$serveur'",
384
+            'dump.' . _LOG_INFO_IMPORTANTE
385
+        );
386
+        sql_delete('spip_auteurs', 'id_auteur<0', $serveur);
387
+        if ($move) {
388
+            sql_updateq(
389
+                'spip_auteurs',
390
+                ['id_auteur' => -$GLOBALS['visiteur_session']['id_auteur']],
391
+                'id_auteur=' . (int) $GLOBALS['visiteur_session']['id_auteur'],
392
+                [],
393
+                $serveur
394
+            );
395
+        } else {
396
+            $row = sql_fetsel(
397
+                '*',
398
+                'spip_auteurs',
399
+                'id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'],
400
+                '',
401
+                '',
402
+                '',
403
+                '',
404
+                $serveur
405
+            );
406
+            $row['id_auteur'] = -$GLOBALS['visiteur_session']['id_auteur'];
407
+            sql_insertq('spip_auteurs', $row, [], $serveur);
408
+        }
409
+    }
410 410
 }
411 411
 
412 412
 /**
@@ -421,21 +421,21 @@  discard block
 block discarded – undo
421 421
  * @param string $serveur
422 422
  */
423 423
 function base_detruire_copieur_si_besoin($serveur = '') {
424
-	// rien a faire si ce n'est pas le serveur principal !
425
-	if ($serveur == '') {
426
-		if (sql_countsel('spip_auteurs', 'id_auteur>0')) {
427
-			spip_log("Detruire copieur id_auteur<0 pour le serveur '$serveur'", 'dump.' . _LOG_INFO_IMPORTANTE);
428
-			sql_delete('spip_auteurs', 'id_auteur<0', $serveur);
429
-		} else {
430
-			spip_log(
431
-				"Restaurer copieur id_auteur<0 pour le serveur '$serveur' (aucun autre auteur en base)",
432
-				'dump.' . _LOG_INFO_IMPORTANTE
433
-			);
434
-			sql_update('spip_auteurs', ['id_auteur' => '-id_auteur'], 'id_auteur<0');
435
-		}
436
-	} else {
437
-		spip_log("Pas de destruction copieur sur serveur '$serveur'", 'dump.' . _LOG_INFO_IMPORTANTE);
438
-	}
424
+    // rien a faire si ce n'est pas le serveur principal !
425
+    if ($serveur == '') {
426
+        if (sql_countsel('spip_auteurs', 'id_auteur>0')) {
427
+            spip_log("Detruire copieur id_auteur<0 pour le serveur '$serveur'", 'dump.' . _LOG_INFO_IMPORTANTE);
428
+            sql_delete('spip_auteurs', 'id_auteur<0', $serveur);
429
+        } else {
430
+            spip_log(
431
+                "Restaurer copieur id_auteur<0 pour le serveur '$serveur' (aucun autre auteur en base)",
432
+                'dump.' . _LOG_INFO_IMPORTANTE
433
+            );
434
+            sql_update('spip_auteurs', ['id_auteur' => '-id_auteur'], 'id_auteur<0');
435
+        }
436
+    } else {
437
+        spip_log("Pas de destruction copieur sur serveur '$serveur'", 'dump.' . _LOG_INFO_IMPORTANTE);
438
+    }
439 439
 }
440 440
 
441 441
 /**
@@ -450,40 +450,40 @@  discard block
 block discarded – undo
450 450
  * @return array
451 451
  */
452 452
 function base_preparer_table_dest($table, $desc, $serveur_dest, $init = false) {
453
-	$upgrade = false;
454
-	// si la table existe et qu'on est a l'init, la dropper
455
-	if (($desc_dest = sql_showtable($table, true, $serveur_dest)) && $init) {
456
-		if ($serveur_dest == '' && in_array($table, ['spip_meta', 'spip_auteurs'])) {
457
-			// ne pas dropper auteurs et meta sur le serveur principal
458
-			// faire un simple upgrade a la place
459
-			// pour ajouter les champs manquants
460
-			$upgrade = true;
461
-			// coherence avec le drop sur les autres tables
462
-			base_vider_tables_destination_copie([$table], [], $serveur_dest);
463
-			if ($table == 'spip_meta') {
464
-				// virer les version base qui vont venir avec l'import
465
-				sql_delete($table, "nom like '%_base_version'", $serveur_dest);
466
-				// hum casse la base si pas version_installee a l'import ...
467
-				sql_delete($table, "nom='version_installee'", $serveur_dest);
468
-			}
469
-		} else {
470
-			sql_drop_table($table, '', $serveur_dest);
471
-			spip_log("drop table '$table' sur serveur '$serveur_dest'", 'dump.' . _LOG_INFO_IMPORTANTE);
472
-		}
473
-		$desc_dest = false;
474
-	}
475
-	// si la table n'existe pas dans la destination, la creer a l'identique !
476
-	if (!$desc_dest) {
477
-		spip_log("creation '$table' sur serveur '$serveur_dest'", 'dump.' . _LOG_INFO_IMPORTANTE);
478
-		include_spip('base/create');
479
-		creer_ou_upgrader_table($table, $desc, 'auto', $upgrade, $serveur_dest);
480
-		$desc_dest = sql_showtable($table, true, $serveur_dest);
481
-	}
482
-	if (!$desc_dest) {
483
-		spip_log("Erreur creation '$table' sur serveur '$serveur_dest'" . var_export($desc, 1), 'dump.' . _LOG_ERREUR);
484
-	}
485
-
486
-	return $desc_dest;
453
+    $upgrade = false;
454
+    // si la table existe et qu'on est a l'init, la dropper
455
+    if (($desc_dest = sql_showtable($table, true, $serveur_dest)) && $init) {
456
+        if ($serveur_dest == '' && in_array($table, ['spip_meta', 'spip_auteurs'])) {
457
+            // ne pas dropper auteurs et meta sur le serveur principal
458
+            // faire un simple upgrade a la place
459
+            // pour ajouter les champs manquants
460
+            $upgrade = true;
461
+            // coherence avec le drop sur les autres tables
462
+            base_vider_tables_destination_copie([$table], [], $serveur_dest);
463
+            if ($table == 'spip_meta') {
464
+                // virer les version base qui vont venir avec l'import
465
+                sql_delete($table, "nom like '%_base_version'", $serveur_dest);
466
+                // hum casse la base si pas version_installee a l'import ...
467
+                sql_delete($table, "nom='version_installee'", $serveur_dest);
468
+            }
469
+        } else {
470
+            sql_drop_table($table, '', $serveur_dest);
471
+            spip_log("drop table '$table' sur serveur '$serveur_dest'", 'dump.' . _LOG_INFO_IMPORTANTE);
472
+        }
473
+        $desc_dest = false;
474
+    }
475
+    // si la table n'existe pas dans la destination, la creer a l'identique !
476
+    if (!$desc_dest) {
477
+        spip_log("creation '$table' sur serveur '$serveur_dest'", 'dump.' . _LOG_INFO_IMPORTANTE);
478
+        include_spip('base/create');
479
+        creer_ou_upgrader_table($table, $desc, 'auto', $upgrade, $serveur_dest);
480
+        $desc_dest = sql_showtable($table, true, $serveur_dest);
481
+    }
482
+    if (!$desc_dest) {
483
+        spip_log("Erreur creation '$table' sur serveur '$serveur_dest'" . var_export($desc, 1), 'dump.' . _LOG_ERREUR);
484
+    }
485
+
486
+    return $desc_dest;
487 487
 }
488 488
 
489 489
 /**
@@ -529,211 +529,211 @@  discard block
 block discarded – undo
529 529
  */
530 530
 function base_copier_tables($status_file, $tables, $serveur_source, $serveur_dest, $options = []) {
531 531
 
532
-	$status = [];
533
-	$callback_progression = $options['callback_progression'] ?? '';
534
-	$max_time = $options['max_time'] ?? 0;
535
-	$drop_source = $options['drop_source'] ?? false;
536
-	$no_erase_dest = $options['no_erase_dest'] ?? [];
537
-	$where = $options['where'] ?? [];
538
-	$fonction_base_inserer = $options['fonction_base_inserer'] ?? 'inserer_copie';
539
-	$desc_tables_dest = $options['desc_tables_dest'] ?? [];
540
-	$racine_fonctions = $options['racine_fonctions_dest'] ?? 'base';
541
-	$data_pool = $options['data_pool'] ?? 50 * 1024;
542
-
543
-	spip_log(
544
-		'Copier ' . count($tables) . " tables de '$serveur_source' vers '$serveur_dest'",
545
-		'dump.' . _LOG_INFO_IMPORTANTE
546
-	);
547
-
548
-	if (!$inserer_copie = charger_fonction($fonction_base_inserer, $racine_fonctions, true)) {
549
-		spip_log("Fonction '{$racine_fonctions}_$fonction_base_inserer' inconnue. Abandon", 'dump.' . _LOG_INFO_IMPORTANTE);
550
-
551
-		return true; // echec mais on a fini, donc true
552
-	}
553
-	if (!$preparer_table_dest = charger_fonction('preparer_table_dest', $racine_fonctions, true)) {
554
-		spip_log("Fonction '{$racine_fonctions}_$preparer_table_dest' inconnue. Abandon", 'dump.' . _LOG_INFO_IMPORTANTE);
555
-
556
-		return true; // echec mais on a fini, donc true
557
-	}
558
-
559
-	if (
560
-		!lire_fichier($status_file, $status)
561
-		|| !($status = unserialize($status))
562
-	) {
563
-		$status = [];
564
-	}
565
-	$status['etape'] = 'basecopie';
566
-
567
-	// puis relister les tables a importer
568
-	// et les vider si besoin, au moment du premier passage ici
569
-	$initialisation_copie = $status['dump_status_copie'] ?? 0;
570
-
571
-	// si init pas encore faite, vider les tables du serveur destination
572
-	if (!$initialisation_copie) {
573
-		if (
574
-			!$vider_tables_destination_copie = charger_fonction(
575
-				'vider_tables_destination_copie',
576
-				$racine_fonctions,
577
-				true
578
-			)
579
-		) {
580
-			spip_log(
581
-				"Fonction '{$racine_fonctions}_vider_tables_destination_copie' inconnue. Abandon",
582
-				'dump.' . _LOG_INFO_IMPORTANTE
583
-			);
584
-
585
-			return true; // echec mais on a fini, donc true
586
-		}
587
-		$vider_tables_destination_copie($tables, $no_erase_dest, $serveur_dest);
588
-		$status['dump_status_copie'] = 'ok';
589
-		ecrire_fichier($status_file, serialize($status));
590
-	}
591
-
592
-	// les tables auteurs et meta doivent etre copiees en dernier !
593
-	if (in_array('spip_auteurs', $tables)) {
594
-		$tables = array_diff($tables, ['spip_auteurs']);
595
-		$tables[] = 'spip_auteurs';
596
-	}
597
-	if (in_array('spip_meta', $tables)) {
598
-		$tables = array_diff($tables, ['spip_meta']);
599
-		$tables[] = 'spip_meta';
600
-	}
601
-	spip_log('Tables a copier :' . implode(', ', $tables), 'dump.' . _LOG_INFO);
602
-
603
-	$trouver_table = charger_fonction('trouver_table', 'base');
604
-
605
-	foreach ($tables as $table) {
606
-		// si table commence par spip_ c'est une table SPIP, renommer le prefixe si besoin
607
-		// sinon chercher la vraie table
608
-		$desc_source = false;
609
-		if (str_starts_with((string) $table, 'spip_')) {
610
-			$desc_source = $trouver_table(preg_replace(',^spip_,', '', (string) $table), $serveur_source, true);
611
-		}
612
-		if (!$desc_source || !isset($desc_source['exist']) || !$desc_source['exist']) {
613
-			$desc_source = $trouver_table($table, $serveur_source, false);
614
-		}
615
-
616
-		// verifier que la table est presente dans la base source
617
-		if ($desc_source) {
618
-			// $status['tables_copiees'][$table] contient l'avancement
619
-			// de la copie pour la $table : 0 a N et -N quand elle est finie (-1 si vide et finie...)
620
-			if (!isset($status['tables_copiees'][$table])) {
621
-				$status['tables_copiees'][$table] = 0;
622
-			}
623
-
624
-			if (
625
-				is_numeric($status['tables_copiees'][$table])
626
-				&& $status['tables_copiees'][$table] >= 0
627
-				&& ($desc_dest = $preparer_table_dest(
628
-					$table,
629
-					$desc_tables_dest[$table] ?? $desc_source,
630
-					$serveur_dest,
631
-					$status['tables_copiees'][$table] == 0
632
-				))
633
-			) {
634
-				if ($callback_progression) {
635
-					$callback_progression($status['tables_copiees'][$table], 0, $table);
636
-				}
637
-				while (true) {
638
-					$n = (int) $status['tables_copiees'][$table];
639
-					// on copie par lot de 400
640
-					$res = sql_select(
641
-						'*',
642
-						$table,
643
-						$where[$table] ?? '',
644
-						'',
645
-						'',
646
-						"$n,400",
647
-						'',
648
-						$serveur_source
649
-					);
650
-					while ($row = sql_fetch($res, $serveur_source)) {
651
-						$rows = [$row];
652
-						// lire un groupe de donnees si demande en option
653
-						// (permet un envoi par lot vers la destination)
654
-						if ($data_pool > 0) {
655
-							$s = strlen(serialize($row));
656
-							while ($s < $data_pool && ($row = sql_fetch($res, $serveur_source))) {
657
-								$s += strlen(serialize($row));
658
-								$rows[] = $row;
659
-							}
660
-						}
661
-						// si l'enregistrement est deja en base, ca fera un echec ou un doublon
662
-						// mais si ca renvoie false c'est une erreur fatale => abandon
663
-						if ($inserer_copie($table, $rows, $desc_dest, $serveur_dest) === false) {
664
-							// forcer la sortie, charge a l'appelant de gerer l'echec
665
-							spip_log("Erreur fatale dans $inserer_copie table $table", 'dump' . _LOG_ERREUR);
666
-							$status['errors'][] = "Erreur fatale  lors de la copie de la table $table";
667
-							ecrire_fichier($status_file, serialize($status));
668
-
669
-							// copie finie
670
-							return true;
671
-						}
672
-						$status['tables_copiees'][$table] += count($rows);
673
-						if ($max_time && time() > $max_time) {
674
-							break;
675
-						}
676
-					}
677
-					if ($n == $status['tables_copiees'][$table]) {
678
-						break;
679
-					}
680
-					spip_log("recopie $table " . $status['tables_copiees'][$table], 'dump.' . _LOG_INFO_IMPORTANTE);
681
-					if ($callback_progression) {
682
-						$callback_progression($status['tables_copiees'][$table], 0, $table);
683
-					}
684
-					ecrire_fichier($status_file, serialize($status));
685
-					if ($max_time && time() > $max_time) {
686
-						return false;
687
-					} // on a pas fini, mais le temps imparti est ecoule
688
-				}
689
-				if ($drop_source) {
690
-					sql_drop_table($table, '', $serveur_source);
691
-					spip_log("drop $table sur serveur source '$serveur_source'", 'dump.' . _LOG_INFO_IMPORTANTE);
692
-				}
693
-				$status['tables_copiees'][$table] = ($status['tables_copiees'][$table] ? -$status['tables_copiees'][$table] : 'zero');
694
-				ecrire_fichier($status_file, serialize($status));
695
-				spip_log('tables_recopiees ' . implode(',', array_keys($status['tables_copiees'])), 'dump.' . _LOG_INFO);
696
-				if ($callback_progression) {
697
-					$callback_progression($status['tables_copiees'][$table], $status['tables_copiees'][$table], $table);
698
-				}
699
-			} else {
700
-				if ($status['tables_copiees'][$table] < 0) {
701
-					spip_log("Table $table deja copiee : " . $status['tables_copiees'][$table], 'dump.' . _LOG_INFO);
702
-				}
703
-				if ($callback_progression) {
704
-					$callback_progression(
705
-						0,
706
-						$status['tables_copiees'][$table],
707
-						"$table" . ((is_numeric($status['tables_copiees'][$table]) && $status['tables_copiees'][$table] >= 0) ? '[Echec]' : '')
708
-					);
709
-				}
710
-			}
711
-		} else {
712
-			$status['errors'][] = "Impossible de lire la description de la table $table";
713
-			ecrire_fichier($status_file, serialize($status));
714
-			spip_log("Impossible de lire la description de la table $table", 'dump.' . _LOG_ERREUR);
715
-		}
716
-	}
717
-
718
-	// si le nombre de tables envoyees n'est pas egal au nombre de tables demandees
719
-	// abandonner
720
-	if ((is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) < count($tables)) {
721
-		spip_log(
722
-			'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables),
723
-			'dump.' . _LOG_ERREUR
724
-		);
725
-		$status['errors'][] = 'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables);
726
-		ecrire_fichier($status_file, serialize($status));
727
-	}
728
-
729
-	if ($detruire_copieur_si_besoin = charger_fonction('detruire_copieur_si_besoin', $racine_fonctions, true)) {
730
-		$detruire_copieur_si_besoin($serveur_dest);
731
-	} else {
732
-		spip_log("Fonction '{$racine_fonctions}_detruire_copieur_si_besoin' inconnue.", 'dump.' . _LOG_INFO_IMPORTANTE);
733
-	}
734
-
735
-	// OK, copie complete
736
-	return true;
532
+    $status = [];
533
+    $callback_progression = $options['callback_progression'] ?? '';
534
+    $max_time = $options['max_time'] ?? 0;
535
+    $drop_source = $options['drop_source'] ?? false;
536
+    $no_erase_dest = $options['no_erase_dest'] ?? [];
537
+    $where = $options['where'] ?? [];
538
+    $fonction_base_inserer = $options['fonction_base_inserer'] ?? 'inserer_copie';
539
+    $desc_tables_dest = $options['desc_tables_dest'] ?? [];
540
+    $racine_fonctions = $options['racine_fonctions_dest'] ?? 'base';
541
+    $data_pool = $options['data_pool'] ?? 50 * 1024;
542
+
543
+    spip_log(
544
+        'Copier ' . count($tables) . " tables de '$serveur_source' vers '$serveur_dest'",
545
+        'dump.' . _LOG_INFO_IMPORTANTE
546
+    );
547
+
548
+    if (!$inserer_copie = charger_fonction($fonction_base_inserer, $racine_fonctions, true)) {
549
+        spip_log("Fonction '{$racine_fonctions}_$fonction_base_inserer' inconnue. Abandon", 'dump.' . _LOG_INFO_IMPORTANTE);
550
+
551
+        return true; // echec mais on a fini, donc true
552
+    }
553
+    if (!$preparer_table_dest = charger_fonction('preparer_table_dest', $racine_fonctions, true)) {
554
+        spip_log("Fonction '{$racine_fonctions}_$preparer_table_dest' inconnue. Abandon", 'dump.' . _LOG_INFO_IMPORTANTE);
555
+
556
+        return true; // echec mais on a fini, donc true
557
+    }
558
+
559
+    if (
560
+        !lire_fichier($status_file, $status)
561
+        || !($status = unserialize($status))
562
+    ) {
563
+        $status = [];
564
+    }
565
+    $status['etape'] = 'basecopie';
566
+
567
+    // puis relister les tables a importer
568
+    // et les vider si besoin, au moment du premier passage ici
569
+    $initialisation_copie = $status['dump_status_copie'] ?? 0;
570
+
571
+    // si init pas encore faite, vider les tables du serveur destination
572
+    if (!$initialisation_copie) {
573
+        if (
574
+            !$vider_tables_destination_copie = charger_fonction(
575
+                'vider_tables_destination_copie',
576
+                $racine_fonctions,
577
+                true
578
+            )
579
+        ) {
580
+            spip_log(
581
+                "Fonction '{$racine_fonctions}_vider_tables_destination_copie' inconnue. Abandon",
582
+                'dump.' . _LOG_INFO_IMPORTANTE
583
+            );
584
+
585
+            return true; // echec mais on a fini, donc true
586
+        }
587
+        $vider_tables_destination_copie($tables, $no_erase_dest, $serveur_dest);
588
+        $status['dump_status_copie'] = 'ok';
589
+        ecrire_fichier($status_file, serialize($status));
590
+    }
591
+
592
+    // les tables auteurs et meta doivent etre copiees en dernier !
593
+    if (in_array('spip_auteurs', $tables)) {
594
+        $tables = array_diff($tables, ['spip_auteurs']);
595
+        $tables[] = 'spip_auteurs';
596
+    }
597
+    if (in_array('spip_meta', $tables)) {
598
+        $tables = array_diff($tables, ['spip_meta']);
599
+        $tables[] = 'spip_meta';
600
+    }
601
+    spip_log('Tables a copier :' . implode(', ', $tables), 'dump.' . _LOG_INFO);
602
+
603
+    $trouver_table = charger_fonction('trouver_table', 'base');
604
+
605
+    foreach ($tables as $table) {
606
+        // si table commence par spip_ c'est une table SPIP, renommer le prefixe si besoin
607
+        // sinon chercher la vraie table
608
+        $desc_source = false;
609
+        if (str_starts_with((string) $table, 'spip_')) {
610
+            $desc_source = $trouver_table(preg_replace(',^spip_,', '', (string) $table), $serveur_source, true);
611
+        }
612
+        if (!$desc_source || !isset($desc_source['exist']) || !$desc_source['exist']) {
613
+            $desc_source = $trouver_table($table, $serveur_source, false);
614
+        }
615
+
616
+        // verifier que la table est presente dans la base source
617
+        if ($desc_source) {
618
+            // $status['tables_copiees'][$table] contient l'avancement
619
+            // de la copie pour la $table : 0 a N et -N quand elle est finie (-1 si vide et finie...)
620
+            if (!isset($status['tables_copiees'][$table])) {
621
+                $status['tables_copiees'][$table] = 0;
622
+            }
623
+
624
+            if (
625
+                is_numeric($status['tables_copiees'][$table])
626
+                && $status['tables_copiees'][$table] >= 0
627
+                && ($desc_dest = $preparer_table_dest(
628
+                    $table,
629
+                    $desc_tables_dest[$table] ?? $desc_source,
630
+                    $serveur_dest,
631
+                    $status['tables_copiees'][$table] == 0
632
+                ))
633
+            ) {
634
+                if ($callback_progression) {
635
+                    $callback_progression($status['tables_copiees'][$table], 0, $table);
636
+                }
637
+                while (true) {
638
+                    $n = (int) $status['tables_copiees'][$table];
639
+                    // on copie par lot de 400
640
+                    $res = sql_select(
641
+                        '*',
642
+                        $table,
643
+                        $where[$table] ?? '',
644
+                        '',
645
+                        '',
646
+                        "$n,400",
647
+                        '',
648
+                        $serveur_source
649
+                    );
650
+                    while ($row = sql_fetch($res, $serveur_source)) {
651
+                        $rows = [$row];
652
+                        // lire un groupe de donnees si demande en option
653
+                        // (permet un envoi par lot vers la destination)
654
+                        if ($data_pool > 0) {
655
+                            $s = strlen(serialize($row));
656
+                            while ($s < $data_pool && ($row = sql_fetch($res, $serveur_source))) {
657
+                                $s += strlen(serialize($row));
658
+                                $rows[] = $row;
659
+                            }
660
+                        }
661
+                        // si l'enregistrement est deja en base, ca fera un echec ou un doublon
662
+                        // mais si ca renvoie false c'est une erreur fatale => abandon
663
+                        if ($inserer_copie($table, $rows, $desc_dest, $serveur_dest) === false) {
664
+                            // forcer la sortie, charge a l'appelant de gerer l'echec
665
+                            spip_log("Erreur fatale dans $inserer_copie table $table", 'dump' . _LOG_ERREUR);
666
+                            $status['errors'][] = "Erreur fatale  lors de la copie de la table $table";
667
+                            ecrire_fichier($status_file, serialize($status));
668
+
669
+                            // copie finie
670
+                            return true;
671
+                        }
672
+                        $status['tables_copiees'][$table] += count($rows);
673
+                        if ($max_time && time() > $max_time) {
674
+                            break;
675
+                        }
676
+                    }
677
+                    if ($n == $status['tables_copiees'][$table]) {
678
+                        break;
679
+                    }
680
+                    spip_log("recopie $table " . $status['tables_copiees'][$table], 'dump.' . _LOG_INFO_IMPORTANTE);
681
+                    if ($callback_progression) {
682
+                        $callback_progression($status['tables_copiees'][$table], 0, $table);
683
+                    }
684
+                    ecrire_fichier($status_file, serialize($status));
685
+                    if ($max_time && time() > $max_time) {
686
+                        return false;
687
+                    } // on a pas fini, mais le temps imparti est ecoule
688
+                }
689
+                if ($drop_source) {
690
+                    sql_drop_table($table, '', $serveur_source);
691
+                    spip_log("drop $table sur serveur source '$serveur_source'", 'dump.' . _LOG_INFO_IMPORTANTE);
692
+                }
693
+                $status['tables_copiees'][$table] = ($status['tables_copiees'][$table] ? -$status['tables_copiees'][$table] : 'zero');
694
+                ecrire_fichier($status_file, serialize($status));
695
+                spip_log('tables_recopiees ' . implode(',', array_keys($status['tables_copiees'])), 'dump.' . _LOG_INFO);
696
+                if ($callback_progression) {
697
+                    $callback_progression($status['tables_copiees'][$table], $status['tables_copiees'][$table], $table);
698
+                }
699
+            } else {
700
+                if ($status['tables_copiees'][$table] < 0) {
701
+                    spip_log("Table $table deja copiee : " . $status['tables_copiees'][$table], 'dump.' . _LOG_INFO);
702
+                }
703
+                if ($callback_progression) {
704
+                    $callback_progression(
705
+                        0,
706
+                        $status['tables_copiees'][$table],
707
+                        "$table" . ((is_numeric($status['tables_copiees'][$table]) && $status['tables_copiees'][$table] >= 0) ? '[Echec]' : '')
708
+                    );
709
+                }
710
+            }
711
+        } else {
712
+            $status['errors'][] = "Impossible de lire la description de la table $table";
713
+            ecrire_fichier($status_file, serialize($status));
714
+            spip_log("Impossible de lire la description de la table $table", 'dump.' . _LOG_ERREUR);
715
+        }
716
+    }
717
+
718
+    // si le nombre de tables envoyees n'est pas egal au nombre de tables demandees
719
+    // abandonner
720
+    if ((is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) < count($tables)) {
721
+        spip_log(
722
+            'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables),
723
+            'dump.' . _LOG_ERREUR
724
+        );
725
+        $status['errors'][] = 'Nombre de tables copiees incorrect : ' . (is_countable($status['tables_copiees']) ? count($status['tables_copiees']) : 0) . '/' . count($tables);
726
+        ecrire_fichier($status_file, serialize($status));
727
+    }
728
+
729
+    if ($detruire_copieur_si_besoin = charger_fonction('detruire_copieur_si_besoin', $racine_fonctions, true)) {
730
+        $detruire_copieur_si_besoin($serveur_dest);
731
+    } else {
732
+        spip_log("Fonction '{$racine_fonctions}_detruire_copieur_si_besoin' inconnue.", 'dump.' . _LOG_INFO_IMPORTANTE);
733
+    }
734
+
735
+    // OK, copie complete
736
+    return true;
737 737
 }
738 738
 
739 739
 /**
@@ -747,31 +747,31 @@  discard block
 block discarded – undo
747 747
  */
748 748
 function base_inserer_copie($table, $rows, $desc_dest, $serveur_dest) {
749 749
 
750
-	// verifier le nombre d'insertion
751
-	$nb1 = sql_countsel($table, '', '', '', $serveur_dest);
752
-	// si l'enregistrement est deja en base, ca fera un echec ou un doublon
753
-	$r = sql_insertq_multi($table, $rows, $desc_dest, $serveur_dest);
754
-	$nb = sql_countsel($table, '', '', '', $serveur_dest);
755
-	if ($nb - $nb1 < count($rows)) {
756
-		spip_log(
757
-			'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . '. On retente 1 par 1',
758
-			'dump' . _LOG_INFO_IMPORTANTE
759
-		);
760
-		foreach ($rows as $row) {
761
-			// si l'enregistrement est deja en base, ca fera un echec ou un doublon
762
-			$r = sql_insertq($table, $row, $desc_dest, $serveur_dest);
763
-		}
764
-		// on reverifie le total
765
-		$r = 0;
766
-		$nb = sql_countsel($table, '', '', '', $serveur_dest);
767
-		if ($nb - $nb1 < count($rows)) {
768
-			spip_log(
769
-				'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . ' apres insertion 1 par 1',
770
-				'dump' . _LOG_ERREUR
771
-			);
772
-			$r = false;
773
-		}
774
-	}
775
-
776
-	return $r;
750
+    // verifier le nombre d'insertion
751
+    $nb1 = sql_countsel($table, '', '', '', $serveur_dest);
752
+    // si l'enregistrement est deja en base, ca fera un echec ou un doublon
753
+    $r = sql_insertq_multi($table, $rows, $desc_dest, $serveur_dest);
754
+    $nb = sql_countsel($table, '', '', '', $serveur_dest);
755
+    if ($nb - $nb1 < count($rows)) {
756
+        spip_log(
757
+            'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . '. On retente 1 par 1',
758
+            'dump' . _LOG_INFO_IMPORTANTE
759
+        );
760
+        foreach ($rows as $row) {
761
+            // si l'enregistrement est deja en base, ca fera un echec ou un doublon
762
+            $r = sql_insertq($table, $row, $desc_dest, $serveur_dest);
763
+        }
764
+        // on reverifie le total
765
+        $r = 0;
766
+        $nb = sql_countsel($table, '', '', '', $serveur_dest);
767
+        if ($nb - $nb1 < count($rows)) {
768
+            spip_log(
769
+                'base_inserer_copie : ' . ($nb - $nb1) . ' insertions au lieu de ' . count($rows) . ' apres insertion 1 par 1',
770
+                'dump' . _LOG_ERREUR
771
+            );
772
+            $r = false;
773
+        }
774
+    }
775
+
776
+    return $r;
777 777
 }
Please login to merge, or discard this patch.
ecrire/base/create.php 1 patch
Indentation   +98 added lines, -98 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,58 +60,58 @@  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
-	#spip_log("creer_ou_upgrader_table table=$table autoinc=$autoinc upgrade=$upgrade","dbinstall"._LOG_INFO_IMPORTANTE);
64
-	$sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false;
65
-	#if (!$sql_desc) $sql_desc = false;
66
-	#spip_log("table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
67
-	if (!$sql_desc) {
68
-		if ($autoinc === 'auto') {
69
-			$autoinc = base_determine_autoinc($table, $desc);
70
-		}
71
-		#spip_log("sql_create $table autoinc=$autoinc","dbinstall"._LOG_INFO_IMPORTANTE);
72
-		if (isset($desc['field']) && isset($desc['key'])) {
73
-			sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
74
-		}
75
-		// verifier la bonne installation de la table (php-fpm es-tu la ?)
76
-		$sql_desc = sql_showtable($table, true, $serveur);
77
-		#if (!$sql_desc) $sql_desc = false;
78
-		#spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
79
-		if (!$sql_desc) {
80
-			// on retente avec un sleep ?
81
-			sleep(1);
82
-			sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
83
-			$sql_desc = sql_showtable($table, true, $serveur);
84
-			#if (!$sql_desc) $sql_desc = false;
85
-			#spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
86
-			if (!$sql_desc) {
87
-				spip_log("Echec creation table $table", 'maj' . _LOG_CRITIQUE);
88
-			}
89
-		}
90
-	} else {
91
-		#spip_log("sql_alter $table ... (on s'en fiche)","dbinstall"._LOG_INFO_IMPORTANTE);
92
-		// ajouter les champs manquants
93
-		// on ne supprime jamais les champs, car c'est dangereux
94
-		// c'est toujours a faire manuellement
95
-		$last = '';
96
-		if (isset($desc['field'])) {
97
-			foreach ($desc['field'] as $field => $type) {
98
-				if (!isset($sql_desc['field'][$field])) {
99
-					sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ''), $serveur);
100
-				}
101
-				$last = $field;
102
-			}
103
-		}
104
-		if (isset($desc['key'])) {
105
-			foreach ($desc['key'] as $key => $type) {
106
-				// Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
107
-				// par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
108
-				if (!isset($sql_desc['key'][$key]) && !isset($sql_desc['key']["$key $type"])) {
109
-					sql_alter("TABLE $table ADD $key ($type)", $serveur);
110
-				}
111
-				$last = $field;
112
-			}
113
-		}
114
-	}
63
+    #spip_log("creer_ou_upgrader_table table=$table autoinc=$autoinc upgrade=$upgrade","dbinstall"._LOG_INFO_IMPORTANTE);
64
+    $sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false;
65
+    #if (!$sql_desc) $sql_desc = false;
66
+    #spip_log("table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
67
+    if (!$sql_desc) {
68
+        if ($autoinc === 'auto') {
69
+            $autoinc = base_determine_autoinc($table, $desc);
70
+        }
71
+        #spip_log("sql_create $table autoinc=$autoinc","dbinstall"._LOG_INFO_IMPORTANTE);
72
+        if (isset($desc['field']) && isset($desc['key'])) {
73
+            sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
74
+        }
75
+        // verifier la bonne installation de la table (php-fpm es-tu la ?)
76
+        $sql_desc = sql_showtable($table, true, $serveur);
77
+        #if (!$sql_desc) $sql_desc = false;
78
+        #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
79
+        if (!$sql_desc) {
80
+            // on retente avec un sleep ?
81
+            sleep(1);
82
+            sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
83
+            $sql_desc = sql_showtable($table, true, $serveur);
84
+            #if (!$sql_desc) $sql_desc = false;
85
+            #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
86
+            if (!$sql_desc) {
87
+                spip_log("Echec creation table $table", 'maj' . _LOG_CRITIQUE);
88
+            }
89
+        }
90
+    } else {
91
+        #spip_log("sql_alter $table ... (on s'en fiche)","dbinstall"._LOG_INFO_IMPORTANTE);
92
+        // ajouter les champs manquants
93
+        // on ne supprime jamais les champs, car c'est dangereux
94
+        // c'est toujours a faire manuellement
95
+        $last = '';
96
+        if (isset($desc['field'])) {
97
+            foreach ($desc['field'] as $field => $type) {
98
+                if (!isset($sql_desc['field'][$field])) {
99
+                    sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ''), $serveur);
100
+                }
101
+                $last = $field;
102
+            }
103
+        }
104
+        if (isset($desc['key'])) {
105
+            foreach ($desc['key'] as $key => $type) {
106
+                // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
107
+                // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
108
+                if (!isset($sql_desc['key'][$key]) && !isset($sql_desc['key']["$key $type"])) {
109
+                    sql_alter("TABLE $table ADD $key ($type)", $serveur);
110
+                }
111
+                $last = $field;
112
+            }
113
+        }
114
+    }
115 115
 }
116 116
 
117 117
 /**
@@ -133,26 +133,26 @@  discard block
 block discarded – undo
133 133
  * @return void
134 134
  */
135 135
 function alterer_base($tables_inc, $tables_noinc, $up = false, $serveur = '') {
136
-	if ($up === false) {
137
-		$old = false;
138
-		$up = [];
139
-	} else {
140
-		$old = true;
141
-		if (!is_array($up)) {
142
-			$up = [$up];
143
-		}
144
-	}
145
-	foreach ($tables_inc as $k => $v) {
146
-		if (!$old || in_array($k, $up)) {
147
-			creer_ou_upgrader_table($k, $v, true, $old, $serveur);
148
-		}
149
-	}
136
+    if ($up === false) {
137
+        $old = false;
138
+        $up = [];
139
+    } else {
140
+        $old = true;
141
+        if (!is_array($up)) {
142
+            $up = [$up];
143
+        }
144
+    }
145
+    foreach ($tables_inc as $k => $v) {
146
+        if (!$old || in_array($k, $up)) {
147
+            creer_ou_upgrader_table($k, $v, true, $old, $serveur);
148
+        }
149
+    }
150 150
 
151
-	foreach ($tables_noinc as $k => $v) {
152
-		if (!$old || in_array($k, $up)) {
153
-			creer_ou_upgrader_table($k, $v, false, $old, $serveur);
154
-		}
155
-	}
151
+    foreach ($tables_noinc as $k => $v) {
152
+        if (!$old || in_array($k, $up)) {
153
+            creer_ou_upgrader_table($k, $v, false, $old, $serveur);
154
+        }
155
+    }
156 156
 }
157 157
 
158 158
 /**
@@ -172,16 +172,16 @@  discard block
 block discarded – undo
172 172
  */
173 173
 function creer_base($serveur = '') {
174 174
 
175
-	// Note: les mises a jour reexecutent ce code pour s'assurer
176
-	// de la conformite de la base
177
-	// pas de panique sur  "already exists" et "duplicate entry" donc.
175
+    // Note: les mises a jour reexecutent ce code pour s'assurer
176
+    // de la conformite de la base
177
+    // pas de panique sur  "already exists" et "duplicate entry" donc.
178 178
 
179
-	alterer_base(
180
-		lister_tables_principales(),
181
-		lister_tables_auxiliaires(),
182
-		false,
183
-		$serveur
184
-	);
179
+    alterer_base(
180
+        lister_tables_principales(),
181
+        lister_tables_auxiliaires(),
182
+        false,
183
+        $serveur
184
+    );
185 185
 }
186 186
 
187 187
 /**
@@ -201,10 +201,10 @@  discard block
 block discarded – undo
201 201
  * @return void
202 202
  */
203 203
 function maj_tables($upgrade_tables = [], $serveur = '') {
204
-	alterer_base(
205
-		lister_tables_principales(),
206
-		lister_tables_auxiliaires(),
207
-		$upgrade_tables,
208
-		$serveur
209
-	);
204
+    alterer_base(
205
+        lister_tables_principales(),
206
+        lister_tables_auxiliaires(),
207
+        $upgrade_tables,
208
+        $serveur
209
+    );
210 210
 }
Please login to merge, or discard this patch.
ecrire/base/trouver_table.php 1 patch
Indentation   +147 added lines, -147 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\SQL\Tables
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 include_spip('base/objets');
21 21
 
@@ -67,150 +67,150 @@  discard block
 block discarded – undo
67 67
  *
68 68
  **/
69 69
 function base_trouver_table_dist($nom, $serveur = '', $table_spip = true, array $options = []) {
70
-	$desc_cache = null;
71
-	static $nom_cache_desc_sql = [];
72
-
73
-	if (
74
-		!spip_connect($serveur)
75
-		|| !preg_match('/^[a-zA-Z0-9._-]*/', $nom)
76
-	) {
77
-		return null;
78
-	}
79
-
80
-	$options += [
81
-		// si false, baissera le niveau de log si une table demandée n’existe pas
82
-		'log_missing' => true,
83
-	];
84
-
85
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
86
-	$objets_sql = lister_tables_objets_sql('::md5');
87
-
88
-	// le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
89
-	// ce qui permet une auto invalidation en cas de modif manuelle du fichier
90
-	// de connexion, et tout risque d'ambiguite
91
-	if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
92
-		$nom_cache_desc_sql[$serveur][$objets_sql] =
93
-			_DIR_CACHE . 'sql_desc_'
94
-			. ($serveur ? "{$serveur}_" : '')
95
-			. substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
96
-			. '.txt';
97
-		// nouveau nom de cache = nouvelle version en memoire
98
-		unset($connexion['tables']);
99
-	}
100
-
101
-	// un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
102
-	if (!$nom) {
103
-		spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
104
-		$connexion['tables'] = [];
105
-
106
-		return null;
107
-	}
108
-
109
-	$nom_sql = $nom;
110
-	$nom_sql = preg_match('/\.(.*)$/', $nom, $s) ? $s[1] : $nom;
111
-
112
-	$fdesc = $desc = '';
113
-	$connexion = &$GLOBALS['connexions'][$serveur ?: 0];
114
-
115
-	// base sous SPIP: gerer les abreviations explicites des noms de table
116
-	if (
117
-		$connexion['spip_connect_version']
118
-		&& $table_spip
119
-		&& isset($GLOBALS['table_des_tables'][$nom])
120
-	) {
121
-		$nom = $GLOBALS['table_des_tables'][$nom];
122
-		$nom_sql = 'spip_' . $nom;
123
-	}
124
-
125
-	// si c'est la premiere table qu'on cherche
126
-	// et si on est pas explicitement en recalcul
127
-	// on essaye de recharger le cache des decriptions de ce serveur
128
-	// dans le fichier cache
129
-	if (
130
-		!isset($connexion['tables'][$nom_sql])
131
-		&& defined('_VAR_MODE')
132
-		&& _VAR_MODE !== 'recalcul'
133
-		&& (!isset($connexion['tables']) || !$connexion['tables'])
134
-		&& lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache)
135
-		&& ($desc_cache = unserialize($desc_cache))
136
-	) {
137
-		$connexion['tables'] = $desc_cache;
138
-	}
139
-	if ($table_spip && !isset($connexion['tables'][$nom_sql])) {
140
-		if (isset($GLOBALS['tables_principales'][$nom_sql])) {
141
-			$fdesc = $GLOBALS['tables_principales'][$nom_sql];
142
-		}
143
-		// meme si pas d'abreviation declaree, trouver la table spip_$nom
144
-		// si c'est une table principale,
145
-		// puisqu'on le fait aussi pour les tables auxiliaires
146
-		elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_' . $nom])) {
147
-			$nom_sql = 'spip_' . $nom;
148
-			$fdesc = &$GLOBALS['tables_principales'][$nom_sql];
149
-		} elseif (
150
-			isset($GLOBALS['tables_auxiliaires'][$n = $nom])
151
-			|| isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
152
-		) {
153
-			$nom_sql = $n;
154
-			$fdesc = &$GLOBALS['tables_auxiliaires'][$n];
155
-		}  # table locale a cote de SPIP, comme non SPIP:
156
-	}
157
-	if (!isset($connexion['tables'][$nom_sql])) {
158
-		// La *vraie* base a la priorite
159
-		$exists = sql_table_exists($nom_sql, $table_spip, $serveur);
160
-		if (
161
-			!$exists
162
-			|| !($desc = sql_showtable($nom_sql, $table_spip, $serveur))
163
-			|| !$desc['field']
164
-		) {
165
-			if (!$fdesc) {
166
-				$log_level = $options['log_missing'] ? _LOG_INFO_IMPORTANTE : _LOG_DEBUG;
167
-				spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base' . $log_level);
168
-
169
-				return null;
170
-			}
171
-			// on ne sait pas lire la structure de la table :
172
-			// on retombe sur la description donnee dans les fichiers spip
173
-			$desc = $fdesc;
174
-			$desc['exist'] = false;
175
-		} else {
176
-			$desc['exist'] = true;
177
-			// gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
178
-			// pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
179
-			if (! $desc['key']) {
180
-				spip_log("trouver_table: table sans cle '$serveur' '$nom'", 'base');
181
-				unset($desc['key']);
182
-			}
183
-		}
184
-
185
-		$desc['table'] = $desc['table_sql'] = $nom_sql;
186
-		$desc['connexion'] = $serveur;
187
-
188
-		// charger les infos declarees pour cette table
189
-		// en lui passant les infos connues
190
-		// $desc est prioritaire pour la description de la table
191
-		$desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
192
-		// s'assurer qu'on a toujours un 'key'
193
-		if (!isset($desc['key']) && !empty($fdesc['key'])) {
194
-			$desc['key'] = $fdesc['key'];
195
-		}
196
-		if (! isset($desc['key'])) {
197
-			$desc['key'] = [];
198
-		}
199
-
200
-		// si tables_objets_sql est bien fini d'init, on peut cacher
201
-		$connexion['tables'][$nom_sql] = $desc;
202
-		$res = &$connexion['tables'][$nom_sql];
203
-		// une nouvelle table a ete decrite
204
-		// mettons donc a jour le cache des descriptions de ce serveur
205
-		if (is_writable(_DIR_CACHE)) {
206
-			ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true);
207
-		}
208
-	} else {
209
-		$res = &$connexion['tables'][$nom_sql];
210
-	}
211
-
212
-	// toujours retourner $nom dans id_table
213
-	$res['id_table'] = $nom;
214
-
215
-	return $res;
70
+    $desc_cache = null;
71
+    static $nom_cache_desc_sql = [];
72
+
73
+    if (
74
+        !spip_connect($serveur)
75
+        || !preg_match('/^[a-zA-Z0-9._-]*/', $nom)
76
+    ) {
77
+        return null;
78
+    }
79
+
80
+    $options += [
81
+        // si false, baissera le niveau de log si une table demandée n’existe pas
82
+        'log_missing' => true,
83
+    ];
84
+
85
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
86
+    $objets_sql = lister_tables_objets_sql('::md5');
87
+
88
+    // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
89
+    // ce qui permet une auto invalidation en cas de modif manuelle du fichier
90
+    // de connexion, et tout risque d'ambiguite
91
+    if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
92
+        $nom_cache_desc_sql[$serveur][$objets_sql] =
93
+            _DIR_CACHE . 'sql_desc_'
94
+            . ($serveur ? "{$serveur}_" : '')
95
+            . substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
96
+            . '.txt';
97
+        // nouveau nom de cache = nouvelle version en memoire
98
+        unset($connexion['tables']);
99
+    }
100
+
101
+    // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
102
+    if (!$nom) {
103
+        spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
104
+        $connexion['tables'] = [];
105
+
106
+        return null;
107
+    }
108
+
109
+    $nom_sql = $nom;
110
+    $nom_sql = preg_match('/\.(.*)$/', $nom, $s) ? $s[1] : $nom;
111
+
112
+    $fdesc = $desc = '';
113
+    $connexion = &$GLOBALS['connexions'][$serveur ?: 0];
114
+
115
+    // base sous SPIP: gerer les abreviations explicites des noms de table
116
+    if (
117
+        $connexion['spip_connect_version']
118
+        && $table_spip
119
+        && isset($GLOBALS['table_des_tables'][$nom])
120
+    ) {
121
+        $nom = $GLOBALS['table_des_tables'][$nom];
122
+        $nom_sql = 'spip_' . $nom;
123
+    }
124
+
125
+    // si c'est la premiere table qu'on cherche
126
+    // et si on est pas explicitement en recalcul
127
+    // on essaye de recharger le cache des decriptions de ce serveur
128
+    // dans le fichier cache
129
+    if (
130
+        !isset($connexion['tables'][$nom_sql])
131
+        && defined('_VAR_MODE')
132
+        && _VAR_MODE !== 'recalcul'
133
+        && (!isset($connexion['tables']) || !$connexion['tables'])
134
+        && lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache)
135
+        && ($desc_cache = unserialize($desc_cache))
136
+    ) {
137
+        $connexion['tables'] = $desc_cache;
138
+    }
139
+    if ($table_spip && !isset($connexion['tables'][$nom_sql])) {
140
+        if (isset($GLOBALS['tables_principales'][$nom_sql])) {
141
+            $fdesc = $GLOBALS['tables_principales'][$nom_sql];
142
+        }
143
+        // meme si pas d'abreviation declaree, trouver la table spip_$nom
144
+        // si c'est une table principale,
145
+        // puisqu'on le fait aussi pour les tables auxiliaires
146
+        elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_' . $nom])) {
147
+            $nom_sql = 'spip_' . $nom;
148
+            $fdesc = &$GLOBALS['tables_principales'][$nom_sql];
149
+        } elseif (
150
+            isset($GLOBALS['tables_auxiliaires'][$n = $nom])
151
+            || isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
152
+        ) {
153
+            $nom_sql = $n;
154
+            $fdesc = &$GLOBALS['tables_auxiliaires'][$n];
155
+        }  # table locale a cote de SPIP, comme non SPIP:
156
+    }
157
+    if (!isset($connexion['tables'][$nom_sql])) {
158
+        // La *vraie* base a la priorite
159
+        $exists = sql_table_exists($nom_sql, $table_spip, $serveur);
160
+        if (
161
+            !$exists
162
+            || !($desc = sql_showtable($nom_sql, $table_spip, $serveur))
163
+            || !$desc['field']
164
+        ) {
165
+            if (!$fdesc) {
166
+                $log_level = $options['log_missing'] ? _LOG_INFO_IMPORTANTE : _LOG_DEBUG;
167
+                spip_log("trouver_table: table inconnue '$serveur' '$nom'", 'base' . $log_level);
168
+
169
+                return null;
170
+            }
171
+            // on ne sait pas lire la structure de la table :
172
+            // on retombe sur la description donnee dans les fichiers spip
173
+            $desc = $fdesc;
174
+            $desc['exist'] = false;
175
+        } else {
176
+            $desc['exist'] = true;
177
+            // gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
178
+            // pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
179
+            if (! $desc['key']) {
180
+                spip_log("trouver_table: table sans cle '$serveur' '$nom'", 'base');
181
+                unset($desc['key']);
182
+            }
183
+        }
184
+
185
+        $desc['table'] = $desc['table_sql'] = $nom_sql;
186
+        $desc['connexion'] = $serveur;
187
+
188
+        // charger les infos declarees pour cette table
189
+        // en lui passant les infos connues
190
+        // $desc est prioritaire pour la description de la table
191
+        $desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
192
+        // s'assurer qu'on a toujours un 'key'
193
+        if (!isset($desc['key']) && !empty($fdesc['key'])) {
194
+            $desc['key'] = $fdesc['key'];
195
+        }
196
+        if (! isset($desc['key'])) {
197
+            $desc['key'] = [];
198
+        }
199
+
200
+        // si tables_objets_sql est bien fini d'init, on peut cacher
201
+        $connexion['tables'][$nom_sql] = $desc;
202
+        $res = &$connexion['tables'][$nom_sql];
203
+        // une nouvelle table a ete decrite
204
+        // mettons donc a jour le cache des descriptions de ce serveur
205
+        if (is_writable(_DIR_CACHE)) {
206
+            ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true);
207
+        }
208
+    } else {
209
+        $res = &$connexion['tables'][$nom_sql];
210
+    }
211
+
212
+    // toujours retourner $nom dans id_table
213
+    $res['id_table'] = $nom;
214
+
215
+    return $res;
216 216
 }
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_log("trouve $name apres " . $ouvrant[$depth]);
42
-		if (isset($ouvrant[$depth]) && preg_match('/^\s*(\w+)/', (string) $ouvrant[$depth], $r)) {
43
-			$pere = $r[1];
44
-			#spip_log("pere $pere");
45
-			if (isset($this->dtc->elements[$pere])) {
46
-				$fils = $this->dtc->elements[$pere];
47
-				#spip_log("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_log("$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_log("trouve $name apres " . $ouvrant[$depth]);
42
+        if (isset($ouvrant[$depth]) && preg_match('/^\s*(\w+)/', (string) $ouvrant[$depth], $r)) {
43
+            $pere = $r[1];
44
+            #spip_log("pere $pere");
45
+            if (isset($this->dtc->elements[$pere])) {
46
+                $fils = $this->dtc->elements[$pere];
47
+                #spip_log("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_log("$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 1 patch
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_log("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_log("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_log("DTD '$loc' ($file) inaccessible");
132
-
133
-		return false;
134
-	} else {
135
-		spip_log("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_log("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_log("DTD '$loc' ($file) inaccessible");
132
+
133
+        return false;
134
+    } else {
135
+        spip_log("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_log("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_log('analyser_dtd_notation a ecrire');
233
+    if (!preg_match('/^<!NOTATION.*?>\s*(.*)$/s', (string) $dtd, $m)) {
234
+        return -8;
235
+    }
236
+    spip_log('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_log("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_log("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_log("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_log("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_log("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_log("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.
ecrire/index.php 1 patch
Indentation   +75 added lines, -75 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
 /** Drapeau indiquant que l'on est dans l'espace privé */
19 19
 define('_ESPACE_PRIVE', true);
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	include __DIR__ . '/inc_version.php';
21
+    include __DIR__ . '/inc_version.php';
22 22
 }
23 23
 
24 24
 include_spip('inc/cookie');
@@ -34,18 +34,18 @@  discard block
 block discarded – undo
34 34
 // alors il faut blinder les variables d'URL
35 35
 //
36 36
 if (autoriser_sans_cookie($exec, false)) {
37
-	if (!isset($reinstall)) {
38
-		$reinstall = 'non';
39
-	}
40
-	$var_auth = true;
37
+    if (!isset($reinstall)) {
38
+        $reinstall = 'non';
39
+    }
40
+    $var_auth = true;
41 41
 } else {
42
-	// Authentification, redefinissable
43
-	$auth = charger_fonction('auth', 'inc');
44
-	$var_auth = $auth();
45
-	if ($var_auth) {
46
-		echo auth_echec($var_auth);
47
-		exit;
48
-	}
42
+    // Authentification, redefinissable
43
+    $auth = charger_fonction('auth', 'inc');
44
+    $var_auth = $auth();
45
+    if ($var_auth) {
46
+        echo auth_echec($var_auth);
47
+        exit;
48
+    }
49 49
 }
50 50
 
51 51
 // initialiser a la langue par defaut
@@ -56,29 +56,29 @@  discard block
 block discarded – undo
56 56
 
57 57
 
58 58
 if (
59
-	(_request('action') || _request('var_ajax') || _request('formulaire_action'))
60
-	&& !autoriser_sans_cookie($exec)
59
+    (_request('action') || _request('var_ajax') || _request('formulaire_action'))
60
+    && !autoriser_sans_cookie($exec)
61 61
 ) {
62
-	// Charger l'aiguilleur qui va mettre sur la bonne voie les traitements derogatoires
63
-	include_spip('public/aiguiller');
64
-	if (
65
-		// cas des appels actions ?action=xxx
66
-		traiter_appels_actions()
67
-		// cas des hits ajax sur les inclusions ajax
68
-		|| traiter_appels_inclusions_ajax()
69
-		// cas des formulaires charger/verifier/traiter
70
-		|| traiter_formulaires_dynamiques()
71
-	) {
72
-		// le hit est fini !
73
-		exit;
74
-	}
62
+    // Charger l'aiguilleur qui va mettre sur la bonne voie les traitements derogatoires
63
+    include_spip('public/aiguiller');
64
+    if (
65
+        // cas des appels actions ?action=xxx
66
+        traiter_appels_actions()
67
+        // cas des hits ajax sur les inclusions ajax
68
+        || traiter_appels_inclusions_ajax()
69
+        // cas des formulaires charger/verifier/traiter
70
+        || traiter_formulaires_dynamiques()
71
+    ) {
72
+        // le hit est fini !
73
+        exit;
74
+    }
75 75
 }
76 76
 // securiser les redirect du back-office
77 77
 if (_request('redirect')) {
78
-	if (!function_exists('securiser_redirect_action')) {
79
-		include_spip('public/aiguiller');
80
-	}
81
-	set_request('redirect', securiser_redirect_action(_request('redirect')));
78
+    if (!function_exists('securiser_redirect_action')) {
79
+        include_spip('public/aiguiller');
80
+    }
81
+    set_request('redirect', securiser_redirect_action(_request('redirect')));
82 82
 }
83 83
 
84 84
 
@@ -88,12 +88,12 @@  discard block
 block discarded – undo
88 88
 
89 89
 // Controle de la version, sauf si on est deja en train de s'en occuper
90 90
 if (
91
-	!$reinstall == 'oui'
92
-	&& !_AJAX
93
-	&& isset($GLOBALS['meta']['version_installee'])
94
-	&& $GLOBALS['spip_version_base'] != str_replace(',', '.', (string) $GLOBALS['meta']['version_installee'])
91
+    !$reinstall == 'oui'
92
+    && !_AJAX
93
+    && isset($GLOBALS['meta']['version_installee'])
94
+    && $GLOBALS['spip_version_base'] != str_replace(',', '.', (string) $GLOBALS['meta']['version_installee'])
95 95
 ) {
96
-	$exec = 'demande_mise_a_jour';
96
+    $exec = 'demande_mise_a_jour';
97 97
 }
98 98
 
99 99
 // Quand une action d'administration est en cours (meta "admin"),
@@ -103,38 +103,38 @@  discard block
 block discarded – undo
103 103
 // sinon c'est qu'elle a ete interrompue et il faut la reprendre
104 104
 
105 105
 elseif (isset($GLOBALS['meta']['admin'])) {
106
-	if (preg_match('/^(.*)_(\d+)_/', (string) $GLOBALS['meta']['admin'], $l)) {
107
-		[, $var_f, $n] = $l;
108
-	}
109
-	if (
110
-		_AJAX
111
-		|| !isset($_COOKIE['spip_admin'])
112
-			&& !(isset($GLOBALS['visiteur_session'])
113
-			&& $GLOBALS['visiteur_session']['statut'] == '0minirezo')
114
-	) {
115
-		spip_log('Quand la meta admin vaut ' .
116
-			$GLOBALS['meta']['admin'] .
117
-			' seul un admin peut se connecter et sans AJAX.' .
118
-			' En cas de probleme, detruire cette meta.');
119
-		die(_T('info_travaux_texte'));
120
-	}
121
-	if ($n) {
122
-		[, $var_f, $n] = $l;
123
-		if (tester_url_ecrire("base_$var_f")) {
124
-			$var_f = "base_$var_f";
125
-		}
126
-		if ($var_f !== $exec) {
127
-			spip_log("Le script $var_f lance par auteur$n se substitue a l'exec $exec");
128
-			$exec = $var_f;
129
-			set_request('exec', $exec);
130
-		}
131
-	}
106
+    if (preg_match('/^(.*)_(\d+)_/', (string) $GLOBALS['meta']['admin'], $l)) {
107
+        [, $var_f, $n] = $l;
108
+    }
109
+    if (
110
+        _AJAX
111
+        || !isset($_COOKIE['spip_admin'])
112
+            && !(isset($GLOBALS['visiteur_session'])
113
+            && $GLOBALS['visiteur_session']['statut'] == '0minirezo')
114
+    ) {
115
+        spip_log('Quand la meta admin vaut ' .
116
+            $GLOBALS['meta']['admin'] .
117
+            ' seul un admin peut se connecter et sans AJAX.' .
118
+            ' En cas de probleme, detruire cette meta.');
119
+        die(_T('info_travaux_texte'));
120
+    }
121
+    if ($n) {
122
+        [, $var_f, $n] = $l;
123
+        if (tester_url_ecrire("base_$var_f")) {
124
+            $var_f = "base_$var_f";
125
+        }
126
+        if ($var_f !== $exec) {
127
+            spip_log("Le script $var_f lance par auteur$n se substitue a l'exec $exec");
128
+            $exec = $var_f;
129
+            set_request('exec', $exec);
130
+        }
131
+    }
132 132
 }
133 133
 // si nom pas plausible, prendre le script par defaut
134 134
 // attention aux deux cas 404/403 qui commencent par un 4 !
135 135
 elseif (!preg_match(',^[a-z4_][0-9a-z_-]*$,i', $exec)) {
136
-	$exec = 'accueil';
137
-	set_request('exec', $exec);
136
+    $exec = 'accueil';
137
+    set_request('exec', $exec);
138 138
 }
139 139
 
140 140
 //  si la langue est specifiee par cookie et ne correspond pas
@@ -142,20 +142,20 @@  discard block
 block discarded – undo
142 142
 // on appelle directement la fonction, car un appel d'action peut conduire a une boucle infinie
143 143
 // si le cookie n'est pas pose correctement dans l'action
144 144
 if (
145
-	!$var_auth
146
-	&& isset($_COOKIE['spip_lang_ecrire'])
147
-	&& $_COOKIE['spip_lang_ecrire'] != $GLOBALS['visiteur_session']['lang']
145
+    !$var_auth
146
+    && isset($_COOKIE['spip_lang_ecrire'])
147
+    && $_COOKIE['spip_lang_ecrire'] != $GLOBALS['visiteur_session']['lang']
148 148
 ) {
149
-	include_spip('action/converser');
150
-	action_converser_post($GLOBALS['visiteur_session']['lang'], true);
149
+    include_spip('action/converser');
150
+    action_converser_post($GLOBALS['visiteur_session']['lang'], true);
151 151
 }
152 152
 
153 153
 if ($var_f = tester_url_ecrire($exec)) {
154
-	$var_f = charger_fonction($var_f);
155
-	$var_f(); // at last
154
+    $var_f = charger_fonction($var_f);
155
+    $var_f(); // at last
156 156
 } else {
157
-	// Rien de connu: rerouter vers exec=404 au lieu d'echouer
158
-	// ce qui permet de laisser la main a un plugin
159
-	$var_f = charger_fonction('404');
160
-	$var_f($exec);
157
+    // Rien de connu: rerouter vers exec=404 au lieu d'echouer
158
+    // ce qui permet de laisser la main a un plugin
159
+    $var_f = charger_fonction('404');
160
+    $var_f($exec);
161 161
 }
Please login to merge, or discard this patch.