Completed
Push — master ( fdca64...241762 )
by cam
02:05
created
ecrire/req/mysql.php 2 patches
Indentation   +881 added lines, -881 removed lines patch added patch discarded remove patch
@@ -19,11 +19,11 @@  discard block
 block discarded – undo
19 19
  */
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 if (!defined('_MYSQL_NOPLANES')) {
26
-	define('_MYSQL_NOPLANES', true);
26
+    define('_MYSQL_NOPLANES', true);
27 27
 }
28 28
 
29 29
 /**
@@ -40,113 +40,113 @@  discard block
 block discarded – undo
40 40
  *     - tableau décrivant la connexion sinon
41 41
  */
42 42
 function req_mysql_dist($host, $port, $login, #[\SensitiveParameter] $pass, $db = '', $prefixe = '') {
43
-	if (!extension_loaded(\mysqli::class)) {
44
-		return false;
45
-	}
46
-
47
-	// si port est fourni mais pas host, c'est un socket -> compat avec vieille syntaxe de mysql_connect() et anciens fichiers connect.php
48
-	$logger = spip_logger('mysql');
49
-	try {
50
-		if (
51
-			$port
52
-			&& !is_numeric($socket = $port)
53
-			&& (!$host || $host === 'localhost')
54
-		) {
55
-			$link = @mysqli_connect($host, $login, $pass, '', null, $socket);
56
-		} elseif ($port) {
57
-			$link = @mysqli_connect($host, $login, $pass, '', $port);
58
-		} else {
59
-			$link = @mysqli_connect($host, $login, $pass);
60
-		}
61
-	} catch (\mysqli_sql_exception $e) {
62
-		$logger->debug('mysqli_sql_exception: ' . $e->getMessage());
63
-		$link = false;
64
-	}
65
-
66
-	if (!$link) {
67
-		$logger->emergency('Echec mysqli_connect. Erreur : ' . mysqli_connect_error());
68
-
69
-		return false;
70
-	}
71
-	$last = '';
72
-	if (!$db) {
73
-		$ok = $link;
74
-		$db = 'spip';
75
-	} else {
76
-		$ok = mysqli_select_db($link, $db);
77
-		if (
78
-			defined('_MYSQL_SET_SQL_MODE')
79
-			|| defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite
80
-		) {
81
-			mysqli_query($link, $last = "set sql_mode=''");
82
-		}
83
-	}
84
-
85
-	$logger->debug(
86
-		"Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? 'operationnelle' : 'impossible'),
87
-	);
88
-
89
-	return !$ok ? false : [
90
-		'db' => $db,
91
-		'last' => $last,
92
-		'prefixe' => $prefixe ?: $db,
93
-		'link' => $link,
94
-		'total_requetes' => 0,
95
-	];
43
+    if (!extension_loaded(\mysqli::class)) {
44
+        return false;
45
+    }
46
+
47
+    // si port est fourni mais pas host, c'est un socket -> compat avec vieille syntaxe de mysql_connect() et anciens fichiers connect.php
48
+    $logger = spip_logger('mysql');
49
+    try {
50
+        if (
51
+            $port
52
+            && !is_numeric($socket = $port)
53
+            && (!$host || $host === 'localhost')
54
+        ) {
55
+            $link = @mysqli_connect($host, $login, $pass, '', null, $socket);
56
+        } elseif ($port) {
57
+            $link = @mysqli_connect($host, $login, $pass, '', $port);
58
+        } else {
59
+            $link = @mysqli_connect($host, $login, $pass);
60
+        }
61
+    } catch (\mysqli_sql_exception $e) {
62
+        $logger->debug('mysqli_sql_exception: ' . $e->getMessage());
63
+        $link = false;
64
+    }
65
+
66
+    if (!$link) {
67
+        $logger->emergency('Echec mysqli_connect. Erreur : ' . mysqli_connect_error());
68
+
69
+        return false;
70
+    }
71
+    $last = '';
72
+    if (!$db) {
73
+        $ok = $link;
74
+        $db = 'spip';
75
+    } else {
76
+        $ok = mysqli_select_db($link, $db);
77
+        if (
78
+            defined('_MYSQL_SET_SQL_MODE')
79
+            || defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite
80
+        ) {
81
+            mysqli_query($link, $last = "set sql_mode=''");
82
+        }
83
+    }
84
+
85
+    $logger->debug(
86
+        "Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? 'operationnelle' : 'impossible'),
87
+    );
88
+
89
+    return !$ok ? false : [
90
+        'db' => $db,
91
+        'last' => $last,
92
+        'prefixe' => $prefixe ?: $db,
93
+        'link' => $link,
94
+        'total_requetes' => 0,
95
+    ];
96 96
 }
97 97
 
98 98
 
99 99
 $GLOBALS['spip_mysql_functions_1'] = [
100
-	'alter' => 'spip_mysql_alter',
101
-	'count' => 'spip_mysql_count',
102
-	'countsel' => 'spip_mysql_countsel',
103
-	'create' => 'spip_mysql_create',
104
-	'create_base' => 'spip_mysql_create_base',
105
-	'create_view' => 'spip_mysql_create_view',
106
-	'date_proche' => 'spip_mysql_date_proche',
107
-	'delete' => 'spip_mysql_delete',
108
-	'drop_table' => 'spip_mysql_drop_table',
109
-	'drop_view' => 'spip_mysql_drop_view',
110
-	'errno' => 'spip_mysql_errno',
111
-	'error' => 'spip_mysql_error',
112
-	'explain' => 'spip_mysql_explain',
113
-	'fetch' => 'spip_mysql_fetch',
114
-	'seek' => 'spip_mysql_seek',
115
-	'free' => 'spip_mysql_free',
116
-	'hex' => 'spip_mysql_hex',
117
-	'in' => 'spip_mysql_in',
118
-	'insert' => 'spip_mysql_insert',
119
-	'insertq' => 'spip_mysql_insertq',
120
-	'insertq_multi' => 'spip_mysql_insertq_multi',
121
-	'listdbs' => 'spip_mysql_listdbs',
122
-	'multi' => 'spip_mysql_multi',
123
-	'optimize' => 'spip_mysql_optimize',
124
-	'query' => 'spip_mysql_query',
125
-	'quote' => 'spip_mysql_quote',
126
-	'replace' => 'spip_mysql_replace',
127
-	'replace_multi' => 'spip_mysql_replace_multi',
128
-	'repair' => 'spip_mysql_repair',
129
-	'select' => 'spip_mysql_select',
130
-	'selectdb' => 'spip_mysql_selectdb',
131
-	'set_charset' => 'spip_mysql_set_charset',
132
-	'get_charset' => 'spip_mysql_get_charset',
133
-	'showbase' => 'spip_mysql_showbase',
134
-	'showtable' => 'spip_mysql_showtable',
135
-	'table_exists' => 'spip_mysql_table_exists',
136
-	'update' => 'spip_mysql_update',
137
-	'updateq' => 'spip_mysql_updateq',
138
-
139
-	// association de chaque nom http d'un charset aux couples MySQL
140
-	'charsets' => [
141
-		'cp1250' => ['charset' => 'cp1250', 'collation' => 'cp1250_general_ci'],
142
-		'cp1251' => ['charset' => 'cp1251', 'collation' => 'cp1251_general_ci'],
143
-		'cp1256' => ['charset' => 'cp1256', 'collation' => 'cp1256_general_ci'],
144
-		'iso-8859-1' => ['charset' => 'latin1', 'collation' => 'latin1_swedish_ci'],
100
+    'alter' => 'spip_mysql_alter',
101
+    'count' => 'spip_mysql_count',
102
+    'countsel' => 'spip_mysql_countsel',
103
+    'create' => 'spip_mysql_create',
104
+    'create_base' => 'spip_mysql_create_base',
105
+    'create_view' => 'spip_mysql_create_view',
106
+    'date_proche' => 'spip_mysql_date_proche',
107
+    'delete' => 'spip_mysql_delete',
108
+    'drop_table' => 'spip_mysql_drop_table',
109
+    'drop_view' => 'spip_mysql_drop_view',
110
+    'errno' => 'spip_mysql_errno',
111
+    'error' => 'spip_mysql_error',
112
+    'explain' => 'spip_mysql_explain',
113
+    'fetch' => 'spip_mysql_fetch',
114
+    'seek' => 'spip_mysql_seek',
115
+    'free' => 'spip_mysql_free',
116
+    'hex' => 'spip_mysql_hex',
117
+    'in' => 'spip_mysql_in',
118
+    'insert' => 'spip_mysql_insert',
119
+    'insertq' => 'spip_mysql_insertq',
120
+    'insertq_multi' => 'spip_mysql_insertq_multi',
121
+    'listdbs' => 'spip_mysql_listdbs',
122
+    'multi' => 'spip_mysql_multi',
123
+    'optimize' => 'spip_mysql_optimize',
124
+    'query' => 'spip_mysql_query',
125
+    'quote' => 'spip_mysql_quote',
126
+    'replace' => 'spip_mysql_replace',
127
+    'replace_multi' => 'spip_mysql_replace_multi',
128
+    'repair' => 'spip_mysql_repair',
129
+    'select' => 'spip_mysql_select',
130
+    'selectdb' => 'spip_mysql_selectdb',
131
+    'set_charset' => 'spip_mysql_set_charset',
132
+    'get_charset' => 'spip_mysql_get_charset',
133
+    'showbase' => 'spip_mysql_showbase',
134
+    'showtable' => 'spip_mysql_showtable',
135
+    'table_exists' => 'spip_mysql_table_exists',
136
+    'update' => 'spip_mysql_update',
137
+    'updateq' => 'spip_mysql_updateq',
138
+
139
+    // association de chaque nom http d'un charset aux couples MySQL
140
+    'charsets' => [
141
+        'cp1250' => ['charset' => 'cp1250', 'collation' => 'cp1250_general_ci'],
142
+        'cp1251' => ['charset' => 'cp1251', 'collation' => 'cp1251_general_ci'],
143
+        'cp1256' => ['charset' => 'cp1256', 'collation' => 'cp1256_general_ci'],
144
+        'iso-8859-1' => ['charset' => 'latin1', 'collation' => 'latin1_swedish_ci'],
145 145
 //'iso-8859-6'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
146
-		'iso-8859-9' => ['charset' => 'latin5', 'collation' => 'latin5_turkish_ci'],
146
+        'iso-8859-9' => ['charset' => 'latin5', 'collation' => 'latin5_turkish_ci'],
147 147
 //'iso-8859-15'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
148
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci']
149
-	]
148
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci']
149
+    ]
150 150
 ];
151 151
 
152 152
 
@@ -157,9 +157,9 @@  discard block
 block discarded – undo
157 157
  * @return Object Information de connexion pour mysqli
158 158
  */
159 159
 function _mysql_link($serveur = '') {
160
-	$link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
160
+    $link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
161 161
 
162
-	return $link;
162
+    return $link;
163 163
 }
164 164
 
165 165
 
@@ -172,10 +172,10 @@  discard block
 block discarded – undo
172 172
  * @return mysqli_result|bool Jeu de résultats pour fetch()
173 173
  */
174 174
 function spip_mysql_set_charset($charset, $serveur = '', $requeter = true) {
175
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
176
-	spip_logger('mysql')->debug('changement de charset sql : ' . 'SET NAMES ' . _q($charset));
175
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
176
+    spip_logger('mysql')->debug('changement de charset sql : ' . 'SET NAMES ' . _q($charset));
177 177
 
178
-	return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES ' . _q($charset));
178
+    return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES ' . _q($charset));
179 179
 }
180 180
 
181 181
 
@@ -188,11 +188,11 @@  discard block
 block discarded – undo
188 188
  * @return array Description du charset (son nom est dans 'charset')
189 189
  */
190 190
 function spip_mysql_get_charset($charset = [], $serveur = '', $requeter = true) {
191
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
192
-	$connexion['last'] = $c = 'SHOW CHARACTER SET'
193
-		. (!$charset ? '' : (' LIKE ' . _q($charset['charset'])));
191
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
192
+    $connexion['last'] = $c = 'SHOW CHARACTER SET'
193
+        . (!$charset ? '' : (' LIKE ' . _q($charset['charset'])));
194 194
 
195
-	return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur);
195
+    return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur);
196 196
 }
197 197
 
198 198
 /**
@@ -208,80 +208,80 @@  discard block
 block discarded – undo
208 208
  */
209 209
 function spip_mysql_query($query, $serveur = '', $requeter = true) {
210 210
 
211
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
212
-	$prefixe = $connexion['prefixe'];
213
-	$link = $connexion['link'];
214
-	$db = $connexion['db'];
215
-
216
-	$query = _mysql_traite_query($query, $db, $prefixe);
217
-
218
-	// renvoyer la requete inerte si demandee
219
-	if (!$requeter) {
220
-		return $query;
221
-	}
222
-
223
-	if (isset($_GET['var_profile']) || defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) {
224
-		include_spip('public/tracer');
225
-		$t = trace_query_start();
226
-	} else {
227
-		$t = 0;
228
-	}
229
-
230
-	$connexion['last'] = $query;
231
-	$connexion['total_requetes']++;
232
-
233
-	// ajouter un debug utile dans log/mysql-slow.log ?
234
-	$debug = '';
235
-	if (defined('_DEBUG_SLOW_QUERIES') && _DEBUG_SLOW_QUERIES) {
236
-		if (isset($GLOBALS['debug']['aucasou'])) {
237
-			[, $id, , $infos] = $GLOBALS['debug']['aucasou'];
238
-			$debug .= "BOUCLE$id @ " . ($infos[0] ?? '') . ' | ';
239
-		}
240
-		if (isset($_SERVER['REQUEST_URI'])) {
241
-			$debug .= $_SERVER['REQUEST_URI'];
242
-		}
243
-		if (!empty($GLOBALS['ip'])) {
244
-			$debug .= ' + ' . $GLOBALS['ip'];
245
-		}
246
-		$debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
247
-	}
248
-	try {
249
-		$r = mysqli_query($link, $query . $debug);
250
-	} catch (\mysqli_sql_exception $e) {
251
-		spip_logger('mysql')->debug('mysqli_sql_exception: ' . $e->getMessage());
252
-		$r = false;
253
-		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
254
-		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
255
-	}
256
-
257
-	//Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP
258
-	if ($e = spip_mysql_errno($serveur)) {  // Log d'un Gone Away
259
-		if ($e == 2006) { //Si Gone Away on relance une connexion vierge
260
-			//Fermer la connexion defaillante
261
-			mysqli_close($connexion['link']);
262
-			unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
263
-			//Relancer une connexion vierge
264
-			spip_connect($serveur);
265
-			$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
266
-			$link = $connexion['link'];
267
-			//On retente au cas où
268
-			try {
269
-				$r = mysqli_query($link, $query . $debug);
270
-			} catch (\mysqli_sql_exception $e) {
271
-				spip_logger('mysql')->debug('mysqli_sql_exception: ' . $e->getMessage());
272
-				$r = false;
273
-				// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
274
-				// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
275
-			}
276
-		}
277
-	}
278
-
279
-	// Log de l'erreur eventuelle
280
-	if ($e = spip_mysql_errno($serveur)) {
281
-		// et du fautif
282
-		$e .= spip_mysql_error($query, $serveur);
283
-	}
284
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
211
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
212
+    $prefixe = $connexion['prefixe'];
213
+    $link = $connexion['link'];
214
+    $db = $connexion['db'];
215
+
216
+    $query = _mysql_traite_query($query, $db, $prefixe);
217
+
218
+    // renvoyer la requete inerte si demandee
219
+    if (!$requeter) {
220
+        return $query;
221
+    }
222
+
223
+    if (isset($_GET['var_profile']) || defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) {
224
+        include_spip('public/tracer');
225
+        $t = trace_query_start();
226
+    } else {
227
+        $t = 0;
228
+    }
229
+
230
+    $connexion['last'] = $query;
231
+    $connexion['total_requetes']++;
232
+
233
+    // ajouter un debug utile dans log/mysql-slow.log ?
234
+    $debug = '';
235
+    if (defined('_DEBUG_SLOW_QUERIES') && _DEBUG_SLOW_QUERIES) {
236
+        if (isset($GLOBALS['debug']['aucasou'])) {
237
+            [, $id, , $infos] = $GLOBALS['debug']['aucasou'];
238
+            $debug .= "BOUCLE$id @ " . ($infos[0] ?? '') . ' | ';
239
+        }
240
+        if (isset($_SERVER['REQUEST_URI'])) {
241
+            $debug .= $_SERVER['REQUEST_URI'];
242
+        }
243
+        if (!empty($GLOBALS['ip'])) {
244
+            $debug .= ' + ' . $GLOBALS['ip'];
245
+        }
246
+        $debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
247
+    }
248
+    try {
249
+        $r = mysqli_query($link, $query . $debug);
250
+    } catch (\mysqli_sql_exception $e) {
251
+        spip_logger('mysql')->debug('mysqli_sql_exception: ' . $e->getMessage());
252
+        $r = false;
253
+        // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
254
+        // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
255
+    }
256
+
257
+    //Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP
258
+    if ($e = spip_mysql_errno($serveur)) {  // Log d'un Gone Away
259
+        if ($e == 2006) { //Si Gone Away on relance une connexion vierge
260
+            //Fermer la connexion defaillante
261
+            mysqli_close($connexion['link']);
262
+            unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
263
+            //Relancer une connexion vierge
264
+            spip_connect($serveur);
265
+            $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
266
+            $link = $connexion['link'];
267
+            //On retente au cas où
268
+            try {
269
+                $r = mysqli_query($link, $query . $debug);
270
+            } catch (\mysqli_sql_exception $e) {
271
+                spip_logger('mysql')->debug('mysqli_sql_exception: ' . $e->getMessage());
272
+                $r = false;
273
+                // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
274
+                // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
275
+            }
276
+        }
277
+    }
278
+
279
+    // Log de l'erreur eventuelle
280
+    if ($e = spip_mysql_errno($serveur)) {
281
+        // et du fautif
282
+        $e .= spip_mysql_error($query, $serveur);
283
+    }
284
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
285 285
 }
286 286
 
287 287
 /**
@@ -296,12 +296,12 @@  discard block
 block discarded – undo
296 296
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
297 297
  */
298 298
 function spip_mysql_alter($query, $serveur = '', $requeter = true) {
299
-	// ici on supprime les ` entourant le nom de table pour permettre
300
-	// la transposition du prefixe, compte tenu que les plugins ont la mauvaise habitude
301
-	// d'utiliser ceux-ci, copie-colle de phpmyadmin
302
-	$query = preg_replace(',^TABLE\s*`([^`]*)`,i', "TABLE \\1", $query);
299
+    // ici on supprime les ` entourant le nom de table pour permettre
300
+    // la transposition du prefixe, compte tenu que les plugins ont la mauvaise habitude
301
+    // d'utiliser ceux-ci, copie-colle de phpmyadmin
302
+    $query = preg_replace(',^TABLE\s*`([^`]*)`,i', "TABLE \\1", $query);
303 303
 
304
-	return spip_mysql_query('ALTER ' . $query, $serveur, $requeter); # i.e. que PG se debrouille
304
+    return spip_mysql_query('ALTER ' . $query, $serveur, $requeter); # i.e. que PG se debrouille
305 305
 }
306 306
 
307 307
 
@@ -314,9 +314,9 @@  discard block
 block discarded – undo
314 314
  * @return bool            Toujours true
315 315
  */
316 316
 function spip_mysql_optimize($table, $serveur = '', $requeter = true) {
317
-	spip_mysql_query('OPTIMIZE TABLE ' . $table);
317
+    spip_mysql_query('OPTIMIZE TABLE ' . $table);
318 318
 
319
-	return true;
319
+    return true;
320 320
 }
321 321
 
322 322
 
@@ -329,18 +329,18 @@  discard block
 block discarded – undo
329 329
  * @return array           Tableau de l'explication
330 330
  */
331 331
 function spip_mysql_explain($query, $serveur = '', $requeter = true) {
332
-	if (!str_starts_with(ltrim($query), 'SELECT')) {
333
-		return [];
334
-	}
335
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
336
-	$prefixe = $connexion['prefixe'];
337
-	$link = $connexion['link'];
338
-	$db = $connexion['db'];
339
-
340
-	$query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe);
341
-	$r = mysqli_query($link, $query);
342
-
343
-	return spip_mysql_fetch($r, null, $serveur);
332
+    if (!str_starts_with(ltrim($query), 'SELECT')) {
333
+        return [];
334
+    }
335
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
336
+    $prefixe = $connexion['prefixe'];
337
+    $link = $connexion['link'];
338
+    $db = $connexion['db'];
339
+
340
+    $query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe);
341
+    $r = mysqli_query($link, $query);
342
+
343
+    return spip_mysql_fetch($r, null, $serveur);
344 344
 }
345 345
 
346 346
 
@@ -369,35 +369,35 @@  discard block
 block discarded – undo
369 369
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
370 370
  */
371 371
 function spip_mysql_select(
372
-	$select,
373
-	$from,
374
-	$where = '',
375
-	$groupby = '',
376
-	$orderby = '',
377
-	$limit = '',
378
-	$having = '',
379
-	$serveur = '',
380
-	$requeter = true
372
+    $select,
373
+    $from,
374
+    $where = '',
375
+    $groupby = '',
376
+    $orderby = '',
377
+    $limit = '',
378
+    $having = '',
379
+    $serveur = '',
380
+    $requeter = true
381 381
 ) {
382 382
 
383 383
 
384
-	$from = (!is_array($from) ? $from : spip_mysql_select_as($from));
385
-	$query =
386
-		calculer_mysql_expression('SELECT', $select, ', ')
387
-		. calculer_mysql_expression('FROM', $from, ', ')
388
-		. calculer_mysql_expression('WHERE', $where)
389
-		. calculer_mysql_expression('GROUP BY', $groupby, ',')
390
-		. calculer_mysql_expression('HAVING', $having)
391
-		. ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '')
392
-		. ($limit ? "\nLIMIT $limit" : '');
384
+    $from = (!is_array($from) ? $from : spip_mysql_select_as($from));
385
+    $query =
386
+        calculer_mysql_expression('SELECT', $select, ', ')
387
+        . calculer_mysql_expression('FROM', $from, ', ')
388
+        . calculer_mysql_expression('WHERE', $where)
389
+        . calculer_mysql_expression('GROUP BY', $groupby, ',')
390
+        . calculer_mysql_expression('HAVING', $having)
391
+        . ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '')
392
+        . ($limit ? "\nLIMIT $limit" : '');
393 393
 
394
-	// renvoyer la requete inerte si demandee
395
-	if ($requeter === false) {
396
-		return $query;
397
-	}
398
-	$r = spip_mysql_query($query, $serveur, $requeter);
394
+    // renvoyer la requete inerte si demandee
395
+    if ($requeter === false) {
396
+        return $query;
397
+    }
398
+    $r = spip_mysql_query($query, $serveur, $requeter);
399 399
 
400
-	return $r ?: $query;
400
+    return $r ?: $query;
401 401
 }
402 402
 
403 403
 
@@ -414,7 +414,7 @@  discard block
 block discarded – undo
414 414
  * @return string texte du orderby préparé
415 415
  */
416 416
 function spip_mysql_order($orderby) {
417
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
417
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
418 418
 }
419 419
 
420 420
 
@@ -437,26 +437,26 @@  discard block
 block discarded – undo
437 437
  *     Contrainte pour clause WHERE
438 438
  */
439 439
 function calculer_mysql_where($v) {
440
-	if (!is_array($v)) {
441
-		return $v;
442
-	}
443
-
444
-	$op = array_shift($v);
445
-	if (!($n = count($v))) {
446
-		return $op;
447
-	} else {
448
-		$arg = calculer_mysql_where(array_shift($v));
449
-		if ($n == 1) {
450
-			return "$op($arg)";
451
-		} else {
452
-			$arg2 = calculer_mysql_where(array_shift($v));
453
-			if ($n == 2) {
454
-				return "($arg $op $arg2)";
455
-			} else {
456
-				return "($arg $op ($arg2) : $v[0])";
457
-			}
458
-		}
459
-	}
440
+    if (!is_array($v)) {
441
+        return $v;
442
+    }
443
+
444
+    $op = array_shift($v);
445
+    if (!($n = count($v))) {
446
+        return $op;
447
+    } else {
448
+        $arg = calculer_mysql_where(array_shift($v));
449
+        if ($n == 1) {
450
+            return "$op($arg)";
451
+        } else {
452
+            $arg2 = calculer_mysql_where(array_shift($v));
453
+            if ($n == 2) {
454
+                return "($arg $op $arg2)";
455
+            } else {
456
+                return "($arg $op ($arg2) : $v[0])";
457
+            }
458
+        }
459
+    }
460 460
 }
461 461
 
462 462
 /**
@@ -471,21 +471,21 @@  discard block
 block discarded – undo
471 471
  * @return string            texte de l'expression, une partie donc, du texte la requête.
472 472
  */
473 473
 function calculer_mysql_expression($expression, $v, $join = 'AND') {
474
-	if (empty($v)) {
475
-		return '';
476
-	}
477
-
478
-	$exp = "\n$expression ";
479
-
480
-	if (!is_array($v)) {
481
-		return $exp . $v;
482
-	} else {
483
-		if (strtoupper($join) === 'AND') {
484
-			return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
485
-		} else {
486
-			return $exp . join($join, $v);
487
-		}
488
-	}
474
+    if (empty($v)) {
475
+        return '';
476
+    }
477
+
478
+    $exp = "\n$expression ";
479
+
480
+    if (!is_array($v)) {
481
+        return $exp . $v;
482
+    } else {
483
+        if (strtoupper($join) === 'AND') {
484
+            return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
485
+        } else {
486
+            return $exp . join($join, $v);
487
+        }
488
+    }
489 489
 }
490 490
 
491 491
 
@@ -496,26 +496,26 @@  discard block
 block discarded – undo
496 496
  * @return string Sélection de colonnes pour une clause SELECT
497 497
  */
498 498
 function spip_mysql_select_as($args) {
499
-	$res = '';
500
-	foreach ($args as $k => $v) {
501
-		if (str_ends_with($k, '@')) {
502
-			// c'est une jointure qui se refere au from precedent
503
-			// pas de virgule
504
-			$res .= '  ' . $v;
505
-		} else {
506
-			if (!is_numeric($k)) {
507
-				$p = strpos($v, ' ');
508
-				if ($p) {
509
-					$v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p);
510
-				} else {
511
-					$v .= " AS `$k`";
512
-				}
513
-			}
514
-			$res .= ', ' . $v;
515
-		}
516
-	}
517
-
518
-	return substr($res, 2);
499
+    $res = '';
500
+    foreach ($args as $k => $v) {
501
+        if (str_ends_with($k, '@')) {
502
+            // c'est une jointure qui se refere au from precedent
503
+            // pas de virgule
504
+            $res .= '  ' . $v;
505
+        } else {
506
+            if (!is_numeric($k)) {
507
+                $p = strpos($v, ' ');
508
+                if ($p) {
509
+                    $v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p);
510
+                } else {
511
+                    $v .= " AS `$k`";
512
+                }
513
+            }
514
+            $res .= ', ' . $v;
515
+        }
516
+    }
517
+
518
+    return substr($res, 2);
519 519
 }
520 520
 
521 521
 
@@ -540,58 +540,58 @@  discard block
 block discarded – undo
540 540
  */
541 541
 function _mysql_traite_query($query, $db = '', $prefixe = '', $echappe_textes = true) {
542 542
 
543
-	if ($GLOBALS['mysql_rappel_nom_base'] && $db) {
544
-		$pref = '`' . $db . '`.';
545
-	} else {
546
-		$pref = '';
547
-	}
548
-
549
-	if ($prefixe) {
550
-		$pref .= $prefixe . '_';
551
-	}
552
-
553
-	if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
554
-		$suite = '';
555
-	} else {
556
-		$suite = strstr($query, (string) $regs[0]);
557
-		$query = substr($query, 0, -strlen($suite));
558
-		// propager le prefixe en cas de requete imbriquee
559
-		// il faut alors echapper les chaine avant de le faire, pour ne pas risquer de
560
-		// modifier une requete qui est en fait juste du texte dans un champ
561
-		if (stripos($suite, 'SELECT') !== false) {
562
-			if ($echappe_textes) {
563
-				[$suite_echap, $textes] = query_echappe_textes($suite);
564
-			}
565
-			else {
566
-				$suite_echap = $suite;
567
-			}
568
-			if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
569
-				$suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
570
-				if ($echappe_textes) {
571
-					$suite = query_reinjecte_textes($suite_echap, $textes);
572
-				}
573
-				else {
574
-					$suite = $suite_echap;
575
-				}
576
-			}
577
-		}
578
-	}
579
-	$r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
580
-
581
-	// en option, remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
582
-	// remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
583
-	if (
584
-		defined('_MYSQL_NOPLANES')
585
-		&& _MYSQL_NOPLANES
586
-		&& !empty($GLOBALS['meta']['charset_sql_connexion'])
587
-		&& $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
588
-	) {
589
-		include_spip('inc/charsets');
590
-		$r = utf8_noplanes($r);
591
-	}
592
-
593
-	#spip_logger('mysql')->debug("_mysql_traite_query: " . substr($r,0, 50) . ".... $db, $prefixe");
594
-	return $r;
543
+    if ($GLOBALS['mysql_rappel_nom_base'] && $db) {
544
+        $pref = '`' . $db . '`.';
545
+    } else {
546
+        $pref = '';
547
+    }
548
+
549
+    if ($prefixe) {
550
+        $pref .= $prefixe . '_';
551
+    }
552
+
553
+    if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
554
+        $suite = '';
555
+    } else {
556
+        $suite = strstr($query, (string) $regs[0]);
557
+        $query = substr($query, 0, -strlen($suite));
558
+        // propager le prefixe en cas de requete imbriquee
559
+        // il faut alors echapper les chaine avant de le faire, pour ne pas risquer de
560
+        // modifier une requete qui est en fait juste du texte dans un champ
561
+        if (stripos($suite, 'SELECT') !== false) {
562
+            if ($echappe_textes) {
563
+                [$suite_echap, $textes] = query_echappe_textes($suite);
564
+            }
565
+            else {
566
+                $suite_echap = $suite;
567
+            }
568
+            if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
569
+                $suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
570
+                if ($echappe_textes) {
571
+                    $suite = query_reinjecte_textes($suite_echap, $textes);
572
+                }
573
+                else {
574
+                    $suite = $suite_echap;
575
+                }
576
+            }
577
+        }
578
+    }
579
+    $r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
580
+
581
+    // en option, remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
582
+    // remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
583
+    if (
584
+        defined('_MYSQL_NOPLANES')
585
+        && _MYSQL_NOPLANES
586
+        && !empty($GLOBALS['meta']['charset_sql_connexion'])
587
+        && $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
588
+    ) {
589
+        include_spip('inc/charsets');
590
+        $r = utf8_noplanes($r);
591
+    }
592
+
593
+    #spip_logger('mysql')->debug("_mysql_traite_query: " . substr($r,0, 50) . ".... $db, $prefixe");
594
+    return $r;
595 595
 }
596 596
 
597 597
 /**
@@ -609,17 +609,17 @@  discard block
 block discarded – undo
609 609
  *     - False en cas d'erreur.
610 610
  **/
611 611
 function spip_mysql_selectdb($db, $serveur = '', $requeter = true) {
612
-	$link = _mysql_link($serveur);
613
-	try {
614
-		$ok = mysqli_select_db($link, $db);
615
-	} catch (\mysqli_sql_exception) {
616
-		$ok = false;
617
-	}
618
-	if (!$ok) {
619
-		spip_logger('mysql')->critical('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link));
620
-	}
621
-
622
-	return $ok;
612
+    $link = _mysql_link($serveur);
613
+    try {
614
+        $ok = mysqli_select_db($link, $db);
615
+    } catch (\mysqli_sql_exception) {
616
+        $ok = false;
617
+    }
618
+    if (!$ok) {
619
+        spip_logger('mysql')->critical('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link));
620
+    }
621
+
622
+    return $ok;
623 623
 }
624 624
 
625 625
 
@@ -640,14 +640,14 @@  discard block
 block discarded – undo
640 640
  *     Liste de noms de bases de données
641 641
  **/
642 642
 function spip_mysql_listdbs($serveur = '', $requeter = true) {
643
-	$dbs = [];
644
-	if ($res = spip_mysql_query('SHOW DATABASES', $serveur)) {
645
-		while ($row = mysqli_fetch_assoc($res)) {
646
-			$dbs[] = $row['Database'];
647
-		}
648
-	}
649
-
650
-	return $dbs;
643
+    $dbs = [];
644
+    if ($res = spip_mysql_query('SHOW DATABASES', $serveur)) {
645
+        while ($row = mysqli_fetch_assoc($res)) {
646
+            $dbs[] = $row['Database'];
647
+        }
648
+    }
649
+
650
+    return $dbs;
651 651
 }
652 652
 
653 653
 
@@ -670,73 +670,73 @@  discard block
 block discarded – undo
670 670
  *     - true si la requête réussie, false sinon.
671 671
  */
672 672
 function spip_mysql_create(
673
-	$nom,
674
-	$champs,
675
-	$cles,
676
-	$autoinc = false,
677
-	$temporary = false,
678
-	$serveur = '',
679
-	$requeter = true
673
+    $nom,
674
+    $champs,
675
+    $cles,
676
+    $autoinc = false,
677
+    $temporary = false,
678
+    $serveur = '',
679
+    $requeter = true
680 680
 ) {
681 681
 
682
-	$query = '';
683
-	$keys = '';
684
-	$s = '';
685
-	$p = '';
686
-
687
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
688
-	// sans les renseigner (laisse le compilo recuperer la description)
689
-	if (!is_array($champs) || !is_array($cles)) {
690
-		return;
691
-	}
692
-
693
-	$res = spip_mysql_query('SELECT version() as v', $serveur);
694
-	if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'], '5.0', '>='))) {
695
-		spip_mysql_query("SET sql_mode=''", $serveur);
696
-	}
697
-
698
-	foreach ($cles as $k => $v) {
699
-		$keys .= "$s\n\t\t$k ($v)";
700
-		if ($k == 'PRIMARY KEY') {
701
-			$p = $v;
702
-		}
703
-		$s = ',';
704
-	}
705
-	$s = '';
706
-
707
-	$character_set = '';
708
-	if (@$GLOBALS['meta']['charset_sql_base']) {
709
-		$character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
710
-	}
711
-	if (@$GLOBALS['meta']['charset_collation_sql_base']) {
712
-		$character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
713
-	}
714
-
715
-	foreach ($champs as $k => $v) {
716
-		$v = _mysql_remplacements_definitions_table($v);
717
-		if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
718
-			if (
719
-				preg_match(',(char|text),i', $defs[1])
720
-				&& !preg_match(',(binary|CHARACTER|COLLATE),i', $v)
721
-			) {
722
-				$v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
723
-			}
724
-		}
725
-
726
-		$query .= "$s\n\t\t$k $v"
727
-			. (($autoinc && ($p == $k) && preg_match(',\b(big|small|medium)?int\b,i', $v))
728
-				? ' auto_increment'
729
-				: ''
730
-			);
731
-		$s = ',';
732
-	}
733
-	$temporary = $temporary ? 'TEMPORARY' : '';
734
-	$q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
735
-		. (defined('_MYSQL_ENGINE') ? ' ENGINE=' . _MYSQL_ENGINE : '')
736
-		. ($character_set ? " DEFAULT $character_set" : '')
737
-		. "\n";
738
-
739
-	return spip_mysql_query($q, $serveur);
682
+    $query = '';
683
+    $keys = '';
684
+    $s = '';
685
+    $p = '';
686
+
687
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
688
+    // sans les renseigner (laisse le compilo recuperer la description)
689
+    if (!is_array($champs) || !is_array($cles)) {
690
+        return;
691
+    }
692
+
693
+    $res = spip_mysql_query('SELECT version() as v', $serveur);
694
+    if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'], '5.0', '>='))) {
695
+        spip_mysql_query("SET sql_mode=''", $serveur);
696
+    }
697
+
698
+    foreach ($cles as $k => $v) {
699
+        $keys .= "$s\n\t\t$k ($v)";
700
+        if ($k == 'PRIMARY KEY') {
701
+            $p = $v;
702
+        }
703
+        $s = ',';
704
+    }
705
+    $s = '';
706
+
707
+    $character_set = '';
708
+    if (@$GLOBALS['meta']['charset_sql_base']) {
709
+        $character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
710
+    }
711
+    if (@$GLOBALS['meta']['charset_collation_sql_base']) {
712
+        $character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
713
+    }
714
+
715
+    foreach ($champs as $k => $v) {
716
+        $v = _mysql_remplacements_definitions_table($v);
717
+        if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
718
+            if (
719
+                preg_match(',(char|text),i', $defs[1])
720
+                && !preg_match(',(binary|CHARACTER|COLLATE),i', $v)
721
+            ) {
722
+                $v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
723
+            }
724
+        }
725
+
726
+        $query .= "$s\n\t\t$k $v"
727
+            . (($autoinc && ($p == $k) && preg_match(',\b(big|small|medium)?int\b,i', $v))
728
+                ? ' auto_increment'
729
+                : ''
730
+            );
731
+        $s = ',';
732
+    }
733
+    $temporary = $temporary ? 'TEMPORARY' : '';
734
+    $q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
735
+        . (defined('_MYSQL_ENGINE') ? ' ENGINE=' . _MYSQL_ENGINE : '')
736
+        . ($character_set ? " DEFAULT $character_set" : '')
737
+        . "\n";
738
+
739
+    return spip_mysql_query($q, $serveur);
740 740
 }
741 741
 
742 742
 
@@ -749,25 +749,25 @@  discard block
 block discarded – undo
749 749
  *     Définition SQL adaptée pour MySQL d'un champ de table
750 750
  */
751 751
 function _mysql_remplacements_definitions_table($query) {
752
-	// quelques remplacements
753
-	$num = '(\s*\([0-9]*\))?';
754
-	$enum = '(\s*\([^\)]*\))?';
755
-
756
-	$remplace = [
757
-		'/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
758
-		'/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
759
-	];
760
-
761
-	if (is_string($query)) {
762
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
763
-	} elseif (is_array($query)) {
764
-		$keys = array_keys($remplace);
765
-		foreach ($query as $k => $q) {
766
-			$query[$k] = preg_replace($keys, $remplace, $q);
767
-		}
768
-	}
769
-
770
-	return $query;
752
+    // quelques remplacements
753
+    $num = '(\s*\([0-9]*\))?';
754
+    $enum = '(\s*\([^\)]*\))?';
755
+
756
+    $remplace = [
757
+        '/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
758
+        '/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
759
+    ];
760
+
761
+    if (is_string($query)) {
762
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
763
+    } elseif (is_array($query)) {
764
+        $keys = array_keys($remplace);
765
+        foreach ($query as $k => $q) {
766
+            $query[$k] = preg_replace($keys, $remplace, $q);
767
+        }
768
+    }
769
+
770
+    return $query;
771 771
 }
772 772
 
773 773
 
@@ -780,7 +780,7 @@  discard block
 block discarded – undo
780 780
  * @return bool true si la base est créee.
781 781
  **/
782 782
 function spip_mysql_create_base($nom, $serveur = '', $requeter = true) {
783
-	return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter);
783
+    return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter);
784 784
 }
785 785
 
786 786
 
@@ -801,19 +801,19 @@  discard block
 block discarded – undo
801 801
  *     - string texte de la requête si $requeter vaut false
802 802
  */
803 803
 function spip_mysql_create_view($nom, $query_select, $serveur = '', $requeter = true) {
804
-	if (!$query_select) {
805
-		return false;
806
-	}
807
-	// vue deja presente
808
-	if (sql_showtable($nom, false, $serveur)) {
809
-		spip_logger('mysql')->error("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)");
804
+    if (!$query_select) {
805
+        return false;
806
+    }
807
+    // vue deja presente
808
+    if (sql_showtable($nom, false, $serveur)) {
809
+        spip_logger('mysql')->error("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)");
810 810
 
811
-		return false;
812
-	}
811
+        return false;
812
+    }
813 813
 
814
-	$query = "CREATE VIEW $nom AS " . $query_select;
814
+    $query = "CREATE VIEW $nom AS " . $query_select;
815 815
 
816
-	return spip_mysql_query($query, $serveur, $requeter);
816
+    return spip_mysql_query($query, $serveur, $requeter);
817 817
 }
818 818
 
819 819
 
@@ -829,9 +829,9 @@  discard block
 block discarded – undo
829 829
  *     - true si la requête a réussie, false sinon
830 830
  */
831 831
 function spip_mysql_drop_table($table, $exist = false, $serveur = '', $requeter = true) {
832
-	$exist = (bool) $exist ? ' IF EXISTS' : '';
832
+    $exist = (bool) $exist ? ' IF EXISTS' : '';
833 833
 
834
-	return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter);
834
+    return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter);
835 835
 }
836 836
 
837 837
 /**
@@ -846,9 +846,9 @@  discard block
 block discarded – undo
846 846
  *     - true si la requête a réussie, false sinon
847 847
  */
848 848
 function spip_mysql_drop_view($view, $exist = false, $serveur = '', $requeter = true) {
849
-	$exist = (bool) $exist ? ' IF EXISTS' : '';
849
+    $exist = (bool) $exist ? ' IF EXISTS' : '';
850 850
 
851
-	return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter);
851
+    return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter);
852 852
 }
853 853
 
854 854
 /**
@@ -865,7 +865,7 @@  discard block
 block discarded – undo
865 865
  *     Ressource à utiliser avec sql_fetch()
866 866
  **/
867 867
 function spip_mysql_showbase($match, $serveur = '', $requeter = true) {
868
-	return spip_mysql_query('SHOW TABLES LIKE ' . _q($match), $serveur, $requeter);
868
+    return spip_mysql_query('SHOW TABLES LIKE ' . _q($match), $serveur, $requeter);
869 869
 }
870 870
 
871 871
 /**
@@ -881,18 +881,18 @@  discard block
 block discarded – undo
881 881
  *     - true si la requête a réussie, false sinon
882 882
  */
883 883
 function spip_mysql_repair($table, $serveur = '', $requeter = true) {
884
-	$table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = ' . _q($table), $serveur, true));
885
-	$engine = $table_status['Engine'];
886
-	if ($engine == 'InnoDB') {
887
-		if (spip_mysql_alter("TABLE $table ENGINE = InnoDB", $serveur, $requeter)) {
888
-			return [' OK '];
889
-		}
890
-	} elseif ($engine == 'MyISAM') {
891
-		return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
892
-	} else {
893
-		spip_logger('mysql')->debug("spip_mysql_repair impossible pour la table $table engine $engine");
894
-	}
895
-	return false;
884
+    $table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = ' . _q($table), $serveur, true));
885
+    $engine = $table_status['Engine'];
886
+    if ($engine == 'InnoDB') {
887
+        if (spip_mysql_alter("TABLE $table ENGINE = InnoDB", $serveur, $requeter)) {
888
+            return [' OK '];
889
+        }
890
+    } elseif ($engine == 'MyISAM') {
891
+        return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
892
+    } else {
893
+        spip_logger('mysql')->debug("spip_mysql_repair impossible pour la table $table engine $engine");
894
+    }
895
+    return false;
896 896
 }
897 897
 
898 898
 /**
@@ -910,12 +910,12 @@  discard block
 block discarded – undo
910 910
  *     - string : requete sql, si $requeter = true
911 911
  **/
912 912
 function spip_mysql_table_exists(string $table, $serveur = '', $requeter = true) {
913
-	$r = spip_mysql_query('SHOW TABLES LIKE ' . _q($table), $serveur, $requeter);
914
-	if (!$requeter) {
915
-		return $r;
916
-	}
917
-	$res = spip_mysql_fetch($r);
918
-	return (bool) $res;
913
+    $r = spip_mysql_query('SHOW TABLES LIKE ' . _q($table), $serveur, $requeter);
914
+    if (!$requeter) {
915
+        return $r;
916
+    }
917
+    $res = spip_mysql_fetch($r);
918
+    return (bool) $res;
919 919
 }
920 920
 
921 921
 define('_MYSQL_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -938,86 +938,86 @@  discard block
 block discarded – undo
938 938
  *     - array description de la table sinon
939 939
  */
940 940
 function spip_mysql_showtable($nom_table, $serveur = '', $requeter = true) {
941
-	$s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter);
942
-	if (!$s) {
943
-		return '';
944
-	}
945
-	if (!$requeter) {
946
-		return $s;
947
-	}
948
-
949
-	[, $a] = mysqli_fetch_array($s, MYSQLI_NUM);
950
-	if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)) {
951
-		$desc = $r[1];
952
-		// extraction d'une KEY éventuelle en prenant garde de ne pas
953
-		// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
954
-		if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
955
-			$namedkeys = $r[2];
956
-			$desc = $r[1];
957
-		} else {
958
-			$namedkeys = '';
959
-		}
960
-
961
-		$fields = [];
962
-		foreach (preg_split('/,\s*`/', $desc) as $v) {
963
-			preg_match('/^\s*`?([^`]*)`\s*(.*)/', $v, $r);
964
-			$fields[strtolower($r[1])] = $r[2];
965
-		}
966
-		$keys = [];
967
-
968
-		foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
969
-			if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
970
-				$k = str_replace('`', '', trim($r[1]));
971
-				$t = strtolower(str_replace('`', '', $r[2]));
972
-				if ($k && !isset($keys[$k])) {
973
-					$keys[$k] = $t;
974
-				} else {
975
-					$keys[] = $t;
976
-				}
977
-			}
978
-		}
979
-		spip_mysql_free($s);
980
-
981
-		return ['field' => $fields, 'key' => $keys];
982
-	}
983
-
984
-	$res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur);
985
-	if ($res) {
986
-		$nfields = [];
987
-		$nkeys = [];
988
-		while ($val = spip_mysql_fetch($res)) {
989
-			$nfields[$val['Field']] = $val['Type'];
990
-			if ($val['Null'] == 'NO') {
991
-				$nfields[$val['Field']] .= ' NOT NULL';
992
-			}
993
-			if ($val['Default'] === '0' || $val['Default']) {
994
-				if (preg_match('/[A-Z_]/', $val['Default'])) {
995
-					$nfields[$val['Field']] .= ' DEFAULT ' . $val['Default'];
996
-				} else {
997
-					$nfields[$val['Field']] .= " DEFAULT '" . $val['Default'] . "'";
998
-				}
999
-			}
1000
-			if ($val['Extra']) {
1001
-				$nfields[$val['Field']] .= ' ' . $val['Extra'];
1002
-			}
1003
-			if ($val['Key'] == 'PRI') {
1004
-				$nkeys['PRIMARY KEY'] = $val['Field'];
1005
-			} else {
1006
-				if ($val['Key'] == 'MUL') {
1007
-					$nkeys['KEY ' . $val['Field']] = $val['Field'];
1008
-				} else {
1009
-					if ($val['Key'] == 'UNI') {
1010
-						$nkeys['UNIQUE KEY ' . $val['Field']] = $val['Field'];
1011
-					}
1012
-				}
1013
-			}
1014
-		}
1015
-		spip_mysql_free($res);
1016
-
1017
-		return ['field' => $nfields, 'key' => $nkeys];
1018
-	}
1019
-
1020
-	return '';
941
+    $s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter);
942
+    if (!$s) {
943
+        return '';
944
+    }
945
+    if (!$requeter) {
946
+        return $s;
947
+    }
948
+
949
+    [, $a] = mysqli_fetch_array($s, MYSQLI_NUM);
950
+    if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)) {
951
+        $desc = $r[1];
952
+        // extraction d'une KEY éventuelle en prenant garde de ne pas
953
+        // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
954
+        if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
955
+            $namedkeys = $r[2];
956
+            $desc = $r[1];
957
+        } else {
958
+            $namedkeys = '';
959
+        }
960
+
961
+        $fields = [];
962
+        foreach (preg_split('/,\s*`/', $desc) as $v) {
963
+            preg_match('/^\s*`?([^`]*)`\s*(.*)/', $v, $r);
964
+            $fields[strtolower($r[1])] = $r[2];
965
+        }
966
+        $keys = [];
967
+
968
+        foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
969
+            if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
970
+                $k = str_replace('`', '', trim($r[1]));
971
+                $t = strtolower(str_replace('`', '', $r[2]));
972
+                if ($k && !isset($keys[$k])) {
973
+                    $keys[$k] = $t;
974
+                } else {
975
+                    $keys[] = $t;
976
+                }
977
+            }
978
+        }
979
+        spip_mysql_free($s);
980
+
981
+        return ['field' => $fields, 'key' => $keys];
982
+    }
983
+
984
+    $res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur);
985
+    if ($res) {
986
+        $nfields = [];
987
+        $nkeys = [];
988
+        while ($val = spip_mysql_fetch($res)) {
989
+            $nfields[$val['Field']] = $val['Type'];
990
+            if ($val['Null'] == 'NO') {
991
+                $nfields[$val['Field']] .= ' NOT NULL';
992
+            }
993
+            if ($val['Default'] === '0' || $val['Default']) {
994
+                if (preg_match('/[A-Z_]/', $val['Default'])) {
995
+                    $nfields[$val['Field']] .= ' DEFAULT ' . $val['Default'];
996
+                } else {
997
+                    $nfields[$val['Field']] .= " DEFAULT '" . $val['Default'] . "'";
998
+                }
999
+            }
1000
+            if ($val['Extra']) {
1001
+                $nfields[$val['Field']] .= ' ' . $val['Extra'];
1002
+            }
1003
+            if ($val['Key'] == 'PRI') {
1004
+                $nkeys['PRIMARY KEY'] = $val['Field'];
1005
+            } else {
1006
+                if ($val['Key'] == 'MUL') {
1007
+                    $nkeys['KEY ' . $val['Field']] = $val['Field'];
1008
+                } else {
1009
+                    if ($val['Key'] == 'UNI') {
1010
+                        $nkeys['UNIQUE KEY ' . $val['Field']] = $val['Field'];
1011
+                    }
1012
+                }
1013
+            }
1014
+        }
1015
+        spip_mysql_free($res);
1016
+
1017
+        return ['field' => $nfields, 'key' => $nkeys];
1018
+    }
1019
+
1020
+    return '';
1021 1021
 }
1022 1022
 
1023 1023
 
@@ -1036,13 +1036,13 @@  discard block
 block discarded – undo
1036 1036
  *     - false Erreur
1037 1037
  */
1038 1038
 function spip_mysql_fetch($r, $t = '', $serveur = '', $requeter = true) {
1039
-	if (!$t) {
1040
-		$t = \MYSQLI_ASSOC;
1041
-	}
1042
-	if ($r) {
1043
-		return mysqli_fetch_array($r, $t);
1044
-	}
1045
-	return false;
1039
+    if (!$t) {
1040
+        $t = \MYSQLI_ASSOC;
1041
+    }
1042
+    if ($r) {
1043
+        return mysqli_fetch_array($r, $t);
1044
+    }
1045
+    return false;
1046 1046
 }
1047 1047
 
1048 1048
 /**
@@ -1055,10 +1055,10 @@  discard block
 block discarded – undo
1055 1055
  * @return bool True si déplacement réussi, false sinon.
1056 1056
  **/
1057 1057
 function spip_mysql_seek($r, $row_number, $serveur = '', $requeter = true) {
1058
-	if ($r && mysqli_num_rows($r)) {
1059
-		return mysqli_data_seek($r, $row_number);
1060
-	}
1061
-	return false;
1058
+    if ($r && mysqli_num_rows($r)) {
1059
+        return mysqli_data_seek($r, $row_number);
1060
+    }
1061
+    return false;
1062 1062
 }
1063 1063
 
1064 1064
 
@@ -1076,26 +1076,26 @@  discard block
 block discarded – undo
1076 1076
  *     - int Nombre de lignes (0 si la requête n'a pas réussie)
1077 1077
  **/
1078 1078
 function spip_mysql_countsel(
1079
-	$from = [],
1080
-	$where = [],
1081
-	$groupby = '',
1082
-	$having = [],
1083
-	$serveur = '',
1084
-	$requeter = true
1079
+    $from = [],
1080
+    $where = [],
1081
+    $groupby = '',
1082
+    $having = [],
1083
+    $serveur = '',
1084
+    $requeter = true
1085 1085
 ) {
1086
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
1087
-
1088
-	$r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
1089
-	if (!$requeter) {
1090
-		return $r;
1091
-	}
1092
-	if (!$r instanceof mysqli_result) {
1093
-		return 0;
1094
-	}
1095
-	[$c] = mysqli_fetch_array($r, MYSQLI_NUM);
1096
-	mysqli_free_result($r);
1097
-
1098
-	return intval($c);
1086
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
1087
+
1088
+    $r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
1089
+    if (!$requeter) {
1090
+        return $r;
1091
+    }
1092
+    if (!$r instanceof mysqli_result) {
1093
+        return 0;
1094
+    }
1095
+    [$c] = mysqli_fetch_array($r, MYSQLI_NUM);
1096
+    mysqli_free_result($r);
1097
+
1098
+    return intval($c);
1099 1099
 }
1100 1100
 
1101 1101
 
@@ -1118,16 +1118,16 @@  discard block
 block discarded – undo
1118 1118
  *     Erreur eventuelle
1119 1119
  **/
1120 1120
 function spip_mysql_error($query = '', $serveur = '', $requeter = true) {
1121
-	$link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1122
-	$s = mysqli_error($link);
1123
-	if ($s) {
1124
-		$trace = debug_backtrace();
1125
-		if ($trace[0]['function'] != 'spip_mysql_error') {
1126
-			spip_logger('mysql')->error("$s - $query - " . sql_error_backtrace());
1127
-		}
1128
-	}
1129
-
1130
-	return $s;
1121
+    $link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1122
+    $s = mysqli_error($link);
1123
+    if ($s) {
1124
+        $trace = debug_backtrace();
1125
+        if ($trace[0]['function'] != 'spip_mysql_error') {
1126
+            spip_logger('mysql')->error("$s - $query - " . sql_error_backtrace());
1127
+        }
1128
+    }
1129
+
1130
+    return $s;
1131 1131
 }
1132 1132
 
1133 1133
 
@@ -1142,18 +1142,18 @@  discard block
 block discarded – undo
1142 1142
  *     0, pas d'erreur. Autre, numéro de l'erreur.
1143 1143
  **/
1144 1144
 function spip_mysql_errno($serveur = '', $requeter = true) {
1145
-	$link = $GLOBALS['connexions'][$serveur ?: 0]['link'];
1146
-	$s = mysqli_errno($link);
1147
-	// 2006 MySQL server has gone away
1148
-	// 2013 Lost connection to MySQL server during query
1149
-	if (in_array($s, [2006, 2013])) {
1150
-		define('spip_interdire_cache', true);
1151
-	}
1152
-	if ($s) {
1153
-		spip_logger('mysql')->error("Erreur mysql $s");
1154
-	}
1155
-
1156
-	return $s;
1145
+    $link = $GLOBALS['connexions'][$serveur ?: 0]['link'];
1146
+    $s = mysqli_errno($link);
1147
+    // 2006 MySQL server has gone away
1148
+    // 2013 Lost connection to MySQL server during query
1149
+    if (in_array($s, [2006, 2013])) {
1150
+        define('spip_interdire_cache', true);
1151
+    }
1152
+    if ($s) {
1153
+        spip_logger('mysql')->error("Erreur mysql $s");
1154
+    }
1155
+
1156
+    return $s;
1157 1157
 }
1158 1158
 
1159 1159
 
@@ -1167,9 +1167,9 @@  discard block
 block discarded – undo
1167 1167
  * @return int               Nombre de lignes
1168 1168
  */
1169 1169
 function spip_mysql_count($r, $serveur = '', $requeter = true) {
1170
-	if ($r) {
1171
-		return mysqli_num_rows($r);
1172
-	}
1170
+    if ($r) {
1171
+        return mysqli_num_rows($r);
1172
+    }
1173 1173
 }
1174 1174
 
1175 1175
 
@@ -1185,11 +1185,11 @@  discard block
 block discarded – undo
1185 1185
  * @return bool              True si réussi
1186 1186
  */
1187 1187
 function spip_mysql_free($r, $serveur = '', $requeter = true) {
1188
-	if ($r instanceof mysqli_result) {
1189
-		mysqli_free_result($r);
1190
-		return true;
1191
-	}
1192
-	return false;
1188
+    if ($r instanceof mysqli_result) {
1189
+        mysqli_free_result($r);
1190
+        return true;
1191
+    }
1192
+    return false;
1193 1193
 }
1194 1194
 
1195 1195
 
@@ -1217,59 +1217,59 @@  discard block
 block discarded – undo
1217 1217
  **/
1218 1218
 function spip_mysql_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1219 1219
 
1220
-	$e = null;
1221
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1222
-	$link = $connexion['link'];
1223
-	$table = prefixer_table_spip($table, $connexion['prefixe']);
1224
-
1225
-	// remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
1226
-	if (
1227
-		defined('_MYSQL_NOPLANES')
1228
-		&& _MYSQL_NOPLANES
1229
-		&& !empty($GLOBALS['meta']['charset_sql_connexion'])
1230
-		&& $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
1231
-	) {
1232
-		include_spip('inc/charsets');
1233
-		$valeurs = utf8_noplanes($valeurs);
1234
-	}
1235
-
1236
-	$query = "INSERT INTO $table $champs VALUES $valeurs";
1237
-	if (!$requeter) {
1238
-		return $query;
1239
-	}
1240
-
1241
-	if (isset($_GET['var_profile'])) {
1242
-		include_spip('public/tracer');
1243
-		$t = trace_query_start();
1244
-		$e = '';
1245
-	} else {
1246
-		$t = 0;
1247
-	}
1248
-
1249
-	$connexion['last'] = $query;
1250
-	#spip_logger('mysql')->debug($query);
1251
-	$r = false;
1252
-	$insert = false;
1253
-	try {
1254
-		$insert = mysqli_query($link, $query);
1255
-	} catch (\mysqli_sql_exception $e) {
1256
-		spip_logger('mysql')->debug('mysqli_sql_exception: ' . $e->getMessage());
1257
-		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
1258
-		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
1259
-	}
1260
-	if ($insert) {
1261
-		$r = mysqli_insert_id($link);
1262
-	} else {
1263
-		// Log de l'erreur eventuelle
1264
-		if ($e = spip_mysql_errno($serveur)) {
1265
-			// et du fautif
1266
-			$e .= spip_mysql_error($query, $serveur);
1267
-		}
1268
-	}
1269
-
1270
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
1271
-
1272
-	// return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base.
1220
+    $e = null;
1221
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1222
+    $link = $connexion['link'];
1223
+    $table = prefixer_table_spip($table, $connexion['prefixe']);
1224
+
1225
+    // remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
1226
+    if (
1227
+        defined('_MYSQL_NOPLANES')
1228
+        && _MYSQL_NOPLANES
1229
+        && !empty($GLOBALS['meta']['charset_sql_connexion'])
1230
+        && $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
1231
+    ) {
1232
+        include_spip('inc/charsets');
1233
+        $valeurs = utf8_noplanes($valeurs);
1234
+    }
1235
+
1236
+    $query = "INSERT INTO $table $champs VALUES $valeurs";
1237
+    if (!$requeter) {
1238
+        return $query;
1239
+    }
1240
+
1241
+    if (isset($_GET['var_profile'])) {
1242
+        include_spip('public/tracer');
1243
+        $t = trace_query_start();
1244
+        $e = '';
1245
+    } else {
1246
+        $t = 0;
1247
+    }
1248
+
1249
+    $connexion['last'] = $query;
1250
+    #spip_logger('mysql')->debug($query);
1251
+    $r = false;
1252
+    $insert = false;
1253
+    try {
1254
+        $insert = mysqli_query($link, $query);
1255
+    } catch (\mysqli_sql_exception $e) {
1256
+        spip_logger('mysql')->debug('mysqli_sql_exception: ' . $e->getMessage());
1257
+        // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
1258
+        // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
1259
+    }
1260
+    if ($insert) {
1261
+        $r = mysqli_insert_id($link);
1262
+    } else {
1263
+        // Log de l'erreur eventuelle
1264
+        if ($e = spip_mysql_errno($serveur)) {
1265
+            // et du fautif
1266
+            $e .= spip_mysql_error($query, $serveur);
1267
+        }
1268
+    }
1269
+
1270
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
1271
+
1272
+    // return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base.
1273 1273
 }
1274 1274
 
1275 1275
 /**
@@ -1294,26 +1294,26 @@  discard block
 block discarded – undo
1294 1294
  **/
1295 1295
 function spip_mysql_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
1296 1296
 
1297
-	if (!$desc) {
1298
-		$desc = description_table($table, $serveur);
1299
-	}
1300
-	if (!$desc) {
1301
-		$couples = [];
1302
-	}
1303
-	$fields = $desc['field'] ?? [];
1304
-
1305
-	foreach ($couples as $champ => $val) {
1306
-		$couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1307
-	}
1308
-
1309
-	return spip_mysql_insert(
1310
-		$table,
1311
-		'(' . join(',', array_keys($couples)) . ')',
1312
-		'(' . join(',', $couples) . ')',
1313
-		$desc,
1314
-		$serveur,
1315
-		$requeter
1316
-	);
1297
+    if (!$desc) {
1298
+        $desc = description_table($table, $serveur);
1299
+    }
1300
+    if (!$desc) {
1301
+        $couples = [];
1302
+    }
1303
+    $fields = $desc['field'] ?? [];
1304
+
1305
+    foreach ($couples as $champ => $val) {
1306
+        $couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1307
+    }
1308
+
1309
+    return spip_mysql_insert(
1310
+        $table,
1311
+        '(' . join(',', array_keys($couples)) . ')',
1312
+        '(' . join(',', $couples) . ')',
1313
+        $desc,
1314
+        $serveur,
1315
+        $requeter
1316
+    );
1317 1317
 }
1318 1318
 
1319 1319
 
@@ -1338,34 +1338,34 @@  discard block
 block discarded – undo
1338 1338
  **/
1339 1339
 function spip_mysql_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
1340 1340
 
1341
-	if (!$desc) {
1342
-		$desc = description_table($table, $serveur);
1343
-	}
1344
-	if (!$desc) {
1345
-		$tab_couples = [];
1346
-	}
1347
-	$fields = $desc['field'] ?? [];
1348
-
1349
-	$cles = '(' . join(',', array_keys(reset($tab_couples))) . ')';
1350
-	$valeurs = [];
1351
-	$r = false;
1352
-
1353
-	// Quoter et Inserer par groupes de 100 max pour eviter un debordement de pile
1354
-	foreach ($tab_couples as $couples) {
1355
-		foreach ($couples as $champ => $val) {
1356
-			$couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1357
-		}
1358
-		$valeurs[] = '(' . join(',', $couples) . ')';
1359
-		if (count($valeurs) >= 100) {
1360
-			$r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1361
-			$valeurs = [];
1362
-		}
1363
-	}
1364
-	if (count($valeurs)) {
1365
-		$r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1366
-	}
1367
-
1368
-	return $r; // dans le cas d'une table auto_increment, le dernier insert_id
1341
+    if (!$desc) {
1342
+        $desc = description_table($table, $serveur);
1343
+    }
1344
+    if (!$desc) {
1345
+        $tab_couples = [];
1346
+    }
1347
+    $fields = $desc['field'] ?? [];
1348
+
1349
+    $cles = '(' . join(',', array_keys(reset($tab_couples))) . ')';
1350
+    $valeurs = [];
1351
+    $r = false;
1352
+
1353
+    // Quoter et Inserer par groupes de 100 max pour eviter un debordement de pile
1354
+    foreach ($tab_couples as $couples) {
1355
+        foreach ($couples as $champ => $val) {
1356
+            $couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1357
+        }
1358
+        $valeurs[] = '(' . join(',', $couples) . ')';
1359
+        if (count($valeurs) >= 100) {
1360
+            $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1361
+            $valeurs = [];
1362
+        }
1363
+    }
1364
+    if (count($valeurs)) {
1365
+        $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1366
+    }
1367
+
1368
+    return $r; // dans le cas d'une table auto_increment, le dernier insert_id
1369 1369
 }
1370 1370
 
1371 1371
 /**
@@ -1390,20 +1390,20 @@  discard block
 block discarded – undo
1390 1390
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1391 1391
  */
1392 1392
 function spip_mysql_update($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1393
-	$set = [];
1394
-	foreach ($champs as $champ => $val) {
1395
-		$set[] = $champ . "=$val";
1396
-	}
1397
-	if (!empty($set)) {
1398
-		return spip_mysql_query(
1399
-			calculer_mysql_expression('UPDATE', $table, ',')
1400
-			. calculer_mysql_expression('SET', $set, ',')
1401
-			. calculer_mysql_expression('WHERE', $where),
1402
-			$serveur,
1403
-			$requeter
1404
-		);
1405
-	}
1406
-	return false;
1393
+    $set = [];
1394
+    foreach ($champs as $champ => $val) {
1395
+        $set[] = $champ . "=$val";
1396
+    }
1397
+    if (!empty($set)) {
1398
+        return spip_mysql_query(
1399
+            calculer_mysql_expression('UPDATE', $table, ',')
1400
+            . calculer_mysql_expression('SET', $set, ',')
1401
+            . calculer_mysql_expression('WHERE', $where),
1402
+            $serveur,
1403
+            $requeter
1404
+        );
1405
+    }
1406
+    return false;
1407 1407
 }
1408 1408
 
1409 1409
 /**
@@ -1436,29 +1436,29 @@  discard block
 block discarded – undo
1436 1436
  */
1437 1437
 function spip_mysql_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1438 1438
 
1439
-	if (!$champs) {
1440
-		return;
1441
-	}
1442
-	if (!$desc) {
1443
-		$desc = description_table($table, $serveur);
1444
-	}
1445
-	if (!$desc) {
1446
-		$champs = [];
1447
-	} else {
1448
-		$fields = $desc['field'];
1449
-	}
1450
-	$set = [];
1451
-	foreach ($champs as $champ => $val) {
1452
-		$set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]);
1453
-	}
1454
-
1455
-	return spip_mysql_query(
1456
-		calculer_mysql_expression('UPDATE', $table, ',')
1457
-		. calculer_mysql_expression('SET', $set, ',')
1458
-		. calculer_mysql_expression('WHERE', $where),
1459
-		$serveur,
1460
-		$requeter
1461
-	);
1439
+    if (!$champs) {
1440
+        return;
1441
+    }
1442
+    if (!$desc) {
1443
+        $desc = description_table($table, $serveur);
1444
+    }
1445
+    if (!$desc) {
1446
+        $champs = [];
1447
+    } else {
1448
+        $fields = $desc['field'];
1449
+    }
1450
+    $set = [];
1451
+    foreach ($champs as $champ => $val) {
1452
+        $set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]);
1453
+    }
1454
+
1455
+    return spip_mysql_query(
1456
+        calculer_mysql_expression('UPDATE', $table, ',')
1457
+        . calculer_mysql_expression('SET', $set, ',')
1458
+        . calculer_mysql_expression('WHERE', $where),
1459
+        $serveur,
1460
+        $requeter
1461
+    );
1462 1462
 }
1463 1463
 
1464 1464
 /**
@@ -1474,22 +1474,22 @@  discard block
 block discarded – undo
1474 1474
  *     - false en cas d'erreur.
1475 1475
  **/
1476 1476
 function spip_mysql_delete($table, $where = '', $serveur = '', $requeter = true) {
1477
-	$res = spip_mysql_query(
1478
-		calculer_mysql_expression('DELETE FROM', $table, ',')
1479
-		. calculer_mysql_expression('WHERE', $where),
1480
-		$serveur,
1481
-		$requeter
1482
-	);
1483
-	if (!$requeter) {
1484
-		return $res;
1485
-	}
1486
-	if ($res) {
1487
-		$link = _mysql_link($serveur);
1488
-
1489
-		return mysqli_affected_rows($link);
1490
-	} else {
1491
-		return false;
1492
-	}
1477
+    $res = spip_mysql_query(
1478
+        calculer_mysql_expression('DELETE FROM', $table, ',')
1479
+        . calculer_mysql_expression('WHERE', $where),
1480
+        $serveur,
1481
+        $requeter
1482
+    );
1483
+    if (!$requeter) {
1484
+        return $res;
1485
+    }
1486
+    if ($res) {
1487
+        $link = _mysql_link($serveur);
1488
+
1489
+        return mysqli_affected_rows($link);
1490
+    } else {
1491
+        return false;
1492
+    }
1493 1493
 }
1494 1494
 
1495 1495
 
@@ -1518,10 +1518,10 @@  discard block
 block discarded – undo
1518 1518
  *     - false en cas d'erreur.
1519 1519
  **/
1520 1520
 function spip_mysql_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1521
-	return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1522
-		',',
1523
-		array_map('_q', $couples)
1524
-	) . ')', $serveur, $requeter);
1521
+    return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1522
+        ',',
1523
+        array_map('_q', $couples)
1524
+    ) . ')', $serveur, $requeter);
1525 1525
 }
1526 1526
 
1527 1527
 
@@ -1550,14 +1550,14 @@  discard block
 block discarded – undo
1550 1550
  *     - false en cas d'erreur.
1551 1551
  **/
1552 1552
 function spip_mysql_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1553
-	$cles = '(' . join(',', array_keys($tab_couples[0])) . ')';
1554
-	$valeurs = [];
1555
-	foreach ($tab_couples as $couples) {
1556
-		$valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')';
1557
-	}
1558
-	$valeurs = implode(', ', $valeurs);
1559
-
1560
-	return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
1553
+    $cles = '(' . join(',', array_keys($tab_couples[0])) . ')';
1554
+    $valeurs = [];
1555
+    foreach ($tab_couples as $couples) {
1556
+        $valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')';
1557
+    }
1558
+    $valeurs = implode(', ', $valeurs);
1559
+
1560
+    return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
1561 1561
 }
1562 1562
 
1563 1563
 
@@ -1572,32 +1572,32 @@  discard block
 block discarded – undo
1572 1572
  * @return string       texte de sélection pour la requête
1573 1573
  */
1574 1574
 function spip_mysql_multi($objet, $lang) {
1575
-	$lengthlang = strlen("[$lang]");
1576
-	$posmulti = 'INSTR(' . $objet . ", '<multi>')";
1577
-	$posfinmulti = 'INSTR(' . $objet . ", '</multi>')";
1578
-	$debutchaine = 'LEFT(' . $objet . ", $posmulti-1)";
1579
-	$finchaine = 'RIGHT(' . $objet . ', CHAR_LENGTH(' . $objet . ") -(7+$posfinmulti))";
1580
-	$chainemulti = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1581
-	$poslang = "INSTR($chainemulti,'[" . $lang . "]')";
1582
-	$poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
1583
-	$chainelang = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1584
-	$posfinlang = 'INSTR(' . $chainelang . ", '[')";
1585
-	$chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
1586
-	//$chainelang = "LEFT($chainelang,$posfinlang-1)";
1587
-	$retour = "(TRIM(IF($posmulti = 0 , " .
1588
-		'     TRIM(' . $objet . '), ' .
1589
-		'     CONCAT( ' .
1590
-		"          $debutchaine, " .
1591
-		'          IF( ' .
1592
-		"               $poslang = 0, " .
1593
-		"                     $chainemulti, " .
1594
-		"               $chainelang" .
1595
-		'          ), ' .
1596
-		"          $finchaine" .
1597
-		'     ) ' .
1598
-		'))) AS multi';
1599
-
1600
-	return $retour;
1575
+    $lengthlang = strlen("[$lang]");
1576
+    $posmulti = 'INSTR(' . $objet . ", '<multi>')";
1577
+    $posfinmulti = 'INSTR(' . $objet . ", '</multi>')";
1578
+    $debutchaine = 'LEFT(' . $objet . ", $posmulti-1)";
1579
+    $finchaine = 'RIGHT(' . $objet . ', CHAR_LENGTH(' . $objet . ") -(7+$posfinmulti))";
1580
+    $chainemulti = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1581
+    $poslang = "INSTR($chainemulti,'[" . $lang . "]')";
1582
+    $poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
1583
+    $chainelang = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1584
+    $posfinlang = 'INSTR(' . $chainelang . ", '[')";
1585
+    $chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
1586
+    //$chainelang = "LEFT($chainelang,$posfinlang-1)";
1587
+    $retour = "(TRIM(IF($posmulti = 0 , " .
1588
+        '     TRIM(' . $objet . '), ' .
1589
+        '     CONCAT( ' .
1590
+        "          $debutchaine, " .
1591
+        '          IF( ' .
1592
+        "               $poslang = 0, " .
1593
+        "                     $chainemulti, " .
1594
+        "               $chainelang" .
1595
+        '          ), ' .
1596
+        "          $finchaine" .
1597
+        '     ) ' .
1598
+        '))) AS multi';
1599
+
1600
+    return $retour;
1601 1601
 }
1602 1602
 
1603 1603
 /**
@@ -1611,7 +1611,7 @@  discard block
 block discarded – undo
1611 1611
  *     Valeur hexadécimale pour MySQL
1612 1612
  **/
1613 1613
 function spip_mysql_hex($v) {
1614
-	return '0x' . $v;
1614
+    return '0x' . $v;
1615 1615
 }
1616 1616
 
1617 1617
 /**
@@ -1627,15 +1627,15 @@  discard block
 block discarded – undo
1627 1627
  *    Donnée prête à être utilisée par le gestionnaire SQL
1628 1628
  */
1629 1629
 function spip_mysql_quote($v, $type = '') {
1630
-	if (!is_array($v)) {
1631
-		return spip_mysql_cite($v, $type);
1632
-	}
1633
-
1634
-	// si c'est un tableau, le parcourir en propageant le type
1635
-	foreach ($v as $k => $r) {
1636
-		$v[$k] = spip_mysql_quote($r, $type);
1637
-	}
1638
-	return implode(',', $v);
1630
+    if (!is_array($v)) {
1631
+        return spip_mysql_cite($v, $type);
1632
+    }
1633
+
1634
+    // si c'est un tableau, le parcourir en propageant le type
1635
+    foreach ($v as $k => $r) {
1636
+        $v[$k] = spip_mysql_quote($r, $type);
1637
+    }
1638
+    return implode(',', $v);
1639 1639
 }
1640 1640
 
1641 1641
 /**
@@ -1651,18 +1651,18 @@  discard block
 block discarded – undo
1651 1651
  *     Expression SQL
1652 1652
  **/
1653 1653
 function spip_mysql_date_proche($champ, $interval, $unite) {
1654
-	$use_now = ( ($champ === 'maj' || strpos($champ, '.maj')) ? true : false );
1655
-	return '('
1656
-	. $champ
1657
-	. (($interval <= 0) ? '>' : '<')
1658
-	. (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1659
-	. '('
1660
-	. ($use_now ? 'NOW()' : sql_quote(date('Y-m-d H:i:s')))
1661
-	. ', INTERVAL '
1662
-	. (($interval > 0) ? $interval : (0 - $interval))
1663
-	. ' '
1664
-	. $unite
1665
-	. '))';
1654
+    $use_now = ( ($champ === 'maj' || strpos($champ, '.maj')) ? true : false );
1655
+    return '('
1656
+    . $champ
1657
+    . (($interval <= 0) ? '>' : '<')
1658
+    . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1659
+    . '('
1660
+    . ($use_now ? 'NOW()' : sql_quote(date('Y-m-d H:i:s')))
1661
+    . ', INTERVAL '
1662
+    . (($interval > 0) ? $interval : (0 - $interval))
1663
+    . ' '
1664
+    . $unite
1665
+    . '))';
1666 1666
 }
1667 1667
 
1668 1668
 
@@ -1686,7 +1686,7 @@  discard block
 block discarded – undo
1686 1686
  *     Expression de requête SQL
1687 1687
  **/
1688 1688
 function spip_mysql_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1689
-	return "($val $not IN ($valeurs))";
1689
+    return "($val $not IN ($valeurs))";
1690 1690
 }
1691 1691
 
1692 1692
 
@@ -1698,39 +1698,39 @@  discard block
 block discarded – undo
1698 1698
  * @return string|number     texte ou nombre échappé
1699 1699
  */
1700 1700
 function spip_mysql_cite($v, $type) {
1701
-	if (!$type) {
1702
-		if (is_bool($v)) {
1703
-			return strval(intval($v));
1704
-		} elseif (is_numeric($v)) {
1705
-			return strval($v);
1706
-		} elseif ($v === null) {
1707
-			return "''";
1708
-		}
1709
-		return "'" . addslashes($v) . "'";
1710
-	}
1711
-
1712
-	if ($v === null) {
1713
-		if (stripos($type, 'NOT NULL') === false) {
1714
-			// null php se traduit en NULL SQL
1715
-			return 'NULL';
1716
-		} else {
1717
-			return "''";
1718
-		}
1719
-	} elseif (sql_test_date($type) && preg_match('/^\w+\(/', $v)) {
1720
-		return $v;
1721
-	} elseif (sql_test_int($type)) {
1722
-		if (
1723
-			is_numeric($v)
1724
-			|| $v && ctype_xdigit(substr($v, 2)) && $v[0] === '0' && $v[1] === 'x'
1725
-		) {
1726
-			return $v;
1727
-		} else {
1728
-			// si pas numerique, forcer le intval
1729
-			return intval($v);
1730
-		}
1731
-	}
1732
-
1733
-	return ("'" . addslashes($v) . "'");
1701
+    if (!$type) {
1702
+        if (is_bool($v)) {
1703
+            return strval(intval($v));
1704
+        } elseif (is_numeric($v)) {
1705
+            return strval($v);
1706
+        } elseif ($v === null) {
1707
+            return "''";
1708
+        }
1709
+        return "'" . addslashes($v) . "'";
1710
+    }
1711
+
1712
+    if ($v === null) {
1713
+        if (stripos($type, 'NOT NULL') === false) {
1714
+            // null php se traduit en NULL SQL
1715
+            return 'NULL';
1716
+        } else {
1717
+            return "''";
1718
+        }
1719
+    } elseif (sql_test_date($type) && preg_match('/^\w+\(/', $v)) {
1720
+        return $v;
1721
+    } elseif (sql_test_int($type)) {
1722
+        if (
1723
+            is_numeric($v)
1724
+            || $v && ctype_xdigit(substr($v, 2)) && $v[0] === '0' && $v[1] === 'x'
1725
+        ) {
1726
+            return $v;
1727
+        } else {
1728
+            // si pas numerique, forcer le intval
1729
+            return intval($v);
1730
+        }
1731
+    }
1732
+
1733
+    return ("'" . addslashes($v) . "'");
1734 1734
 }
1735 1735
 
1736 1736
 /**
@@ -1740,7 +1740,7 @@  discard block
 block discarded – undo
1740 1740
  *     True si on a les fonctions, false sinon
1741 1741
  */
1742 1742
 function spip_versions_mysql() {
1743
-	return function_exists('mysqli_query');
1743
+    return function_exists('mysqli_query');
1744 1744
 }
1745 1745
 
1746 1746
 
@@ -1753,20 +1753,20 @@  discard block
 block discarded – undo
1753 1753
  *     - chaîne : code compilé pour le faire désactiver par SPIP sinon
1754 1754
  */
1755 1755
 function test_rappel_nom_base_mysql($server_db) {
1756
-	$GLOBALS['mysql_rappel_nom_base'] = true;
1757
-	sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1758
-	$ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db);
1756
+    $GLOBALS['mysql_rappel_nom_base'] = true;
1757
+    sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1758
+    $ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db);
1759 1759
 
1760
-	if ($ok) {
1761
-		sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1760
+    if ($ok) {
1761
+        sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1762 1762
 
1763
-		return '';
1764
-	} else {
1765
-		$GLOBALS['mysql_rappel_nom_base'] = false;
1763
+        return '';
1764
+    } else {
1765
+        $GLOBALS['mysql_rappel_nom_base'] = false;
1766 1766
 
1767
-		return "\$GLOBALS['mysql_rappel_nom_base'] = false; " .
1768
-		"/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
1769
-	}
1767
+        return "\$GLOBALS['mysql_rappel_nom_base'] = false; " .
1768
+        "/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
1769
+    }
1770 1770
 }
1771 1771
 
1772 1772
 /**
@@ -1780,13 +1780,13 @@  discard block
 block discarded – undo
1780 1780
  *     - chaîne : code compilé pour l'indiquer le résultat du test à SPIP
1781 1781
  */
1782 1782
 function test_sql_mode_mysql($server_db) {
1783
-	$res = sql_select('version() as v', '', '', '', '', '', '', $server_db);
1784
-	$row = sql_fetch($res, $server_db);
1785
-	if (version_compare($row['v'], '5.0.0', '>=')) {
1786
-		defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE', true);
1783
+    $res = sql_select('version() as v', '', '', '', '', '', '', $server_db);
1784
+    $row = sql_fetch($res, $server_db);
1785
+    if (version_compare($row['v'], '5.0.0', '>=')) {
1786
+        defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE', true);
1787 1787
 
1788
-		return "defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);\n";
1789
-	}
1788
+        return "defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);\n";
1789
+    }
1790 1790
 
1791
-	return '';
1791
+    return '';
1792 1792
 }
Please login to merge, or discard this patch.
Spacing   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -59,12 +59,12 @@  discard block
 block discarded – undo
59 59
 			$link = @mysqli_connect($host, $login, $pass);
60 60
 		}
61 61
 	} catch (\mysqli_sql_exception $e) {
62
-		$logger->debug('mysqli_sql_exception: ' . $e->getMessage());
62
+		$logger->debug('mysqli_sql_exception: '.$e->getMessage());
63 63
 		$link = false;
64 64
 	}
65 65
 
66 66
 	if (!$link) {
67
-		$logger->emergency('Echec mysqli_connect. Erreur : ' . mysqli_connect_error());
67
+		$logger->emergency('Echec mysqli_connect. Erreur : '.mysqli_connect_error());
68 68
 
69 69
 		return false;
70 70
 	}
@@ -83,7 +83,7 @@  discard block
 block discarded – undo
83 83
 	}
84 84
 
85 85
 	$logger->debug(
86
-		"Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? 'operationnelle' : 'impossible'),
86
+		"Connexion MySQLi vers $host, base $db, prefixe $prefixe ".($ok ? 'operationnelle' : 'impossible'),
87 87
 	);
88 88
 
89 89
 	return !$ok ? false : [
@@ -173,9 +173,9 @@  discard block
 block discarded – undo
173 173
  */
174 174
 function spip_mysql_set_charset($charset, $serveur = '', $requeter = true) {
175 175
 	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
176
-	spip_logger('mysql')->debug('changement de charset sql : ' . 'SET NAMES ' . _q($charset));
176
+	spip_logger('mysql')->debug('changement de charset sql : '.'SET NAMES '._q($charset));
177 177
 
178
-	return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES ' . _q($charset));
178
+	return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES '._q($charset));
179 179
 }
180 180
 
181 181
 
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
 function spip_mysql_get_charset($charset = [], $serveur = '', $requeter = true) {
191 191
 	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
192 192
 	$connexion['last'] = $c = 'SHOW CHARACTER SET'
193
-		. (!$charset ? '' : (' LIKE ' . _q($charset['charset'])));
193
+		. (!$charset ? '' : (' LIKE '._q($charset['charset'])));
194 194
 
195 195
 	return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur);
196 196
 }
@@ -234,21 +234,21 @@  discard block
 block discarded – undo
234 234
 	$debug = '';
235 235
 	if (defined('_DEBUG_SLOW_QUERIES') && _DEBUG_SLOW_QUERIES) {
236 236
 		if (isset($GLOBALS['debug']['aucasou'])) {
237
-			[, $id, , $infos] = $GLOBALS['debug']['aucasou'];
238
-			$debug .= "BOUCLE$id @ " . ($infos[0] ?? '') . ' | ';
237
+			[, $id,, $infos] = $GLOBALS['debug']['aucasou'];
238
+			$debug .= "BOUCLE$id @ ".($infos[0] ?? '').' | ';
239 239
 		}
240 240
 		if (isset($_SERVER['REQUEST_URI'])) {
241 241
 			$debug .= $_SERVER['REQUEST_URI'];
242 242
 		}
243 243
 		if (!empty($GLOBALS['ip'])) {
244
-			$debug .= ' + ' . $GLOBALS['ip'];
244
+			$debug .= ' + '.$GLOBALS['ip'];
245 245
 		}
246
-		$debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
246
+		$debug = ' /* '.mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)).' */';
247 247
 	}
248 248
 	try {
249
-		$r = mysqli_query($link, $query . $debug);
249
+		$r = mysqli_query($link, $query.$debug);
250 250
 	} catch (\mysqli_sql_exception $e) {
251
-		spip_logger('mysql')->debug('mysqli_sql_exception: ' . $e->getMessage());
251
+		spip_logger('mysql')->debug('mysqli_sql_exception: '.$e->getMessage());
252 252
 		$r = false;
253 253
 		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
254 254
 		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
@@ -266,9 +266,9 @@  discard block
 block discarded – undo
266 266
 			$link = $connexion['link'];
267 267
 			//On retente au cas où
268 268
 			try {
269
-				$r = mysqli_query($link, $query . $debug);
269
+				$r = mysqli_query($link, $query.$debug);
270 270
 			} catch (\mysqli_sql_exception $e) {
271
-				spip_logger('mysql')->debug('mysqli_sql_exception: ' . $e->getMessage());
271
+				spip_logger('mysql')->debug('mysqli_sql_exception: '.$e->getMessage());
272 272
 				$r = false;
273 273
 				// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
274 274
 				// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
@@ -301,7 +301,7 @@  discard block
 block discarded – undo
301 301
 	// d'utiliser ceux-ci, copie-colle de phpmyadmin
302 302
 	$query = preg_replace(',^TABLE\s*`([^`]*)`,i', "TABLE \\1", $query);
303 303
 
304
-	return spip_mysql_query('ALTER ' . $query, $serveur, $requeter); # i.e. que PG se debrouille
304
+	return spip_mysql_query('ALTER '.$query, $serveur, $requeter); # i.e. que PG se debrouille
305 305
 }
306 306
 
307 307
 
@@ -314,7 +314,7 @@  discard block
 block discarded – undo
314 314
  * @return bool            Toujours true
315 315
  */
316 316
 function spip_mysql_optimize($table, $serveur = '', $requeter = true) {
317
-	spip_mysql_query('OPTIMIZE TABLE ' . $table);
317
+	spip_mysql_query('OPTIMIZE TABLE '.$table);
318 318
 
319 319
 	return true;
320 320
 }
@@ -337,7 +337,7 @@  discard block
 block discarded – undo
337 337
 	$link = $connexion['link'];
338 338
 	$db = $connexion['db'];
339 339
 
340
-	$query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe);
340
+	$query = 'EXPLAIN '._mysql_traite_query($query, $db, $prefixe);
341 341
 	$r = mysqli_query($link, $query);
342 342
 
343 343
 	return spip_mysql_fetch($r, null, $serveur);
@@ -388,7 +388,7 @@  discard block
 block discarded – undo
388 388
 		. calculer_mysql_expression('WHERE', $where)
389 389
 		. calculer_mysql_expression('GROUP BY', $groupby, ',')
390 390
 		. calculer_mysql_expression('HAVING', $having)
391
-		. ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '')
391
+		. ($orderby ? ("\nORDER BY ".spip_mysql_order($orderby)) : '')
392 392
 		. ($limit ? "\nLIMIT $limit" : '');
393 393
 
394 394
 	// renvoyer la requete inerte si demandee
@@ -478,12 +478,12 @@  discard block
 block discarded – undo
478 478
 	$exp = "\n$expression ";
479 479
 
480 480
 	if (!is_array($v)) {
481
-		return $exp . $v;
481
+		return $exp.$v;
482 482
 	} else {
483 483
 		if (strtoupper($join) === 'AND') {
484
-			return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
484
+			return $exp.join("\n\t$join ", array_map('calculer_mysql_where', $v));
485 485
 		} else {
486
-			return $exp . join($join, $v);
486
+			return $exp.join($join, $v);
487 487
 		}
488 488
 	}
489 489
 }
@@ -501,17 +501,17 @@  discard block
 block discarded – undo
501 501
 		if (str_ends_with($k, '@')) {
502 502
 			// c'est une jointure qui se refere au from precedent
503 503
 			// pas de virgule
504
-			$res .= '  ' . $v;
504
+			$res .= '  '.$v;
505 505
 		} else {
506 506
 			if (!is_numeric($k)) {
507 507
 				$p = strpos($v, ' ');
508 508
 				if ($p) {
509
-					$v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p);
509
+					$v = substr($v, 0, $p)." AS `$k`".substr($v, $p);
510 510
 				} else {
511 511
 					$v .= " AS `$k`";
512 512
 				}
513 513
 			}
514
-			$res .= ', ' . $v;
514
+			$res .= ', '.$v;
515 515
 		}
516 516
 	}
517 517
 
@@ -541,13 +541,13 @@  discard block
 block discarded – undo
541 541
 function _mysql_traite_query($query, $db = '', $prefixe = '', $echappe_textes = true) {
542 542
 
543 543
 	if ($GLOBALS['mysql_rappel_nom_base'] && $db) {
544
-		$pref = '`' . $db . '`.';
544
+		$pref = '`'.$db.'`.';
545 545
 	} else {
546 546
 		$pref = '';
547 547
 	}
548 548
 
549 549
 	if ($prefixe) {
550
-		$pref .= $prefixe . '_';
550
+		$pref .= $prefixe.'_';
551 551
 	}
552 552
 
553 553
 	if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
@@ -566,7 +566,7 @@  discard block
 block discarded – undo
566 566
 				$suite_echap = $suite;
567 567
 			}
568 568
 			if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
569
-				$suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
569
+				$suite_echap = $r[1]._mysql_traite_query($r[2], $db, $prefixe, false);
570 570
 				if ($echappe_textes) {
571 571
 					$suite = query_reinjecte_textes($suite_echap, $textes);
572 572
 				}
@@ -576,7 +576,7 @@  discard block
 block discarded – undo
576 576
 			}
577 577
 		}
578 578
 	}
579
-	$r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
579
+	$r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1'.$pref, $query).$suite;
580 580
 
581 581
 	// en option, remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
582 582
 	// remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
@@ -616,7 +616,7 @@  discard block
 block discarded – undo
616 616
 		$ok = false;
617 617
 	}
618 618
 	if (!$ok) {
619
-		spip_logger('mysql')->critical('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link));
619
+		spip_logger('mysql')->critical('Echec mysqli_selectdb. Erreur : '.mysqli_error($link));
620 620
 	}
621 621
 
622 622
 	return $ok;
@@ -706,10 +706,10 @@  discard block
 block discarded – undo
706 706
 
707 707
 	$character_set = '';
708 708
 	if (@$GLOBALS['meta']['charset_sql_base']) {
709
-		$character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
709
+		$character_set .= ' CHARACTER SET '.$GLOBALS['meta']['charset_sql_base'];
710 710
 	}
711 711
 	if (@$GLOBALS['meta']['charset_collation_sql_base']) {
712
-		$character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
712
+		$character_set .= ' COLLATE '.$GLOBALS['meta']['charset_collation_sql_base'];
713 713
 	}
714 714
 
715 715
 	foreach ($champs as $k => $v) {
@@ -719,7 +719,7 @@  discard block
 block discarded – undo
719 719
 				preg_match(',(char|text),i', $defs[1])
720 720
 				&& !preg_match(',(binary|CHARACTER|COLLATE),i', $v)
721 721
 			) {
722
-				$v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
722
+				$v = $defs[1].$character_set.' '.substr($v, strlen($defs[1]));
723 723
 			}
724 724
 		}
725 725
 
@@ -731,8 +731,8 @@  discard block
 block discarded – undo
731 731
 		$s = ',';
732 732
 	}
733 733
 	$temporary = $temporary ? 'TEMPORARY' : '';
734
-	$q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
735
-		. (defined('_MYSQL_ENGINE') ? ' ENGINE=' . _MYSQL_ENGINE : '')
734
+	$q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query".($keys ? ",$keys" : '').')'
735
+		. (defined('_MYSQL_ENGINE') ? ' ENGINE='._MYSQL_ENGINE : '')
736 736
 		. ($character_set ? " DEFAULT $character_set" : '')
737 737
 		. "\n";
738 738
 
@@ -811,7 +811,7 @@  discard block
 block discarded – undo
811 811
 		return false;
812 812
 	}
813 813
 
814
-	$query = "CREATE VIEW $nom AS " . $query_select;
814
+	$query = "CREATE VIEW $nom AS ".$query_select;
815 815
 
816 816
 	return spip_mysql_query($query, $serveur, $requeter);
817 817
 }
@@ -865,7 +865,7 @@  discard block
 block discarded – undo
865 865
  *     Ressource à utiliser avec sql_fetch()
866 866
  **/
867 867
 function spip_mysql_showbase($match, $serveur = '', $requeter = true) {
868
-	return spip_mysql_query('SHOW TABLES LIKE ' . _q($match), $serveur, $requeter);
868
+	return spip_mysql_query('SHOW TABLES LIKE '._q($match), $serveur, $requeter);
869 869
 }
870 870
 
871 871
 /**
@@ -881,7 +881,7 @@  discard block
 block discarded – undo
881 881
  *     - true si la requête a réussie, false sinon
882 882
  */
883 883
 function spip_mysql_repair($table, $serveur = '', $requeter = true) {
884
-	$table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = ' . _q($table), $serveur, true));
884
+	$table_status = spip_mysql_fetch(spip_mysql_query('SHOW TABLE STATUS WHERE Name = '._q($table), $serveur, true));
885 885
 	$engine = $table_status['Engine'];
886 886
 	if ($engine == 'InnoDB') {
887 887
 		if (spip_mysql_alter("TABLE $table ENGINE = InnoDB", $serveur, $requeter)) {
@@ -910,7 +910,7 @@  discard block
 block discarded – undo
910 910
  *     - string : requete sql, si $requeter = true
911 911
  **/
912 912
 function spip_mysql_table_exists(string $table, $serveur = '', $requeter = true) {
913
-	$r = spip_mysql_query('SHOW TABLES LIKE ' . _q($table), $serveur, $requeter);
913
+	$r = spip_mysql_query('SHOW TABLES LIKE '._q($table), $serveur, $requeter);
914 914
 	if (!$requeter) {
915 915
 		return $r;
916 916
 	}
@@ -992,22 +992,22 @@  discard block
 block discarded – undo
992 992
 			}
993 993
 			if ($val['Default'] === '0' || $val['Default']) {
994 994
 				if (preg_match('/[A-Z_]/', $val['Default'])) {
995
-					$nfields[$val['Field']] .= ' DEFAULT ' . $val['Default'];
995
+					$nfields[$val['Field']] .= ' DEFAULT '.$val['Default'];
996 996
 				} else {
997
-					$nfields[$val['Field']] .= " DEFAULT '" . $val['Default'] . "'";
997
+					$nfields[$val['Field']] .= " DEFAULT '".$val['Default']."'";
998 998
 				}
999 999
 			}
1000 1000
 			if ($val['Extra']) {
1001
-				$nfields[$val['Field']] .= ' ' . $val['Extra'];
1001
+				$nfields[$val['Field']] .= ' '.$val['Extra'];
1002 1002
 			}
1003 1003
 			if ($val['Key'] == 'PRI') {
1004 1004
 				$nkeys['PRIMARY KEY'] = $val['Field'];
1005 1005
 			} else {
1006 1006
 				if ($val['Key'] == 'MUL') {
1007
-					$nkeys['KEY ' . $val['Field']] = $val['Field'];
1007
+					$nkeys['KEY '.$val['Field']] = $val['Field'];
1008 1008
 				} else {
1009 1009
 					if ($val['Key'] == 'UNI') {
1010
-						$nkeys['UNIQUE KEY ' . $val['Field']] = $val['Field'];
1010
+						$nkeys['UNIQUE KEY '.$val['Field']] = $val['Field'];
1011 1011
 					}
1012 1012
 				}
1013 1013
 			}
@@ -1083,7 +1083,7 @@  discard block
 block discarded – undo
1083 1083
 	$serveur = '',
1084 1084
 	$requeter = true
1085 1085
 ) {
1086
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
1086
+	$c = !$groupby ? '*' : ('DISTINCT '.(is_string($groupby) ? $groupby : join(',', $groupby)));
1087 1087
 
1088 1088
 	$r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
1089 1089
 	if (!$requeter) {
@@ -1123,7 +1123,7 @@  discard block
 block discarded – undo
1123 1123
 	if ($s) {
1124 1124
 		$trace = debug_backtrace();
1125 1125
 		if ($trace[0]['function'] != 'spip_mysql_error') {
1126
-			spip_logger('mysql')->error("$s - $query - " . sql_error_backtrace());
1126
+			spip_logger('mysql')->error("$s - $query - ".sql_error_backtrace());
1127 1127
 		}
1128 1128
 	}
1129 1129
 
@@ -1253,7 +1253,7 @@  discard block
 block discarded – undo
1253 1253
 	try {
1254 1254
 		$insert = mysqli_query($link, $query);
1255 1255
 	} catch (\mysqli_sql_exception $e) {
1256
-		spip_logger('mysql')->debug('mysqli_sql_exception: ' . $e->getMessage());
1256
+		spip_logger('mysql')->debug('mysqli_sql_exception: '.$e->getMessage());
1257 1257
 		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
1258 1258
 		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
1259 1259
 	}
@@ -1308,8 +1308,8 @@  discard block
 block discarded – undo
1308 1308
 
1309 1309
 	return spip_mysql_insert(
1310 1310
 		$table,
1311
-		'(' . join(',', array_keys($couples)) . ')',
1312
-		'(' . join(',', $couples) . ')',
1311
+		'('.join(',', array_keys($couples)).')',
1312
+		'('.join(',', $couples).')',
1313 1313
 		$desc,
1314 1314
 		$serveur,
1315 1315
 		$requeter
@@ -1346,7 +1346,7 @@  discard block
 block discarded – undo
1346 1346
 	}
1347 1347
 	$fields = $desc['field'] ?? [];
1348 1348
 
1349
-	$cles = '(' . join(',', array_keys(reset($tab_couples))) . ')';
1349
+	$cles = '('.join(',', array_keys(reset($tab_couples))).')';
1350 1350
 	$valeurs = [];
1351 1351
 	$r = false;
1352 1352
 
@@ -1355,7 +1355,7 @@  discard block
 block discarded – undo
1355 1355
 		foreach ($couples as $champ => $val) {
1356 1356
 			$couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1357 1357
 		}
1358
-		$valeurs[] = '(' . join(',', $couples) . ')';
1358
+		$valeurs[] = '('.join(',', $couples).')';
1359 1359
 		if (count($valeurs) >= 100) {
1360 1360
 			$r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1361 1361
 			$valeurs = [];
@@ -1392,7 +1392,7 @@  discard block
 block discarded – undo
1392 1392
 function spip_mysql_update($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1393 1393
 	$set = [];
1394 1394
 	foreach ($champs as $champ => $val) {
1395
-		$set[] = $champ . "=$val";
1395
+		$set[] = $champ."=$val";
1396 1396
 	}
1397 1397
 	if (!empty($set)) {
1398 1398
 		return spip_mysql_query(
@@ -1449,7 +1449,7 @@  discard block
 block discarded – undo
1449 1449
 	}
1450 1450
 	$set = [];
1451 1451
 	foreach ($champs as $champ => $val) {
1452
-		$set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]);
1452
+		$set[] = $champ.'='.spip_mysql_cite($val, @$fields[$champ]);
1453 1453
 	}
1454 1454
 
1455 1455
 	return spip_mysql_query(
@@ -1518,10 +1518,10 @@  discard block
 block discarded – undo
1518 1518
  *     - false en cas d'erreur.
1519 1519
  **/
1520 1520
 function spip_mysql_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1521
-	return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1521
+	return spip_mysql_query("REPLACE $table (".join(',', array_keys($couples)).') VALUES ('.join(
1522 1522
 		',',
1523 1523
 		array_map('_q', $couples)
1524
-	) . ')', $serveur, $requeter);
1524
+	).')', $serveur, $requeter);
1525 1525
 }
1526 1526
 
1527 1527
 
@@ -1550,10 +1550,10 @@  discard block
 block discarded – undo
1550 1550
  *     - false en cas d'erreur.
1551 1551
  **/
1552 1552
 function spip_mysql_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1553
-	$cles = '(' . join(',', array_keys($tab_couples[0])) . ')';
1553
+	$cles = '('.join(',', array_keys($tab_couples[0])).')';
1554 1554
 	$valeurs = [];
1555 1555
 	foreach ($tab_couples as $couples) {
1556
-		$valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')';
1556
+		$valeurs[] = '('.join(',', array_map('_q', $couples)).')';
1557 1557
 	}
1558 1558
 	$valeurs = implode(', ', $valeurs);
1559 1559
 
@@ -1573,28 +1573,28 @@  discard block
 block discarded – undo
1573 1573
  */
1574 1574
 function spip_mysql_multi($objet, $lang) {
1575 1575
 	$lengthlang = strlen("[$lang]");
1576
-	$posmulti = 'INSTR(' . $objet . ", '<multi>')";
1577
-	$posfinmulti = 'INSTR(' . $objet . ", '</multi>')";
1578
-	$debutchaine = 'LEFT(' . $objet . ", $posmulti-1)";
1579
-	$finchaine = 'RIGHT(' . $objet . ', CHAR_LENGTH(' . $objet . ") -(7+$posfinmulti))";
1580
-	$chainemulti = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1581
-	$poslang = "INSTR($chainemulti,'[" . $lang . "]')";
1576
+	$posmulti = 'INSTR('.$objet.", '<multi>')";
1577
+	$posfinmulti = 'INSTR('.$objet.", '</multi>')";
1578
+	$debutchaine = 'LEFT('.$objet.", $posmulti-1)";
1579
+	$finchaine = 'RIGHT('.$objet.', CHAR_LENGTH('.$objet.") -(7+$posfinmulti))";
1580
+	$chainemulti = 'TRIM(SUBSTRING('.$objet.", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1581
+	$poslang = "INSTR($chainemulti,'[".$lang."]')";
1582 1582
 	$poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
1583
-	$chainelang = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1584
-	$posfinlang = 'INSTR(' . $chainelang . ", '[')";
1583
+	$chainelang = 'TRIM(SUBSTRING('.$objet.", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1584
+	$posfinlang = 'INSTR('.$chainelang.", '[')";
1585 1585
 	$chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
1586 1586
 	//$chainelang = "LEFT($chainelang,$posfinlang-1)";
1587
-	$retour = "(TRIM(IF($posmulti = 0 , " .
1588
-		'     TRIM(' . $objet . '), ' .
1589
-		'     CONCAT( ' .
1590
-		"          $debutchaine, " .
1591
-		'          IF( ' .
1592
-		"               $poslang = 0, " .
1593
-		"                     $chainemulti, " .
1594
-		"               $chainelang" .
1595
-		'          ), ' .
1596
-		"          $finchaine" .
1597
-		'     ) ' .
1587
+	$retour = "(TRIM(IF($posmulti = 0 , ".
1588
+		'     TRIM('.$objet.'), '.
1589
+		'     CONCAT( '.
1590
+		"          $debutchaine, ".
1591
+		'          IF( '.
1592
+		"               $poslang = 0, ".
1593
+		"                     $chainemulti, ".
1594
+		"               $chainelang".
1595
+		'          ), '.
1596
+		"          $finchaine".
1597
+		'     ) '.
1598 1598
 		'))) AS multi';
1599 1599
 
1600 1600
 	return $retour;
@@ -1611,7 +1611,7 @@  discard block
 block discarded – undo
1611 1611
  *     Valeur hexadécimale pour MySQL
1612 1612
  **/
1613 1613
 function spip_mysql_hex($v) {
1614
-	return '0x' . $v;
1614
+	return '0x'.$v;
1615 1615
 }
1616 1616
 
1617 1617
 /**
@@ -1651,7 +1651,7 @@  discard block
 block discarded – undo
1651 1651
  *     Expression SQL
1652 1652
  **/
1653 1653
 function spip_mysql_date_proche($champ, $interval, $unite) {
1654
-	$use_now = ( ($champ === 'maj' || strpos($champ, '.maj')) ? true : false );
1654
+	$use_now = (($champ === 'maj' || strpos($champ, '.maj')) ? true : false);
1655 1655
 	return '('
1656 1656
 	. $champ
1657 1657
 	. (($interval <= 0) ? '>' : '<')
@@ -1706,7 +1706,7 @@  discard block
 block discarded – undo
1706 1706
 		} elseif ($v === null) {
1707 1707
 			return "''";
1708 1708
 		}
1709
-		return "'" . addslashes($v) . "'";
1709
+		return "'".addslashes($v)."'";
1710 1710
 	}
1711 1711
 
1712 1712
 	if ($v === null) {
@@ -1730,7 +1730,7 @@  discard block
 block discarded – undo
1730 1730
 		}
1731 1731
 	}
1732 1732
 
1733
-	return ("'" . addslashes($v) . "'");
1733
+	return ("'".addslashes($v)."'");
1734 1734
 }
1735 1735
 
1736 1736
 /**
@@ -1764,7 +1764,7 @@  discard block
 block discarded – undo
1764 1764
 	} else {
1765 1765
 		$GLOBALS['mysql_rappel_nom_base'] = false;
1766 1766
 
1767
-		return "\$GLOBALS['mysql_rappel_nom_base'] = false; " .
1767
+		return "\$GLOBALS['mysql_rappel_nom_base'] = false; ".
1768 1768
 		"/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
1769 1769
 	}
1770 1770
 }
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.
ecrire/exec/base_delete_all.php 2 patches
Indentation   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -16,40 +16,40 @@
 block discarded – undo
16 16
  */
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
23 23
  * Exec de la page de destruction des tables de SPIP
24 24
  **/
25 25
 function exec_base_delete_all_dist() {
26
-	include_spip('inc/autoriser');
27
-	if (!autoriser('detruire')) {
28
-		include_spip('inc/minipres');
29
-		echo minipres();
30
-	} else {
31
-		include_spip('base/dump');
32
-		$res = base_lister_toutes_tables('', [], [], true);
33
-		if (!$res) {
34
-			include_spip('inc/minipres');
35
-			spip_logger()->info('Erreur base de donnees');
36
-			echo minipres(
37
-				_T('info_travaux_titre'),
38
-				_T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
39
-			);
40
-		} else {
41
-			$res = base_saisie_tables('delete', $res);
42
-			include_spip('inc/headers');
43
-			$res = "\n<ol style='text-align:left'><li>\n" .
44
-				implode("</li>\n<li>", $res) .
45
-				'</li></ol>';
46
-			$admin = charger_fonction('admin', 'inc');
47
-			$res = $admin('delete_all', _T('titre_page_delete_all'), $res);
48
-			if (!$res) {
49
-				redirige_url_ecrire('install', '');
50
-			} else {
51
-				echo $res;
52
-			}
53
-		}
54
-	}
26
+    include_spip('inc/autoriser');
27
+    if (!autoriser('detruire')) {
28
+        include_spip('inc/minipres');
29
+        echo minipres();
30
+    } else {
31
+        include_spip('base/dump');
32
+        $res = base_lister_toutes_tables('', [], [], true);
33
+        if (!$res) {
34
+            include_spip('inc/minipres');
35
+            spip_logger()->info('Erreur base de donnees');
36
+            echo minipres(
37
+                _T('info_travaux_titre'),
38
+                _T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
39
+            );
40
+        } else {
41
+            $res = base_saisie_tables('delete', $res);
42
+            include_spip('inc/headers');
43
+            $res = "\n<ol style='text-align:left'><li>\n" .
44
+                implode("</li>\n<li>", $res) .
45
+                '</li></ol>';
46
+            $admin = charger_fonction('admin', 'inc');
47
+            $res = $admin('delete_all', _T('titre_page_delete_all'), $res);
48
+            if (!$res) {
49
+                redirige_url_ecrire('install', '');
50
+            } else {
51
+                echo $res;
52
+            }
53
+        }
54
+    }
55 55
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -35,13 +35,13 @@
 block discarded – undo
35 35
 			spip_logger()->info('Erreur base de donnees');
36 36
 			echo minipres(
37 37
 				_T('info_travaux_titre'),
38
-				_T('titre_probleme_technique') . '<p><tt>' . sql_errno() . ' ' . sql_error() . '</tt></p>'
38
+				_T('titre_probleme_technique').'<p><tt>'.sql_errno().' '.sql_error().'</tt></p>'
39 39
 			);
40 40
 		} else {
41 41
 			$res = base_saisie_tables('delete', $res);
42 42
 			include_spip('inc/headers');
43
-			$res = "\n<ol style='text-align:left'><li>\n" .
44
-				implode("</li>\n<li>", $res) .
43
+			$res = "\n<ol style='text-align:left'><li>\n".
44
+				implode("</li>\n<li>", $res).
45 45
 				'</li></ol>';
46 46
 			$admin = charger_fonction('admin', 'inc');
47 47
 			$res = $admin('delete_all', _T('titre_page_delete_all'), $res);
Please login to merge, or discard this patch.
ecrire/action/tester.php 2 patches
Indentation   +86 added lines, -86 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  */
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -29,100 +29,100 @@  discard block
 block discarded – undo
29 29
  * redirige sur l'image ainsi créée (sinon sur une image d'echec).
30 30
  **/
31 31
 function action_tester_dist() {
32
-	$arg = _request('arg');
32
+    $arg = _request('arg');
33 33
 
34
-	// verifier les formats acceptes par GD
35
-	if ($arg === 'gd2') {
36
-		$gd_formats = [];
34
+    // verifier les formats acceptes par GD
35
+    if ($arg === 'gd2') {
36
+        $gd_formats = [];
37 37
 
38
-		if (function_exists('imagetypes')) {
39
-			if (imagetypes() & IMG_GIF) {
40
-				$gd_formats[] = 'gif';
41
-			}
42
-			if (imagetypes() & IMG_JPG) {
43
-				$gd_formats[] = 'jpg';
44
-			}
45
-			if (imagetypes() & IMG_PNG) {
46
-				$gd_formats[] = 'png';
47
-			}
48
-			if (imagetypes() & IMG_WEBP) {
49
-				$gd_formats[] = 'webp';
50
-			}
51
-		}
38
+        if (function_exists('imagetypes')) {
39
+            if (imagetypes() & IMG_GIF) {
40
+                $gd_formats[] = 'gif';
41
+            }
42
+            if (imagetypes() & IMG_JPG) {
43
+                $gd_formats[] = 'jpg';
44
+            }
45
+            if (imagetypes() & IMG_PNG) {
46
+                $gd_formats[] = 'png';
47
+            }
48
+            if (imagetypes() & IMG_WEBP) {
49
+                $gd_formats[] = 'webp';
50
+            }
51
+        }
52 52
 
53
-		$gd_formats = implode(',', $gd_formats);
54
-		ecrire_meta('gd_formats_read', $gd_formats);
55
-		ecrire_meta('gd_formats', $gd_formats);
56
-	} elseif ($arg == 'netpbm') {
57
-		// verifier les formats netpbm
58
-		if (!defined('_PNMSCALE_COMMAND')) {
59
-			define('_PNMSCALE_COMMAND', 'pnmscale');
60
-		} // Securite : mes_options.php peut preciser le chemin absolu
61
-		if (_PNMSCALE_COMMAND == '') {
62
-			return;
63
-		}
64
-		$netpbm_formats = [];
53
+        $gd_formats = implode(',', $gd_formats);
54
+        ecrire_meta('gd_formats_read', $gd_formats);
55
+        ecrire_meta('gd_formats', $gd_formats);
56
+    } elseif ($arg == 'netpbm') {
57
+        // verifier les formats netpbm
58
+        if (!defined('_PNMSCALE_COMMAND')) {
59
+            define('_PNMSCALE_COMMAND', 'pnmscale');
60
+        } // Securite : mes_options.php peut preciser le chemin absolu
61
+        if (_PNMSCALE_COMMAND == '') {
62
+            return;
63
+        }
64
+        $netpbm_formats = [];
65 65
 
66
-		$jpegtopnm_command = str_replace(
67
-			'pnmscale',
68
-			'jpegtopnm',
69
-			(string) _PNMSCALE_COMMAND
70
-		);
71
-		$pnmtojpeg_command = str_replace(
72
-			'pnmscale',
73
-			'pnmtojpeg',
74
-			(string) _PNMSCALE_COMMAND
75
-		);
66
+        $jpegtopnm_command = str_replace(
67
+            'pnmscale',
68
+            'jpegtopnm',
69
+            (string) _PNMSCALE_COMMAND
70
+        );
71
+        $pnmtojpeg_command = str_replace(
72
+            'pnmscale',
73
+            'pnmtojpeg',
74
+            (string) _PNMSCALE_COMMAND
75
+        );
76 76
 
77
-		$vignette = _ROOT_IMG_PACK . 'test.jpg';
78
-		$dest = _DIR_VAR . 'test-jpg.jpg';
79
-		$commande = "$jpegtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
80
-		spip_logger()->info($commande);
81
-		exec($commande);
82
-		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
83
-			$netpbm_formats[] = 'jpg';
84
-		}
85
-		$giftopnm_command = str_replace('pnmscale', 'giftopnm', (string) _PNMSCALE_COMMAND);
86
-		$pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', (string) _PNMSCALE_COMMAND);
87
-		$vignette = _ROOT_IMG_PACK . 'test.gif';
88
-		$dest = _DIR_VAR . 'test-gif.jpg';
89
-		$commande = "$giftopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
90
-		spip_logger()->info($commande);
91
-		exec($commande);
92
-		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
93
-			$netpbm_formats[] = 'gif';
94
-		}
77
+        $vignette = _ROOT_IMG_PACK . 'test.jpg';
78
+        $dest = _DIR_VAR . 'test-jpg.jpg';
79
+        $commande = "$jpegtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
80
+        spip_logger()->info($commande);
81
+        exec($commande);
82
+        if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
83
+            $netpbm_formats[] = 'jpg';
84
+        }
85
+        $giftopnm_command = str_replace('pnmscale', 'giftopnm', (string) _PNMSCALE_COMMAND);
86
+        $pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', (string) _PNMSCALE_COMMAND);
87
+        $vignette = _ROOT_IMG_PACK . 'test.gif';
88
+        $dest = _DIR_VAR . 'test-gif.jpg';
89
+        $commande = "$giftopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
90
+        spip_logger()->info($commande);
91
+        exec($commande);
92
+        if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
93
+            $netpbm_formats[] = 'gif';
94
+        }
95 95
 
96
-		$pngtopnm_command = str_replace('pnmscale', 'pngtopnm', (string) _PNMSCALE_COMMAND);
97
-		$vignette = _ROOT_IMG_PACK . 'test.png';
98
-		$dest = _DIR_VAR . 'test-gif.jpg';
99
-		$commande = "$pngtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
100
-		spip_logger()->info($commande);
101
-		exec($commande);
102
-		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
103
-			$netpbm_formats[] = 'png';
104
-		}
96
+        $pngtopnm_command = str_replace('pnmscale', 'pngtopnm', (string) _PNMSCALE_COMMAND);
97
+        $vignette = _ROOT_IMG_PACK . 'test.png';
98
+        $dest = _DIR_VAR . 'test-gif.jpg';
99
+        $commande = "$pngtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
100
+        spip_logger()->info($commande);
101
+        exec($commande);
102
+        if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
103
+            $netpbm_formats[] = 'png';
104
+        }
105 105
 
106
-		ecrire_meta('netpbm_formats', implode(',', $netpbm_formats ?: []));
107
-	}
106
+        ecrire_meta('netpbm_formats', implode(',', $netpbm_formats ?: []));
107
+    }
108 108
 
109
-	// et maintenant envoyer la vignette de tests
110
-	if (in_array($arg, ['gd2', 'imagick', 'convert', 'netpbm'])) {
111
-		include_spip('inc/filtres');
112
-		include_spip('inc/filtres_images_mini');
113
-		$taille_preview = 150;
114
-		$image = _image_valeurs_trans(_DIR_IMG_PACK . 'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg');
109
+    // et maintenant envoyer la vignette de tests
110
+    if (in_array($arg, ['gd2', 'imagick', 'convert', 'netpbm'])) {
111
+        include_spip('inc/filtres');
112
+        include_spip('inc/filtres_images_mini');
113
+        $taille_preview = 150;
114
+        $image = _image_valeurs_trans(_DIR_IMG_PACK . 'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg');
115 115
 
116
-		$image['fichier_dest'] = _DIR_VAR . "test_$arg";
116
+        $image['fichier_dest'] = _DIR_VAR . "test_$arg";
117 117
 
118
-		if (
119
-			($preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true))
120
-			&& $preview['width'] * $preview['height'] > 0
121
-		) {
122
-			redirige_par_entete($preview['fichier']);
123
-		}
124
-	}
118
+        if (
119
+            ($preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true))
120
+            && $preview['width'] * $preview['height'] > 0
121
+        ) {
122
+            redirige_par_entete($preview['fichier']);
123
+        }
124
+    }
125 125
 
126
-	# image echec
127
-	redirige_par_entete(chemin_image('echec-reducteur-xx.svg'));
126
+    # image echec
127
+    redirige_par_entete(chemin_image('echec-reducteur-xx.svg'));
128 128
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -74,9 +74,9 @@  discard block
 block discarded – undo
74 74
 			(string) _PNMSCALE_COMMAND
75 75
 		);
76 76
 
77
-		$vignette = _ROOT_IMG_PACK . 'test.jpg';
78
-		$dest = _DIR_VAR . 'test-jpg.jpg';
79
-		$commande = "$jpegtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
77
+		$vignette = _ROOT_IMG_PACK.'test.jpg';
78
+		$dest = _DIR_VAR.'test-jpg.jpg';
79
+		$commande = "$jpegtopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest";
80 80
 		spip_logger()->info($commande);
81 81
 		exec($commande);
82 82
 		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
@@ -84,9 +84,9 @@  discard block
 block discarded – undo
84 84
 		}
85 85
 		$giftopnm_command = str_replace('pnmscale', 'giftopnm', (string) _PNMSCALE_COMMAND);
86 86
 		$pnmtojpeg_command = str_replace('pnmscale', 'pnmtojpeg', (string) _PNMSCALE_COMMAND);
87
-		$vignette = _ROOT_IMG_PACK . 'test.gif';
88
-		$dest = _DIR_VAR . 'test-gif.jpg';
89
-		$commande = "$giftopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
87
+		$vignette = _ROOT_IMG_PACK.'test.gif';
88
+		$dest = _DIR_VAR.'test-gif.jpg';
89
+		$commande = "$giftopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest";
90 90
 		spip_logger()->info($commande);
91 91
 		exec($commande);
92 92
 		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
@@ -94,9 +94,9 @@  discard block
 block discarded – undo
94 94
 		}
95 95
 
96 96
 		$pngtopnm_command = str_replace('pnmscale', 'pngtopnm', (string) _PNMSCALE_COMMAND);
97
-		$vignette = _ROOT_IMG_PACK . 'test.png';
98
-		$dest = _DIR_VAR . 'test-gif.jpg';
99
-		$commande = "$pngtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest";
97
+		$vignette = _ROOT_IMG_PACK.'test.png';
98
+		$dest = _DIR_VAR.'test-gif.jpg';
99
+		$commande = "$pngtopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest";
100 100
 		spip_logger()->info($commande);
101 101
 		exec($commande);
102 102
 		if (($taille = @getimagesize($dest)) && $taille[1] == 10) {
@@ -111,9 +111,9 @@  discard block
 block discarded – undo
111 111
 		include_spip('inc/filtres');
112 112
 		include_spip('inc/filtres_images_mini');
113 113
 		$taille_preview = 150;
114
-		$image = _image_valeurs_trans(_DIR_IMG_PACK . 'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg');
114
+		$image = _image_valeurs_trans(_DIR_IMG_PACK.'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg');
115 115
 
116
-		$image['fichier_dest'] = _DIR_VAR . "test_$arg";
116
+		$image['fichier_dest'] = _DIR_VAR."test_$arg";
117 117
 
118 118
 		if (
119 119
 			($preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true))
Please login to merge, or discard this patch.
ecrire/action/purger.php 1 patch
Indentation   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Cache
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 /**
@@ -38,57 +38,57 @@  discard block
 block discarded – undo
38 38
  *     de l'action sécurisée.
39 39
  */
40 40
 function action_purger_dist($arg = null) {
41
-	if (is_null($arg)) {
42
-		$securiser_action = charger_fonction('securiser_action', 'inc');
43
-		$arg = $securiser_action();
44
-	}
41
+    if (is_null($arg)) {
42
+        $securiser_action = charger_fonction('securiser_action', 'inc');
43
+        $arg = $securiser_action();
44
+    }
45 45
 
46
-	include_spip('inc/invalideur');
46
+    include_spip('inc/invalideur');
47 47
 
48
-	spip_logger()->info("purger $arg");
48
+    spip_logger()->info("purger $arg");
49 49
 
50
-	switch ($arg) {
51
-		case 'inhibe_cache':
52
-			// inhiber le cache pendant 24h
53
-			ecrire_meta('cache_inhib', $_SERVER['REQUEST_TIME'] + 24 * 3600);
54
-			break;
55
-		case 'reactive_cache':
56
-			effacer_meta('cache_inhib');
57
-			break;
50
+    switch ($arg) {
51
+        case 'inhibe_cache':
52
+            // inhiber le cache pendant 24h
53
+            ecrire_meta('cache_inhib', $_SERVER['REQUEST_TIME'] + 24 * 3600);
54
+            break;
55
+        case 'reactive_cache':
56
+            effacer_meta('cache_inhib');
57
+            break;
58 58
 
59
-		case 'cache':
60
-			supprime_invalideurs();
61
-			@spip_unlink(_CACHE_RUBRIQUES);
62
-			@spip_unlink(_CACHE_CHEMIN);
63
-			@spip_unlink(_DIR_TMP . 'plugin_xml_cache.gz');
64
-			// on ne supprime que _CACHE_PLUGINS_OPT qui declenche la reconstruction des 3
65
-			// _CACHE_PIPELINES _CACHE_PLUGINS_PATH et _CACHE_PLUGINS_FCT
66
-			// pour eviter des problemes de concurence
67
-			// cf https://core.spip.net/issues/2989
68
-			//@spip_unlink(_CACHE_PIPELINES);
69
-			//@spip_unlink(_CACHE_PLUGINS_PATH);
70
-			//@spip_unlink(_CACHE_PLUGINS_FCT);
71
-			@spip_unlink(_CACHE_PLUGINS_OPT);
72
-			purger_repertoire(_DIR_CACHE, ['subdir' => true]);
73
-			purger_repertoire(_DIR_AIDE);
74
-			purger_repertoire(_DIR_VAR . 'cache-css');
75
-			purger_repertoire(_DIR_VAR . 'cache-js');
76
-			break;
59
+        case 'cache':
60
+            supprime_invalideurs();
61
+            @spip_unlink(_CACHE_RUBRIQUES);
62
+            @spip_unlink(_CACHE_CHEMIN);
63
+            @spip_unlink(_DIR_TMP . 'plugin_xml_cache.gz');
64
+            // on ne supprime que _CACHE_PLUGINS_OPT qui declenche la reconstruction des 3
65
+            // _CACHE_PIPELINES _CACHE_PLUGINS_PATH et _CACHE_PLUGINS_FCT
66
+            // pour eviter des problemes de concurence
67
+            // cf https://core.spip.net/issues/2989
68
+            //@spip_unlink(_CACHE_PIPELINES);
69
+            //@spip_unlink(_CACHE_PLUGINS_PATH);
70
+            //@spip_unlink(_CACHE_PLUGINS_FCT);
71
+            @spip_unlink(_CACHE_PLUGINS_OPT);
72
+            purger_repertoire(_DIR_CACHE, ['subdir' => true]);
73
+            purger_repertoire(_DIR_AIDE);
74
+            purger_repertoire(_DIR_VAR . 'cache-css');
75
+            purger_repertoire(_DIR_VAR . 'cache-js');
76
+            break;
77 77
 
78
-		case 'squelettes':
79
-			purger_repertoire(_DIR_SKELS);
80
-			break;
78
+        case 'squelettes':
79
+            purger_repertoire(_DIR_SKELS);
80
+            break;
81 81
 
82
-		case 'vignettes':
83
-			purger_repertoire(_DIR_VAR . 'cache-gd2', ['subdir' => true]);
84
-			purger_repertoire(_DIR_VAR . 'cache-texte', ['subdir' => true]);
85
-			purger_repertoire(_DIR_VAR . 'cache-vignettes', ['subdir' => true]);
86
-			purger_repertoire(_DIR_VAR . 'cache-TeX', ['subdir' => true]);
87
-			supprime_invalideurs();
88
-			purger_repertoire(_DIR_CACHE, ['subdir' => true]);
89
-			break;
90
-	}
82
+        case 'vignettes':
83
+            purger_repertoire(_DIR_VAR . 'cache-gd2', ['subdir' => true]);
84
+            purger_repertoire(_DIR_VAR . 'cache-texte', ['subdir' => true]);
85
+            purger_repertoire(_DIR_VAR . 'cache-vignettes', ['subdir' => true]);
86
+            purger_repertoire(_DIR_VAR . 'cache-TeX', ['subdir' => true]);
87
+            supprime_invalideurs();
88
+            purger_repertoire(_DIR_CACHE, ['subdir' => true]);
89
+            break;
90
+    }
91 91
 
92
-	// le faire savoir aux plugins
93
-	pipeline('trig_purger', $arg);
92
+    // le faire savoir aux plugins
93
+    pipeline('trig_purger', $arg);
94 94
 }
Please login to merge, or discard this patch.
ecrire/action/editer_liens.php 2 patches
Indentation   +557 added lines, -557 removed lines patch added patch discarded remove patch
@@ -28,7 +28,7 @@  discard block
 block discarded – undo
28 28
  */
29 29
 
30 30
 if (!defined('_ECRIRE_INC_VERSION')) {
31
-	return;
31
+    return;
32 32
 }
33 33
 
34 34
 // charger la gestion les rôles sur les objets
@@ -46,22 +46,22 @@  discard block
 block discarded – undo
46 46
  *     - array(clé primaire, nom de la table de lien) si associable
47 47
  */
48 48
 function objet_associable($objet) {
49
-	$trouver_table = charger_fonction('trouver_table', 'base');
50
-	$table_sql = table_objet_sql($objet);
51
-
52
-	$l = '';
53
-	if (
54
-		($primary = id_table_objet($objet))
55
-		&& $trouver_table($l = $table_sql . '_liens', '', true, ['log_missing' => false])
56
-		&& !preg_match(',[^\w],', $primary)
57
-		&& !preg_match(',[^\w],', $l)
58
-	) {
59
-		return [$primary, $l];
60
-	}
61
-
62
-	spip_logger()->info("Objet $objet non associable : ne dispose pas d'une cle primaire $primary OU d'une table liens $l");
63
-
64
-	return false;
49
+    $trouver_table = charger_fonction('trouver_table', 'base');
50
+    $table_sql = table_objet_sql($objet);
51
+
52
+    $l = '';
53
+    if (
54
+        ($primary = id_table_objet($objet))
55
+        && $trouver_table($l = $table_sql . '_liens', '', true, ['log_missing' => false])
56
+        && !preg_match(',[^\w],', $primary)
57
+        && !preg_match(',[^\w],', $l)
58
+    ) {
59
+        return [$primary, $l];
60
+    }
61
+
62
+    spip_logger()->info("Objet $objet non associable : ne dispose pas d'une cle primaire $primary OU d'une table liens $l");
63
+
64
+    return false;
65 65
 }
66 66
 
67 67
 /**
@@ -87,13 +87,13 @@  discard block
 block discarded – undo
87 87
  * @return bool|int
88 88
  */
89 89
 function objet_associer($objets_source, $objets_lies, $qualif = null) {
90
-	$modifs = objet_traiter_liaisons('lien_insert', $objets_source, $objets_lies, $qualif);
90
+    $modifs = objet_traiter_liaisons('lien_insert', $objets_source, $objets_lies, $qualif);
91 91
 
92
-	if ($qualif) {
93
-		objet_qualifier_liens($objets_source, $objets_lies, $qualif);
94
-	}
92
+    if ($qualif) {
93
+        objet_qualifier_liens($objets_source, $objets_lies, $qualif);
94
+    }
95 95
 
96
-	return $modifs; // pas d'erreur
96
+    return $modifs; // pas d'erreur
97 97
 }
98 98
 
99 99
 
@@ -127,7 +127,7 @@  discard block
 block discarded – undo
127 127
  * @return bool|int
128 128
  */
129 129
 function objet_dissocier($objets_source, $objets_lies, $cond = null) {
130
-	return objet_traiter_liaisons('lien_delete', $objets_source, $objets_lies, $cond);
130
+    return objet_traiter_liaisons('lien_delete', $objets_source, $objets_lies, $cond);
131 131
 }
132 132
 
133 133
 
@@ -152,7 +152,7 @@  discard block
 block discarded – undo
152 152
  * @return bool|int
153 153
  */
154 154
 function objet_qualifier_liens($objets_source, $objets_lies, $qualif) {
155
-	return objet_traiter_liaisons('lien_set', $objets_source, $objets_lies, $qualif);
155
+    return objet_traiter_liaisons('lien_set', $objets_source, $objets_lies, $qualif);
156 156
 }
157 157
 
158 158
 
@@ -187,7 +187,7 @@  discard block
 block discarded – undo
187 187
  *     Liste des trouvailles
188 188
  */
189 189
 function objet_trouver_liens($objets_source, $objets_lies, $cond = null) {
190
-	return objet_traiter_liaisons('lien_find', $objets_source, $objets_lies, $cond);
190
+    return objet_traiter_liaisons('lien_find', $objets_source, $objets_lies, $cond);
191 191
 }
192 192
 
193 193
 
@@ -211,8 +211,8 @@  discard block
 block discarded – undo
211 211
  * @return int
212 212
  */
213 213
 function objet_optimiser_liens($objets_source, $objets_lies) {
214
-	spip_logger('genie')->debug('objet_optimiser_liens : ' . json_encode($objets_source, JSON_THROW_ON_ERROR) . ', ' . json_encode($objets_lies, JSON_THROW_ON_ERROR));
215
-	return objet_traiter_liaisons('lien_optimise', $objets_source, $objets_lies);
214
+    spip_logger('genie')->debug('objet_optimiser_liens : ' . json_encode($objets_source, JSON_THROW_ON_ERROR) . ', ' . json_encode($objets_lies, JSON_THROW_ON_ERROR));
215
+    return objet_traiter_liaisons('lien_optimise', $objets_source, $objets_lies);
216 216
 }
217 217
 
218 218
 
@@ -232,30 +232,30 @@  discard block
 block discarded – undo
232 232
  *     Nombre de liens copiés
233 233
  */
234 234
 function objet_dupliquer_liens($objet, $id_source, $id_cible, $types = null, $exclure_types = null) {
235
-	include_spip('base/objets');
236
-	$tables = lister_tables_objets_sql();
237
-	$n = 0;
238
-	foreach ($tables as $table_sql => $infos) {
239
-		if ((is_null($types) || in_array($infos['type'], $types)) && (is_null($exclure_types) || !in_array($infos['type'], $exclure_types)) && objet_associable($infos['type'])) {
240
-			$liens = (($infos['type'] == $objet)
241
-				? objet_trouver_liens([$objet => $id_source], '*')
242
-				: objet_trouver_liens([$infos['type'] => '*'], [$objet => $id_source]));
243
-			foreach ($liens as $lien) {
244
-				$n++;
245
-				if ($infos['type'] == $objet) {
246
-					if (
247
-						(is_null($types) || in_array($lien['objet'], $types)) && (is_null($exclure_types) || !in_array($lien['objet'], $exclure_types))
248
-					) {
249
-						objet_associer([$objet => $id_cible], [$lien['objet'] => $lien[$lien['objet']]], $lien);
250
-					}
251
-				} else {
252
-					objet_associer([$infos['type'] => $lien[$infos['type']]], [$objet => $id_cible], $lien);
253
-				}
254
-			}
255
-		}
256
-	}
257
-
258
-	return $n;
235
+    include_spip('base/objets');
236
+    $tables = lister_tables_objets_sql();
237
+    $n = 0;
238
+    foreach ($tables as $table_sql => $infos) {
239
+        if ((is_null($types) || in_array($infos['type'], $types)) && (is_null($exclure_types) || !in_array($infos['type'], $exclure_types)) && objet_associable($infos['type'])) {
240
+            $liens = (($infos['type'] == $objet)
241
+                ? objet_trouver_liens([$objet => $id_source], '*')
242
+                : objet_trouver_liens([$infos['type'] => '*'], [$objet => $id_source]));
243
+            foreach ($liens as $lien) {
244
+                $n++;
245
+                if ($infos['type'] == $objet) {
246
+                    if (
247
+                        (is_null($types) || in_array($lien['objet'], $types)) && (is_null($exclure_types) || !in_array($lien['objet'], $exclure_types))
248
+                    ) {
249
+                        objet_associer([$objet => $id_cible], [$lien['objet'] => $lien[$lien['objet']]], $lien);
250
+                    }
251
+                } else {
252
+                    objet_associer([$infos['type'] => $lien[$infos['type']]], [$objet => $id_cible], $lien);
253
+                }
254
+            }
255
+        }
256
+    }
257
+
258
+    return $n;
259 259
 }
260 260
 
261 261
 /**
@@ -297,38 +297,38 @@  discard block
 block discarded – undo
297 297
  * @return bool|int|array
298 298
  */
299 299
 function objet_traiter_liaisons($operation, $objets_source, $objets_lies, $set = null) {
300
-	// accepter une syntaxe minimale pour supprimer tous les liens
301
-	if ($objets_lies == '*') {
302
-		$objets_lies = ['*' => '*'];
303
-	}
304
-	$modifs = 0; // compter le nombre de modifications
305
-	$echec = null;
306
-	foreach ($objets_source as $objet => $ids) {
307
-		if ($a = objet_associable($objet)) {
308
-			[$primary, $l] = $a;
309
-			if (!is_array($ids)) {
310
-				$ids = [$ids];
311
-			} elseif (reset($ids) == 'NOT') {
312
-				// si on demande un array('NOT',...) => recuperer la liste d'ids correspondants
313
-				$where = lien_where($primary, $ids, '*', '*');
314
-				$ids = sql_allfetsel($primary, $l, $where);
315
-				$ids = array_map('reset', $ids);
316
-			}
317
-			foreach ($ids as $id) {
318
-				$res = $operation($objet, $primary, $l, $id, $objets_lies, $set);
319
-				if ($res === false) {
320
-					spip_logger()->error("objet_traiter_liaisons [Echec] : $operation sur $objet/$primary/$l/$id");
321
-					$echec = true;
322
-				} else {
323
-					$modifs = ($modifs ? (is_array($res) ? array_merge($modifs, $res) : $modifs + $res) : $res);
324
-				}
325
-			}
326
-		} else {
327
-			$echec = true;
328
-		}
329
-	}
330
-
331
-	return ($echec ? false : $modifs); // pas d'erreur
300
+    // accepter une syntaxe minimale pour supprimer tous les liens
301
+    if ($objets_lies == '*') {
302
+        $objets_lies = ['*' => '*'];
303
+    }
304
+    $modifs = 0; // compter le nombre de modifications
305
+    $echec = null;
306
+    foreach ($objets_source as $objet => $ids) {
307
+        if ($a = objet_associable($objet)) {
308
+            [$primary, $l] = $a;
309
+            if (!is_array($ids)) {
310
+                $ids = [$ids];
311
+            } elseif (reset($ids) == 'NOT') {
312
+                // si on demande un array('NOT',...) => recuperer la liste d'ids correspondants
313
+                $where = lien_where($primary, $ids, '*', '*');
314
+                $ids = sql_allfetsel($primary, $l, $where);
315
+                $ids = array_map('reset', $ids);
316
+            }
317
+            foreach ($ids as $id) {
318
+                $res = $operation($objet, $primary, $l, $id, $objets_lies, $set);
319
+                if ($res === false) {
320
+                    spip_logger()->error("objet_traiter_liaisons [Echec] : $operation sur $objet/$primary/$l/$id");
321
+                    $echec = true;
322
+                } else {
323
+                    $modifs = ($modifs ? (is_array($res) ? array_merge($modifs, $res) : $modifs + $res) : $res);
324
+                }
325
+            }
326
+        } else {
327
+            $echec = true;
328
+        }
329
+    }
330
+
331
+    return ($echec ? false : $modifs); // pas d'erreur
332 332
 }
333 333
 
334 334
 
@@ -357,116 +357,116 @@  discard block
 block discarded – undo
357 357
  *     Nombre d'insertions faites, false si échec.
358 358
  */
359 359
 function lien_insert($objet_source, $primary, $table_lien, $id, $objets, $qualif) {
360
-	$ins = 0;
361
-	$echec = null;
362
-	if (is_null($qualif)) {
363
-		$qualif = [];
364
-	}
365
-
366
-	foreach ($objets as $objet => $id_objets) {
367
-		if (!is_array($id_objets)) {
368
-			$id_objets = [$id_objets];
369
-		}
370
-
371
-		// role, colonne, where par défaut
372
-		[$role, $colonne_role, $cond] =
373
-			roles_trouver_dans_qualif($objet_source, $objet, $qualif);
374
-
375
-		foreach ($id_objets as $id_objet) {
376
-			$objet = (($objet == '*') ? $objet : objet_type($objet)); # securite
377
-
378
-			$insertions = [
379
-				'id_objet' => $id_objet,
380
-				'objet' => $objet,
381
-				$primary => $id
382
-			];
383
-			// rôle en plus s'il est défini
384
-			if ($role) {
385
-				$insertions += [
386
-					$colonne_role => $role
387
-				];
388
-			}
389
-
390
-			if (lien_triables($table_lien)) {
391
-				if (isset($qualif['rang_lien'])) {
392
-					$rang = $qualif['rang_lien'];
393
-				}
394
-				else {
395
-					$where = lien_where($primary, $id, $objet, $id_objet);
396
-					// si il y a deja un lien pour ce couple (avec un autre role?) on reprend le meme rang si non nul
397
-					if (!$rang = (int) sql_getfetsel('rang_lien', $table_lien, $where)) {
398
-						$where = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet);
399
-						$rang = (int) sql_getfetsel('max(rang_lien)', $table_lien, $where);
400
-						// si aucun lien n'a de rang, on en introduit pas, on garde zero
401
-						if ($rang > 0) {
402
-							$rang = (int) $rang + 1;
403
-						}
404
-					}
405
-				}
406
-				$insertions['rang_lien'] = $rang;
407
-			}
408
-
409
-			$args = [
410
-				'table_lien' => $table_lien,
411
-				'objet_source' => $objet_source,
412
-				'id_objet_source' => $id,
413
-				'objet' => $objet,
414
-				'id_objet' => $id_objet,
415
-				'role' => $role,
416
-				'colonne_role' => $colonne_role,
417
-				'action' => 'insert',
418
-			];
419
-
420
-			// Envoyer aux plugins
421
-			$insertions = pipeline(
422
-				'pre_edition_lien',
423
-				[
424
-					'args' => $args,
425
-					'data' => $insertions
426
-				]
427
-			);
428
-			$args['id_objet'] = $insertions['id_objet'];
429
-
430
-			$where = lien_where($primary, $id, $objet, $id_objet, $cond);
431
-
432
-			if (
433
-				(($id_objet = (int) $insertions['id_objet']) || in_array($objet, ['site', 'rubrique'])) && !sql_getfetsel($primary, $table_lien, $where)
434
-			) {
435
-				if (lien_triables($table_lien) && isset($insertions['rang_lien']) && (int) $insertions['rang_lien']) {
436
-					$where_meme_lien = lien_where($primary, $id, $objet, $id_objet);
437
-					$where_meme_lien = implode(' AND ', $where_meme_lien);
438
-					// on decale les liens de rang_lien>=la valeur inseree pour faire la place
439
-					// sauf sur le meme lien avec un role eventuellement different
440
-					$w = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet, ['rang_lien>=' . (int) $insertions['rang_lien'], "NOT($where_meme_lien)"]);
441
-					sql_update($table_lien, ['rang_lien' => 'rang_lien+1'], $w);
442
-				}
443
-
444
-				$e = sql_insertq($table_lien, $insertions);
445
-				if ($e !== false) {
446
-					$ins++;
447
-					lien_propage_date_modif($objet, $id_objet);
448
-					lien_propage_date_modif($objet_source, $id);
449
-					// Envoyer aux plugins
450
-					pipeline(
451
-						'post_edition_lien',
452
-						[
453
-							'args' => $args,
454
-							'data' => $insertions
455
-						]
456
-					);
457
-				} else {
458
-					$echec = true;
459
-				}
460
-			}
461
-		}
462
-	}
463
-	// si on a fait des insertions, on reordonne les liens concernes
464
-	// pas la peine si $qualif['rang_lien'] etait fournie, on va passer dans lien_set a suivre et donc finir le recomptage
465
-	if ($ins > 0 && empty($qualif['rang_lien'])) {
466
-		lien_ordonner($objet_source, $primary, $table_lien, $id, $objets);
467
-	}
468
-
469
-	return ($echec ? false : $ins);
360
+    $ins = 0;
361
+    $echec = null;
362
+    if (is_null($qualif)) {
363
+        $qualif = [];
364
+    }
365
+
366
+    foreach ($objets as $objet => $id_objets) {
367
+        if (!is_array($id_objets)) {
368
+            $id_objets = [$id_objets];
369
+        }
370
+
371
+        // role, colonne, where par défaut
372
+        [$role, $colonne_role, $cond] =
373
+            roles_trouver_dans_qualif($objet_source, $objet, $qualif);
374
+
375
+        foreach ($id_objets as $id_objet) {
376
+            $objet = (($objet == '*') ? $objet : objet_type($objet)); # securite
377
+
378
+            $insertions = [
379
+                'id_objet' => $id_objet,
380
+                'objet' => $objet,
381
+                $primary => $id
382
+            ];
383
+            // rôle en plus s'il est défini
384
+            if ($role) {
385
+                $insertions += [
386
+                    $colonne_role => $role
387
+                ];
388
+            }
389
+
390
+            if (lien_triables($table_lien)) {
391
+                if (isset($qualif['rang_lien'])) {
392
+                    $rang = $qualif['rang_lien'];
393
+                }
394
+                else {
395
+                    $where = lien_where($primary, $id, $objet, $id_objet);
396
+                    // si il y a deja un lien pour ce couple (avec un autre role?) on reprend le meme rang si non nul
397
+                    if (!$rang = (int) sql_getfetsel('rang_lien', $table_lien, $where)) {
398
+                        $where = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet);
399
+                        $rang = (int) sql_getfetsel('max(rang_lien)', $table_lien, $where);
400
+                        // si aucun lien n'a de rang, on en introduit pas, on garde zero
401
+                        if ($rang > 0) {
402
+                            $rang = (int) $rang + 1;
403
+                        }
404
+                    }
405
+                }
406
+                $insertions['rang_lien'] = $rang;
407
+            }
408
+
409
+            $args = [
410
+                'table_lien' => $table_lien,
411
+                'objet_source' => $objet_source,
412
+                'id_objet_source' => $id,
413
+                'objet' => $objet,
414
+                'id_objet' => $id_objet,
415
+                'role' => $role,
416
+                'colonne_role' => $colonne_role,
417
+                'action' => 'insert',
418
+            ];
419
+
420
+            // Envoyer aux plugins
421
+            $insertions = pipeline(
422
+                'pre_edition_lien',
423
+                [
424
+                    'args' => $args,
425
+                    'data' => $insertions
426
+                ]
427
+            );
428
+            $args['id_objet'] = $insertions['id_objet'];
429
+
430
+            $where = lien_where($primary, $id, $objet, $id_objet, $cond);
431
+
432
+            if (
433
+                (($id_objet = (int) $insertions['id_objet']) || in_array($objet, ['site', 'rubrique'])) && !sql_getfetsel($primary, $table_lien, $where)
434
+            ) {
435
+                if (lien_triables($table_lien) && isset($insertions['rang_lien']) && (int) $insertions['rang_lien']) {
436
+                    $where_meme_lien = lien_where($primary, $id, $objet, $id_objet);
437
+                    $where_meme_lien = implode(' AND ', $where_meme_lien);
438
+                    // on decale les liens de rang_lien>=la valeur inseree pour faire la place
439
+                    // sauf sur le meme lien avec un role eventuellement different
440
+                    $w = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet, ['rang_lien>=' . (int) $insertions['rang_lien'], "NOT($where_meme_lien)"]);
441
+                    sql_update($table_lien, ['rang_lien' => 'rang_lien+1'], $w);
442
+                }
443
+
444
+                $e = sql_insertq($table_lien, $insertions);
445
+                if ($e !== false) {
446
+                    $ins++;
447
+                    lien_propage_date_modif($objet, $id_objet);
448
+                    lien_propage_date_modif($objet_source, $id);
449
+                    // Envoyer aux plugins
450
+                    pipeline(
451
+                        'post_edition_lien',
452
+                        [
453
+                            'args' => $args,
454
+                            'data' => $insertions
455
+                        ]
456
+                    );
457
+                } else {
458
+                    $echec = true;
459
+                }
460
+            }
461
+        }
462
+    }
463
+    // si on a fait des insertions, on reordonne les liens concernes
464
+    // pas la peine si $qualif['rang_lien'] etait fournie, on va passer dans lien_set a suivre et donc finir le recomptage
465
+    if ($ins > 0 && empty($qualif['rang_lien'])) {
466
+        lien_ordonner($objet_source, $primary, $table_lien, $id, $objets);
467
+    }
468
+
469
+    return ($echec ? false : $ins);
470 470
 }
471 471
 
472 472
 
@@ -479,47 +479,47 @@  discard block
 block discarded – undo
479 479
  * @param array|string $objets
480 480
  */
481 481
 function lien_ordonner($objet_source, $primary, $table_lien, $id, $objets) {
482
-	if (!lien_triables($table_lien)) {
483
-		return;
484
-	}
485
-
486
-	$deja_reordonne = [];
487
-
488
-	foreach ($objets as $objet => $id_objets) {
489
-		if (!is_array($id_objets)) {
490
-			$id_objets = [$id_objets];
491
-		}
492
-
493
-		foreach ($id_objets as $id_objet) {
494
-			if (empty($deja_reordonne[$id][$objet][$id_objet])) {
495
-				$objet = (($objet == '*') ? $objet : objet_type($objet)); # securite
496
-
497
-				$where = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet);
498
-				$liens = sql_allfetsel("$primary, id_objet, objet, rang_lien", $table_lien, $where, '', 'rang_lien');
499
-
500
-				$rangs = array_column($liens, 'rang_lien');
501
-				if (count($rangs) && (max($rangs) > 0 || min($rangs) < 0)) {
502
-					$rang = 1;
503
-					foreach ($liens as $lien) {
504
-						if (empty($deja_reordonne[$lien[$primary]][$lien['objet']][$lien['id_objet']])) {
505
-							$where = lien_where($primary, $lien[$primary], $lien['objet'], $lien['id_objet'], ['rang_lien!=' . (int) $rang]);
506
-							sql_updateq($table_lien, ['rang_lien' => $rang], $where);
507
-
508
-							if (empty($deja_reordonne[$lien[$primary]])) {
509
-								$deja_reordonne[$lien[$primary]] = [];
510
-							}
511
-							if (empty($deja_reordonne[$lien[$primary]][$lien['objet']])) {
512
-								$deja_reordonne[$lien[$primary]][$lien['objet']] = [];
513
-							}
514
-							$deja_reordonne[$lien[$primary]][$lien['objet']][$lien['id_objet']] = $rang;
515
-
516
-							$rang++;
517
-						}
518
-					}
519
-				}
520
-			}
521
-		}
522
-	}
482
+    if (!lien_triables($table_lien)) {
483
+        return;
484
+    }
485
+
486
+    $deja_reordonne = [];
487
+
488
+    foreach ($objets as $objet => $id_objets) {
489
+        if (!is_array($id_objets)) {
490
+            $id_objets = [$id_objets];
491
+        }
492
+
493
+        foreach ($id_objets as $id_objet) {
494
+            if (empty($deja_reordonne[$id][$objet][$id_objet])) {
495
+                $objet = (($objet == '*') ? $objet : objet_type($objet)); # securite
496
+
497
+                $where = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet);
498
+                $liens = sql_allfetsel("$primary, id_objet, objet, rang_lien", $table_lien, $where, '', 'rang_lien');
499
+
500
+                $rangs = array_column($liens, 'rang_lien');
501
+                if (count($rangs) && (max($rangs) > 0 || min($rangs) < 0)) {
502
+                    $rang = 1;
503
+                    foreach ($liens as $lien) {
504
+                        if (empty($deja_reordonne[$lien[$primary]][$lien['objet']][$lien['id_objet']])) {
505
+                            $where = lien_where($primary, $lien[$primary], $lien['objet'], $lien['id_objet'], ['rang_lien!=' . (int) $rang]);
506
+                            sql_updateq($table_lien, ['rang_lien' => $rang], $where);
507
+
508
+                            if (empty($deja_reordonne[$lien[$primary]])) {
509
+                                $deja_reordonne[$lien[$primary]] = [];
510
+                            }
511
+                            if (empty($deja_reordonne[$lien[$primary]][$lien['objet']])) {
512
+                                $deja_reordonne[$lien[$primary]][$lien['objet']] = [];
513
+                            }
514
+                            $deja_reordonne[$lien[$primary]][$lien['objet']][$lien['id_objet']] = $rang;
515
+
516
+                            $rang++;
517
+                        }
518
+                    }
519
+                }
520
+            }
521
+        }
522
+    }
523 523
 }
524 524
 
525 525
 
@@ -530,13 +530,13 @@  discard block
 block discarded – undo
530 530
  * @return mixed
531 531
  */
532 532
 function lien_triables($table_lien) {
533
-	static $triables = [];
534
-	if (!isset($triables[$table_lien])) {
535
-		$trouver_table = charger_fonction('trouver_table', 'base');
536
-		$desc = $trouver_table($table_lien);
537
-		$triables[$table_lien] = $desc && isset($desc['field']['rang_lien']);
538
-	}
539
-	return $triables[$table_lien];
533
+    static $triables = [];
534
+    if (!isset($triables[$table_lien])) {
535
+        $trouver_table = charger_fonction('trouver_table', 'base');
536
+        $desc = $trouver_table($table_lien);
537
+        $triables[$table_lien] = $desc && isset($desc['field']['rang_lien']);
538
+    }
539
+    return $triables[$table_lien];
540 540
 }
541 541
 
542 542
 
@@ -552,50 +552,50 @@  discard block
 block discarded – undo
552 552
  * @return array                        Liste des conditions
553 553
  */
554 554
 function lien_where($primary, $id_source, $objet, $id_objet, $cond = []) {
555
-	if (
556
-		!is_array($id_source) && !strlen($id_source) || !strlen($objet) || !is_array($id_objet) && !strlen($id_objet)
557
-	) {
558
-		return ['0=1'];
559
-	} // securite
560
-
561
-	$not = '';
562
-	if (is_array($id_source) && reset($id_source) == 'NOT') {
563
-		$not = array_shift($id_source);
564
-		$id_source = reset($id_source);
565
-	}
566
-
567
-	$where = $cond;
568
-
569
-	if ($id_source !== '*') {
570
-		$where[] = (is_array($id_source) ? sql_in(
571
-			addslashes($primary),
572
-			array_map('intval', $id_source),
573
-			$not
574
-		) : addslashes($primary) . ($not ? '<>' : '=') . (int) $id_source);
575
-	} elseif ($not) {
576
-		$where[] = '0=1';
577
-	} // idiot mais quand meme
578
-
579
-	$not = '';
580
-	if (is_array($id_objet) && reset($id_objet) == 'NOT') {
581
-		$not = array_shift($id_objet);
582
-		$id_objet = reset($id_objet);
583
-	}
584
-
585
-	if ($objet !== '*') {
586
-		$where[] = 'objet=' . sql_quote($objet);
587
-	}
588
-	if ($id_objet !== '*') {
589
-		$where[] = (is_array($id_objet) ? sql_in(
590
-			'id_objet',
591
-			array_map('intval', $id_objet),
592
-			$not
593
-		) : 'id_objet' . ($not ? '<>' : '=') . (int) $id_objet);
594
-	} elseif ($not) {
595
-		$where[] = '0=1';
596
-	} // idiot mais quand meme
597
-
598
-	return $where;
555
+    if (
556
+        !is_array($id_source) && !strlen($id_source) || !strlen($objet) || !is_array($id_objet) && !strlen($id_objet)
557
+    ) {
558
+        return ['0=1'];
559
+    } // securite
560
+
561
+    $not = '';
562
+    if (is_array($id_source) && reset($id_source) == 'NOT') {
563
+        $not = array_shift($id_source);
564
+        $id_source = reset($id_source);
565
+    }
566
+
567
+    $where = $cond;
568
+
569
+    if ($id_source !== '*') {
570
+        $where[] = (is_array($id_source) ? sql_in(
571
+            addslashes($primary),
572
+            array_map('intval', $id_source),
573
+            $not
574
+        ) : addslashes($primary) . ($not ? '<>' : '=') . (int) $id_source);
575
+    } elseif ($not) {
576
+        $where[] = '0=1';
577
+    } // idiot mais quand meme
578
+
579
+    $not = '';
580
+    if (is_array($id_objet) && reset($id_objet) == 'NOT') {
581
+        $not = array_shift($id_objet);
582
+        $id_objet = reset($id_objet);
583
+    }
584
+
585
+    if ($objet !== '*') {
586
+        $where[] = 'objet=' . sql_quote($objet);
587
+    }
588
+    if ($id_objet !== '*') {
589
+        $where[] = (is_array($id_objet) ? sql_in(
590
+            'id_objet',
591
+            array_map('intval', $id_objet),
592
+            $not
593
+        ) : 'id_objet' . ($not ? '<>' : '=') . (int) $id_objet);
594
+    } elseif ($not) {
595
+        $where[] = '0=1';
596
+    } // idiot mais quand meme
597
+
598
+    return $where;
599 599
 }
600 600
 
601 601
 /**
@@ -610,13 +610,13 @@  discard block
 block discarded – undo
610 610
  */
611 611
 function lien_rang_where($table_lien, $primary, $id_source, $objet, $id_objet, $cond = []) {
612 612
 
613
-	// si on veut compter les rangs autrement que le core ne le fait par defaut, fournir le where adhoc
614
-	if (function_exists($f = 'lien_rang_where_' . $table_lien)) {
615
-		return $f($primary, $id_source, $objet, $id_objet, $cond);
616
-	}
613
+    // si on veut compter les rangs autrement que le core ne le fait par defaut, fournir le where adhoc
614
+    if (function_exists($f = 'lien_rang_where_' . $table_lien)) {
615
+        return $f($primary, $id_source, $objet, $id_objet, $cond);
616
+    }
617 617
 
618
-	// par defaut c'est un rang compté pour tous les id_source d'un couple objet-id_objet
619
-	return lien_where($primary, '*', $objet, $id_objet, $cond);
618
+    // par defaut c'est un rang compté pour tous les id_source d'un couple objet-id_objet
619
+    return lien_where($primary, '*', $objet, $id_objet, $cond);
620 620
 }
621 621
 
622 622
 /**
@@ -647,90 +647,90 @@  discard block
 block discarded – undo
647 647
  */
648 648
 function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond = null) {
649 649
 
650
-	$retire = [];
651
-	$dels = 0;
652
-	$echec = false;
653
-	if (is_null($cond)) {
654
-		$cond = [];
655
-	}
656
-
657
-	foreach ($objets as $objet => $id_objets) {
658
-		$objet = ($objet == '*') ? $objet : objet_type($objet); # securite
659
-		if (!is_array($id_objets) || reset($id_objets) == 'NOT') {
660
-			$id_objets = [$id_objets];
661
-		}
662
-		foreach ($id_objets as $id_objet) {
663
-			[$cond, $colonne_role, $role] = roles_creer_condition_role($objet_source, $objet, $cond);
664
-			// id_objet peut valoir '*'
665
-			$where = lien_where($primary, $id, $objet, $id_objet, $cond);
666
-
667
-			// lire les liens existants pour propager la date de modif
668
-			$select = "$primary,id_objet,objet";
669
-			if ($colonne_role) {
670
-				$select .= ",$colonne_role";
671
-			}
672
-			$liens = sql_allfetsel($select, $table_lien, $where);
673
-
674
-			// iterer sur les liens pour permettre aux plugins de gerer
675
-			foreach ($liens as $l) {
676
-				$args = [
677
-					'table_lien' => $table_lien,
678
-					'objet_source' => $objet_source,
679
-					'id_objet_source' => $l[$primary],
680
-					'objet' => $l['objet'],
681
-					'id_objet' => $l['id_objet'],
682
-					'colonne_role' => $colonne_role,
683
-					'role' => ($colonne_role ? $l[$colonne_role] : ''),
684
-					'action' => 'delete',
685
-				];
686
-
687
-				// Envoyer aux plugins
688
-				$l = pipeline(
689
-					'pre_edition_lien',
690
-					[
691
-						'args' => $args,
692
-						'data' => $l
693
-					]
694
-				);
695
-				$args['id_objet'] = $id_o = $l['id_objet'];
696
-
697
-				if (($id_o = (int) $l['id_objet']) || in_array($l['objet'], ['site', 'rubrique'])) {
698
-					$where = lien_where($primary, $l[$primary], $l['objet'], $id_o, $cond);
699
-					$e = sql_delete($table_lien, $where);
700
-					if ($e !== false) {
701
-						$dels += $e;
702
-						lien_propage_date_modif($l['objet'], $id_o);
703
-						lien_propage_date_modif($objet_source, $l[$primary]);
704
-					} else {
705
-						$echec = true;
706
-					}
707
-					$retire[] = [
708
-						'source' => [$objet_source => $l[$primary]],
709
-						'lien' => [$l['objet'] => $id_o],
710
-						'type' => $l['objet'],
711
-						'role' => ($colonne_role ? $l[$colonne_role] : ''),
712
-						'id' => $id_o
713
-					];
714
-					// Envoyer aux plugins
715
-					pipeline(
716
-						'post_edition_lien',
717
-						[
718
-							'args' => $args,
719
-							'data' => $l
720
-						]
721
-					);
722
-				}
723
-			}
724
-		}
725
-	}
726
-	// si on a supprime des liens, on reordonne les liens concernes
727
-	if ($dels) {
728
-		lien_ordonner($objet_source, $primary, $table_lien, $id, $objets);
729
-	}
730
-
731
-	pipeline('trig_supprimer_objets_lies', $retire);
732
-
733
-	return ($echec ? false : $dels);
650
+    $retire = [];
651
+    $dels = 0;
652
+    $echec = false;
653
+    if (is_null($cond)) {
654
+        $cond = [];
655
+    }
656
+
657
+    foreach ($objets as $objet => $id_objets) {
658
+        $objet = ($objet == '*') ? $objet : objet_type($objet); # securite
659
+        if (!is_array($id_objets) || reset($id_objets) == 'NOT') {
660
+            $id_objets = [$id_objets];
661
+        }
662
+        foreach ($id_objets as $id_objet) {
663
+            [$cond, $colonne_role, $role] = roles_creer_condition_role($objet_source, $objet, $cond);
664
+            // id_objet peut valoir '*'
665
+            $where = lien_where($primary, $id, $objet, $id_objet, $cond);
666
+
667
+            // lire les liens existants pour propager la date de modif
668
+            $select = "$primary,id_objet,objet";
669
+            if ($colonne_role) {
670
+                $select .= ",$colonne_role";
671
+            }
672
+            $liens = sql_allfetsel($select, $table_lien, $where);
673
+
674
+            // iterer sur les liens pour permettre aux plugins de gerer
675
+            foreach ($liens as $l) {
676
+                $args = [
677
+                    'table_lien' => $table_lien,
678
+                    'objet_source' => $objet_source,
679
+                    'id_objet_source' => $l[$primary],
680
+                    'objet' => $l['objet'],
681
+                    'id_objet' => $l['id_objet'],
682
+                    'colonne_role' => $colonne_role,
683
+                    'role' => ($colonne_role ? $l[$colonne_role] : ''),
684
+                    'action' => 'delete',
685
+                ];
686
+
687
+                // Envoyer aux plugins
688
+                $l = pipeline(
689
+                    'pre_edition_lien',
690
+                    [
691
+                        'args' => $args,
692
+                        'data' => $l
693
+                    ]
694
+                );
695
+                $args['id_objet'] = $id_o = $l['id_objet'];
696
+
697
+                if (($id_o = (int) $l['id_objet']) || in_array($l['objet'], ['site', 'rubrique'])) {
698
+                    $where = lien_where($primary, $l[$primary], $l['objet'], $id_o, $cond);
699
+                    $e = sql_delete($table_lien, $where);
700
+                    if ($e !== false) {
701
+                        $dels += $e;
702
+                        lien_propage_date_modif($l['objet'], $id_o);
703
+                        lien_propage_date_modif($objet_source, $l[$primary]);
704
+                    } else {
705
+                        $echec = true;
706
+                    }
707
+                    $retire[] = [
708
+                        'source' => [$objet_source => $l[$primary]],
709
+                        'lien' => [$l['objet'] => $id_o],
710
+                        'type' => $l['objet'],
711
+                        'role' => ($colonne_role ? $l[$colonne_role] : ''),
712
+                        'id' => $id_o
713
+                    ];
714
+                    // Envoyer aux plugins
715
+                    pipeline(
716
+                        'post_edition_lien',
717
+                        [
718
+                            'args' => $args,
719
+                            'data' => $l
720
+                        ]
721
+                    );
722
+                }
723
+            }
724
+        }
725
+    }
726
+    // si on a supprime des liens, on reordonne les liens concernes
727
+    if ($dels) {
728
+        lien_ordonner($objet_source, $primary, $table_lien, $id, $objets);
729
+    }
730
+
731
+    pipeline('trig_supprimer_objets_lies', $retire);
732
+
733
+    return ($echec ? false : $dels);
734 734
 }
735 735
 
736 736
 
@@ -753,66 +753,66 @@  discard block
 block discarded – undo
753 753
  * @return bool|int
754 754
  */
755 755
 function lien_optimise($objet_source, $primary, $table_lien, $id, $objets) {
756
-	include_spip('genie/optimiser');
757
-	$echec = false;
758
-	$dels = 0;
759
-	foreach ($objets as $objet => $id_objets) {
760
-		$objet = ($objet == '*') ? $objet : objet_type($objet); # securite
761
-		if (!is_array($id_objets) || reset($id_objets) == 'NOT') {
762
-			$id_objets = [$id_objets];
763
-		}
764
-		foreach ($id_objets as $id_objet) {
765
-			$where = lien_where($primary, $id, $objet, $id_objet);
766
-			# les liens vers un objet inexistant
767
-			$r = sql_select('DISTINCT objet', $table_lien, $where);
768
-			while ($t = sql_fetch($r)) {
769
-				$type = $t['objet'];
770
-				$spip_table_objet = table_objet_sql($type);
771
-				$id_table_objet = id_table_objet($type);
772
-				$res = sql_select(
773
-					"L.$primary AS id,L.id_objet",
774
-					// la condition de jointure inclue L.objet='xxx' pour ne joindre que les bonnes lignes
775
-					// du coups toutes les lignes avec un autre objet ont un id_xxx=NULL puisque LEFT JOIN
776
-					// il faut les eliminier en repetant la condition dans le where L.objet='xxx'
777
-					"$table_lien AS L
756
+    include_spip('genie/optimiser');
757
+    $echec = false;
758
+    $dels = 0;
759
+    foreach ($objets as $objet => $id_objets) {
760
+        $objet = ($objet == '*') ? $objet : objet_type($objet); # securite
761
+        if (!is_array($id_objets) || reset($id_objets) == 'NOT') {
762
+            $id_objets = [$id_objets];
763
+        }
764
+        foreach ($id_objets as $id_objet) {
765
+            $where = lien_where($primary, $id, $objet, $id_objet);
766
+            # les liens vers un objet inexistant
767
+            $r = sql_select('DISTINCT objet', $table_lien, $where);
768
+            while ($t = sql_fetch($r)) {
769
+                $type = $t['objet'];
770
+                $spip_table_objet = table_objet_sql($type);
771
+                $id_table_objet = id_table_objet($type);
772
+                $res = sql_select(
773
+                    "L.$primary AS id,L.id_objet",
774
+                    // la condition de jointure inclue L.objet='xxx' pour ne joindre que les bonnes lignes
775
+                    // du coups toutes les lignes avec un autre objet ont un id_xxx=NULL puisque LEFT JOIN
776
+                    // il faut les eliminier en repetant la condition dans le where L.objet='xxx'
777
+                    "$table_lien AS L
778 778
 									LEFT JOIN $spip_table_objet AS O
779 779
 										ON (O.$id_table_objet=L.id_objet AND L.objet=" . sql_quote($type) . ')',
780
-					'L.objet=' . sql_quote($type) . " AND O.$id_table_objet IS NULL"
781
-				);
782
-				// sur une cle primaire composee, pas d'autres solutions que de virer un a un
783
-				while ($row = sql_fetch($res)) {
784
-					if ($primary === 'id_document' && in_array($type, ['site', 'rubrique']) && !(int) $row['id_objet']) {
785
-						continue; // gaffe, c'est le logo du site ou des rubriques!
786
-					}
787
-					$e = sql_delete(
788
-						$table_lien,
789
-						["$primary=" . $row['id'], 'id_objet=' . $row['id_objet'], 'objet=' . sql_quote($type)]
790
-					);
791
-					if ($e != false) {
792
-						$dels += $e;
793
-						spip_logger('genie')->notice(
794
-							'lien_optimise: Entree ' . $row['id'] . '/' . $row['id_objet'] . "/$type supprimee dans la table $table_lien"
795
-						);
796
-					}
797
-				}
798
-			}
799
-
800
-			# les liens depuis un objet inexistant
801
-			$table_source = table_objet_sql($objet_source);
802
-			// filtrer selon $id, $objet, $id_objet eventuellement fournis
803
-			// (en general '*' pour chaque)
804
-			$where = lien_where("L.$primary", $id, $objet, $id_objet);
805
-			$where[] = "O.$primary IS NULL";
806
-			$res = sql_select(
807
-				"L.$primary AS id",
808
-				"$table_lien AS L LEFT JOIN $table_source AS O ON L.$primary=O.$primary",
809
-				$where
810
-			);
811
-			$dels += optimiser_sansref($table_lien, $primary, $res);
812
-		}
813
-	}
814
-
815
-	return ($echec ? false : $dels);
780
+                    'L.objet=' . sql_quote($type) . " AND O.$id_table_objet IS NULL"
781
+                );
782
+                // sur une cle primaire composee, pas d'autres solutions que de virer un a un
783
+                while ($row = sql_fetch($res)) {
784
+                    if ($primary === 'id_document' && in_array($type, ['site', 'rubrique']) && !(int) $row['id_objet']) {
785
+                        continue; // gaffe, c'est le logo du site ou des rubriques!
786
+                    }
787
+                    $e = sql_delete(
788
+                        $table_lien,
789
+                        ["$primary=" . $row['id'], 'id_objet=' . $row['id_objet'], 'objet=' . sql_quote($type)]
790
+                    );
791
+                    if ($e != false) {
792
+                        $dels += $e;
793
+                        spip_logger('genie')->notice(
794
+                            'lien_optimise: Entree ' . $row['id'] . '/' . $row['id_objet'] . "/$type supprimee dans la table $table_lien"
795
+                        );
796
+                    }
797
+                }
798
+            }
799
+
800
+            # les liens depuis un objet inexistant
801
+            $table_source = table_objet_sql($objet_source);
802
+            // filtrer selon $id, $objet, $id_objet eventuellement fournis
803
+            // (en general '*' pour chaque)
804
+            $where = lien_where("L.$primary", $id, $objet, $id_objet);
805
+            $where[] = "O.$primary IS NULL";
806
+            $res = sql_select(
807
+                "L.$primary AS id",
808
+                "$table_lien AS L LEFT JOIN $table_source AS O ON L.$primary=O.$primary",
809
+                $where
810
+            );
811
+            $dels += optimiser_sansref($table_lien, $primary, $res);
812
+        }
813
+    }
814
+
815
+    return ($echec ? false : $dels);
816 816
 }
817 817
 
818 818
 
@@ -844,92 +844,92 @@  discard block
 block discarded – undo
844 844
  *     Nombre de modifications faites, false si échec.
845 845
  */
846 846
 function lien_set($objet_source, $primary, $table_lien, $id, $objets, $qualif) {
847
-	$echec = null;
848
-	$ok = 0;
849
-	$reordonner = false;
850
-	if (!$qualif) {
851
-		return false;
852
-	}
853
-	// nettoyer qualif qui peut venir directement d'un objet_trouver_lien :
854
-	unset($qualif[$primary]);
855
-	unset($qualif[$objet_source]);
856
-	if (isset($qualif['objet'])) {
857
-		unset($qualif[$qualif['objet']]);
858
-	}
859
-	unset($qualif['objet']);
860
-	unset($qualif['id_objet']);
861
-	foreach ($objets as $objet => $id_objets) {
862
-		// role, colonne, where par défaut
863
-		[$role, $colonne_role, $cond] =
864
-			roles_trouver_dans_qualif($objet_source, $objet, $qualif);
865
-
866
-		$objet = ($objet == '*') ? $objet : objet_type($objet); # securite
867
-		if (!is_array($id_objets) || reset($id_objets) == 'NOT') {
868
-			$id_objets = [$id_objets];
869
-		}
870
-		foreach ($id_objets as $id_objet) {
871
-			$args = [
872
-				'table_lien' => $table_lien,
873
-				'objet_source' => $objet_source,
874
-				'id_objet_source' => $id,
875
-				'objet' => $objet,
876
-				'id_objet' => $id_objet,
877
-				'role' => $role,
878
-				'colonne_role' => $colonne_role,
879
-				'action' => 'modifier',
880
-			];
881
-
882
-			// Envoyer aux plugins
883
-			$qualif = pipeline(
884
-				'pre_edition_lien',
885
-				[
886
-					'args' => $args,
887
-					'data' => $qualif,
888
-				]
889
-			);
890
-			$args['id_objet'] = $id_objet;
891
-
892
-			if (lien_triables($table_lien) && isset($qualif['rang_lien'])) {
893
-				if ((int) $qualif['rang_lien']) {
894
-					// on decale les liens de rang_lien>=la valeur inseree pour faire la place
895
-					// sauf sur le meme lien avec un role eventuellement different
896
-					$where_meme_lien = lien_where($primary, $id, $objet, $id_objet);
897
-					$where_meme_lien = implode(' AND ', $where_meme_lien);
898
-					$w = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet, ['rang_lien>=' . (int) $qualif['rang_lien'], "NOT($where_meme_lien)"]);
899
-					sql_update($table_lien, ['rang_lien' => 'rang_lien+1'], $w);
900
-				}
901
-				// tous les liens de même rôle recoivent le rang indiqué aussi
902
-				if (roles_colonne($objet_source, $objet)) {
903
-					$w = lien_where($primary, $id, $objet, $id_objet);
904
-					sql_updateq($table_lien, ['rang_lien' => (int) $qualif['rang_lien']], $w);
905
-				}
906
-				$reordonner = true;
907
-			}
908
-
909
-			$where = lien_where($primary, $id, $objet, $id_objet, $cond);
910
-			$e = sql_updateq($table_lien, $qualif, $where);
911
-
912
-			if ($e === false) {
913
-				$echec = true;
914
-			} else {
915
-				// Envoyer aux plugins
916
-				pipeline(
917
-					'post_edition_lien',
918
-					[
919
-						'args' => $args,
920
-						'data' => $qualif
921
-					]
922
-				);
923
-				$ok++;
924
-			}
925
-		}
926
-	}
927
-	// si on a fait des modif de rang, on reordonne les liens concernes
928
-	if ($reordonner) {
929
-		lien_ordonner($objet_source, $primary, $table_lien, $id, $objets);
930
-	}
931
-
932
-	return ($echec ? false : $ok);
847
+    $echec = null;
848
+    $ok = 0;
849
+    $reordonner = false;
850
+    if (!$qualif) {
851
+        return false;
852
+    }
853
+    // nettoyer qualif qui peut venir directement d'un objet_trouver_lien :
854
+    unset($qualif[$primary]);
855
+    unset($qualif[$objet_source]);
856
+    if (isset($qualif['objet'])) {
857
+        unset($qualif[$qualif['objet']]);
858
+    }
859
+    unset($qualif['objet']);
860
+    unset($qualif['id_objet']);
861
+    foreach ($objets as $objet => $id_objets) {
862
+        // role, colonne, where par défaut
863
+        [$role, $colonne_role, $cond] =
864
+            roles_trouver_dans_qualif($objet_source, $objet, $qualif);
865
+
866
+        $objet = ($objet == '*') ? $objet : objet_type($objet); # securite
867
+        if (!is_array($id_objets) || reset($id_objets) == 'NOT') {
868
+            $id_objets = [$id_objets];
869
+        }
870
+        foreach ($id_objets as $id_objet) {
871
+            $args = [
872
+                'table_lien' => $table_lien,
873
+                'objet_source' => $objet_source,
874
+                'id_objet_source' => $id,
875
+                'objet' => $objet,
876
+                'id_objet' => $id_objet,
877
+                'role' => $role,
878
+                'colonne_role' => $colonne_role,
879
+                'action' => 'modifier',
880
+            ];
881
+
882
+            // Envoyer aux plugins
883
+            $qualif = pipeline(
884
+                'pre_edition_lien',
885
+                [
886
+                    'args' => $args,
887
+                    'data' => $qualif,
888
+                ]
889
+            );
890
+            $args['id_objet'] = $id_objet;
891
+
892
+            if (lien_triables($table_lien) && isset($qualif['rang_lien'])) {
893
+                if ((int) $qualif['rang_lien']) {
894
+                    // on decale les liens de rang_lien>=la valeur inseree pour faire la place
895
+                    // sauf sur le meme lien avec un role eventuellement different
896
+                    $where_meme_lien = lien_where($primary, $id, $objet, $id_objet);
897
+                    $where_meme_lien = implode(' AND ', $where_meme_lien);
898
+                    $w = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet, ['rang_lien>=' . (int) $qualif['rang_lien'], "NOT($where_meme_lien)"]);
899
+                    sql_update($table_lien, ['rang_lien' => 'rang_lien+1'], $w);
900
+                }
901
+                // tous les liens de même rôle recoivent le rang indiqué aussi
902
+                if (roles_colonne($objet_source, $objet)) {
903
+                    $w = lien_where($primary, $id, $objet, $id_objet);
904
+                    sql_updateq($table_lien, ['rang_lien' => (int) $qualif['rang_lien']], $w);
905
+                }
906
+                $reordonner = true;
907
+            }
908
+
909
+            $where = lien_where($primary, $id, $objet, $id_objet, $cond);
910
+            $e = sql_updateq($table_lien, $qualif, $where);
911
+
912
+            if ($e === false) {
913
+                $echec = true;
914
+            } else {
915
+                // Envoyer aux plugins
916
+                pipeline(
917
+                    'post_edition_lien',
918
+                    [
919
+                        'args' => $args,
920
+                        'data' => $qualif
921
+                    ]
922
+                );
923
+                $ok++;
924
+            }
925
+        }
926
+    }
927
+    // si on a fait des modif de rang, on reordonne les liens concernes
928
+    if ($reordonner) {
929
+        lien_ordonner($objet_source, $primary, $table_lien, $id, $objets);
930
+    }
931
+
932
+    return ($echec ? false : $ok);
933 933
 }
934 934
 
935 935
 /**
@@ -959,23 +959,23 @@  discard block
 block discarded – undo
959 959
  * @return array
960 960
  */
961 961
 function lien_find($objet_source, $primary, $table_lien, $id, $objets, $cond = null) {
962
-	$trouve = [];
963
-	foreach ($objets as $objet => $id_objets) {
964
-		$objet = ($objet == '*') ? $objet : objet_type($objet); # securite
965
-		// gerer les roles s'il y en a dans $cond
966
-		[$cond] = roles_creer_condition_role($objet_source, $objet, $cond, true);
967
-		// lien_where prend en charge les $id_objets sous forme int ou array
968
-		$where = lien_where($primary, $id, $objet, $id_objets, $cond);
969
-		$liens = sql_allfetsel('*', $table_lien, $where);
970
-		// ajouter les entrees objet_source et objet cible par convenance
971
-		foreach ($liens as $l) {
972
-			$l[$objet_source] = $l[$primary];
973
-			$l[$l['objet']] = $l['id_objet'];
974
-			$trouve[] = $l;
975
-		}
976
-	}
977
-
978
-	return $trouve;
962
+    $trouve = [];
963
+    foreach ($objets as $objet => $id_objets) {
964
+        $objet = ($objet == '*') ? $objet : objet_type($objet); # securite
965
+        // gerer les roles s'il y en a dans $cond
966
+        [$cond] = roles_creer_condition_role($objet_source, $objet, $cond, true);
967
+        // lien_where prend en charge les $id_objets sous forme int ou array
968
+        $where = lien_where($primary, $id, $objet, $id_objets, $cond);
969
+        $liens = sql_allfetsel('*', $table_lien, $where);
970
+        // ajouter les entrees objet_source et objet cible par convenance
971
+        foreach ($liens as $l) {
972
+            $l[$objet_source] = $l[$primary];
973
+            $l[$l['objet']] = $l['id_objet'];
974
+            $trouve[] = $l;
975
+        }
976
+    }
977
+
978
+    return $trouve;
979 979
 }
980 980
 
981 981
 /**
@@ -986,25 +986,25 @@  discard block
 block discarded – undo
986 986
  * @param array|int $ids
987 987
  */
988 988
 function lien_propage_date_modif($objet, $ids) {
989
-	static $done = [];
990
-	$hash = md5($objet . serialize($ids));
991
-
992
-	// sql_updateq, peut être un rien lent.
993
-	// On évite de l'appeler 2 fois sur les mêmes choses
994
-	if (isset($done[$hash])) {
995
-		return;
996
-	}
997
-
998
-	$trouver_table = charger_fonction('trouver_table', 'base');
999
-
1000
-	$table = table_objet_sql($objet);
1001
-	if (
1002
-		($desc = $trouver_table($table)) && isset($desc['field']['date_modif'])
1003
-	) {
1004
-		$primary = id_table_objet($objet);
1005
-		$where = (is_array($ids) ? sql_in($primary, array_map('intval', $ids)) : "$primary=" . (int) $ids);
1006
-		sql_updateq($table, ['date_modif' => date('Y-m-d H:i:s')], $where);
1007
-	}
1008
-
1009
-	$done[$hash] = true;
989
+    static $done = [];
990
+    $hash = md5($objet . serialize($ids));
991
+
992
+    // sql_updateq, peut être un rien lent.
993
+    // On évite de l'appeler 2 fois sur les mêmes choses
994
+    if (isset($done[$hash])) {
995
+        return;
996
+    }
997
+
998
+    $trouver_table = charger_fonction('trouver_table', 'base');
999
+
1000
+    $table = table_objet_sql($objet);
1001
+    if (
1002
+        ($desc = $trouver_table($table)) && isset($desc['field']['date_modif'])
1003
+    ) {
1004
+        $primary = id_table_objet($objet);
1005
+        $where = (is_array($ids) ? sql_in($primary, array_map('intval', $ids)) : "$primary=" . (int) $ids);
1006
+        sql_updateq($table, ['date_modif' => date('Y-m-d H:i:s')], $where);
1007
+    }
1008
+
1009
+    $done[$hash] = true;
1010 1010
 }
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -52,7 +52,7 @@  discard block
 block discarded – undo
52 52
 	$l = '';
53 53
 	if (
54 54
 		($primary = id_table_objet($objet))
55
-		&& $trouver_table($l = $table_sql . '_liens', '', true, ['log_missing' => false])
55
+		&& $trouver_table($l = $table_sql.'_liens', '', true, ['log_missing' => false])
56 56
 		&& !preg_match(',[^\w],', $primary)
57 57
 		&& !preg_match(',[^\w],', $l)
58 58
 	) {
@@ -211,7 +211,7 @@  discard block
 block discarded – undo
211 211
  * @return int
212 212
  */
213 213
 function objet_optimiser_liens($objets_source, $objets_lies) {
214
-	spip_logger('genie')->debug('objet_optimiser_liens : ' . json_encode($objets_source, JSON_THROW_ON_ERROR) . ', ' . json_encode($objets_lies, JSON_THROW_ON_ERROR));
214
+	spip_logger('genie')->debug('objet_optimiser_liens : '.json_encode($objets_source, JSON_THROW_ON_ERROR).', '.json_encode($objets_lies, JSON_THROW_ON_ERROR));
215 215
 	return objet_traiter_liaisons('lien_optimise', $objets_source, $objets_lies);
216 216
 }
217 217
 
@@ -437,7 +437,7 @@  discard block
 block discarded – undo
437 437
 					$where_meme_lien = implode(' AND ', $where_meme_lien);
438 438
 					// on decale les liens de rang_lien>=la valeur inseree pour faire la place
439 439
 					// sauf sur le meme lien avec un role eventuellement different
440
-					$w = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet, ['rang_lien>=' . (int) $insertions['rang_lien'], "NOT($where_meme_lien)"]);
440
+					$w = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet, ['rang_lien>='.(int) $insertions['rang_lien'], "NOT($where_meme_lien)"]);
441 441
 					sql_update($table_lien, ['rang_lien' => 'rang_lien+1'], $w);
442 442
 				}
443 443
 
@@ -502,7 +502,7 @@  discard block
 block discarded – undo
502 502
 					$rang = 1;
503 503
 					foreach ($liens as $lien) {
504 504
 						if (empty($deja_reordonne[$lien[$primary]][$lien['objet']][$lien['id_objet']])) {
505
-							$where = lien_where($primary, $lien[$primary], $lien['objet'], $lien['id_objet'], ['rang_lien!=' . (int) $rang]);
505
+							$where = lien_where($primary, $lien[$primary], $lien['objet'], $lien['id_objet'], ['rang_lien!='.(int) $rang]);
506 506
 							sql_updateq($table_lien, ['rang_lien' => $rang], $where);
507 507
 
508 508
 							if (empty($deja_reordonne[$lien[$primary]])) {
@@ -571,7 +571,7 @@  discard block
 block discarded – undo
571 571
 			addslashes($primary),
572 572
 			array_map('intval', $id_source),
573 573
 			$not
574
-		) : addslashes($primary) . ($not ? '<>' : '=') . (int) $id_source);
574
+		) : addslashes($primary).($not ? '<>' : '=').(int) $id_source);
575 575
 	} elseif ($not) {
576 576
 		$where[] = '0=1';
577 577
 	} // idiot mais quand meme
@@ -583,14 +583,14 @@  discard block
 block discarded – undo
583 583
 	}
584 584
 
585 585
 	if ($objet !== '*') {
586
-		$where[] = 'objet=' . sql_quote($objet);
586
+		$where[] = 'objet='.sql_quote($objet);
587 587
 	}
588 588
 	if ($id_objet !== '*') {
589 589
 		$where[] = (is_array($id_objet) ? sql_in(
590 590
 			'id_objet',
591 591
 			array_map('intval', $id_objet),
592 592
 			$not
593
-		) : 'id_objet' . ($not ? '<>' : '=') . (int) $id_objet);
593
+		) : 'id_objet'.($not ? '<>' : '=').(int) $id_objet);
594 594
 	} elseif ($not) {
595 595
 		$where[] = '0=1';
596 596
 	} // idiot mais quand meme
@@ -611,7 +611,7 @@  discard block
 block discarded – undo
611 611
 function lien_rang_where($table_lien, $primary, $id_source, $objet, $id_objet, $cond = []) {
612 612
 
613 613
 	// si on veut compter les rangs autrement que le core ne le fait par defaut, fournir le where adhoc
614
-	if (function_exists($f = 'lien_rang_where_' . $table_lien)) {
614
+	if (function_exists($f = 'lien_rang_where_'.$table_lien)) {
615 615
 		return $f($primary, $id_source, $objet, $id_objet, $cond);
616 616
 	}
617 617
 
@@ -776,8 +776,8 @@  discard block
 block discarded – undo
776 776
 					// il faut les eliminier en repetant la condition dans le where L.objet='xxx'
777 777
 					"$table_lien AS L
778 778
 									LEFT JOIN $spip_table_objet AS O
779
-										ON (O.$id_table_objet=L.id_objet AND L.objet=" . sql_quote($type) . ')',
780
-					'L.objet=' . sql_quote($type) . " AND O.$id_table_objet IS NULL"
779
+										ON (O.$id_table_objet=L.id_objet AND L.objet=".sql_quote($type).')',
780
+					'L.objet='.sql_quote($type)." AND O.$id_table_objet IS NULL"
781 781
 				);
782 782
 				// sur une cle primaire composee, pas d'autres solutions que de virer un a un
783 783
 				while ($row = sql_fetch($res)) {
@@ -786,12 +786,12 @@  discard block
 block discarded – undo
786 786
 					}
787 787
 					$e = sql_delete(
788 788
 						$table_lien,
789
-						["$primary=" . $row['id'], 'id_objet=' . $row['id_objet'], 'objet=' . sql_quote($type)]
789
+						["$primary=".$row['id'], 'id_objet='.$row['id_objet'], 'objet='.sql_quote($type)]
790 790
 					);
791 791
 					if ($e != false) {
792 792
 						$dels += $e;
793 793
 						spip_logger('genie')->notice(
794
-							'lien_optimise: Entree ' . $row['id'] . '/' . $row['id_objet'] . "/$type supprimee dans la table $table_lien"
794
+							'lien_optimise: Entree '.$row['id'].'/'.$row['id_objet']."/$type supprimee dans la table $table_lien"
795 795
 						);
796 796
 					}
797 797
 				}
@@ -895,7 +895,7 @@  discard block
 block discarded – undo
895 895
 					// sauf sur le meme lien avec un role eventuellement different
896 896
 					$where_meme_lien = lien_where($primary, $id, $objet, $id_objet);
897 897
 					$where_meme_lien = implode(' AND ', $where_meme_lien);
898
-					$w = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet, ['rang_lien>=' . (int) $qualif['rang_lien'], "NOT($where_meme_lien)"]);
898
+					$w = lien_rang_where($table_lien, $primary, $id, $objet, $id_objet, ['rang_lien>='.(int) $qualif['rang_lien'], "NOT($where_meme_lien)"]);
899 899
 					sql_update($table_lien, ['rang_lien' => 'rang_lien+1'], $w);
900 900
 				}
901 901
 				// tous les liens de même rôle recoivent le rang indiqué aussi
@@ -987,7 +987,7 @@  discard block
 block discarded – undo
987 987
  */
988 988
 function lien_propage_date_modif($objet, $ids) {
989 989
 	static $done = [];
990
-	$hash = md5($objet . serialize($ids));
990
+	$hash = md5($objet.serialize($ids));
991 991
 
992 992
 	// sql_updateq, peut être un rien lent.
993 993
 	// On évite de l'appeler 2 fois sur les mêmes choses
@@ -1002,7 +1002,7 @@  discard block
 block discarded – undo
1002 1002
 		($desc = $trouver_table($table)) && isset($desc['field']['date_modif'])
1003 1003
 	) {
1004 1004
 		$primary = id_table_objet($objet);
1005
-		$where = (is_array($ids) ? sql_in($primary, array_map('intval', $ids)) : "$primary=" . (int) $ids);
1005
+		$where = (is_array($ids) ? sql_in($primary, array_map('intval', $ids)) : "$primary=".(int) $ids);
1006 1006
 		sql_updateq($table, ['date_modif' => date('Y-m-d H:i:s')], $where);
1007 1007
 	}
1008 1008
 
Please login to merge, or discard this patch.