Completed
Push — master ( 0528ed...3f7b24 )
by cam
01:54
created
ecrire/base/create.php 2 patches
Indentation   +89 added lines, -89 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Installation
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 include_spip('inc/acces');
@@ -32,18 +32,18 @@  discard block
 block discarded – undo
32 32
  * @return bool
33 33
  */
34 34
 function base_determine_autoinc($table, $desc = []) {
35
-	if (($t = lister_tables_principales()) && isset($t[$table])) {
36
-		$autoinc = true;
37
-	} elseif (($t = lister_tables_auxiliaires()) && isset($t[$table])) {
38
-		$autoinc = false;
39
-	} else {
40
-		// essayer de faire au mieux !
41
-		$autoinc = (isset($desc['key']['PRIMARY KEY'])
42
-			&& !str_contains((string) $desc['key']['PRIMARY KEY'], ',')
43
-			&& !str_contains((string) $desc['field'][$desc['key']['PRIMARY KEY']], 'default'));
44
-	}
35
+    if (($t = lister_tables_principales()) && isset($t[$table])) {
36
+        $autoinc = true;
37
+    } elseif (($t = lister_tables_auxiliaires()) && isset($t[$table])) {
38
+        $autoinc = false;
39
+    } else {
40
+        // essayer de faire au mieux !
41
+        $autoinc = (isset($desc['key']['PRIMARY KEY'])
42
+            && !str_contains((string) $desc['key']['PRIMARY KEY'], ',')
43
+            && !str_contains((string) $desc['field'][$desc['key']['PRIMARY KEY']], 'default'));
44
+    }
45 45
 
46
-	return $autoinc;
46
+    return $autoinc;
47 47
 }
48 48
 
49 49
 /**
@@ -60,49 +60,49 @@  discard block
 block discarded – undo
60 60
  * @return void
61 61
  */
62 62
 function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $serveur = '') {
63
-	$sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false;
64
-	if (!$sql_desc) {
65
-		if ($autoinc === 'auto') {
66
-			$autoinc = base_determine_autoinc($table, $desc);
67
-		}
68
-		if (isset($desc['field']) && isset($desc['key'])) {
69
-			sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
70
-		}
71
-		// verifier la bonne installation de la table (php-fpm es-tu la ?)
72
-		$sql_desc = sql_showtable($table, true, $serveur);
73
-		if (!$sql_desc) {
74
-			// on retente avec un sleep ?
75
-			sleep(1);
76
-			sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
77
-			$sql_desc = sql_showtable($table, true, $serveur);
78
-			if (!$sql_desc) {
79
-				spip_logger('maj')->critical("Echec creation table $table");
80
-			}
81
-		}
82
-	} else {
83
-		// ajouter les champs manquants
84
-		// on ne supprime jamais les champs, car c'est dangereux
85
-		// c'est toujours a faire manuellement
86
-		$last = '';
87
-		if (isset($desc['field'])) {
88
-			foreach ($desc['field'] as $field => $type) {
89
-				if (!isset($sql_desc['field'][$field])) {
90
-					sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ''), $serveur);
91
-				}
92
-				$last = $field;
93
-			}
94
-		}
95
-		if (isset($desc['key'])) {
96
-			foreach ($desc['key'] as $key => $type) {
97
-				// Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
98
-				// par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
99
-				if (!isset($sql_desc['key'][$key]) && !isset($sql_desc['key']["$key $type"])) {
100
-					sql_alter("TABLE $table ADD $key ($type)", $serveur);
101
-				}
102
-				$last = $field;
103
-			}
104
-		}
105
-	}
63
+    $sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false;
64
+    if (!$sql_desc) {
65
+        if ($autoinc === 'auto') {
66
+            $autoinc = base_determine_autoinc($table, $desc);
67
+        }
68
+        if (isset($desc['field']) && isset($desc['key'])) {
69
+            sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
70
+        }
71
+        // verifier la bonne installation de la table (php-fpm es-tu la ?)
72
+        $sql_desc = sql_showtable($table, true, $serveur);
73
+        if (!$sql_desc) {
74
+            // on retente avec un sleep ?
75
+            sleep(1);
76
+            sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
77
+            $sql_desc = sql_showtable($table, true, $serveur);
78
+            if (!$sql_desc) {
79
+                spip_logger('maj')->critical("Echec creation table $table");
80
+            }
81
+        }
82
+    } else {
83
+        // ajouter les champs manquants
84
+        // on ne supprime jamais les champs, car c'est dangereux
85
+        // c'est toujours a faire manuellement
86
+        $last = '';
87
+        if (isset($desc['field'])) {
88
+            foreach ($desc['field'] as $field => $type) {
89
+                if (!isset($sql_desc['field'][$field])) {
90
+                    sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ''), $serveur);
91
+                }
92
+                $last = $field;
93
+            }
94
+        }
95
+        if (isset($desc['key'])) {
96
+            foreach ($desc['key'] as $key => $type) {
97
+                // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
98
+                // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
99
+                if (!isset($sql_desc['key'][$key]) && !isset($sql_desc['key']["$key $type"])) {
100
+                    sql_alter("TABLE $table ADD $key ($type)", $serveur);
101
+                }
102
+                $last = $field;
103
+            }
104
+        }
105
+    }
106 106
 }
107 107
 
108 108
 /**
@@ -124,26 +124,26 @@  discard block
 block discarded – undo
124 124
  * @return void
125 125
  */
126 126
 function alterer_base($tables_inc, $tables_noinc, $up = false, $serveur = '') {
127
-	if ($up === false) {
128
-		$old = false;
129
-		$up = [];
130
-	} else {
131
-		$old = true;
132
-		if (!is_array($up)) {
133
-			$up = [$up];
134
-		}
135
-	}
136
-	foreach ($tables_inc as $k => $v) {
137
-		if (!$old || in_array($k, $up)) {
138
-			creer_ou_upgrader_table($k, $v, true, $old, $serveur);
139
-		}
140
-	}
127
+    if ($up === false) {
128
+        $old = false;
129
+        $up = [];
130
+    } else {
131
+        $old = true;
132
+        if (!is_array($up)) {
133
+            $up = [$up];
134
+        }
135
+    }
136
+    foreach ($tables_inc as $k => $v) {
137
+        if (!$old || in_array($k, $up)) {
138
+            creer_ou_upgrader_table($k, $v, true, $old, $serveur);
139
+        }
140
+    }
141 141
 
142
-	foreach ($tables_noinc as $k => $v) {
143
-		if (!$old || in_array($k, $up)) {
144
-			creer_ou_upgrader_table($k, $v, false, $old, $serveur);
145
-		}
146
-	}
142
+    foreach ($tables_noinc as $k => $v) {
143
+        if (!$old || in_array($k, $up)) {
144
+            creer_ou_upgrader_table($k, $v, false, $old, $serveur);
145
+        }
146
+    }
147 147
 }
148 148
 
149 149
 /**
@@ -163,16 +163,16 @@  discard block
 block discarded – undo
163 163
  */
164 164
 function creer_base($serveur = '') {
165 165
 
166
-	// Note: les mises a jour reexecutent ce code pour s'assurer
167
-	// de la conformite de la base
168
-	// pas de panique sur  "already exists" et "duplicate entry" donc.
166
+    // Note: les mises a jour reexecutent ce code pour s'assurer
167
+    // de la conformite de la base
168
+    // pas de panique sur  "already exists" et "duplicate entry" donc.
169 169
 
170
-	alterer_base(
171
-		lister_tables_principales(),
172
-		lister_tables_auxiliaires(),
173
-		false,
174
-		$serveur
175
-	);
170
+    alterer_base(
171
+        lister_tables_principales(),
172
+        lister_tables_auxiliaires(),
173
+        false,
174
+        $serveur
175
+    );
176 176
 }
177 177
 
178 178
 /**
@@ -192,10 +192,10 @@  discard block
 block discarded – undo
192 192
  * @return void
193 193
  */
194 194
 function maj_tables($upgrade_tables = [], $serveur = '') {
195
-	alterer_base(
196
-		lister_tables_principales(),
197
-		lister_tables_auxiliaires(),
198
-		$upgrade_tables,
199
-		$serveur
200
-	);
195
+    alterer_base(
196
+        lister_tables_principales(),
197
+        lister_tables_auxiliaires(),
198
+        $upgrade_tables,
199
+        $serveur
200
+    );
201 201
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -87,7 +87,7 @@
 block discarded – undo
87 87
 		if (isset($desc['field'])) {
88 88
 			foreach ($desc['field'] as $field => $type) {
89 89
 				if (!isset($sql_desc['field'][$field])) {
90
-					sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ''), $serveur);
90
+					sql_alter("TABLE $table ADD $field $type".($last ? " AFTER $last" : ''), $serveur);
91 91
 				}
92 92
 				$last = $field;
93 93
 			}
Please login to merge, or discard this patch.
ecrire/base/trouver_table.php 2 patches
Indentation   +149 added lines, -149 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  * @package SPIP\Core\SQL\Tables
18 18
  **/
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 include_spip('base/objets');
23 23
 
@@ -69,152 +69,152 @@  discard block
 block discarded – undo
69 69
  *
70 70
  **/
71 71
 function base_trouver_table_dist($nom, $serveur = '', $table_spip = true, array $options = []) {
72
-	$desc_cache = null;
73
-	static $nom_cache_desc_sql = [];
74
-
75
-	if (
76
-		!spip_connect($serveur)
77
-		|| !preg_match('/^[a-zA-Z0-9._-]*/', $nom)
78
-	) {
79
-		return null;
80
-	}
81
-
82
-	$options += [
83
-		// si false, baissera le niveau de log si une table demandée n’existe pas
84
-		'log_missing' => true,
85
-	];
86
-
87
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
88
-	$objets_sql = lister_tables_objets_sql('::md5');
89
-
90
-	// le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
91
-	// ce qui permet une auto invalidation en cas de modif manuelle du fichier
92
-	// de connexion, et tout risque d'ambiguite
93
-	if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
94
-		$nom_cache_desc_sql[$serveur][$objets_sql] =
95
-			_DIR_CACHE . 'sql_desc_'
96
-			. ($serveur ? "{$serveur}_" : '')
97
-			. substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
98
-			. '.txt';
99
-		// nouveau nom de cache = nouvelle version en memoire
100
-		unset($connexion['tables']);
101
-	}
102
-
103
-	// un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
104
-	if (!$nom) {
105
-		spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
106
-		$connexion['tables'] = [];
107
-
108
-		return null;
109
-	}
110
-
111
-	$nom_sql = $nom;
112
-	$nom_sql = preg_match('/\.(.*)$/', $nom, $s) ? $s[1] : $nom;
113
-
114
-	$fdesc = $desc = '';
115
-	$connexion = &$GLOBALS['connexions'][$serveur ?: 0];
116
-
117
-	// base sous SPIP: gerer les abreviations explicites des noms de table
118
-	if (
119
-		$connexion['spip_connect_version']
120
-		&& $table_spip
121
-		&& isset($GLOBALS['table_des_tables'][$nom])
122
-	) {
123
-		$nom = $GLOBALS['table_des_tables'][$nom];
124
-		$nom_sql = 'spip_' . $nom;
125
-	}
126
-
127
-	// si c'est la premiere table qu'on cherche
128
-	// et si on est pas explicitement en recalcul
129
-	// on essaye de recharger le cache des decriptions de ce serveur
130
-	// dans le fichier cache
131
-	if (
132
-		!isset($connexion['tables'][$nom_sql])
133
-		&& defined('_VAR_MODE')
134
-		&& _VAR_MODE !== 'recalcul'
135
-		&& (!isset($connexion['tables']) || !$connexion['tables'])
136
-		&& lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache)
137
-		&& ($desc_cache = unserialize($desc_cache))
138
-	) {
139
-		$connexion['tables'] = $desc_cache;
140
-	}
141
-	if ($table_spip && !isset($connexion['tables'][$nom_sql])) {
142
-		if (isset($GLOBALS['tables_principales'][$nom_sql])) {
143
-			$fdesc = $GLOBALS['tables_principales'][$nom_sql];
144
-		}
145
-		// meme si pas d'abreviation declaree, trouver la table spip_$nom
146
-		// si c'est une table principale,
147
-		// puisqu'on le fait aussi pour les tables auxiliaires
148
-		elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_' . $nom])) {
149
-			$nom_sql = 'spip_' . $nom;
150
-			$fdesc = &$GLOBALS['tables_principales'][$nom_sql];
151
-		} elseif (
152
-			isset($GLOBALS['tables_auxiliaires'][$n = $nom])
153
-			|| isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
154
-		) {
155
-			$nom_sql = $n;
156
-			$fdesc = &$GLOBALS['tables_auxiliaires'][$n];
157
-		}  # table locale a cote de SPIP, comme non SPIP:
158
-	}
159
-	if (!isset($connexion['tables'][$nom_sql])) {
160
-		// La *vraie* base a la priorite
161
-		$exists = sql_table_exists($nom_sql, $table_spip, $serveur);
162
-		if (
163
-			!$exists
164
-			|| !($desc = sql_showtable($nom_sql, $table_spip, $serveur))
165
-			|| !$desc['field']
166
-		) {
167
-			if (!$fdesc) {
168
-				spip_logger('base')->log(
169
-					$options['log_missing'] ? LogLevel::NOTICE : LogLevel::DEBUG,
170
-					"trouver_table: table inconnue '$serveur' '$nom'"
171
-				);
172
-
173
-				return null;
174
-			}
175
-			// on ne sait pas lire la structure de la table :
176
-			// on retombe sur la description donnee dans les fichiers spip
177
-			$desc = $fdesc;
178
-			$desc['exist'] = false;
179
-		} else {
180
-			$desc['exist'] = true;
181
-			// gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
182
-			// pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
183
-			if (! $desc['key']) {
184
-				spip_logger('base')->info("trouver_table: table sans cle '$serveur' '$nom'");
185
-				unset($desc['key']);
186
-			}
187
-		}
188
-
189
-		$desc['table'] = $desc['table_sql'] = $nom_sql;
190
-		$desc['connexion'] = $serveur;
191
-
192
-		// charger les infos declarees pour cette table
193
-		// en lui passant les infos connues
194
-		// $desc est prioritaire pour la description de la table
195
-		$desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
196
-		// s'assurer qu'on a toujours un 'key'
197
-		if (!isset($desc['key']) && !empty($fdesc['key'])) {
198
-			$desc['key'] = $fdesc['key'];
199
-		}
200
-		if (! isset($desc['key'])) {
201
-			$desc['key'] = [];
202
-		}
203
-
204
-		// si tables_objets_sql est bien fini d'init, on peut cacher
205
-		$connexion['tables'][$nom_sql] = $desc;
206
-		$res = &$connexion['tables'][$nom_sql];
207
-		// une nouvelle table a ete decrite
208
-		// mettons donc a jour le cache des descriptions de ce serveur
209
-		if (is_writable(_DIR_CACHE)) {
210
-			ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true);
211
-		}
212
-	} else {
213
-		$res = &$connexion['tables'][$nom_sql];
214
-	}
215
-
216
-	// toujours retourner $nom dans id_table
217
-	$res['id_table'] = $nom;
218
-
219
-	return $res;
72
+    $desc_cache = null;
73
+    static $nom_cache_desc_sql = [];
74
+
75
+    if (
76
+        !spip_connect($serveur)
77
+        || !preg_match('/^[a-zA-Z0-9._-]*/', $nom)
78
+    ) {
79
+        return null;
80
+    }
81
+
82
+    $options += [
83
+        // si false, baissera le niveau de log si une table demandée n’existe pas
84
+        'log_missing' => true,
85
+    ];
86
+
87
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
88
+    $objets_sql = lister_tables_objets_sql('::md5');
89
+
90
+    // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
91
+    // ce qui permet une auto invalidation en cas de modif manuelle du fichier
92
+    // de connexion, et tout risque d'ambiguite
93
+    if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
94
+        $nom_cache_desc_sql[$serveur][$objets_sql] =
95
+            _DIR_CACHE . 'sql_desc_'
96
+            . ($serveur ? "{$serveur}_" : '')
97
+            . substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
98
+            . '.txt';
99
+        // nouveau nom de cache = nouvelle version en memoire
100
+        unset($connexion['tables']);
101
+    }
102
+
103
+    // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
104
+    if (!$nom) {
105
+        spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
106
+        $connexion['tables'] = [];
107
+
108
+        return null;
109
+    }
110
+
111
+    $nom_sql = $nom;
112
+    $nom_sql = preg_match('/\.(.*)$/', $nom, $s) ? $s[1] : $nom;
113
+
114
+    $fdesc = $desc = '';
115
+    $connexion = &$GLOBALS['connexions'][$serveur ?: 0];
116
+
117
+    // base sous SPIP: gerer les abreviations explicites des noms de table
118
+    if (
119
+        $connexion['spip_connect_version']
120
+        && $table_spip
121
+        && isset($GLOBALS['table_des_tables'][$nom])
122
+    ) {
123
+        $nom = $GLOBALS['table_des_tables'][$nom];
124
+        $nom_sql = 'spip_' . $nom;
125
+    }
126
+
127
+    // si c'est la premiere table qu'on cherche
128
+    // et si on est pas explicitement en recalcul
129
+    // on essaye de recharger le cache des decriptions de ce serveur
130
+    // dans le fichier cache
131
+    if (
132
+        !isset($connexion['tables'][$nom_sql])
133
+        && defined('_VAR_MODE')
134
+        && _VAR_MODE !== 'recalcul'
135
+        && (!isset($connexion['tables']) || !$connexion['tables'])
136
+        && lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache)
137
+        && ($desc_cache = unserialize($desc_cache))
138
+    ) {
139
+        $connexion['tables'] = $desc_cache;
140
+    }
141
+    if ($table_spip && !isset($connexion['tables'][$nom_sql])) {
142
+        if (isset($GLOBALS['tables_principales'][$nom_sql])) {
143
+            $fdesc = $GLOBALS['tables_principales'][$nom_sql];
144
+        }
145
+        // meme si pas d'abreviation declaree, trouver la table spip_$nom
146
+        // si c'est une table principale,
147
+        // puisqu'on le fait aussi pour les tables auxiliaires
148
+        elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_' . $nom])) {
149
+            $nom_sql = 'spip_' . $nom;
150
+            $fdesc = &$GLOBALS['tables_principales'][$nom_sql];
151
+        } elseif (
152
+            isset($GLOBALS['tables_auxiliaires'][$n = $nom])
153
+            || isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
154
+        ) {
155
+            $nom_sql = $n;
156
+            $fdesc = &$GLOBALS['tables_auxiliaires'][$n];
157
+        }  # table locale a cote de SPIP, comme non SPIP:
158
+    }
159
+    if (!isset($connexion['tables'][$nom_sql])) {
160
+        // La *vraie* base a la priorite
161
+        $exists = sql_table_exists($nom_sql, $table_spip, $serveur);
162
+        if (
163
+            !$exists
164
+            || !($desc = sql_showtable($nom_sql, $table_spip, $serveur))
165
+            || !$desc['field']
166
+        ) {
167
+            if (!$fdesc) {
168
+                spip_logger('base')->log(
169
+                    $options['log_missing'] ? LogLevel::NOTICE : LogLevel::DEBUG,
170
+                    "trouver_table: table inconnue '$serveur' '$nom'"
171
+                );
172
+
173
+                return null;
174
+            }
175
+            // on ne sait pas lire la structure de la table :
176
+            // on retombe sur la description donnee dans les fichiers spip
177
+            $desc = $fdesc;
178
+            $desc['exist'] = false;
179
+        } else {
180
+            $desc['exist'] = true;
181
+            // gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
182
+            // pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
183
+            if (! $desc['key']) {
184
+                spip_logger('base')->info("trouver_table: table sans cle '$serveur' '$nom'");
185
+                unset($desc['key']);
186
+            }
187
+        }
188
+
189
+        $desc['table'] = $desc['table_sql'] = $nom_sql;
190
+        $desc['connexion'] = $serveur;
191
+
192
+        // charger les infos declarees pour cette table
193
+        // en lui passant les infos connues
194
+        // $desc est prioritaire pour la description de la table
195
+        $desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
196
+        // s'assurer qu'on a toujours un 'key'
197
+        if (!isset($desc['key']) && !empty($fdesc['key'])) {
198
+            $desc['key'] = $fdesc['key'];
199
+        }
200
+        if (! isset($desc['key'])) {
201
+            $desc['key'] = [];
202
+        }
203
+
204
+        // si tables_objets_sql est bien fini d'init, on peut cacher
205
+        $connexion['tables'][$nom_sql] = $desc;
206
+        $res = &$connexion['tables'][$nom_sql];
207
+        // une nouvelle table a ete decrite
208
+        // mettons donc a jour le cache des descriptions de ce serveur
209
+        if (is_writable(_DIR_CACHE)) {
210
+            ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true);
211
+        }
212
+    } else {
213
+        $res = &$connexion['tables'][$nom_sql];
214
+    }
215
+
216
+    // toujours retourner $nom dans id_table
217
+    $res['id_table'] = $nom;
218
+
219
+    return $res;
220 220
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -92,9 +92,9 @@  discard block
 block discarded – undo
92 92
 	// de connexion, et tout risque d'ambiguite
93 93
 	if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
94 94
 		$nom_cache_desc_sql[$serveur][$objets_sql] =
95
-			_DIR_CACHE . 'sql_desc_'
95
+			_DIR_CACHE.'sql_desc_'
96 96
 			. ($serveur ? "{$serveur}_" : '')
97
-			. substr(md5($connexion['db'] . ':' . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
97
+			. substr(md5($connexion['db'].':'.$connexion['prefixe'].":$objets_sql"), 0, 8)
98 98
 			. '.txt';
99 99
 		// nouveau nom de cache = nouvelle version en memoire
100 100
 		unset($connexion['tables']);
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
 		&& isset($GLOBALS['table_des_tables'][$nom])
122 122
 	) {
123 123
 		$nom = $GLOBALS['table_des_tables'][$nom];
124
-		$nom_sql = 'spip_' . $nom;
124
+		$nom_sql = 'spip_'.$nom;
125 125
 	}
126 126
 
127 127
 	// si c'est la premiere table qu'on cherche
@@ -145,12 +145,12 @@  discard block
 block discarded – undo
145 145
 		// meme si pas d'abreviation declaree, trouver la table spip_$nom
146 146
 		// si c'est une table principale,
147 147
 		// puisqu'on le fait aussi pour les tables auxiliaires
148
-		elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_' . $nom])) {
149
-			$nom_sql = 'spip_' . $nom;
148
+		elseif ($nom_sql == $nom && isset($GLOBALS['tables_principales']['spip_'.$nom])) {
149
+			$nom_sql = 'spip_'.$nom;
150 150
 			$fdesc = &$GLOBALS['tables_principales'][$nom_sql];
151 151
 		} elseif (
152 152
 			isset($GLOBALS['tables_auxiliaires'][$n = $nom])
153
-			|| isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
153
+			|| isset($GLOBALS['tables_auxiliaires'][$n = 'spip_'.$nom])
154 154
 		) {
155 155
 			$nom_sql = $n;
156 156
 			$fdesc = &$GLOBALS['tables_auxiliaires'][$n];
@@ -180,7 +180,7 @@  discard block
 block discarded – undo
180 180
 			$desc['exist'] = true;
181 181
 			// gerer le cas des cles vides (echec de l'analyse sur une vue par exemple)
182 182
 			// pour recuperer la declaration de lister_tables_objets_sql() si il y en a une
183
-			if (! $desc['key']) {
183
+			if (!$desc['key']) {
184 184
 				spip_logger('base')->info("trouver_table: table sans cle '$serveur' '$nom'");
185 185
 				unset($desc['key']);
186 186
 			}
@@ -197,7 +197,7 @@  discard block
 block discarded – undo
197 197
 		if (!isset($desc['key']) && !empty($fdesc['key'])) {
198 198
 			$desc['key'] = $fdesc['key'];
199 199
 		}
200
-		if (! isset($desc['key'])) {
200
+		if (!isset($desc['key'])) {
201 201
 			$desc['key'] = [];
202 202
 		}
203 203
 
Please login to merge, or discard this patch.
ecrire/xml/sax.php 2 patches
Indentation   +244 added lines, -244 removed lines patch added patch discarded remove patch
@@ -10,7 +10,7 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 include_spip('inc/charsets');
@@ -23,215 +23,215 @@  discard block
 block discarded – undo
23 23
  * @return string
24 24
  */
25 25
 function xml_entites_html($texte) {
26
-	if (!is_string($texte) || !$texte || strpbrk($texte, "&\"'<>") == false) {
27
-		return $texte;
28
-	}
26
+    if (!is_string($texte) || !$texte || strpbrk($texte, "&\"'<>") == false) {
27
+        return $texte;
28
+    }
29 29
 
30
-	if (!function_exists('spip_htmlspecialchars')) {
31
-		include_spip('inc/filtres_mini');
32
-	}
30
+    if (!function_exists('spip_htmlspecialchars')) {
31
+        include_spip('inc/filtres_mini');
32
+    }
33 33
 
34
-	return spip_htmlspecialchars($texte, ENT_QUOTES);
34
+    return spip_htmlspecialchars($texte, ENT_QUOTES);
35 35
 }
36 36
 
37 37
 function xml_debutElement($phraseur, $name, $attrs) {
38
-	$depth = $phraseur->depth;
39
-
40
-	$t = $phraseur->ouvrant[$depth] ?? ' ';
41
-	// espace initial signifie: deja integree au resultat
42
-	if ($t[0] != ' ') {
43
-		$phraseur->res .= '<' . $t . '>';
44
-		$phraseur->ouvrant[$depth] = ' ' . $t;
45
-	}
46
-	$t = $phraseur->contenu[$depth];
47
-	// n'indenter que s'il y a un separateur avant
48
-	$phraseur->res .= preg_replace("/[\n\t ]+$/", "\n$depth", $t);
49
-	$phraseur->contenu[$depth] = '';
50
-	$att = '';
51
-	$sep = ' ';
52
-	foreach ($attrs as $k => $v) {
53
-		$delim = str_contains($v, "'") ? '"' : "'";
54
-		$val = xml_entites_html($v);
55
-		$att .= $sep . $k . '=' . $delim
56
-			. ($delim !== '"' ? str_replace('&quot;', '"', $val) : $val)
57
-			. $delim;
58
-		$sep = "\n $depth";
59
-	}
60
-	$phraseur->depth .= '  ';
61
-	$phraseur->contenu[$phraseur->depth] = '';
62
-	$phraseur->ouvrant[$phraseur->depth] = $name . $att;
63
-	$phraseur->reperes[$phraseur->depth] = xml_get_current_line_number($phraseur->sax);
38
+    $depth = $phraseur->depth;
39
+
40
+    $t = $phraseur->ouvrant[$depth] ?? ' ';
41
+    // espace initial signifie: deja integree au resultat
42
+    if ($t[0] != ' ') {
43
+        $phraseur->res .= '<' . $t . '>';
44
+        $phraseur->ouvrant[$depth] = ' ' . $t;
45
+    }
46
+    $t = $phraseur->contenu[$depth];
47
+    // n'indenter que s'il y a un separateur avant
48
+    $phraseur->res .= preg_replace("/[\n\t ]+$/", "\n$depth", $t);
49
+    $phraseur->contenu[$depth] = '';
50
+    $att = '';
51
+    $sep = ' ';
52
+    foreach ($attrs as $k => $v) {
53
+        $delim = str_contains($v, "'") ? '"' : "'";
54
+        $val = xml_entites_html($v);
55
+        $att .= $sep . $k . '=' . $delim
56
+            . ($delim !== '"' ? str_replace('&quot;', '"', $val) : $val)
57
+            . $delim;
58
+        $sep = "\n $depth";
59
+    }
60
+    $phraseur->depth .= '  ';
61
+    $phraseur->contenu[$phraseur->depth] = '';
62
+    $phraseur->ouvrant[$phraseur->depth] = $name . $att;
63
+    $phraseur->reperes[$phraseur->depth] = xml_get_current_line_number($phraseur->sax);
64 64
 }
65 65
 
66 66
 function xml_finElement($phraseur, $name, $fusion_bal = false) {
67
-	$ouv = $phraseur->ouvrant[$phraseur->depth];
68
-
69
-	if ($ouv[0] != ' ') {
70
-		$phraseur->ouvrant[$phraseur->depth] = ' ' . $ouv;
71
-	} else {
72
-		$ouv = '';
73
-	}
74
-	$t = $phraseur->contenu[$phraseur->depth];
75
-	$phraseur->depth = substr($phraseur->depth, 2);
76
-	$t = preg_replace("/[\n\t ]+$/", "\n" . $phraseur->depth, $t);
77
-
78
-	// fusion <balise></balise> en <balise />.
79
-	// ATTENTION,  certains clients http croient que fusion ==> pas d'atttributs
80
-	// en particulier pour les balises Script et A.
81
-	// en presence d'attributs ne le faire que si la DTD est dispo et d'accord
82
-	// (param fusion_bal)
83
-
84
-	if ($t || ($ouv != $name && !$fusion_bal)) {
85
-		$phraseur->res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . '</' . $name . '>';
86
-	} else {
87
-		$phraseur->res .= ($ouv ? ('<' . $ouv . ' />') : ('</' . $name . '>'));
88
-	}
67
+    $ouv = $phraseur->ouvrant[$phraseur->depth];
68
+
69
+    if ($ouv[0] != ' ') {
70
+        $phraseur->ouvrant[$phraseur->depth] = ' ' . $ouv;
71
+    } else {
72
+        $ouv = '';
73
+    }
74
+    $t = $phraseur->contenu[$phraseur->depth];
75
+    $phraseur->depth = substr($phraseur->depth, 2);
76
+    $t = preg_replace("/[\n\t ]+$/", "\n" . $phraseur->depth, $t);
77
+
78
+    // fusion <balise></balise> en <balise />.
79
+    // ATTENTION,  certains clients http croient que fusion ==> pas d'atttributs
80
+    // en particulier pour les balises Script et A.
81
+    // en presence d'attributs ne le faire que si la DTD est dispo et d'accord
82
+    // (param fusion_bal)
83
+
84
+    if ($t || ($ouv != $name && !$fusion_bal)) {
85
+        $phraseur->res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . '</' . $name . '>';
86
+    } else {
87
+        $phraseur->res .= ($ouv ? ('<' . $ouv . ' />') : ('</' . $name . '>'));
88
+    }
89 89
 }
90 90
 
91 91
 function xml_textElement($phraseur, $data) {
92
-	$depth = $phraseur->depth;
93
-	$phraseur->contenu[$depth] .= preg_match('/^script/', $phraseur->ouvrant[$depth])
94
-		? $data
95
-		: xml_entites_html($data);
92
+    $depth = $phraseur->depth;
93
+    $phraseur->contenu[$depth] .= preg_match('/^script/', $phraseur->ouvrant[$depth])
94
+        ? $data
95
+        : xml_entites_html($data);
96 96
 }
97 97
 
98 98
 function xml_piElement($phraseur, $target, $data) {
99
-	$depth = $phraseur->depth;
100
-
101
-	if (strtolower($target) != 'php') {
102
-		$phraseur->contenu[$depth] .= $data;
103
-	} else {
104
-		ob_start();
105
-		eval($data);
106
-		$data = ob_get_contents();
107
-		ob_end_clean();
108
-		$phraseur->contenu[$depth] .= $data;
109
-	}
99
+    $depth = $phraseur->depth;
100
+
101
+    if (strtolower($target) != 'php') {
102
+        $phraseur->contenu[$depth] .= $data;
103
+    } else {
104
+        ob_start();
105
+        eval($data);
106
+        $data = ob_get_contents();
107
+        ob_end_clean();
108
+        $phraseur->contenu[$depth] .= $data;
109
+    }
110 110
 }
111 111
 
112 112
 
113 113
 function xml_defaultElement($phraseur, $data) {
114
-	$depth = $phraseur->depth;
114
+    $depth = $phraseur->depth;
115 115
 
116
-	if (!isset($phraseur->contenu[$depth])) {
117
-		$phraseur->contenu[$depth] = '';
118
-	}
119
-	$phraseur->contenu[$depth] .= $data;
116
+    if (!isset($phraseur->contenu[$depth])) {
117
+        $phraseur->contenu[$depth] = '';
118
+    }
119
+    $phraseur->contenu[$depth] .= $data;
120 120
 }
121 121
 
122 122
 function xml_parsestring($phraseur, $data) {
123
-	$phraseur->contenu[$phraseur->depth] = '';
124
-
125
-	if (!xml_parse($phraseur->sax, $data, true)) {
126
-		coordonnees_erreur(
127
-			$phraseur,
128
-			xml_error_string(xml_get_error_code($phraseur->sax))
129
-			. "<br />\n" .
130
-			($phraseur->depth
131
-				? '(' .
132
-					_T('erreur_balise_non_fermee') .
133
-					' <tt>' .
134
-					$phraseur->ouvrant[$phraseur->depth] .
135
-					'</tt> ' .
136
-					_T('ligne') .
137
-					' ' .
138
-					$phraseur->reperes[$phraseur->depth] .
139
-					") <br />\n"
140
-				: '')
141
-		);
142
-	}
123
+    $phraseur->contenu[$phraseur->depth] = '';
124
+
125
+    if (!xml_parse($phraseur->sax, $data, true)) {
126
+        coordonnees_erreur(
127
+            $phraseur,
128
+            xml_error_string(xml_get_error_code($phraseur->sax))
129
+            . "<br />\n" .
130
+            ($phraseur->depth
131
+                ? '(' .
132
+                    _T('erreur_balise_non_fermee') .
133
+                    ' <tt>' .
134
+                    $phraseur->ouvrant[$phraseur->depth] .
135
+                    '</tt> ' .
136
+                    _T('ligne') .
137
+                    ' ' .
138
+                    $phraseur->reperes[$phraseur->depth] .
139
+                    ") <br />\n"
140
+                : '')
141
+        );
142
+    }
143 143
 }
144 144
 
145 145
 function coordonnees_erreur($phraseur, $msg) {
146
-	$entete_length = substr_count($phraseur->entete, "\n");
147
-	$phraseur->err[] = [
148
-		$msg,
149
-		xml_get_current_line_number($phraseur->sax) + $entete_length,
150
-		xml_get_current_column_number($phraseur->sax)
151
-	];
146
+    $entete_length = substr_count($phraseur->entete, "\n");
147
+    $phraseur->err[] = [
148
+        $msg,
149
+        xml_get_current_line_number($phraseur->sax) + $entete_length,
150
+        xml_get_current_column_number($phraseur->sax)
151
+    ];
152 152
 }
153 153
 
154 154
 function xml_sax_dist($page, $apply = false, $phraseur = null, $doctype = '', $charset = null) {
155
-	if (is_null($charset)) {
156
-		$charset = $GLOBALS['meta']['charset'];
157
-	}
158
-	if ($apply) {
159
-		ob_start();
160
-		$r = is_array($apply) ? $page(...$apply) : $page();
161
-		$page = ob_get_contents();
162
-		ob_end_clean();
163
-		// fonction sans aucun "echo", ca doit etre le resultat
164
-		if (!$page) {
165
-			$page = $r;
166
-		}
167
-	}
168
-
169
-	if (!$page) {
170
-		return '';
171
-	}
172
-	// charger la DTD et transcoder les entites,
173
-	// et escamoter le doctype que sax mange en php5 mais pas en  php4
174
-	if (!$doctype) {
175
-		if (!$r = analyser_doctype($page)) {
176
-			$page = _MESSAGE_DOCTYPE . _DOCTYPE_ECRIRE
177
-				. preg_replace(_REGEXP_DOCTYPE, '', $page);
178
-			$r = analyser_doctype($page);
179
-		}
180
-		[$entete, $avail, $grammaire, $rotlvl] = array_pad($r, 4, null);
181
-		$page = substr($page, strlen($entete));
182
-	} else {
183
-		$avail = 'SYSTEM';
184
-		$grammaire = $doctype;
185
-		$rotlvl = basename($grammaire);
186
-	}
187
-
188
-	include_spip('xml/analyser_dtd');
189
-	$dtc = charger_dtd($grammaire, $avail, $rotlvl);
190
-	$page = sax_bug($page, $dtc, $charset);
191
-
192
-	// compatibilite Tidy espace public
193
-	if (!$phraseur) {
194
-		$indenter_xml = charger_fonction('indenter', 'xml');
195
-
196
-		return $indenter_xml($page, $apply);
197
-	}
198
-
199
-	$xml_parser = xml_parser_create($charset);
200
-
201
-	xml_set_element_handler(
202
-		$xml_parser,
203
-		[$phraseur, 'debutElement'],
204
-		[$phraseur, 'finElement']
205
-	);
206
-
207
-	xml_set_character_data_handler(
208
-		$xml_parser,
209
-		[$phraseur, 'textElement']
210
-	);
211
-
212
-	xml_set_processing_instruction_handler(
213
-		$xml_parser,
214
-		[$phraseur, 'piElement']
215
-	);
216
-
217
-	xml_set_default_handler(
218
-		$xml_parser,
219
-		[$phraseur, 'defaultElement']
220
-	);
221
-
222
-	xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
223
-
224
-	$phraseur->sax = $xml_parser;
225
-	if (isset($entete)) {
226
-		$phraseur->entete = $entete;
227
-	}
228
-	$phraseur->page = $page;
229
-	$phraseur->dtc = $dtc;
230
-	$phraseur->phraserTout($xml_parser, $page);
231
-	xml_parser_free($xml_parser);
232
-	$phraseur->sax = '';
233
-
234
-	return $phraseur;
155
+    if (is_null($charset)) {
156
+        $charset = $GLOBALS['meta']['charset'];
157
+    }
158
+    if ($apply) {
159
+        ob_start();
160
+        $r = is_array($apply) ? $page(...$apply) : $page();
161
+        $page = ob_get_contents();
162
+        ob_end_clean();
163
+        // fonction sans aucun "echo", ca doit etre le resultat
164
+        if (!$page) {
165
+            $page = $r;
166
+        }
167
+    }
168
+
169
+    if (!$page) {
170
+        return '';
171
+    }
172
+    // charger la DTD et transcoder les entites,
173
+    // et escamoter le doctype que sax mange en php5 mais pas en  php4
174
+    if (!$doctype) {
175
+        if (!$r = analyser_doctype($page)) {
176
+            $page = _MESSAGE_DOCTYPE . _DOCTYPE_ECRIRE
177
+                . preg_replace(_REGEXP_DOCTYPE, '', $page);
178
+            $r = analyser_doctype($page);
179
+        }
180
+        [$entete, $avail, $grammaire, $rotlvl] = array_pad($r, 4, null);
181
+        $page = substr($page, strlen($entete));
182
+    } else {
183
+        $avail = 'SYSTEM';
184
+        $grammaire = $doctype;
185
+        $rotlvl = basename($grammaire);
186
+    }
187
+
188
+    include_spip('xml/analyser_dtd');
189
+    $dtc = charger_dtd($grammaire, $avail, $rotlvl);
190
+    $page = sax_bug($page, $dtc, $charset);
191
+
192
+    // compatibilite Tidy espace public
193
+    if (!$phraseur) {
194
+        $indenter_xml = charger_fonction('indenter', 'xml');
195
+
196
+        return $indenter_xml($page, $apply);
197
+    }
198
+
199
+    $xml_parser = xml_parser_create($charset);
200
+
201
+    xml_set_element_handler(
202
+        $xml_parser,
203
+        [$phraseur, 'debutElement'],
204
+        [$phraseur, 'finElement']
205
+    );
206
+
207
+    xml_set_character_data_handler(
208
+        $xml_parser,
209
+        [$phraseur, 'textElement']
210
+    );
211
+
212
+    xml_set_processing_instruction_handler(
213
+        $xml_parser,
214
+        [$phraseur, 'piElement']
215
+    );
216
+
217
+    xml_set_default_handler(
218
+        $xml_parser,
219
+        [$phraseur, 'defaultElement']
220
+    );
221
+
222
+    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
223
+
224
+    $phraseur->sax = $xml_parser;
225
+    if (isset($entete)) {
226
+        $phraseur->entete = $entete;
227
+    }
228
+    $phraseur->page = $page;
229
+    $phraseur->dtc = $dtc;
230
+    $phraseur->phraserTout($xml_parser, $page);
231
+    xml_parser_free($xml_parser);
232
+    $phraseur->sax = '';
233
+
234
+    return $phraseur;
235 235
 }
236 236
 
237 237
 // SAX ne dit pas si une Entite est dans un attribut ou non.
@@ -242,24 +242,24 @@  discard block
 block discarded – undo
242 242
 // sinon on se rabat sur ce qu'en connait SPIP en standard.
243 243
 
244 244
 function sax_bug($data, $dtc, $charset = null) {
245
-	if (is_null($charset)) {
246
-		$charset = $GLOBALS['meta']['charset'];
247
-	}
248
-
249
-	if ($dtc) {
250
-		$trans = [];
251
-
252
-		foreach ($dtc->entites as $k => $v) {
253
-			if (!strpos(' amp lt gt quot ', (string) $k)) {
254
-				$trans["&$k;"] = $v;
255
-			}
256
-		}
257
-		$data = strtr($data, $trans);
258
-	} else {
259
-		$data = html2unicode($data, true);
260
-	}
261
-
262
-	return unicode2charset($data, $charset);
245
+    if (is_null($charset)) {
246
+        $charset = $GLOBALS['meta']['charset'];
247
+    }
248
+
249
+    if ($dtc) {
250
+        $trans = [];
251
+
252
+        foreach ($dtc->entites as $k => $v) {
253
+            if (!strpos(' amp lt gt quot ', (string) $k)) {
254
+                $trans["&$k;"] = $v;
255
+            }
256
+        }
257
+        $data = strtr($data, $trans);
258
+    } else {
259
+        $data = html2unicode($data, true);
260
+    }
261
+
262
+    return unicode2charset($data, $charset);
263 263
 }
264 264
 
265 265
 // Retirer < ? xml... ? > et autre PI, ainsi que les commentaires en debut
@@ -269,48 +269,48 @@  discard block
 block discarded – undo
269 269
 // les autres formats RSS n'ont pas de DTD,
270 270
 // mais un XML Schema que SPIP ne fait pas encore lire.
271 271
 function analyser_doctype($data) {
272
-	if (!preg_match(_REGEXP_DOCTYPE, $data, $page)) {
273
-		if (preg_match(_REGEXP_XML, $data, $page)) {
274
-			[, $entete, $topelement] = $page;
275
-			if ($topelement == 'rss') {
276
-				return [
277
-					$entete,
278
-					'PUBLIC',
279
-					_DOCTYPE_RSS,
280
-					'rss-0.91.dtd'
281
-				];
282
-			} else {
283
-				$dtd = $topelement . '.dtd';
284
-				$f = find_in_path($dtd);
285
-				if (file_exists($f)) {
286
-					return [$entete, 'SYSTEM', $f, $dtd];
287
-				}
288
-			}
289
-		}
290
-		spip_logger()->info('Dtd pas vu pour ' . substr($data, 0, 100));
291
-
292
-		return [];
293
-	}
294
-	[$entete, , $topelement, $avail, $suite] = $page;
295
-
296
-	if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r) && !preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r)) {
297
-		return [];
298
-	}
299
-	[, $rotlvl, $suite] = $r;
300
-
301
-	if (!$suite) {
302
-		if ($avail != 'SYSTEM') {
303
-			return [];
304
-		}
305
-		$grammaire = $rotlvl;
306
-		$rotlvl = '';
307
-	} else {
308
-		if (!preg_match('/^"([^"]*)"\s*$/', $suite, $r) && !preg_match("/^'([^']*)'\s*$/", $suite, $r)) {
309
-			return [];
310
-		}
311
-
312
-		$grammaire = $r[1];
313
-	}
314
-
315
-	return [$entete, $avail, $grammaire, $rotlvl];
272
+    if (!preg_match(_REGEXP_DOCTYPE, $data, $page)) {
273
+        if (preg_match(_REGEXP_XML, $data, $page)) {
274
+            [, $entete, $topelement] = $page;
275
+            if ($topelement == 'rss') {
276
+                return [
277
+                    $entete,
278
+                    'PUBLIC',
279
+                    _DOCTYPE_RSS,
280
+                    'rss-0.91.dtd'
281
+                ];
282
+            } else {
283
+                $dtd = $topelement . '.dtd';
284
+                $f = find_in_path($dtd);
285
+                if (file_exists($f)) {
286
+                    return [$entete, 'SYSTEM', $f, $dtd];
287
+                }
288
+            }
289
+        }
290
+        spip_logger()->info('Dtd pas vu pour ' . substr($data, 0, 100));
291
+
292
+        return [];
293
+    }
294
+    [$entete, , $topelement, $avail, $suite] = $page;
295
+
296
+    if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r) && !preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r)) {
297
+        return [];
298
+    }
299
+    [, $rotlvl, $suite] = $r;
300
+
301
+    if (!$suite) {
302
+        if ($avail != 'SYSTEM') {
303
+            return [];
304
+        }
305
+        $grammaire = $rotlvl;
306
+        $rotlvl = '';
307
+    } else {
308
+        if (!preg_match('/^"([^"]*)"\s*$/', $suite, $r) && !preg_match("/^'([^']*)'\s*$/", $suite, $r)) {
309
+            return [];
310
+        }
311
+
312
+        $grammaire = $r[1];
313
+    }
314
+
315
+    return [$entete, $avail, $grammaire, $rotlvl];
316 316
 }
Please login to merge, or discard this patch.
Spacing   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -40,8 +40,8 @@  discard block
 block discarded – undo
40 40
 	$t = $phraseur->ouvrant[$depth] ?? ' ';
41 41
 	// espace initial signifie: deja integree au resultat
42 42
 	if ($t[0] != ' ') {
43
-		$phraseur->res .= '<' . $t . '>';
44
-		$phraseur->ouvrant[$depth] = ' ' . $t;
43
+		$phraseur->res .= '<'.$t.'>';
44
+		$phraseur->ouvrant[$depth] = ' '.$t;
45 45
 	}
46 46
 	$t = $phraseur->contenu[$depth];
47 47
 	// n'indenter que s'il y a un separateur avant
@@ -52,14 +52,14 @@  discard block
 block discarded – undo
52 52
 	foreach ($attrs as $k => $v) {
53 53
 		$delim = str_contains($v, "'") ? '"' : "'";
54 54
 		$val = xml_entites_html($v);
55
-		$att .= $sep . $k . '=' . $delim
55
+		$att .= $sep.$k.'='.$delim
56 56
 			. ($delim !== '"' ? str_replace('&quot;', '"', $val) : $val)
57 57
 			. $delim;
58 58
 		$sep = "\n $depth";
59 59
 	}
60 60
 	$phraseur->depth .= '  ';
61 61
 	$phraseur->contenu[$phraseur->depth] = '';
62
-	$phraseur->ouvrant[$phraseur->depth] = $name . $att;
62
+	$phraseur->ouvrant[$phraseur->depth] = $name.$att;
63 63
 	$phraseur->reperes[$phraseur->depth] = xml_get_current_line_number($phraseur->sax);
64 64
 }
65 65
 
@@ -67,13 +67,13 @@  discard block
 block discarded – undo
67 67
 	$ouv = $phraseur->ouvrant[$phraseur->depth];
68 68
 
69 69
 	if ($ouv[0] != ' ') {
70
-		$phraseur->ouvrant[$phraseur->depth] = ' ' . $ouv;
70
+		$phraseur->ouvrant[$phraseur->depth] = ' '.$ouv;
71 71
 	} else {
72 72
 		$ouv = '';
73 73
 	}
74 74
 	$t = $phraseur->contenu[$phraseur->depth];
75 75
 	$phraseur->depth = substr($phraseur->depth, 2);
76
-	$t = preg_replace("/[\n\t ]+$/", "\n" . $phraseur->depth, $t);
76
+	$t = preg_replace("/[\n\t ]+$/", "\n".$phraseur->depth, $t);
77 77
 
78 78
 	// fusion <balise></balise> en <balise />.
79 79
 	// ATTENTION,  certains clients http croient que fusion ==> pas d'atttributs
@@ -82,9 +82,9 @@  discard block
 block discarded – undo
82 82
 	// (param fusion_bal)
83 83
 
84 84
 	if ($t || ($ouv != $name && !$fusion_bal)) {
85
-		$phraseur->res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . '</' . $name . '>';
85
+		$phraseur->res .= ($ouv ? ('<'.$ouv.'>') : '').$t.'</'.$name.'>';
86 86
 	} else {
87
-		$phraseur->res .= ($ouv ? ('<' . $ouv . ' />') : ('</' . $name . '>'));
87
+		$phraseur->res .= ($ouv ? ('<'.$ouv.' />') : ('</'.$name.'>'));
88 88
 	}
89 89
 }
90 90
 
@@ -126,16 +126,16 @@  discard block
 block discarded – undo
126 126
 		coordonnees_erreur(
127 127
 			$phraseur,
128 128
 			xml_error_string(xml_get_error_code($phraseur->sax))
129
-			. "<br />\n" .
129
+			. "<br />\n".
130 130
 			($phraseur->depth
131
-				? '(' .
132
-					_T('erreur_balise_non_fermee') .
133
-					' <tt>' .
134
-					$phraseur->ouvrant[$phraseur->depth] .
135
-					'</tt> ' .
136
-					_T('ligne') .
137
-					' ' .
138
-					$phraseur->reperes[$phraseur->depth] .
131
+				? '('.
132
+					_T('erreur_balise_non_fermee').
133
+					' <tt>'.
134
+					$phraseur->ouvrant[$phraseur->depth].
135
+					'</tt> '.
136
+					_T('ligne').
137
+					' '.
138
+					$phraseur->reperes[$phraseur->depth].
139 139
 					") <br />\n"
140 140
 				: '')
141 141
 		);
@@ -173,7 +173,7 @@  discard block
 block discarded – undo
173 173
 	// et escamoter le doctype que sax mange en php5 mais pas en  php4
174 174
 	if (!$doctype) {
175 175
 		if (!$r = analyser_doctype($page)) {
176
-			$page = _MESSAGE_DOCTYPE . _DOCTYPE_ECRIRE
176
+			$page = _MESSAGE_DOCTYPE._DOCTYPE_ECRIRE
177 177
 				. preg_replace(_REGEXP_DOCTYPE, '', $page);
178 178
 			$r = analyser_doctype($page);
179 179
 		}
@@ -280,18 +280,18 @@  discard block
 block discarded – undo
280 280
 					'rss-0.91.dtd'
281 281
 				];
282 282
 			} else {
283
-				$dtd = $topelement . '.dtd';
283
+				$dtd = $topelement.'.dtd';
284 284
 				$f = find_in_path($dtd);
285 285
 				if (file_exists($f)) {
286 286
 					return [$entete, 'SYSTEM', $f, $dtd];
287 287
 				}
288 288
 			}
289 289
 		}
290
-		spip_logger()->info('Dtd pas vu pour ' . substr($data, 0, 100));
290
+		spip_logger()->info('Dtd pas vu pour '.substr($data, 0, 100));
291 291
 
292 292
 		return [];
293 293
 	}
294
-	[$entete, , $topelement, $avail, $suite] = $page;
294
+	[$entete,, $topelement, $avail, $suite] = $page;
295 295
 
296 296
 	if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r) && !preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r)) {
297 297
 		return [];
Please login to merge, or discard this patch.
ecrire/xml/analyser_dtd.php 2 patches
Indentation   +309 added lines, -309 removed lines patch added patch discarded remove patch
@@ -10,58 +10,58 @@  discard block
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 include_spip('xml/interfaces');
17 17
 
18 18
 function charger_dtd($grammaire, $avail, $rotlvl) {
19
-	$r = null;
20
-	static $dtd = []; # cache bien utile pour le validateur en boucle
21
-
22
-	if (isset($dtd[$grammaire])) {
23
-		return $dtd[$grammaire];
24
-	}
25
-
26
-	if ($avail == 'SYSTEM') {
27
-		$grammaire = find_in_path($grammaire);
28
-	}
29
-
30
-	$file = _DIR_CACHE_XML . preg_replace('/[^\w.]/', '_', (string) $rotlvl) . '.gz';
31
-
32
-	if (lire_fichier($file, $r)) {
33
-		if (!$grammaire) {
34
-			return [];
35
-		}
36
-		if ($avail == 'SYSTEM' && filemtime($file) < filemtime($grammaire)) {
37
-			$r = false;
38
-		}
39
-	}
40
-
41
-	if ($r) {
42
-		$dtc = unserialize($r);
43
-	} else {
44
-		spip_timer('dtd');
45
-		$dtc = new DTC();
46
-		// L'analyseur retourne un booleen de reussite et modifie $dtc.
47
-		// Retourner vide en cas d'echec
48
-		if (!analyser_dtd($grammaire, $avail, $dtc)) {
49
-			$dtc = [];
50
-		} else {
51
-			// tri final pour presenter les suggestions de corrections
52
-			foreach ($dtc->peres as $k => $v) {
53
-				asort($v);
54
-				$dtc->peres[$k] = $v;
55
-			}
56
-
57
-			spip_logger()->info("Analyser DTD $avail $grammaire (" . spip_timer('dtd') . ') ' . (is_countable($dtc->macros) ? count($dtc->macros) : 0) . ' macros, ' . (is_countable($dtc->elements) ? count($dtc->elements) : 0) . ' elements, ' . (is_countable($dtc->attributs) ? count($dtc->attributs) : 0) . " listes d'attributs, " . (is_countable($dtc->entites) ? count($dtc->entites) : 0) . ' entites');
58
-			#	$r = $dtc->regles; ksort($r);foreach($r as $l => $v) {$t=array_keys($dtc->attributs[$l]);echo "<b>$l</b> '$v' ", count($t), " attributs: ", join (', ',$t);$t=$dtc->peres[$l];echo "<br />",count($t), " peres: ", @join (', ',$t), "<br />\n";}exit;
59
-			ecrire_fichier($file, serialize($dtc), true);
60
-		}
61
-	}
62
-	$dtd[$grammaire] = $dtc;
63
-
64
-	return $dtc;
19
+    $r = null;
20
+    static $dtd = []; # cache bien utile pour le validateur en boucle
21
+
22
+    if (isset($dtd[$grammaire])) {
23
+        return $dtd[$grammaire];
24
+    }
25
+
26
+    if ($avail == 'SYSTEM') {
27
+        $grammaire = find_in_path($grammaire);
28
+    }
29
+
30
+    $file = _DIR_CACHE_XML . preg_replace('/[^\w.]/', '_', (string) $rotlvl) . '.gz';
31
+
32
+    if (lire_fichier($file, $r)) {
33
+        if (!$grammaire) {
34
+            return [];
35
+        }
36
+        if ($avail == 'SYSTEM' && filemtime($file) < filemtime($grammaire)) {
37
+            $r = false;
38
+        }
39
+    }
40
+
41
+    if ($r) {
42
+        $dtc = unserialize($r);
43
+    } else {
44
+        spip_timer('dtd');
45
+        $dtc = new DTC();
46
+        // L'analyseur retourne un booleen de reussite et modifie $dtc.
47
+        // Retourner vide en cas d'echec
48
+        if (!analyser_dtd($grammaire, $avail, $dtc)) {
49
+            $dtc = [];
50
+        } else {
51
+            // tri final pour presenter les suggestions de corrections
52
+            foreach ($dtc->peres as $k => $v) {
53
+                asort($v);
54
+                $dtc->peres[$k] = $v;
55
+            }
56
+
57
+            spip_logger()->info("Analyser DTD $avail $grammaire (" . spip_timer('dtd') . ') ' . (is_countable($dtc->macros) ? count($dtc->macros) : 0) . ' macros, ' . (is_countable($dtc->elements) ? count($dtc->elements) : 0) . ' elements, ' . (is_countable($dtc->attributs) ? count($dtc->attributs) : 0) . " listes d'attributs, " . (is_countable($dtc->entites) ? count($dtc->entites) : 0) . ' entites');
58
+            #	$r = $dtc->regles; ksort($r);foreach($r as $l => $v) {$t=array_keys($dtc->attributs[$l]);echo "<b>$l</b> '$v' ", count($t), " attributs: ", join (', ',$t);$t=$dtc->peres[$l];echo "<br />",count($t), " peres: ", @join (', ',$t), "<br />\n";}exit;
59
+            ecrire_fichier($file, serialize($dtc), true);
60
+        }
61
+    }
62
+    $dtd[$grammaire] = $dtc;
63
+
64
+    return $dtc;
65 65
 }
66 66
 
67 67
 // Compiler une regle de production en une Regexp qu'on appliquera sur la
@@ -73,137 +73,137 @@  discard block
 block discarded – undo
73 73
 // et parentheser le tout pour que  | + * ? s'applique dessus.
74 74
 
75 75
 function compilerRegle($val) {
76
-	return str_replace(
77
-		'()',
78
-		'',
79
-		preg_replace(
80
-			'/\s*,\s*/',
81
-			'',
82
-			preg_replace(
83
-				'/(\w+)\s*/',
84
-				'(?:\1 )',
85
-				preg_replace(
86
-					'/\s*\)/',
87
-					')',
88
-					preg_replace(
89
-						'/\s*([(+*|?])\s*/',
90
-						'\1',
91
-						preg_replace('/\s*#\w+\s*[,|]?\s*/', '', (string) $val)
92
-					)
93
-				)
94
-			)
95
-		)
96
-	);
76
+    return str_replace(
77
+        '()',
78
+        '',
79
+        preg_replace(
80
+            '/\s*,\s*/',
81
+            '',
82
+            preg_replace(
83
+                '/(\w+)\s*/',
84
+                '(?:\1 )',
85
+                preg_replace(
86
+                    '/\s*\)/',
87
+                    ')',
88
+                    preg_replace(
89
+                        '/\s*([(+*|?])\s*/',
90
+                        '\1',
91
+                        preg_replace('/\s*#\w+\s*[,|]?\s*/', '', (string) $val)
92
+                    )
93
+                )
94
+            )
95
+        )
96
+    );
97 97
 }
98 98
 
99 99
 
100 100
 function analyser_dtd($loc, $avail, &$dtc) {
101
-	// creer le repertoire de cache si ce n'est fait
102
-	// (utile aussi pour le resultat de la compil)
103
-	$file = sous_repertoire(_DIR_CACHE_XML);
104
-	// si DTD locale, ignorer ce repertoire pour le moment
105
-	if ($avail == 'SYSTEM') {
106
-		$file = $loc;
107
-		if (_DIR_RACINE && str_starts_with((string) $file, (string) _DIR_RACINE)) {
108
-			$file = substr((string) $file, strlen((string) _DIR_RACINE));
109
-		}
110
-		$file = find_in_path($file);
111
-	} else {
112
-		$file .= preg_replace('/[^\w.]/', '_', (string) $loc);
113
-	}
114
-
115
-	$dtd = '';
116
-	if (@is_readable($file)) {
117
-		lire_fichier($file, $dtd);
118
-	} else {
119
-		if ($avail == 'PUBLIC') {
120
-			include_spip('inc/distant');
121
-			$dtd = recuperer_url($loc);
122
-			$dtd = trim($dtd['page'] ?? '');
123
-			if ($dtd) {
124
-				ecrire_fichier($file, $dtd, true);
125
-			}
126
-		}
127
-	}
128
-
129
-	$dtd = ltrim($dtd);
130
-	if (!$dtd) {
131
-		spip_logger()->info("DTD '$loc' ($file) inaccessible");
132
-
133
-		return false;
134
-	} else {
135
-		spip_logger()->info("analyse de la DTD $loc ");
136
-	}
137
-
138
-	while ($dtd) {
139
-		if ($dtd[0] != '<') {
140
-			$r = analyser_dtd_lexeme($dtd, $dtc, $loc);
141
-		} elseif ($dtd[1] != '!') {
142
-			$r = analyser_dtd_pi($dtd, $dtc, $loc);
143
-		} elseif ($dtd[2] == '[') {
144
-			$r = analyser_dtd_data($dtd, $dtc, $loc);
145
-		} else {
146
-			$r = match ($dtd[3]) {
147
-				'%' => analyser_dtd_data($dtd, $dtc, $loc),
148
-				'T' => analyser_dtd_attlist($dtd, $dtc, $loc),
149
-				'L' => analyser_dtd_element($dtd, $dtc, $loc),
150
-				'N' => analyser_dtd_entity($dtd, $dtc, $loc),
151
-				'O' => analyser_dtd_notation($dtd, $dtc, $loc),
152
-				'-' => analyser_dtd_comment($dtd, $dtc, $loc),
153
-				default => -1,
154
-			};
155
-		}
156
-		if (!is_string($r)) {
157
-			spip_logger()->info("erreur $r dans la DTD  " . substr($dtd, 0, 80) . '.....');
158
-
159
-			return false;
160
-		}
161
-		$dtd = $r;
162
-	}
163
-
164
-	return true;
101
+    // creer le repertoire de cache si ce n'est fait
102
+    // (utile aussi pour le resultat de la compil)
103
+    $file = sous_repertoire(_DIR_CACHE_XML);
104
+    // si DTD locale, ignorer ce repertoire pour le moment
105
+    if ($avail == 'SYSTEM') {
106
+        $file = $loc;
107
+        if (_DIR_RACINE && str_starts_with((string) $file, (string) _DIR_RACINE)) {
108
+            $file = substr((string) $file, strlen((string) _DIR_RACINE));
109
+        }
110
+        $file = find_in_path($file);
111
+    } else {
112
+        $file .= preg_replace('/[^\w.]/', '_', (string) $loc);
113
+    }
114
+
115
+    $dtd = '';
116
+    if (@is_readable($file)) {
117
+        lire_fichier($file, $dtd);
118
+    } else {
119
+        if ($avail == 'PUBLIC') {
120
+            include_spip('inc/distant');
121
+            $dtd = recuperer_url($loc);
122
+            $dtd = trim($dtd['page'] ?? '');
123
+            if ($dtd) {
124
+                ecrire_fichier($file, $dtd, true);
125
+            }
126
+        }
127
+    }
128
+
129
+    $dtd = ltrim($dtd);
130
+    if (!$dtd) {
131
+        spip_logger()->info("DTD '$loc' ($file) inaccessible");
132
+
133
+        return false;
134
+    } else {
135
+        spip_logger()->info("analyse de la DTD $loc ");
136
+    }
137
+
138
+    while ($dtd) {
139
+        if ($dtd[0] != '<') {
140
+            $r = analyser_dtd_lexeme($dtd, $dtc, $loc);
141
+        } elseif ($dtd[1] != '!') {
142
+            $r = analyser_dtd_pi($dtd, $dtc, $loc);
143
+        } elseif ($dtd[2] == '[') {
144
+            $r = analyser_dtd_data($dtd, $dtc, $loc);
145
+        } else {
146
+            $r = match ($dtd[3]) {
147
+                '%' => analyser_dtd_data($dtd, $dtc, $loc),
148
+                'T' => analyser_dtd_attlist($dtd, $dtc, $loc),
149
+                'L' => analyser_dtd_element($dtd, $dtc, $loc),
150
+                'N' => analyser_dtd_entity($dtd, $dtc, $loc),
151
+                'O' => analyser_dtd_notation($dtd, $dtc, $loc),
152
+                '-' => analyser_dtd_comment($dtd, $dtc, $loc),
153
+                default => -1,
154
+            };
155
+        }
156
+        if (!is_string($r)) {
157
+            spip_logger()->info("erreur $r dans la DTD  " . substr($dtd, 0, 80) . '.....');
158
+
159
+            return false;
160
+        }
161
+        $dtd = $r;
162
+    }
163
+
164
+    return true;
165 165
 }
166 166
 
167 167
 function analyser_dtd_comment($dtd, &$dtc, $grammaire) {
168
-	// ejecter les commentaires, surtout quand ils contiennent du code.
169
-	// Option /s car sur plusieurs lignes parfois
168
+    // ejecter les commentaires, surtout quand ils contiennent du code.
169
+    // Option /s car sur plusieurs lignes parfois
170 170
 
171
-	if (!preg_match('/^<!--.*?-->\s*(.*)$/s', (string) $dtd, $m)) {
172
-		return -6;
173
-	}
171
+    if (!preg_match('/^<!--.*?-->\s*(.*)$/s', (string) $dtd, $m)) {
172
+        return -6;
173
+    }
174 174
 
175
-	return $m[1];
175
+    return $m[1];
176 176
 }
177 177
 
178 178
 function analyser_dtd_pi($dtd, &$dtc, $grammaire) {
179
-	if (!preg_match('/^<\?.*?>\s*(.*)$/s', (string) $dtd, $m)) {
180
-		return -10;
181
-	}
179
+    if (!preg_match('/^<\?.*?>\s*(.*)$/s', (string) $dtd, $m)) {
180
+        return -10;
181
+    }
182 182
 
183
-	return $m[1];
183
+    return $m[1];
184 184
 }
185 185
 
186 186
 function analyser_dtd_lexeme($dtd, &$dtc, $grammaire) {
187 187
 
188
-	if (!preg_match(_REGEXP_ENTITY_DEF, (string) $dtd, $m)) {
189
-		return -9;
190
-	}
191
-
192
-	[, $s] = $m;
193
-	$n = $dtc->macros[$s];
194
-
195
-	if (is_array($n)) {
196
-		// en cas d'inclusion, l'espace de nom est le meme
197
-		// mais gaffe aux DTD dont l'URL est relative a l'engloblante
198
-		if (
199
-			$n[0] == 'PUBLIC' && !tester_url_absolue($n[1])
200
-		) {
201
-			$n[1] = substr((string) $grammaire, 0, strrpos((string) $grammaire, '/') + 1) . $n[1];
202
-		}
203
-		analyser_dtd($n[1], $n[0], $dtc);
204
-	}
205
-
206
-	return ltrim(substr((string) $dtd, strlen($m[0])));
188
+    if (!preg_match(_REGEXP_ENTITY_DEF, (string) $dtd, $m)) {
189
+        return -9;
190
+    }
191
+
192
+    [, $s] = $m;
193
+    $n = $dtc->macros[$s];
194
+
195
+    if (is_array($n)) {
196
+        // en cas d'inclusion, l'espace de nom est le meme
197
+        // mais gaffe aux DTD dont l'URL est relative a l'engloblante
198
+        if (
199
+            $n[0] == 'PUBLIC' && !tester_url_absolue($n[1])
200
+        ) {
201
+            $n[1] = substr((string) $grammaire, 0, strrpos((string) $grammaire, '/') + 1) . $n[1];
202
+        }
203
+        analyser_dtd($n[1], $n[0], $dtc);
204
+    }
205
+
206
+    return ltrim(substr((string) $dtd, strlen($m[0])));
207 207
 }
208 208
 
209 209
 // il faudrait gerer plus proprement les niveaux d'inclusion:
@@ -211,78 +211,78 @@  discard block
 block discarded – undo
211 211
 
212 212
 function analyser_dtd_data($dtd, &$dtc, $grammaire) {
213 213
 
214
-	if (!preg_match(_REGEXP_INCLUDE_USE, (string) $dtd, $m)) {
215
-		return -11;
216
-	}
217
-	if (
218
-		!preg_match(
219
-			'/^((\s*<!(\[\s*%\s*[^;]*;\s*\[([^]<]*<[^>]*>)*[^]<]*\]\]>)|([^]>]*>))*[^]<]*)\]\]>\s*/s',
220
-			$m[2],
221
-			$r
222
-		)
223
-	) {
224
-		return -12;
225
-	}
226
-
227
-	return $dtc->macros[$m[1]] == 'INCLUDE'
228
-		? $r[1] . substr($m[2], strlen($r[0]))
229
-		: substr($m[2], strlen($r[0]));
214
+    if (!preg_match(_REGEXP_INCLUDE_USE, (string) $dtd, $m)) {
215
+        return -11;
216
+    }
217
+    if (
218
+        !preg_match(
219
+            '/^((\s*<!(\[\s*%\s*[^;]*;\s*\[([^]<]*<[^>]*>)*[^]<]*\]\]>)|([^]>]*>))*[^]<]*)\]\]>\s*/s',
220
+            $m[2],
221
+            $r
222
+        )
223
+    ) {
224
+        return -12;
225
+    }
226
+
227
+    return $dtc->macros[$m[1]] == 'INCLUDE'
228
+        ? $r[1] . substr($m[2], strlen($r[0]))
229
+        : substr($m[2], strlen($r[0]));
230 230
 }
231 231
 
232 232
 function analyser_dtd_notation($dtd, &$dtc, $grammaire) {
233
-	if (!preg_match('/^<!NOTATION.*?>\s*(.*)$/s', (string) $dtd, $m)) {
234
-		return -8;
235
-	}
236
-	spip_logger()->info('analyser_dtd_notation a ecrire');
233
+    if (!preg_match('/^<!NOTATION.*?>\s*(.*)$/s', (string) $dtd, $m)) {
234
+        return -8;
235
+    }
236
+    spip_logger()->info('analyser_dtd_notation a ecrire');
237 237
 
238
-	return $m[1];
238
+    return $m[1];
239 239
 }
240 240
 
241 241
 function analyser_dtd_entity($dtd, &$dtc, $grammaire) {
242
-	if (!preg_match(_REGEXP_ENTITY_DECL, (string) $dtd, $m)) {
243
-		return -2;
244
-	}
245
-
246
-	[$t, $term, $nom, $type, $k1, $k2, $k3, $k4, $k5, $k6, $c, $q, $alt, $dtd] = $m;
247
-
248
-	if (isset($dtc->macros[$nom]) && $dtc->macros[$nom]) {
249
-		return $dtd;
250
-	}
251
-	if (isset($dtc->entites[$nom])) {
252
-		spip_logger()->info("redefinition de l'entite $nom");
253
-	}
254
-	if ($k6) {
255
-		return $k6 . $dtd;
256
-	} // cas du synonyme complet
257
-	$val = expanserEntite(($k2 ? $k3 : ($k4 ? $k5 : $k6)), $dtc->macros);
258
-
259
-	// cas particulier double evaluation: 'PUBLIC "..." "...."'
260
-	if (preg_match('/(PUBLIC|SYSTEM)\s+"([^"]*)"\s*("([^"]*)")?\s*$/s', $val, $r)) {
261
-		[$t, $type, $val, $q, $alt] = $r;
262
-	}
263
-
264
-	if (!$term) {
265
-		$dtc->entites[$nom] = $val;
266
-	} elseif (!$type) {
267
-		$dtc->macros[$nom] = $val;
268
-	} else {
269
-		if ($type == 'SYSTEM' && !$alt) {
270
-			$alt = $val;
271
-		}
272
-		if (!$alt) {
273
-			$dtc->macros[$nom] = $val;
274
-		} else {
275
-			if (
276
-				$type == 'PUBLIC' && !str_contains($alt, '/')
277
-			) {
278
-				$alt = preg_replace(',/[^/]+$,', '/', (string) $grammaire)
279
-					. $alt;
280
-			}
281
-			$dtc->macros[$nom] = [$type, $alt];
282
-		}
283
-	}
284
-
285
-	return $dtd;
242
+    if (!preg_match(_REGEXP_ENTITY_DECL, (string) $dtd, $m)) {
243
+        return -2;
244
+    }
245
+
246
+    [$t, $term, $nom, $type, $k1, $k2, $k3, $k4, $k5, $k6, $c, $q, $alt, $dtd] = $m;
247
+
248
+    if (isset($dtc->macros[$nom]) && $dtc->macros[$nom]) {
249
+        return $dtd;
250
+    }
251
+    if (isset($dtc->entites[$nom])) {
252
+        spip_logger()->info("redefinition de l'entite $nom");
253
+    }
254
+    if ($k6) {
255
+        return $k6 . $dtd;
256
+    } // cas du synonyme complet
257
+    $val = expanserEntite(($k2 ? $k3 : ($k4 ? $k5 : $k6)), $dtc->macros);
258
+
259
+    // cas particulier double evaluation: 'PUBLIC "..." "...."'
260
+    if (preg_match('/(PUBLIC|SYSTEM)\s+"([^"]*)"\s*("([^"]*)")?\s*$/s', $val, $r)) {
261
+        [$t, $type, $val, $q, $alt] = $r;
262
+    }
263
+
264
+    if (!$term) {
265
+        $dtc->entites[$nom] = $val;
266
+    } elseif (!$type) {
267
+        $dtc->macros[$nom] = $val;
268
+    } else {
269
+        if ($type == 'SYSTEM' && !$alt) {
270
+            $alt = $val;
271
+        }
272
+        if (!$alt) {
273
+            $dtc->macros[$nom] = $val;
274
+        } else {
275
+            if (
276
+                $type == 'PUBLIC' && !str_contains($alt, '/')
277
+            ) {
278
+                $alt = preg_replace(',/[^/]+$,', '/', (string) $grammaire)
279
+                    . $alt;
280
+            }
281
+            $dtc->macros[$nom] = [$type, $alt];
282
+        }
283
+    }
284
+
285
+    return $dtd;
286 286
 }
287 287
 
288 288
 // Dresser le tableau des filles potentielles de l'element
@@ -295,71 +295,71 @@  discard block
 block discarded – undo
295 295
 // Fin du controle en finElement
296 296
 
297 297
 function analyser_dtd_element($dtd, &$dtc, $grammaire) {
298
-	if (!preg_match('/^<!ELEMENT\s+([^>\s]+)([^>]*)>\s*(.*)$/s', (string) $dtd, $m)) {
299
-		return -3;
300
-	}
301
-
302
-	[, $nom, $contenu, $dtd] = $m;
303
-	$nom = expanserEntite($nom, $dtc->macros);
304
-
305
-	if (isset($dtc->elements[$nom])) {
306
-		spip_logger()->info("redefinition de l'element $nom dans la DTD");
307
-
308
-		return -4;
309
-	}
310
-	$filles = [];
311
-	$contenu = expanserEntite($contenu, $dtc->macros);
312
-	$val = $contenu ? compilerRegle($contenu) : '(?:EMPTY )';
313
-	if ($val == '(?:EMPTY )') {
314
-		$dtc->regles[$nom] = 'EMPTY';
315
-	} elseif ($val == '(?:ANY )') {
316
-		$dtc->regles[$nom] = 'ANY';
317
-	} else {
318
-		$last = substr((string) $val, -1);
319
-		$dtc->regles[$nom] = preg_match('/ \w/', (string) $val) || (!empty($last) && !str_contains('*+?', $last))
320
-			? "/^$val$/"
321
-			: $last;
322
-		$filles = array_values(preg_split('/\W+/', (string) $val, -1, PREG_SPLIT_NO_EMPTY));
323
-
324
-		foreach ($filles as $k) {
325
-			if (!isset($dtc->peres[$k])) {
326
-				$dtc->peres[$k] = [];
327
-			}
328
-			if (!in_array($nom, $dtc->peres[$k])) {
329
-				$dtc->peres[$k][] = $nom;
330
-			}
331
-		}
332
-	}
333
-	$dtc->pcdata[$nom] = (!str_contains($contenu, '#PCDATA'));
334
-	$dtc->elements[$nom] = $filles;
335
-
336
-	return $dtd;
298
+    if (!preg_match('/^<!ELEMENT\s+([^>\s]+)([^>]*)>\s*(.*)$/s', (string) $dtd, $m)) {
299
+        return -3;
300
+    }
301
+
302
+    [, $nom, $contenu, $dtd] = $m;
303
+    $nom = expanserEntite($nom, $dtc->macros);
304
+
305
+    if (isset($dtc->elements[$nom])) {
306
+        spip_logger()->info("redefinition de l'element $nom dans la DTD");
307
+
308
+        return -4;
309
+    }
310
+    $filles = [];
311
+    $contenu = expanserEntite($contenu, $dtc->macros);
312
+    $val = $contenu ? compilerRegle($contenu) : '(?:EMPTY )';
313
+    if ($val == '(?:EMPTY )') {
314
+        $dtc->regles[$nom] = 'EMPTY';
315
+    } elseif ($val == '(?:ANY )') {
316
+        $dtc->regles[$nom] = 'ANY';
317
+    } else {
318
+        $last = substr((string) $val, -1);
319
+        $dtc->regles[$nom] = preg_match('/ \w/', (string) $val) || (!empty($last) && !str_contains('*+?', $last))
320
+            ? "/^$val$/"
321
+            : $last;
322
+        $filles = array_values(preg_split('/\W+/', (string) $val, -1, PREG_SPLIT_NO_EMPTY));
323
+
324
+        foreach ($filles as $k) {
325
+            if (!isset($dtc->peres[$k])) {
326
+                $dtc->peres[$k] = [];
327
+            }
328
+            if (!in_array($nom, $dtc->peres[$k])) {
329
+                $dtc->peres[$k][] = $nom;
330
+            }
331
+        }
332
+    }
333
+    $dtc->pcdata[$nom] = (!str_contains($contenu, '#PCDATA'));
334
+    $dtc->elements[$nom] = $filles;
335
+
336
+    return $dtd;
337 337
 }
338 338
 
339 339
 
340 340
 function analyser_dtd_attlist($dtd, &$dtc, $grammaire) {
341
-	if (!preg_match('/^<!ATTLIST\s+(\S+)\s+([^>]*)>\s*(.*)/s', (string) $dtd, $m)) {
342
-		return -5;
343
-	}
344
-
345
-	[, $nom, $val, $dtd] = $m;
346
-	$nom = expanserEntite($nom, $dtc->macros);
347
-	$val = expanserEntite($val, $dtc->macros);
348
-	if (!isset($dtc->attributs[$nom])) {
349
-		$dtc->attributs[$nom] = [];
350
-	}
351
-
352
-	if (preg_match_all("/\s*(\S+)\s+(([(][^)]*[)])|(\S+))\s+([^\s']*)(\s*'[^']*')?/", $val, $r2, PREG_SET_ORDER)) {
353
-		foreach ($r2 as $m2) {
354
-			$v = preg_match('/^\w+$/', $m2[2]) ? $m2[2]
355
-				: ('/^' . preg_replace('/\s+/', '', $m2[2]) . '$/');
356
-			$m21 = expanserEntite($m2[1], $dtc->macros);
357
-			$m25 = expanserEntite($m2[5], $dtc->macros);
358
-			$dtc->attributs[$nom][$m21] = [$v, $m25];
359
-		}
360
-	}
361
-
362
-	return $dtd;
341
+    if (!preg_match('/^<!ATTLIST\s+(\S+)\s+([^>]*)>\s*(.*)/s', (string) $dtd, $m)) {
342
+        return -5;
343
+    }
344
+
345
+    [, $nom, $val, $dtd] = $m;
346
+    $nom = expanserEntite($nom, $dtc->macros);
347
+    $val = expanserEntite($val, $dtc->macros);
348
+    if (!isset($dtc->attributs[$nom])) {
349
+        $dtc->attributs[$nom] = [];
350
+    }
351
+
352
+    if (preg_match_all("/\s*(\S+)\s+(([(][^)]*[)])|(\S+))\s+([^\s']*)(\s*'[^']*')?/", $val, $r2, PREG_SET_ORDER)) {
353
+        foreach ($r2 as $m2) {
354
+            $v = preg_match('/^\w+$/', $m2[2]) ? $m2[2]
355
+                : ('/^' . preg_replace('/\s+/', '', $m2[2]) . '$/');
356
+            $m21 = expanserEntite($m2[1], $dtc->macros);
357
+            $m25 = expanserEntite($m2[5], $dtc->macros);
358
+            $dtc->attributs[$nom][$m21] = [$v, $m25];
359
+        }
360
+    }
361
+
362
+    return $dtd;
363 363
 }
364 364
 
365 365
 
@@ -375,26 +375,26 @@  discard block
 block discarded – undo
375 375
  * @return string|array
376 376
  **/
377 377
 function expanserEntite($val, $macros = []) {
378
-	static $vu = [];
379
-	if (!is_string($val)) {
380
-		return $vu;
381
-	}
382
-
383
-	if (preg_match_all(_REGEXP_ENTITY_USE, $val, $r, PREG_SET_ORDER)) {
384
-		foreach ($r as $m) {
385
-			$ent = $m[1];
386
-			// il peut valoir ""
387
-			if (!isset($macros[$ent])) {
388
-				spip_logger()->info("Entite $ent inconnu");
389
-			} else {
390
-				if (!isset($vu[$ent])) {
391
-					$vu[$ent] = 0;
392
-				}
393
-				++$vu[$ent];
394
-				$val = str_replace($m[0], $macros[$ent], $val);
395
-			}
396
-		}
397
-	}
398
-
399
-	return trim(preg_replace('/\s+/', ' ', $val));
378
+    static $vu = [];
379
+    if (!is_string($val)) {
380
+        return $vu;
381
+    }
382
+
383
+    if (preg_match_all(_REGEXP_ENTITY_USE, $val, $r, PREG_SET_ORDER)) {
384
+        foreach ($r as $m) {
385
+            $ent = $m[1];
386
+            // il peut valoir ""
387
+            if (!isset($macros[$ent])) {
388
+                spip_logger()->info("Entite $ent inconnu");
389
+            } else {
390
+                if (!isset($vu[$ent])) {
391
+                    $vu[$ent] = 0;
392
+                }
393
+                ++$vu[$ent];
394
+                $val = str_replace($m[0], $macros[$ent], $val);
395
+            }
396
+        }
397
+    }
398
+
399
+    return trim(preg_replace('/\s+/', ' ', $val));
400 400
 }
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -27,7 +27,7 @@  discard block
 block discarded – undo
27 27
 		$grammaire = find_in_path($grammaire);
28 28
 	}
29 29
 
30
-	$file = _DIR_CACHE_XML . preg_replace('/[^\w.]/', '_', (string) $rotlvl) . '.gz';
30
+	$file = _DIR_CACHE_XML.preg_replace('/[^\w.]/', '_', (string) $rotlvl).'.gz';
31 31
 
32 32
 	if (lire_fichier($file, $r)) {
33 33
 		if (!$grammaire) {
@@ -54,7 +54,7 @@  discard block
 block discarded – undo
54 54
 				$dtc->peres[$k] = $v;
55 55
 			}
56 56
 
57
-			spip_logger()->info("Analyser DTD $avail $grammaire (" . spip_timer('dtd') . ') ' . (is_countable($dtc->macros) ? count($dtc->macros) : 0) . ' macros, ' . (is_countable($dtc->elements) ? count($dtc->elements) : 0) . ' elements, ' . (is_countable($dtc->attributs) ? count($dtc->attributs) : 0) . " listes d'attributs, " . (is_countable($dtc->entites) ? count($dtc->entites) : 0) . ' entites');
57
+			spip_logger()->info("Analyser DTD $avail $grammaire (".spip_timer('dtd').') '.(is_countable($dtc->macros) ? count($dtc->macros) : 0).' macros, '.(is_countable($dtc->elements) ? count($dtc->elements) : 0).' elements, '.(is_countable($dtc->attributs) ? count($dtc->attributs) : 0)." listes d'attributs, ".(is_countable($dtc->entites) ? count($dtc->entites) : 0).' entites');
58 58
 			#	$r = $dtc->regles; ksort($r);foreach($r as $l => $v) {$t=array_keys($dtc->attributs[$l]);echo "<b>$l</b> '$v' ", count($t), " attributs: ", join (', ',$t);$t=$dtc->peres[$l];echo "<br />",count($t), " peres: ", @join (', ',$t), "<br />\n";}exit;
59 59
 			ecrire_fichier($file, serialize($dtc), true);
60 60
 		}
@@ -154,7 +154,7 @@  discard block
 block discarded – undo
154 154
 			};
155 155
 		}
156 156
 		if (!is_string($r)) {
157
-			spip_logger()->info("erreur $r dans la DTD  " . substr($dtd, 0, 80) . '.....');
157
+			spip_logger()->info("erreur $r dans la DTD  ".substr($dtd, 0, 80).'.....');
158 158
 
159 159
 			return false;
160 160
 		}
@@ -198,7 +198,7 @@  discard block
 block discarded – undo
198 198
 		if (
199 199
 			$n[0] == 'PUBLIC' && !tester_url_absolue($n[1])
200 200
 		) {
201
-			$n[1] = substr((string) $grammaire, 0, strrpos((string) $grammaire, '/') + 1) . $n[1];
201
+			$n[1] = substr((string) $grammaire, 0, strrpos((string) $grammaire, '/') + 1).$n[1];
202 202
 		}
203 203
 		analyser_dtd($n[1], $n[0], $dtc);
204 204
 	}
@@ -225,7 +225,7 @@  discard block
 block discarded – undo
225 225
 	}
226 226
 
227 227
 	return $dtc->macros[$m[1]] == 'INCLUDE'
228
-		? $r[1] . substr($m[2], strlen($r[0]))
228
+		? $r[1].substr($m[2], strlen($r[0]))
229 229
 		: substr($m[2], strlen($r[0]));
230 230
 }
231 231
 
@@ -252,7 +252,7 @@  discard block
 block discarded – undo
252 252
 		spip_logger()->info("redefinition de l'entite $nom");
253 253
 	}
254 254
 	if ($k6) {
255
-		return $k6 . $dtd;
255
+		return $k6.$dtd;
256 256
 	} // cas du synonyme complet
257 257
 	$val = expanserEntite(($k2 ? $k3 : ($k4 ? $k5 : $k6)), $dtc->macros);
258 258
 
@@ -352,7 +352,7 @@  discard block
 block discarded – undo
352 352
 	if (preg_match_all("/\s*(\S+)\s+(([(][^)]*[)])|(\S+))\s+([^\s']*)(\s*'[^']*')?/", $val, $r2, PREG_SET_ORDER)) {
353 353
 		foreach ($r2 as $m2) {
354 354
 			$v = preg_match('/^\w+$/', $m2[2]) ? $m2[2]
355
-				: ('/^' . preg_replace('/\s+/', '', $m2[2]) . '$/');
355
+				: ('/^'.preg_replace('/\s+/', '', $m2[2]).'$/');
356 356
 			$m21 = expanserEntite($m2[1], $dtc->macros);
357 357
 			$m25 = expanserEntite($m2[5], $dtc->macros);
358 358
 			$dtc->attributs[$nom][$m21] = [$v, $m25];
Please login to merge, or discard this patch.
ecrire/xml/indenter.php 2 patches
Indentation   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -10,54 +10,54 @@
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 class IndenteurXML {
17
-	public function debutElement($phraseur, $name, $attrs) {
18
-		xml_debutElement($this, $name, $attrs);
19
-	}
20
-
21
-	public function finElement($phraseur, $name) {
22
-		xml_finElement($this, $name);
23
-	}
24
-
25
-	public function textElement($phraseur, $data) {
26
-		xml_textElement($this, $data);
27
-	}
28
-
29
-	public function piElement($phraseur, $target, $data) {
30
-		xml_PiElement($this, $target, $data);
31
-	}
32
-
33
-	public function defaultElement($phraseur, $data) {
34
-		xml_defaultElement($this, $data);
35
-	}
36
-
37
-	public function phraserTout($phraseur, $data) {
38
-		xml_parsestring($this, $data);
39
-	}
40
-
41
-	public $depth = '';
42
-	public $res = '';
43
-	public $err = [];
44
-	public $contenu = [];
45
-	public $ouvrant = [];
46
-	public $reperes = [];
47
-	public $entete = '';
48
-	public $page = '';
49
-	public $dtc = null;
50
-	public $sax = null;
17
+    public function debutElement($phraseur, $name, $attrs) {
18
+        xml_debutElement($this, $name, $attrs);
19
+    }
20
+
21
+    public function finElement($phraseur, $name) {
22
+        xml_finElement($this, $name);
23
+    }
24
+
25
+    public function textElement($phraseur, $data) {
26
+        xml_textElement($this, $data);
27
+    }
28
+
29
+    public function piElement($phraseur, $target, $data) {
30
+        xml_PiElement($this, $target, $data);
31
+    }
32
+
33
+    public function defaultElement($phraseur, $data) {
34
+        xml_defaultElement($this, $data);
35
+    }
36
+
37
+    public function phraserTout($phraseur, $data) {
38
+        xml_parsestring($this, $data);
39
+    }
40
+
41
+    public $depth = '';
42
+    public $res = '';
43
+    public $err = [];
44
+    public $contenu = [];
45
+    public $ouvrant = [];
46
+    public $reperes = [];
47
+    public $entete = '';
48
+    public $page = '';
49
+    public $dtc = null;
50
+    public $sax = null;
51 51
 }
52 52
 
53 53
 function xml_indenter_dist($page, $apply = false) {
54
-	$sax = charger_fonction('sax', 'xml');
55
-	$f = new IndenteurXML();
56
-	$sax($page, $apply, $f);
57
-	if (!$f->err) {
58
-		return $f->entete . $f->res;
59
-	}
60
-	spip_logger()->info('indentation impossible ' . (is_countable($f->err) ? count($f->err) : 0) . ' erreurs de validation');
61
-
62
-	return $f->entete . $f->page;
54
+    $sax = charger_fonction('sax', 'xml');
55
+    $f = new IndenteurXML();
56
+    $sax($page, $apply, $f);
57
+    if (!$f->err) {
58
+        return $f->entete . $f->res;
59
+    }
60
+    spip_logger()->info('indentation impossible ' . (is_countable($f->err) ? count($f->err) : 0) . ' erreurs de validation');
61
+
62
+    return $f->entete . $f->page;
63 63
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -55,9 +55,9 @@
 block discarded – undo
55 55
 	$f = new IndenteurXML();
56 56
 	$sax($page, $apply, $f);
57 57
 	if (!$f->err) {
58
-		return $f->entete . $f->res;
58
+		return $f->entete.$f->res;
59 59
 	}
60
-	spip_logger()->info('indentation impossible ' . (is_countable($f->err) ? count($f->err) : 0) . ' erreurs de validation');
60
+	spip_logger()->info('indentation impossible '.(is_countable($f->err) ? count($f->err) : 0).' erreurs de validation');
61 61
 
62
-	return $f->entete . $f->page;
62
+	return $f->entete.$f->page;
63 63
 }
Please login to merge, or discard this patch.
ecrire/req/pg.exp.php 2 patches
Indentation   +1147 added lines, -1147 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 define('_DEFAULT_DB', 'spip');
@@ -30,154 +30,154 @@  discard block
 block discarded – undo
30 30
 // si ca ne marche toujours pas, echec.
31 31
 
32 32
 function req_pg_dist($addr, $port, $login, #[\SensitiveParameter] $pass, $db = '', $prefixe = '') {
33
-	static $last_connect = [];
34
-	if (!extension_loaded('pgsql')) {
35
-		return false;
36
-	}
37
-
38
-	// si provient de selectdb
39
-	if (empty($addr) && empty($port) && empty($login) && empty($pass)) {
40
-		foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
41
-			${$a} = $last_connect[$a];
42
-		}
43
-	}
44
-	[$host, $p] = array_pad(explode(';', (string) $addr), 2, null);
45
-	$port = $p > 0 ? " port=$p" : '';
46
-	$erreurs = [];
47
-	if ($db) {
48
-		@$link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW);
49
-	} elseif (!@$link = pg_connect("host=$host$port user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) {
50
-		$erreurs[] = pg_last_error();
51
-		if (@$link = pg_connect("host=$host$port dbname=$login user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) {
52
-			$db = $login;
53
-		} else {
54
-			$erreurs[] = pg_last_error();
55
-			$db = _DEFAULT_DB;
56
-			$link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW);
57
-		}
58
-	}
59
-	if (!$link) {
60
-		$erreurs[] = pg_last_error();
61
-		foreach ($erreurs as $e) {
62
-			spip_logger('pg')->emergency('Echec pg_connect. Erreur : ' . $e);
63
-		}
64
-
65
-		return false;
66
-	}
67
-
68
-	if ($link) {
69
-		$last_connect = [
70
-			'addr' => $addr,
71
-			'port' => $port,
72
-			'login' => $login,
73
-			'pass' => $pass,
74
-			'db' => $db,
75
-			'prefixe' => $prefixe,
76
-		];
77
-	}
78
-
79
-	spip_logger('pg')->debug(
80
-		"Connexion vers $host, base $db, prefixe $prefixe " . ($link ? 'operationnelle' : 'impossible'),
81
-	);
82
-
83
-	return $link ? [
84
-		'db' => $db,
85
-		'prefixe' => $prefixe ?: $db,
86
-		'link' => $link,
87
-	] : false;
33
+    static $last_connect = [];
34
+    if (!extension_loaded('pgsql')) {
35
+        return false;
36
+    }
37
+
38
+    // si provient de selectdb
39
+    if (empty($addr) && empty($port) && empty($login) && empty($pass)) {
40
+        foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
41
+            ${$a} = $last_connect[$a];
42
+        }
43
+    }
44
+    [$host, $p] = array_pad(explode(';', (string) $addr), 2, null);
45
+    $port = $p > 0 ? " port=$p" : '';
46
+    $erreurs = [];
47
+    if ($db) {
48
+        @$link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW);
49
+    } elseif (!@$link = pg_connect("host=$host$port user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) {
50
+        $erreurs[] = pg_last_error();
51
+        if (@$link = pg_connect("host=$host$port dbname=$login user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) {
52
+            $db = $login;
53
+        } else {
54
+            $erreurs[] = pg_last_error();
55
+            $db = _DEFAULT_DB;
56
+            $link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW);
57
+        }
58
+    }
59
+    if (!$link) {
60
+        $erreurs[] = pg_last_error();
61
+        foreach ($erreurs as $e) {
62
+            spip_logger('pg')->emergency('Echec pg_connect. Erreur : ' . $e);
63
+        }
64
+
65
+        return false;
66
+    }
67
+
68
+    if ($link) {
69
+        $last_connect = [
70
+            'addr' => $addr,
71
+            'port' => $port,
72
+            'login' => $login,
73
+            'pass' => $pass,
74
+            'db' => $db,
75
+            'prefixe' => $prefixe,
76
+        ];
77
+    }
78
+
79
+    spip_logger('pg')->debug(
80
+        "Connexion vers $host, base $db, prefixe $prefixe " . ($link ? 'operationnelle' : 'impossible'),
81
+    );
82
+
83
+    return $link ? [
84
+        'db' => $db,
85
+        'prefixe' => $prefixe ?: $db,
86
+        'link' => $link,
87
+    ] : false;
88 88
 }
89 89
 
90 90
 $GLOBALS['spip_pg_functions_1'] = [
91
-	'alter' => 'spip_pg_alter',
92
-	'count' => 'spip_pg_count',
93
-	'countsel' => 'spip_pg_countsel',
94
-	'create' => 'spip_pg_create',
95
-	'create_base' => 'spip_pg_create_base',
96
-	'create_view' => 'spip_pg_create_view',
97
-	'date_proche' => 'spip_pg_date_proche',
98
-	'delete' => 'spip_pg_delete',
99
-	'drop_table' => 'spip_pg_drop_table',
100
-	'drop_view' => 'spip_pg_drop_view',
101
-	'errno' => 'spip_pg_errno',
102
-	'error' => 'spip_pg_error',
103
-	'explain' => 'spip_pg_explain',
104
-	'fetch' => 'spip_pg_fetch',
105
-	'seek' => 'spip_pg_seek',
106
-	'free' => 'spip_pg_free',
107
-	'hex' => 'spip_pg_hex',
108
-	'in' => 'spip_pg_in',
109
-	'insert' => 'spip_pg_insert',
110
-	'insertq' => 'spip_pg_insertq',
111
-	'insertq_multi' => 'spip_pg_insertq_multi',
112
-	'listdbs' => 'spip_pg_listdbs',
113
-	'multi' => 'spip_pg_multi',
114
-	'optimize' => 'spip_pg_optimize',
115
-	'query' => 'spip_pg_query',
116
-	'quote' => 'spip_pg_quote',
117
-	'replace' => 'spip_pg_replace',
118
-	'replace_multi' => 'spip_pg_replace_multi',
119
-	'select' => 'spip_pg_select',
120
-	'selectdb' => 'spip_pg_selectdb',
121
-	'set_connect_charset' => 'spip_pg_set_connect_charset',
122
-	'showbase' => 'spip_pg_showbase',
123
-	'showtable' => 'spip_pg_showtable',
124
-	'update' => 'spip_pg_update',
125
-	'updateq' => 'spip_pg_updateq',
91
+    'alter' => 'spip_pg_alter',
92
+    'count' => 'spip_pg_count',
93
+    'countsel' => 'spip_pg_countsel',
94
+    'create' => 'spip_pg_create',
95
+    'create_base' => 'spip_pg_create_base',
96
+    'create_view' => 'spip_pg_create_view',
97
+    'date_proche' => 'spip_pg_date_proche',
98
+    'delete' => 'spip_pg_delete',
99
+    'drop_table' => 'spip_pg_drop_table',
100
+    'drop_view' => 'spip_pg_drop_view',
101
+    'errno' => 'spip_pg_errno',
102
+    'error' => 'spip_pg_error',
103
+    'explain' => 'spip_pg_explain',
104
+    'fetch' => 'spip_pg_fetch',
105
+    'seek' => 'spip_pg_seek',
106
+    'free' => 'spip_pg_free',
107
+    'hex' => 'spip_pg_hex',
108
+    'in' => 'spip_pg_in',
109
+    'insert' => 'spip_pg_insert',
110
+    'insertq' => 'spip_pg_insertq',
111
+    'insertq_multi' => 'spip_pg_insertq_multi',
112
+    'listdbs' => 'spip_pg_listdbs',
113
+    'multi' => 'spip_pg_multi',
114
+    'optimize' => 'spip_pg_optimize',
115
+    'query' => 'spip_pg_query',
116
+    'quote' => 'spip_pg_quote',
117
+    'replace' => 'spip_pg_replace',
118
+    'replace_multi' => 'spip_pg_replace_multi',
119
+    'select' => 'spip_pg_select',
120
+    'selectdb' => 'spip_pg_selectdb',
121
+    'set_connect_charset' => 'spip_pg_set_connect_charset',
122
+    'showbase' => 'spip_pg_showbase',
123
+    'showtable' => 'spip_pg_showtable',
124
+    'update' => 'spip_pg_update',
125
+    'updateq' => 'spip_pg_updateq',
126 126
 ];
127 127
 
128 128
 // Par ou ca passe une fois les traductions faites
129 129
 function spip_pg_trace_query($query, $serveur = '') {
130
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
131
-	$prefixe = $connexion['prefixe'];
132
-	$link = $connexion['link'];
133
-	$db = $connexion['db'];
134
-
135
-	if (isset($_GET['var_profile'])) {
136
-		include_spip('public/tracer');
137
-		$t = trace_query_start();
138
-		$e = '';
139
-	} else {
140
-		$t = 0;
141
-	}
142
-
143
-	$connexion['last'] = $query;
144
-	$r = spip_pg_query_simple($link, $query);
145
-
146
-	// Log de l'erreur eventuelle
147
-	if ($e = spip_pg_errno($serveur)) {
148
-		$e .= spip_pg_error($query, $serveur);
149
-	} // et du fautif
150
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
130
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
131
+    $prefixe = $connexion['prefixe'];
132
+    $link = $connexion['link'];
133
+    $db = $connexion['db'];
134
+
135
+    if (isset($_GET['var_profile'])) {
136
+        include_spip('public/tracer');
137
+        $t = trace_query_start();
138
+        $e = '';
139
+    } else {
140
+        $t = 0;
141
+    }
142
+
143
+    $connexion['last'] = $query;
144
+    $r = spip_pg_query_simple($link, $query);
145
+
146
+    // Log de l'erreur eventuelle
147
+    if ($e = spip_pg_errno($serveur)) {
148
+        $e .= spip_pg_error($query, $serveur);
149
+    } // et du fautif
150
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
151 151
 }
152 152
 
153 153
 // Fonction de requete generale quand on est sur que c'est SQL standard.
154 154
 // Elle change juste le noms des tables ($table_prefix) dans le FROM etc
155 155
 
156 156
 function spip_pg_query($query, $serveur = '', $requeter = true) {
157
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
158
-	$prefixe = $connexion['prefixe'];
159
-	$link = $connexion['link'];
160
-	$db = $connexion['db'];
161
-
162
-	if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', (string) $query, $regs)) {
163
-		$suite = strstr((string) $query, (string) $regs[0]);
164
-		$query = substr((string) $query, 0, -strlen($suite));
165
-	} else {
166
-		$suite = '';
167
-	}
168
-	$query = preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', (string) $query) . $suite;
169
-
170
-	// renvoyer la requete inerte si demandee
171
-	if (!$requeter) {
172
-		return $query;
173
-	}
174
-
175
-	return spip_pg_trace_query($query, $serveur);
157
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
158
+    $prefixe = $connexion['prefixe'];
159
+    $link = $connexion['link'];
160
+    $db = $connexion['db'];
161
+
162
+    if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', (string) $query, $regs)) {
163
+        $suite = strstr((string) $query, (string) $regs[0]);
164
+        $query = substr((string) $query, 0, -strlen($suite));
165
+    } else {
166
+        $suite = '';
167
+    }
168
+    $query = preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', (string) $query) . $suite;
169
+
170
+    // renvoyer la requete inerte si demandee
171
+    if (!$requeter) {
172
+        return $query;
173
+    }
174
+
175
+    return spip_pg_trace_query($query, $serveur);
176 176
 }
177 177
 
178 178
 function spip_pg_query_simple($link, $query) {
179
-	#spip_logger('pg')->debug(var_export($query,true));
180
-	return pg_query($link, $query);
179
+    #spip_logger('pg')->debug(var_export($query,true));
180
+    return pg_query($link, $query);
181 181
 }
182 182
 
183 183
 /*
@@ -189,192 +189,192 @@  discard block
 block discarded – undo
189 189
  * de requetes showtable intempestives
190 190
  */
191 191
 function spip_pg_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') {
192
-	static $tables = [];
193
-
194
-	if (!isset($tables[$table])) {
195
-		if (!$desc) {
196
-			$trouver_table = charger_fonction('trouver_table', 'base');
197
-			$desc = $trouver_table($table, $serveur);
198
-			// si pas de description, on ne fait rien, ou on die() ?
199
-			if (!$desc) {
200
-				return $couples;
201
-			}
202
-		}
203
-
204
-		// recherche des champs avec simplement 'TIMESTAMP'
205
-		// cependant, il faudra peut etre etendre
206
-		// avec la gestion de DEFAULT et ON UPDATE
207
-		// mais ceux-ci ne sont pas utilises dans le core
208
-		$tables[$table] = [];
209
-		foreach ($desc['field'] as $k => $v) {
210
-			$v = strtolower(ltrim((string) $v));
211
-			// ne pas ajouter de timestamp now() si un default est specifie
212
-			if (str_starts_with($v, 'timestamp') && !str_contains($v, 'default')) {
213
-				$tables[$table][] = $k;
214
-			}
215
-		}
216
-	}
217
-
218
-	// ajout des champs type 'timestamp' absents
219
-	foreach ($tables[$table] as $maj) {
220
-		if (!array_key_exists($maj, $couples)) {
221
-			$couples[$maj] = 'NOW()';
222
-		}
223
-	}
224
-
225
-	return $couples;
192
+    static $tables = [];
193
+
194
+    if (!isset($tables[$table])) {
195
+        if (!$desc) {
196
+            $trouver_table = charger_fonction('trouver_table', 'base');
197
+            $desc = $trouver_table($table, $serveur);
198
+            // si pas de description, on ne fait rien, ou on die() ?
199
+            if (!$desc) {
200
+                return $couples;
201
+            }
202
+        }
203
+
204
+        // recherche des champs avec simplement 'TIMESTAMP'
205
+        // cependant, il faudra peut etre etendre
206
+        // avec la gestion de DEFAULT et ON UPDATE
207
+        // mais ceux-ci ne sont pas utilises dans le core
208
+        $tables[$table] = [];
209
+        foreach ($desc['field'] as $k => $v) {
210
+            $v = strtolower(ltrim((string) $v));
211
+            // ne pas ajouter de timestamp now() si un default est specifie
212
+            if (str_starts_with($v, 'timestamp') && !str_contains($v, 'default')) {
213
+                $tables[$table][] = $k;
214
+            }
215
+        }
216
+    }
217
+
218
+    // ajout des champs type 'timestamp' absents
219
+    foreach ($tables[$table] as $maj) {
220
+        if (!array_key_exists($maj, $couples)) {
221
+            $couples[$maj] = 'NOW()';
222
+        }
223
+    }
224
+
225
+    return $couples;
226 226
 }
227 227
 
228 228
 
229 229
 // Alter en PG ne traite pas les index
230 230
 function spip_pg_alter($query, $serveur = '', $requeter = true) {
231
-	// il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
232
-	// tout en cassant en deux alter distincts "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"...
233
-	// ou revoir l'api de sql_alter en creant un
234
-	// sql_alter_table($table,array($actions));
235
-	if (!preg_match('/\s*((\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', (string) $query, $regs)) {
236
-		spip_logger('pg')->error("$query mal comprise");
237
-
238
-		return false;
239
-	}
240
-	$debut = $regs[1];
241
-	$table = $regs[3];
242
-	$suite = $regs[4];
243
-	$todo = explode(',', $suite);
244
-	// on remet les morceaux dechires ensembles... que c'est laid !
245
-	$todo2 = [];
246
-	$i = 0;
247
-	$ouverte = false;
248
-	while ($do = array_shift($todo)) {
249
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
250
-		$o = (str_contains($do, '('));
251
-		$f = (str_contains($do, ')'));
252
-		if ($o && !$f) {
253
-			$ouverte = true;
254
-		} elseif ($f) {
255
-			$ouverte = false;
256
-		}
257
-		if (!$ouverte) {
258
-			$i++;
259
-		}
260
-	}
261
-	$todo = $todo2;
262
-	$query = $debut . ' ' . array_shift($todo);
263
-
264
-	if (!preg_match('/^\s*(IGNORE\s*)?TABLE\s+(\w+)\s+(ADD|DROP|CHANGE|MODIFY|RENAME)\s*(.*)$/is', $query, $r)) {
265
-		spip_logger('pg')->error("$query incompris");
266
-	} else {
267
-		if ($r[1]) {
268
-			spip_logger('pg')->warning("j'ignore IGNORE dans $query");
269
-		}
270
-		$f = 'spip_pg_alter_' . strtolower($r[3]);
271
-		if (function_exists($f)) {
272
-			$f($r[2], $r[4], $serveur, $requeter);
273
-		} else {
274
-			spip_logger('pg')->error("$query non prevu");
275
-		}
276
-	}
277
-	// Alter a plusieurs args. Faudrait optimiser.
278
-	if ($todo) {
279
-		spip_pg_alter("TABLE $table " . implode(',', $todo));
280
-	}
231
+    // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
232
+    // tout en cassant en deux alter distincts "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"...
233
+    // ou revoir l'api de sql_alter en creant un
234
+    // sql_alter_table($table,array($actions));
235
+    if (!preg_match('/\s*((\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', (string) $query, $regs)) {
236
+        spip_logger('pg')->error("$query mal comprise");
237
+
238
+        return false;
239
+    }
240
+    $debut = $regs[1];
241
+    $table = $regs[3];
242
+    $suite = $regs[4];
243
+    $todo = explode(',', $suite);
244
+    // on remet les morceaux dechires ensembles... que c'est laid !
245
+    $todo2 = [];
246
+    $i = 0;
247
+    $ouverte = false;
248
+    while ($do = array_shift($todo)) {
249
+        $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
250
+        $o = (str_contains($do, '('));
251
+        $f = (str_contains($do, ')'));
252
+        if ($o && !$f) {
253
+            $ouverte = true;
254
+        } elseif ($f) {
255
+            $ouverte = false;
256
+        }
257
+        if (!$ouverte) {
258
+            $i++;
259
+        }
260
+    }
261
+    $todo = $todo2;
262
+    $query = $debut . ' ' . array_shift($todo);
263
+
264
+    if (!preg_match('/^\s*(IGNORE\s*)?TABLE\s+(\w+)\s+(ADD|DROP|CHANGE|MODIFY|RENAME)\s*(.*)$/is', $query, $r)) {
265
+        spip_logger('pg')->error("$query incompris");
266
+    } else {
267
+        if ($r[1]) {
268
+            spip_logger('pg')->warning("j'ignore IGNORE dans $query");
269
+        }
270
+        $f = 'spip_pg_alter_' . strtolower($r[3]);
271
+        if (function_exists($f)) {
272
+            $f($r[2], $r[4], $serveur, $requeter);
273
+        } else {
274
+            spip_logger('pg')->error("$query non prevu");
275
+        }
276
+    }
277
+    // Alter a plusieurs args. Faudrait optimiser.
278
+    if ($todo) {
279
+        spip_pg_alter("TABLE $table " . implode(',', $todo));
280
+    }
281 281
 }
282 282
 
283 283
 function spip_pg_alter_change($table, $arg, $serveur = '', $requeter = true) {
284
-	if (!preg_match('/^`?(\w+)`?\s+`?(\w+)`?\s+(.*?)\s*(DEFAULT .*?)?(NOT\s+NULL)?\s*(DEFAULT .*?)?$/i', (string) $arg, $r)) {
285
-		spip_logger('pg')->error("alter change: $arg  incompris");
286
-	} else {
287
-		[, $old, $new, $type, $default, $null, $def2] = $r;
288
-		$actions = ["ALTER $old TYPE " . mysql2pg_type($type)];
289
-		$actions[] = $null ? "ALTER $old SET NOT NULL" : "ALTER $old DROP NOT NULL";
290
-
291
-		if ($d = ($default ?: $def2)) {
292
-			$actions[] = "ALTER $old SET $d";
293
-		} else {
294
-			$actions[] = "ALTER $old DROP DEFAULT";
295
-		}
296
-
297
-		spip_pg_query("ALTER TABLE $table " . implode(', ', $actions));
298
-
299
-		if ($old !== $new) {
300
-			spip_pg_query("ALTER TABLE $table RENAME $old TO $new", $serveur);
301
-		}
302
-	}
284
+    if (!preg_match('/^`?(\w+)`?\s+`?(\w+)`?\s+(.*?)\s*(DEFAULT .*?)?(NOT\s+NULL)?\s*(DEFAULT .*?)?$/i', (string) $arg, $r)) {
285
+        spip_logger('pg')->error("alter change: $arg  incompris");
286
+    } else {
287
+        [, $old, $new, $type, $default, $null, $def2] = $r;
288
+        $actions = ["ALTER $old TYPE " . mysql2pg_type($type)];
289
+        $actions[] = $null ? "ALTER $old SET NOT NULL" : "ALTER $old DROP NOT NULL";
290
+
291
+        if ($d = ($default ?: $def2)) {
292
+            $actions[] = "ALTER $old SET $d";
293
+        } else {
294
+            $actions[] = "ALTER $old DROP DEFAULT";
295
+        }
296
+
297
+        spip_pg_query("ALTER TABLE $table " . implode(', ', $actions));
298
+
299
+        if ($old !== $new) {
300
+            spip_pg_query("ALTER TABLE $table RENAME $old TO $new", $serveur);
301
+        }
302
+    }
303 303
 }
304 304
 
305 305
 function spip_pg_alter_add($table, $arg, $serveur = '', $requeter = true) {
306
-	$nom_index = null;
307
-	if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*(.*)$/', (string) $arg, $r)) {
308
-		spip_logger('pg')->error("alter add $arg  incompris");
309
-
310
-		return null;
311
-	}
312
-	if (!$r[1] || $r[1] == 'COLUMN') {
313
-		preg_match('/`?(\w+)`?(.*)/', $r[2], $m);
314
-		if (preg_match('/^(.*)(BEFORE|AFTER|FIRST)(.*)$/is', $m[2], $n)) {
315
-			$m[2] = $n[1];
316
-		}
317
-
318
-		return spip_pg_query("ALTER TABLE $table ADD " . $m[1] . ' ' . mysql2pg_type($m[2]), $serveur, $requeter);
319
-	} elseif ($r[1][0] == 'P') {
320
-		// la primary peut etre sur plusieurs champs
321
-		$r[2] = trim(str_replace('`', '', $r[2]));
322
-		$m = ($r[2][0] == '(') ? substr($r[2], 1, -1) : $r[2];
323
-
324
-		return spip_pg_query(
325
-			"ALTER TABLE $table ADD CONSTRAINT $table" . '_pkey PRIMARY KEY (' . $m . ')',
326
-			$serveur,
327
-			$requeter
328
-		);
329
-	} else {
330
-		preg_match('/([^\s,]*)\s*(.*)?/', $r[2], $m);
331
-		// peut etre "(colonne)" ou "nom_index (colonnes)"
332
-		// bug potentiel si qqn met "(colonne, colonne)"
333
-		//
334
-		// nom_index (colonnes)
335
-		if ($m[2]) {
336
-			$colonnes = substr($m[2], 1, -1);
337
-			$nom_index = $m[1];
338
-		} else {
339
-			// (colonne)
340
-			if ($m[1][0] == '(') {
341
-				$colonnes = substr($m[1], 1, -1);
342
-				if (str_contains(',', $colonnes)) {
343
-					spip_logger('pg')->error('PG : Erreur, impossible de creer un index sur plusieurs colonnes'
344
-						. " sans qu'il ait de nom ($table, ($colonnes))");
345
-				} else {
346
-					$nom_index = $colonnes;
347
-				}
348
-			} // nom_index
349
-			else {
350
-				$nom_index = $colonnes = $m[1];
351
-			}
352
-		}
353
-
354
-		return spip_pg_create_index($nom_index, $table, $colonnes, $serveur, $requeter);
355
-	}
306
+    $nom_index = null;
307
+    if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*(.*)$/', (string) $arg, $r)) {
308
+        spip_logger('pg')->error("alter add $arg  incompris");
309
+
310
+        return null;
311
+    }
312
+    if (!$r[1] || $r[1] == 'COLUMN') {
313
+        preg_match('/`?(\w+)`?(.*)/', $r[2], $m);
314
+        if (preg_match('/^(.*)(BEFORE|AFTER|FIRST)(.*)$/is', $m[2], $n)) {
315
+            $m[2] = $n[1];
316
+        }
317
+
318
+        return spip_pg_query("ALTER TABLE $table ADD " . $m[1] . ' ' . mysql2pg_type($m[2]), $serveur, $requeter);
319
+    } elseif ($r[1][0] == 'P') {
320
+        // la primary peut etre sur plusieurs champs
321
+        $r[2] = trim(str_replace('`', '', $r[2]));
322
+        $m = ($r[2][0] == '(') ? substr($r[2], 1, -1) : $r[2];
323
+
324
+        return spip_pg_query(
325
+            "ALTER TABLE $table ADD CONSTRAINT $table" . '_pkey PRIMARY KEY (' . $m . ')',
326
+            $serveur,
327
+            $requeter
328
+        );
329
+    } else {
330
+        preg_match('/([^\s,]*)\s*(.*)?/', $r[2], $m);
331
+        // peut etre "(colonne)" ou "nom_index (colonnes)"
332
+        // bug potentiel si qqn met "(colonne, colonne)"
333
+        //
334
+        // nom_index (colonnes)
335
+        if ($m[2]) {
336
+            $colonnes = substr($m[2], 1, -1);
337
+            $nom_index = $m[1];
338
+        } else {
339
+            // (colonne)
340
+            if ($m[1][0] == '(') {
341
+                $colonnes = substr($m[1], 1, -1);
342
+                if (str_contains(',', $colonnes)) {
343
+                    spip_logger('pg')->error('PG : Erreur, impossible de creer un index sur plusieurs colonnes'
344
+                        . " sans qu'il ait de nom ($table, ($colonnes))");
345
+                } else {
346
+                    $nom_index = $colonnes;
347
+                }
348
+            } // nom_index
349
+            else {
350
+                $nom_index = $colonnes = $m[1];
351
+            }
352
+        }
353
+
354
+        return spip_pg_create_index($nom_index, $table, $colonnes, $serveur, $requeter);
355
+    }
356 356
 }
357 357
 
358 358
 function spip_pg_alter_drop($table, $arg, $serveur = '', $requeter = true) {
359
-	if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*`?(\w*)`?/', (string) $arg, $r)) {
360
-		spip_logger('pg')->error("alter drop: $arg  incompris");
361
-	} else {
362
-		if (!$r[1] || $r[1] == 'COLUMN') {
363
-			return spip_pg_query("ALTER TABLE $table DROP " . $r[2], $serveur);
364
-		} elseif ($r[1][0] == 'P') {
365
-			return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table" . '_pkey', $serveur);
366
-		} else {
367
-			return spip_pg_query('DROP INDEX ' . $table . '_' . $r[2], $serveur);
368
-		}
369
-	}
359
+    if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*`?(\w*)`?/', (string) $arg, $r)) {
360
+        spip_logger('pg')->error("alter drop: $arg  incompris");
361
+    } else {
362
+        if (!$r[1] || $r[1] == 'COLUMN') {
363
+            return spip_pg_query("ALTER TABLE $table DROP " . $r[2], $serveur);
364
+        } elseif ($r[1][0] == 'P') {
365
+            return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table" . '_pkey', $serveur);
366
+        } else {
367
+            return spip_pg_query('DROP INDEX ' . $table . '_' . $r[2], $serveur);
368
+        }
369
+    }
370 370
 }
371 371
 
372 372
 function spip_pg_alter_modify($table, $arg, $serveur = '', $requeter = true) {
373
-	if (!preg_match('/^`?(\w+)`?\s+(.*)$/', (string) $arg, $r)) {
374
-		spip_logger('pg')->error("alter modify: $arg  incompris");
375
-	} else {
376
-		return spip_pg_alter_change($table, $r[1] . ' ' . $arg, $serveur = '', $requeter = true);
377
-	}
373
+    if (!preg_match('/^`?(\w+)`?\s+(.*)$/', (string) $arg, $r)) {
374
+        spip_logger('pg')->error("alter modify: $arg  incompris");
375
+    } else {
376
+        return spip_pg_alter_change($table, $r[1] . ' ' . $arg, $serveur = '', $requeter = true);
377
+    }
378 378
 }
379 379
 
380 380
 // attention (en pg) :
@@ -382,17 +382,17 @@  discard block
 block discarded – undo
382 382
 // - alter table A rename X to Y = changer le nom de la colonne X en Y
383 383
 // pour l'instant, traiter simplement RENAME TO X
384 384
 function spip_pg_alter_rename($table, $arg, $serveur = '', $requeter = true) {
385
-	$rename = '';
386
-	// si TO, mais pas au debut
387
-	if (!stripos((string) $arg, 'TO ')) {
388
-		$rename = $arg;
389
-	} elseif (preg_match('/^(TO)\s*`?(\w*)`?/', (string) $arg, $r)) {
390
-		$rename = $r[2];
391
-	} else {
392
-		spip_logger('pg')->error("alter rename: $arg  incompris");
393
-	}
394
-
395
-	return $rename ? spip_pg_query("ALTER TABLE $table RENAME TO $rename") : false;
385
+    $rename = '';
386
+    // si TO, mais pas au debut
387
+    if (!stripos((string) $arg, 'TO ')) {
388
+        $rename = $arg;
389
+    } elseif (preg_match('/^(TO)\s*`?(\w*)`?/', (string) $arg, $r)) {
390
+        $rename = $r[2];
391
+    } else {
392
+        spip_logger('pg')->error("alter rename: $arg  incompris");
393
+    }
394
+
395
+    return $rename ? spip_pg_query("ALTER TABLE $table RENAME TO $rename") : false;
396 396
 }
397 397
 
398 398
 
@@ -408,57 +408,57 @@  discard block
 block discarded – undo
408 408
  * @return bool ou requete
409 409
  */
410 410
 function spip_pg_create_index($nom, $table, $champs, $serveur = '', $requeter = true) {
411
-	if (!($nom || $table || $champs)) {
412
-		spip_logger('pg')->error(
413
-			"Champ manquant pour creer un index pg ($nom, $table, (" . @implode(',', $champs) . '))',
414
-		);
415
-
416
-		return false;
417
-	}
418
-
419
-	$nom = str_replace('`', '', $nom);
420
-	$champs = str_replace('`', '', (string) $champs);
421
-
422
-	// PG ne differentie pas noms des index en fonction des tables
423
-	// il faut donc creer des noms uniques d'index pour une base pg
424
-	$nom = $table . '_' . $nom;
425
-	// enlever d'eventuelles parentheses deja presentes sur champs
426
-	if (!is_array($champs)) {
427
-		if ($champs[0] == '(') {
428
-			$champs = substr($champs, 1, -1);
429
-		}
430
-		$champs = [$champs];
431
-	}
432
-	$query = "CREATE INDEX $nom ON $table (" . implode(',', $champs) . ')';
433
-	if (!$requeter) {
434
-		return $query;
435
-	}
436
-
437
-	return spip_pg_query($query, $serveur, $requeter);
411
+    if (!($nom || $table || $champs)) {
412
+        spip_logger('pg')->error(
413
+            "Champ manquant pour creer un index pg ($nom, $table, (" . @implode(',', $champs) . '))',
414
+        );
415
+
416
+        return false;
417
+    }
418
+
419
+    $nom = str_replace('`', '', $nom);
420
+    $champs = str_replace('`', '', (string) $champs);
421
+
422
+    // PG ne differentie pas noms des index en fonction des tables
423
+    // il faut donc creer des noms uniques d'index pour une base pg
424
+    $nom = $table . '_' . $nom;
425
+    // enlever d'eventuelles parentheses deja presentes sur champs
426
+    if (!is_array($champs)) {
427
+        if ($champs[0] == '(') {
428
+            $champs = substr($champs, 1, -1);
429
+        }
430
+        $champs = [$champs];
431
+    }
432
+    $query = "CREATE INDEX $nom ON $table (" . implode(',', $champs) . ')';
433
+    if (!$requeter) {
434
+        return $query;
435
+    }
436
+
437
+    return spip_pg_query($query, $serveur, $requeter);
438 438
 }
439 439
 
440 440
 
441 441
 function spip_pg_explain($query, $serveur = '', $requeter = true) {
442
-	if (!str_starts_with(ltrim((string) $query), 'SELECT')) {
443
-		return [];
444
-	}
445
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
446
-	$prefixe = $connexion['prefixe'];
447
-	$link = $connexion['link'];
448
-	if (preg_match('/\s(SET|VALUES|WHERE)\s/i', (string) $query, $regs)) {
449
-		$suite = strstr((string) $query, (string) $regs[0]);
450
-		$query = substr((string) $query, 0, -strlen($suite));
451
-	} else {
452
-		$suite = '';
453
-	}
454
-	$query = 'EXPLAIN ' . preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', (string) $query) . $suite;
455
-
456
-	if (!$requeter) {
457
-		return $query;
458
-	}
459
-	$r = spip_pg_query_simple($link, $query);
460
-
461
-	return spip_pg_fetch($r, null, $serveur);
442
+    if (!str_starts_with(ltrim((string) $query), 'SELECT')) {
443
+        return [];
444
+    }
445
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
446
+    $prefixe = $connexion['prefixe'];
447
+    $link = $connexion['link'];
448
+    if (preg_match('/\s(SET|VALUES|WHERE)\s/i', (string) $query, $regs)) {
449
+        $suite = strstr((string) $query, (string) $regs[0]);
450
+        $query = substr((string) $query, 0, -strlen($suite));
451
+    } else {
452
+        $suite = '';
453
+    }
454
+    $query = 'EXPLAIN ' . preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', (string) $query) . $suite;
455
+
456
+    if (!$requeter) {
457
+        return $query;
458
+    }
459
+    $r = spip_pg_query_simple($link, $query);
460
+
461
+    return spip_pg_fetch($r, null, $serveur);
462 462
 }
463 463
 
464 464
 
@@ -477,88 +477,88 @@  discard block
 block discarded – undo
477 477
  *     - False en cas d'erreur.
478 478
  **/
479 479
 function spip_pg_selectdb($db, $serveur = '', $requeter = true) {
480
-	// se connecter a la base indiquee
481
-	// avec les identifiants connus
482
-	$index = $serveur ? strtolower($serveur) : 0;
480
+    // se connecter a la base indiquee
481
+    // avec les identifiants connus
482
+    $index = $serveur ? strtolower($serveur) : 0;
483 483
 
484
-	if (($link = spip_connect_db('', '', '', '', $db, 'pg', '', '')) && (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link)) {
485
-		return $db;
486
-	}
484
+    if (($link = spip_connect_db('', '', '', '', $db, 'pg', '', '')) && (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link)) {
485
+        return $db;
486
+    }
487 487
 
488
-	return false;
488
+    return false;
489 489
 }
490 490
 
491 491
 // Qu'une seule base pour le moment
492 492
 
493 493
 function spip_pg_listdbs($serveur) {
494
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
495
-	$link = $connexion['link'];
496
-	$dbs = [];
497
-	$res = spip_pg_query_simple($link, 'select * From pg_database');
498
-	while ($row = pg_fetch_array($res, null, PGSQL_NUM)) {
499
-		$dbs[] = reset($row);
500
-	}
501
-
502
-	return $dbs;
494
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
495
+    $link = $connexion['link'];
496
+    $dbs = [];
497
+    $res = spip_pg_query_simple($link, 'select * From pg_database');
498
+    while ($row = pg_fetch_array($res, null, PGSQL_NUM)) {
499
+        $dbs[] = reset($row);
500
+    }
501
+
502
+    return $dbs;
503 503
 }
504 504
 
505 505
 function spip_pg_select(
506
-	$select,
507
-	$from,
508
-	$where = '',
509
-	$groupby = [],
510
-	$orderby = '',
511
-	$limit = '',
512
-	$having = '',
513
-	$serveur = '',
514
-	$requeter = true
506
+    $select,
507
+    $from,
508
+    $where = '',
509
+    $groupby = [],
510
+    $orderby = '',
511
+    $limit = '',
512
+    $having = '',
513
+    $serveur = '',
514
+    $requeter = true
515 515
 ) {
516 516
 
517
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
518
-	$prefixe = $connexion['prefixe'];
519
-	$link = $connexion['link'];
520
-	$db = $connexion['db'];
521
-
522
-	$limit = preg_match('/^\s*((\d+),)?\s*(\d+)\s*$/', (string) $limit, $limatch);
523
-	if ($limit) {
524
-		$offset = $limatch[2];
525
-		$count = $limatch[3];
526
-	}
527
-
528
-	$select = spip_pg_frommysql($select);
529
-
530
-	// si pas de tri explicitement demande, le GROUP BY ne
531
-	// contient que la clef primaire.
532
-	// lui ajouter alors le champ de tri par defaut
533
-	if (preg_match('/FIELD\(([a-z]+\.[a-z]+),/i', (string) $orderby[0], $groupbyplus)) {
534
-		$groupby[] = $groupbyplus[1];
535
-	}
536
-
537
-	$orderby = spip_pg_orderby($orderby, $select);
538
-
539
-	if ($having && is_array($having)) {
540
-		$having = implode("\n\tAND ", array_map('calculer_pg_where', $having));
541
-	}
542
-	$from = spip_pg_from($from, $prefixe);
543
-	$query = 'SELECT ' . $select
544
-		. ($from ? "\nFROM $from" : '')
545
-		. ($where ? "\nWHERE " . (is_array($where) ? implode(
546
-			"\n\tAND ",
547
-			array_map('calculer_pg_where', $where)
548
-		) : (calculer_pg_where($where))) : (''))
549
-		. spip_pg_groupby($groupby, $from, $select)
550
-		. ($having ? "\nHAVING $having" : '')
551
-		. ($orderby ? ("\nORDER BY $orderby") : '')
552
-		. ($limit ? " LIMIT $count" . ($offset ? " OFFSET $offset" : '') : (''));
553
-
554
-	// renvoyer la requete inerte si demandee
555
-	if ($requeter === false) {
556
-		return $query;
557
-	}
558
-
559
-	$r = spip_pg_trace_query($query, $serveur);
560
-
561
-	return $r ?: $query;
517
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
518
+    $prefixe = $connexion['prefixe'];
519
+    $link = $connexion['link'];
520
+    $db = $connexion['db'];
521
+
522
+    $limit = preg_match('/^\s*((\d+),)?\s*(\d+)\s*$/', (string) $limit, $limatch);
523
+    if ($limit) {
524
+        $offset = $limatch[2];
525
+        $count = $limatch[3];
526
+    }
527
+
528
+    $select = spip_pg_frommysql($select);
529
+
530
+    // si pas de tri explicitement demande, le GROUP BY ne
531
+    // contient que la clef primaire.
532
+    // lui ajouter alors le champ de tri par defaut
533
+    if (preg_match('/FIELD\(([a-z]+\.[a-z]+),/i', (string) $orderby[0], $groupbyplus)) {
534
+        $groupby[] = $groupbyplus[1];
535
+    }
536
+
537
+    $orderby = spip_pg_orderby($orderby, $select);
538
+
539
+    if ($having && is_array($having)) {
540
+        $having = implode("\n\tAND ", array_map('calculer_pg_where', $having));
541
+    }
542
+    $from = spip_pg_from($from, $prefixe);
543
+    $query = 'SELECT ' . $select
544
+        . ($from ? "\nFROM $from" : '')
545
+        . ($where ? "\nWHERE " . (is_array($where) ? implode(
546
+            "\n\tAND ",
547
+            array_map('calculer_pg_where', $where)
548
+        ) : (calculer_pg_where($where))) : (''))
549
+        . spip_pg_groupby($groupby, $from, $select)
550
+        . ($having ? "\nHAVING $having" : '')
551
+        . ($orderby ? ("\nORDER BY $orderby") : '')
552
+        . ($limit ? " LIMIT $count" . ($offset ? " OFFSET $offset" : '') : (''));
553
+
554
+    // renvoyer la requete inerte si demandee
555
+    if ($requeter === false) {
556
+        return $query;
557
+    }
558
+
559
+    $r = spip_pg_trace_query($query, $serveur);
560
+
561
+    return $r ?: $query;
562 562
 ;
563 563
 }
564 564
 
@@ -566,22 +566,22 @@  discard block
 block discarded – undo
566 566
 // car le reste de la requete utilise les alias (AS) systematiquement
567 567
 
568 568
 function spip_pg_from($from, $prefixe) {
569
-	if (is_array($from)) {
570
-		$from = spip_pg_select_as($from);
571
-	}
569
+    if (is_array($from)) {
570
+        $from = spip_pg_select_as($from);
571
+    }
572 572
 
573
-	return $prefixe ? preg_replace('/(\b)spip_/', '\1' . $prefixe . '_', (string) $from) : $from;
573
+    return $prefixe ? preg_replace('/(\b)spip_/', '\1' . $prefixe . '_', (string) $from) : $from;
574 574
 }
575 575
 
576 576
 function spip_pg_orderby($order, $select) {
577
-	$res = [];
578
-	$arg = (is_array($order) ? $order : preg_split('/\s*,\s*/', (string) $order));
577
+    $res = [];
578
+    $arg = (is_array($order) ? $order : preg_split('/\s*,\s*/', (string) $order));
579 579
 
580
-	foreach ($arg as $v) {
581
-		$res[] = preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+' . $v . '/', (string) $select, $m) ? $m[1] : $v;
582
-	}
580
+    foreach ($arg as $v) {
581
+        $res[] = preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+' . $v . '/', (string) $select, $m) ? $m[1] : $v;
582
+    }
583 583
 
584
-	return spip_pg_frommysql(implode(',', $res));
584
+    return spip_pg_frommysql(implode(',', $res));
585 585
 }
586 586
 
587 587
 // Conversion a l'arrach' des jointures MySQL en jointures PG
@@ -589,56 +589,56 @@  discard block
 block discarded – undo
589 589
 // et pour enlever les repetitions (sans incidence de perf, mais ca fait sale)
590 590
 
591 591
 function spip_pg_groupby($groupby, $from, $select) {
592
-	$join = strpos((string) $from, ',');
593
-	// ismplifier avant de decouper
594
-	if (is_string($select)) { // fct SQL sur colonne et constante apostrophee ==> la colonne
595
-	$select = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $select);
596
-	}
597
-
598
-	if ($join || $groupby) {
599
-		$join = is_array($select) ? $select : explode(', ', (string) $select);
600
-	}
601
-	if ($join) {
602
-		// enlever les 0 as points, '', ...
603
-		foreach ($join as $k => $v) {
604
-			$v = str_replace('DISTINCT ', '', (string) $v);
605
-			// fct SQL sur colonne et constante apostrophee ==> la colonne
606
-			$v = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $v);
607
-			$v = preg_replace('/CAST\(\s*([^(),\' ]*\s+)as\s*\w+\)/', '\\1', $v);
608
-			// resultat d'agregat ne sont pas a mettre dans le groupby
609
-			$v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)(\s*AS\s+\w+)\s*,?/i', '', $v);
610
-			// idem sans AS (fetch numerique)
611
-			$v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)\s*,?/i', '', $v);
612
-			// des AS simples : on garde le cote droit du AS
613
-			$v = preg_replace('/^.*\sAS\s+(\w+)\s*$/i', '\\1', $v);
614
-			// ne reste plus que les vrais colonnes, ou des constantes a virer
615
-			if (preg_match(',^[\'"],', $v) || is_numeric($v)) {
616
-				unset($join[$k]);
617
-			} else {
618
-				$join[$k] = trim($v);
619
-			}
620
-		}
621
-		$join = array_diff($join, ['']);
622
-		$join = implode(',', $join);
623
-	}
624
-	if (is_array($groupby)) {
625
-		$groupby = implode(',', $groupby);
626
-	}
627
-	if ($join) {
628
-		$groupby = $groupby ? "$groupby, $join" : $join;
629
-	}
630
-	if (!$groupby) {
631
-		return '';
632
-	}
633
-
634
-	$groupby = spip_pg_frommysql($groupby);
635
-	// Ne pas mettre dans le Group-By des valeurs numeriques
636
-	// issue de prepare_recherche
637
-	$groupby = preg_replace('/^\s*\d+\s+AS\s+\w+\s*,?\s*/i', '', (string) $groupby);
638
-	$groupby = preg_replace('/,\s*\d+\s+AS\s+\w+\s*/i', '', $groupby);
639
-	$groupby = preg_replace('/\s+AS\s+\w+\s*/i', '', $groupby);
640
-
641
-	return "\nGROUP BY $groupby";
592
+    $join = strpos((string) $from, ',');
593
+    // ismplifier avant de decouper
594
+    if (is_string($select)) { // fct SQL sur colonne et constante apostrophee ==> la colonne
595
+    $select = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $select);
596
+    }
597
+
598
+    if ($join || $groupby) {
599
+        $join = is_array($select) ? $select : explode(', ', (string) $select);
600
+    }
601
+    if ($join) {
602
+        // enlever les 0 as points, '', ...
603
+        foreach ($join as $k => $v) {
604
+            $v = str_replace('DISTINCT ', '', (string) $v);
605
+            // fct SQL sur colonne et constante apostrophee ==> la colonne
606
+            $v = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $v);
607
+            $v = preg_replace('/CAST\(\s*([^(),\' ]*\s+)as\s*\w+\)/', '\\1', $v);
608
+            // resultat d'agregat ne sont pas a mettre dans le groupby
609
+            $v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)(\s*AS\s+\w+)\s*,?/i', '', $v);
610
+            // idem sans AS (fetch numerique)
611
+            $v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)\s*,?/i', '', $v);
612
+            // des AS simples : on garde le cote droit du AS
613
+            $v = preg_replace('/^.*\sAS\s+(\w+)\s*$/i', '\\1', $v);
614
+            // ne reste plus que les vrais colonnes, ou des constantes a virer
615
+            if (preg_match(',^[\'"],', $v) || is_numeric($v)) {
616
+                unset($join[$k]);
617
+            } else {
618
+                $join[$k] = trim($v);
619
+            }
620
+        }
621
+        $join = array_diff($join, ['']);
622
+        $join = implode(',', $join);
623
+    }
624
+    if (is_array($groupby)) {
625
+        $groupby = implode(',', $groupby);
626
+    }
627
+    if ($join) {
628
+        $groupby = $groupby ? "$groupby, $join" : $join;
629
+    }
630
+    if (!$groupby) {
631
+        return '';
632
+    }
633
+
634
+    $groupby = spip_pg_frommysql($groupby);
635
+    // Ne pas mettre dans le Group-By des valeurs numeriques
636
+    // issue de prepare_recherche
637
+    $groupby = preg_replace('/^\s*\d+\s+AS\s+\w+\s*,?\s*/i', '', (string) $groupby);
638
+    $groupby = preg_replace('/,\s*\d+\s+AS\s+\w+\s*/i', '', $groupby);
639
+    $groupby = preg_replace('/\s+AS\s+\w+\s*/i', '', $groupby);
640
+
641
+    return "\nGROUP BY $groupby";
642 642
 }
643 643
 
644 644
 // Conversion des operateurs MySQL en PG
@@ -649,492 +649,492 @@  discard block
 block discarded – undo
649 649
 // A ameliorer.
650 650
 
651 651
 function spip_pg_frommysql($arg) {
652
-	if (is_array($arg)) {
653
-		$arg = implode(', ', $arg);
654
-	}
655
-
656
-	$res = spip_pg_fromfield($arg);
657
-
658
-	$res = preg_replace('/\brand[(][)]/i', 'random()', (string) $res);
659
-
660
-	$res = preg_replace(
661
-		'/\b0\.0[+]([a-zA-Z0-9_.]+)\s*/',
662
-		'CAST(substring(\1, \'^ *[0-9.]+\') as float)',
663
-		$res
664
-	);
665
-	$res = preg_replace(
666
-		'/\b0[+]([a-zA-Z0-9_.]+)\s*/',
667
-		'CAST(substring(\1, \'^ *[0-9]+\') as int)',
668
-		$res
669
-	);
670
-	$res = preg_replace(
671
-		'/\bconv[(]([^,]*)[^)]*[)]/i',
672
-		'CAST(substring(\1, \'^ *[0-9]+\') as int)',
673
-		$res
674
-	);
675
-
676
-	$res = preg_replace(
677
-		'/UNIX_TIMESTAMP\s*[(]\s*[)]/',
678
-		' EXTRACT(epoch FROM NOW())',
679
-		$res
680
-	);
681
-
682
-	// la fonction md5(integer) n'est pas connu en pg
683
-	// il faut donc forcer les types en text (cas de md5(id_article))
684
-	$res = preg_replace(
685
-		'/md5\s*[(]([^)]*)[)]/i',
686
-		'MD5(CAST(\1 AS text))',
687
-		$res
688
-	);
689
-
690
-	$res = preg_replace(
691
-		'/UNIX_TIMESTAMP\s*[(]([^)]*)[)]/',
692
-		' EXTRACT(epoch FROM \1)',
693
-		$res
694
-	);
695
-
696
-	$res = preg_replace(
697
-		'/\bDAYOFMONTH\s*[(]([^()]*([(][^()]*[)][^()]*)*[^)]*)[)]/',
698
-		' EXTRACT(day FROM \1)',
699
-		$res
700
-	);
701
-
702
-	$res = preg_replace(
703
-		'/\bMONTH\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/',
704
-		' EXTRACT(month FROM \1)',
705
-		$res
706
-	);
707
-
708
-	$res = preg_replace(
709
-		'/\bYEAR\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/',
710
-		' EXTRACT(year FROM \1)',
711
-		$res
712
-	);
713
-
714
-	$res = preg_replace(
715
-		'/TO_DAYS\s*[(]([^()]*([(][^)]*[)][()]*)*)[)]/',
716
-		' EXTRACT(day FROM \1 - \'0001-01-01\')',
717
-		$res
718
-	);
719
-
720
-	$res = preg_replace('/(EXTRACT[(][^ ]* FROM *)"([^"]*)"/', '\1\'\2\'', $res);
721
-
722
-	$res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m%d\'[)]/', 'to_char(\1, \'YYYYMMDD\')', $res);
723
-
724
-	$res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m\'[)]/', 'to_char(\1, \'YYYYMM\')', $res);
725
-
726
-	$res = preg_replace('/DATE_SUB\s*[(]([^,]*),/', '(\1 -', $res);
727
-	$res = preg_replace('/DATE_ADD\s*[(]([^,]*),/', '(\1 +', $res);
728
-	$res = preg_replace('/INTERVAL\s+(\d+\s+\w+)/', 'INTERVAL \'\1\'', $res);
729
-	$res = preg_replace('/([+<>-]=?)\s*(\'\d+-\d+-\d+\s+\d+:\d+(:\d+)\')/', '\1 timestamp \2', $res);
730
-	$res = preg_replace('/(\'\d+-\d+-\d+\s+\d+:\d+:\d+\')\s*([+<>-]=?)/', 'timestamp \1 \2', $res);
731
-
732
-	$res = preg_replace('/([+<>-]=?)\s*(\'\d+-\d+-\d+\')/', '\1 timestamp \2', $res);
733
-	$res = preg_replace('/(\'\d+-\d+-\d+\')\s*([+<>-]=?)/', 'timestamp \1 \2', $res);
734
-
735
-	$res = preg_replace('/(timestamp .\d+)-00-/', '\1-01-', $res);
736
-	$res = preg_replace('/(timestamp .\d+-\d+)-00/', '\1-01', $res);
652
+    if (is_array($arg)) {
653
+        $arg = implode(', ', $arg);
654
+    }
655
+
656
+    $res = spip_pg_fromfield($arg);
657
+
658
+    $res = preg_replace('/\brand[(][)]/i', 'random()', (string) $res);
659
+
660
+    $res = preg_replace(
661
+        '/\b0\.0[+]([a-zA-Z0-9_.]+)\s*/',
662
+        'CAST(substring(\1, \'^ *[0-9.]+\') as float)',
663
+        $res
664
+    );
665
+    $res = preg_replace(
666
+        '/\b0[+]([a-zA-Z0-9_.]+)\s*/',
667
+        'CAST(substring(\1, \'^ *[0-9]+\') as int)',
668
+        $res
669
+    );
670
+    $res = preg_replace(
671
+        '/\bconv[(]([^,]*)[^)]*[)]/i',
672
+        'CAST(substring(\1, \'^ *[0-9]+\') as int)',
673
+        $res
674
+    );
675
+
676
+    $res = preg_replace(
677
+        '/UNIX_TIMESTAMP\s*[(]\s*[)]/',
678
+        ' EXTRACT(epoch FROM NOW())',
679
+        $res
680
+    );
681
+
682
+    // la fonction md5(integer) n'est pas connu en pg
683
+    // il faut donc forcer les types en text (cas de md5(id_article))
684
+    $res = preg_replace(
685
+        '/md5\s*[(]([^)]*)[)]/i',
686
+        'MD5(CAST(\1 AS text))',
687
+        $res
688
+    );
689
+
690
+    $res = preg_replace(
691
+        '/UNIX_TIMESTAMP\s*[(]([^)]*)[)]/',
692
+        ' EXTRACT(epoch FROM \1)',
693
+        $res
694
+    );
695
+
696
+    $res = preg_replace(
697
+        '/\bDAYOFMONTH\s*[(]([^()]*([(][^()]*[)][^()]*)*[^)]*)[)]/',
698
+        ' EXTRACT(day FROM \1)',
699
+        $res
700
+    );
701
+
702
+    $res = preg_replace(
703
+        '/\bMONTH\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/',
704
+        ' EXTRACT(month FROM \1)',
705
+        $res
706
+    );
707
+
708
+    $res = preg_replace(
709
+        '/\bYEAR\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/',
710
+        ' EXTRACT(year FROM \1)',
711
+        $res
712
+    );
713
+
714
+    $res = preg_replace(
715
+        '/TO_DAYS\s*[(]([^()]*([(][^)]*[)][()]*)*)[)]/',
716
+        ' EXTRACT(day FROM \1 - \'0001-01-01\')',
717
+        $res
718
+    );
719
+
720
+    $res = preg_replace('/(EXTRACT[(][^ ]* FROM *)"([^"]*)"/', '\1\'\2\'', $res);
721
+
722
+    $res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m%d\'[)]/', 'to_char(\1, \'YYYYMMDD\')', $res);
723
+
724
+    $res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m\'[)]/', 'to_char(\1, \'YYYYMM\')', $res);
725
+
726
+    $res = preg_replace('/DATE_SUB\s*[(]([^,]*),/', '(\1 -', $res);
727
+    $res = preg_replace('/DATE_ADD\s*[(]([^,]*),/', '(\1 +', $res);
728
+    $res = preg_replace('/INTERVAL\s+(\d+\s+\w+)/', 'INTERVAL \'\1\'', $res);
729
+    $res = preg_replace('/([+<>-]=?)\s*(\'\d+-\d+-\d+\s+\d+:\d+(:\d+)\')/', '\1 timestamp \2', $res);
730
+    $res = preg_replace('/(\'\d+-\d+-\d+\s+\d+:\d+:\d+\')\s*([+<>-]=?)/', 'timestamp \1 \2', $res);
731
+
732
+    $res = preg_replace('/([+<>-]=?)\s*(\'\d+-\d+-\d+\')/', '\1 timestamp \2', $res);
733
+    $res = preg_replace('/(\'\d+-\d+-\d+\')\s*([+<>-]=?)/', 'timestamp \1 \2', $res);
734
+
735
+    $res = preg_replace('/(timestamp .\d+)-00-/', '\1-01-', $res);
736
+    $res = preg_replace('/(timestamp .\d+-\d+)-00/', '\1-01', $res);
737 737
 # correct en theorie mais produit des debordements arithmetiques
738 738
 #	$res = preg_replace("/(EXTRACT[(][^ ]* FROM *)(timestamp *'[^']*' *[+-] *timestamp *'[^']*') *[)]/", '\2', $res);
739
-	$res = preg_replace("/(EXTRACT[(][^ ]* FROM *)('[^']*')/", '\1 timestamp \2', $res);
740
-	$res = preg_replace('/\sLIKE\s+/', ' ILIKE ', $res);
739
+    $res = preg_replace("/(EXTRACT[(][^ ]* FROM *)('[^']*')/", '\1 timestamp \2', $res);
740
+    $res = preg_replace('/\sLIKE\s+/', ' ILIKE ', $res);
741 741
 
742
-	return str_replace('REGEXP', '~', $res);
742
+    return str_replace('REGEXP', '~', $res);
743 743
 }
744 744
 
745 745
 function spip_pg_fromfield($arg) {
746
-	while (preg_match('/^(.*?)FIELD\s*\(([^,]*)((,[^,)]*)*)\)/', (string) $arg, $m)) {
747
-		preg_match_all('/,([^,]*)/', $m[3], $r, PREG_PATTERN_ORDER);
748
-		$res = '';
749
-		$n = 0;
750
-		$index = $m[2];
751
-		foreach ($r[1] as $v) {
752
-			$n++;
753
-			$res .= "\nwhen $index=$v then $n";
754
-		}
755
-		$arg = $m[1] . "case $res else 0 end "
756
-			. substr((string) $arg, strlen($m[0]));
757
-	}
758
-
759
-	return $arg;
746
+    while (preg_match('/^(.*?)FIELD\s*\(([^,]*)((,[^,)]*)*)\)/', (string) $arg, $m)) {
747
+        preg_match_all('/,([^,]*)/', $m[3], $r, PREG_PATTERN_ORDER);
748
+        $res = '';
749
+        $n = 0;
750
+        $index = $m[2];
751
+        foreach ($r[1] as $v) {
752
+            $n++;
753
+            $res .= "\nwhen $index=$v then $n";
754
+        }
755
+        $arg = $m[1] . "case $res else 0 end "
756
+            . substr((string) $arg, strlen($m[0]));
757
+    }
758
+
759
+    return $arg;
760 760
 }
761 761
 
762 762
 function calculer_pg_where($v) {
763
-	if (!is_array($v)) {
764
-		return spip_pg_frommysql($v);
765
-	}
766
-
767
-	$op = str_replace('REGEXP', '~', (string) array_shift($v));
768
-	if (!($n = count($v))) {
769
-		return $op;
770
-	} else {
771
-		$arg = calculer_pg_where(array_shift($v));
772
-		if ($n == 1) {
773
-			return "$op($arg)";
774
-		} else {
775
-			$arg2 = calculer_pg_where(array_shift($v));
776
-			if ($n == 2) {
777
-				return "($arg $op $arg2)";
778
-			} else {
779
-				return "($arg $op ($arg2) : $v[0])";
780
-			}
781
-		}
782
-	}
763
+    if (!is_array($v)) {
764
+        return spip_pg_frommysql($v);
765
+    }
766
+
767
+    $op = str_replace('REGEXP', '~', (string) array_shift($v));
768
+    if (!($n = count($v))) {
769
+        return $op;
770
+    } else {
771
+        $arg = calculer_pg_where(array_shift($v));
772
+        if ($n == 1) {
773
+            return "$op($arg)";
774
+        } else {
775
+            $arg2 = calculer_pg_where(array_shift($v));
776
+            if ($n == 2) {
777
+                return "($arg $op $arg2)";
778
+            } else {
779
+                return "($arg $op ($arg2) : $v[0])";
780
+            }
781
+        }
782
+    }
783 783
 }
784 784
 
785 785
 
786 786
 function calculer_pg_expression($expression, $v, $join = 'AND') {
787
-	if (empty($v)) {
788
-		return '';
789
-	}
787
+    if (empty($v)) {
788
+        return '';
789
+    }
790 790
 
791
-	$exp = "\n$expression ";
791
+    $exp = "\n$expression ";
792 792
 
793
-	if (!is_array($v)) {
794
-		$v = [$v];
795
-	}
793
+    if (!is_array($v)) {
794
+        $v = [$v];
795
+    }
796 796
 
797
-	if (strtoupper((string) $join) === 'AND') {
798
-		return $exp . implode("\n\t$join ", array_map('calculer_pg_where', $v));
799
-	} else {
800
-		return $exp . implode($join, $v);
801
-	}
797
+    if (strtoupper((string) $join) === 'AND') {
798
+        return $exp . implode("\n\t$join ", array_map('calculer_pg_where', $v));
799
+    } else {
800
+        return $exp . implode($join, $v);
801
+    }
802 802
 }
803 803
 
804 804
 function spip_pg_select_as($args) {
805
-	$argsas = '';
806
-	foreach ($args as $k => $v) {
807
-		if (str_ends_with((string) $k, '@')) {
808
-			// c'est une jointure qui se refere au from precedent
809
-			// pas de virgule
810
-			$argsas .= '  ' . $v;
811
-		} else {
812
-			$as = '';
813
-			//  spip_logger('pg')->debug("$k : $v");
814
-			if (!is_numeric($k)) {
815
-				if (preg_match('/\.(.*)$/', (string) $k, $r)) {
816
-					$v = $k;
817
-				} elseif ($v != $k) {
818
-					$p = strpos((string) $v, ' ');
819
-					if ($p) {
820
-						$v = substr((string) $v, 0, $p) . " AS $k" . substr((string) $v, $p);
821
-					} else {
822
-						$as = " AS $k";
823
-					}
824
-				}
825
-			}
826
-			// spip_logger('pg')->debug("subs $k : $v avec $as");
827
-			// if (strpos($v, 'JOIN') === false)  $argsas .= ', ';
828
-			$argsas .= ', ' . $v . $as;
829
-		}
830
-	}
831
-
832
-	return substr($argsas, 2);
805
+    $argsas = '';
806
+    foreach ($args as $k => $v) {
807
+        if (str_ends_with((string) $k, '@')) {
808
+            // c'est une jointure qui se refere au from precedent
809
+            // pas de virgule
810
+            $argsas .= '  ' . $v;
811
+        } else {
812
+            $as = '';
813
+            //  spip_logger('pg')->debug("$k : $v");
814
+            if (!is_numeric($k)) {
815
+                if (preg_match('/\.(.*)$/', (string) $k, $r)) {
816
+                    $v = $k;
817
+                } elseif ($v != $k) {
818
+                    $p = strpos((string) $v, ' ');
819
+                    if ($p) {
820
+                        $v = substr((string) $v, 0, $p) . " AS $k" . substr((string) $v, $p);
821
+                    } else {
822
+                        $as = " AS $k";
823
+                    }
824
+                }
825
+            }
826
+            // spip_logger('pg')->debug("subs $k : $v avec $as");
827
+            // if (strpos($v, 'JOIN') === false)  $argsas .= ', ';
828
+            $argsas .= ', ' . $v . $as;
829
+        }
830
+    }
831
+
832
+    return substr($argsas, 2);
833 833
 }
834 834
 
835 835
 function spip_pg_fetch($res, $t = '', $serveur = '', $requeter = true) {
836 836
 
837
-	if ($res) {
838
-		$res = pg_fetch_array($res, null, PGSQL_ASSOC);
839
-	}
837
+    if ($res) {
838
+        $res = pg_fetch_array($res, null, PGSQL_ASSOC);
839
+    }
840 840
 
841
-	return $res;
841
+    return $res;
842 842
 }
843 843
 
844 844
 function spip_pg_seek($r, $row_number, $serveur = '', $requeter = true) {
845
-	if ($r) {
846
-		return pg_result_seek($r, $row_number);
847
-	}
845
+    if ($r) {
846
+        return pg_result_seek($r, $row_number);
847
+    }
848 848
 }
849 849
 
850 850
 
851 851
 function spip_pg_countsel(
852
-	$from = [],
853
-	$where = [],
854
-	$groupby = [],
855
-	$having = [],
856
-	$serveur = '',
857
-	$requeter = true
852
+    $from = [],
853
+    $where = [],
854
+    $groupby = [],
855
+    $having = [],
856
+    $serveur = '',
857
+    $requeter = true
858 858
 ) {
859
-	$c = $groupby ? 'DISTINCT ' . (is_string($groupby) ? $groupby : implode(',', $groupby)) : ('*');
860
-	$r = spip_pg_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
861
-	if (!$requeter) {
862
-		return $r;
863
-	}
864
-	if (!is_resource($r)) {
865
-		return 0;
866
-	}
867
-	[$c] = pg_fetch_array($r, null, PGSQL_NUM);
868
-
869
-	return $c;
859
+    $c = $groupby ? 'DISTINCT ' . (is_string($groupby) ? $groupby : implode(',', $groupby)) : ('*');
860
+    $r = spip_pg_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
861
+    if (!$requeter) {
862
+        return $r;
863
+    }
864
+    if (!is_resource($r)) {
865
+        return 0;
866
+    }
867
+    [$c] = pg_fetch_array($r, null, PGSQL_NUM);
868
+
869
+    return $c;
870 870
 }
871 871
 
872 872
 function spip_pg_count($res, $serveur = '', $requeter = true) {
873
-	return $res ? pg_num_rows($res) : 0;
873
+    return $res ? pg_num_rows($res) : 0;
874 874
 }
875 875
 
876 876
 function spip_pg_free($res, $serveur = '', $requeter = true) {
877
-	// rien a faire en postgres
877
+    // rien a faire en postgres
878 878
 }
879 879
 
880 880
 function spip_pg_delete($table, $where = '', $serveur = '', $requeter = true) {
881 881
 
882
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
883
-	$table = prefixer_table_spip($table, $connexion['prefixe']);
882
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
883
+    $table = prefixer_table_spip($table, $connexion['prefixe']);
884 884
 
885
-	$query = calculer_pg_expression('DELETE FROM', $table, ',')
886
-		. calculer_pg_expression('WHERE', $where, 'AND');
885
+    $query = calculer_pg_expression('DELETE FROM', $table, ',')
886
+        . calculer_pg_expression('WHERE', $where, 'AND');
887 887
 
888
-	// renvoyer la requete inerte si demandee
889
-	if (!$requeter) {
890
-		return $query;
891
-	}
888
+    // renvoyer la requete inerte si demandee
889
+    if (!$requeter) {
890
+        return $query;
891
+    }
892 892
 
893
-	$res = spip_pg_trace_query($query, $serveur);
894
-	if ($res) {
895
-		return pg_affected_rows($res);
896
-	} else {
897
-		return false;
898
-	}
893
+    $res = spip_pg_trace_query($query, $serveur);
894
+    if ($res) {
895
+        return pg_affected_rows($res);
896
+    } else {
897
+        return false;
898
+    }
899 899
 }
900 900
 
901 901
 function spip_pg_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
902
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
903
-	$prefixe = $connexion['prefixe'];
904
-	$link = $connexion['link'];
905
-
906
-	if (!$desc) {
907
-		$desc = description_table($table, $serveur);
908
-	}
909
-	$seq = spip_pg_sequence($table, true);
910
-	// si pas de cle primaire dans l'insertion, renvoyer curval
911
-	if (!preg_match(",\b$seq\b,", (string) $champs)) {
912
-		$seq = spip_pg_sequence($table);
913
-		$seq = prefixer_table_spip($seq, $prefixe);
914
-		$seq = "currval('$seq')";
915
-	}
916
-
917
-	$table = prefixer_table_spip($table, $prefixe);
918
-	$ret = $seq ? " RETURNING $seq" : ('');
919
-	$ins = (strlen((string) $champs) < 3)
920
-		? ' DEFAULT VALUES'
921
-		: "$champs VALUES $valeurs";
922
-	$q = "INSERT INTO $table $ins $ret";
923
-	if (!$requeter) {
924
-		return $q;
925
-	}
926
-	$connexion['last'] = $q;
927
-	$r = spip_pg_query_simple($link, $q);
902
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
903
+    $prefixe = $connexion['prefixe'];
904
+    $link = $connexion['link'];
905
+
906
+    if (!$desc) {
907
+        $desc = description_table($table, $serveur);
908
+    }
909
+    $seq = spip_pg_sequence($table, true);
910
+    // si pas de cle primaire dans l'insertion, renvoyer curval
911
+    if (!preg_match(",\b$seq\b,", (string) $champs)) {
912
+        $seq = spip_pg_sequence($table);
913
+        $seq = prefixer_table_spip($seq, $prefixe);
914
+        $seq = "currval('$seq')";
915
+    }
916
+
917
+    $table = prefixer_table_spip($table, $prefixe);
918
+    $ret = $seq ? " RETURNING $seq" : ('');
919
+    $ins = (strlen((string) $champs) < 3)
920
+        ? ' DEFAULT VALUES'
921
+        : "$champs VALUES $valeurs";
922
+    $q = "INSERT INTO $table $ins $ret";
923
+    if (!$requeter) {
924
+        return $q;
925
+    }
926
+    $connexion['last'] = $q;
927
+    $r = spip_pg_query_simple($link, $q);
928 928
 #	spip_logger('pg')->debug($q);
929
-	if ($r) {
930
-		if (!$ret) {
931
-			return 0;
932
-		}
933
-		if ($r2 = pg_fetch_array($r, null, PGSQL_NUM)) {
934
-			return $r2[0];
935
-		}
936
-	}
937
-
938
-	return false;
929
+    if ($r) {
930
+        if (!$ret) {
931
+            return 0;
932
+        }
933
+        if ($r2 = pg_fetch_array($r, null, PGSQL_NUM)) {
934
+            return $r2[0];
935
+        }
936
+    }
937
+
938
+    return false;
939 939
 }
940 940
 
941 941
 function spip_pg_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
942 942
 
943
-	if (!$desc) {
944
-		$desc = description_table($table, $serveur);
945
-	}
946
-	if (!$desc) {
947
-		die("$table insertion sans description");
948
-	}
949
-	$fields = $desc['field'];
950
-
951
-	foreach ($couples as $champ => $val) {
952
-		$couples[$champ] = spip_pg_cite($val, $fields[$champ]);
953
-	}
954
-
955
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
956
-	$couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
957
-
958
-	return spip_pg_insert(
959
-		$table,
960
-		'(' . implode(',', array_keys($couples)) . ')',
961
-		'(' . implode(',', $couples) . ')',
962
-		$desc,
963
-		$serveur,
964
-		$requeter
965
-	);
943
+    if (!$desc) {
944
+        $desc = description_table($table, $serveur);
945
+    }
946
+    if (!$desc) {
947
+        die("$table insertion sans description");
948
+    }
949
+    $fields = $desc['field'];
950
+
951
+    foreach ($couples as $champ => $val) {
952
+        $couples[$champ] = spip_pg_cite($val, $fields[$champ]);
953
+    }
954
+
955
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
956
+    $couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
957
+
958
+    return spip_pg_insert(
959
+        $table,
960
+        '(' . implode(',', array_keys($couples)) . ')',
961
+        '(' . implode(',', $couples) . ')',
962
+        $desc,
963
+        $serveur,
964
+        $requeter
965
+    );
966 966
 }
967 967
 
968 968
 
969 969
 function spip_pg_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
970 970
 
971
-	if (!$desc) {
972
-		$desc = description_table($table, $serveur);
973
-	}
974
-	if (!$desc) {
975
-		die("$table insertion sans description");
976
-	}
977
-	$fields = $desc['field'] ?? [];
978
-
979
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
980
-	// une premiere fois pour ajouter maj dans les cles
981
-	$c = $tab_couples[0] ?? [];
982
-	$les_cles = spip_pg_ajouter_champs_timestamp($table, $c, $desc, $serveur);
983
-
984
-	$cles = '(' . implode(',', array_keys($les_cles)) . ')';
985
-	$valeurs = [];
986
-	foreach ($tab_couples as $couples) {
987
-		foreach ($couples as $champ => $val) {
988
-			$couples[$champ] = spip_pg_cite($val, $fields[$champ]);
989
-		}
990
-		// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
991
-		$couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
992
-
993
-		$valeurs[] = '(' . implode(',', $couples) . ')';
994
-	}
995
-	$valeurs = implode(', ', $valeurs);
996
-
997
-	return spip_pg_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
971
+    if (!$desc) {
972
+        $desc = description_table($table, $serveur);
973
+    }
974
+    if (!$desc) {
975
+        die("$table insertion sans description");
976
+    }
977
+    $fields = $desc['field'] ?? [];
978
+
979
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
980
+    // une premiere fois pour ajouter maj dans les cles
981
+    $c = $tab_couples[0] ?? [];
982
+    $les_cles = spip_pg_ajouter_champs_timestamp($table, $c, $desc, $serveur);
983
+
984
+    $cles = '(' . implode(',', array_keys($les_cles)) . ')';
985
+    $valeurs = [];
986
+    foreach ($tab_couples as $couples) {
987
+        foreach ($couples as $champ => $val) {
988
+            $couples[$champ] = spip_pg_cite($val, $fields[$champ]);
989
+        }
990
+        // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
991
+        $couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
992
+
993
+        $valeurs[] = '(' . implode(',', $couples) . ')';
994
+    }
995
+    $valeurs = implode(', ', $valeurs);
996
+
997
+    return spip_pg_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
998 998
 }
999 999
 
1000 1000
 
1001 1001
 function spip_pg_update($table, $couples, $where = '', $desc = '', $serveur = '', $requeter = true) {
1002 1002
 
1003
-	if (!$couples) {
1004
-		return;
1005
-	}
1006
-	$connexion = $GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
1007
-	$table = prefixer_table_spip($table, $connexion['prefixe']);
1003
+    if (!$couples) {
1004
+        return;
1005
+    }
1006
+    $connexion = $GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
1007
+    $table = prefixer_table_spip($table, $connexion['prefixe']);
1008 1008
 
1009
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1010
-	$couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1009
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1010
+    $couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1011 1011
 
1012
-	$set = [];
1013
-	foreach ($couples as $champ => $val) {
1014
-		$set[] = $champ . '=' . $val;
1015
-	}
1012
+    $set = [];
1013
+    foreach ($couples as $champ => $val) {
1014
+        $set[] = $champ . '=' . $val;
1015
+    }
1016 1016
 
1017
-	$query = calculer_pg_expression('UPDATE', $table, ',')
1018
-		. calculer_pg_expression('SET', $set, ',')
1019
-		. calculer_pg_expression('WHERE', $where, 'AND');
1017
+    $query = calculer_pg_expression('UPDATE', $table, ',')
1018
+        . calculer_pg_expression('SET', $set, ',')
1019
+        . calculer_pg_expression('WHERE', $where, 'AND');
1020 1020
 
1021
-	// renvoyer la requete inerte si demandee
1022
-	if (!$requeter) {
1023
-		return $query;
1024
-	}
1021
+    // renvoyer la requete inerte si demandee
1022
+    if (!$requeter) {
1023
+        return $query;
1024
+    }
1025 1025
 
1026
-	return spip_pg_trace_query($query, $serveur);
1026
+    return spip_pg_trace_query($query, $serveur);
1027 1027
 }
1028 1028
 
1029 1029
 // idem, mais les valeurs sont des constantes a mettre entre apostrophes
1030 1030
 // sauf les expressions de date lorsqu'il s'agit de fonctions SQL (NOW etc)
1031 1031
 function spip_pg_updateq($table, $couples, $where = '', $desc = [], $serveur = '', $requeter = true) {
1032
-	if (!$couples) {
1033
-		return;
1034
-	}
1035
-	if (!$desc) {
1036
-		$desc = description_table($table, $serveur);
1037
-	}
1038
-	$fields = $desc['field'];
1039
-	foreach ($couples as $k => $val) {
1040
-		$couples[$k] = spip_pg_cite($val, $fields[$k]);
1041
-	}
1042
-
1043
-	return spip_pg_update($table, $couples, $where, $desc, $serveur, $requeter);
1032
+    if (!$couples) {
1033
+        return;
1034
+    }
1035
+    if (!$desc) {
1036
+        $desc = description_table($table, $serveur);
1037
+    }
1038
+    $fields = $desc['field'];
1039
+    foreach ($couples as $k => $val) {
1040
+        $couples[$k] = spip_pg_cite($val, $fields[$k]);
1041
+    }
1042
+
1043
+    return spip_pg_update($table, $couples, $where, $desc, $serveur, $requeter);
1044 1044
 }
1045 1045
 
1046 1046
 
1047 1047
 function spip_pg_replace($table, $values, $desc, $serveur = '', $requeter = true) {
1048
-	if (!$values) {
1049
-		spip_logger('pg')->notice("replace vide $table");
1050
-
1051
-		return 0;
1052
-	}
1053
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
1054
-	$prefixe = $connexion['prefixe'];
1055
-	$link = $connexion['link'];
1056
-
1057
-	if (!$desc) {
1058
-		$desc = description_table($table, $serveur);
1059
-	}
1060
-	if (!$desc) {
1061
-		die("$table insertion sans description");
1062
-	}
1063
-	$prim = $desc['key']['PRIMARY KEY'];
1064
-	$ids = preg_split('/,\s*/', (string) $prim);
1065
-	$noprims = $prims = [];
1066
-	foreach ($values as $k => $v) {
1067
-		$values[$k] = $v = spip_pg_cite($v, $desc['field'][$k]);
1068
-
1069
-		if (!in_array($k, $ids)) {
1070
-			$noprims[$k] = "$k=$v";
1071
-		} else {
1072
-			$prims[$k] = "$k=$v";
1073
-		}
1074
-	}
1075
-
1076
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1077
-	$values = spip_pg_ajouter_champs_timestamp($table, $values, $desc, $serveur);
1078
-
1079
-	$where = implode(' AND ', $prims);
1080
-	if (!$where) {
1081
-		return spip_pg_insert(
1082
-			$table,
1083
-			'(' . implode(',', array_keys($values)) . ')',
1084
-			'(' . implode(',', $values) . ')',
1085
-			$desc,
1086
-			$serveur
1087
-		);
1088
-	}
1089
-	$couples = implode(',', $noprims);
1090
-
1091
-	$seq = spip_pg_sequence($table);
1092
-	$table = prefixer_table_spip($table, $prefixe);
1093
-	$seq = prefixer_table_spip($seq, $prefixe);
1094
-
1095
-	$connexion['last'] = $q = "UPDATE $table SET $couples WHERE $where";
1096
-	if ($couples) {
1097
-		$couples = spip_pg_query_simple($link, $q);
1048
+    if (!$values) {
1049
+        spip_logger('pg')->notice("replace vide $table");
1050
+
1051
+        return 0;
1052
+    }
1053
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
1054
+    $prefixe = $connexion['prefixe'];
1055
+    $link = $connexion['link'];
1056
+
1057
+    if (!$desc) {
1058
+        $desc = description_table($table, $serveur);
1059
+    }
1060
+    if (!$desc) {
1061
+        die("$table insertion sans description");
1062
+    }
1063
+    $prim = $desc['key']['PRIMARY KEY'];
1064
+    $ids = preg_split('/,\s*/', (string) $prim);
1065
+    $noprims = $prims = [];
1066
+    foreach ($values as $k => $v) {
1067
+        $values[$k] = $v = spip_pg_cite($v, $desc['field'][$k]);
1068
+
1069
+        if (!in_array($k, $ids)) {
1070
+            $noprims[$k] = "$k=$v";
1071
+        } else {
1072
+            $prims[$k] = "$k=$v";
1073
+        }
1074
+    }
1075
+
1076
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1077
+    $values = spip_pg_ajouter_champs_timestamp($table, $values, $desc, $serveur);
1078
+
1079
+    $where = implode(' AND ', $prims);
1080
+    if (!$where) {
1081
+        return spip_pg_insert(
1082
+            $table,
1083
+            '(' . implode(',', array_keys($values)) . ')',
1084
+            '(' . implode(',', $values) . ')',
1085
+            $desc,
1086
+            $serveur
1087
+        );
1088
+    }
1089
+    $couples = implode(',', $noprims);
1090
+
1091
+    $seq = spip_pg_sequence($table);
1092
+    $table = prefixer_table_spip($table, $prefixe);
1093
+    $seq = prefixer_table_spip($seq, $prefixe);
1094
+
1095
+    $connexion['last'] = $q = "UPDATE $table SET $couples WHERE $where";
1096
+    if ($couples) {
1097
+        $couples = spip_pg_query_simple($link, $q);
1098 1098
 #	  spip_logger('pg')->debug($q);
1099
-		if (!$couples) {
1100
-			return false;
1101
-		}
1102
-		$couples = pg_affected_rows($couples);
1103
-	}
1104
-	if (!$couples) {
1105
-		$ret = $seq ? " RETURNING nextval('$seq') < $prim" :
1106
-			('');
1107
-		$connexion['last'] = $q = "INSERT INTO $table (" . implode(',', array_keys($values)) . ') VALUES (' . implode(
1108
-			',',
1109
-			$values
1110
-		) . ")$ret";
1111
-		$couples = spip_pg_query_simple($link, $q);
1112
-		if (!$couples) {
1113
-			return false;
1114
-		} elseif ($ret) {
1115
-			$r = pg_fetch_array($couples, null, PGSQL_NUM);
1116
-			if ($r[0]) {
1117
-				$connexion['last'] = $q = "SELECT setval('$seq', $prim) from $table";
1118
-				// Le code de SPIP met parfois la sequence a 0 (dans l'import)
1119
-				// MySQL n'en dit rien, on fait pareil pour PG
1120
-				$r = @pg_query($link, $q);
1121
-			}
1122
-		}
1123
-	}
1124
-
1125
-	return $couples;
1099
+        if (!$couples) {
1100
+            return false;
1101
+        }
1102
+        $couples = pg_affected_rows($couples);
1103
+    }
1104
+    if (!$couples) {
1105
+        $ret = $seq ? " RETURNING nextval('$seq') < $prim" :
1106
+            ('');
1107
+        $connexion['last'] = $q = "INSERT INTO $table (" . implode(',', array_keys($values)) . ') VALUES (' . implode(
1108
+            ',',
1109
+            $values
1110
+        ) . ")$ret";
1111
+        $couples = spip_pg_query_simple($link, $q);
1112
+        if (!$couples) {
1113
+            return false;
1114
+        } elseif ($ret) {
1115
+            $r = pg_fetch_array($couples, null, PGSQL_NUM);
1116
+            if ($r[0]) {
1117
+                $connexion['last'] = $q = "SELECT setval('$seq', $prim) from $table";
1118
+                // Le code de SPIP met parfois la sequence a 0 (dans l'import)
1119
+                // MySQL n'en dit rien, on fait pareil pour PG
1120
+                $r = @pg_query($link, $q);
1121
+            }
1122
+        }
1123
+    }
1124
+
1125
+    return $couples;
1126 1126
 }
1127 1127
 
1128 1128
 
1129 1129
 function spip_pg_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1130
-	$retour = null;
1131
-	// boucler pour traiter chaque requete independemment
1132
-	foreach ($tab_couples as $couples) {
1133
-		$retour = spip_pg_replace($table, $couples, $desc, $serveur, $requeter);
1134
-	}
1135
-
1136
-	// renvoie le dernier id
1137
-	return $retour;
1130
+    $retour = null;
1131
+    // boucler pour traiter chaque requete independemment
1132
+    foreach ($tab_couples as $couples) {
1133
+        $retour = spip_pg_replace($table, $couples, $desc, $serveur, $requeter);
1134
+    }
1135
+
1136
+    // renvoie le dernier id
1137
+    return $retour;
1138 1138
 }
1139 1139
 
1140 1140
 
@@ -1143,144 +1143,144 @@  discard block
 block discarded – undo
1143 1143
 
1144 1144
 function spip_pg_sequence($table, $raw = false) {
1145 1145
 
1146
-	include_spip('base/serial');
1147
-	if (!isset($GLOBALS['tables_principales'][$table])) {
1148
-		return false;
1149
-	}
1150
-	$desc = $GLOBALS['tables_principales'][$table];
1151
-	$prim = @$desc['key']['PRIMARY KEY'];
1152
-	if (
1153
-		!preg_match('/^\w+$/', (string) $prim) || !str_contains((string) $desc['field'][$prim], 'int')
1154
-	) {
1155
-		return '';
1156
-	} else {
1157
-		return $raw ? $prim : $table . '_' . $prim . '_seq';
1158
-	}
1146
+    include_spip('base/serial');
1147
+    if (!isset($GLOBALS['tables_principales'][$table])) {
1148
+        return false;
1149
+    }
1150
+    $desc = $GLOBALS['tables_principales'][$table];
1151
+    $prim = @$desc['key']['PRIMARY KEY'];
1152
+    if (
1153
+        !preg_match('/^\w+$/', (string) $prim) || !str_contains((string) $desc['field'][$prim], 'int')
1154
+    ) {
1155
+        return '';
1156
+    } else {
1157
+        return $raw ? $prim : $table . '_' . $prim . '_seq';
1158
+    }
1159 1159
 }
1160 1160
 
1161 1161
 // Explicite les conversions de Mysql d'une valeur $v de type $t
1162 1162
 // Dans le cas d'un champ date, pas d'apostrophe, c'est une syntaxe ad hoc
1163 1163
 
1164 1164
 function spip_pg_cite($v, $t) {
1165
-	if (is_null($v)) {
1166
-		return 'NULL';
1167
-	} // null php se traduit en NULL SQL
1168
-
1169
-	if (sql_test_date($t)) {
1170
-		if ($v && !str_contains('0123456789', (string) $v[0])) {
1171
-			return spip_pg_frommysql($v);
1172
-		} else {
1173
-			if (str_starts_with((string) $v, '0000')) {
1174
-				$v = '0001' . substr((string) $v, 4);
1175
-			}
1176
-			if (strpos((string) $v, '-00-00') === 4) {
1177
-				$v = substr((string) $v, 0, 4) . '-01-01' . substr((string) $v, 10);
1178
-			}
1179
-
1180
-			return "timestamp '$v'";
1181
-		}
1182
-	} elseif (!sql_test_int($t)) {
1183
-		return ("'" . pg_escape_string($v) . "'");
1184
-	} elseif (is_numeric($v) || str_starts_with((string) $v, 'CAST(')) {
1185
-		return $v;
1186
-	} elseif ($v[0] == '0' && $v[1] !== 'x' && ctype_xdigit(substr((string) $v, 1))) {
1187
-		return substr((string) $v, 1);
1188
-	} else {
1189
-		spip_logger('pg')->notice("Warning: '$v'  n'est pas de type $t");
1190
-
1191
-		return (int) $v;
1192
-	}
1165
+    if (is_null($v)) {
1166
+        return 'NULL';
1167
+    } // null php se traduit en NULL SQL
1168
+
1169
+    if (sql_test_date($t)) {
1170
+        if ($v && !str_contains('0123456789', (string) $v[0])) {
1171
+            return spip_pg_frommysql($v);
1172
+        } else {
1173
+            if (str_starts_with((string) $v, '0000')) {
1174
+                $v = '0001' . substr((string) $v, 4);
1175
+            }
1176
+            if (strpos((string) $v, '-00-00') === 4) {
1177
+                $v = substr((string) $v, 0, 4) . '-01-01' . substr((string) $v, 10);
1178
+            }
1179
+
1180
+            return "timestamp '$v'";
1181
+        }
1182
+    } elseif (!sql_test_int($t)) {
1183
+        return ("'" . pg_escape_string($v) . "'");
1184
+    } elseif (is_numeric($v) || str_starts_with((string) $v, 'CAST(')) {
1185
+        return $v;
1186
+    } elseif ($v[0] == '0' && $v[1] !== 'x' && ctype_xdigit(substr((string) $v, 1))) {
1187
+        return substr((string) $v, 1);
1188
+    } else {
1189
+        spip_logger('pg')->notice("Warning: '$v'  n'est pas de type $t");
1190
+
1191
+        return (int) $v;
1192
+    }
1193 1193
 }
1194 1194
 
1195 1195
 function spip_pg_hex($v) {
1196
-	return "CAST(x'" . $v . "' as bigint)";
1196
+    return "CAST(x'" . $v . "' as bigint)";
1197 1197
 }
1198 1198
 
1199 1199
 function spip_pg_quote($v, $type = '') {
1200
-	if (!is_array($v)) {
1201
-		return spip_pg_cite($v, $type);
1202
-	}
1203
-	// si c'est un tableau, le parcourir en propageant le type
1204
-	foreach ($v as $k => $r) {
1205
-		$v[$k] = spip_pg_quote($r, $type);
1206
-	}
1207
-
1208
-	return implode(',', $v);
1200
+    if (!is_array($v)) {
1201
+        return spip_pg_cite($v, $type);
1202
+    }
1203
+    // si c'est un tableau, le parcourir en propageant le type
1204
+    foreach ($v as $k => $r) {
1205
+        $v[$k] = spip_pg_quote($r, $type);
1206
+    }
1207
+
1208
+    return implode(',', $v);
1209 1209
 }
1210 1210
 
1211 1211
 function spip_pg_date_proche($champ, $interval, $unite) {
1212
-	return '('
1213
-	. $champ
1214
-	. (($interval <= 0) ? '>' : '<')
1215
-	. (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1216
-	. '('
1217
-	. sql_quote(date('Y-m-d H:i:s'))
1218
-	. ', INTERVAL '
1219
-	. (($interval > 0) ? $interval : (0 - $interval))
1220
-	. ' '
1221
-	. $unite
1222
-	. '))';
1212
+    return '('
1213
+    . $champ
1214
+    . (($interval <= 0) ? '>' : '<')
1215
+    . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1216
+    . '('
1217
+    . sql_quote(date('Y-m-d H:i:s'))
1218
+    . ', INTERVAL '
1219
+    . (($interval > 0) ? $interval : (0 - $interval))
1220
+    . ' '
1221
+    . $unite
1222
+    . '))';
1223 1223
 }
1224 1224
 
1225 1225
 function spip_pg_in($val, $valeurs, $not = '', $serveur = '') {
1226 1226
 //
1227 1227
 // IN (...) souvent limite a 255  elements, d'ou cette fonction assistante
1228 1228
 //
1229
-	// s'il n'y a pas de valeur, eviter de produire un IN vide: PG rale.
1230
-	if (!$valeurs) {
1231
-		return $not ? '0=0' : '0=1';
1232
-	}
1233
-	if (str_contains((string) $valeurs, "CAST(x'")) {
1234
-		return "($val=" . implode("OR $val=", explode(',', (string) $valeurs)) . ')';
1235
-	}
1236
-	$n = $i = 0;
1237
-	$in_sql = '';
1238
-	while ($n = strpos((string) $valeurs, ',', $n + 1)) {
1239
-		if ((++$i) >= 255) {
1240
-			$in_sql .= "($val $not IN (" .
1241
-				substr((string) $valeurs, 0, $n) .
1242
-				"))\n" .
1243
-				($not ? "AND\t" : "OR\t");
1244
-			$valeurs = substr((string) $valeurs, $n + 1);
1245
-			$i = $n = 0;
1246
-		}
1247
-	}
1248
-	$in_sql .= "($val $not IN ($valeurs))";
1249
-
1250
-	return "($in_sql)";
1229
+    // s'il n'y a pas de valeur, eviter de produire un IN vide: PG rale.
1230
+    if (!$valeurs) {
1231
+        return $not ? '0=0' : '0=1';
1232
+    }
1233
+    if (str_contains((string) $valeurs, "CAST(x'")) {
1234
+        return "($val=" . implode("OR $val=", explode(',', (string) $valeurs)) . ')';
1235
+    }
1236
+    $n = $i = 0;
1237
+    $in_sql = '';
1238
+    while ($n = strpos((string) $valeurs, ',', $n + 1)) {
1239
+        if ((++$i) >= 255) {
1240
+            $in_sql .= "($val $not IN (" .
1241
+                substr((string) $valeurs, 0, $n) .
1242
+                "))\n" .
1243
+                ($not ? "AND\t" : "OR\t");
1244
+            $valeurs = substr((string) $valeurs, $n + 1);
1245
+            $i = $n = 0;
1246
+        }
1247
+    }
1248
+    $in_sql .= "($val $not IN ($valeurs))";
1249
+
1250
+    return "($in_sql)";
1251 1251
 }
1252 1252
 
1253 1253
 function spip_pg_error($query = '', $serveur = '', $requeter = true) {
1254
-	$link = $GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0]['link'];
1255
-	$s = $link ? pg_last_error($link) : pg_last_error();
1256
-	if ($s) {
1257
-		$s = str_replace('ERROR', 'errcode: 1000 ', $s);
1258
-		spip_logger('pg')->error("$s - $query");
1259
-	}
1260
-
1261
-	return $s;
1254
+    $link = $GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0]['link'];
1255
+    $s = $link ? pg_last_error($link) : pg_last_error();
1256
+    if ($s) {
1257
+        $s = str_replace('ERROR', 'errcode: 1000 ', $s);
1258
+        spip_logger('pg')->error("$s - $query");
1259
+    }
1260
+
1261
+    return $s;
1262 1262
 }
1263 1263
 
1264 1264
 function spip_pg_errno($serveur = '') {
1265
-	// il faudrait avoir la derniere ressource retournee et utiliser
1266
-	// http://fr2.php.net/manual/fr/function.pg-result-error.php
1267
-	return 0;
1265
+    // il faudrait avoir la derniere ressource retournee et utiliser
1266
+    // http://fr2.php.net/manual/fr/function.pg-result-error.php
1267
+    return 0;
1268 1268
 }
1269 1269
 
1270 1270
 function spip_pg_drop_table($table, $exist = false, $serveur = '', $requeter = true) {
1271
-	$exist = (bool) $exist ? ' IF EXISTS' : '';
1272
-	if (spip_pg_query("DROP TABLE$exist $table", $serveur, $requeter)) {
1273
-		return true;
1274
-	}
1271
+    $exist = (bool) $exist ? ' IF EXISTS' : '';
1272
+    if (spip_pg_query("DROP TABLE$exist $table", $serveur, $requeter)) {
1273
+        return true;
1274
+    }
1275 1275
 
1276
-	return false;
1276
+    return false;
1277 1277
 }
1278 1278
 
1279 1279
 // supprime une vue
1280 1280
 function spip_pg_drop_view($view, $exist = false, $serveur = '', $requeter = true) {
1281
-	$exist = (bool) $exist ? ' IF EXISTS' : '';
1281
+    $exist = (bool) $exist ? ' IF EXISTS' : '';
1282 1282
 
1283
-	return spip_pg_query("DROP VIEW$exist $view", $serveur, $requeter);
1283
+    return spip_pg_query("DROP VIEW$exist $view", $serveur, $requeter);
1284 1284
 }
1285 1285
 
1286 1286
 /**
@@ -1297,40 +1297,40 @@  discard block
 block discarded – undo
1297 1297
  *     Ressource à utiliser avec sql_fetch()
1298 1298
  **/
1299 1299
 function spip_pg_showbase($match, $serveur = '', $requeter = true) {
1300
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1301
-	$link = $connexion['link'];
1302
-	$connexion['last'] = $q = 'SELECT tablename FROM pg_tables WHERE tablename ILIKE ' . _q($match);
1300
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1301
+    $link = $connexion['link'];
1302
+    $connexion['last'] = $q = 'SELECT tablename FROM pg_tables WHERE tablename ILIKE ' . _q($match);
1303 1303
 
1304
-	return spip_pg_query_simple($link, $q);
1304
+    return spip_pg_query_simple($link, $q);
1305 1305
 }
1306 1306
 
1307 1307
 function spip_pg_showtable($nom_table, $serveur = '', $requeter = true) {
1308
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
1309
-	$link = $connexion['link'];
1310
-	$connexion['last'] = $q = 'SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE ' . _q($nom_table);
1311
-
1312
-	$res = spip_pg_query_simple($link, $q);
1313
-	if (!$res) {
1314
-		return false;
1315
-	}
1316
-
1317
-	// etrangement, $res peut ne rien contenir, mais arriver ici...
1318
-	// il faut en tenir compte dans le return
1319
-	$fields = [];
1320
-	while ($field = pg_fetch_array($res, null, PGSQL_NUM)) {
1321
-		$fields[$field[0]] = $field[2] . ($field[1] ? ' DEFAULT ' . $field[1] : (''));
1322
-	}
1323
-	$connexion['last'] = $q = 'SELECT indexdef FROM pg_indexes WHERE tablename ILIKE ' . _q($nom_table);
1324
-	$res = spip_pg_query_simple($link, $q);
1325
-	$keys = [];
1326
-	while ($index = pg_fetch_array($res, null, PGSQL_NUM)) {
1327
-		if (preg_match('/CREATE\s+(UNIQUE\s+)?INDEX\s([^\s]+).*\((.*)\)$/', $index[0], $r)) {
1328
-			$nom = str_replace($nom_table . '_', '', $r[2]);
1329
-			$keys[($r[1] ? 'PRIMARY KEY' : ('KEY ' . $nom))] = $r[3];
1330
-		}
1331
-	}
1332
-
1333
-	return count($fields) ? ['field' => $fields, 'key' => $keys] : false;
1308
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
1309
+    $link = $connexion['link'];
1310
+    $connexion['last'] = $q = 'SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE ' . _q($nom_table);
1311
+
1312
+    $res = spip_pg_query_simple($link, $q);
1313
+    if (!$res) {
1314
+        return false;
1315
+    }
1316
+
1317
+    // etrangement, $res peut ne rien contenir, mais arriver ici...
1318
+    // il faut en tenir compte dans le return
1319
+    $fields = [];
1320
+    while ($field = pg_fetch_array($res, null, PGSQL_NUM)) {
1321
+        $fields[$field[0]] = $field[2] . ($field[1] ? ' DEFAULT ' . $field[1] : (''));
1322
+    }
1323
+    $connexion['last'] = $q = 'SELECT indexdef FROM pg_indexes WHERE tablename ILIKE ' . _q($nom_table);
1324
+    $res = spip_pg_query_simple($link, $q);
1325
+    $keys = [];
1326
+    while ($index = pg_fetch_array($res, null, PGSQL_NUM)) {
1327
+        if (preg_match('/CREATE\s+(UNIQUE\s+)?INDEX\s([^\s]+).*\((.*)\)$/', $index[0], $r)) {
1328
+            $nom = str_replace($nom_table . '_', '', $r[2]);
1329
+            $keys[($r[1] ? 'PRIMARY KEY' : ('KEY ' . $nom))] = $r[3];
1330
+        }
1331
+    }
1332
+
1333
+    return count($fields) ? ['field' => $fields, 'key' => $keys] : false;
1334 1334
 }
1335 1335
 
1336 1336
 // Fonction de creation d'une table SQL nommee $nom
@@ -1341,114 +1341,114 @@  discard block
 block discarded – undo
1341 1341
 // Le nom des index est prefixe par celui de la table pour eviter les conflits
1342 1342
 function spip_pg_create($nom, $champs, $cles, $autoinc = false, $temporary = false, $serveur = '', $requeter = true) {
1343 1343
 
1344
-	$connexion = $GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
1345
-	$link = $connexion['link'];
1346
-	$nom = prefixer_table_spip($nom, $connexion['prefixe']);
1347
-
1348
-	$query = $prim = $prim_name = $v = $s = $p = '';
1349
-	$keys = [];
1350
-
1351
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
1352
-	// sans les renseigner (laisse le compilo recuperer la description)
1353
-	if (!is_array($champs) || !is_array($cles)) {
1354
-		return;
1355
-	}
1356
-
1357
-	foreach ($cles as $k => $v) {
1358
-		if (str_starts_with($k, 'KEY ')) {
1359
-			$n = str_replace('`', '', $k);
1360
-			$v = str_replace('`', '"', (string) $v);
1361
-			$i = $nom . preg_replace('/KEY +/', '_', $n);
1362
-			if ($k != $n) {
1363
-				$i = "\"$i\"";
1364
-			}
1365
-			$keys[] = "CREATE INDEX $i ON $nom ($v);";
1366
-		} elseif (str_starts_with($k, 'UNIQUE ')) {
1367
-			$k = preg_replace('/^UNIQUE +/', '', $k);
1368
-			$prim .= "$s\n\t\tCONSTRAINT " . str_replace('`', '"', $k) . " UNIQUE ($v)";
1369
-		} else {
1370
-			$prim .= "$s\n\t\t" . str_replace('`', '"', $k) . " ($v)";
1371
-		}
1372
-		if ($k == 'PRIMARY KEY') {
1373
-			$prim_name = $v;
1374
-		}
1375
-		$s = ',';
1376
-	}
1377
-	$s = '';
1378
-
1379
-	$character_set = '';
1380
-	if (@$GLOBALS['meta']['charset_sql_base']) {
1381
-		$character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
1382
-	}
1383
-	if (@$GLOBALS['meta']['charset_collation_sql_base']) {
1384
-		$character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
1385
-	}
1386
-
1387
-	foreach ($champs as $k => $v) {
1388
-		$k = str_replace('`', '"', $k);
1389
-		if (preg_match(',([a-z]*\s*(\(\s*\d*\s*\))?(\s*binary)?),i', (string) $v, $defs) && (preg_match(',(char|text),i', $defs[1]) && !preg_match(',binary,i', $defs[1]))) {
1390
-			$v = $defs[1] . $character_set . ' ' . substr((string) $v, strlen($defs[1]));
1391
-		}
1392
-
1393
-		$query .= "$s\n\t\t$k "
1394
-			. (($autoinc && ($prim_name == $k) && preg_match(',\b(big|small|medium|tiny)?int\b,i', (string) $v))
1395
-				? ' bigserial'
1396
-				: mysql2pg_type($v)
1397
-			);
1398
-		$s = ',';
1399
-	}
1400
-	$temporary = $temporary ? 'TEMPORARY' : '';
1401
-
1402
-	// En l'absence de "if not exists" en PG, on neutralise les erreurs
1403
-
1404
-	$q = "CREATE $temporary TABLE $nom ($query" . ($prim ? ",$prim" : '') . ')' .
1405
-		($character_set ? " DEFAULT $character_set" : '')
1406
-		. "\n";
1407
-
1408
-	if (!$requeter) {
1409
-		return $q;
1410
-	}
1411
-	$connexion['last'] = $q;
1412
-	$r = @pg_query($link, $q);
1413
-
1414
-	if (!$r) {
1415
-		spip_logger('pg')->error("Impossible de creer cette table: $q");
1416
-	} else {
1417
-		foreach ($keys as $index) {
1418
-			pg_query($link, $index);
1419
-		}
1420
-	}
1421
-
1422
-	return $r;
1344
+    $connexion = $GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
1345
+    $link = $connexion['link'];
1346
+    $nom = prefixer_table_spip($nom, $connexion['prefixe']);
1347
+
1348
+    $query = $prim = $prim_name = $v = $s = $p = '';
1349
+    $keys = [];
1350
+
1351
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
1352
+    // sans les renseigner (laisse le compilo recuperer la description)
1353
+    if (!is_array($champs) || !is_array($cles)) {
1354
+        return;
1355
+    }
1356
+
1357
+    foreach ($cles as $k => $v) {
1358
+        if (str_starts_with($k, 'KEY ')) {
1359
+            $n = str_replace('`', '', $k);
1360
+            $v = str_replace('`', '"', (string) $v);
1361
+            $i = $nom . preg_replace('/KEY +/', '_', $n);
1362
+            if ($k != $n) {
1363
+                $i = "\"$i\"";
1364
+            }
1365
+            $keys[] = "CREATE INDEX $i ON $nom ($v);";
1366
+        } elseif (str_starts_with($k, 'UNIQUE ')) {
1367
+            $k = preg_replace('/^UNIQUE +/', '', $k);
1368
+            $prim .= "$s\n\t\tCONSTRAINT " . str_replace('`', '"', $k) . " UNIQUE ($v)";
1369
+        } else {
1370
+            $prim .= "$s\n\t\t" . str_replace('`', '"', $k) . " ($v)";
1371
+        }
1372
+        if ($k == 'PRIMARY KEY') {
1373
+            $prim_name = $v;
1374
+        }
1375
+        $s = ',';
1376
+    }
1377
+    $s = '';
1378
+
1379
+    $character_set = '';
1380
+    if (@$GLOBALS['meta']['charset_sql_base']) {
1381
+        $character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
1382
+    }
1383
+    if (@$GLOBALS['meta']['charset_collation_sql_base']) {
1384
+        $character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
1385
+    }
1386
+
1387
+    foreach ($champs as $k => $v) {
1388
+        $k = str_replace('`', '"', $k);
1389
+        if (preg_match(',([a-z]*\s*(\(\s*\d*\s*\))?(\s*binary)?),i', (string) $v, $defs) && (preg_match(',(char|text),i', $defs[1]) && !preg_match(',binary,i', $defs[1]))) {
1390
+            $v = $defs[1] . $character_set . ' ' . substr((string) $v, strlen($defs[1]));
1391
+        }
1392
+
1393
+        $query .= "$s\n\t\t$k "
1394
+            . (($autoinc && ($prim_name == $k) && preg_match(',\b(big|small|medium|tiny)?int\b,i', (string) $v))
1395
+                ? ' bigserial'
1396
+                : mysql2pg_type($v)
1397
+            );
1398
+        $s = ',';
1399
+    }
1400
+    $temporary = $temporary ? 'TEMPORARY' : '';
1401
+
1402
+    // En l'absence de "if not exists" en PG, on neutralise les erreurs
1403
+
1404
+    $q = "CREATE $temporary TABLE $nom ($query" . ($prim ? ",$prim" : '') . ')' .
1405
+        ($character_set ? " DEFAULT $character_set" : '')
1406
+        . "\n";
1407
+
1408
+    if (!$requeter) {
1409
+        return $q;
1410
+    }
1411
+    $connexion['last'] = $q;
1412
+    $r = @pg_query($link, $q);
1413
+
1414
+    if (!$r) {
1415
+        spip_logger('pg')->error("Impossible de creer cette table: $q");
1416
+    } else {
1417
+        foreach ($keys as $index) {
1418
+            pg_query($link, $index);
1419
+        }
1420
+    }
1421
+
1422
+    return $r;
1423 1423
 }
1424 1424
 
1425 1425
 
1426 1426
 function spip_pg_create_base($nom, $serveur = '', $requeter = true) {
1427
-	return spip_pg_query("CREATE DATABASE $nom", $serveur, $requeter);
1427
+    return spip_pg_query("CREATE DATABASE $nom", $serveur, $requeter);
1428 1428
 }
1429 1429
 
1430 1430
 // Fonction de creation d'une vue SQL nommee $nom
1431 1431
 function spip_pg_create_view($nom, $query_select, $serveur = '', $requeter = true) {
1432
-	if (!$query_select) {
1433
-		return false;
1434
-	}
1435
-	// vue deja presente
1436
-	if (sql_showtable($nom, false, $serveur)) {
1437
-		if ($requeter) {
1438
-			spip_logger('pg')->error("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)");
1439
-		}
1432
+    if (!$query_select) {
1433
+        return false;
1434
+    }
1435
+    // vue deja presente
1436
+    if (sql_showtable($nom, false, $serveur)) {
1437
+        if ($requeter) {
1438
+            spip_logger('pg')->error("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)");
1439
+        }
1440 1440
 
1441
-		return false;
1442
-	}
1441
+        return false;
1442
+    }
1443 1443
 
1444
-	$query = "CREATE VIEW $nom AS " . $query_select;
1444
+    $query = "CREATE VIEW $nom AS " . $query_select;
1445 1445
 
1446
-	return spip_pg_query($query, $serveur, $requeter);
1446
+    return spip_pg_query($query, $serveur, $requeter);
1447 1447
 }
1448 1448
 
1449 1449
 
1450 1450
 function spip_pg_set_connect_charset($charset, $serveur = '', $requeter = true) {
1451
-	spip_logger('pg')->error('changement de charset sql a ecrire en PG');
1451
+    spip_logger('pg')->error('changement de charset sql a ecrire en PG');
1452 1452
 }
1453 1453
 
1454 1454
 
@@ -1461,48 +1461,48 @@  discard block
 block discarded – undo
1461 1461
  * @return bool|string true / false / requete
1462 1462
  **/
1463 1463
 function spip_pg_optimize($table, $serveur = '', $requeter = true) {
1464
-	return spip_pg_query('VACUUM ' . $table, $serveur, $requeter);
1464
+    return spip_pg_query('VACUUM ' . $table, $serveur, $requeter);
1465 1465
 }
1466 1466
 
1467 1467
 // Selectionner la sous-chaine dans $objet
1468 1468
 // correspondant a $lang. Cf balise Multi de Spip
1469 1469
 
1470 1470
 function spip_pg_multi($objet, $lang) {
1471
-	return 'regexp_replace('
1472
-		. $objet
1473
-		. ",'<multi>.*[[]"
1474
-		. $lang
1475
-		. "[]]([^[]*).*</multi>', E'\\\\1') AS multi";
1471
+    return 'regexp_replace('
1472
+        . $objet
1473
+        . ",'<multi>.*[[]"
1474
+        . $lang
1475
+        . "[]]([^[]*).*</multi>', E'\\\\1') AS multi";
1476 1476
 }
1477 1477
 
1478 1478
 // Palanquee d'idiosyncrasies MySQL dans les creations de table
1479 1479
 // A completer par les autres, mais essayer de reduire en amont.
1480 1480
 
1481 1481
 function mysql2pg_type($v) {
1482
-	$remplace = [
1483
-		'/auto_increment/i' => '', // non reconnu
1484
-		'/bigint/i' => 'bigint',
1485
-		'/mediumint/i' => 'mediumint',
1486
-		'/smallint/i' => 'smallint',
1487
-		'/tinyint/i' => 'int',
1488
-		'/int\s*[(]\s*\d+\s*[)]/i' => 'int',
1489
-		'/longtext/i' => 'text',
1490
-		'/mediumtext/i' => 'text',
1491
-		'/tinytext/i' => 'text',
1492
-		'/longblob/i' => 'text',
1493
-		'/0000-00-00/' => '0001-01-01',
1494
-		'/datetime/i' => 'timestamp',
1495
-		'/unsigned/i' => '',
1496
-		'/double/i' => 'double precision',
1497
-		'/VARCHAR\((\d+)\)\s+BINARY/i' => 'varchar(\1)',
1498
-		'/ENUM *[(][^)]*[)]/i' => 'varchar(255)',
1499
-		'/(timestamp .* )ON .*$/is' => '\\1',
1500
-	];
1501
-
1502
-	return preg_replace(array_keys($remplace), array_values($remplace), (string) $v);
1482
+    $remplace = [
1483
+        '/auto_increment/i' => '', // non reconnu
1484
+        '/bigint/i' => 'bigint',
1485
+        '/mediumint/i' => 'mediumint',
1486
+        '/smallint/i' => 'smallint',
1487
+        '/tinyint/i' => 'int',
1488
+        '/int\s*[(]\s*\d+\s*[)]/i' => 'int',
1489
+        '/longtext/i' => 'text',
1490
+        '/mediumtext/i' => 'text',
1491
+        '/tinytext/i' => 'text',
1492
+        '/longblob/i' => 'text',
1493
+        '/0000-00-00/' => '0001-01-01',
1494
+        '/datetime/i' => 'timestamp',
1495
+        '/unsigned/i' => '',
1496
+        '/double/i' => 'double precision',
1497
+        '/VARCHAR\((\d+)\)\s+BINARY/i' => 'varchar(\1)',
1498
+        '/ENUM *[(][^)]*[)]/i' => 'varchar(255)',
1499
+        '/(timestamp .* )ON .*$/is' => '\\1',
1500
+    ];
1501
+
1502
+    return preg_replace(array_keys($remplace), array_values($remplace), (string) $v);
1503 1503
 }
1504 1504
 
1505 1505
 // Renvoie false si on n'a pas les fonctions pg (pour l'install)
1506 1506
 function spip_versions_pg() {
1507
-	return function_exists('pg_connect');
1507
+    return function_exists('pg_connect');
1508 1508
 }
Please login to merge, or discard this patch.
Spacing   +65 added lines, -66 removed lines patch added patch discarded remove patch
@@ -59,7 +59,7 @@  discard block
 block discarded – undo
59 59
 	if (!$link) {
60 60
 		$erreurs[] = pg_last_error();
61 61
 		foreach ($erreurs as $e) {
62
-			spip_logger('pg')->emergency('Echec pg_connect. Erreur : ' . $e);
62
+			spip_logger('pg')->emergency('Echec pg_connect. Erreur : '.$e);
63 63
 		}
64 64
 
65 65
 		return false;
@@ -77,7 +77,7 @@  discard block
 block discarded – undo
77 77
 	}
78 78
 
79 79
 	spip_logger('pg')->debug(
80
-		"Connexion vers $host, base $db, prefixe $prefixe " . ($link ? 'operationnelle' : 'impossible'),
80
+		"Connexion vers $host, base $db, prefixe $prefixe ".($link ? 'operationnelle' : 'impossible'),
81 81
 	);
82 82
 
83 83
 	return $link ? [
@@ -165,7 +165,7 @@  discard block
 block discarded – undo
165 165
 	} else {
166 166
 		$suite = '';
167 167
 	}
168
-	$query = preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', (string) $query) . $suite;
168
+	$query = preg_replace('/([,\s])spip_/', '\1'.$prefixe.'_', (string) $query).$suite;
169 169
 
170 170
 	// renvoyer la requete inerte si demandee
171 171
 	if (!$requeter) {
@@ -246,7 +246,7 @@  discard block
 block discarded – undo
246 246
 	$i = 0;
247 247
 	$ouverte = false;
248 248
 	while ($do = array_shift($todo)) {
249
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
249
+		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i].','.$do : $do;
250 250
 		$o = (str_contains($do, '('));
251 251
 		$f = (str_contains($do, ')'));
252 252
 		if ($o && !$f) {
@@ -259,7 +259,7 @@  discard block
 block discarded – undo
259 259
 		}
260 260
 	}
261 261
 	$todo = $todo2;
262
-	$query = $debut . ' ' . array_shift($todo);
262
+	$query = $debut.' '.array_shift($todo);
263 263
 
264 264
 	if (!preg_match('/^\s*(IGNORE\s*)?TABLE\s+(\w+)\s+(ADD|DROP|CHANGE|MODIFY|RENAME)\s*(.*)$/is', $query, $r)) {
265 265
 		spip_logger('pg')->error("$query incompris");
@@ -267,7 +267,7 @@  discard block
 block discarded – undo
267 267
 		if ($r[1]) {
268 268
 			spip_logger('pg')->warning("j'ignore IGNORE dans $query");
269 269
 		}
270
-		$f = 'spip_pg_alter_' . strtolower($r[3]);
270
+		$f = 'spip_pg_alter_'.strtolower($r[3]);
271 271
 		if (function_exists($f)) {
272 272
 			$f($r[2], $r[4], $serveur, $requeter);
273 273
 		} else {
@@ -276,7 +276,7 @@  discard block
 block discarded – undo
276 276
 	}
277 277
 	// Alter a plusieurs args. Faudrait optimiser.
278 278
 	if ($todo) {
279
-		spip_pg_alter("TABLE $table " . implode(',', $todo));
279
+		spip_pg_alter("TABLE $table ".implode(',', $todo));
280 280
 	}
281 281
 }
282 282
 
@@ -285,7 +285,7 @@  discard block
 block discarded – undo
285 285
 		spip_logger('pg')->error("alter change: $arg  incompris");
286 286
 	} else {
287 287
 		[, $old, $new, $type, $default, $null, $def2] = $r;
288
-		$actions = ["ALTER $old TYPE " . mysql2pg_type($type)];
288
+		$actions = ["ALTER $old TYPE ".mysql2pg_type($type)];
289 289
 		$actions[] = $null ? "ALTER $old SET NOT NULL" : "ALTER $old DROP NOT NULL";
290 290
 
291 291
 		if ($d = ($default ?: $def2)) {
@@ -294,7 +294,7 @@  discard block
 block discarded – undo
294 294
 			$actions[] = "ALTER $old DROP DEFAULT";
295 295
 		}
296 296
 
297
-		spip_pg_query("ALTER TABLE $table " . implode(', ', $actions));
297
+		spip_pg_query("ALTER TABLE $table ".implode(', ', $actions));
298 298
 
299 299
 		if ($old !== $new) {
300 300
 			spip_pg_query("ALTER TABLE $table RENAME $old TO $new", $serveur);
@@ -315,14 +315,14 @@  discard block
 block discarded – undo
315 315
 			$m[2] = $n[1];
316 316
 		}
317 317
 
318
-		return spip_pg_query("ALTER TABLE $table ADD " . $m[1] . ' ' . mysql2pg_type($m[2]), $serveur, $requeter);
318
+		return spip_pg_query("ALTER TABLE $table ADD ".$m[1].' '.mysql2pg_type($m[2]), $serveur, $requeter);
319 319
 	} elseif ($r[1][0] == 'P') {
320 320
 		// la primary peut etre sur plusieurs champs
321 321
 		$r[2] = trim(str_replace('`', '', $r[2]));
322 322
 		$m = ($r[2][0] == '(') ? substr($r[2], 1, -1) : $r[2];
323 323
 
324 324
 		return spip_pg_query(
325
-			"ALTER TABLE $table ADD CONSTRAINT $table" . '_pkey PRIMARY KEY (' . $m . ')',
325
+			"ALTER TABLE $table ADD CONSTRAINT $table".'_pkey PRIMARY KEY ('.$m.')',
326 326
 			$serveur,
327 327
 			$requeter
328 328
 		);
@@ -360,11 +360,11 @@  discard block
 block discarded – undo
360 360
 		spip_logger('pg')->error("alter drop: $arg  incompris");
361 361
 	} else {
362 362
 		if (!$r[1] || $r[1] == 'COLUMN') {
363
-			return spip_pg_query("ALTER TABLE $table DROP " . $r[2], $serveur);
363
+			return spip_pg_query("ALTER TABLE $table DROP ".$r[2], $serveur);
364 364
 		} elseif ($r[1][0] == 'P') {
365
-			return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table" . '_pkey', $serveur);
365
+			return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table".'_pkey', $serveur);
366 366
 		} else {
367
-			return spip_pg_query('DROP INDEX ' . $table . '_' . $r[2], $serveur);
367
+			return spip_pg_query('DROP INDEX '.$table.'_'.$r[2], $serveur);
368 368
 		}
369 369
 	}
370 370
 }
@@ -373,7 +373,7 @@  discard block
 block discarded – undo
373 373
 	if (!preg_match('/^`?(\w+)`?\s+(.*)$/', (string) $arg, $r)) {
374 374
 		spip_logger('pg')->error("alter modify: $arg  incompris");
375 375
 	} else {
376
-		return spip_pg_alter_change($table, $r[1] . ' ' . $arg, $serveur = '', $requeter = true);
376
+		return spip_pg_alter_change($table, $r[1].' '.$arg, $serveur = '', $requeter = true);
377 377
 	}
378 378
 }
379 379
 
@@ -410,7 +410,7 @@  discard block
 block discarded – undo
410 410
 function spip_pg_create_index($nom, $table, $champs, $serveur = '', $requeter = true) {
411 411
 	if (!($nom || $table || $champs)) {
412 412
 		spip_logger('pg')->error(
413
-			"Champ manquant pour creer un index pg ($nom, $table, (" . @implode(',', $champs) . '))',
413
+			"Champ manquant pour creer un index pg ($nom, $table, (".@implode(',', $champs).'))',
414 414
 		);
415 415
 
416 416
 		return false;
@@ -421,7 +421,7 @@  discard block
 block discarded – undo
421 421
 
422 422
 	// PG ne differentie pas noms des index en fonction des tables
423 423
 	// il faut donc creer des noms uniques d'index pour une base pg
424
-	$nom = $table . '_' . $nom;
424
+	$nom = $table.'_'.$nom;
425 425
 	// enlever d'eventuelles parentheses deja presentes sur champs
426 426
 	if (!is_array($champs)) {
427 427
 		if ($champs[0] == '(') {
@@ -429,7 +429,7 @@  discard block
 block discarded – undo
429 429
 		}
430 430
 		$champs = [$champs];
431 431
 	}
432
-	$query = "CREATE INDEX $nom ON $table (" . implode(',', $champs) . ')';
432
+	$query = "CREATE INDEX $nom ON $table (".implode(',', $champs).')';
433 433
 	if (!$requeter) {
434 434
 		return $query;
435 435
 	}
@@ -451,7 +451,7 @@  discard block
 block discarded – undo
451 451
 	} else {
452 452
 		$suite = '';
453 453
 	}
454
-	$query = 'EXPLAIN ' . preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', (string) $query) . $suite;
454
+	$query = 'EXPLAIN '.preg_replace('/([,\s])spip_/', '\1'.$prefixe.'_', (string) $query).$suite;
455 455
 
456 456
 	if (!$requeter) {
457 457
 		return $query;
@@ -540,16 +540,16 @@  discard block
 block discarded – undo
540 540
 		$having = implode("\n\tAND ", array_map('calculer_pg_where', $having));
541 541
 	}
542 542
 	$from = spip_pg_from($from, $prefixe);
543
-	$query = 'SELECT ' . $select
543
+	$query = 'SELECT '.$select
544 544
 		. ($from ? "\nFROM $from" : '')
545
-		. ($where ? "\nWHERE " . (is_array($where) ? implode(
545
+		. ($where ? "\nWHERE ".(is_array($where) ? implode(
546 546
 			"\n\tAND ",
547 547
 			array_map('calculer_pg_where', $where)
548 548
 		) : (calculer_pg_where($where))) : (''))
549 549
 		. spip_pg_groupby($groupby, $from, $select)
550 550
 		. ($having ? "\nHAVING $having" : '')
551 551
 		. ($orderby ? ("\nORDER BY $orderby") : '')
552
-		. ($limit ? " LIMIT $count" . ($offset ? " OFFSET $offset" : '') : (''));
552
+		. ($limit ? " LIMIT $count".($offset ? " OFFSET $offset" : '') : (''));
553 553
 
554 554
 	// renvoyer la requete inerte si demandee
555 555
 	if ($requeter === false) {
@@ -570,7 +570,7 @@  discard block
 block discarded – undo
570 570
 		$from = spip_pg_select_as($from);
571 571
 	}
572 572
 
573
-	return $prefixe ? preg_replace('/(\b)spip_/', '\1' . $prefixe . '_', (string) $from) : $from;
573
+	return $prefixe ? preg_replace('/(\b)spip_/', '\1'.$prefixe.'_', (string) $from) : $from;
574 574
 }
575 575
 
576 576
 function spip_pg_orderby($order, $select) {
@@ -578,7 +578,7 @@  discard block
 block discarded – undo
578 578
 	$arg = (is_array($order) ? $order : preg_split('/\s*,\s*/', (string) $order));
579 579
 
580 580
 	foreach ($arg as $v) {
581
-		$res[] = preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+' . $v . '/', (string) $select, $m) ? $m[1] : $v;
581
+		$res[] = preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+'.$v.'/', (string) $select, $m) ? $m[1] : $v;
582 582
 	}
583 583
 
584 584
 	return spip_pg_frommysql(implode(',', $res));
@@ -752,7 +752,7 @@  discard block
 block discarded – undo
752 752
 			$n++;
753 753
 			$res .= "\nwhen $index=$v then $n";
754 754
 		}
755
-		$arg = $m[1] . "case $res else 0 end "
755
+		$arg = $m[1]."case $res else 0 end "
756 756
 			. substr((string) $arg, strlen($m[0]));
757 757
 	}
758 758
 
@@ -795,9 +795,9 @@  discard block
 block discarded – undo
795 795
 	}
796 796
 
797 797
 	if (strtoupper((string) $join) === 'AND') {
798
-		return $exp . implode("\n\t$join ", array_map('calculer_pg_where', $v));
798
+		return $exp.implode("\n\t$join ", array_map('calculer_pg_where', $v));
799 799
 	} else {
800
-		return $exp . implode($join, $v);
800
+		return $exp.implode($join, $v);
801 801
 	}
802 802
 }
803 803
 
@@ -807,7 +807,7 @@  discard block
 block discarded – undo
807 807
 		if (str_ends_with((string) $k, '@')) {
808 808
 			// c'est une jointure qui se refere au from precedent
809 809
 			// pas de virgule
810
-			$argsas .= '  ' . $v;
810
+			$argsas .= '  '.$v;
811 811
 		} else {
812 812
 			$as = '';
813 813
 			//  spip_logger('pg')->debug("$k : $v");
@@ -817,7 +817,7 @@  discard block
 block discarded – undo
817 817
 				} elseif ($v != $k) {
818 818
 					$p = strpos((string) $v, ' ');
819 819
 					if ($p) {
820
-						$v = substr((string) $v, 0, $p) . " AS $k" . substr((string) $v, $p);
820
+						$v = substr((string) $v, 0, $p)." AS $k".substr((string) $v, $p);
821 821
 					} else {
822 822
 						$as = " AS $k";
823 823
 					}
@@ -825,7 +825,7 @@  discard block
 block discarded – undo
825 825
 			}
826 826
 			// spip_logger('pg')->debug("subs $k : $v avec $as");
827 827
 			// if (strpos($v, 'JOIN') === false)  $argsas .= ', ';
828
-			$argsas .= ', ' . $v . $as;
828
+			$argsas .= ', '.$v.$as;
829 829
 		}
830 830
 	}
831 831
 
@@ -856,7 +856,7 @@  discard block
 block discarded – undo
856 856
 	$serveur = '',
857 857
 	$requeter = true
858 858
 ) {
859
-	$c = $groupby ? 'DISTINCT ' . (is_string($groupby) ? $groupby : implode(',', $groupby)) : ('*');
859
+	$c = $groupby ? 'DISTINCT '.(is_string($groupby) ? $groupby : implode(',', $groupby)) : ('*');
860 860
 	$r = spip_pg_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
861 861
 	if (!$requeter) {
862 862
 		return $r;
@@ -957,8 +957,8 @@  discard block
 block discarded – undo
957 957
 
958 958
 	return spip_pg_insert(
959 959
 		$table,
960
-		'(' . implode(',', array_keys($couples)) . ')',
961
-		'(' . implode(',', $couples) . ')',
960
+		'('.implode(',', array_keys($couples)).')',
961
+		'('.implode(',', $couples).')',
962 962
 		$desc,
963 963
 		$serveur,
964 964
 		$requeter
@@ -981,7 +981,7 @@  discard block
 block discarded – undo
981 981
 	$c = $tab_couples[0] ?? [];
982 982
 	$les_cles = spip_pg_ajouter_champs_timestamp($table, $c, $desc, $serveur);
983 983
 
984
-	$cles = '(' . implode(',', array_keys($les_cles)) . ')';
984
+	$cles = '('.implode(',', array_keys($les_cles)).')';
985 985
 	$valeurs = [];
986 986
 	foreach ($tab_couples as $couples) {
987 987
 		foreach ($couples as $champ => $val) {
@@ -990,7 +990,7 @@  discard block
 block discarded – undo
990 990
 		// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
991 991
 		$couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
992 992
 
993
-		$valeurs[] = '(' . implode(',', $couples) . ')';
993
+		$valeurs[] = '('.implode(',', $couples).')';
994 994
 	}
995 995
 	$valeurs = implode(', ', $valeurs);
996 996
 
@@ -1011,7 +1011,7 @@  discard block
 block discarded – undo
1011 1011
 
1012 1012
 	$set = [];
1013 1013
 	foreach ($couples as $champ => $val) {
1014
-		$set[] = $champ . '=' . $val;
1014
+		$set[] = $champ.'='.$val;
1015 1015
 	}
1016 1016
 
1017 1017
 	$query = calculer_pg_expression('UPDATE', $table, ',')
@@ -1080,8 +1080,8 @@  discard block
 block discarded – undo
1080 1080
 	if (!$where) {
1081 1081
 		return spip_pg_insert(
1082 1082
 			$table,
1083
-			'(' . implode(',', array_keys($values)) . ')',
1084
-			'(' . implode(',', $values) . ')',
1083
+			'('.implode(',', array_keys($values)).')',
1084
+			'('.implode(',', $values).')',
1085 1085
 			$desc,
1086 1086
 			$serveur
1087 1087
 		);
@@ -1102,12 +1102,11 @@  discard block
 block discarded – undo
1102 1102
 		$couples = pg_affected_rows($couples);
1103 1103
 	}
1104 1104
 	if (!$couples) {
1105
-		$ret = $seq ? " RETURNING nextval('$seq') < $prim" :
1106
-			('');
1107
-		$connexion['last'] = $q = "INSERT INTO $table (" . implode(',', array_keys($values)) . ') VALUES (' . implode(
1105
+		$ret = $seq ? " RETURNING nextval('$seq') < $prim" : ('');
1106
+		$connexion['last'] = $q = "INSERT INTO $table (".implode(',', array_keys($values)).') VALUES ('.implode(
1108 1107
 			',',
1109 1108
 			$values
1110
-		) . ")$ret";
1109
+		).")$ret";
1111 1110
 		$couples = spip_pg_query_simple($link, $q);
1112 1111
 		if (!$couples) {
1113 1112
 			return false;
@@ -1154,7 +1153,7 @@  discard block
 block discarded – undo
1154 1153
 	) {
1155 1154
 		return '';
1156 1155
 	} else {
1157
-		return $raw ? $prim : $table . '_' . $prim . '_seq';
1156
+		return $raw ? $prim : $table.'_'.$prim.'_seq';
1158 1157
 	}
1159 1158
 }
1160 1159
 
@@ -1171,16 +1170,16 @@  discard block
 block discarded – undo
1171 1170
 			return spip_pg_frommysql($v);
1172 1171
 		} else {
1173 1172
 			if (str_starts_with((string) $v, '0000')) {
1174
-				$v = '0001' . substr((string) $v, 4);
1173
+				$v = '0001'.substr((string) $v, 4);
1175 1174
 			}
1176 1175
 			if (strpos((string) $v, '-00-00') === 4) {
1177
-				$v = substr((string) $v, 0, 4) . '-01-01' . substr((string) $v, 10);
1176
+				$v = substr((string) $v, 0, 4).'-01-01'.substr((string) $v, 10);
1178 1177
 			}
1179 1178
 
1180 1179
 			return "timestamp '$v'";
1181 1180
 		}
1182 1181
 	} elseif (!sql_test_int($t)) {
1183
-		return ("'" . pg_escape_string($v) . "'");
1182
+		return ("'".pg_escape_string($v)."'");
1184 1183
 	} elseif (is_numeric($v) || str_starts_with((string) $v, 'CAST(')) {
1185 1184
 		return $v;
1186 1185
 	} elseif ($v[0] == '0' && $v[1] !== 'x' && ctype_xdigit(substr((string) $v, 1))) {
@@ -1193,7 +1192,7 @@  discard block
 block discarded – undo
1193 1192
 }
1194 1193
 
1195 1194
 function spip_pg_hex($v) {
1196
-	return "CAST(x'" . $v . "' as bigint)";
1195
+	return "CAST(x'".$v."' as bigint)";
1197 1196
 }
1198 1197
 
1199 1198
 function spip_pg_quote($v, $type = '') {
@@ -1231,15 +1230,15 @@  discard block
 block discarded – undo
1231 1230
 		return $not ? '0=0' : '0=1';
1232 1231
 	}
1233 1232
 	if (str_contains((string) $valeurs, "CAST(x'")) {
1234
-		return "($val=" . implode("OR $val=", explode(',', (string) $valeurs)) . ')';
1233
+		return "($val=".implode("OR $val=", explode(',', (string) $valeurs)).')';
1235 1234
 	}
1236 1235
 	$n = $i = 0;
1237 1236
 	$in_sql = '';
1238 1237
 	while ($n = strpos((string) $valeurs, ',', $n + 1)) {
1239 1238
 		if ((++$i) >= 255) {
1240
-			$in_sql .= "($val $not IN (" .
1241
-				substr((string) $valeurs, 0, $n) .
1242
-				"))\n" .
1239
+			$in_sql .= "($val $not IN (".
1240
+				substr((string) $valeurs, 0, $n).
1241
+				"))\n".
1243 1242
 				($not ? "AND\t" : "OR\t");
1244 1243
 			$valeurs = substr((string) $valeurs, $n + 1);
1245 1244
 			$i = $n = 0;
@@ -1299,7 +1298,7 @@  discard block
 block discarded – undo
1299 1298
 function spip_pg_showbase($match, $serveur = '', $requeter = true) {
1300 1299
 	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1301 1300
 	$link = $connexion['link'];
1302
-	$connexion['last'] = $q = 'SELECT tablename FROM pg_tables WHERE tablename ILIKE ' . _q($match);
1301
+	$connexion['last'] = $q = 'SELECT tablename FROM pg_tables WHERE tablename ILIKE '._q($match);
1303 1302
 
1304 1303
 	return spip_pg_query_simple($link, $q);
1305 1304
 }
@@ -1307,7 +1306,7 @@  discard block
 block discarded – undo
1307 1306
 function spip_pg_showtable($nom_table, $serveur = '', $requeter = true) {
1308 1307
 	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower((string) $serveur) : 0];
1309 1308
 	$link = $connexion['link'];
1310
-	$connexion['last'] = $q = 'SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE ' . _q($nom_table);
1309
+	$connexion['last'] = $q = 'SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE '._q($nom_table);
1311 1310
 
1312 1311
 	$res = spip_pg_query_simple($link, $q);
1313 1312
 	if (!$res) {
@@ -1318,15 +1317,15 @@  discard block
 block discarded – undo
1318 1317
 	// il faut en tenir compte dans le return
1319 1318
 	$fields = [];
1320 1319
 	while ($field = pg_fetch_array($res, null, PGSQL_NUM)) {
1321
-		$fields[$field[0]] = $field[2] . ($field[1] ? ' DEFAULT ' . $field[1] : (''));
1320
+		$fields[$field[0]] = $field[2].($field[1] ? ' DEFAULT '.$field[1] : (''));
1322 1321
 	}
1323
-	$connexion['last'] = $q = 'SELECT indexdef FROM pg_indexes WHERE tablename ILIKE ' . _q($nom_table);
1322
+	$connexion['last'] = $q = 'SELECT indexdef FROM pg_indexes WHERE tablename ILIKE '._q($nom_table);
1324 1323
 	$res = spip_pg_query_simple($link, $q);
1325 1324
 	$keys = [];
1326 1325
 	while ($index = pg_fetch_array($res, null, PGSQL_NUM)) {
1327 1326
 		if (preg_match('/CREATE\s+(UNIQUE\s+)?INDEX\s([^\s]+).*\((.*)\)$/', $index[0], $r)) {
1328
-			$nom = str_replace($nom_table . '_', '', $r[2]);
1329
-			$keys[($r[1] ? 'PRIMARY KEY' : ('KEY ' . $nom))] = $r[3];
1327
+			$nom = str_replace($nom_table.'_', '', $r[2]);
1328
+			$keys[($r[1] ? 'PRIMARY KEY' : ('KEY '.$nom))] = $r[3];
1330 1329
 		}
1331 1330
 	}
1332 1331
 
@@ -1358,16 +1357,16 @@  discard block
 block discarded – undo
1358 1357
 		if (str_starts_with($k, 'KEY ')) {
1359 1358
 			$n = str_replace('`', '', $k);
1360 1359
 			$v = str_replace('`', '"', (string) $v);
1361
-			$i = $nom . preg_replace('/KEY +/', '_', $n);
1360
+			$i = $nom.preg_replace('/KEY +/', '_', $n);
1362 1361
 			if ($k != $n) {
1363 1362
 				$i = "\"$i\"";
1364 1363
 			}
1365 1364
 			$keys[] = "CREATE INDEX $i ON $nom ($v);";
1366 1365
 		} elseif (str_starts_with($k, 'UNIQUE ')) {
1367 1366
 			$k = preg_replace('/^UNIQUE +/', '', $k);
1368
-			$prim .= "$s\n\t\tCONSTRAINT " . str_replace('`', '"', $k) . " UNIQUE ($v)";
1367
+			$prim .= "$s\n\t\tCONSTRAINT ".str_replace('`', '"', $k)." UNIQUE ($v)";
1369 1368
 		} else {
1370
-			$prim .= "$s\n\t\t" . str_replace('`', '"', $k) . " ($v)";
1369
+			$prim .= "$s\n\t\t".str_replace('`', '"', $k)." ($v)";
1371 1370
 		}
1372 1371
 		if ($k == 'PRIMARY KEY') {
1373 1372
 			$prim_name = $v;
@@ -1378,16 +1377,16 @@  discard block
 block discarded – undo
1378 1377
 
1379 1378
 	$character_set = '';
1380 1379
 	if (@$GLOBALS['meta']['charset_sql_base']) {
1381
-		$character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
1380
+		$character_set .= ' CHARACTER SET '.$GLOBALS['meta']['charset_sql_base'];
1382 1381
 	}
1383 1382
 	if (@$GLOBALS['meta']['charset_collation_sql_base']) {
1384
-		$character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
1383
+		$character_set .= ' COLLATE '.$GLOBALS['meta']['charset_collation_sql_base'];
1385 1384
 	}
1386 1385
 
1387 1386
 	foreach ($champs as $k => $v) {
1388 1387
 		$k = str_replace('`', '"', $k);
1389 1388
 		if (preg_match(',([a-z]*\s*(\(\s*\d*\s*\))?(\s*binary)?),i', (string) $v, $defs) && (preg_match(',(char|text),i', $defs[1]) && !preg_match(',binary,i', $defs[1]))) {
1390
-			$v = $defs[1] . $character_set . ' ' . substr((string) $v, strlen($defs[1]));
1389
+			$v = $defs[1].$character_set.' '.substr((string) $v, strlen($defs[1]));
1391 1390
 		}
1392 1391
 
1393 1392
 		$query .= "$s\n\t\t$k "
@@ -1401,7 +1400,7 @@  discard block
 block discarded – undo
1401 1400
 
1402 1401
 	// En l'absence de "if not exists" en PG, on neutralise les erreurs
1403 1402
 
1404
-	$q = "CREATE $temporary TABLE $nom ($query" . ($prim ? ",$prim" : '') . ')' .
1403
+	$q = "CREATE $temporary TABLE $nom ($query".($prim ? ",$prim" : '').')'.
1405 1404
 		($character_set ? " DEFAULT $character_set" : '')
1406 1405
 		. "\n";
1407 1406
 
@@ -1441,7 +1440,7 @@  discard block
 block discarded – undo
1441 1440
 		return false;
1442 1441
 	}
1443 1442
 
1444
-	$query = "CREATE VIEW $nom AS " . $query_select;
1443
+	$query = "CREATE VIEW $nom AS ".$query_select;
1445 1444
 
1446 1445
 	return spip_pg_query($query, $serveur, $requeter);
1447 1446
 }
@@ -1461,7 +1460,7 @@  discard block
 block discarded – undo
1461 1460
  * @return bool|string true / false / requete
1462 1461
  **/
1463 1462
 function spip_pg_optimize($table, $serveur = '', $requeter = true) {
1464
-	return spip_pg_query('VACUUM ' . $table, $serveur, $requeter);
1463
+	return spip_pg_query('VACUUM '.$table, $serveur, $requeter);
1465 1464
 }
1466 1465
 
1467 1466
 // Selectionner la sous-chaine dans $objet
Please login to merge, or discard this patch.
ecrire/req/sqlite_generique.php 2 patches
Indentation   +1601 added lines, -1601 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
  */
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 // TODO: get/set_caracteres ?
@@ -43,89 +43,89 @@  discard block
 block discarded – undo
43 43
  * @return array|bool
44 44
  */
45 45
 function req_sqlite_dist($addr, $port, $login, #[\SensitiveParameter] $pass, $db = '', $prefixe = '', $sqlite_version = '') {
46
-	static $last_connect = [];
47
-
48
-	// si provient de selectdb
49
-	// un code pour etre sur que l'on vient de select_db()
50
-	if (str_contains($db, $code = '@selectdb@')) {
51
-		foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
52
-			${$a} = $last_connect[$a];
53
-		}
54
-		$db = str_replace($code, '', $db);
55
-	}
56
-
57
-	/*
46
+    static $last_connect = [];
47
+
48
+    // si provient de selectdb
49
+    // un code pour etre sur que l'on vient de select_db()
50
+    if (str_contains($db, $code = '@selectdb@')) {
51
+        foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
52
+            ${$a} = $last_connect[$a];
53
+        }
54
+        $db = str_replace($code, '', $db);
55
+    }
56
+
57
+    /*
58 58
 	 * En sqlite, seule l'adresse du fichier est importante.
59 59
 	 * Ce sera $db le nom,
60 60
 	 * le path est $addr
61 61
 	 * (_DIR_DB si $addr est vide)
62 62
 	 */
63
-	_sqlite_init();
64
-
65
-	// determiner le dossier de la base : $addr ou _DIR_DB
66
-	$f = _DIR_DB;
67
-	if ($addr && str_contains($addr, '/')) {
68
-		$f = rtrim($addr, '/') . '/';
69
-	}
70
-
71
-	$logger = spip_logger('sqlite');
72
-	// un nom de base demande et impossible d'obtenir la base, on s'en va :
73
-	// il faut que la base existe ou que le repertoire parent soit writable
74
-	if ($db && !is_file($f .= $db . '.sqlite') && !is_writable(dirname($f))) {
75
-		$logger->emergency("base $f non trouvee ou droits en ecriture manquants");
76
-
77
-		return false;
78
-	}
79
-
80
-	// charger les modules sqlite au besoin
81
-	if (!_sqlite_charger_version($sqlite_version)) {
82
-		$logger->emergency("Impossible de trouver/charger le module SQLite ($sqlite_version)!");
83
-
84
-		return false;
85
-	}
86
-
87
-	// chargement des constantes
88
-	// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
89
-	$define = 'spip_sqlite' . $sqlite_version . '_constantes';
90
-	$define();
91
-
92
-	if (!$db) {
93
-		// si pas de db ->
94
-		// base temporaire tant qu'on ne connait pas son vrai nom
95
-		// pour tester la connexion
96
-		$db = '_sqlite' . $sqlite_version . '_install';
97
-		$tmp = _DIR_DB . $db . '.sqlite';
98
-		$link = spip_sqlite_open($tmp);
99
-	} else {
100
-		// Ouvrir (eventuellement creer la base)
101
-		$link = spip_sqlite_open($f);
102
-	}
103
-
104
-	if (!$link) {
105
-		$logger->emergency("Impossible d'ouvrir la base SQLite($sqlite_version) $f");
106
-
107
-		return false;
108
-	}
109
-
110
-	$last_connect = [
111
-		'addr' => $addr,
112
-		'port' => $port,
113
-		'login' => $login,
114
-		'pass' => $pass,
115
-		'db' => $db,
116
-		'prefixe' => $prefixe,
117
-	];
118
-
119
-	// etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
120
-	include_spip('req/sqlite_fonctions');
121
-	_sqlite_init_functions($link);
122
-
123
-	return [
124
-		'db' => $db,
125
-		'prefixe' => $prefixe ?: $db,
126
-		'link' => $link,
127
-		'total_requetes' => 0,
128
-	];
63
+    _sqlite_init();
64
+
65
+    // determiner le dossier de la base : $addr ou _DIR_DB
66
+    $f = _DIR_DB;
67
+    if ($addr && str_contains($addr, '/')) {
68
+        $f = rtrim($addr, '/') . '/';
69
+    }
70
+
71
+    $logger = spip_logger('sqlite');
72
+    // un nom de base demande et impossible d'obtenir la base, on s'en va :
73
+    // il faut que la base existe ou que le repertoire parent soit writable
74
+    if ($db && !is_file($f .= $db . '.sqlite') && !is_writable(dirname($f))) {
75
+        $logger->emergency("base $f non trouvee ou droits en ecriture manquants");
76
+
77
+        return false;
78
+    }
79
+
80
+    // charger les modules sqlite au besoin
81
+    if (!_sqlite_charger_version($sqlite_version)) {
82
+        $logger->emergency("Impossible de trouver/charger le module SQLite ($sqlite_version)!");
83
+
84
+        return false;
85
+    }
86
+
87
+    // chargement des constantes
88
+    // il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
89
+    $define = 'spip_sqlite' . $sqlite_version . '_constantes';
90
+    $define();
91
+
92
+    if (!$db) {
93
+        // si pas de db ->
94
+        // base temporaire tant qu'on ne connait pas son vrai nom
95
+        // pour tester la connexion
96
+        $db = '_sqlite' . $sqlite_version . '_install';
97
+        $tmp = _DIR_DB . $db . '.sqlite';
98
+        $link = spip_sqlite_open($tmp);
99
+    } else {
100
+        // Ouvrir (eventuellement creer la base)
101
+        $link = spip_sqlite_open($f);
102
+    }
103
+
104
+    if (!$link) {
105
+        $logger->emergency("Impossible d'ouvrir la base SQLite($sqlite_version) $f");
106
+
107
+        return false;
108
+    }
109
+
110
+    $last_connect = [
111
+        'addr' => $addr,
112
+        'port' => $port,
113
+        'login' => $login,
114
+        'pass' => $pass,
115
+        'db' => $db,
116
+        'prefixe' => $prefixe,
117
+    ];
118
+
119
+    // etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
120
+    include_spip('req/sqlite_fonctions');
121
+    _sqlite_init_functions($link);
122
+
123
+    return [
124
+        'db' => $db,
125
+        'prefixe' => $prefixe ?: $db,
126
+        'link' => $link,
127
+        'total_requetes' => 0,
128
+    ];
129 129
 }
130 130
 
131 131
 /**
@@ -135,9 +135,9 @@  discard block
 block discarded – undo
135 135
  * @return PDO
136 136
  */
137 137
 function spip_sqlite_open(string $file): \PDO {
138
-	$PDO = new \PDO("sqlite:$file");
139
-	$PDO->setAttribute(\PDO::ATTR_STATEMENT_CLASS, [PDOStatement::class, [&$PDO]]);
140
-	return $PDO;
138
+    $PDO = new \PDO("sqlite:$file");
139
+    $PDO->setAttribute(\PDO::ATTR_STATEMENT_CLASS, [PDOStatement::class, [&$PDO]]);
140
+    return $PDO;
141 141
 }
142 142
 
143 143
 
@@ -156,14 +156,14 @@  discard block
 block discarded – undo
156 156
  *    Resultat de la requete
157 157
  */
158 158
 function spip_sqlite_query($query, $serveur = '', $requeter = true) {
159
-	#spip_logger('sqlite')->debug("spip_sqlite_query() > $query");
160
-	#_sqlite_init(); // fait la premiere fois dans spip_sqlite
161
-	$query = Sqlite::traduire_requete($query, $serveur);
162
-	if (!$requeter) {
163
-		return $query;
164
-	}
165
-
166
-	return Sqlite::executer_requete($query, $serveur);
159
+    #spip_logger('sqlite')->debug("spip_sqlite_query() > $query");
160
+    #_sqlite_init(); // fait la premiere fois dans spip_sqlite
161
+    $query = Sqlite::traduire_requete($query, $serveur);
162
+    if (!$requeter) {
163
+        return $query;
164
+    }
165
+
166
+    return Sqlite::executer_requete($query, $serveur);
167 167
 }
168 168
 
169 169
 
@@ -180,12 +180,12 @@  discard block
 block discarded – undo
180 180
  */
181 181
 function spip_sqlite_alter($query, $serveur = '', $requeter = true) {
182 182
 
183
-	$query = spip_sqlite_query("ALTER $query", $serveur, false);
184
-	// traduire la requete pour recuperer les bons noms de table
185
-	$query = Sqlite::traduire_requete($query, $serveur);
186
-	$logger = spip_logger('sqlite');
183
+    $query = spip_sqlite_query("ALTER $query", $serveur, false);
184
+    // traduire la requete pour recuperer les bons noms de table
185
+    $query = Sqlite::traduire_requete($query, $serveur);
186
+    $logger = spip_logger('sqlite');
187 187
 
188
-	/*
188
+    /*
189 189
 		 * la il faut faire les transformations
190 190
 		 * si ALTER TABLE x (DROP|CHANGE) y
191 191
 		 *
@@ -194,250 +194,250 @@  discard block
 block discarded – undo
194 194
 		 * 3) faire chaque requete independemment
195 195
 		 */
196 196
 
197
-	// 1
198
-	if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
199
-		$debut = $regs[1];
200
-		$table = $regs[3];
201
-		$suite = $regs[4];
202
-	} else {
203
-		$logger->error("SQLite : Probleme de ALTER TABLE mal forme dans $query");
204
-
205
-		return false;
206
-	}
207
-
208
-	// 2
209
-	// il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
210
-	// tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
211
-	// ou revoir l'api de sql_alter en creant un
212
-	// sql_alter_table($table,array($actions));
213
-	$todo = explode(',', $suite);
214
-
215
-	// on remet les morceaux dechires ensembles... que c'est laid !
216
-	$todo2 = [];
217
-	$i = 0;
218
-	$ouverte = false;
219
-	while ($do = array_shift($todo)) {
220
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
221
-		$o = (str_contains($do, '('));
222
-		$f = (str_contains($do, ')'));
223
-		if ($o && !$f) {
224
-			$ouverte = true;
225
-		} elseif ($f) {
226
-			$ouverte = false;
227
-		}
228
-		if (!$ouverte) {
229
-			$i++;
230
-		}
231
-	}
232
-
233
-	// 3
234
-	$resultats = [];
235
-	foreach ($todo2 as $do) {
236
-		$do = trim($do);
237
-		if (
238
-			!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
239
-				. '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
240
-				. '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
241
-				. '|ADD COLUMN|ADD'
242
-				. ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
243
-		) {
244
-			$logger->error(
245
-				"SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
246
-			);
247
-
248
-			return false;
249
-		}
250
-
251
-		$cle = strtoupper($matches[1]);
252
-		$colonne_origine = $matches[2];
253
-		$colonne_destination = '';
254
-
255
-		$def = $matches[3];
256
-
257
-		// eluder une eventuelle clause before|after|first inutilisable
258
-		$defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
259
-		$defo = $defr; // garder la def d'origine pour certains cas
260
-		// remplacer les definitions venant de mysql
261
-		$defr = _sqlite_remplacements_definitions_table($defr);
262
-
263
-		// reinjecter dans le do
264
-		$do = str_replace($def, $defr, $do);
265
-		$def = $defr;
266
-
267
-		switch ($cle) {
268
-				// suppression d'un index
269
-			case 'DROP KEY':
270
-			case 'DROP INDEX':
271
-				$nom_index = $colonne_origine;
272
-				spip_sqlite_drop_index($nom_index, $table, $serveur);
273
-				break;
274
-
275
-				// suppression d'une pk
276
-			case 'DROP PRIMARY KEY':
277
-				if (
278
-					!_sqlite_modifier_table(
279
-						$table,
280
-						$colonne_origine,
281
-						['key' => ['PRIMARY KEY' => '']],
282
-						$serveur
283
-					)
284
-				) {
285
-					return false;
286
-				}
287
-				break;
288
-				// suppression d'une colonne
289
-			case 'DROP COLUMN':
290
-			case 'DROP':
291
-				if (
292
-					!_sqlite_modifier_table(
293
-						$table,
294
-						[$colonne_origine => ''],
295
-						[],
296
-						$serveur
297
-					)
298
-				) {
299
-					return false;
300
-				}
301
-				break;
302
-
303
-			case 'CHANGE COLUMN':
304
-			case 'CHANGE':
305
-				// recuperer le nom de la future colonne
306
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
307
-				// en tenant compte de la cle primaire (ce qui est mieux)
308
-				$def = trim($defo);
309
-				$colonne_destination = substr($def, 0, strpos($def, ' '));
310
-				$def = substr($def, strlen($colonne_destination) + 1);
311
-
312
-				if (
313
-					!_sqlite_modifier_table(
314
-						$table,
315
-						[$colonne_origine => $colonne_destination],
316
-						['field' => [$colonne_destination => $def]],
317
-						$serveur
318
-					)
319
-				) {
320
-					return false;
321
-				}
322
-				break;
323
-
324
-			case 'MODIFY':
325
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
326
-				// en tenant compte de la cle primaire (ce qui est mieux)
327
-				if (
328
-					!_sqlite_modifier_table(
329
-						$table,
330
-						$colonne_origine,
331
-						['field' => [$colonne_origine => $defo]],
332
-						$serveur
333
-					)
334
-				) {
335
-					return false;
336
-				}
337
-				break;
338
-
339
-				// pas geres en sqlite2
340
-			case 'RENAME':
341
-				$do = 'RENAME TO' . substr($do, 6);
342
-			case 'RENAME TO':
343
-				if (!Sqlite::executer_requete("$debut $do", $serveur)) {
344
-					$logger->error("SQLite : Erreur ALTER TABLE / RENAME : $query");
345
-
346
-					return false;
347
-				}
348
-				break;
349
-
350
-				// ajout d'une pk
351
-			case 'ADD PRIMARY KEY':
352
-				$pk = trim(substr($do, 16));
353
-				$pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
354
-				if (
355
-					!_sqlite_modifier_table(
356
-						$table,
357
-						$colonne_origine,
358
-						['key' => ['PRIMARY KEY' => $pk]],
359
-						$serveur
360
-					)
361
-				) {
362
-					return false;
363
-				}
364
-				break;
365
-				// ajout d'un index
366
-			case 'ADD UNIQUE KEY':
367
-			case 'ADD UNIQUE':
368
-				$unique = true;
369
-			case 'ADD INDEX':
370
-			case 'ADD KEY':
371
-				if (!isset($unique)) {
372
-					$unique = false;
373
-				}
374
-				// peut etre "(colonne)" ou "nom_index (colonnes)"
375
-				// bug potentiel si qqn met "(colonne, colonne)"
376
-				//
377
-				// nom_index (colonnes)
378
-				if ($def) {
379
-					$colonnes = substr((string) $def, 1, -1);
380
-					$nom_index = $colonne_origine;
381
-				} else {
382
-					// (colonne)
383
-					if ($colonne_origine[0] == '(') {
384
-						$colonnes = substr($colonne_origine, 1, -1);
385
-						if (str_contains(',', $colonnes)) {
386
-							$logger->error('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
387
-								. " sans qu'il ait de nom ($table, ($colonnes))");
388
-							break;
389
-						} else {
390
-							$nom_index = $colonnes;
391
-						}
392
-					} // nom_index
393
-					else {
394
-						$nom_index = $colonnes = $colonne_origine;
395
-					}
396
-				}
397
-				spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
398
-				break;
399
-
400
-				// pas geres en sqlite2
401
-			case 'ADD COLUMN':
402
-				$do = 'ADD' . substr($do, 10);
403
-			case 'ADD':
404
-			default:
405
-				if (!preg_match(',primary\s+key,i', $do)) {
406
-					if (!Sqlite::executer_requete("$debut $do", $serveur)) {
407
-						$logger->error("SQLite : Erreur ALTER TABLE / ADD : $query");
408
-
409
-						return false;
410
-					}
411
-					break;
412
-				}
413
-				// ou si la colonne est aussi primary key
414
-				// cas du add id_truc int primary key
415
-				// ajout d'une colonne qui passe en primary key directe
416
-				else {
417
-					$def = trim(substr($do, 3));
418
-					$colonne_ajoutee = substr($def, 0, strpos($def, ' '));
419
-					$def = substr($def, strlen($colonne_ajoutee) + 1);
420
-					$opts = [];
421
-					if (preg_match(',primary\s+key,i', $def)) {
422
-						$opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
423
-						$def = preg_replace(',primary\s+key,i', '', $def);
424
-					}
425
-					$opts['field'] = [$colonne_ajoutee => $def];
426
-					if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
427
-						$logger->error("SQLite : Erreur ALTER TABLE / ADD : $query");
428
-
429
-						return false;
430
-					}
431
-				}
432
-				break;
433
-		}
434
-		// tout est bon, ouf !
435
-		$logger->info("SQLite ($serveur) : Changements OK : $debut $do");
436
-	}
437
-
438
-	$logger->info("SQLite ($serveur) : fin ALTER TABLE OK !");
439
-
440
-	return true;
197
+    // 1
198
+    if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
199
+        $debut = $regs[1];
200
+        $table = $regs[3];
201
+        $suite = $regs[4];
202
+    } else {
203
+        $logger->error("SQLite : Probleme de ALTER TABLE mal forme dans $query");
204
+
205
+        return false;
206
+    }
207
+
208
+    // 2
209
+    // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
210
+    // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
211
+    // ou revoir l'api de sql_alter en creant un
212
+    // sql_alter_table($table,array($actions));
213
+    $todo = explode(',', $suite);
214
+
215
+    // on remet les morceaux dechires ensembles... que c'est laid !
216
+    $todo2 = [];
217
+    $i = 0;
218
+    $ouverte = false;
219
+    while ($do = array_shift($todo)) {
220
+        $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
221
+        $o = (str_contains($do, '('));
222
+        $f = (str_contains($do, ')'));
223
+        if ($o && !$f) {
224
+            $ouverte = true;
225
+        } elseif ($f) {
226
+            $ouverte = false;
227
+        }
228
+        if (!$ouverte) {
229
+            $i++;
230
+        }
231
+    }
232
+
233
+    // 3
234
+    $resultats = [];
235
+    foreach ($todo2 as $do) {
236
+        $do = trim($do);
237
+        if (
238
+            !preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
239
+                . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
240
+                . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
241
+                . '|ADD COLUMN|ADD'
242
+                . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
243
+        ) {
244
+            $logger->error(
245
+                "SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
246
+            );
247
+
248
+            return false;
249
+        }
250
+
251
+        $cle = strtoupper($matches[1]);
252
+        $colonne_origine = $matches[2];
253
+        $colonne_destination = '';
254
+
255
+        $def = $matches[3];
256
+
257
+        // eluder une eventuelle clause before|after|first inutilisable
258
+        $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
259
+        $defo = $defr; // garder la def d'origine pour certains cas
260
+        // remplacer les definitions venant de mysql
261
+        $defr = _sqlite_remplacements_definitions_table($defr);
262
+
263
+        // reinjecter dans le do
264
+        $do = str_replace($def, $defr, $do);
265
+        $def = $defr;
266
+
267
+        switch ($cle) {
268
+                // suppression d'un index
269
+            case 'DROP KEY':
270
+            case 'DROP INDEX':
271
+                $nom_index = $colonne_origine;
272
+                spip_sqlite_drop_index($nom_index, $table, $serveur);
273
+                break;
274
+
275
+                // suppression d'une pk
276
+            case 'DROP PRIMARY KEY':
277
+                if (
278
+                    !_sqlite_modifier_table(
279
+                        $table,
280
+                        $colonne_origine,
281
+                        ['key' => ['PRIMARY KEY' => '']],
282
+                        $serveur
283
+                    )
284
+                ) {
285
+                    return false;
286
+                }
287
+                break;
288
+                // suppression d'une colonne
289
+            case 'DROP COLUMN':
290
+            case 'DROP':
291
+                if (
292
+                    !_sqlite_modifier_table(
293
+                        $table,
294
+                        [$colonne_origine => ''],
295
+                        [],
296
+                        $serveur
297
+                    )
298
+                ) {
299
+                    return false;
300
+                }
301
+                break;
302
+
303
+            case 'CHANGE COLUMN':
304
+            case 'CHANGE':
305
+                // recuperer le nom de la future colonne
306
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
307
+                // en tenant compte de la cle primaire (ce qui est mieux)
308
+                $def = trim($defo);
309
+                $colonne_destination = substr($def, 0, strpos($def, ' '));
310
+                $def = substr($def, strlen($colonne_destination) + 1);
311
+
312
+                if (
313
+                    !_sqlite_modifier_table(
314
+                        $table,
315
+                        [$colonne_origine => $colonne_destination],
316
+                        ['field' => [$colonne_destination => $def]],
317
+                        $serveur
318
+                    )
319
+                ) {
320
+                    return false;
321
+                }
322
+                break;
323
+
324
+            case 'MODIFY':
325
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
326
+                // en tenant compte de la cle primaire (ce qui est mieux)
327
+                if (
328
+                    !_sqlite_modifier_table(
329
+                        $table,
330
+                        $colonne_origine,
331
+                        ['field' => [$colonne_origine => $defo]],
332
+                        $serveur
333
+                    )
334
+                ) {
335
+                    return false;
336
+                }
337
+                break;
338
+
339
+                // pas geres en sqlite2
340
+            case 'RENAME':
341
+                $do = 'RENAME TO' . substr($do, 6);
342
+            case 'RENAME TO':
343
+                if (!Sqlite::executer_requete("$debut $do", $serveur)) {
344
+                    $logger->error("SQLite : Erreur ALTER TABLE / RENAME : $query");
345
+
346
+                    return false;
347
+                }
348
+                break;
349
+
350
+                // ajout d'une pk
351
+            case 'ADD PRIMARY KEY':
352
+                $pk = trim(substr($do, 16));
353
+                $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
354
+                if (
355
+                    !_sqlite_modifier_table(
356
+                        $table,
357
+                        $colonne_origine,
358
+                        ['key' => ['PRIMARY KEY' => $pk]],
359
+                        $serveur
360
+                    )
361
+                ) {
362
+                    return false;
363
+                }
364
+                break;
365
+                // ajout d'un index
366
+            case 'ADD UNIQUE KEY':
367
+            case 'ADD UNIQUE':
368
+                $unique = true;
369
+            case 'ADD INDEX':
370
+            case 'ADD KEY':
371
+                if (!isset($unique)) {
372
+                    $unique = false;
373
+                }
374
+                // peut etre "(colonne)" ou "nom_index (colonnes)"
375
+                // bug potentiel si qqn met "(colonne, colonne)"
376
+                //
377
+                // nom_index (colonnes)
378
+                if ($def) {
379
+                    $colonnes = substr((string) $def, 1, -1);
380
+                    $nom_index = $colonne_origine;
381
+                } else {
382
+                    // (colonne)
383
+                    if ($colonne_origine[0] == '(') {
384
+                        $colonnes = substr($colonne_origine, 1, -1);
385
+                        if (str_contains(',', $colonnes)) {
386
+                            $logger->error('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
387
+                                . " sans qu'il ait de nom ($table, ($colonnes))");
388
+                            break;
389
+                        } else {
390
+                            $nom_index = $colonnes;
391
+                        }
392
+                    } // nom_index
393
+                    else {
394
+                        $nom_index = $colonnes = $colonne_origine;
395
+                    }
396
+                }
397
+                spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
398
+                break;
399
+
400
+                // pas geres en sqlite2
401
+            case 'ADD COLUMN':
402
+                $do = 'ADD' . substr($do, 10);
403
+            case 'ADD':
404
+            default:
405
+                if (!preg_match(',primary\s+key,i', $do)) {
406
+                    if (!Sqlite::executer_requete("$debut $do", $serveur)) {
407
+                        $logger->error("SQLite : Erreur ALTER TABLE / ADD : $query");
408
+
409
+                        return false;
410
+                    }
411
+                    break;
412
+                }
413
+                // ou si la colonne est aussi primary key
414
+                // cas du add id_truc int primary key
415
+                // ajout d'une colonne qui passe en primary key directe
416
+                else {
417
+                    $def = trim(substr($do, 3));
418
+                    $colonne_ajoutee = substr($def, 0, strpos($def, ' '));
419
+                    $def = substr($def, strlen($colonne_ajoutee) + 1);
420
+                    $opts = [];
421
+                    if (preg_match(',primary\s+key,i', $def)) {
422
+                        $opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
423
+                        $def = preg_replace(',primary\s+key,i', '', $def);
424
+                    }
425
+                    $opts['field'] = [$colonne_ajoutee => $def];
426
+                    if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
427
+                        $logger->error("SQLite : Erreur ALTER TABLE / ADD : $query");
428
+
429
+                        return false;
430
+                    }
431
+                }
432
+                break;
433
+        }
434
+        // tout est bon, ouf !
435
+        $logger->info("SQLite ($serveur) : Changements OK : $debut $do");
436
+    }
437
+
438
+    $logger->info("SQLite ($serveur) : fin ALTER TABLE OK !");
439
+
440
+    return true;
441 441
 }
442 442
 
443 443
 /**
@@ -459,38 +459,38 @@  discard block
 block discarded – undo
459 459
  *     - true si la requête réussie, false sinon.
460 460
  */
461 461
 function spip_sqlite_create(
462
-	$nom,
463
-	$champs,
464
-	$cles,
465
-	$autoinc = false,
466
-	$temporary = false,
467
-	$serveur = '',
468
-	$requeter = true
462
+    $nom,
463
+    $champs,
464
+    $cles,
465
+    $autoinc = false,
466
+    $temporary = false,
467
+    $serveur = '',
468
+    $requeter = true
469 469
 ) {
470
-	$query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
471
-	if (!$query) {
472
-		return false;
473
-	}
474
-	$res = spip_sqlite_query($query, $serveur, $requeter);
475
-
476
-	// SQLite ne cree pas les KEY sur les requetes CREATE TABLE
477
-	// il faut donc les faire creer ensuite
478
-	if (!$requeter) {
479
-		return $res;
480
-	}
481
-
482
-	$ok = (bool) $res;
483
-	if ($ok) {
484
-		foreach ($cles as $k => $v) {
485
-			if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
486
-				$index = trim(substr($k, strlen($m[1])));
487
-				$unique = (strlen($m[1]) > 3);
488
-				$ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
489
-			}
490
-		}
491
-	}
492
-
493
-	return (bool) $ok;
470
+    $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
471
+    if (!$query) {
472
+        return false;
473
+    }
474
+    $res = spip_sqlite_query($query, $serveur, $requeter);
475
+
476
+    // SQLite ne cree pas les KEY sur les requetes CREATE TABLE
477
+    // il faut donc les faire creer ensuite
478
+    if (!$requeter) {
479
+        return $res;
480
+    }
481
+
482
+    $ok = (bool) $res;
483
+    if ($ok) {
484
+        foreach ($cles as $k => $v) {
485
+            if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
486
+                $index = trim(substr($k, strlen($m[1])));
487
+                $unique = (strlen($m[1]) > 3);
488
+                $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
489
+            }
490
+        }
491
+    }
492
+
493
+    return (bool) $ok;
494 494
 }
495 495
 
496 496
 /**
@@ -503,21 +503,21 @@  discard block
 block discarded – undo
503 503
  * @return bool true si la base est créee.
504 504
  **/
505 505
 function spip_sqlite_create_base($nom, $serveur = '', $option = true) {
506
-	$f = $nom . '.sqlite';
507
-	if (!str_contains($nom, '/')) {
508
-		$f = _DIR_DB . $f;
509
-	}
506
+    $f = $nom . '.sqlite';
507
+    if (!str_contains($nom, '/')) {
508
+        $f = _DIR_DB . $f;
509
+    }
510 510
 
511
-	$ok = new \PDO("sqlite:$f");
511
+    $ok = new \PDO("sqlite:$f");
512 512
 
513
-	if ($ok) {
514
-		unset($ok);
513
+    if ($ok) {
514
+        unset($ok);
515 515
 
516
-		return true;
517
-	}
518
-	unset($ok);
516
+        return true;
517
+    }
518
+    unset($ok);
519 519
 
520
-	return false;
520
+    return false;
521 521
 }
522 522
 
523 523
 
@@ -538,21 +538,21 @@  discard block
 block discarded – undo
538 538
  *     - string texte de la requête si $requeter vaut false
539 539
  */
540 540
 function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true) {
541
-	if (!$query_select) {
542
-		return false;
543
-	}
544
-	// vue deja presente
545
-	if (sql_showtable($nom, false, $serveur)) {
546
-		spip_logger('sqlite')->error(
547
-			"Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
548
-		);
541
+    if (!$query_select) {
542
+        return false;
543
+    }
544
+    // vue deja presente
545
+    if (sql_showtable($nom, false, $serveur)) {
546
+        spip_logger('sqlite')->error(
547
+            "Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
548
+        );
549 549
 
550
-		return false;
551
-	}
550
+        return false;
551
+    }
552 552
 
553
-	$query = "CREATE VIEW $nom AS " . $query_select;
553
+    $query = "CREATE VIEW $nom AS " . $query_select;
554 554
 
555
-	return spip_sqlite_query($query, $serveur, $requeter);
555
+    return spip_sqlite_query($query, $serveur, $requeter);
556 556
 }
557 557
 
558 558
 /**
@@ -574,53 +574,53 @@  discard block
 block discarded – undo
574 574
  *    string : requête, false si erreur, true sinon.
575 575
  */
576 576
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) {
577
-	if (!($nom || $table || $champs)) {
578
-		spip_logger('sqlite')->error(
579
-			"Champ manquant pour creer un index sqlite ($nom, $table, (" . implode(',', $champs) . '))',
580
-		);
581
-
582
-		return false;
583
-	}
584
-
585
-	// SQLite ne differentie pas noms des index en fonction des tables
586
-	// il faut donc creer des noms uniques d'index pour une base sqlite
587
-	$nom = $table . '_' . $nom;
588
-	// enlever d'eventuelles parentheses deja presentes sur champs
589
-	if (!is_array($champs)) {
590
-		if ($champs[0] == '(') {
591
-			$champs = substr($champs, 1, -1);
592
-		}
593
-		$champs = [$champs];
594
-		// supprimer l'info de longueur d'index mysql en fin de champ
595
-		$champs = preg_replace(',\(\d+\)$,', '', $champs);
596
-	}
597
-
598
-	$ifnotexists = '';
599
-	$version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
600
-	if (!function_exists('spip_version_compare')) {
601
-		include_spip('plugins/installer');
602
-	}
603
-
604
-	if ($version && spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
605
-		$ifnotexists = ' IF NOT EXISTS';
606
-	} else {
607
-		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
608
-		$a = spip_sqlite_showtable($table, $serveur);
609
-		if (isset($a['key']['KEY ' . $nom])) {
610
-			return true;
611
-		}
612
-	}
613
-
614
-	$query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . implode(',', $champs) . ')';
615
-	$res = spip_sqlite_query($query, $serveur, $requeter);
616
-	if (!$requeter) {
617
-		return $res;
618
-	}
619
-	if ($res) {
620
-		return true;
621
-	} else {
622
-		return false;
623
-	}
577
+    if (!($nom || $table || $champs)) {
578
+        spip_logger('sqlite')->error(
579
+            "Champ manquant pour creer un index sqlite ($nom, $table, (" . implode(',', $champs) . '))',
580
+        );
581
+
582
+        return false;
583
+    }
584
+
585
+    // SQLite ne differentie pas noms des index en fonction des tables
586
+    // il faut donc creer des noms uniques d'index pour une base sqlite
587
+    $nom = $table . '_' . $nom;
588
+    // enlever d'eventuelles parentheses deja presentes sur champs
589
+    if (!is_array($champs)) {
590
+        if ($champs[0] == '(') {
591
+            $champs = substr($champs, 1, -1);
592
+        }
593
+        $champs = [$champs];
594
+        // supprimer l'info de longueur d'index mysql en fin de champ
595
+        $champs = preg_replace(',\(\d+\)$,', '', $champs);
596
+    }
597
+
598
+    $ifnotexists = '';
599
+    $version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
600
+    if (!function_exists('spip_version_compare')) {
601
+        include_spip('plugins/installer');
602
+    }
603
+
604
+    if ($version && spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
605
+        $ifnotexists = ' IF NOT EXISTS';
606
+    } else {
607
+        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
608
+        $a = spip_sqlite_showtable($table, $serveur);
609
+        if (isset($a['key']['KEY ' . $nom])) {
610
+            return true;
611
+        }
612
+    }
613
+
614
+    $query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . implode(',', $champs) . ')';
615
+    $res = spip_sqlite_query($query, $serveur, $requeter);
616
+    if (!$requeter) {
617
+        return $res;
618
+    }
619
+    if ($res) {
620
+        return true;
621
+    } else {
622
+        return false;
623
+    }
624 624
 }
625 625
 
626 626
 /**
@@ -636,24 +636,24 @@  discard block
 block discarded – undo
636 636
  * @return int                 Nombre de lignes
637 637
  */
638 638
 function spip_sqlite_count($r, $serveur = '', $requeter = true) {
639
-	if (!$r) {
640
-		return 0;
641
-	}
642
-
643
-	// select ou autre (insert, update,...) ?
644
-	// (link,requete) a compter
645
-	if (strtoupper(substr(ltrim($r->queryString), 0, 6)) === 'SELECT') {
646
-		$link = $r->getPDO();
647
-		$query = "SELECT count(*) as zzzzsqlitecount FROM ({$r->queryString})";
648
-		$l = $link->query($query);
649
-		$i = 0;
650
-		if ($l && ($z = $l->fetch())) {
651
-			$i = (int) $z['zzzzsqlitecount'];
652
-		}
653
-		return $i;
654
-	}
655
-
656
-	return $r->rowCount();
639
+    if (!$r) {
640
+        return 0;
641
+    }
642
+
643
+    // select ou autre (insert, update,...) ?
644
+    // (link,requete) a compter
645
+    if (strtoupper(substr(ltrim($r->queryString), 0, 6)) === 'SELECT') {
646
+        $link = $r->getPDO();
647
+        $query = "SELECT count(*) as zzzzsqlitecount FROM ({$r->queryString})";
648
+        $l = $link->query($query);
649
+        $i = 0;
650
+        if ($l && ($z = $l->fetch())) {
651
+            $i = (int) $z['zzzzsqlitecount'];
652
+        }
653
+        return $i;
654
+    }
655
+
656
+    return $r->rowCount();
657 657
 }
658 658
 
659 659
 
@@ -672,31 +672,31 @@  discard block
 block discarded – undo
672 672
  *     - false si la requête a échouée
673 673
  **/
674 674
 function spip_sqlite_countsel(
675
-	$from = [],
676
-	$where = [],
677
-	$groupby = '',
678
-	$having = [],
679
-	$serveur = '',
680
-	$requeter = true
675
+    $from = [],
676
+    $where = [],
677
+    $groupby = '',
678
+    $having = [],
679
+    $serveur = '',
680
+    $requeter = true
681 681
 ) {
682
-	$c = $groupby ? 'DISTINCT ' . (is_string($groupby) ? $groupby : implode(',', $groupby)) : ('*');
683
-	$r = spip_sqlite_select(
684
-		"COUNT($c)",
685
-		$from,
686
-		$where,
687
-		'',
688
-		'',
689
-		'',
690
-		$having,
691
-		$serveur,
692
-		$requeter
693
-	);
694
-	if ((is_resource($r) || is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
-		[$r] = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
-		$r = (int) $r;
697
-	}
698
-
699
-	return $r;
682
+    $c = $groupby ? 'DISTINCT ' . (is_string($groupby) ? $groupby : implode(',', $groupby)) : ('*');
683
+    $r = spip_sqlite_select(
684
+        "COUNT($c)",
685
+        $from,
686
+        $where,
687
+        '',
688
+        '',
689
+        '',
690
+        $having,
691
+        $serveur,
692
+        $requeter
693
+    );
694
+    if ((is_resource($r) || is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
+        [$r] = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
+        $r = (int) $r;
697
+    }
698
+
699
+    return $r;
700 700
 }
701 701
 
702 702
 
@@ -713,24 +713,24 @@  discard block
 block discarded – undo
713 713
  *     - false en cas d'erreur.
714 714
  **/
715 715
 function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true) {
716
-	$res = spip_sqlite_query(
717
-		_sqlite_calculer_expression('DELETE FROM', $table, ',')
718
-			. _sqlite_calculer_expression('WHERE', $where),
719
-		$serveur,
720
-		$requeter
721
-	);
722
-
723
-	// renvoyer la requete inerte si demandee
724
-	if (!$requeter) {
725
-		return $res;
726
-	}
727
-
728
-	if ($res) {
729
-		$link = _sqlite_link($serveur);
730
-		return $res->rowCount();
731
-	} else {
732
-		return false;
733
-	}
716
+    $res = spip_sqlite_query(
717
+        _sqlite_calculer_expression('DELETE FROM', $table, ',')
718
+            . _sqlite_calculer_expression('WHERE', $where),
719
+        $serveur,
720
+        $requeter
721
+    );
722
+
723
+    // renvoyer la requete inerte si demandee
724
+    if (!$requeter) {
725
+        return $res;
726
+    }
727
+
728
+    if ($res) {
729
+        $link = _sqlite_link($serveur);
730
+        return $res->rowCount();
731
+    } else {
732
+        return false;
733
+    }
734 734
 }
735 735
 
736 736
 
@@ -746,13 +746,13 @@  discard block
 block discarded – undo
746 746
  *     - true si la requête a réussie, false sinon
747 747
  */
748 748
 function spip_sqlite_drop_table($table, $exist = false, $serveur = '', $requeter = true) {
749
-	$exist = (bool) $exist ? ' IF EXISTS' : '';
749
+    $exist = (bool) $exist ? ' IF EXISTS' : '';
750 750
 
751
-	if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
752
-		return true;
753
-	}
751
+    if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
752
+        return true;
753
+    }
754 754
 
755
-	return false;
755
+    return false;
756 756
 }
757 757
 
758 758
 
@@ -768,9 +768,9 @@  discard block
 block discarded – undo
768 768
  *     - true si la requête a réussie, false sinon
769 769
  */
770 770
 function spip_sqlite_drop_view($view, $exist = false, $serveur = '', $requeter = true) {
771
-	$exist = (bool) $exist ? ' IF EXISTS' : '';
771
+    $exist = (bool) $exist ? ' IF EXISTS' : '';
772 772
 
773
-	return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
773
+    return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
774 774
 }
775 775
 
776 776
 /**
@@ -784,20 +784,20 @@  discard block
 block discarded – undo
784 784
  * @return bool ou requete
785 785
  */
786 786
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true) {
787
-	if (!$nom && !$table) {
788
-		spip_logger('sqlite')->error("Champ manquant pour supprimer un index sqlite ($nom, $table)");
787
+    if (!$nom && !$table) {
788
+        spip_logger('sqlite')->error("Champ manquant pour supprimer un index sqlite ($nom, $table)");
789 789
 
790
-		return false;
791
-	}
790
+        return false;
791
+    }
792 792
 
793
-	// SQLite ne differentie pas noms des index en fonction des tables
794
-	// il faut donc creer des noms uniques d'index pour une base sqlite
795
-	$index = $table . '_' . $nom;
796
-	$exist = ' IF EXISTS';
793
+    // SQLite ne differentie pas noms des index en fonction des tables
794
+    // il faut donc creer des noms uniques d'index pour une base sqlite
795
+    $index = $table . '_' . $nom;
796
+    $exist = ' IF EXISTS';
797 797
 
798
-	$query = "DROP INDEX$exist $index";
798
+    $query = "DROP INDEX$exist $index";
799 799
 
800
-	return spip_sqlite_query($query, $serveur, $requeter);
800
+    return spip_sqlite_query($query, $serveur, $requeter);
801 801
 }
802 802
 
803 803
 /**
@@ -813,28 +813,28 @@  discard block
 block discarded – undo
813 813
  *     Erreur eventuelle
814 814
  **/
815 815
 function spip_sqlite_error($query = '', $serveur = '') {
816
-	$link = _sqlite_link($serveur);
817
-
818
-	if ($link) {
819
-		$errs = $link->errorInfo();
820
-		$s = _sqlite_last_error_from_link($link);
821
-	} else {
822
-		$s = ': aucune ressource sqlite (link)';
823
-	}
824
-	if ($s) {
825
-		$trace = debug_backtrace();
826
-		if ($trace[0]['function'] != 'spip_sqlite_error') {
827
-			spip_logger('sqlite')->error("$s - $query - " . sql_error_backtrace());
828
-		}
829
-	}
830
-
831
-	return $s;
816
+    $link = _sqlite_link($serveur);
817
+
818
+    if ($link) {
819
+        $errs = $link->errorInfo();
820
+        $s = _sqlite_last_error_from_link($link);
821
+    } else {
822
+        $s = ': aucune ressource sqlite (link)';
823
+    }
824
+    if ($s) {
825
+        $trace = debug_backtrace();
826
+        if ($trace[0]['function'] != 'spip_sqlite_error') {
827
+            spip_logger('sqlite')->error("$s - $query - " . sql_error_backtrace());
828
+        }
829
+    }
830
+
831
+    return $s;
832 832
 }
833 833
 
834 834
 function _sqlite_last_error_from_link($link) {
835
-	if ($link) {
836
-		$errs = $link->errorInfo();
837
-		/*
835
+    if ($link) {
836
+        $errs = $link->errorInfo();
837
+        /*
838 838
 			$errs[0]
839 839
 				numero SQLState ('HY000' souvent lors d'une erreur)
840 840
 				http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html
@@ -844,11 +844,11 @@  discard block
 block discarded – undo
844 844
 			$errs[2]
845 845
 				Le texte du message d'erreur
846 846
 		*/
847
-		if (ltrim((string) $errs[0], '0')) { // 00000 si pas d'erreur
848
-			return "$errs[2]";
849
-		}
850
-	}
851
-	return '';
847
+        if (ltrim((string) $errs[0], '0')) { // 00000 si pas d'erreur
848
+            return "$errs[2]";
849
+        }
850
+    }
851
+    return '';
852 852
 }
853 853
 
854 854
 /**
@@ -865,23 +865,23 @@  discard block
 block discarded – undo
865 865
  *    'HY000/1' : numéro de l'erreur SQLState / numéro d'erreur interne SQLite (en sqlite 3)
866 866
  **/
867 867
 function spip_sqlite_errno($serveur = '') {
868
-	$link = _sqlite_link($serveur);
869
-
870
-	if ($link) {
871
-		$t = $link->errorInfo();
872
-		$s = ltrim((string) $t[0], '0'); // 00000 si pas d'erreur
873
-		if ($s) {
874
-			$s .= ' / ' . $t[1];
875
-		} // ajoute l'erreur du moteur SQLite
876
-	} else {
877
-		$s = ': aucune ressource sqlite (link)';
878
-	}
879
-
880
-	if ($s) {
881
-		spip_logger('sqlite')->error("Erreur sqlite $s");
882
-	}
883
-
884
-	return $s ?: 0;
868
+    $link = _sqlite_link($serveur);
869
+
870
+    if ($link) {
871
+        $t = $link->errorInfo();
872
+        $s = ltrim((string) $t[0], '0'); // 00000 si pas d'erreur
873
+        if ($s) {
874
+            $s .= ' / ' . $t[1];
875
+        } // ajoute l'erreur du moteur SQLite
876
+    } else {
877
+        $s = ': aucune ressource sqlite (link)';
878
+    }
879
+
880
+    if ($s) {
881
+        spip_logger('sqlite')->error("Erreur sqlite $s");
882
+    }
883
+
884
+    return $s ?: 0;
885 885
 }
886 886
 
887 887
 
@@ -897,19 +897,19 @@  discard block
 block discarded – undo
897 897
  *     - false si on a pas pu avoir d'explication
898 898
  */
899 899
 function spip_sqlite_explain($query, $serveur = '', $requeter = true) {
900
-	if (!str_starts_with(ltrim($query), 'SELECT')) {
901
-		return [];
902
-	}
903
-
904
-	$query = Sqlite::traduire_requete($query, $serveur);
905
-	$query = 'EXPLAIN ' . $query;
906
-	if (!$requeter) {
907
-		return $query;
908
-	}
909
-	// on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
910
-	$r = Sqlite::executer_requete($query, $serveur, false);
911
-
912
-	return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
900
+    if (!str_starts_with(ltrim($query), 'SELECT')) {
901
+        return [];
902
+    }
903
+
904
+    $query = Sqlite::traduire_requete($query, $serveur);
905
+    $query = 'EXPLAIN ' . $query;
906
+    if (!$requeter) {
907
+        return $query;
908
+    }
909
+    // on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
910
+    $r = Sqlite::executer_requete($query, $serveur, false);
911
+
912
+    return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
913 913
 }
914 914
 
915 915
 
@@ -929,35 +929,35 @@  discard block
 block discarded – undo
929 929
  */
930 930
 function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true) {
931 931
 
932
-	$link = _sqlite_link($serveur);
933
-	$t = $t ?: SPIP_SQLITE3_ASSOC;
934
-
935
-	if (!$r) {
936
-		return false;
937
-	}
938
-
939
-	$retour = $r->fetch($t);
940
-
941
-	if (!$retour) {
942
-		if ($r->errorCode() === '00000') {
943
-			return null;
944
-		}
945
-		return false;
946
-	}
947
-
948
-	// Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
949
-	// suppression de 'table.' pour toutes les cles (c'est un peu violent !)
950
-	// c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
951
-	if (str_contains(implode('', array_keys($retour)), '.')) {
952
-		foreach ($retour as $cle => $val) {
953
-			if (($pos = strpos((string) $cle, '.')) !== false) {
954
-				$retour[substr((string) $cle, $pos + 1)] = &$retour[$cle];
955
-				unset($retour[$cle]);
956
-			}
957
-		}
958
-	}
959
-
960
-	return $retour;
932
+    $link = _sqlite_link($serveur);
933
+    $t = $t ?: SPIP_SQLITE3_ASSOC;
934
+
935
+    if (!$r) {
936
+        return false;
937
+    }
938
+
939
+    $retour = $r->fetch($t);
940
+
941
+    if (!$retour) {
942
+        if ($r->errorCode() === '00000') {
943
+            return null;
944
+        }
945
+        return false;
946
+    }
947
+
948
+    // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
949
+    // suppression de 'table.' pour toutes les cles (c'est un peu violent !)
950
+    // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
951
+    if (str_contains(implode('', array_keys($retour)), '.')) {
952
+        foreach ($retour as $cle => $val) {
953
+            if (($pos = strpos((string) $cle, '.')) !== false) {
954
+                $retour[substr((string) $cle, $pos + 1)] = &$retour[$cle];
955
+                unset($retour[$cle]);
956
+            }
957
+        }
958
+    }
959
+
960
+    return $retour;
961 961
 }
962 962
 
963 963
 /**
@@ -970,8 +970,8 @@  discard block
 block discarded – undo
970 970
  * @return bool True si déplacement réussi, false sinon.
971 971
  **/
972 972
 function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true) {
973
-	// encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
974
-	return false;
973
+    // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
974
+    return false;
975 975
 }
976 976
 
977 977
 
@@ -987,10 +987,10 @@  discard block
 block discarded – undo
987 987
  * @return bool                True si réussi
988 988
  */
989 989
 function spip_sqlite_free(&$r, $serveur = '', $requeter = true) {
990
-	unset($r);
990
+    unset($r);
991 991
 
992
-	return true;
993
-	//return sqlite_free_result($r);
992
+    return true;
993
+    //return sqlite_free_result($r);
994 994
 }
995 995
 
996 996
 
@@ -1005,8 +1005,8 @@  discard block
 block discarded – undo
1005 1005
  * @return void
1006 1006
  */
1007 1007
 function spip_sqlite_get_charset($charset = [], $serveur = '', $requeter = true) {
1008
-	//$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1009
-	//return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1008
+    //$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1009
+    //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1010 1010
 }
1011 1011
 
1012 1012
 
@@ -1021,7 +1021,7 @@  discard block
 block discarded – undo
1021 1021
  *     Valeur hexadécimale pour SQLite
1022 1022
  **/
1023 1023
 function spip_sqlite_hex($v) {
1024
-	return hexdec($v);
1024
+    return hexdec($v);
1025 1025
 }
1026 1026
 
1027 1027
 
@@ -1043,7 +1043,7 @@  discard block
 block discarded – undo
1043 1043
  *     Expression de requête SQL
1044 1044
  **/
1045 1045
 function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1046
-	return "($val $not IN ($valeurs))";
1046
+    return "($val $not IN ($valeurs))";
1047 1047
 }
1048 1048
 
1049 1049
 
@@ -1071,20 +1071,20 @@  discard block
 block discarded – undo
1071 1071
  **/
1072 1072
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1073 1073
 
1074
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1075
-	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1076
-		if (!$requeter) {
1077
-			return $r;
1078
-		}
1079
-		$nb = Sqlite::last_insert_id($serveur);
1080
-	} else {
1081
-		$nb = false;
1082
-	}
1074
+    $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1075
+    if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1076
+        if (!$requeter) {
1077
+            return $r;
1078
+        }
1079
+        $nb = Sqlite::last_insert_id($serveur);
1080
+    } else {
1081
+        $nb = false;
1082
+    }
1083 1083
 
1084
-	$err = spip_sqlite_error($query, $serveur);
1084
+    $err = spip_sqlite_error($query, $serveur);
1085 1085
 
1086
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1087
-	return isset($_GET['var_profile']) ? $r : $nb;
1086
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1087
+    return isset($_GET['var_profile']) ? $r : $nb;
1088 1088
 }
1089 1089
 
1090 1090
 
@@ -1109,28 +1109,28 @@  discard block
 block discarded – undo
1109 1109
  *     - Tableau de description de la requête et du temps d'exécution, si var_profile activé
1110 1110
  **/
1111 1111
 function spip_sqlite_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
1112
-	if (!$desc) {
1113
-		$desc = description_table($table, $serveur);
1114
-	}
1115
-	if (!$desc) {
1116
-		die("$table insertion sans description");
1117
-	}
1118
-	$fields = $desc['field'] ?? [];
1119
-
1120
-	foreach ($couples as $champ => $val) {
1121
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1122
-	}
1123
-
1124
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1125
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1126
-
1127
-	$cles = $valeurs = '';
1128
-	if (is_countable($couples) ? count($couples) : 0) {
1129
-		$cles = '(' . implode(',', array_keys($couples)) . ')';
1130
-		$valeurs = '(' . implode(',', $couples) . ')';
1131
-	}
1132
-
1133
-	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1112
+    if (!$desc) {
1113
+        $desc = description_table($table, $serveur);
1114
+    }
1115
+    if (!$desc) {
1116
+        die("$table insertion sans description");
1117
+    }
1118
+    $fields = $desc['field'] ?? [];
1119
+
1120
+    foreach ($couples as $champ => $val) {
1121
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1122
+    }
1123
+
1124
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1125
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1126
+
1127
+    $cles = $valeurs = '';
1128
+    if (is_countable($couples) ? count($couples) : 0) {
1129
+        $cles = '(' . implode(',', array_keys($couples)) . ')';
1130
+        $valeurs = '(' . implode(',', $couples) . ')';
1131
+    }
1132
+
1133
+    return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1134 1134
 }
1135 1135
 
1136 1136
 
@@ -1154,72 +1154,72 @@  discard block
 block discarded – undo
1154 1154
  *     - false en cas d'erreur.
1155 1155
  **/
1156 1156
 function spip_sqlite_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
1157
-	$retour = null;
1158
-	$nb = null;
1159
-	if (!$desc) {
1160
-		$desc = description_table($table, $serveur);
1161
-	}
1162
-	if (!$desc) {
1163
-		die("$table insertion sans description");
1164
-	}
1165
-	if (!isset($desc['field'])) {
1166
-		$desc['field'] = [];
1167
-	}
1168
-
1169
-	// recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1170
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1171
-
1172
-	// seul le nom de la table est a traduire ici :
1173
-	// le faire une seule fois au debut
1174
-	$query_start = "INSERT INTO $table ";
1175
-	$query_start = Sqlite::traduire_requete($query_start, $serveur);
1176
-
1177
-	// ouvrir une transaction
1178
-	if ($requeter) {
1179
-		Sqlite::demarrer_transaction($serveur);
1180
-	}
1181
-
1182
-	while ($couples = array_shift($tab_couples)) {
1183
-		foreach ($couples as $champ => $val) {
1184
-			$couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1185
-		}
1186
-
1187
-		// inserer les champs timestamp par defaut
1188
-		$couples = array_merge($maj, $couples);
1189
-
1190
-		$champs = $valeurs = '';
1191
-		if ($couples !== []) {
1192
-			$champs = '(' . implode(',', array_keys($couples)) . ')';
1193
-			$valeurs = '(' . implode(',', $couples) . ')';
1194
-			$query = $query_start . "$champs VALUES $valeurs";
1195
-		} else {
1196
-			$query = $query_start . 'DEFAULT VALUES';
1197
-		}
1198
-
1199
-		if ($requeter) {
1200
-			$retour = Sqlite::executer_requete($query, $serveur);
1201
-		}
1202
-
1203
-		// sur le dernier couple uniquement
1204
-		if ($tab_couples === []) {
1205
-			$nb = 0;
1206
-			if ($requeter) {
1207
-				$nb = Sqlite::last_insert_id($serveur);
1208
-			} else {
1209
-				return $query;
1210
-			}
1211
-		}
1212
-
1213
-		$err = spip_sqlite_error($query, $serveur);
1214
-	}
1215
-
1216
-	if ($requeter) {
1217
-		Sqlite::finir_transaction($serveur);
1218
-	}
1219
-
1220
-	// renvoie le dernier id d'autoincrement ajoute
1221
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1222
-	return isset($_GET['var_profile']) ? $retour : $nb;
1157
+    $retour = null;
1158
+    $nb = null;
1159
+    if (!$desc) {
1160
+        $desc = description_table($table, $serveur);
1161
+    }
1162
+    if (!$desc) {
1163
+        die("$table insertion sans description");
1164
+    }
1165
+    if (!isset($desc['field'])) {
1166
+        $desc['field'] = [];
1167
+    }
1168
+
1169
+    // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1170
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1171
+
1172
+    // seul le nom de la table est a traduire ici :
1173
+    // le faire une seule fois au debut
1174
+    $query_start = "INSERT INTO $table ";
1175
+    $query_start = Sqlite::traduire_requete($query_start, $serveur);
1176
+
1177
+    // ouvrir une transaction
1178
+    if ($requeter) {
1179
+        Sqlite::demarrer_transaction($serveur);
1180
+    }
1181
+
1182
+    while ($couples = array_shift($tab_couples)) {
1183
+        foreach ($couples as $champ => $val) {
1184
+            $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1185
+        }
1186
+
1187
+        // inserer les champs timestamp par defaut
1188
+        $couples = array_merge($maj, $couples);
1189
+
1190
+        $champs = $valeurs = '';
1191
+        if ($couples !== []) {
1192
+            $champs = '(' . implode(',', array_keys($couples)) . ')';
1193
+            $valeurs = '(' . implode(',', $couples) . ')';
1194
+            $query = $query_start . "$champs VALUES $valeurs";
1195
+        } else {
1196
+            $query = $query_start . 'DEFAULT VALUES';
1197
+        }
1198
+
1199
+        if ($requeter) {
1200
+            $retour = Sqlite::executer_requete($query, $serveur);
1201
+        }
1202
+
1203
+        // sur le dernier couple uniquement
1204
+        if ($tab_couples === []) {
1205
+            $nb = 0;
1206
+            if ($requeter) {
1207
+                $nb = Sqlite::last_insert_id($serveur);
1208
+            } else {
1209
+                return $query;
1210
+            }
1211
+        }
1212
+
1213
+        $err = spip_sqlite_error($query, $serveur);
1214
+    }
1215
+
1216
+    if ($requeter) {
1217
+        Sqlite::finir_transaction($serveur);
1218
+    }
1219
+
1220
+    // renvoie le dernier id d'autoincrement ajoute
1221
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1222
+    return isset($_GET['var_profile']) ? $retour : $nb;
1223 1223
 }
1224 1224
 
1225 1225
 
@@ -1234,7 +1234,7 @@  discard block
 block discarded – undo
1234 1234
  *     Toujours true.
1235 1235
  **/
1236 1236
 function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) {
1237
-	return true;
1237
+    return true;
1238 1238
 }
1239 1239
 
1240 1240
 /**
@@ -1251,12 +1251,12 @@  discard block
 block discarded – undo
1251 1251
  *     string si texte de la requête demandé, true sinon
1252 1252
  **/
1253 1253
 function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true) {
1254
-	if (!$requeter) {
1255
-		return 'BEGIN TRANSACTION';
1256
-	}
1257
-	Sqlite::demarrer_transaction($serveur);
1254
+    if (!$requeter) {
1255
+        return 'BEGIN TRANSACTION';
1256
+    }
1257
+    Sqlite::demarrer_transaction($serveur);
1258 1258
 
1259
-	return true;
1259
+    return true;
1260 1260
 }
1261 1261
 
1262 1262
 /**
@@ -1270,12 +1270,12 @@  discard block
 block discarded – undo
1270 1270
  *     string si texte de la requête demandé, true sinon
1271 1271
  **/
1272 1272
 function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) {
1273
-	if (!$requeter) {
1274
-		return 'COMMIT';
1275
-	}
1276
-	Sqlite::finir_transaction($serveur);
1273
+    if (!$requeter) {
1274
+        return 'COMMIT';
1275
+    }
1276
+    Sqlite::finir_transaction($serveur);
1277 1277
 
1278
-	return true;
1278
+    return true;
1279 1279
 }
1280 1280
 
1281 1281
 
@@ -1290,27 +1290,27 @@  discard block
 block discarded – undo
1290 1290
  *     Liste des noms de bases
1291 1291
  **/
1292 1292
 function spip_sqlite_listdbs($serveur = '', $requeter = true) {
1293
-	_sqlite_init();
1294
-
1295
-	if (!is_dir($d = substr((string) _DIR_DB, 0, -1))) {
1296
-		return [];
1297
-	}
1298
-
1299
-	include_spip('inc/flock');
1300
-	$bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1301
-	$bds = [];
1302
-
1303
-	foreach ($bases as $b) {
1304
-		// pas de bases commencant pas sqlite
1305
-		// (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1306
-		// les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1307
-		if (strpos((string) $b, '_sqlite')) {
1308
-			continue;
1309
-		}
1310
-		$bds[] = preg_replace(";.*/$pattern;iS", '$1', (string) $b);
1311
-	}
1312
-
1313
-	return $bds;
1293
+    _sqlite_init();
1294
+
1295
+    if (!is_dir($d = substr((string) _DIR_DB, 0, -1))) {
1296
+        return [];
1297
+    }
1298
+
1299
+    include_spip('inc/flock');
1300
+    $bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1301
+    $bds = [];
1302
+
1303
+    foreach ($bases as $b) {
1304
+        // pas de bases commencant pas sqlite
1305
+        // (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1306
+        // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1307
+        if (strpos((string) $b, '_sqlite')) {
1308
+            continue;
1309
+        }
1310
+        $bds[] = preg_replace(";.*/$pattern;iS", '$1', (string) $b);
1311
+    }
1312
+
1313
+    return $bds;
1314 1314
 }
1315 1315
 
1316 1316
 
@@ -1325,7 +1325,7 @@  discard block
 block discarded – undo
1325 1325
  * @return string       texte de sélection pour la requête
1326 1326
  */
1327 1327
 function spip_sqlite_multi($objet, $lang) {
1328
-	return 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1328
+    return 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1329 1329
 }
1330 1330
 
1331 1331
 
@@ -1342,15 +1342,15 @@  discard block
 block discarded – undo
1342 1342
  * @return bool|string true / false / requete
1343 1343
  **/
1344 1344
 function spip_sqlite_optimize($table, $serveur = '', $requeter = true) {
1345
-	static $do = false;
1346
-	if ($requeter && $do) {
1347
-		return true;
1348
-	}
1349
-	if ($requeter) {
1350
-		$do = true;
1351
-	}
1352
-
1353
-	return spip_sqlite_query('VACUUM', $serveur, $requeter);
1345
+    static $do = false;
1346
+    if ($requeter && $do) {
1347
+        return true;
1348
+    }
1349
+    if ($requeter) {
1350
+        $do = true;
1351
+    }
1352
+
1353
+    return spip_sqlite_query('VACUUM', $serveur, $requeter);
1354 1354
 }
1355 1355
 
1356 1356
 
@@ -1367,15 +1367,15 @@  discard block
 block discarded – undo
1367 1367
  *    Donnée prête à être utilisée par le gestionnaire SQL
1368 1368
  */
1369 1369
 function spip_sqlite_quote($v, $type = '') {
1370
-	if (!is_array($v)) {
1371
-		return _sqlite_calculer_cite($v, $type);
1372
-	}
1373
-	// si c'est un tableau, le parcourir en propageant le type
1374
-	foreach ($v as $k => $r) {
1375
-		$v[$k] = spip_sqlite_quote($r, $type);
1376
-	}
1377
-
1378
-	return implode(',', $v);
1370
+    if (!is_array($v)) {
1371
+        return _sqlite_calculer_cite($v, $type);
1372
+    }
1373
+    // si c'est un tableau, le parcourir en propageant le type
1374
+    foreach ($v as $k => $r) {
1375
+        $v[$k] = spip_sqlite_quote($r, $type);
1376
+    }
1377
+
1378
+    return implode(',', $v);
1379 1379
 }
1380 1380
 
1381 1381
 
@@ -1392,9 +1392,9 @@  discard block
 block discarded – undo
1392 1392
  *     Expression SQL
1393 1393
  **/
1394 1394
 function spip_sqlite_date_proche($champ, $interval, $unite) {
1395
-	$op = (($interval <= 0) ? '>' : '<');
1395
+    $op = (($interval <= 0) ? '>' : '<');
1396 1396
 
1397
-	return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1397
+    return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1398 1398
 }
1399 1399
 
1400 1400
 
@@ -1412,49 +1412,49 @@  discard block
 block discarded – undo
1412 1412
  *     l'état de la table après la réparation
1413 1413
  */
1414 1414
 function spip_sqlite_repair($table, $serveur = '', $requeter = true) {
1415
-	if (
1416
-		($desc = spip_sqlite_showtable($table, $serveur))
1417
-		&& isset($desc['field'])
1418
-		&& is_array($desc['field'])
1419
-	) {
1420
-		$logger = spip_logger('repair');
1421
-		foreach ($desc['field'] as $c => $d) {
1422
-			if (
1423
-				preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', (string) $d)
1424
-				&& stripos((string) $d, 'NOT NULL') !== false
1425
-				&& stripos((string) $d, 'DEFAULT') === false
1426
-				/* pas touche aux cles primaires */
1427
-				&& (!isset($desc['key']['PRIMARY KEY']) || $desc['key']['PRIMARY KEY'] !== $c)
1428
-			) {
1429
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1430
-				$logger->notice("ALTER $q");
1431
-			}
1432
-			if (
1433
-				preg_match(',^(INTEGER),i', (string) $d)
1434
-				&& stripos((string) $d, 'NOT NULL') !== false
1435
-				&& stripos((string) $d, 'DEFAULT') === false
1436
-				/* pas touche aux cles primaires */
1437
-				&& (!isset($desc['key']['PRIMARY KEY']) || $desc['key']['PRIMARY KEY'] !== $c)
1438
-			) {
1439
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1440
-				$logger->notice("ALTER $q");
1441
-			}
1442
-			if (
1443
-				preg_match(',^(datetime),i', (string) $d)
1444
-				&& stripos((string) $d, 'NOT NULL') !== false
1445
-				&& stripos((string) $d, 'DEFAULT') === false
1446
-				/* pas touche aux cles primaires */
1447
-				&& (!isset($desc['key']['PRIMARY KEY']) || $desc['key']['PRIMARY KEY'] !== $c)
1448
-			) {
1449
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1450
-				$logger->notice("ALTER $q");
1451
-			}
1452
-		}
1453
-
1454
-		return [' OK '];
1455
-	}
1456
-
1457
-	return [' ERROR '];
1415
+    if (
1416
+        ($desc = spip_sqlite_showtable($table, $serveur))
1417
+        && isset($desc['field'])
1418
+        && is_array($desc['field'])
1419
+    ) {
1420
+        $logger = spip_logger('repair');
1421
+        foreach ($desc['field'] as $c => $d) {
1422
+            if (
1423
+                preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', (string) $d)
1424
+                && stripos((string) $d, 'NOT NULL') !== false
1425
+                && stripos((string) $d, 'DEFAULT') === false
1426
+                /* pas touche aux cles primaires */
1427
+                && (!isset($desc['key']['PRIMARY KEY']) || $desc['key']['PRIMARY KEY'] !== $c)
1428
+            ) {
1429
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1430
+                $logger->notice("ALTER $q");
1431
+            }
1432
+            if (
1433
+                preg_match(',^(INTEGER),i', (string) $d)
1434
+                && stripos((string) $d, 'NOT NULL') !== false
1435
+                && stripos((string) $d, 'DEFAULT') === false
1436
+                /* pas touche aux cles primaires */
1437
+                && (!isset($desc['key']['PRIMARY KEY']) || $desc['key']['PRIMARY KEY'] !== $c)
1438
+            ) {
1439
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1440
+                $logger->notice("ALTER $q");
1441
+            }
1442
+            if (
1443
+                preg_match(',^(datetime),i', (string) $d)
1444
+                && stripos((string) $d, 'NOT NULL') !== false
1445
+                && stripos((string) $d, 'DEFAULT') === false
1446
+                /* pas touche aux cles primaires */
1447
+                && (!isset($desc['key']['PRIMARY KEY']) || $desc['key']['PRIMARY KEY'] !== $c)
1448
+            ) {
1449
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1450
+                $logger->notice("ALTER $q");
1451
+            }
1452
+        }
1453
+
1454
+        return [' OK '];
1455
+    }
1456
+
1457
+    return [' ERROR '];
1458 1458
 }
1459 1459
 
1460 1460
 
@@ -1483,25 +1483,25 @@  discard block
 block discarded – undo
1483 1483
  *     - false en cas d'erreur.
1484 1484
  **/
1485 1485
 function spip_sqlite_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1486
-	if (!$desc) {
1487
-		$desc = description_table($table, $serveur);
1488
-	}
1489
-	if (!$desc) {
1490
-		die("$table insertion sans description");
1491
-	}
1492
-	$fields = $desc['field'] ?? [];
1493
-
1494
-	foreach ($couples as $champ => $val) {
1495
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1496
-	}
1497
-
1498
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1499
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1500
-
1501
-	return spip_sqlite_query("REPLACE INTO $table (" . implode(',', array_keys($couples)) . ') VALUES (' . implode(
1502
-		',',
1503
-		$couples
1504
-	) . ')', $serveur);
1486
+    if (!$desc) {
1487
+        $desc = description_table($table, $serveur);
1488
+    }
1489
+    if (!$desc) {
1490
+        die("$table insertion sans description");
1491
+    }
1492
+    $fields = $desc['field'] ?? [];
1493
+
1494
+    foreach ($couples as $champ => $val) {
1495
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1496
+    }
1497
+
1498
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1499
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1500
+
1501
+    return spip_sqlite_query("REPLACE INTO $table (" . implode(',', array_keys($couples)) . ') VALUES (' . implode(
1502
+        ',',
1503
+        $couples
1504
+    ) . ')', $serveur);
1505 1505
 }
1506 1506
 
1507 1507
 
@@ -1531,14 +1531,14 @@  discard block
 block discarded – undo
1531 1531
  **/
1532 1532
 function spip_sqlite_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1533 1533
 
1534
-	$retour = null;
1535
-	// boucler pour traiter chaque requete independemment
1536
-	foreach ($tab_couples as $couples) {
1537
-		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1538
-	}
1534
+    $retour = null;
1535
+    // boucler pour traiter chaque requete independemment
1536
+    foreach ($tab_couples as $couples) {
1537
+        $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1538
+    }
1539 1539
 
1540
-	// renvoie le dernier id
1541
-	return $retour;
1540
+    // renvoie le dernier id
1541
+    return $retour;
1542 1542
 }
1543 1543
 
1544 1544
 
@@ -1565,44 +1565,44 @@  discard block
 block discarded – undo
1565 1565
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1566 1566
  */
1567 1567
 function spip_sqlite_select(
1568
-	$select,
1569
-	$from,
1570
-	$where = '',
1571
-	$groupby = '',
1572
-	$orderby = '',
1573
-	$limit = '',
1574
-	$having = '',
1575
-	$serveur = '',
1576
-	$requeter = true
1568
+    $select,
1569
+    $from,
1570
+    $where = '',
1571
+    $groupby = '',
1572
+    $orderby = '',
1573
+    $limit = '',
1574
+    $having = '',
1575
+    $serveur = '',
1576
+    $requeter = true
1577 1577
 ) {
1578 1578
 
1579
-	// version() n'est pas connu de sqlite
1580
-	$select = str_replace('version()', 'sqlite_version()', $select);
1581
-
1582
-	// recomposer from
1583
-	$from = (is_array($from) ? _sqlite_calculer_select_as($from) : $from);
1584
-
1585
-	$query =
1586
-		_sqlite_calculer_expression('SELECT', $select, ', ')
1587
-		. _sqlite_calculer_expression('FROM', $from, ', ')
1588
-		. _sqlite_calculer_expression('WHERE', $where)
1589
-		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1590
-		. _sqlite_calculer_expression('HAVING', $having)
1591
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1592
-		. ($limit ? "\nLIMIT $limit" : '');
1593
-
1594
-	// dans un select, on doit renvoyer la requête en cas d'erreur
1595
-	$res = spip_sqlite_query($query, $serveur, $requeter);
1596
-	// texte de la requete demande ?
1597
-	if (!$requeter) {
1598
-		return $res;
1599
-	}
1600
-	// erreur survenue ?
1601
-	if ($res === false) {
1602
-		return Sqlite::traduire_requete($query, $serveur);
1603
-	}
1604
-
1605
-	return $res;
1579
+    // version() n'est pas connu de sqlite
1580
+    $select = str_replace('version()', 'sqlite_version()', $select);
1581
+
1582
+    // recomposer from
1583
+    $from = (is_array($from) ? _sqlite_calculer_select_as($from) : $from);
1584
+
1585
+    $query =
1586
+        _sqlite_calculer_expression('SELECT', $select, ', ')
1587
+        . _sqlite_calculer_expression('FROM', $from, ', ')
1588
+        . _sqlite_calculer_expression('WHERE', $where)
1589
+        . _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1590
+        . _sqlite_calculer_expression('HAVING', $having)
1591
+        . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1592
+        . ($limit ? "\nLIMIT $limit" : '');
1593
+
1594
+    // dans un select, on doit renvoyer la requête en cas d'erreur
1595
+    $res = spip_sqlite_query($query, $serveur, $requeter);
1596
+    // texte de la requete demande ?
1597
+    if (!$requeter) {
1598
+        return $res;
1599
+    }
1600
+    // erreur survenue ?
1601
+    if ($res === false) {
1602
+        return Sqlite::traduire_requete($query, $serveur);
1603
+    }
1604
+
1605
+    return $res;
1606 1606
 }
1607 1607
 
1608 1608
 
@@ -1621,32 +1621,32 @@  discard block
 block discarded – undo
1621 1621
  *     - False en cas d'erreur.
1622 1622
  **/
1623 1623
 function spip_sqlite_selectdb($db, $serveur = '', $requeter = true) {
1624
-	_sqlite_init();
1625
-
1626
-	// interdire la creation d'une nouvelle base,
1627
-	// sauf si on est dans l'installation
1628
-	if (
1629
-		!is_file($f = _DIR_DB . $db . '.sqlite')
1630
-		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1631
-	) {
1632
-		spip_logger('sqlite')->emergency("Il est interdit de creer la base $db",);
1633
-
1634
-		return false;
1635
-	}
1636
-
1637
-	// se connecter a la base indiquee
1638
-	// avec les identifiants connus
1639
-	$index = $serveur ?: 0;
1640
-
1641
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1642
-		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1643
-			return $db;
1644
-		}
1645
-	} else {
1646
-		spip_logger('sqlite')->emergency("Impossible de selectionner la base $db");
1647
-	}
1648
-
1649
-	return false;
1624
+    _sqlite_init();
1625
+
1626
+    // interdire la creation d'une nouvelle base,
1627
+    // sauf si on est dans l'installation
1628
+    if (
1629
+        !is_file($f = _DIR_DB . $db . '.sqlite')
1630
+        && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1631
+    ) {
1632
+        spip_logger('sqlite')->emergency("Il est interdit de creer la base $db",);
1633
+
1634
+        return false;
1635
+    }
1636
+
1637
+    // se connecter a la base indiquee
1638
+    // avec les identifiants connus
1639
+    $index = $serveur ?: 0;
1640
+
1641
+    if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1642
+        if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1643
+            return $db;
1644
+        }
1645
+    } else {
1646
+        spip_logger('sqlite')->emergency("Impossible de selectionner la base $db");
1647
+    }
1648
+
1649
+    return false;
1650 1650
 }
1651 1651
 
1652 1652
 
@@ -1661,8 +1661,8 @@  discard block
 block discarded – undo
1661 1661
  * @return void
1662 1662
  */
1663 1663
 function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true) {
1664
-	# spip_logger('sqlite')->error("Gestion charset sql a ecrire : "."SET NAMES "._q($charset));
1665
-	# return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1664
+    # spip_logger('sqlite')->error("Gestion charset sql a ecrire : "."SET NAMES "._q($charset));
1665
+    # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1666 1666
 }
1667 1667
 
1668 1668
 
@@ -1680,24 +1680,24 @@  discard block
 block discarded – undo
1680 1680
  *     Ressource à utiliser avec sql_fetch()
1681 1681
  **/
1682 1682
 function spip_sqlite_showbase($match, $serveur = '', $requeter = true) {
1683
-	// type est le type d'entrée : table / index / view
1684
-	// on ne retourne que les tables (?) et non les vues...
1685
-	# ESCAPE non supporte par les versions sqlite <3
1686
-	#	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1687
-	$match = preg_quote($match);
1688
-	$match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1689
-	$match = str_replace('\\\%', '[[POURCENT]]', $match);
1690
-	$match = str_replace('_', '.', $match);
1691
-	$match = str_replace('%', '.*', $match);
1692
-	$match = str_replace('[[TIRETBAS]]', '_', $match);
1693
-	$match = str_replace('[[POURCENT]]', '%', $match);
1694
-	$match = "^$match$";
1695
-
1696
-	return spip_sqlite_query(
1697
-		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1698
-		$serveur,
1699
-		$requeter
1700
-	);
1683
+    // type est le type d'entrée : table / index / view
1684
+    // on ne retourne que les tables (?) et non les vues...
1685
+    # ESCAPE non supporte par les versions sqlite <3
1686
+    #	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1687
+    $match = preg_quote($match);
1688
+    $match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1689
+    $match = str_replace('\\\%', '[[POURCENT]]', $match);
1690
+    $match = str_replace('_', '.', $match);
1691
+    $match = str_replace('%', '.*', $match);
1692
+    $match = str_replace('[[TIRETBAS]]', '_', $match);
1693
+    $match = str_replace('[[POURCENT]]', '%', $match);
1694
+    $match = "^$match$";
1695
+
1696
+    return spip_sqlite_query(
1697
+        "SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1698
+        $serveur,
1699
+        $requeter
1700
+    );
1701 1701
 }
1702 1702
 
1703 1703
 /**
@@ -1715,19 +1715,19 @@  discard block
 block discarded – undo
1715 1715
  *     - string : requete sql, si $requeter = true
1716 1716
  **/
1717 1717
 function spip_sqlite_table_exists(string $table, $serveur = '', $requeter = true) {
1718
-	$r = spip_sqlite_query(
1719
-		'SELECT name FROM sqlite_master WHERE'
1720
-			. ' type=\'table\''
1721
-			. ' AND name=' . spip_sqlite_quote($table, 'string')
1722
-			. ' AND name NOT LIKE \'sqlite_%\'',
1723
-		$serveur,
1724
-		$requeter
1725
-	);
1726
-	if (!$requeter) {
1727
-		return $r;
1728
-	}
1729
-	$res = spip_sqlite_fetch($r, '', $serveur);
1730
-	return (bool) $res;
1718
+    $r = spip_sqlite_query(
1719
+        'SELECT name FROM sqlite_master WHERE'
1720
+            . ' type=\'table\''
1721
+            . ' AND name=' . spip_sqlite_quote($table, 'string')
1722
+            . ' AND name NOT LIKE \'sqlite_%\'',
1723
+        $serveur,
1724
+        $requeter
1725
+    );
1726
+    if (!$requeter) {
1727
+        return $r;
1728
+    }
1729
+    $res = spip_sqlite_fetch($r, '', $serveur);
1730
+    return (bool) $res;
1731 1731
 }
1732 1732
 
1733 1733
 define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -1750,129 +1750,129 @@  discard block
 block discarded – undo
1750 1750
  *     - array description de la table sinon
1751 1751
  */
1752 1752
 function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true) {
1753
-	$query =
1754
-		'SELECT sql, type FROM'
1755
-		. ' (SELECT * FROM sqlite_master UNION ALL'
1756
-		. ' SELECT * FROM sqlite_temp_master)'
1757
-		. " WHERE tbl_name LIKE '$nom_table'"
1758
-		. " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1759
-		. ' ORDER BY substr(type,2,1), name';
1760
-
1761
-	$a = spip_sqlite_query($query, $serveur, $requeter);
1762
-	if (!$a) {
1763
-		return '';
1764
-	}
1765
-	if (!$requeter) {
1766
-		return $a;
1767
-	}
1768
-	if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1769
-		return '';
1770
-	}
1771
-	$vue = ($a['type'] == 'view'); // table | vue
1772
-
1773
-	// c'est une table
1774
-	// il faut parser le create
1775
-	if (!$vue) {
1776
-		if (!preg_match(_SQLITE_RE_SHOW_TABLE, (string) array_shift($a), $r)) {
1777
-			return '';
1778
-		} else {
1779
-			$desc = $r[1];
1780
-			// extraction d'une KEY éventuelle en prenant garde de ne pas
1781
-			// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1782
-			if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1783
-				$namedkeys = $r[2];
1784
-				$desc = $r[1];
1785
-			} else {
1786
-				$namedkeys = '';
1787
-			}
1788
-
1789
-			$fields = [];
1790
-			$keys = [];
1791
-
1792
-			// enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1793
-			// par exemple s'il contiennent une virgule.
1794
-			// /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1795
-			[$desc, $echaps] = query_echappe_textes($desc);
1796
-
1797
-			// separer toutes les descriptions de champs, separes par des virgules
1798
-			# /!\ explode peut exploser aussi DECIMAL(10,2) !
1799
-			$k_precedent = null;
1800
-			foreach (explode(',', (string) $desc) as $v) {
1801
-				preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1802
-				// Les cles de champs peuvent etre entourees
1803
-				// de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1804
-				// http://www.sqlite.org/lang_keywords.html
1805
-				$k = strtolower((string) query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1806
-				if ($char = strpbrk($k[0], '\'"[`')) {
1807
-					$k = trim($k, $char);
1808
-					if ($char == '[') {
1809
-						$k = rtrim($k, ']');
1810
-					}
1811
-				}
1812
-				$def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1813
-
1814
-				// rustine pour DECIMAL(10,2)
1815
-				// s'il y a une parenthèse fermante dans la clé
1816
-				// ou dans la définition sans qu'il n'y ait une ouverture avant
1817
-				if (str_contains($k, ')') || preg_match('/^[^\(]*\)/', (string) $def)) {
1818
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1819
-					continue;
1820
-				}
1821
-
1822
-				// la primary key peut etre dans une des descriptions de champs
1823
-				// et non en fin de table, cas encore decouvert avec Sqlite Manager
1824
-				if (stripos($r[2], 'PRIMARY KEY') !== false) {
1825
-					$keys['PRIMARY KEY'] = $k;
1826
-				}
1827
-
1828
-				$fields[$k] = $def;
1829
-				$k_precedent = $k;
1830
-			}
1831
-			// key inclues dans la requete
1832
-			foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1833
-				if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', (string) $v, $r)) {
1834
-					$k = str_replace('`', '', trim($r[1]));
1835
-					$t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1836
-					if ($k && !isset($keys[$k])) {
1837
-						$keys[$k] = $t;
1838
-					} else {
1839
-						$keys[] = $t;
1840
-					}
1841
-				}
1842
-			}
1843
-			// sinon ajouter les key index
1844
-			$query =
1845
-				'SELECT name,sql FROM'
1846
-				. ' (SELECT * FROM sqlite_master UNION ALL'
1847
-				. ' SELECT * FROM sqlite_temp_master)'
1848
-				. " WHERE tbl_name LIKE '$nom_table'"
1849
-				. " AND type='index' AND name NOT LIKE 'sqlite_%'"
1850
-				. 'ORDER BY substr(type,2,1), name';
1851
-			$a = spip_sqlite_query($query, $serveur, $requeter);
1852
-			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1853
-				$key = str_replace($nom_table . '_', '', (string) $r['name']); // enlever le nom de la table ajoute a l'index
1854
-				$keytype = 'KEY';
1855
-				if (str_contains((string) $r['sql'], 'UNIQUE INDEX')) {
1856
-					$keytype = 'UNIQUE KEY';
1857
-				}
1858
-				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', (string) $r['sql']);
1859
-				$keys[$keytype . ' ' . $key] = $colonnes;
1860
-			}
1861
-		}
1862
-	} // c'est une vue, on liste les champs disponibles simplement
1863
-	else {
1864
-		if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1865
-			$fields = [];
1866
-			foreach ($res as $c => $v) {
1867
-				$fields[$c] = '';
1868
-			}
1869
-			$keys = [];
1870
-		} else {
1871
-			return '';
1872
-		}
1873
-	}
1874
-
1875
-	return ['field' => $fields, 'key' => $keys];
1753
+    $query =
1754
+        'SELECT sql, type FROM'
1755
+        . ' (SELECT * FROM sqlite_master UNION ALL'
1756
+        . ' SELECT * FROM sqlite_temp_master)'
1757
+        . " WHERE tbl_name LIKE '$nom_table'"
1758
+        . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1759
+        . ' ORDER BY substr(type,2,1), name';
1760
+
1761
+    $a = spip_sqlite_query($query, $serveur, $requeter);
1762
+    if (!$a) {
1763
+        return '';
1764
+    }
1765
+    if (!$requeter) {
1766
+        return $a;
1767
+    }
1768
+    if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1769
+        return '';
1770
+    }
1771
+    $vue = ($a['type'] == 'view'); // table | vue
1772
+
1773
+    // c'est une table
1774
+    // il faut parser le create
1775
+    if (!$vue) {
1776
+        if (!preg_match(_SQLITE_RE_SHOW_TABLE, (string) array_shift($a), $r)) {
1777
+            return '';
1778
+        } else {
1779
+            $desc = $r[1];
1780
+            // extraction d'une KEY éventuelle en prenant garde de ne pas
1781
+            // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1782
+            if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1783
+                $namedkeys = $r[2];
1784
+                $desc = $r[1];
1785
+            } else {
1786
+                $namedkeys = '';
1787
+            }
1788
+
1789
+            $fields = [];
1790
+            $keys = [];
1791
+
1792
+            // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1793
+            // par exemple s'il contiennent une virgule.
1794
+            // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1795
+            [$desc, $echaps] = query_echappe_textes($desc);
1796
+
1797
+            // separer toutes les descriptions de champs, separes par des virgules
1798
+            # /!\ explode peut exploser aussi DECIMAL(10,2) !
1799
+            $k_precedent = null;
1800
+            foreach (explode(',', (string) $desc) as $v) {
1801
+                preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1802
+                // Les cles de champs peuvent etre entourees
1803
+                // de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1804
+                // http://www.sqlite.org/lang_keywords.html
1805
+                $k = strtolower((string) query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1806
+                if ($char = strpbrk($k[0], '\'"[`')) {
1807
+                    $k = trim($k, $char);
1808
+                    if ($char == '[') {
1809
+                        $k = rtrim($k, ']');
1810
+                    }
1811
+                }
1812
+                $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1813
+
1814
+                // rustine pour DECIMAL(10,2)
1815
+                // s'il y a une parenthèse fermante dans la clé
1816
+                // ou dans la définition sans qu'il n'y ait une ouverture avant
1817
+                if (str_contains($k, ')') || preg_match('/^[^\(]*\)/', (string) $def)) {
1818
+                    $fields[$k_precedent] .= ',' . $k . ' ' . $def;
1819
+                    continue;
1820
+                }
1821
+
1822
+                // la primary key peut etre dans une des descriptions de champs
1823
+                // et non en fin de table, cas encore decouvert avec Sqlite Manager
1824
+                if (stripos($r[2], 'PRIMARY KEY') !== false) {
1825
+                    $keys['PRIMARY KEY'] = $k;
1826
+                }
1827
+
1828
+                $fields[$k] = $def;
1829
+                $k_precedent = $k;
1830
+            }
1831
+            // key inclues dans la requete
1832
+            foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1833
+                if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', (string) $v, $r)) {
1834
+                    $k = str_replace('`', '', trim($r[1]));
1835
+                    $t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1836
+                    if ($k && !isset($keys[$k])) {
1837
+                        $keys[$k] = $t;
1838
+                    } else {
1839
+                        $keys[] = $t;
1840
+                    }
1841
+                }
1842
+            }
1843
+            // sinon ajouter les key index
1844
+            $query =
1845
+                'SELECT name,sql FROM'
1846
+                . ' (SELECT * FROM sqlite_master UNION ALL'
1847
+                . ' SELECT * FROM sqlite_temp_master)'
1848
+                . " WHERE tbl_name LIKE '$nom_table'"
1849
+                . " AND type='index' AND name NOT LIKE 'sqlite_%'"
1850
+                . 'ORDER BY substr(type,2,1), name';
1851
+            $a = spip_sqlite_query($query, $serveur, $requeter);
1852
+            while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1853
+                $key = str_replace($nom_table . '_', '', (string) $r['name']); // enlever le nom de la table ajoute a l'index
1854
+                $keytype = 'KEY';
1855
+                if (str_contains((string) $r['sql'], 'UNIQUE INDEX')) {
1856
+                    $keytype = 'UNIQUE KEY';
1857
+                }
1858
+                $colonnes = preg_replace(',.*\((.*)\).*,', '$1', (string) $r['sql']);
1859
+                $keys[$keytype . ' ' . $key] = $colonnes;
1860
+            }
1861
+        }
1862
+    } // c'est une vue, on liste les champs disponibles simplement
1863
+    else {
1864
+        if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1865
+            $fields = [];
1866
+            foreach ($res as $c => $v) {
1867
+                $fields[$c] = '';
1868
+            }
1869
+            $keys = [];
1870
+        } else {
1871
+            return '';
1872
+        }
1873
+    }
1874
+
1875
+    return ['field' => $fields, 'key' => $keys];
1876 1876
 }
1877 1877
 
1878 1878
 
@@ -1898,24 +1898,24 @@  discard block
 block discarded – undo
1898 1898
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1899 1899
  */
1900 1900
 function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true) {
1901
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1902
-	$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1903
-
1904
-	$set = [];
1905
-	foreach ($champs as $champ => $val) {
1906
-		$set[] = $champ . "=$val";
1907
-	}
1908
-	if ($set !== []) {
1909
-		return spip_sqlite_query(
1910
-			_sqlite_calculer_expression('UPDATE', $table, ',')
1911
-				. _sqlite_calculer_expression('SET', $set, ',')
1912
-				. _sqlite_calculer_expression('WHERE', $where),
1913
-			$serveur,
1914
-			$requeter
1915
-		);
1916
-	}
1917
-
1918
-	return false;
1901
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1902
+    $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1903
+
1904
+    $set = [];
1905
+    foreach ($champs as $champ => $val) {
1906
+        $set[] = $champ . "=$val";
1907
+    }
1908
+    if ($set !== []) {
1909
+        return spip_sqlite_query(
1910
+            _sqlite_calculer_expression('UPDATE', $table, ',')
1911
+                . _sqlite_calculer_expression('SET', $set, ',')
1912
+                . _sqlite_calculer_expression('WHERE', $where),
1913
+            $serveur,
1914
+            $requeter
1915
+        );
1916
+    }
1917
+
1918
+    return false;
1919 1919
 }
1920 1920
 
1921 1921
 
@@ -1945,38 +1945,38 @@  discard block
 block discarded – undo
1945 1945
  */
1946 1946
 function spip_sqlite_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1947 1947
 
1948
-	if (!$champs) {
1949
-		return;
1950
-	}
1951
-	if (!$desc) {
1952
-		$desc = description_table($table, $serveur);
1953
-	}
1954
-	if (!$desc) {
1955
-		die("$table insertion sans description");
1956
-	}
1957
-	$fields = $desc['field'];
1958
-
1959
-	$set = [];
1960
-	foreach ($champs as $champ => $val) {
1961
-		$set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, $fields[$champ] ?? '');
1962
-	}
1963
-
1964
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1965
-	// attention ils sont deja quotes
1966
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1967
-	foreach ($maj as $champ => $val) {
1968
-		if (!isset($set[$champ])) {
1969
-			$set[$champ] = $champ . '=' . $val;
1970
-		}
1971
-	}
1972
-
1973
-	return spip_sqlite_query(
1974
-		_sqlite_calculer_expression('UPDATE', $table, ',')
1975
-			. _sqlite_calculer_expression('SET', $set, ',')
1976
-			. _sqlite_calculer_expression('WHERE', $where),
1977
-		$serveur,
1978
-		$requeter
1979
-	);
1948
+    if (!$champs) {
1949
+        return;
1950
+    }
1951
+    if (!$desc) {
1952
+        $desc = description_table($table, $serveur);
1953
+    }
1954
+    if (!$desc) {
1955
+        die("$table insertion sans description");
1956
+    }
1957
+    $fields = $desc['field'];
1958
+
1959
+    $set = [];
1960
+    foreach ($champs as $champ => $val) {
1961
+        $set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, $fields[$champ] ?? '');
1962
+    }
1963
+
1964
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1965
+    // attention ils sont deja quotes
1966
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1967
+    foreach ($maj as $champ => $val) {
1968
+        if (!isset($set[$champ])) {
1969
+            $set[$champ] = $champ . '=' . $val;
1970
+        }
1971
+    }
1972
+
1973
+    return spip_sqlite_query(
1974
+        _sqlite_calculer_expression('UPDATE', $table, ',')
1975
+            . _sqlite_calculer_expression('SET', $set, ',')
1976
+            . _sqlite_calculer_expression('WHERE', $where),
1977
+        $serveur,
1978
+        $requeter
1979
+    );
1980 1980
 }
1981 1981
 
1982 1982
 
@@ -1994,17 +1994,17 @@  discard block
 block discarded – undo
1994 1994
  * @return void
1995 1995
  */
1996 1996
 function _sqlite_init() {
1997
-	if (!defined('_DIR_DB')) {
1998
-		define('_DIR_DB', _DIR_ETC . 'bases/');
1999
-	}
2000
-	if (!defined('_SQLITE_CHMOD')) {
2001
-		define('_SQLITE_CHMOD', _SPIP_CHMOD);
2002
-	}
2003
-
2004
-	if (!is_dir($d = _DIR_DB)) {
2005
-		include_spip('inc/flock');
2006
-		sous_repertoire($d);
2007
-	}
1997
+    if (!defined('_DIR_DB')) {
1998
+        define('_DIR_DB', _DIR_ETC . 'bases/');
1999
+    }
2000
+    if (!defined('_SQLITE_CHMOD')) {
2001
+        define('_SQLITE_CHMOD', _SPIP_CHMOD);
2002
+    }
2003
+
2004
+    if (!is_dir($d = _DIR_DB)) {
2005
+        include_spip('inc/flock');
2006
+        sous_repertoire($d);
2007
+    }
2008 2008
 }
2009 2009
 
2010 2010
 
@@ -2018,20 +2018,20 @@  discard block
 block discarded – undo
2018 2018
  * @return bool|int
2019 2019
  */
2020 2020
 function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true) {
2021
-	if ($link === '') {
2022
-		$link = _sqlite_link($serveur);
2023
-	}
2024
-	if (!$link) {
2025
-		return false;
2026
-	}
2021
+    if ($link === '') {
2022
+        $link = _sqlite_link($serveur);
2023
+    }
2024
+    if (!$link) {
2025
+        return false;
2026
+    }
2027 2027
 
2028
-	$v = 3;
2028
+    $v = 3;
2029 2029
 
2030
-	if (!$version) {
2031
-		return $v;
2032
-	}
2030
+    if (!$version) {
2031
+        return $v;
2032
+    }
2033 2033
 
2034
-	return ($version == $v);
2034
+    return ($version == $v);
2035 2035
 }
2036 2036
 
2037 2037
 
@@ -2042,9 +2042,9 @@  discard block
 block discarded – undo
2042 2042
  * @return \PDO|null Information de connexion pour SQLite
2043 2043
  */
2044 2044
 function _sqlite_link($serveur = ''): ?\PDO {
2045
-	$link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
2045
+    $link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
2046 2046
 
2047
-	return $link;
2047
+    return $link;
2048 2048
 }
2049 2049
 
2050 2050
 
@@ -2059,51 +2059,51 @@  discard block
 block discarded – undo
2059 2059
  * @return string|number     texte ou nombre échappé
2060 2060
  */
2061 2061
 function _sqlite_calculer_cite($v, $type) {
2062
-	if ($type) {
2063
-		if (is_null($v) && stripos($type, 'NOT NULL') === false) {
2064
-			// null php se traduit en NULL SQL
2065
-			return 'NULL';
2066
-		}
2067
-
2068
-		if (sql_test_date($type) && preg_match('/^\w+\(/', $v)) {
2069
-			return $v;
2070
-		}
2071
-		if (sql_test_int($type)) {
2072
-			if (is_numeric($v)) {
2073
-				return $v;
2074
-			} elseif ($v === null) {
2075
-				return 0;
2076
-			} elseif (ctype_xdigit(substr($v, 2)) && str_starts_with($v, '0x')) {
2077
-				return hexdec(substr($v, 2));
2078
-			} else {
2079
-				return (int) $v;
2080
-			}
2081
-		}
2082
-	} else {
2083
-		// si on ne connait pas le type on le deduit de $v autant que possible
2084
-		if (is_bool($v)) {
2085
-			return (string) (int) $v;
2086
-		} elseif (is_numeric($v)) {
2087
-			return (string) $v;
2088
-		}
2089
-	}
2090
-
2091
-	// trouver un link sqlite pour faire l'echappement
2092
-	foreach ($GLOBALS['connexions'] as $s) {
2093
-		if (
2094
-			($l = $s['link'])
2095
-			&& is_object($l)
2096
-			&& $l instanceof \PDO
2097
-			&& $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2098
-		) {
2099
-			return $l->quote($v ?? '');
2100
-		}
2101
-	}
2102
-
2103
-	// echapper les ' en ''
2104
-	spip_logger('sqlite')->notice('Pas de methode ->quote pour echapper');
2105
-
2106
-	return ("'" . str_replace("'", "''", $v) . "'");
2062
+    if ($type) {
2063
+        if (is_null($v) && stripos($type, 'NOT NULL') === false) {
2064
+            // null php se traduit en NULL SQL
2065
+            return 'NULL';
2066
+        }
2067
+
2068
+        if (sql_test_date($type) && preg_match('/^\w+\(/', $v)) {
2069
+            return $v;
2070
+        }
2071
+        if (sql_test_int($type)) {
2072
+            if (is_numeric($v)) {
2073
+                return $v;
2074
+            } elseif ($v === null) {
2075
+                return 0;
2076
+            } elseif (ctype_xdigit(substr($v, 2)) && str_starts_with($v, '0x')) {
2077
+                return hexdec(substr($v, 2));
2078
+            } else {
2079
+                return (int) $v;
2080
+            }
2081
+        }
2082
+    } else {
2083
+        // si on ne connait pas le type on le deduit de $v autant que possible
2084
+        if (is_bool($v)) {
2085
+            return (string) (int) $v;
2086
+        } elseif (is_numeric($v)) {
2087
+            return (string) $v;
2088
+        }
2089
+    }
2090
+
2091
+    // trouver un link sqlite pour faire l'echappement
2092
+    foreach ($GLOBALS['connexions'] as $s) {
2093
+        if (
2094
+            ($l = $s['link'])
2095
+            && is_object($l)
2096
+            && $l instanceof \PDO
2097
+            && $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2098
+        ) {
2099
+            return $l->quote($v ?? '');
2100
+        }
2101
+    }
2102
+
2103
+    // echapper les ' en ''
2104
+    spip_logger('sqlite')->notice('Pas de methode ->quote pour echapper');
2105
+
2106
+    return ("'" . str_replace("'", "''", $v) . "'");
2107 2107
 }
2108 2108
 
2109 2109
 
@@ -2119,21 +2119,21 @@  discard block
 block discarded – undo
2119 2119
  * @return string            texte de l'expression, une partie donc, du texte la requête.
2120 2120
  */
2121 2121
 function _sqlite_calculer_expression($expression, $v, $join = 'AND') {
2122
-	if (empty($v)) {
2123
-		return '';
2124
-	}
2125
-
2126
-	$exp = "\n$expression ";
2127
-
2128
-	if (!is_array($v)) {
2129
-		return $exp . $v;
2130
-	} else {
2131
-		if (strtoupper($join) === 'AND') {
2132
-			return $exp . implode("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2133
-		} else {
2134
-			return $exp . implode($join, $v);
2135
-		}
2136
-	}
2122
+    if (empty($v)) {
2123
+        return '';
2124
+    }
2125
+
2126
+    $exp = "\n$expression ";
2127
+
2128
+    if (!is_array($v)) {
2129
+        return $exp . $v;
2130
+    } else {
2131
+        if (strtoupper($join) === 'AND') {
2132
+            return $exp . implode("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2133
+        } else {
2134
+            return $exp . implode($join, $v);
2135
+        }
2136
+    }
2137 2137
 }
2138 2138
 
2139 2139
 
@@ -2149,7 +2149,7 @@  discard block
 block discarded – undo
2149 2149
  * @return string texte du orderby préparé
2150 2150
  */
2151 2151
 function _sqlite_calculer_order($orderby) {
2152
-	return (is_array($orderby)) ? implode(', ', $orderby) : $orderby;
2152
+    return (is_array($orderby)) ? implode(', ', $orderby) : $orderby;
2153 2153
 }
2154 2154
 
2155 2155
 
@@ -2160,26 +2160,26 @@  discard block
 block discarded – undo
2160 2160
  * @return string Sélection de colonnes pour une clause SELECT
2161 2161
  */
2162 2162
 function _sqlite_calculer_select_as($args) {
2163
-	$res = '';
2164
-	foreach ($args as $k => $v) {
2165
-		if (str_ends_with($k, '@')) {
2166
-			// c'est une jointure qui se refere au from precedent
2167
-			// pas de virgule
2168
-			$res .= '  ' . $v;
2169
-		} else {
2170
-			if (!is_numeric($k)) {
2171
-				$p = strpos((string) $v, ' ');
2172
-				if ($p) {
2173
-					$v = substr((string) $v, 0, $p) . " AS '$k'" . substr((string) $v, $p);
2174
-				} else {
2175
-					$v .= " AS '$k'";
2176
-				}
2177
-			}
2178
-			$res .= ', ' . $v;
2179
-		}
2180
-	}
2181
-
2182
-	return substr($res, 2);
2163
+    $res = '';
2164
+    foreach ($args as $k => $v) {
2165
+        if (str_ends_with($k, '@')) {
2166
+            // c'est une jointure qui se refere au from precedent
2167
+            // pas de virgule
2168
+            $res .= '  ' . $v;
2169
+        } else {
2170
+            if (!is_numeric($k)) {
2171
+                $p = strpos((string) $v, ' ');
2172
+                if ($p) {
2173
+                    $v = substr((string) $v, 0, $p) . " AS '$k'" . substr((string) $v, $p);
2174
+                } else {
2175
+                    $v .= " AS '$k'";
2176
+                }
2177
+            }
2178
+            $res .= ', ' . $v;
2179
+        }
2180
+    }
2181
+
2182
+    return substr($res, 2);
2183 2183
 }
2184 2184
 
2185 2185
 
@@ -2202,26 +2202,26 @@  discard block
 block discarded – undo
2202 2202
  *     Contrainte pour clause WHERE
2203 2203
  */
2204 2204
 function _sqlite_calculer_where($v) {
2205
-	if (!is_array($v)) {
2206
-		return $v;
2207
-	}
2208
-
2209
-	$op = array_shift($v);
2210
-	if (!($n = count($v))) {
2211
-		return $op;
2212
-	} else {
2213
-		$arg = _sqlite_calculer_where(array_shift($v));
2214
-		if ($n == 1) {
2215
-			return "$op($arg)";
2216
-		} else {
2217
-			$arg2 = _sqlite_calculer_where(array_shift($v));
2218
-			if ($n == 2) {
2219
-				return "($arg $op $arg2)";
2220
-			} else {
2221
-				return "($arg $op ($arg2) : $v[0])";
2222
-			}
2223
-		}
2224
-	}
2205
+    if (!is_array($v)) {
2206
+        return $v;
2207
+    }
2208
+
2209
+    $op = array_shift($v);
2210
+    if (!($n = count($v))) {
2211
+        return $op;
2212
+    } else {
2213
+        $arg = _sqlite_calculer_where(array_shift($v));
2214
+        if ($n == 1) {
2215
+            return "$op($arg)";
2216
+        } else {
2217
+            $arg2 = _sqlite_calculer_where(array_shift($v));
2218
+            if ($n == 2) {
2219
+                return "($arg $op $arg2)";
2220
+            } else {
2221
+                return "($arg $op ($arg2) : $v[0])";
2222
+            }
2223
+        }
2224
+    }
2225 2225
 }
2226 2226
 
2227 2227
 
@@ -2236,17 +2236,17 @@  discard block
 block discarded – undo
2236 2236
  * @return array|bool
2237 2237
  */
2238 2238
 function _sqlite_charger_version($version = '') {
2239
-	$versions = [];
2239
+    $versions = [];
2240 2240
 
2241
-	// version 3
2242
-	if ((!$version || $version == 3) && (extension_loaded('pdo') && extension_loaded('pdo_sqlite'))) {
2243
-		$versions[] = 3;
2244
-	}
2245
-	if ($version) {
2246
-		return in_array($version, $versions);
2247
-	}
2241
+    // version 3
2242
+    if ((!$version || $version == 3) && (extension_loaded('pdo') && extension_loaded('pdo_sqlite'))) {
2243
+        $versions[] = 3;
2244
+    }
2245
+    if ($version) {
2246
+        return in_array($version, $versions);
2247
+    }
2248 2248
 
2249
-	return $versions;
2249
+    return $versions;
2250 2250
 }
2251 2251
 
2252 2252
 
@@ -2284,147 +2284,147 @@  discard block
 block discarded – undo
2284 2284
  */
2285 2285
 function _sqlite_modifier_table($table, $colonne, $opt = [], $serveur = '') {
2286 2286
 
2287
-	if (is_array($table)) {
2288
-		$table_destination = reset($table);
2289
-		$table_origine = key($table);
2290
-	} else {
2291
-		$table_origine = $table_destination = $table;
2292
-	}
2293
-	// ne prend actuellement qu'un changement
2294
-	// mais pourra etre adapte pour changer plus qu'une colonne a la fois
2295
-	if (is_array($colonne)) {
2296
-		$colonne_destination = reset($colonne);
2297
-		$colonne_origine = key($colonne);
2298
-	} else {
2299
-		$colonne_origine = $colonne_destination = $colonne;
2300
-	}
2301
-	if (!isset($opt['field'])) {
2302
-		$opt['field'] = [];
2303
-	}
2304
-	if (!isset($opt['key'])) {
2305
-		$opt['key'] = [];
2306
-	}
2307
-
2308
-	// si les noms de tables sont differents, pas besoin de table temporaire
2309
-	// on prendra directement le nom de la future table
2310
-	$meme_table = ($table_origine == $table_destination);
2311
-
2312
-	$def_origine = sql_showtable($table_origine, false, $serveur);
2313
-	if (!$def_origine || !isset($def_origine['field'])) {
2314
-		spip_logger('sqlite')->error("Alter table impossible sur $table_origine : table non trouvee");
2315
-
2316
-		return false;
2317
-	}
2318
-
2319
-
2320
-	$table_tmp = $table_origine . '_tmp';
2321
-
2322
-	// 1) creer une table temporaire avec les modifications
2323
-	// - DROP : suppression de la colonne
2324
-	// - CHANGE : modification de la colonne
2325
-	// (foreach pour conserver l'ordre des champs)
2326
-
2327
-	// field
2328
-	$fields = [];
2329
-	// pour le INSERT INTO plus loin
2330
-	// stocker la correspondance nouvelles->anciennes colonnes
2331
-	$fields_correspondances = [];
2332
-	foreach ($def_origine['field'] as $c => $d) {
2333
-		if ($colonne_origine && ($c == $colonne_origine)) {
2334
-			// si pas DROP
2335
-			if ($colonne_destination) {
2336
-				$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2337
-				$fields_correspondances[$colonne_destination] = $c;
2338
-			}
2339
-		} else {
2340
-			$fields[$c] = $d;
2341
-			$fields_correspondances[$c] = $c;
2342
-		}
2343
-	}
2344
-	// cas de ADD sqlite2 (ajout du champ en fin de table):
2345
-	if (!$colonne_origine && $colonne_destination) {
2346
-		$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2347
-	}
2348
-
2349
-	// key...
2350
-	$keys = [];
2351
-	foreach ($def_origine['key'] as $c => $d) {
2352
-		$c = str_replace($colonne_origine, $colonne_destination, (string) $c);
2353
-		$d = str_replace($colonne_origine, $colonne_destination, (string) $d);
2354
-		// seulement si on ne supprime pas la colonne !
2355
-		if ($d) {
2356
-			$keys[$c] = $d;
2357
-		}
2358
-	}
2359
-
2360
-	// autres keys, on merge
2361
-	$keys = array_merge($keys, $opt['key']);
2362
-	$queries = [];
2363
-
2364
-	// copier dans destination (si differente de origine), sinon tmp
2365
-	$table_copie = ($meme_table) ? $table_tmp : $table_destination;
2366
-	$autoinc = (isset($keys['PRIMARY KEY'])
2367
-		&& $keys['PRIMARY KEY']
2368
-		&& stripos((string) $keys['PRIMARY KEY'], ',') === false
2369
-		&& stripos((string) $fields[$keys['PRIMARY KEY']], 'default') === false);
2370
-
2371
-	if (
2372
-		$q = _sqlite_requete_create(
2373
-			$table_copie,
2374
-			$fields,
2375
-			$keys,
2376
-			$autoinc,
2377
-			$temporary = false,
2378
-			$ifnotexists = true,
2379
-			$serveur
2380
-		)
2381
-	) {
2382
-		$queries[] = $q;
2383
-	}
2384
-
2385
-
2386
-	// 2) y copier les champs qui vont bien
2387
-	$champs_dest = implode(', ', array_keys($fields_correspondances));
2388
-	$champs_ori = implode(', ', $fields_correspondances);
2389
-	$queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2390
-
2391
-	// 3) supprimer la table d'origine
2392
-	$queries[] = "DROP TABLE $table_origine";
2393
-
2394
-	// 4) renommer la table temporaire
2395
-	// avec le nom de la table destination
2396
-	// si necessaire
2397
-	if ($meme_table) {
2398
-		$queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2399
-	}
2400
-
2401
-	// 5) remettre les index !
2402
-	foreach ($keys as $k => $v) {
2403
-		if ($k == 'PRIMARY KEY') {
2404
-		} else {
2405
-			// enlever KEY
2406
-			$k = substr($k, 4);
2407
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2408
-		}
2409
-	}
2410
-
2411
-
2412
-	if ($queries !== []) {
2413
-		Sqlite::demarrer_transaction($serveur);
2414
-		// il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2415
-		foreach ($queries as $q) {
2416
-			if (!Sqlite::executer_requete($q, $serveur)) {
2417
-				spip_logger('sqlite')->error('SQLite : ALTER TABLE table :'
2418
-					. " Erreur a l'execution de la requete : $q");
2419
-				Sqlite::annuler_transaction($serveur);
2420
-
2421
-				return false;
2422
-			}
2423
-		}
2424
-		Sqlite::finir_transaction($serveur);
2425
-	}
2426
-
2427
-	return true;
2287
+    if (is_array($table)) {
2288
+        $table_destination = reset($table);
2289
+        $table_origine = key($table);
2290
+    } else {
2291
+        $table_origine = $table_destination = $table;
2292
+    }
2293
+    // ne prend actuellement qu'un changement
2294
+    // mais pourra etre adapte pour changer plus qu'une colonne a la fois
2295
+    if (is_array($colonne)) {
2296
+        $colonne_destination = reset($colonne);
2297
+        $colonne_origine = key($colonne);
2298
+    } else {
2299
+        $colonne_origine = $colonne_destination = $colonne;
2300
+    }
2301
+    if (!isset($opt['field'])) {
2302
+        $opt['field'] = [];
2303
+    }
2304
+    if (!isset($opt['key'])) {
2305
+        $opt['key'] = [];
2306
+    }
2307
+
2308
+    // si les noms de tables sont differents, pas besoin de table temporaire
2309
+    // on prendra directement le nom de la future table
2310
+    $meme_table = ($table_origine == $table_destination);
2311
+
2312
+    $def_origine = sql_showtable($table_origine, false, $serveur);
2313
+    if (!$def_origine || !isset($def_origine['field'])) {
2314
+        spip_logger('sqlite')->error("Alter table impossible sur $table_origine : table non trouvee");
2315
+
2316
+        return false;
2317
+    }
2318
+
2319
+
2320
+    $table_tmp = $table_origine . '_tmp';
2321
+
2322
+    // 1) creer une table temporaire avec les modifications
2323
+    // - DROP : suppression de la colonne
2324
+    // - CHANGE : modification de la colonne
2325
+    // (foreach pour conserver l'ordre des champs)
2326
+
2327
+    // field
2328
+    $fields = [];
2329
+    // pour le INSERT INTO plus loin
2330
+    // stocker la correspondance nouvelles->anciennes colonnes
2331
+    $fields_correspondances = [];
2332
+    foreach ($def_origine['field'] as $c => $d) {
2333
+        if ($colonne_origine && ($c == $colonne_origine)) {
2334
+            // si pas DROP
2335
+            if ($colonne_destination) {
2336
+                $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2337
+                $fields_correspondances[$colonne_destination] = $c;
2338
+            }
2339
+        } else {
2340
+            $fields[$c] = $d;
2341
+            $fields_correspondances[$c] = $c;
2342
+        }
2343
+    }
2344
+    // cas de ADD sqlite2 (ajout du champ en fin de table):
2345
+    if (!$colonne_origine && $colonne_destination) {
2346
+        $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2347
+    }
2348
+
2349
+    // key...
2350
+    $keys = [];
2351
+    foreach ($def_origine['key'] as $c => $d) {
2352
+        $c = str_replace($colonne_origine, $colonne_destination, (string) $c);
2353
+        $d = str_replace($colonne_origine, $colonne_destination, (string) $d);
2354
+        // seulement si on ne supprime pas la colonne !
2355
+        if ($d) {
2356
+            $keys[$c] = $d;
2357
+        }
2358
+    }
2359
+
2360
+    // autres keys, on merge
2361
+    $keys = array_merge($keys, $opt['key']);
2362
+    $queries = [];
2363
+
2364
+    // copier dans destination (si differente de origine), sinon tmp
2365
+    $table_copie = ($meme_table) ? $table_tmp : $table_destination;
2366
+    $autoinc = (isset($keys['PRIMARY KEY'])
2367
+        && $keys['PRIMARY KEY']
2368
+        && stripos((string) $keys['PRIMARY KEY'], ',') === false
2369
+        && stripos((string) $fields[$keys['PRIMARY KEY']], 'default') === false);
2370
+
2371
+    if (
2372
+        $q = _sqlite_requete_create(
2373
+            $table_copie,
2374
+            $fields,
2375
+            $keys,
2376
+            $autoinc,
2377
+            $temporary = false,
2378
+            $ifnotexists = true,
2379
+            $serveur
2380
+        )
2381
+    ) {
2382
+        $queries[] = $q;
2383
+    }
2384
+
2385
+
2386
+    // 2) y copier les champs qui vont bien
2387
+    $champs_dest = implode(', ', array_keys($fields_correspondances));
2388
+    $champs_ori = implode(', ', $fields_correspondances);
2389
+    $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2390
+
2391
+    // 3) supprimer la table d'origine
2392
+    $queries[] = "DROP TABLE $table_origine";
2393
+
2394
+    // 4) renommer la table temporaire
2395
+    // avec le nom de la table destination
2396
+    // si necessaire
2397
+    if ($meme_table) {
2398
+        $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2399
+    }
2400
+
2401
+    // 5) remettre les index !
2402
+    foreach ($keys as $k => $v) {
2403
+        if ($k == 'PRIMARY KEY') {
2404
+        } else {
2405
+            // enlever KEY
2406
+            $k = substr($k, 4);
2407
+            $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2408
+        }
2409
+    }
2410
+
2411
+
2412
+    if ($queries !== []) {
2413
+        Sqlite::demarrer_transaction($serveur);
2414
+        // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2415
+        foreach ($queries as $q) {
2416
+            if (!Sqlite::executer_requete($q, $serveur)) {
2417
+                spip_logger('sqlite')->error('SQLite : ALTER TABLE table :'
2418
+                    . " Erreur a l'execution de la requete : $q");
2419
+                Sqlite::annuler_transaction($serveur);
2420
+
2421
+                return false;
2422
+            }
2423
+        }
2424
+        Sqlite::finir_transaction($serveur);
2425
+    }
2426
+
2427
+    return true;
2428 2428
 }
2429 2429
 
2430 2430
 
@@ -2434,61 +2434,61 @@  discard block
 block discarded – undo
2434 2434
  * @return array
2435 2435
  */
2436 2436
 function _sqlite_ref_fonctions() {
2437
-	$fonctions = [
2438
-		'alter' => 'spip_sqlite_alter',
2439
-		'count' => 'spip_sqlite_count',
2440
-		'countsel' => 'spip_sqlite_countsel',
2441
-		'create' => 'spip_sqlite_create',
2442
-		'create_base' => 'spip_sqlite_create_base',
2443
-		'create_view' => 'spip_sqlite_create_view',
2444
-		'date_proche' => 'spip_sqlite_date_proche',
2445
-		'delete' => 'spip_sqlite_delete',
2446
-		'drop_table' => 'spip_sqlite_drop_table',
2447
-		'drop_view' => 'spip_sqlite_drop_view',
2448
-		'errno' => 'spip_sqlite_errno',
2449
-		'error' => 'spip_sqlite_error',
2450
-		'explain' => 'spip_sqlite_explain',
2451
-		'fetch' => 'spip_sqlite_fetch',
2452
-		'seek' => 'spip_sqlite_seek',
2453
-		'free' => 'spip_sqlite_free',
2454
-		'hex' => 'spip_sqlite_hex',
2455
-		'in' => 'spip_sqlite_in',
2456
-		'insert' => 'spip_sqlite_insert',
2457
-		'insertq' => 'spip_sqlite_insertq',
2458
-		'insertq_multi' => 'spip_sqlite_insertq_multi',
2459
-		'listdbs' => 'spip_sqlite_listdbs',
2460
-		'multi' => 'spip_sqlite_multi',
2461
-		'optimize' => 'spip_sqlite_optimize',
2462
-		'query' => 'spip_sqlite_query',
2463
-		'quote' => 'spip_sqlite_quote',
2464
-		'repair' => 'spip_sqlite_repair',
2465
-		'replace' => 'spip_sqlite_replace',
2466
-		'replace_multi' => 'spip_sqlite_replace_multi',
2467
-		'select' => 'spip_sqlite_select',
2468
-		'selectdb' => 'spip_sqlite_selectdb',
2469
-		'set_charset' => 'spip_sqlite_set_charset',
2470
-		'get_charset' => 'spip_sqlite_get_charset',
2471
-		'showbase' => 'spip_sqlite_showbase',
2472
-		'showtable' => 'spip_sqlite_showtable',
2473
-		'table_exists' => 'spip_sqlite_table_exists',
2474
-		'update' => 'spip_sqlite_update',
2475
-		'updateq' => 'spip_sqlite_updateq',
2476
-		'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2477
-		'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2478
-		'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2479
-	];
2480
-
2481
-	// association de chaque nom http d'un charset aux couples sqlite
2482
-	// SQLite supporte utf-8 et utf-16 uniquement.
2483
-	$charsets = [
2484
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2485
-		//'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2486
-		//'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2487
-	];
2488
-
2489
-	$fonctions['charsets'] = $charsets;
2490
-
2491
-	return $fonctions;
2437
+    $fonctions = [
2438
+        'alter' => 'spip_sqlite_alter',
2439
+        'count' => 'spip_sqlite_count',
2440
+        'countsel' => 'spip_sqlite_countsel',
2441
+        'create' => 'spip_sqlite_create',
2442
+        'create_base' => 'spip_sqlite_create_base',
2443
+        'create_view' => 'spip_sqlite_create_view',
2444
+        'date_proche' => 'spip_sqlite_date_proche',
2445
+        'delete' => 'spip_sqlite_delete',
2446
+        'drop_table' => 'spip_sqlite_drop_table',
2447
+        'drop_view' => 'spip_sqlite_drop_view',
2448
+        'errno' => 'spip_sqlite_errno',
2449
+        'error' => 'spip_sqlite_error',
2450
+        'explain' => 'spip_sqlite_explain',
2451
+        'fetch' => 'spip_sqlite_fetch',
2452
+        'seek' => 'spip_sqlite_seek',
2453
+        'free' => 'spip_sqlite_free',
2454
+        'hex' => 'spip_sqlite_hex',
2455
+        'in' => 'spip_sqlite_in',
2456
+        'insert' => 'spip_sqlite_insert',
2457
+        'insertq' => 'spip_sqlite_insertq',
2458
+        'insertq_multi' => 'spip_sqlite_insertq_multi',
2459
+        'listdbs' => 'spip_sqlite_listdbs',
2460
+        'multi' => 'spip_sqlite_multi',
2461
+        'optimize' => 'spip_sqlite_optimize',
2462
+        'query' => 'spip_sqlite_query',
2463
+        'quote' => 'spip_sqlite_quote',
2464
+        'repair' => 'spip_sqlite_repair',
2465
+        'replace' => 'spip_sqlite_replace',
2466
+        'replace_multi' => 'spip_sqlite_replace_multi',
2467
+        'select' => 'spip_sqlite_select',
2468
+        'selectdb' => 'spip_sqlite_selectdb',
2469
+        'set_charset' => 'spip_sqlite_set_charset',
2470
+        'get_charset' => 'spip_sqlite_get_charset',
2471
+        'showbase' => 'spip_sqlite_showbase',
2472
+        'showtable' => 'spip_sqlite_showtable',
2473
+        'table_exists' => 'spip_sqlite_table_exists',
2474
+        'update' => 'spip_sqlite_update',
2475
+        'updateq' => 'spip_sqlite_updateq',
2476
+        'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2477
+        'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2478
+        'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2479
+    ];
2480
+
2481
+    // association de chaque nom http d'un charset aux couples sqlite
2482
+    // SQLite supporte utf-8 et utf-16 uniquement.
2483
+    $charsets = [
2484
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2485
+        //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2486
+        //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2487
+    ];
2488
+
2489
+    $fonctions['charsets'] = $charsets;
2490
+
2491
+    return $fonctions;
2492 2492
 }
2493 2493
 
2494 2494
 
@@ -2500,56 +2500,56 @@  discard block
 block discarded – undo
2500 2500
  * @return mixed
2501 2501
  */
2502 2502
 function _sqlite_remplacements_definitions_table($query, $autoinc = false) {
2503
-	// quelques remplacements
2504
-	$num = '(\s*\([0-9]*\))?';
2505
-	$enum = '(\s*\([^\)]*\))?';
2506
-
2507
-	$remplace = [
2508
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2509
-		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2510
-		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2511
-		'/auto_increment/is' => '',
2512
-		'/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2513
-		'/(timestamp .* )ON .*$/is' => '\\1',
2514
-		'/character set \w+/is' => '',
2515
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2516
-		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2517
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2518
-		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2519
-		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2520
-	];
2521
-
2522
-	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2523
-	$remplace_autocinc = [
2524
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2525
-	];
2526
-	// pour les int non autoincrement, il faut un DEFAULT
2527
-	$remplace_nonautocinc = [
2528
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2529
-	];
2530
-
2531
-	if (is_string($query)) {
2532
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
2533
-		if ($autoinc || preg_match(',AUTO_INCREMENT,is', $query)) {
2534
-			$query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2535
-		} else {
2536
-			$query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2537
-			$query = _sqlite_collate_ci($query);
2538
-		}
2539
-	} elseif (is_array($query)) {
2540
-		foreach ($query as $k => $q) {
2541
-			$ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', (string) $q));
2542
-			$query[$k] = preg_replace(array_keys($remplace), $remplace, (string) $query[$k]);
2543
-			if ($ai) {
2544
-				$query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2545
-			} else {
2546
-				$query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2547
-				$query[$k] = _sqlite_collate_ci($query[$k]);
2548
-			}
2549
-		}
2550
-	}
2551
-
2552
-	return $query;
2503
+    // quelques remplacements
2504
+    $num = '(\s*\([0-9]*\))?';
2505
+    $enum = '(\s*\([^\)]*\))?';
2506
+
2507
+    $remplace = [
2508
+        '/enum' . $enum . '/is' => 'VARCHAR(255)',
2509
+        '/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2510
+        '/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2511
+        '/auto_increment/is' => '',
2512
+        '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2513
+        '/(timestamp .* )ON .*$/is' => '\\1',
2514
+        '/character set \w+/is' => '',
2515
+        '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2516
+        '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2517
+        '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2518
+        '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2519
+        '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2520
+    ];
2521
+
2522
+    // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2523
+    $remplace_autocinc = [
2524
+        '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2525
+    ];
2526
+    // pour les int non autoincrement, il faut un DEFAULT
2527
+    $remplace_nonautocinc = [
2528
+        '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2529
+    ];
2530
+
2531
+    if (is_string($query)) {
2532
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
2533
+        if ($autoinc || preg_match(',AUTO_INCREMENT,is', $query)) {
2534
+            $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2535
+        } else {
2536
+            $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2537
+            $query = _sqlite_collate_ci($query);
2538
+        }
2539
+    } elseif (is_array($query)) {
2540
+        foreach ($query as $k => $q) {
2541
+            $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', (string) $q));
2542
+            $query[$k] = preg_replace(array_keys($remplace), $remplace, (string) $query[$k]);
2543
+            if ($ai) {
2544
+                $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2545
+            } else {
2546
+                $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2547
+                $query[$k] = _sqlite_collate_ci($query[$k]);
2548
+            }
2549
+        }
2550
+    }
2551
+
2552
+    return $query;
2553 2553
 }
2554 2554
 
2555 2555
 /**
@@ -2560,17 +2560,17 @@  discard block
 block discarded – undo
2560 2560
  * @return string
2561 2561
  */
2562 2562
 function _sqlite_collate_ci($champ) {
2563
-	if (stripos($champ, 'COLLATE') !== false) {
2564
-		return $champ;
2565
-	}
2566
-	if (stripos($champ, 'BINARY') !== false) {
2567
-		return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2568
-	}
2569
-	if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2570
-		return $champ . ' COLLATE NOCASE';
2571
-	}
2572
-
2573
-	return $champ;
2563
+    if (stripos($champ, 'COLLATE') !== false) {
2564
+        return $champ;
2565
+    }
2566
+    if (stripos($champ, 'BINARY') !== false) {
2567
+        return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2568
+    }
2569
+    if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2570
+        return $champ . ' COLLATE NOCASE';
2571
+    }
2572
+
2573
+    return $champ;
2574 2574
 }
2575 2575
 
2576 2576
 
@@ -2589,83 +2589,83 @@  discard block
 block discarded – undo
2589 2589
  * @return bool|string
2590 2590
  */
2591 2591
 function _sqlite_requete_create(
2592
-	$nom,
2593
-	$champs,
2594
-	$cles,
2595
-	$autoinc = false,
2596
-	$temporary = false,
2597
-	$_ifnotexists = true,
2598
-	$serveur = '',
2599
-	$requeter = true
2592
+    $nom,
2593
+    $champs,
2594
+    $cles,
2595
+    $autoinc = false,
2596
+    $temporary = false,
2597
+    $_ifnotexists = true,
2598
+    $serveur = '',
2599
+    $requeter = true
2600 2600
 ) {
2601
-	$query = $keys = $s = $p = '';
2602
-
2603
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
2604
-	// sans les renseigner (laisse le compilo recuperer la description)
2605
-	if (!is_array($champs) || !is_array($cles)) {
2606
-		return;
2607
-	}
2608
-
2609
-	// sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2610
-	// il faut passer par des create index
2611
-	// Il gere par contre primary key !
2612
-	// Soit la PK est definie dans les cles, soit dans un champs
2613
-	// soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2614
-	$pk = 'PRIMARY KEY';
2615
-	// le champ de cle primaire
2616
-	$champ_pk = empty($cles[$pk]) ? '' : $cles[$pk];
2617
-
2618
-	foreach ($champs as $k => $v) {
2619
-		if (false !== stripos((string) $v, $pk)) {
2620
-			$champ_pk = $k;
2621
-			// on n'en a plus besoin dans field, vu que defini dans key
2622
-			$champs[$k] = preg_replace("/$pk/is", '', (string) $champs[$k]);
2623
-			break;
2624
-		}
2625
-	}
2626
-
2627
-	if ($champ_pk) {
2628
-		$keys = "\n\t\t$pk ($champ_pk)";
2629
-	}
2630
-	// Pas de DEFAULT 0 sur les cles primaires en auto-increment
2631
-	if (
2632
-		isset($champs[$champ_pk])
2633
-		&& stripos((string) $champs[$champ_pk], 'default 0') !== false
2634
-	) {
2635
-		$champs[$champ_pk] = trim(str_ireplace('default 0', '', (string) $champs[$champ_pk]));
2636
-	}
2637
-
2638
-	$champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2639
-	foreach ($champs as $k => $v) {
2640
-		$query .= "$s\n\t\t$k $v";
2641
-		$s = ',';
2642
-	}
2643
-
2644
-	$ifnotexists = '';
2645
-	if ($_ifnotexists) {
2646
-		$version = spip_sqlite_fetch(
2647
-			spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2648
-			'',
2649
-			$serveur
2650
-		);
2651
-		if (!function_exists('spip_version_compare')) {
2652
-			include_spip('plugins/installer');
2653
-		}
2654
-
2655
-		if ($version && spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2656
-			$ifnotexists = ' IF NOT EXISTS';
2657
-		} else {
2658
-			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2659
-			$a = spip_sqlite_showtable($nom, $serveur);
2660
-			if (isset($a['key']['KEY ' . $nom])) {
2661
-				return true;
2662
-			}
2663
-		}
2664
-	}
2665
-
2666
-	$temporary = $temporary ? ' TEMPORARY' : '';
2667
-
2668
-	return "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2601
+    $query = $keys = $s = $p = '';
2602
+
2603
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
2604
+    // sans les renseigner (laisse le compilo recuperer la description)
2605
+    if (!is_array($champs) || !is_array($cles)) {
2606
+        return;
2607
+    }
2608
+
2609
+    // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2610
+    // il faut passer par des create index
2611
+    // Il gere par contre primary key !
2612
+    // Soit la PK est definie dans les cles, soit dans un champs
2613
+    // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2614
+    $pk = 'PRIMARY KEY';
2615
+    // le champ de cle primaire
2616
+    $champ_pk = empty($cles[$pk]) ? '' : $cles[$pk];
2617
+
2618
+    foreach ($champs as $k => $v) {
2619
+        if (false !== stripos((string) $v, $pk)) {
2620
+            $champ_pk = $k;
2621
+            // on n'en a plus besoin dans field, vu que defini dans key
2622
+            $champs[$k] = preg_replace("/$pk/is", '', (string) $champs[$k]);
2623
+            break;
2624
+        }
2625
+    }
2626
+
2627
+    if ($champ_pk) {
2628
+        $keys = "\n\t\t$pk ($champ_pk)";
2629
+    }
2630
+    // Pas de DEFAULT 0 sur les cles primaires en auto-increment
2631
+    if (
2632
+        isset($champs[$champ_pk])
2633
+        && stripos((string) $champs[$champ_pk], 'default 0') !== false
2634
+    ) {
2635
+        $champs[$champ_pk] = trim(str_ireplace('default 0', '', (string) $champs[$champ_pk]));
2636
+    }
2637
+
2638
+    $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2639
+    foreach ($champs as $k => $v) {
2640
+        $query .= "$s\n\t\t$k $v";
2641
+        $s = ',';
2642
+    }
2643
+
2644
+    $ifnotexists = '';
2645
+    if ($_ifnotexists) {
2646
+        $version = spip_sqlite_fetch(
2647
+            spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2648
+            '',
2649
+            $serveur
2650
+        );
2651
+        if (!function_exists('spip_version_compare')) {
2652
+            include_spip('plugins/installer');
2653
+        }
2654
+
2655
+        if ($version && spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2656
+            $ifnotexists = ' IF NOT EXISTS';
2657
+        } else {
2658
+            /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2659
+            $a = spip_sqlite_showtable($nom, $serveur);
2660
+            if (isset($a['key']['KEY ' . $nom])) {
2661
+                return true;
2662
+            }
2663
+        }
2664
+    }
2665
+
2666
+    $temporary = $temporary ? ' TEMPORARY' : '';
2667
+
2668
+    return "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2669 2669
 }
2670 2670
 
2671 2671
 
@@ -2684,40 +2684,40 @@  discard block
 block discarded – undo
2684 2684
  * @return
2685 2685
  */
2686 2686
 function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') {
2687
-	static $tables = [];
2688
-
2689
-	if (!isset($tables[$table])) {
2690
-		if (!$desc) {
2691
-			$trouver_table = charger_fonction('trouver_table', 'base');
2692
-			$desc = $trouver_table($table, $serveur);
2693
-			// si pas de description, on ne fait rien, ou on die() ?
2694
-			if (!$desc) {
2695
-				return $couples;
2696
-			}
2697
-		}
2698
-
2699
-		// recherche des champs avec simplement 'TIMESTAMP'
2700
-		// cependant, il faudra peut etre etendre
2701
-		// avec la gestion de DEFAULT et ON UPDATE
2702
-		// mais ceux-ci ne sont pas utilises dans le core
2703
-		$tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2704
-
2705
-		$now = _sqlite_func_now(true);
2706
-		foreach ($desc['field'] as $k => $v) {
2707
-			if (str_starts_with(strtolower(ltrim((string) $v)), 'timestamp')) {
2708
-				$tables[$table]['desc'][$k] = $v;
2709
-				$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2710
-			}
2711
-		}
2712
-	} else {
2713
-		$now = _sqlite_func_now(true);
2714
-		foreach (array_keys($tables[$table]['desc']) as $k) {
2715
-			$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2716
-		}
2717
-	}
2718
-
2719
-	// ajout des champs type 'timestamp' absents
2720
-	return array_merge($tables[$table]['valeur'], $couples);
2687
+    static $tables = [];
2688
+
2689
+    if (!isset($tables[$table])) {
2690
+        if (!$desc) {
2691
+            $trouver_table = charger_fonction('trouver_table', 'base');
2692
+            $desc = $trouver_table($table, $serveur);
2693
+            // si pas de description, on ne fait rien, ou on die() ?
2694
+            if (!$desc) {
2695
+                return $couples;
2696
+            }
2697
+        }
2698
+
2699
+        // recherche des champs avec simplement 'TIMESTAMP'
2700
+        // cependant, il faudra peut etre etendre
2701
+        // avec la gestion de DEFAULT et ON UPDATE
2702
+        // mais ceux-ci ne sont pas utilises dans le core
2703
+        $tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2704
+
2705
+        $now = _sqlite_func_now(true);
2706
+        foreach ($desc['field'] as $k => $v) {
2707
+            if (str_starts_with(strtolower(ltrim((string) $v)), 'timestamp')) {
2708
+                $tables[$table]['desc'][$k] = $v;
2709
+                $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2710
+            }
2711
+        }
2712
+    } else {
2713
+        $now = _sqlite_func_now(true);
2714
+        foreach (array_keys($tables[$table]['desc']) as $k) {
2715
+            $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2716
+        }
2717
+    }
2718
+
2719
+    // ajout des champs type 'timestamp' absents
2720
+    return array_merge($tables[$table]['valeur'], $couples);
2721 2721
 }
2722 2722
 
2723 2723
 
@@ -2728,5 +2728,5 @@  discard block
 block discarded – undo
2728 2728
  * @return array|bool
2729 2729
  */
2730 2730
 function spip_versions_sqlite() {
2731
-	return _sqlite_charger_version();
2731
+    return _sqlite_charger_version();
2732 2732
 }
Please login to merge, or discard this patch.
Spacing   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -65,13 +65,13 @@  discard block
 block discarded – undo
65 65
 	// determiner le dossier de la base : $addr ou _DIR_DB
66 66
 	$f = _DIR_DB;
67 67
 	if ($addr && str_contains($addr, '/')) {
68
-		$f = rtrim($addr, '/') . '/';
68
+		$f = rtrim($addr, '/').'/';
69 69
 	}
70 70
 
71 71
 	$logger = spip_logger('sqlite');
72 72
 	// un nom de base demande et impossible d'obtenir la base, on s'en va :
73 73
 	// il faut que la base existe ou que le repertoire parent soit writable
74
-	if ($db && !is_file($f .= $db . '.sqlite') && !is_writable(dirname($f))) {
74
+	if ($db && !is_file($f .= $db.'.sqlite') && !is_writable(dirname($f))) {
75 75
 		$logger->emergency("base $f non trouvee ou droits en ecriture manquants");
76 76
 
77 77
 		return false;
@@ -86,15 +86,15 @@  discard block
 block discarded – undo
86 86
 
87 87
 	// chargement des constantes
88 88
 	// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
89
-	$define = 'spip_sqlite' . $sqlite_version . '_constantes';
89
+	$define = 'spip_sqlite'.$sqlite_version.'_constantes';
90 90
 	$define();
91 91
 
92 92
 	if (!$db) {
93 93
 		// si pas de db ->
94 94
 		// base temporaire tant qu'on ne connait pas son vrai nom
95 95
 		// pour tester la connexion
96
-		$db = '_sqlite' . $sqlite_version . '_install';
97
-		$tmp = _DIR_DB . $db . '.sqlite';
96
+		$db = '_sqlite'.$sqlite_version.'_install';
97
+		$tmp = _DIR_DB.$db.'.sqlite';
98 98
 		$link = spip_sqlite_open($tmp);
99 99
 	} else {
100 100
 		// Ouvrir (eventuellement creer la base)
@@ -217,7 +217,7 @@  discard block
 block discarded – undo
217 217
 	$i = 0;
218 218
 	$ouverte = false;
219 219
 	while ($do = array_shift($todo)) {
220
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
220
+		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i].','.$do : $do;
221 221
 		$o = (str_contains($do, '('));
222 222
 		$f = (str_contains($do, ')'));
223 223
 		if ($o && !$f) {
@@ -338,7 +338,7 @@  discard block
 block discarded – undo
338 338
 
339 339
 				// pas geres en sqlite2
340 340
 			case 'RENAME':
341
-				$do = 'RENAME TO' . substr($do, 6);
341
+				$do = 'RENAME TO'.substr($do, 6);
342 342
 			case 'RENAME TO':
343 343
 				if (!Sqlite::executer_requete("$debut $do", $serveur)) {
344 344
 					$logger->error("SQLite : Erreur ALTER TABLE / RENAME : $query");
@@ -399,7 +399,7 @@  discard block
 block discarded – undo
399 399
 
400 400
 				// pas geres en sqlite2
401 401
 			case 'ADD COLUMN':
402
-				$do = 'ADD' . substr($do, 10);
402
+				$do = 'ADD'.substr($do, 10);
403 403
 			case 'ADD':
404 404
 			default:
405 405
 				if (!preg_match(',primary\s+key,i', $do)) {
@@ -503,9 +503,9 @@  discard block
 block discarded – undo
503 503
  * @return bool true si la base est créee.
504 504
  **/
505 505
 function spip_sqlite_create_base($nom, $serveur = '', $option = true) {
506
-	$f = $nom . '.sqlite';
506
+	$f = $nom.'.sqlite';
507 507
 	if (!str_contains($nom, '/')) {
508
-		$f = _DIR_DB . $f;
508
+		$f = _DIR_DB.$f;
509 509
 	}
510 510
 
511 511
 	$ok = new \PDO("sqlite:$f");
@@ -550,7 +550,7 @@  discard block
 block discarded – undo
550 550
 		return false;
551 551
 	}
552 552
 
553
-	$query = "CREATE VIEW $nom AS " . $query_select;
553
+	$query = "CREATE VIEW $nom AS ".$query_select;
554 554
 
555 555
 	return spip_sqlite_query($query, $serveur, $requeter);
556 556
 }
@@ -576,7 +576,7 @@  discard block
 block discarded – undo
576 576
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) {
577 577
 	if (!($nom || $table || $champs)) {
578 578
 		spip_logger('sqlite')->error(
579
-			"Champ manquant pour creer un index sqlite ($nom, $table, (" . implode(',', $champs) . '))',
579
+			"Champ manquant pour creer un index sqlite ($nom, $table, (".implode(',', $champs).'))',
580 580
 		);
581 581
 
582 582
 		return false;
@@ -584,7 +584,7 @@  discard block
 block discarded – undo
584 584
 
585 585
 	// SQLite ne differentie pas noms des index en fonction des tables
586 586
 	// il faut donc creer des noms uniques d'index pour une base sqlite
587
-	$nom = $table . '_' . $nom;
587
+	$nom = $table.'_'.$nom;
588 588
 	// enlever d'eventuelles parentheses deja presentes sur champs
589 589
 	if (!is_array($champs)) {
590 590
 		if ($champs[0] == '(') {
@@ -606,12 +606,12 @@  discard block
 block discarded – undo
606 606
 	} else {
607 607
 		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
608 608
 		$a = spip_sqlite_showtable($table, $serveur);
609
-		if (isset($a['key']['KEY ' . $nom])) {
609
+		if (isset($a['key']['KEY '.$nom])) {
610 610
 			return true;
611 611
 		}
612 612
 	}
613 613
 
614
-	$query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . implode(',', $champs) . ')';
614
+	$query = 'CREATE '.($unique ? 'UNIQUE ' : '')."INDEX$ifnotexists $nom ON $table (".implode(',', $champs).')';
615 615
 	$res = spip_sqlite_query($query, $serveur, $requeter);
616 616
 	if (!$requeter) {
617 617
 		return $res;
@@ -679,7 +679,7 @@  discard block
 block discarded – undo
679 679
 	$serveur = '',
680 680
 	$requeter = true
681 681
 ) {
682
-	$c = $groupby ? 'DISTINCT ' . (is_string($groupby) ? $groupby : implode(',', $groupby)) : ('*');
682
+	$c = $groupby ? 'DISTINCT '.(is_string($groupby) ? $groupby : implode(',', $groupby)) : ('*');
683 683
 	$r = spip_sqlite_select(
684 684
 		"COUNT($c)",
685 685
 		$from,
@@ -792,7 +792,7 @@  discard block
 block discarded – undo
792 792
 
793 793
 	// SQLite ne differentie pas noms des index en fonction des tables
794 794
 	// il faut donc creer des noms uniques d'index pour une base sqlite
795
-	$index = $table . '_' . $nom;
795
+	$index = $table.'_'.$nom;
796 796
 	$exist = ' IF EXISTS';
797 797
 
798 798
 	$query = "DROP INDEX$exist $index";
@@ -824,7 +824,7 @@  discard block
 block discarded – undo
824 824
 	if ($s) {
825 825
 		$trace = debug_backtrace();
826 826
 		if ($trace[0]['function'] != 'spip_sqlite_error') {
827
-			spip_logger('sqlite')->error("$s - $query - " . sql_error_backtrace());
827
+			spip_logger('sqlite')->error("$s - $query - ".sql_error_backtrace());
828 828
 		}
829 829
 	}
830 830
 
@@ -871,7 +871,7 @@  discard block
 block discarded – undo
871 871
 		$t = $link->errorInfo();
872 872
 		$s = ltrim((string) $t[0], '0'); // 00000 si pas d'erreur
873 873
 		if ($s) {
874
-			$s .= ' / ' . $t[1];
874
+			$s .= ' / '.$t[1];
875 875
 		} // ajoute l'erreur du moteur SQLite
876 876
 	} else {
877 877
 		$s = ': aucune ressource sqlite (link)';
@@ -902,7 +902,7 @@  discard block
 block discarded – undo
902 902
 	}
903 903
 
904 904
 	$query = Sqlite::traduire_requete($query, $serveur);
905
-	$query = 'EXPLAIN ' . $query;
905
+	$query = 'EXPLAIN '.$query;
906 906
 	if (!$requeter) {
907 907
 		return $query;
908 908
 	}
@@ -1071,7 +1071,7 @@  discard block
 block discarded – undo
1071 1071
  **/
1072 1072
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1073 1073
 
1074
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1074
+	$query = "INSERT INTO $table ".($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1075 1075
 	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1076 1076
 		if (!$requeter) {
1077 1077
 			return $r;
@@ -1126,8 +1126,8 @@  discard block
 block discarded – undo
1126 1126
 
1127 1127
 	$cles = $valeurs = '';
1128 1128
 	if (is_countable($couples) ? count($couples) : 0) {
1129
-		$cles = '(' . implode(',', array_keys($couples)) . ')';
1130
-		$valeurs = '(' . implode(',', $couples) . ')';
1129
+		$cles = '('.implode(',', array_keys($couples)).')';
1130
+		$valeurs = '('.implode(',', $couples).')';
1131 1131
 	}
1132 1132
 
1133 1133
 	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
@@ -1189,11 +1189,11 @@  discard block
 block discarded – undo
1189 1189
 
1190 1190
 		$champs = $valeurs = '';
1191 1191
 		if ($couples !== []) {
1192
-			$champs = '(' . implode(',', array_keys($couples)) . ')';
1193
-			$valeurs = '(' . implode(',', $couples) . ')';
1194
-			$query = $query_start . "$champs VALUES $valeurs";
1192
+			$champs = '('.implode(',', array_keys($couples)).')';
1193
+			$valeurs = '('.implode(',', $couples).')';
1194
+			$query = $query_start."$champs VALUES $valeurs";
1195 1195
 		} else {
1196
-			$query = $query_start . 'DEFAULT VALUES';
1196
+			$query = $query_start.'DEFAULT VALUES';
1197 1197
 		}
1198 1198
 
1199 1199
 		if ($requeter) {
@@ -1325,7 +1325,7 @@  discard block
 block discarded – undo
1325 1325
  * @return string       texte de sélection pour la requête
1326 1326
  */
1327 1327
 function spip_sqlite_multi($objet, $lang) {
1328
-	return 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1328
+	return 'EXTRAIRE_MULTI('.$objet.", '".$lang."') AS multi";
1329 1329
 }
1330 1330
 
1331 1331
 
@@ -1394,7 +1394,7 @@  discard block
 block discarded – undo
1394 1394
 function spip_sqlite_date_proche($champ, $interval, $unite) {
1395 1395
 	$op = (($interval <= 0) ? '>' : '<');
1396 1396
 
1397
-	return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1397
+	return "($champ $op datetime('".date('Y-m-d H:i:s')."', '$interval $unite'))";
1398 1398
 }
1399 1399
 
1400 1400
 
@@ -1498,10 +1498,10 @@  discard block
 block discarded – undo
1498 1498
 	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1499 1499
 	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1500 1500
 
1501
-	return spip_sqlite_query("REPLACE INTO $table (" . implode(',', array_keys($couples)) . ') VALUES (' . implode(
1501
+	return spip_sqlite_query("REPLACE INTO $table (".implode(',', array_keys($couples)).') VALUES ('.implode(
1502 1502
 		',',
1503 1503
 		$couples
1504
-	) . ')', $serveur);
1504
+	).')', $serveur);
1505 1505
 }
1506 1506
 
1507 1507
 
@@ -1588,7 +1588,7 @@  discard block
 block discarded – undo
1588 1588
 		. _sqlite_calculer_expression('WHERE', $where)
1589 1589
 		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1590 1590
 		. _sqlite_calculer_expression('HAVING', $having)
1591
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1591
+		. ($orderby ? ("\nORDER BY "._sqlite_calculer_order($orderby)) : '')
1592 1592
 		. ($limit ? "\nLIMIT $limit" : '');
1593 1593
 
1594 1594
 	// dans un select, on doit renvoyer la requête en cas d'erreur
@@ -1626,7 +1626,7 @@  discard block
 block discarded – undo
1626 1626
 	// interdire la creation d'une nouvelle base,
1627 1627
 	// sauf si on est dans l'installation
1628 1628
 	if (
1629
-		!is_file($f = _DIR_DB . $db . '.sqlite')
1629
+		!is_file($f = _DIR_DB.$db.'.sqlite')
1630 1630
 		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1631 1631
 	) {
1632 1632
 		spip_logger('sqlite')->emergency("Il est interdit de creer la base $db",);
@@ -1638,7 +1638,7 @@  discard block
 block discarded – undo
1638 1638
 	// avec les identifiants connus
1639 1639
 	$index = $serveur ?: 0;
1640 1640
 
1641
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1641
+	if ($link = spip_connect_db('', '', '', '', '@selectdb@'.$db, $serveur, '', '')) {
1642 1642
 		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1643 1643
 			return $db;
1644 1644
 		}
@@ -1694,7 +1694,7 @@  discard block
 block discarded – undo
1694 1694
 	$match = "^$match$";
1695 1695
 
1696 1696
 	return spip_sqlite_query(
1697
-		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1697
+		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP "._q($match),
1698 1698
 		$serveur,
1699 1699
 		$requeter
1700 1700
 	);
@@ -1718,7 +1718,7 @@  discard block
 block discarded – undo
1718 1718
 	$r = spip_sqlite_query(
1719 1719
 		'SELECT name FROM sqlite_master WHERE'
1720 1720
 			. ' type=\'table\''
1721
-			. ' AND name=' . spip_sqlite_quote($table, 'string')
1721
+			. ' AND name='.spip_sqlite_quote($table, 'string')
1722 1722
 			. ' AND name NOT LIKE \'sqlite_%\'',
1723 1723
 		$serveur,
1724 1724
 		$requeter
@@ -1815,7 +1815,7 @@  discard block
 block discarded – undo
1815 1815
 				// s'il y a une parenthèse fermante dans la clé
1816 1816
 				// ou dans la définition sans qu'il n'y ait une ouverture avant
1817 1817
 				if (str_contains($k, ')') || preg_match('/^[^\(]*\)/', (string) $def)) {
1818
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1818
+					$fields[$k_precedent] .= ','.$k.' '.$def;
1819 1819
 					continue;
1820 1820
 				}
1821 1821
 
@@ -1850,13 +1850,13 @@  discard block
 block discarded – undo
1850 1850
 				. 'ORDER BY substr(type,2,1), name';
1851 1851
 			$a = spip_sqlite_query($query, $serveur, $requeter);
1852 1852
 			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1853
-				$key = str_replace($nom_table . '_', '', (string) $r['name']); // enlever le nom de la table ajoute a l'index
1853
+				$key = str_replace($nom_table.'_', '', (string) $r['name']); // enlever le nom de la table ajoute a l'index
1854 1854
 				$keytype = 'KEY';
1855 1855
 				if (str_contains((string) $r['sql'], 'UNIQUE INDEX')) {
1856 1856
 					$keytype = 'UNIQUE KEY';
1857 1857
 				}
1858 1858
 				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', (string) $r['sql']);
1859
-				$keys[$keytype . ' ' . $key] = $colonnes;
1859
+				$keys[$keytype.' '.$key] = $colonnes;
1860 1860
 			}
1861 1861
 		}
1862 1862
 	} // c'est une vue, on liste les champs disponibles simplement
@@ -1903,7 +1903,7 @@  discard block
 block discarded – undo
1903 1903
 
1904 1904
 	$set = [];
1905 1905
 	foreach ($champs as $champ => $val) {
1906
-		$set[] = $champ . "=$val";
1906
+		$set[] = $champ."=$val";
1907 1907
 	}
1908 1908
 	if ($set !== []) {
1909 1909
 		return spip_sqlite_query(
@@ -1958,7 +1958,7 @@  discard block
 block discarded – undo
1958 1958
 
1959 1959
 	$set = [];
1960 1960
 	foreach ($champs as $champ => $val) {
1961
-		$set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, $fields[$champ] ?? '');
1961
+		$set[$champ] = $champ.'='._sqlite_calculer_cite($val, $fields[$champ] ?? '');
1962 1962
 	}
1963 1963
 
1964 1964
 	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
@@ -1966,7 +1966,7 @@  discard block
 block discarded – undo
1966 1966
 	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1967 1967
 	foreach ($maj as $champ => $val) {
1968 1968
 		if (!isset($set[$champ])) {
1969
-			$set[$champ] = $champ . '=' . $val;
1969
+			$set[$champ] = $champ.'='.$val;
1970 1970
 		}
1971 1971
 	}
1972 1972
 
@@ -1995,7 +1995,7 @@  discard block
 block discarded – undo
1995 1995
  */
1996 1996
 function _sqlite_init() {
1997 1997
 	if (!defined('_DIR_DB')) {
1998
-		define('_DIR_DB', _DIR_ETC . 'bases/');
1998
+		define('_DIR_DB', _DIR_ETC.'bases/');
1999 1999
 	}
2000 2000
 	if (!defined('_SQLITE_CHMOD')) {
2001 2001
 		define('_SQLITE_CHMOD', _SPIP_CHMOD);
@@ -2103,7 +2103,7 @@  discard block
 block discarded – undo
2103 2103
 	// echapper les ' en ''
2104 2104
 	spip_logger('sqlite')->notice('Pas de methode ->quote pour echapper');
2105 2105
 
2106
-	return ("'" . str_replace("'", "''", $v) . "'");
2106
+	return ("'".str_replace("'", "''", $v)."'");
2107 2107
 }
2108 2108
 
2109 2109
 
@@ -2126,12 +2126,12 @@  discard block
 block discarded – undo
2126 2126
 	$exp = "\n$expression ";
2127 2127
 
2128 2128
 	if (!is_array($v)) {
2129
-		return $exp . $v;
2129
+		return $exp.$v;
2130 2130
 	} else {
2131 2131
 		if (strtoupper($join) === 'AND') {
2132
-			return $exp . implode("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2132
+			return $exp.implode("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2133 2133
 		} else {
2134
-			return $exp . implode($join, $v);
2134
+			return $exp.implode($join, $v);
2135 2135
 		}
2136 2136
 	}
2137 2137
 }
@@ -2165,17 +2165,17 @@  discard block
 block discarded – undo
2165 2165
 		if (str_ends_with($k, '@')) {
2166 2166
 			// c'est une jointure qui se refere au from precedent
2167 2167
 			// pas de virgule
2168
-			$res .= '  ' . $v;
2168
+			$res .= '  '.$v;
2169 2169
 		} else {
2170 2170
 			if (!is_numeric($k)) {
2171 2171
 				$p = strpos((string) $v, ' ');
2172 2172
 				if ($p) {
2173
-					$v = substr((string) $v, 0, $p) . " AS '$k'" . substr((string) $v, $p);
2173
+					$v = substr((string) $v, 0, $p)." AS '$k'".substr((string) $v, $p);
2174 2174
 				} else {
2175 2175
 					$v .= " AS '$k'";
2176 2176
 				}
2177 2177
 			}
2178
-			$res .= ', ' . $v;
2178
+			$res .= ', '.$v;
2179 2179
 		}
2180 2180
 	}
2181 2181
 
@@ -2317,7 +2317,7 @@  discard block
 block discarded – undo
2317 2317
 	}
2318 2318
 
2319 2319
 
2320
-	$table_tmp = $table_origine . '_tmp';
2320
+	$table_tmp = $table_origine.'_tmp';
2321 2321
 
2322 2322
 	// 1) creer une table temporaire avec les modifications
2323 2323
 	// - DROP : suppression de la colonne
@@ -2404,7 +2404,7 @@  discard block
 block discarded – undo
2404 2404
 		} else {
2405 2405
 			// enlever KEY
2406 2406
 			$k = substr($k, 4);
2407
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2407
+			$queries[] = "CREATE INDEX $table_destination"."_$k ON $table_destination ($v)";
2408 2408
 		}
2409 2409
 	}
2410 2410
 
@@ -2505,27 +2505,27 @@  discard block
 block discarded – undo
2505 2505
 	$enum = '(\s*\([^\)]*\))?';
2506 2506
 
2507 2507
 	$remplace = [
2508
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2508
+		'/enum'.$enum.'/is' => 'VARCHAR(255)',
2509 2509
 		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2510 2510
 		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2511 2511
 		'/auto_increment/is' => '',
2512 2512
 		'/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2513 2513
 		'/(timestamp .* )ON .*$/is' => '\\1',
2514 2514
 		'/character set \w+/is' => '',
2515
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2515
+		'/((big|small|medium|tiny)?int(eger)?)'.$num.'\s*unsigned/is' => '\\1 UNSIGNED',
2516 2516
 		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2517
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2517
+		'/((char|varchar)'.$num.'\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2518 2518
 		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2519 2519
 		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2520 2520
 	];
2521 2521
 
2522 2522
 	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2523 2523
 	$remplace_autocinc = [
2524
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2524
+		'/(big|small|medium|tiny)?int(eger)?'.$num.'/is' => 'INTEGER'
2525 2525
 	];
2526 2526
 	// pour les int non autoincrement, il faut un DEFAULT
2527 2527
 	$remplace_nonautocinc = [
2528
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2528
+		'/((big|small|medium|tiny)?int(eger)?'.$num.'\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2529 2529
 	];
2530 2530
 
2531 2531
 	if (is_string($query)) {
@@ -2567,7 +2567,7 @@  discard block
 block discarded – undo
2567 2567
 		return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2568 2568
 	}
2569 2569
 	if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2570
-		return $champ . ' COLLATE NOCASE';
2570
+		return $champ.' COLLATE NOCASE';
2571 2571
 	}
2572 2572
 
2573 2573
 	return $champ;
@@ -2657,7 +2657,7 @@  discard block
 block discarded – undo
2657 2657
 		} else {
2658 2658
 			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2659 2659
 			$a = spip_sqlite_showtable($nom, $serveur);
2660
-			if (isset($a['key']['KEY ' . $nom])) {
2660
+			if (isset($a['key']['KEY '.$nom])) {
2661 2661
 				return true;
2662 2662
 			}
2663 2663
 		}
@@ -2665,7 +2665,7 @@  discard block
 block discarded – undo
2665 2665
 
2666 2666
 	$temporary = $temporary ? ' TEMPORARY' : '';
2667 2667
 
2668
-	return "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2668
+	return "CREATE$temporary TABLE$ifnotexists $nom ($query".($keys ? ",$keys" : '').")\n";
2669 2669
 }
2670 2670
 
2671 2671
 
Please login to merge, or discard this patch.
ecrire/req/sqlite_fonctions.php 2 patches
Indentation   +201 added lines, -201 removed lines patch added patch discarded remove patch
@@ -23,7 +23,7 @@  discard block
 block discarded – undo
23 23
  */
24 24
 
25 25
 if (!defined('_ECRIRE_INC_VERSION')) {
26
-	return;
26
+    return;
27 27
 }
28 28
 
29 29
 /**
@@ -44,90 +44,90 @@  discard block
 block discarded – undo
44 44
  */
45 45
 function _sqlite_init_functions(&$sqlite) {
46 46
 
47
-	if (!$sqlite) {
48
-		return false;
49
-	}
47
+    if (!$sqlite) {
48
+        return false;
49
+    }
50 50
 
51 51
 
52
-	$fonctions = [
53
-		// A
54
-		'ACOS'  => ['acos', 1],
55
-		'ASIN'  => ['asin', 1],
56
-		'ATAN'  => ['atan', 1], // mysql accepte 2 params comme atan2… hum ?
57
-		'ATAN2' => ['atan2', 2],
52
+    $fonctions = [
53
+        // A
54
+        'ACOS'  => ['acos', 1],
55
+        'ASIN'  => ['asin', 1],
56
+        'ATAN'  => ['atan', 1], // mysql accepte 2 params comme atan2… hum ?
57
+        'ATAN2' => ['atan2', 2],
58 58
 
59
-		// C
60
-		'CEIL'   => ['_sqlite_func_ceil', 1],
61
-		'CONCAT' => ['_sqlite_func_concat', -1],
62
-		'COS'    => ['cos', 1],
59
+        // C
60
+        'CEIL'   => ['_sqlite_func_ceil', 1],
61
+        'CONCAT' => ['_sqlite_func_concat', -1],
62
+        'COS'    => ['cos', 1],
63 63
 
64
-		// D
65
-		'DATE_FORMAT' => ['_sqlite_func_date_format', 2], // équivalent a strftime avec args inversés
66
-		'DAYOFMONTH'  => ['_sqlite_func_dayofmonth', 1],
67
-		'DEGREES'     => ['rad2deg', 1],
64
+        // D
65
+        'DATE_FORMAT' => ['_sqlite_func_date_format', 2], // équivalent a strftime avec args inversés
66
+        'DAYOFMONTH'  => ['_sqlite_func_dayofmonth', 1],
67
+        'DEGREES'     => ['rad2deg', 1],
68 68
 
69
-		// E
70
-		'EXTRAIRE_MULTI' => ['_sqlite_func_extraire_multi', 2], // specifique a SPIP/sql_multi()
71
-		'EXP'            => ['exp', 1],
69
+        // E
70
+        'EXTRAIRE_MULTI' => ['_sqlite_func_extraire_multi', 2], // specifique a SPIP/sql_multi()
71
+        'EXP'            => ['exp', 1],
72 72
 
73
-		// F
74
-		'FIND_IN_SET' => ['_sqlite_func_find_in_set', 2],
75
-		'FLOOR'       => ['_sqlite_func_floor', 1],
73
+        // F
74
+        'FIND_IN_SET' => ['_sqlite_func_find_in_set', 2],
75
+        'FLOOR'       => ['_sqlite_func_floor', 1],
76 76
 
77
-		// G
78
-		'GREATEST' => ['_sqlite_func_greatest', -1],
77
+        // G
78
+        'GREATEST' => ['_sqlite_func_greatest', -1],
79 79
 
80
-		// I
81
-		'IF'     => ['_sqlite_func_if', 3],
82
-		'INSERT' => ['_sqlite_func_insert', 4],
83
-		'INSTR'  => ['_sqlite_func_instr', 2],
80
+        // I
81
+        'IF'     => ['_sqlite_func_if', 3],
82
+        'INSERT' => ['_sqlite_func_insert', 4],
83
+        'INSTR'  => ['_sqlite_func_instr', 2],
84 84
 
85
-		// L
86
-		'LEAST'  => ['_sqlite_func_least', -1],
87
-		'_LEFT'  => ['_sqlite_func_left', 2],
85
+        // L
86
+        'LEAST'  => ['_sqlite_func_least', -1],
87
+        '_LEFT'  => ['_sqlite_func_left', 2],
88 88
 
89
-		// N
90
-		'NOW' => ['_sqlite_func_now', 0],
89
+        // N
90
+        'NOW' => ['_sqlite_func_now', 0],
91 91
 
92
-		// M
93
-		'MD5'   => ['md5', 1],
94
-		'MONTH' => ['_sqlite_func_month', 1],
92
+        // M
93
+        'MD5'   => ['md5', 1],
94
+        'MONTH' => ['_sqlite_func_month', 1],
95 95
 
96
-		// P
97
-		'PREG_REPLACE' => ['_sqlite_func_preg_replace', 3],
96
+        // P
97
+        'PREG_REPLACE' => ['_sqlite_func_preg_replace', 3],
98 98
 
99
-		// R
100
-		'RADIANS' => ['deg2rad', 1],
101
-		'RAND'    => ['_sqlite_func_rand', 0], // sinon random() v2.4
102
-		'REGEXP'  => ['_sqlite_func_regexp_match', 2], // critere REGEXP supporte a partir de v3.3.2
103
-		'RIGHT'   => ['_sqlite_func_right', 2],
99
+        // R
100
+        'RADIANS' => ['deg2rad', 1],
101
+        'RAND'    => ['_sqlite_func_rand', 0], // sinon random() v2.4
102
+        'REGEXP'  => ['_sqlite_func_regexp_match', 2], // critere REGEXP supporte a partir de v3.3.2
103
+        'RIGHT'   => ['_sqlite_func_right', 2],
104 104
 
105
-		// S
106
-		'SETTYPE'   => ['settype', 2], // CAST present en v3.2.3
107
-		'SIN'       => ['sin', 1],
108
-		'SQRT'      => ['sqrt', 1],
109
-		'SUBSTRING' => ['_sqlite_func_substring' /*, 3*/], // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0
105
+        // S
106
+        'SETTYPE'   => ['settype', 2], // CAST present en v3.2.3
107
+        'SIN'       => ['sin', 1],
108
+        'SQRT'      => ['sqrt', 1],
109
+        'SUBSTRING' => ['_sqlite_func_substring' /*, 3*/], // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0
110 110
 
111
-		// T
112
-		'TAN'           => ['tan', 1],
113
-		'TIMESTAMPDIFF' => ['_sqlite_timestampdiff'    /*, 3*/],
114
-		'TO_DAYS'       => ['_sqlite_func_to_days', 1],
111
+        // T
112
+        'TAN'           => ['tan', 1],
113
+        'TIMESTAMPDIFF' => ['_sqlite_timestampdiff'    /*, 3*/],
114
+        'TO_DAYS'       => ['_sqlite_func_to_days', 1],
115 115
 
116
-		// U
117
-		'UNIX_TIMESTAMP' => ['_sqlite_func_unix_timestamp', 1],
116
+        // U
117
+        'UNIX_TIMESTAMP' => ['_sqlite_func_unix_timestamp', 1],
118 118
 
119
-		// V
120
-		'VIDE' => ['_sqlite_func_vide', 0], // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide()
119
+        // V
120
+        'VIDE' => ['_sqlite_func_vide', 0], // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide()
121 121
 
122
-		// Y
123
-		'YEAR' => ['_sqlite_func_year', 1]
124
-	];
122
+        // Y
123
+        'YEAR' => ['_sqlite_func_year', 1]
124
+    ];
125 125
 
126
-	foreach ($fonctions as $f => $r) {
127
-		_sqlite_add_function($sqlite, $f, $r);
128
-	}
126
+    foreach ($fonctions as $f => $r) {
127
+        _sqlite_add_function($sqlite, $f, $r);
128
+    }
129 129
 
130
-	#spip_logger('sqlite')->debug('functions sqlite chargees ');
130
+    #spip_logger('sqlite')->debug('functions sqlite chargees ');
131 131
 }
132 132
 
133 133
 
@@ -148,9 +148,9 @@  discard block
 block discarded – undo
148 148
  *
149 149
 **/
150 150
 function _sqlite_add_function(&$sqlite, &$f, &$r) {
151
-	isset($r[1])
152
-		? $sqlite->sqliteCreateFunction($f, $r[0], $r[1])
153
-		: $sqlite->sqliteCreateFunction($f, $r[0]);
151
+    isset($r[1])
152
+        ? $sqlite->sqliteCreateFunction($f, $r[0], $r[1])
153
+        : $sqlite->sqliteCreateFunction($f, $r[0]);
154 154
 }
155 155
 
156 156
 /**
@@ -160,7 +160,7 @@  discard block
 block discarded – undo
160 160
  * @return int
161 161
  */
162 162
 function _sqlite_func_ceil($a) {
163
-	return ceil($a);
163
+    return ceil($a);
164 164
 }
165 165
 
166 166
 /**
@@ -170,7 +170,7 @@  discard block
 block discarded – undo
170 170
  * @return string
171 171
  */
172 172
 function _sqlite_func_concat(...$args) {
173
-	return implode('', $args);
173
+    return implode('', $args);
174 174
 }
175 175
 
176 176
 
@@ -183,7 +183,7 @@  discard block
 block discarded – undo
183 183
  * @return string
184 184
  */
185 185
 function _sqlite_func_dayofmonth($d) {
186
-	return _sqlite_func_date('d', $d);
186
+    return _sqlite_func_date('d', $d);
187 187
 }
188 188
 
189 189
 
@@ -195,15 +195,15 @@  discard block
 block discarded – undo
195 195
  * @return int
196 196
  */
197 197
 function _sqlite_func_find_in_set($num, $set) {
198
-	$rank = 0;
199
-	foreach (explode(',', $set) as $v) {
200
-		if ($v == $num) {
201
-			return (++$rank);
202
-		}
203
-		$rank++;
204
-	}
205
-
206
-	return 0;
198
+    $rank = 0;
199
+    foreach (explode(',', $set) as $v) {
200
+        if ($v == $num) {
201
+            return (++$rank);
202
+        }
203
+        $rank++;
204
+    }
205
+
206
+    return 0;
207 207
 }
208 208
 
209 209
 /**
@@ -213,7 +213,7 @@  discard block
 block discarded – undo
213 213
  * @return int
214 214
  */
215 215
 function _sqlite_func_floor($a) {
216
-	return floor($a);
216
+    return floor($a);
217 217
 }
218 218
 
219 219
 
@@ -226,7 +226,7 @@  discard block
 block discarded – undo
226 226
  * @return mixed
227 227
  */
228 228
 function _sqlite_func_if($bool, $oui, $non) {
229
-	return ($bool) ? $oui : $non;
229
+    return ($bool) ? $oui : $non;
230 230
 }
231 231
 
232 232
 
@@ -243,10 +243,10 @@  discard block
 block discarded – undo
243 243
  * @return string
244 244
  */
245 245
 function _sqlite_func_insert($s, $index, $longueur, $chaine) {
246
-	return
247
-		substr($s, 0, $index)
248
-		. $chaine
249
-		. substr(substr($s, $index), $longueur);
246
+    return
247
+        substr($s, 0, $index)
248
+        . $chaine
249
+        . substr(substr($s, $index), $longueur);
250 250
 }
251 251
 
252 252
 
@@ -258,7 +258,7 @@  discard block
 block discarded – undo
258 258
  * @return int
259 259
  */
260 260
 function _sqlite_func_instr($s, $search) {
261
-	return strpos($s, $search);
261
+    return strpos($s, $search);
262 262
 }
263 263
 
264 264
 
@@ -269,7 +269,7 @@  discard block
 block discarded – undo
269 269
  * @return int
270 270
  */
271 271
 function _sqlite_func_least(...$args) {
272
-	return min($args);
272
+    return min($args);
273 273
 }
274 274
 
275 275
 
@@ -280,7 +280,7 @@  discard block
 block discarded – undo
280 280
  * @return int
281 281
  */
282 282
 function _sqlite_func_greatest(...$args) {
283
-	return max($args);
283
+    return max($args);
284 284
 }
285 285
 
286 286
 
@@ -292,7 +292,7 @@  discard block
 block discarded – undo
292 292
  * @return string
293 293
  */
294 294
 function _sqlite_func_left($s, $lenght) {
295
-	return substr($s, $lenght);
295
+    return substr($s, $lenght);
296 296
 }
297 297
 
298 298
 /**
@@ -302,13 +302,13 @@  discard block
 block discarded – undo
302 302
  * @return string
303 303
  */
304 304
 function _sqlite_func_now($force_refresh = false) {
305
-	static $now = null;
306
-	if (is_null($now) || $force_refresh) {
307
-		$now = date('Y-m-d H:i:s');
308
-	}
305
+    static $now = null;
306
+    if (is_null($now) || $force_refresh) {
307
+        $now = date('Y-m-d H:i:s');
308
+    }
309 309
 
310
-	#spip_logger('sqlite')->debug("Passage avec NOW : $now | ".time());
311
-	return $now;
310
+    #spip_logger('sqlite')->debug("Passage avec NOW : $now | ".time());
311
+    return $now;
312 312
 }
313 313
 
314 314
 
@@ -321,7 +321,7 @@  discard block
 block discarded – undo
321 321
  * @return string
322 322
  */
323 323
 function _sqlite_func_month($d) {
324
-	return _sqlite_func_date('m', $d);
324
+    return _sqlite_func_date('m', $d);
325 325
 }
326 326
 
327 327
 
@@ -334,8 +334,8 @@  discard block
 block discarded – undo
334 334
  * @return string
335 335
  */
336 336
 function _sqlite_func_preg_replace($quoi, $cherche, $remplace) {
337
-	#spip_logger('sqlite')->debug("preg_replace : $quoi, $cherche, $remplace, $return");
338
-	return preg_replace('%' . $cherche . '%', $remplace, $quoi);
337
+    #spip_logger('sqlite')->debug("preg_replace : $quoi, $cherche, $remplace, $return");
338
+    return preg_replace('%' . $cherche . '%', $remplace, $quoi);
339 339
 }
340 340
 
341 341
 /**
@@ -348,11 +348,11 @@  discard block
 block discarded – undo
348 348
  * @return string, l'extrait trouve.
349 349
  **/
350 350
 function _sqlite_func_extraire_multi($quoi, $lang) {
351
-	if (str_contains($quoi, '<')) {
352
-		$collecteurMultis = new Multis();
353
-		$quoi = $collecteurMultis->traiter($quoi, ['lang' => $lang, 'appliquer_typo' => false]);
354
-	}
355
-	return $quoi;
351
+    if (str_contains($quoi, '<')) {
352
+        $collecteurMultis = new Multis();
353
+        $quoi = $collecteurMultis->traiter($quoi, ['lang' => $lang, 'appliquer_typo' => false]);
354
+    }
355
+    return $quoi;
356 356
 }
357 357
 
358 358
 
@@ -362,7 +362,7 @@  discard block
 block discarded – undo
362 362
  * @return float
363 363
  */
364 364
 function _sqlite_func_rand() {
365
-	return random_int(0, mt_getrandmax());
365
+    return random_int(0, mt_getrandmax());
366 366
 }
367 367
 
368 368
 
@@ -374,7 +374,7 @@  discard block
 block discarded – undo
374 374
  * @return string
375 375
  */
376 376
 function _sqlite_func_right($s, $length) {
377
-	return substr($s, 0 - $length);
377
+    return substr($s, 0 - $length);
378 378
 }
379 379
 
380 380
 
@@ -386,16 +386,16 @@  discard block
 block discarded – undo
386 386
  * @return bool
387 387
  */
388 388
 function _sqlite_func_regexp_match($cherche, $quoi) {
389
-	// optimiser un cas tres courant avec les requetes en base
390
-	if (!$quoi && !strlen($quoi)) {
391
-		return false;
392
-	}
393
-	// il faut enlever un niveau d'echappement pour être homogène à mysql
394
-	$cherche = str_replace('\\\\', '\\', $cherche);
395
-	$u = $GLOBALS['meta']['pcre_u'] ?? 'u';
396
-
397
-	#spip_logger('sqlite')->debug("regexp_replace : $quoi, $cherche, $remplace, $return");
398
-	return preg_match('%' . $cherche . '%imsS' . $u, $quoi);
389
+    // optimiser un cas tres courant avec les requetes en base
390
+    if (!$quoi && !strlen($quoi)) {
391
+        return false;
392
+    }
393
+    // il faut enlever un niveau d'echappement pour être homogène à mysql
394
+    $cherche = str_replace('\\\\', '\\', $cherche);
395
+    $u = $GLOBALS['meta']['pcre_u'] ?? 'u';
396
+
397
+    #spip_logger('sqlite')->debug("regexp_replace : $quoi, $cherche, $remplace, $return");
398
+    return preg_match('%' . $cherche . '%imsS' . $u, $quoi);
399 399
 }
400 400
 
401 401
 
@@ -410,8 +410,8 @@  discard block
 block discarded – undo
410 410
  * @return string
411 411
  */
412 412
 function _sqlite_func_date_format($date, $conv) {
413
-	$conv = _sqlite_func_strftime_format_converter($conv);
414
-	return strftime($conv, is_int($date) ? $date : strtotime($date));
413
+    $conv = _sqlite_func_strftime_format_converter($conv);
414
+    return strftime($conv, is_int($date) ? $date : strtotime($date));
415 415
 }
416 416
 
417 417
 /**
@@ -427,28 +427,28 @@  discard block
 block discarded – undo
427 427
  * @return void
428 428
  */
429 429
 function _sqlite_func_strftime_format_converter(string $conv): string {
430
-	// ok : %a %b %d %e %H %I %l %j %k %m %p %r %S %T %w %y %Y
431
-	// on ne sait pas en gérer certains...
432
-	static $mysql_to_strftime_not_ok = ['%c', '%D', '%f', '%U', '%V', '%W', '%X'];
433
-	static $mysql_to_strftime = [
434
-		'%h' => '%I',
435
-		'%i' => '%M',
436
-		'%M' => '%B',
437
-		'%s' => '%S',
438
-		'%u' => '%U',
439
-		'%v' => '%V',
440
-		'%x' => '%G',
441
-	];
442
-	static $to_strftime = [];
443
-	if (!isset($to_strftime[$conv])) {
444
-		$count = 0;
445
-		str_replace($mysql_to_strftime_not_ok, '', $conv, $count);
446
-		if ($count > 0) {
447
-			spip_logger('sqlite')->error("DATE_FORMAT : At least one parameter can't be parsed by strftime with format '$conv'");
448
-		}
449
-		$to_strftime[$conv] = str_replace(array_keys($mysql_to_strftime), $mysql_to_strftime, $conv);
450
-	}
451
-	return $to_strftime[$conv];
430
+    // ok : %a %b %d %e %H %I %l %j %k %m %p %r %S %T %w %y %Y
431
+    // on ne sait pas en gérer certains...
432
+    static $mysql_to_strftime_not_ok = ['%c', '%D', '%f', '%U', '%V', '%W', '%X'];
433
+    static $mysql_to_strftime = [
434
+        '%h' => '%I',
435
+        '%i' => '%M',
436
+        '%M' => '%B',
437
+        '%s' => '%S',
438
+        '%u' => '%U',
439
+        '%v' => '%V',
440
+        '%x' => '%G',
441
+    ];
442
+    static $to_strftime = [];
443
+    if (!isset($to_strftime[$conv])) {
444
+        $count = 0;
445
+        str_replace($mysql_to_strftime_not_ok, '', $conv, $count);
446
+        if ($count > 0) {
447
+            spip_logger('sqlite')->error("DATE_FORMAT : At least one parameter can't be parsed by strftime with format '$conv'");
448
+        }
449
+        $to_strftime[$conv] = str_replace(array_keys($mysql_to_strftime), $mysql_to_strftime, $conv);
450
+    }
451
+    return $to_strftime[$conv];
452 452
 }
453 453
 
454 454
 /**
@@ -462,11 +462,11 @@  discard block
 block discarded – undo
462 462
  * @return int
463 463
  */
464 464
 function _sqlite_func_to_days($d) {
465
-	static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01
466
-	$result = $offset + (int)ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600));
465
+    static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01
466
+    $result = $offset + (int)ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600));
467 467
 
468
-	#spip_logger('sqlite')->debug("Passage avec TO_DAYS : $d, $result");
469
-	return $result;
468
+    #spip_logger('sqlite')->debug("Passage avec TO_DAYS : $d, $result");
469
+    return $result;
470 470
 }
471 471
 
472 472
 /**
@@ -478,13 +478,13 @@  discard block
 block discarded – undo
478 478
  * @return string
479 479
  */
480 480
 function _sqlite_func_substring($string, $start, $len = null) {
481
-	// SQL compte a partir de 1, php a partir de 0
482
-	$start = ($start > 0) ? $start - 1 : $start;
483
-	if (is_null($len)) {
484
-		return substr($string, $start);
485
-	} else {
486
-		return substr($string, $start, $len);
487
-	}
481
+    // SQL compte a partir de 1, php a partir de 0
482
+    $start = ($start > 0) ? $start - 1 : $start;
483
+    if (is_null($len)) {
484
+        return substr($string, $start);
485
+    } else {
486
+        return substr($string, $start, $len);
487
+    }
488 488
 }
489 489
 
490 490
 /**
@@ -500,22 +500,22 @@  discard block
 block discarded – undo
500 500
  * @return int
501 501
  */
502 502
 function _sqlite_timestampdiff($unit, $date1, $date2) {
503
-	$d1 = date_create($date1);
504
-	$d2 = date_create($date2);
505
-	$diff = date_diff($d1, $d2);
506
-	$inv = $diff->invert ? -1 : 1;
507
-	return match ($unit) {
508
-		'YEAR' => $inv * $diff->y,
509
-		'QUARTER' => $inv * (4 * $diff->y + (int) floor($diff->m / 3)),
510
-		'MONTH' => $inv * (12 * $diff->y + $diff->m),
511
-		'WEEK' => $inv * (int) floor($diff->days / 7),
512
-		'DAY' => $inv * $diff->days,
513
-		'HOUR' => $inv * (24 * $diff->days + $diff->h),
514
-		'MINUTE' => $inv * ((24 * $diff->days + $diff->h) * 60 + $diff->i),
515
-		'SECOND' => $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s),
516
-		'MICROSECOND' => $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s) * 1_000_000,
517
-		default => 0,
518
-	};
503
+    $d1 = date_create($date1);
504
+    $d2 = date_create($date2);
505
+    $diff = date_diff($d1, $d2);
506
+    $inv = $diff->invert ? -1 : 1;
507
+    return match ($unit) {
508
+        'YEAR' => $inv * $diff->y,
509
+        'QUARTER' => $inv * (4 * $diff->y + (int) floor($diff->m / 3)),
510
+        'MONTH' => $inv * (12 * $diff->y + $diff->m),
511
+        'WEEK' => $inv * (int) floor($diff->days / 7),
512
+        'DAY' => $inv * $diff->days,
513
+        'HOUR' => $inv * (24 * $diff->days + $diff->h),
514
+        'MINUTE' => $inv * ((24 * $diff->days + $diff->h) * 60 + $diff->i),
515
+        'SECOND' => $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s),
516
+        'MICROSECOND' => $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s) * 1_000_000,
517
+        default => 0,
518
+    };
519 519
 }
520 520
 
521 521
 /**
@@ -525,24 +525,24 @@  discard block
 block discarded – undo
525 525
  * @return int
526 526
  */
527 527
 function _sqlite_func_unix_timestamp($d) {
528
-	static $mem = [];
529
-	static $n = 0;
530
-	if (isset($mem[$d])) {
531
-		return $mem[$d];
532
-	}
533
-	if ($n++ > 100) {
534
-		$mem = [];
535
-		$n = 0;
536
-	}
537
-
538
-	//2005-12-02 20:53:53
539
-	#spip_logger('sqlite')->debug("Passage avec UNIX_TIMESTAMP : $d");
540
-	if (!$d) {
541
-		return $mem[$d] = time();
542
-	}
543
-
544
-	// une pile plus grosse n'accelere pas le calcul
545
-	return $mem[$d] = strtotime($d);
528
+    static $mem = [];
529
+    static $n = 0;
530
+    if (isset($mem[$d])) {
531
+        return $mem[$d];
532
+    }
533
+    if ($n++ > 100) {
534
+        $mem = [];
535
+        $n = 0;
536
+    }
537
+
538
+    //2005-12-02 20:53:53
539
+    #spip_logger('sqlite')->debug("Passage avec UNIX_TIMESTAMP : $d");
540
+    if (!$d) {
541
+        return $mem[$d] = time();
542
+    }
543
+
544
+    // une pile plus grosse n'accelere pas le calcul
545
+    return $mem[$d] = strtotime($d);
546 546
 }
547 547
 
548 548
 
@@ -555,7 +555,7 @@  discard block
 block discarded – undo
555 555
  * @return string
556 556
  */
557 557
 function _sqlite_func_year($d) {
558
-	return _sqlite_func_date('Y', $d);
558
+    return _sqlite_func_date('Y', $d);
559 559
 }
560 560
 
561 561
 /**
@@ -568,20 +568,20 @@  discard block
 block discarded – undo
568 568
  * @return string
569 569
  */
570 570
 function _sqlite_func_date($quoi, $d) {
571
-	static $mem = [];
572
-	static $n = 0;
573
-	if (isset($mem[$d])) {
574
-		return $mem[$d][$quoi];
575
-	}
576
-	if ($n++ > 100) {
577
-		$mem = [];
578
-		$n = 0;
579
-	}
580
-
581
-	$dec = date('Y-m-d', _sqlite_func_unix_timestamp($d));
582
-	$mem[$d] = ['Y' => substr($dec, 0, 4), 'm' => substr($dec, 5, 2), 'd' => substr($dec, 8, 2)];
583
-
584
-	return $mem[$d][$quoi];
571
+    static $mem = [];
572
+    static $n = 0;
573
+    if (isset($mem[$d])) {
574
+        return $mem[$d][$quoi];
575
+    }
576
+    if ($n++ > 100) {
577
+        $mem = [];
578
+        $n = 0;
579
+    }
580
+
581
+    $dec = date('Y-m-d', _sqlite_func_unix_timestamp($d));
582
+    $mem[$d] = ['Y' => substr($dec, 0, 4), 'm' => substr($dec, 5, 2), 'd' => substr($dec, 8, 2)];
583
+
584
+    return $mem[$d][$quoi];
585 585
 }
586 586
 
587 587
 /**
@@ -590,5 +590,5 @@  discard block
 block discarded – undo
590 590
  * @return void
591 591
  */
592 592
 function _sqlite_func_vide() {
593
-	return;
593
+    return;
594 594
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -335,7 +335,7 @@  discard block
 block discarded – undo
335 335
  */
336 336
 function _sqlite_func_preg_replace($quoi, $cherche, $remplace) {
337 337
 	#spip_logger('sqlite')->debug("preg_replace : $quoi, $cherche, $remplace, $return");
338
-	return preg_replace('%' . $cherche . '%', $remplace, $quoi);
338
+	return preg_replace('%'.$cherche.'%', $remplace, $quoi);
339 339
 }
340 340
 
341 341
 /**
@@ -395,7 +395,7 @@  discard block
 block discarded – undo
395 395
 	$u = $GLOBALS['meta']['pcre_u'] ?? 'u';
396 396
 
397 397
 	#spip_logger('sqlite')->debug("regexp_replace : $quoi, $cherche, $remplace, $return");
398
-	return preg_match('%' . $cherche . '%imsS' . $u, $quoi);
398
+	return preg_match('%'.$cherche.'%imsS'.$u, $quoi);
399 399
 }
400 400
 
401 401
 
@@ -463,7 +463,7 @@  discard block
 block discarded – undo
463 463
  */
464 464
 function _sqlite_func_to_days($d) {
465 465
 	static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01
466
-	$result = $offset + (int)ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600));
466
+	$result = $offset + (int) ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600));
467 467
 
468 468
 	#spip_logger('sqlite')->debug("Passage avec TO_DAYS : $d, $result");
469 469
 	return $result;
Please login to merge, or discard this patch.
ecrire/index.php 2 patches
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_logger()->info('Quand la meta admin vaut ' .
116
-			$GLOBALS['meta']['admin'] .
117
-			' seul un·e 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_logger()->info("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_logger()->info('Quand la meta admin vaut ' .
116
+            $GLOBALS['meta']['admin'] .
117
+            ' seul un·e 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_logger()->info("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.
Spacing   +5 added lines, -5 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');
@@ -27,7 +27,7 @@  discard block
 block discarded – undo
27 27
 // Determiner l'action demandee
28 28
 //
29 29
 
30
-$exec = (string)_request('exec');
30
+$exec = (string) _request('exec');
31 31
 $reinstall = (is_null(_request('reinstall'))) ? ($exec == 'install' ? 'oui' : null) : _request('reinstall');
32 32
 //
33 33
 // Les scripts d'insallation n'authentifient pas, forcement,
@@ -112,9 +112,9 @@  discard block
 block discarded – undo
112 112
 			&& !(isset($GLOBALS['visiteur_session'])
113 113
 			&& $GLOBALS['visiteur_session']['statut'] == '0minirezo')
114 114
 	) {
115
-		spip_logger()->info('Quand la meta admin vaut ' .
116
-			$GLOBALS['meta']['admin'] .
117
-			' seul un·e admin peut se connecter et sans AJAX.' .
115
+		spip_logger()->info('Quand la meta admin vaut '.
116
+			$GLOBALS['meta']['admin'].
117
+			' seul un·e admin peut se connecter et sans AJAX.'.
118 118
 			' En cas de probleme, detruire cette meta.');
119 119
 		die(_T('info_travaux_texte'));
120 120
 	}
Please login to merge, or discard this patch.