Completed
Push — master ( 388bf1...930d84 )
by cam
01:23
created
ecrire/req/sqlite_generique.php 1 patch
Indentation   +1616 added lines, -1616 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 ?
@@ -44,88 +44,88 @@  discard block
 block discarded – undo
44 44
  */
45 45
 function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $sqlite_version = '')
46 46
 {
47
-	static $last_connect = [];
48
-
49
-	// si provient de selectdb
50
-	// un code pour etre sur que l'on vient de select_db()
51
-	if (strpos($db, $code = '@selectdb@') !== false) {
52
-		foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
53
-			$$a = $last_connect[$a];
54
-		}
55
-		$db = str_replace($code, '', $db);
56
-	}
57
-
58
-	/*
47
+    static $last_connect = [];
48
+
49
+    // si provient de selectdb
50
+    // un code pour etre sur que l'on vient de select_db()
51
+    if (strpos($db, $code = '@selectdb@') !== false) {
52
+        foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
53
+            $$a = $last_connect[$a];
54
+        }
55
+        $db = str_replace($code, '', $db);
56
+    }
57
+
58
+    /*
59 59
 	 * En sqlite, seule l'adresse du fichier est importante.
60 60
 	 * Ce sera $db le nom,
61 61
 	 * le path est $addr
62 62
 	 * (_DIR_DB si $addr est vide)
63 63
 	 */
64
-	_sqlite_init();
65
-
66
-	// determiner le dossier de la base : $addr ou _DIR_DB
67
-	$f = _DIR_DB;
68
-	if ($addr and str_contains($addr, '/')) {
69
-		$f = rtrim($addr, '/') . '/';
70
-	}
71
-
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 and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
75
-		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
76
-
77
-		return false;
78
-	}
79
-
80
-	// charger les modules sqlite au besoin
81
-	if (!_sqlite_charger_version($sqlite_version)) {
82
-		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
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
-		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f", 'sqlite.' . _LOG_HS);
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 ? $prefixe : $db,
126
-		'link' => $link,
127
-		'total_requetes' => 0,
128
-	];
64
+    _sqlite_init();
65
+
66
+    // determiner le dossier de la base : $addr ou _DIR_DB
67
+    $f = _DIR_DB;
68
+    if ($addr and str_contains($addr, '/')) {
69
+        $f = rtrim($addr, '/') . '/';
70
+    }
71
+
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 and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
75
+        spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
76
+
77
+        return false;
78
+    }
79
+
80
+    // charger les modules sqlite au besoin
81
+    if (!_sqlite_charger_version($sqlite_version)) {
82
+        spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
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
+        spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f", 'sqlite.' . _LOG_HS);
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 ? $prefixe : $db,
126
+        'link' => $link,
127
+        'total_requetes' => 0,
128
+    ];
129 129
 }
130 130
 
131 131
 /**
@@ -136,9 +136,9 @@  discard block
 block discarded – undo
136 136
  * @return PDO
137 137
  */
138 138
 function spip_sqlite_open(string $file): \PDO {
139
-	$PDO = new \PDO("sqlite:$file");
140
-	$PDO->setAttribute(\PDO::ATTR_STATEMENT_CLASS , [\Spip\Sql\Sqlite\PDOStatement::class, [&$PDO]]);
141
-	return $PDO;
139
+    $PDO = new \PDO("sqlite:$file");
140
+    $PDO->setAttribute(\PDO::ATTR_STATEMENT_CLASS , [\Spip\Sql\Sqlite\PDOStatement::class, [&$PDO]]);
141
+    return $PDO;
142 142
 }
143 143
 
144 144
 
@@ -158,14 +158,14 @@  discard block
 block discarded – undo
158 158
  */
159 159
 function spip_sqlite_query($query, $serveur = '', $requeter = true)
160 160
 {
161
-	#spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
162
-	#_sqlite_init(); // fait la premiere fois dans spip_sqlite
163
-	$query = Sqlite::traduire_requete($query, $serveur);
164
-	if (!$requeter) {
165
-		return $query;
166
-	}
167
-
168
-	return Sqlite::executer_requete($query, $serveur);
161
+    #spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
162
+    #_sqlite_init(); // fait la premiere fois dans spip_sqlite
163
+    $query = Sqlite::traduire_requete($query, $serveur);
164
+    if (!$requeter) {
165
+        return $query;
166
+    }
167
+
168
+    return Sqlite::executer_requete($query, $serveur);
169 169
 }
170 170
 
171 171
 
@@ -183,11 +183,11 @@  discard block
 block discarded – undo
183 183
 function spip_sqlite_alter($query, $serveur = '', $requeter = true)
184 184
 {
185 185
 
186
-	$query = spip_sqlite_query("ALTER $query", $serveur, false);
187
-	// traduire la requete pour recuperer les bons noms de table
188
-	$query = Sqlite::traduire_requete($query, $serveur);
186
+    $query = spip_sqlite_query("ALTER $query", $serveur, false);
187
+    // traduire la requete pour recuperer les bons noms de table
188
+    $query = Sqlite::traduire_requete($query, $serveur);
189 189
 
190
-	/*
190
+    /*
191 191
 		 * la il faut faire les transformations
192 192
 		 * si ALTER TABLE x (DROP|CHANGE) y
193 193
 		 *
@@ -196,251 +196,251 @@  discard block
 block discarded – undo
196 196
 		 * 3) faire chaque requete independemment
197 197
 		 */
198 198
 
199
-	// 1
200
-	if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
201
-		$debut = $regs[1];
202
-		$table = $regs[3];
203
-		$suite = $regs[4];
204
-	} else {
205
-		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
206
-
207
-		return false;
208
-	}
209
-
210
-	// 2
211
-	// il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
212
-	// tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
213
-	// ou revoir l'api de sql_alter en creant un
214
-	// sql_alter_table($table,array($actions));
215
-	$todo = explode(',', $suite);
216
-
217
-	// on remet les morceaux dechires ensembles... que c'est laid !
218
-	$todo2 = [];
219
-	$i = 0;
220
-	$ouverte = false;
221
-	while ($do = array_shift($todo)) {
222
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
223
-		$o = (str_contains($do, '('));
224
-		$f = (str_contains($do, ')'));
225
-		if ($o and !$f) {
226
-			$ouverte = true;
227
-		} elseif ($f) {
228
-			$ouverte = false;
229
-		}
230
-		if (!$ouverte) {
231
-			$i++;
232
-		}
233
-	}
234
-
235
-	// 3
236
-	$resultats = [];
237
-	foreach ($todo2 as $do) {
238
-		$do = trim($do);
239
-		if (
240
-			!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
241
-				. '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
242
-				. '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
243
-				. '|ADD COLUMN|ADD'
244
-				. ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
245
-		) {
246
-			spip_log(
247
-				"SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
248
-				'sqlite.' . _LOG_ERREUR
249
-			);
250
-
251
-			return false;
252
-		}
253
-
254
-		$cle = strtoupper($matches[1]);
255
-		$colonne_origine = $matches[2];
256
-		$colonne_destination = '';
257
-
258
-		$def = $matches[3];
259
-
260
-		// eluder une eventuelle clause before|after|first inutilisable
261
-		$defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
262
-		$defo = $defr; // garder la def d'origine pour certains cas
263
-		// remplacer les definitions venant de mysql
264
-		$defr = _sqlite_remplacements_definitions_table($defr);
265
-
266
-		// reinjecter dans le do
267
-		$do = str_replace($def, $defr, $do);
268
-		$def = $defr;
269
-
270
-		switch ($cle) {
271
-				// suppression d'un index
272
-			case 'DROP KEY':
273
-			case 'DROP INDEX':
274
-				$nom_index = $colonne_origine;
275
-				spip_sqlite_drop_index($nom_index, $table, $serveur);
276
-				break;
277
-
278
-				// suppression d'une pk
279
-			case 'DROP PRIMARY KEY':
280
-				if (
281
-					!_sqlite_modifier_table(
282
-						$table,
283
-						$colonne_origine,
284
-						['key' => ['PRIMARY KEY' => '']],
285
-						$serveur
286
-					)
287
-				) {
288
-					return false;
289
-				}
290
-				break;
291
-				// suppression d'une colonne
292
-			case 'DROP COLUMN':
293
-			case 'DROP':
294
-				if (
295
-					!_sqlite_modifier_table(
296
-						$table,
297
-						[$colonne_origine => ''],
298
-						[],
299
-						$serveur
300
-					)
301
-				) {
302
-					return false;
303
-				}
304
-				break;
305
-
306
-			case 'CHANGE COLUMN':
307
-			case 'CHANGE':
308
-				// recuperer le nom de la future colonne
309
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
310
-				// en tenant compte de la cle primaire (ce qui est mieux)
311
-				$def = trim($defo);
312
-				$colonne_destination = substr($def, 0, strpos($def, ' '));
313
-				$def = substr($def, strlen($colonne_destination) + 1);
314
-
315
-				if (
316
-					!_sqlite_modifier_table(
317
-						$table,
318
-						[$colonne_origine => $colonne_destination],
319
-						['field' => [$colonne_destination => $def]],
320
-						$serveur
321
-					)
322
-				) {
323
-					return false;
324
-				}
325
-				break;
326
-
327
-			case 'MODIFY':
328
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
329
-				// en tenant compte de la cle primaire (ce qui est mieux)
330
-				if (
331
-					!_sqlite_modifier_table(
332
-						$table,
333
-						$colonne_origine,
334
-						['field' => [$colonne_origine => $defo]],
335
-						$serveur
336
-					)
337
-				) {
338
-					return false;
339
-				}
340
-				break;
341
-
342
-				// pas geres en sqlite2
343
-			case 'RENAME':
344
-				$do = 'RENAME TO' . substr($do, 6);
345
-			case 'RENAME TO':
346
-				if (!Sqlite::executer_requete("$debut $do", $serveur)) {
347
-					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
348
-
349
-					return false;
350
-				}
351
-				break;
352
-
353
-				// ajout d'une pk
354
-			case 'ADD PRIMARY KEY':
355
-				$pk = trim(substr($do, 16));
356
-				$pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
357
-				if (
358
-					!_sqlite_modifier_table(
359
-						$table,
360
-						$colonne_origine,
361
-						['key' => ['PRIMARY KEY' => $pk]],
362
-						$serveur
363
-					)
364
-				) {
365
-					return false;
366
-				}
367
-				break;
368
-				// ajout d'un index
369
-			case 'ADD UNIQUE KEY':
370
-			case 'ADD UNIQUE':
371
-				$unique = true;
372
-			case 'ADD INDEX':
373
-			case 'ADD KEY':
374
-				if (!isset($unique)) {
375
-					$unique = false;
376
-				}
377
-				// peut etre "(colonne)" ou "nom_index (colonnes)"
378
-				// bug potentiel si qqn met "(colonne, colonne)"
379
-				//
380
-				// nom_index (colonnes)
381
-				if ($def) {
382
-					$colonnes = substr($def, 1, -1);
383
-					$nom_index = $colonne_origine;
384
-				} else {
385
-					// (colonne)
386
-					if ($colonne_origine[0] == '(') {
387
-						$colonnes = substr($colonne_origine, 1, -1);
388
-						if (str_contains(',', $colonnes)) {
389
-							spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
390
-								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
391
-							break;
392
-						} else {
393
-							$nom_index = $colonnes;
394
-						}
395
-					} // nom_index
396
-					else {
397
-						$nom_index = $colonnes = $colonne_origine;
398
-					}
399
-				}
400
-				spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
401
-				break;
402
-
403
-				// pas geres en sqlite2
404
-			case 'ADD COLUMN':
405
-				$do = 'ADD' . substr($do, 10);
406
-			case 'ADD':
407
-			default:
408
-				if (!preg_match(',primary\s+key,i', $do)) {
409
-					if (!Sqlite::executer_requete("$debut $do", $serveur)) {
410
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
411
-
412
-						return false;
413
-					}
414
-					break;
415
-				}
416
-				// ou si la colonne est aussi primary key
417
-				// cas du add id_truc int primary key
418
-				// ajout d'une colonne qui passe en primary key directe
419
-				else {
420
-					$def = trim(substr($do, 3));
421
-					$colonne_ajoutee = substr($def, 0, strpos($def, ' '));
422
-					$def = substr($def, strlen($colonne_ajoutee) + 1);
423
-					$opts = [];
424
-					if (preg_match(',primary\s+key,i', $def)) {
425
-						$opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
426
-						$def = preg_replace(',primary\s+key,i', '', $def);
427
-					}
428
-					$opts['field'] = [$colonne_ajoutee => $def];
429
-					if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
430
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
431
-
432
-						return false;
433
-					}
434
-				}
435
-				break;
436
-		}
437
-		// tout est bon, ouf !
438
-		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
439
-	}
440
-
441
-	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
442
-
443
-	return true;
199
+    // 1
200
+    if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
201
+        $debut = $regs[1];
202
+        $table = $regs[3];
203
+        $suite = $regs[4];
204
+    } else {
205
+        spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
206
+
207
+        return false;
208
+    }
209
+
210
+    // 2
211
+    // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
212
+    // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
213
+    // ou revoir l'api de sql_alter en creant un
214
+    // sql_alter_table($table,array($actions));
215
+    $todo = explode(',', $suite);
216
+
217
+    // on remet les morceaux dechires ensembles... que c'est laid !
218
+    $todo2 = [];
219
+    $i = 0;
220
+    $ouverte = false;
221
+    while ($do = array_shift($todo)) {
222
+        $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
223
+        $o = (str_contains($do, '('));
224
+        $f = (str_contains($do, ')'));
225
+        if ($o and !$f) {
226
+            $ouverte = true;
227
+        } elseif ($f) {
228
+            $ouverte = false;
229
+        }
230
+        if (!$ouverte) {
231
+            $i++;
232
+        }
233
+    }
234
+
235
+    // 3
236
+    $resultats = [];
237
+    foreach ($todo2 as $do) {
238
+        $do = trim($do);
239
+        if (
240
+            !preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
241
+                . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
242
+                . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
243
+                . '|ADD COLUMN|ADD'
244
+                . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
245
+        ) {
246
+            spip_log(
247
+                "SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
248
+                'sqlite.' . _LOG_ERREUR
249
+            );
250
+
251
+            return false;
252
+        }
253
+
254
+        $cle = strtoupper($matches[1]);
255
+        $colonne_origine = $matches[2];
256
+        $colonne_destination = '';
257
+
258
+        $def = $matches[3];
259
+
260
+        // eluder une eventuelle clause before|after|first inutilisable
261
+        $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
262
+        $defo = $defr; // garder la def d'origine pour certains cas
263
+        // remplacer les definitions venant de mysql
264
+        $defr = _sqlite_remplacements_definitions_table($defr);
265
+
266
+        // reinjecter dans le do
267
+        $do = str_replace($def, $defr, $do);
268
+        $def = $defr;
269
+
270
+        switch ($cle) {
271
+                // suppression d'un index
272
+            case 'DROP KEY':
273
+            case 'DROP INDEX':
274
+                $nom_index = $colonne_origine;
275
+                spip_sqlite_drop_index($nom_index, $table, $serveur);
276
+                break;
277
+
278
+                // suppression d'une pk
279
+            case 'DROP PRIMARY KEY':
280
+                if (
281
+                    !_sqlite_modifier_table(
282
+                        $table,
283
+                        $colonne_origine,
284
+                        ['key' => ['PRIMARY KEY' => '']],
285
+                        $serveur
286
+                    )
287
+                ) {
288
+                    return false;
289
+                }
290
+                break;
291
+                // suppression d'une colonne
292
+            case 'DROP COLUMN':
293
+            case 'DROP':
294
+                if (
295
+                    !_sqlite_modifier_table(
296
+                        $table,
297
+                        [$colonne_origine => ''],
298
+                        [],
299
+                        $serveur
300
+                    )
301
+                ) {
302
+                    return false;
303
+                }
304
+                break;
305
+
306
+            case 'CHANGE COLUMN':
307
+            case 'CHANGE':
308
+                // recuperer le nom de la future colonne
309
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
310
+                // en tenant compte de la cle primaire (ce qui est mieux)
311
+                $def = trim($defo);
312
+                $colonne_destination = substr($def, 0, strpos($def, ' '));
313
+                $def = substr($def, strlen($colonne_destination) + 1);
314
+
315
+                if (
316
+                    !_sqlite_modifier_table(
317
+                        $table,
318
+                        [$colonne_origine => $colonne_destination],
319
+                        ['field' => [$colonne_destination => $def]],
320
+                        $serveur
321
+                    )
322
+                ) {
323
+                    return false;
324
+                }
325
+                break;
326
+
327
+            case 'MODIFY':
328
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
329
+                // en tenant compte de la cle primaire (ce qui est mieux)
330
+                if (
331
+                    !_sqlite_modifier_table(
332
+                        $table,
333
+                        $colonne_origine,
334
+                        ['field' => [$colonne_origine => $defo]],
335
+                        $serveur
336
+                    )
337
+                ) {
338
+                    return false;
339
+                }
340
+                break;
341
+
342
+                // pas geres en sqlite2
343
+            case 'RENAME':
344
+                $do = 'RENAME TO' . substr($do, 6);
345
+            case 'RENAME TO':
346
+                if (!Sqlite::executer_requete("$debut $do", $serveur)) {
347
+                    spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
348
+
349
+                    return false;
350
+                }
351
+                break;
352
+
353
+                // ajout d'une pk
354
+            case 'ADD PRIMARY KEY':
355
+                $pk = trim(substr($do, 16));
356
+                $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
357
+                if (
358
+                    !_sqlite_modifier_table(
359
+                        $table,
360
+                        $colonne_origine,
361
+                        ['key' => ['PRIMARY KEY' => $pk]],
362
+                        $serveur
363
+                    )
364
+                ) {
365
+                    return false;
366
+                }
367
+                break;
368
+                // ajout d'un index
369
+            case 'ADD UNIQUE KEY':
370
+            case 'ADD UNIQUE':
371
+                $unique = true;
372
+            case 'ADD INDEX':
373
+            case 'ADD KEY':
374
+                if (!isset($unique)) {
375
+                    $unique = false;
376
+                }
377
+                // peut etre "(colonne)" ou "nom_index (colonnes)"
378
+                // bug potentiel si qqn met "(colonne, colonne)"
379
+                //
380
+                // nom_index (colonnes)
381
+                if ($def) {
382
+                    $colonnes = substr($def, 1, -1);
383
+                    $nom_index = $colonne_origine;
384
+                } else {
385
+                    // (colonne)
386
+                    if ($colonne_origine[0] == '(') {
387
+                        $colonnes = substr($colonne_origine, 1, -1);
388
+                        if (str_contains(',', $colonnes)) {
389
+                            spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
390
+                                . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
391
+                            break;
392
+                        } else {
393
+                            $nom_index = $colonnes;
394
+                        }
395
+                    } // nom_index
396
+                    else {
397
+                        $nom_index = $colonnes = $colonne_origine;
398
+                    }
399
+                }
400
+                spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
401
+                break;
402
+
403
+                // pas geres en sqlite2
404
+            case 'ADD COLUMN':
405
+                $do = 'ADD' . substr($do, 10);
406
+            case 'ADD':
407
+            default:
408
+                if (!preg_match(',primary\s+key,i', $do)) {
409
+                    if (!Sqlite::executer_requete("$debut $do", $serveur)) {
410
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
411
+
412
+                        return false;
413
+                    }
414
+                    break;
415
+                }
416
+                // ou si la colonne est aussi primary key
417
+                // cas du add id_truc int primary key
418
+                // ajout d'une colonne qui passe en primary key directe
419
+                else {
420
+                    $def = trim(substr($do, 3));
421
+                    $colonne_ajoutee = substr($def, 0, strpos($def, ' '));
422
+                    $def = substr($def, strlen($colonne_ajoutee) + 1);
423
+                    $opts = [];
424
+                    if (preg_match(',primary\s+key,i', $def)) {
425
+                        $opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
426
+                        $def = preg_replace(',primary\s+key,i', '', $def);
427
+                    }
428
+                    $opts['field'] = [$colonne_ajoutee => $def];
429
+                    if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
430
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
431
+
432
+                        return false;
433
+                    }
434
+                }
435
+                break;
436
+        }
437
+        // tout est bon, ouf !
438
+        spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
439
+    }
440
+
441
+    spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
442
+
443
+    return true;
444 444
 }
445 445
 
446 446
 /**
@@ -462,38 +462,38 @@  discard block
 block discarded – undo
462 462
  *     - true si la requête réussie, false sinon.
463 463
  */
464 464
 function spip_sqlite_create(
465
-	$nom,
466
-	$champs,
467
-	$cles,
468
-	$autoinc = false,
469
-	$temporary = false,
470
-	$serveur = '',
471
-	$requeter = true
465
+    $nom,
466
+    $champs,
467
+    $cles,
468
+    $autoinc = false,
469
+    $temporary = false,
470
+    $serveur = '',
471
+    $requeter = true
472 472
 ) {
473
-	$query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
474
-	if (!$query) {
475
-		return false;
476
-	}
477
-	$res = spip_sqlite_query($query, $serveur, $requeter);
478
-
479
-	// SQLite ne cree pas les KEY sur les requetes CREATE TABLE
480
-	// il faut donc les faire creer ensuite
481
-	if (!$requeter) {
482
-		return $res;
483
-	}
484
-
485
-	$ok = $res ? true : false;
486
-	if ($ok) {
487
-		foreach ($cles as $k => $v) {
488
-			if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
489
-				$index = trim(substr($k, strlen($m[1])));
490
-				$unique = (strlen($m[1]) > 3);
491
-				$ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
492
-			}
493
-		}
494
-	}
495
-
496
-	return $ok ? true : false;
473
+    $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
474
+    if (!$query) {
475
+        return false;
476
+    }
477
+    $res = spip_sqlite_query($query, $serveur, $requeter);
478
+
479
+    // SQLite ne cree pas les KEY sur les requetes CREATE TABLE
480
+    // il faut donc les faire creer ensuite
481
+    if (!$requeter) {
482
+        return $res;
483
+    }
484
+
485
+    $ok = $res ? true : false;
486
+    if ($ok) {
487
+        foreach ($cles as $k => $v) {
488
+            if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
489
+                $index = trim(substr($k, strlen($m[1])));
490
+                $unique = (strlen($m[1]) > 3);
491
+                $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
492
+            }
493
+        }
494
+    }
495
+
496
+    return $ok ? true : false;
497 497
 }
498 498
 
499 499
 /**
@@ -507,21 +507,21 @@  discard block
 block discarded – undo
507 507
  **/
508 508
 function spip_sqlite_create_base($nom, $serveur = '', $option = true)
509 509
 {
510
-	$f = $nom . '.sqlite';
511
-	if (strpos($nom, '/') === false) {
512
-		$f = _DIR_DB . $f;
513
-	}
510
+    $f = $nom . '.sqlite';
511
+    if (strpos($nom, '/') === false) {
512
+        $f = _DIR_DB . $f;
513
+    }
514 514
 
515
-	$ok = new \PDO("sqlite:$f");
515
+    $ok = new \PDO("sqlite:$f");
516 516
 
517
-	if ($ok) {
518
-		unset($ok);
517
+    if ($ok) {
518
+        unset($ok);
519 519
 
520
-		return true;
521
-	}
522
-	unset($ok);
520
+        return true;
521
+    }
522
+    unset($ok);
523 523
 
524
-	return false;
524
+    return false;
525 525
 }
526 526
 
527 527
 
@@ -543,22 +543,22 @@  discard block
 block discarded – undo
543 543
  */
544 544
 function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true)
545 545
 {
546
-	if (!$query_select) {
547
-		return false;
548
-	}
549
-	// vue deja presente
550
-	if (sql_showtable($nom, false, $serveur)) {
551
-		spip_log(
552
-			"Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
553
-			'sqlite.' . _LOG_ERREUR
554
-		);
555
-
556
-		return false;
557
-	}
558
-
559
-	$query = "CREATE VIEW $nom AS " . $query_select;
560
-
561
-	return spip_sqlite_query($query, $serveur, $requeter);
546
+    if (!$query_select) {
547
+        return false;
548
+    }
549
+    // vue deja presente
550
+    if (sql_showtable($nom, false, $serveur)) {
551
+        spip_log(
552
+            "Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
553
+            'sqlite.' . _LOG_ERREUR
554
+        );
555
+
556
+        return false;
557
+    }
558
+
559
+    $query = "CREATE VIEW $nom AS " . $query_select;
560
+
561
+    return spip_sqlite_query($query, $serveur, $requeter);
562 562
 }
563 563
 
564 564
 /**
@@ -581,54 +581,54 @@  discard block
 block discarded – undo
581 581
  */
582 582
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true)
583 583
 {
584
-	if (!($nom or $table or $champs)) {
585
-		spip_log(
586
-			"Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
587
-			'sqlite.' . _LOG_ERREUR
588
-		);
589
-
590
-		return false;
591
-	}
592
-
593
-	// SQLite ne differentie pas noms des index en fonction des tables
594
-	// il faut donc creer des noms uniques d'index pour une base sqlite
595
-	$nom = $table . '_' . $nom;
596
-	// enlever d'eventuelles parentheses deja presentes sur champs
597
-	if (!is_array($champs)) {
598
-		if ($champs[0] == '(') {
599
-			$champs = substr($champs, 1, -1);
600
-		}
601
-		$champs = [$champs];
602
-		// supprimer l'info de longueur d'index mysql en fin de champ
603
-		$champs = preg_replace(',\(\d+\)$,', '', $champs);
604
-	}
605
-
606
-	$ifnotexists = '';
607
-	$version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
608
-	if (!function_exists('spip_version_compare')) {
609
-		include_spip('plugins/installer');
610
-	}
611
-
612
-	if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
613
-		$ifnotexists = ' IF NOT EXISTS';
614
-	} else {
615
-		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
616
-		$a = spip_sqlite_showtable($table, $serveur);
617
-		if (isset($a['key']['KEY ' . $nom])) {
618
-			return true;
619
-		}
620
-	}
621
-
622
-	$query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
623
-	$res = spip_sqlite_query($query, $serveur, $requeter);
624
-	if (!$requeter) {
625
-		return $res;
626
-	}
627
-	if ($res) {
628
-		return true;
629
-	} else {
630
-		return false;
631
-	}
584
+    if (!($nom or $table or $champs)) {
585
+        spip_log(
586
+            "Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
587
+            'sqlite.' . _LOG_ERREUR
588
+        );
589
+
590
+        return false;
591
+    }
592
+
593
+    // SQLite ne differentie pas noms des index en fonction des tables
594
+    // il faut donc creer des noms uniques d'index pour une base sqlite
595
+    $nom = $table . '_' . $nom;
596
+    // enlever d'eventuelles parentheses deja presentes sur champs
597
+    if (!is_array($champs)) {
598
+        if ($champs[0] == '(') {
599
+            $champs = substr($champs, 1, -1);
600
+        }
601
+        $champs = [$champs];
602
+        // supprimer l'info de longueur d'index mysql en fin de champ
603
+        $champs = preg_replace(',\(\d+\)$,', '', $champs);
604
+    }
605
+
606
+    $ifnotexists = '';
607
+    $version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
608
+    if (!function_exists('spip_version_compare')) {
609
+        include_spip('plugins/installer');
610
+    }
611
+
612
+    if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
613
+        $ifnotexists = ' IF NOT EXISTS';
614
+    } else {
615
+        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
616
+        $a = spip_sqlite_showtable($table, $serveur);
617
+        if (isset($a['key']['KEY ' . $nom])) {
618
+            return true;
619
+        }
620
+    }
621
+
622
+    $query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
623
+    $res = spip_sqlite_query($query, $serveur, $requeter);
624
+    if (!$requeter) {
625
+        return $res;
626
+    }
627
+    if ($res) {
628
+        return true;
629
+    } else {
630
+        return false;
631
+    }
632 632
 }
633 633
 
634 634
 /**
@@ -645,24 +645,24 @@  discard block
 block discarded – undo
645 645
  */
646 646
 function spip_sqlite_count($r, $serveur = '', $requeter = true)
647 647
 {
648
-	if (!$r) {
649
-		return 0;
650
-	}
651
-
652
-	// select ou autre (insert, update,...) ?
653
-	// (link,requete) a compter
654
-	if (strtoupper(substr(ltrim($r->queryString), 0, 6)) === 'SELECT') {
655
-		$link = $r->getPDO();
656
-		$query = "SELECT count(*) as zzzzsqlitecount FROM ({$r->queryString})";
657
-		$l = $link->query($query);
658
-		$i = 0;
659
-		if ($l and $z = $l->fetch()) {
660
-			$i = (int) $z['zzzzsqlitecount'];
661
-		}
662
-		return $i;
663
-	}
664
-
665
-	return $r->rowCount();
648
+    if (!$r) {
649
+        return 0;
650
+    }
651
+
652
+    // select ou autre (insert, update,...) ?
653
+    // (link,requete) a compter
654
+    if (strtoupper(substr(ltrim($r->queryString), 0, 6)) === 'SELECT') {
655
+        $link = $r->getPDO();
656
+        $query = "SELECT count(*) as zzzzsqlitecount FROM ({$r->queryString})";
657
+        $l = $link->query($query);
658
+        $i = 0;
659
+        if ($l and $z = $l->fetch()) {
660
+            $i = (int) $z['zzzzsqlitecount'];
661
+        }
662
+        return $i;
663
+    }
664
+
665
+    return $r->rowCount();
666 666
 }
667 667
 
668 668
 
@@ -681,31 +681,31 @@  discard block
 block discarded – undo
681 681
  *     - false si la requête a échouée
682 682
  **/
683 683
 function spip_sqlite_countsel(
684
-	$from = [],
685
-	$where = [],
686
-	$groupby = '',
687
-	$having = [],
688
-	$serveur = '',
689
-	$requeter = true
684
+    $from = [],
685
+    $where = [],
686
+    $groupby = '',
687
+    $having = [],
688
+    $serveur = '',
689
+    $requeter = true
690 690
 ) {
691
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
692
-	$r = spip_sqlite_select(
693
-		"COUNT($c)",
694
-		$from,
695
-		$where,
696
-		'',
697
-		'',
698
-		'',
699
-		$having,
700
-		$serveur,
701
-		$requeter
702
-	);
703
-	if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
704
-		[$r] = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
705
-		$r = (int) $r;
706
-	}
707
-
708
-	return $r;
691
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
692
+    $r = spip_sqlite_select(
693
+        "COUNT($c)",
694
+        $from,
695
+        $where,
696
+        '',
697
+        '',
698
+        '',
699
+        $having,
700
+        $serveur,
701
+        $requeter
702
+    );
703
+    if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
704
+        [$r] = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
705
+        $r = (int) $r;
706
+    }
707
+
708
+    return $r;
709 709
 }
710 710
 
711 711
 
@@ -723,24 +723,24 @@  discard block
 block discarded – undo
723 723
  **/
724 724
 function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true)
725 725
 {
726
-	$res = spip_sqlite_query(
727
-		_sqlite_calculer_expression('DELETE FROM', $table, ',')
728
-			. _sqlite_calculer_expression('WHERE', $where),
729
-		$serveur,
730
-		$requeter
731
-	);
732
-
733
-	// renvoyer la requete inerte si demandee
734
-	if (!$requeter) {
735
-		return $res;
736
-	}
737
-
738
-	if ($res) {
739
-		$link = _sqlite_link($serveur);
740
-		return $res->rowCount();
741
-	} else {
742
-		return false;
743
-	}
726
+    $res = spip_sqlite_query(
727
+        _sqlite_calculer_expression('DELETE FROM', $table, ',')
728
+            . _sqlite_calculer_expression('WHERE', $where),
729
+        $serveur,
730
+        $requeter
731
+    );
732
+
733
+    // renvoyer la requete inerte si demandee
734
+    if (!$requeter) {
735
+        return $res;
736
+    }
737
+
738
+    if ($res) {
739
+        $link = _sqlite_link($serveur);
740
+        return $res->rowCount();
741
+    } else {
742
+        return false;
743
+    }
744 744
 }
745 745
 
746 746
 
@@ -757,15 +757,15 @@  discard block
 block discarded – undo
757 757
  */
758 758
 function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true)
759 759
 {
760
-	if ($exist) {
761
-		$exist = ' IF EXISTS';
762
-	}
763
-
764
-	if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
765
-		return true;
766
-	} else {
767
-		return false;
768
-	}
760
+    if ($exist) {
761
+        $exist = ' IF EXISTS';
762
+    }
763
+
764
+    if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
765
+        return true;
766
+    } else {
767
+        return false;
768
+    }
769 769
 }
770 770
 
771 771
 
@@ -782,11 +782,11 @@  discard block
 block discarded – undo
782 782
  */
783 783
 function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true)
784 784
 {
785
-	if ($exist) {
786
-		$exist = ' IF EXISTS';
787
-	}
785
+    if ($exist) {
786
+        $exist = ' IF EXISTS';
787
+    }
788 788
 
789
-	return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
789
+    return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
790 790
 }
791 791
 
792 792
 /**
@@ -801,20 +801,20 @@  discard block
 block discarded – undo
801 801
  */
802 802
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true)
803 803
 {
804
-	if (!($nom or $table)) {
805
-		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
804
+    if (!($nom or $table)) {
805
+        spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
806 806
 
807
-		return false;
808
-	}
807
+        return false;
808
+    }
809 809
 
810
-	// SQLite ne differentie pas noms des index en fonction des tables
811
-	// il faut donc creer des noms uniques d'index pour une base sqlite
812
-	$index = $table . '_' . $nom;
813
-	$exist = ' IF EXISTS';
810
+    // SQLite ne differentie pas noms des index en fonction des tables
811
+    // il faut donc creer des noms uniques d'index pour une base sqlite
812
+    $index = $table . '_' . $nom;
813
+    $exist = ' IF EXISTS';
814 814
 
815
-	$query = "DROP INDEX$exist $index";
815
+    $query = "DROP INDEX$exist $index";
816 816
 
817
-	return spip_sqlite_query($query, $serveur, $requeter);
817
+    return spip_sqlite_query($query, $serveur, $requeter);
818 818
 }
819 819
 
820 820
 /**
@@ -831,29 +831,29 @@  discard block
 block discarded – undo
831 831
  **/
832 832
 function spip_sqlite_error($query = '', $serveur = '')
833 833
 {
834
-	$link = _sqlite_link($serveur);
835
-
836
-	if ($link) {
837
-		$errs = $link->errorInfo();
838
-		$s = _sqlite_last_error_from_link($link);
839
-	} else {
840
-		$s = ': aucune ressource sqlite (link)';
841
-	}
842
-	if ($s) {
843
-		$trace = debug_backtrace();
844
-		if ($trace[0]['function'] != 'spip_sqlite_error') {
845
-			spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
846
-		}
847
-	}
848
-
849
-	return $s;
834
+    $link = _sqlite_link($serveur);
835
+
836
+    if ($link) {
837
+        $errs = $link->errorInfo();
838
+        $s = _sqlite_last_error_from_link($link);
839
+    } else {
840
+        $s = ': aucune ressource sqlite (link)';
841
+    }
842
+    if ($s) {
843
+        $trace = debug_backtrace();
844
+        if ($trace[0]['function'] != 'spip_sqlite_error') {
845
+            spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
846
+        }
847
+    }
848
+
849
+    return $s;
850 850
 }
851 851
 
852 852
 function _sqlite_last_error_from_link($link)
853 853
 {
854
-	if ($link) {
855
-		$errs = $link->errorInfo();
856
-		/*
854
+    if ($link) {
855
+        $errs = $link->errorInfo();
856
+        /*
857 857
 			$errs[0]
858 858
 				numero SQLState ('HY000' souvent lors d'une erreur)
859 859
 				http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html
@@ -863,11 +863,11 @@  discard block
 block discarded – undo
863 863
 			$errs[2]
864 864
 				Le texte du message d'erreur
865 865
 		*/
866
-		if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
867
-			return "$errs[2]";
868
-		}
869
-	}
870
-	return '';
866
+        if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
867
+            return "$errs[2]";
868
+        }
869
+    }
870
+    return '';
871 871
 }
872 872
 
873 873
 /**
@@ -885,23 +885,23 @@  discard block
 block discarded – undo
885 885
  **/
886 886
 function spip_sqlite_errno($serveur = '')
887 887
 {
888
-	$link = _sqlite_link($serveur);
889
-
890
-	if ($link) {
891
-		$t = $link->errorInfo();
892
-		$s = ltrim($t[0], '0'); // 00000 si pas d'erreur
893
-		if ($s) {
894
-			$s .= ' / ' . $t[1];
895
-		} // ajoute l'erreur du moteur SQLite
896
-	} else {
897
-		$s = ': aucune ressource sqlite (link)';
898
-	}
899
-
900
-	if ($s) {
901
-		spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
902
-	}
903
-
904
-	return $s ? $s : 0;
888
+    $link = _sqlite_link($serveur);
889
+
890
+    if ($link) {
891
+        $t = $link->errorInfo();
892
+        $s = ltrim($t[0], '0'); // 00000 si pas d'erreur
893
+        if ($s) {
894
+            $s .= ' / ' . $t[1];
895
+        } // ajoute l'erreur du moteur SQLite
896
+    } else {
897
+        $s = ': aucune ressource sqlite (link)';
898
+    }
899
+
900
+    if ($s) {
901
+        spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
902
+    }
903
+
904
+    return $s ? $s : 0;
905 905
 }
906 906
 
907 907
 
@@ -918,19 +918,19 @@  discard block
 block discarded – undo
918 918
  */
919 919
 function spip_sqlite_explain($query, $serveur = '', $requeter = true)
920 920
 {
921
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
922
-		return [];
923
-	}
924
-
925
-	$query = Sqlite::traduire_requete($query, $serveur);
926
-	$query = 'EXPLAIN ' . $query;
927
-	if (!$requeter) {
928
-		return $query;
929
-	}
930
-	// on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
931
-	$r = Sqlite::executer_requete($query, $serveur, false);
932
-
933
-	return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
921
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
922
+        return [];
923
+    }
924
+
925
+    $query = Sqlite::traduire_requete($query, $serveur);
926
+    $query = 'EXPLAIN ' . $query;
927
+    if (!$requeter) {
928
+        return $query;
929
+    }
930
+    // on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
931
+    $r = Sqlite::executer_requete($query, $serveur, false);
932
+
933
+    return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
934 934
 }
935 935
 
936 936
 
@@ -951,35 +951,35 @@  discard block
 block discarded – undo
951 951
 function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true)
952 952
 {
953 953
 
954
-	$link = _sqlite_link($serveur);
955
-	$t = $t ? $t : SPIP_SQLITE3_ASSOC;
956
-
957
-	if (!$r) {
958
-		return false;
959
-	}
960
-
961
-	$retour = $r->fetch($t);
962
-
963
-	if (!$retour) {
964
-		if ($r->errorCode() === '00000') {
965
-			return null;
966
-		}
967
-		return false;
968
-	}
969
-
970
-	// Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
971
-	// suppression de 'table.' pour toutes les cles (c'est un peu violent !)
972
-	// c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
973
-	if (str_contains(implode('', array_keys($retour)), '.')) {
974
-		foreach ($retour as $cle => $val) {
975
-			if (($pos = strpos($cle, '.')) !== false) {
976
-				$retour[substr($cle, $pos + 1)] = &$retour[$cle];
977
-				unset($retour[$cle]);
978
-			}
979
-		}
980
-	}
981
-
982
-	return $retour;
954
+    $link = _sqlite_link($serveur);
955
+    $t = $t ? $t : SPIP_SQLITE3_ASSOC;
956
+
957
+    if (!$r) {
958
+        return false;
959
+    }
960
+
961
+    $retour = $r->fetch($t);
962
+
963
+    if (!$retour) {
964
+        if ($r->errorCode() === '00000') {
965
+            return null;
966
+        }
967
+        return false;
968
+    }
969
+
970
+    // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
971
+    // suppression de 'table.' pour toutes les cles (c'est un peu violent !)
972
+    // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
973
+    if (str_contains(implode('', array_keys($retour)), '.')) {
974
+        foreach ($retour as $cle => $val) {
975
+            if (($pos = strpos($cle, '.')) !== false) {
976
+                $retour[substr($cle, $pos + 1)] = &$retour[$cle];
977
+                unset($retour[$cle]);
978
+            }
979
+        }
980
+    }
981
+
982
+    return $retour;
983 983
 }
984 984
 
985 985
 /**
@@ -993,8 +993,8 @@  discard block
 block discarded – undo
993 993
  **/
994 994
 function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true)
995 995
 {
996
-	// encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
997
-	return false;
996
+    // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
997
+    return false;
998 998
 }
999 999
 
1000 1000
 
@@ -1011,10 +1011,10 @@  discard block
 block discarded – undo
1011 1011
  */
1012 1012
 function spip_sqlite_free(&$r, $serveur = '', $requeter = true)
1013 1013
 {
1014
-	unset($r);
1014
+    unset($r);
1015 1015
 
1016
-	return true;
1017
-	//return sqlite_free_result($r);
1016
+    return true;
1017
+    //return sqlite_free_result($r);
1018 1018
 }
1019 1019
 
1020 1020
 
@@ -1030,8 +1030,8 @@  discard block
 block discarded – undo
1030 1030
  */
1031 1031
 function spip_sqlite_get_charset($charset = [], $serveur = '', $requeter = true)
1032 1032
 {
1033
-	//$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1034
-	//return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1033
+    //$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1034
+    //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1035 1035
 }
1036 1036
 
1037 1037
 
@@ -1047,7 +1047,7 @@  discard block
 block discarded – undo
1047 1047
  **/
1048 1048
 function spip_sqlite_hex($v)
1049 1049
 {
1050
-	return hexdec($v);
1050
+    return hexdec($v);
1051 1051
 }
1052 1052
 
1053 1053
 
@@ -1070,7 +1070,7 @@  discard block
 block discarded – undo
1070 1070
  **/
1071 1071
 function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true)
1072 1072
 {
1073
-	return "($val $not IN ($valeurs))";
1073
+    return "($val $not IN ($valeurs))";
1074 1074
 }
1075 1075
 
1076 1076
 
@@ -1099,20 +1099,20 @@  discard block
 block discarded – undo
1099 1099
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true)
1100 1100
 {
1101 1101
 
1102
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1103
-	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1104
-		if (!$requeter) {
1105
-			return $r;
1106
-		}
1107
-		$nb = Sqlite::last_insert_id($serveur);
1108
-	} else {
1109
-		$nb = false;
1110
-	}
1102
+    $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1103
+    if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1104
+        if (!$requeter) {
1105
+            return $r;
1106
+        }
1107
+        $nb = Sqlite::last_insert_id($serveur);
1108
+    } else {
1109
+        $nb = false;
1110
+    }
1111 1111
 
1112
-	$err = spip_sqlite_error($query, $serveur);
1112
+    $err = spip_sqlite_error($query, $serveur);
1113 1113
 
1114
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1115
-	return isset($_GET['var_profile']) ? $r : $nb;
1114
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1115
+    return isset($_GET['var_profile']) ? $r : $nb;
1116 1116
 }
1117 1117
 
1118 1118
 
@@ -1138,28 +1138,28 @@  discard block
 block discarded – undo
1138 1138
  **/
1139 1139
 function spip_sqlite_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true)
1140 1140
 {
1141
-	if (!$desc) {
1142
-		$desc = description_table($table, $serveur);
1143
-	}
1144
-	if (!$desc) {
1145
-		die("$table insertion sans description");
1146
-	}
1147
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1148
-
1149
-	foreach ($couples as $champ => $val) {
1150
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1151
-	}
1152
-
1153
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1154
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1155
-
1156
-	$cles = $valeurs = '';
1157
-	if (count($couples)) {
1158
-		$cles = '(' . join(',', array_keys($couples)) . ')';
1159
-		$valeurs = '(' . join(',', $couples) . ')';
1160
-	}
1161
-
1162
-	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1141
+    if (!$desc) {
1142
+        $desc = description_table($table, $serveur);
1143
+    }
1144
+    if (!$desc) {
1145
+        die("$table insertion sans description");
1146
+    }
1147
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1148
+
1149
+    foreach ($couples as $champ => $val) {
1150
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1151
+    }
1152
+
1153
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1154
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1155
+
1156
+    $cles = $valeurs = '';
1157
+    if (count($couples)) {
1158
+        $cles = '(' . join(',', array_keys($couples)) . ')';
1159
+        $valeurs = '(' . join(',', $couples) . ')';
1160
+    }
1161
+
1162
+    return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1163 1163
 }
1164 1164
 
1165 1165
 
@@ -1184,70 +1184,70 @@  discard block
 block discarded – undo
1184 1184
  **/
1185 1185
 function spip_sqlite_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true)
1186 1186
 {
1187
-	if (!$desc) {
1188
-		$desc = description_table($table, $serveur);
1189
-	}
1190
-	if (!$desc) {
1191
-		die("$table insertion sans description");
1192
-	}
1193
-	if (!isset($desc['field'])) {
1194
-		$desc['field'] = [];
1195
-	}
1196
-
1197
-	// recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1198
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1199
-
1200
-	// seul le nom de la table est a traduire ici :
1201
-	// le faire une seule fois au debut
1202
-	$query_start = "INSERT INTO $table ";
1203
-	$query_start = Sqlite::traduire_requete($query_start, $serveur);
1204
-
1205
-	// ouvrir une transaction
1206
-	if ($requeter) {
1207
-		Sqlite::demarrer_transaction($serveur);
1208
-	}
1209
-
1210
-	while ($couples = array_shift($tab_couples)) {
1211
-		foreach ($couples as $champ => $val) {
1212
-			$couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1213
-		}
1214
-
1215
-		// inserer les champs timestamp par defaut
1216
-		$couples = array_merge($maj, $couples);
1217
-
1218
-		$champs = $valeurs = '';
1219
-		if (count($couples)) {
1220
-			$champs = '(' . join(',', array_keys($couples)) . ')';
1221
-			$valeurs = '(' . join(',', $couples) . ')';
1222
-			$query = $query_start . "$champs VALUES $valeurs";
1223
-		} else {
1224
-			$query = $query_start . 'DEFAULT VALUES';
1225
-		}
1226
-
1227
-		if ($requeter) {
1228
-			$retour = Sqlite::executer_requete($query, $serveur);
1229
-		}
1230
-
1231
-		// sur le dernier couple uniquement
1232
-		if (!count($tab_couples)) {
1233
-			$nb = 0;
1234
-			if ($requeter) {
1235
-				$nb = Sqlite::last_insert_id($serveur);
1236
-			} else {
1237
-				return $query;
1238
-			}
1239
-		}
1240
-
1241
-		$err = spip_sqlite_error($query, $serveur);
1242
-	}
1243
-
1244
-	if ($requeter) {
1245
-		Sqlite::finir_transaction($serveur);
1246
-	}
1247
-
1248
-	// renvoie le dernier id d'autoincrement ajoute
1249
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1250
-	return isset($_GET['var_profile']) ? $retour : $nb;
1187
+    if (!$desc) {
1188
+        $desc = description_table($table, $serveur);
1189
+    }
1190
+    if (!$desc) {
1191
+        die("$table insertion sans description");
1192
+    }
1193
+    if (!isset($desc['field'])) {
1194
+        $desc['field'] = [];
1195
+    }
1196
+
1197
+    // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1198
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1199
+
1200
+    // seul le nom de la table est a traduire ici :
1201
+    // le faire une seule fois au debut
1202
+    $query_start = "INSERT INTO $table ";
1203
+    $query_start = Sqlite::traduire_requete($query_start, $serveur);
1204
+
1205
+    // ouvrir une transaction
1206
+    if ($requeter) {
1207
+        Sqlite::demarrer_transaction($serveur);
1208
+    }
1209
+
1210
+    while ($couples = array_shift($tab_couples)) {
1211
+        foreach ($couples as $champ => $val) {
1212
+            $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1213
+        }
1214
+
1215
+        // inserer les champs timestamp par defaut
1216
+        $couples = array_merge($maj, $couples);
1217
+
1218
+        $champs = $valeurs = '';
1219
+        if (count($couples)) {
1220
+            $champs = '(' . join(',', array_keys($couples)) . ')';
1221
+            $valeurs = '(' . join(',', $couples) . ')';
1222
+            $query = $query_start . "$champs VALUES $valeurs";
1223
+        } else {
1224
+            $query = $query_start . 'DEFAULT VALUES';
1225
+        }
1226
+
1227
+        if ($requeter) {
1228
+            $retour = Sqlite::executer_requete($query, $serveur);
1229
+        }
1230
+
1231
+        // sur le dernier couple uniquement
1232
+        if (!count($tab_couples)) {
1233
+            $nb = 0;
1234
+            if ($requeter) {
1235
+                $nb = Sqlite::last_insert_id($serveur);
1236
+            } else {
1237
+                return $query;
1238
+            }
1239
+        }
1240
+
1241
+        $err = spip_sqlite_error($query, $serveur);
1242
+    }
1243
+
1244
+    if ($requeter) {
1245
+        Sqlite::finir_transaction($serveur);
1246
+    }
1247
+
1248
+    // renvoie le dernier id d'autoincrement ajoute
1249
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1250
+    return isset($_GET['var_profile']) ? $retour : $nb;
1251 1251
 }
1252 1252
 
1253 1253
 
@@ -1263,7 +1263,7 @@  discard block
 block discarded – undo
1263 1263
  **/
1264 1264
 function spip_sqlite_preferer_transaction($serveur = '', $requeter = true)
1265 1265
 {
1266
-	return true;
1266
+    return true;
1267 1267
 }
1268 1268
 
1269 1269
 /**
@@ -1281,12 +1281,12 @@  discard block
 block discarded – undo
1281 1281
  **/
1282 1282
 function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true)
1283 1283
 {
1284
-	if (!$requeter) {
1285
-		return 'BEGIN TRANSACTION';
1286
-	}
1287
-	Sqlite::demarrer_transaction($serveur);
1284
+    if (!$requeter) {
1285
+        return 'BEGIN TRANSACTION';
1286
+    }
1287
+    Sqlite::demarrer_transaction($serveur);
1288 1288
 
1289
-	return true;
1289
+    return true;
1290 1290
 }
1291 1291
 
1292 1292
 /**
@@ -1301,12 +1301,12 @@  discard block
 block discarded – undo
1301 1301
  **/
1302 1302
 function spip_sqlite_terminer_transaction($serveur = '', $requeter = true)
1303 1303
 {
1304
-	if (!$requeter) {
1305
-		return 'COMMIT';
1306
-	}
1307
-	Sqlite::finir_transaction($serveur);
1304
+    if (!$requeter) {
1305
+        return 'COMMIT';
1306
+    }
1307
+    Sqlite::finir_transaction($serveur);
1308 1308
 
1309
-	return true;
1309
+    return true;
1310 1310
 }
1311 1311
 
1312 1312
 
@@ -1322,27 +1322,27 @@  discard block
 block discarded – undo
1322 1322
  **/
1323 1323
 function spip_sqlite_listdbs($serveur = '', $requeter = true)
1324 1324
 {
1325
-	_sqlite_init();
1326
-
1327
-	if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1328
-		return [];
1329
-	}
1330
-
1331
-	include_spip('inc/flock');
1332
-	$bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1333
-	$bds = [];
1334
-
1335
-	foreach ($bases as $b) {
1336
-		// pas de bases commencant pas sqlite
1337
-		// (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1338
-		// les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1339
-		if (strpos($b, '_sqlite')) {
1340
-			continue;
1341
-		}
1342
-		$bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1343
-	}
1344
-
1345
-	return $bds;
1325
+    _sqlite_init();
1326
+
1327
+    if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1328
+        return [];
1329
+    }
1330
+
1331
+    include_spip('inc/flock');
1332
+    $bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1333
+    $bds = [];
1334
+
1335
+    foreach ($bases as $b) {
1336
+        // pas de bases commencant pas sqlite
1337
+        // (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1338
+        // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1339
+        if (strpos($b, '_sqlite')) {
1340
+            continue;
1341
+        }
1342
+        $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1343
+    }
1344
+
1345
+    return $bds;
1346 1346
 }
1347 1347
 
1348 1348
 
@@ -1358,9 +1358,9 @@  discard block
 block discarded – undo
1358 1358
  */
1359 1359
 function spip_sqlite_multi($objet, $lang)
1360 1360
 {
1361
-	$r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1361
+    $r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1362 1362
 
1363
-	return $r;
1363
+    return $r;
1364 1364
 }
1365 1365
 
1366 1366
 
@@ -1378,15 +1378,15 @@  discard block
 block discarded – undo
1378 1378
  **/
1379 1379
 function spip_sqlite_optimize($table, $serveur = '', $requeter = true)
1380 1380
 {
1381
-	static $do = false;
1382
-	if ($requeter and $do) {
1383
-		return true;
1384
-	}
1385
-	if ($requeter) {
1386
-		$do = true;
1387
-	}
1388
-
1389
-	return spip_sqlite_query('VACUUM', $serveur, $requeter);
1381
+    static $do = false;
1382
+    if ($requeter and $do) {
1383
+        return true;
1384
+    }
1385
+    if ($requeter) {
1386
+        $do = true;
1387
+    }
1388
+
1389
+    return spip_sqlite_query('VACUUM', $serveur, $requeter);
1390 1390
 }
1391 1391
 
1392 1392
 
@@ -1404,15 +1404,15 @@  discard block
 block discarded – undo
1404 1404
  */
1405 1405
 function spip_sqlite_quote($v, $type = '')
1406 1406
 {
1407
-	if (!is_array($v)) {
1408
-		return _sqlite_calculer_cite($v, $type);
1409
-	}
1410
-	// si c'est un tableau, le parcourir en propageant le type
1411
-	foreach ($v as $k => $r) {
1412
-		$v[$k] = spip_sqlite_quote($r, $type);
1413
-	}
1414
-
1415
-	return join(',', $v);
1407
+    if (!is_array($v)) {
1408
+        return _sqlite_calculer_cite($v, $type);
1409
+    }
1410
+    // si c'est un tableau, le parcourir en propageant le type
1411
+    foreach ($v as $k => $r) {
1412
+        $v[$k] = spip_sqlite_quote($r, $type);
1413
+    }
1414
+
1415
+    return join(',', $v);
1416 1416
 }
1417 1417
 
1418 1418
 
@@ -1430,9 +1430,9 @@  discard block
 block discarded – undo
1430 1430
  **/
1431 1431
 function spip_sqlite_date_proche($champ, $interval, $unite)
1432 1432
 {
1433
-	$op = (($interval <= 0) ? '>' : '<');
1433
+    $op = (($interval <= 0) ? '>' : '<');
1434 1434
 
1435
-	return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1435
+    return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1436 1436
 }
1437 1437
 
1438 1438
 
@@ -1451,48 +1451,48 @@  discard block
 block discarded – undo
1451 1451
  */
1452 1452
 function spip_sqlite_repair($table, $serveur = '', $requeter = true)
1453 1453
 {
1454
-	if (
1455
-		$desc = spip_sqlite_showtable($table, $serveur)
1456
-		and isset($desc['field'])
1457
-		and is_array($desc['field'])
1458
-	) {
1459
-		foreach ($desc['field'] as $c => $d) {
1460
-			if (
1461
-				preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1462
-				and stripos($d, 'NOT NULL') !== false
1463
-				and stripos($d, 'DEFAULT') === false
1464
-				/* pas touche aux cles primaires */
1465
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1466
-			) {
1467
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1468
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1469
-			}
1470
-			if (
1471
-				preg_match(',^(INTEGER),i', $d)
1472
-				and stripos($d, 'NOT NULL') !== false
1473
-				and stripos($d, 'DEFAULT') === false
1474
-				/* pas touche aux cles primaires */
1475
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1476
-			) {
1477
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1478
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1479
-			}
1480
-			if (
1481
-				preg_match(',^(datetime),i', $d)
1482
-				and stripos($d, 'NOT NULL') !== false
1483
-				and stripos($d, 'DEFAULT') === false
1484
-				/* pas touche aux cles primaires */
1485
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1486
-			) {
1487
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1488
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1489
-			}
1490
-		}
1491
-
1492
-		return [' OK '];
1493
-	}
1494
-
1495
-	return [' ERROR '];
1454
+    if (
1455
+        $desc = spip_sqlite_showtable($table, $serveur)
1456
+        and isset($desc['field'])
1457
+        and is_array($desc['field'])
1458
+    ) {
1459
+        foreach ($desc['field'] as $c => $d) {
1460
+            if (
1461
+                preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1462
+                and stripos($d, 'NOT NULL') !== false
1463
+                and stripos($d, 'DEFAULT') === false
1464
+                /* pas touche aux cles primaires */
1465
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1466
+            ) {
1467
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1468
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1469
+            }
1470
+            if (
1471
+                preg_match(',^(INTEGER),i', $d)
1472
+                and stripos($d, 'NOT NULL') !== false
1473
+                and stripos($d, 'DEFAULT') === false
1474
+                /* pas touche aux cles primaires */
1475
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1476
+            ) {
1477
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1478
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1479
+            }
1480
+            if (
1481
+                preg_match(',^(datetime),i', $d)
1482
+                and stripos($d, 'NOT NULL') !== false
1483
+                and stripos($d, 'DEFAULT') === false
1484
+                /* pas touche aux cles primaires */
1485
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1486
+            ) {
1487
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1488
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1489
+            }
1490
+        }
1491
+
1492
+        return [' OK '];
1493
+    }
1494
+
1495
+    return [' ERROR '];
1496 1496
 }
1497 1497
 
1498 1498
 
@@ -1522,25 +1522,25 @@  discard block
 block discarded – undo
1522 1522
  **/
1523 1523
 function spip_sqlite_replace($table, $couples, $desc = [], $serveur = '', $requeter = true)
1524 1524
 {
1525
-	if (!$desc) {
1526
-		$desc = description_table($table, $serveur);
1527
-	}
1528
-	if (!$desc) {
1529
-		die("$table insertion sans description");
1530
-	}
1531
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1532
-
1533
-	foreach ($couples as $champ => $val) {
1534
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1535
-	}
1536
-
1537
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1538
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1539
-
1540
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1541
-		',',
1542
-		$couples
1543
-	) . ')', $serveur);
1525
+    if (!$desc) {
1526
+        $desc = description_table($table, $serveur);
1527
+    }
1528
+    if (!$desc) {
1529
+        die("$table insertion sans description");
1530
+    }
1531
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1532
+
1533
+    foreach ($couples as $champ => $val) {
1534
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1535
+    }
1536
+
1537
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1538
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1539
+
1540
+    return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1541
+        ',',
1542
+        $couples
1543
+    ) . ')', $serveur);
1544 1544
 }
1545 1545
 
1546 1546
 
@@ -1571,13 +1571,13 @@  discard block
 block discarded – undo
1571 1571
 function spip_sqlite_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true)
1572 1572
 {
1573 1573
 
1574
-	// boucler pour trainter chaque requete independemment
1575
-	foreach ($tab_couples as $couples) {
1576
-		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1577
-	}
1574
+    // boucler pour trainter chaque requete independemment
1575
+    foreach ($tab_couples as $couples) {
1576
+        $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1577
+    }
1578 1578
 
1579
-	// renvoie le dernier id
1580
-	return $retour;
1579
+    // renvoie le dernier id
1580
+    return $retour;
1581 1581
 }
1582 1582
 
1583 1583
 
@@ -1604,44 +1604,44 @@  discard block
 block discarded – undo
1604 1604
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1605 1605
  */
1606 1606
 function spip_sqlite_select(
1607
-	$select,
1608
-	$from,
1609
-	$where = '',
1610
-	$groupby = '',
1611
-	$orderby = '',
1612
-	$limit = '',
1613
-	$having = '',
1614
-	$serveur = '',
1615
-	$requeter = true
1607
+    $select,
1608
+    $from,
1609
+    $where = '',
1610
+    $groupby = '',
1611
+    $orderby = '',
1612
+    $limit = '',
1613
+    $having = '',
1614
+    $serveur = '',
1615
+    $requeter = true
1616 1616
 ) {
1617 1617
 
1618
-	// version() n'est pas connu de sqlite
1619
-	$select = str_replace('version()', 'sqlite_version()', $select);
1620
-
1621
-	// recomposer from
1622
-	$from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1623
-
1624
-	$query =
1625
-		_sqlite_calculer_expression('SELECT', $select, ', ')
1626
-		. _sqlite_calculer_expression('FROM', $from, ', ')
1627
-		. _sqlite_calculer_expression('WHERE', $where)
1628
-		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1629
-		. _sqlite_calculer_expression('HAVING', $having)
1630
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1631
-		. ($limit ? "\nLIMIT $limit" : '');
1632
-
1633
-	// dans un select, on doit renvoyer la requête en cas d'erreur
1634
-	$res = spip_sqlite_query($query, $serveur, $requeter);
1635
-	// texte de la requete demande ?
1636
-	if (!$requeter) {
1637
-		return $res;
1638
-	}
1639
-	// erreur survenue ?
1640
-	if ($res === false) {
1641
-		return Sqlite::traduire_requete($query, $serveur);
1642
-	}
1643
-
1644
-	return $res;
1618
+    // version() n'est pas connu de sqlite
1619
+    $select = str_replace('version()', 'sqlite_version()', $select);
1620
+
1621
+    // recomposer from
1622
+    $from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1623
+
1624
+    $query =
1625
+        _sqlite_calculer_expression('SELECT', $select, ', ')
1626
+        . _sqlite_calculer_expression('FROM', $from, ', ')
1627
+        . _sqlite_calculer_expression('WHERE', $where)
1628
+        . _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1629
+        . _sqlite_calculer_expression('HAVING', $having)
1630
+        . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1631
+        . ($limit ? "\nLIMIT $limit" : '');
1632
+
1633
+    // dans un select, on doit renvoyer la requête en cas d'erreur
1634
+    $res = spip_sqlite_query($query, $serveur, $requeter);
1635
+    // texte de la requete demande ?
1636
+    if (!$requeter) {
1637
+        return $res;
1638
+    }
1639
+    // erreur survenue ?
1640
+    if ($res === false) {
1641
+        return Sqlite::traduire_requete($query, $serveur);
1642
+    }
1643
+
1644
+    return $res;
1645 1645
 }
1646 1646
 
1647 1647
 
@@ -1661,32 +1661,32 @@  discard block
 block discarded – undo
1661 1661
  **/
1662 1662
 function spip_sqlite_selectdb($db, $serveur = '', $requeter = true)
1663 1663
 {
1664
-	_sqlite_init();
1665
-
1666
-	// interdire la creation d'une nouvelle base,
1667
-	// sauf si on est dans l'installation
1668
-	if (
1669
-		!is_file($f = _DIR_DB . $db . '.sqlite')
1670
-		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1671
-	) {
1672
-		spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1673
-
1674
-		return false;
1675
-	}
1676
-
1677
-	// se connecter a la base indiquee
1678
-	// avec les identifiants connus
1679
-	$index = $serveur ? $serveur : 0;
1680
-
1681
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1682
-		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1683
-			return $db;
1684
-		}
1685
-	} else {
1686
-		spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1687
-	}
1688
-
1689
-	return false;
1664
+    _sqlite_init();
1665
+
1666
+    // interdire la creation d'une nouvelle base,
1667
+    // sauf si on est dans l'installation
1668
+    if (
1669
+        !is_file($f = _DIR_DB . $db . '.sqlite')
1670
+        && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1671
+    ) {
1672
+        spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1673
+
1674
+        return false;
1675
+    }
1676
+
1677
+    // se connecter a la base indiquee
1678
+    // avec les identifiants connus
1679
+    $index = $serveur ? $serveur : 0;
1680
+
1681
+    if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1682
+        if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1683
+            return $db;
1684
+        }
1685
+    } else {
1686
+        spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1687
+    }
1688
+
1689
+    return false;
1690 1690
 }
1691 1691
 
1692 1692
 
@@ -1702,8 +1702,8 @@  discard block
 block discarded – undo
1702 1702
  */
1703 1703
 function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true)
1704 1704
 {
1705
-	# spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1706
-	# return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1705
+    # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1706
+    # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1707 1707
 }
1708 1708
 
1709 1709
 
@@ -1722,24 +1722,24 @@  discard block
 block discarded – undo
1722 1722
  **/
1723 1723
 function spip_sqlite_showbase($match, $serveur = '', $requeter = true)
1724 1724
 {
1725
-	// type est le type d'entrée : table / index / view
1726
-	// on ne retourne que les tables (?) et non les vues...
1727
-	# ESCAPE non supporte par les versions sqlite <3
1728
-	#	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1729
-	$match = preg_quote($match);
1730
-	$match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1731
-	$match = str_replace('\\\%', '[[POURCENT]]', $match);
1732
-	$match = str_replace('_', '.', $match);
1733
-	$match = str_replace('%', '.*', $match);
1734
-	$match = str_replace('[[TIRETBAS]]', '_', $match);
1735
-	$match = str_replace('[[POURCENT]]', '%', $match);
1736
-	$match = "^$match$";
1737
-
1738
-	return spip_sqlite_query(
1739
-		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1740
-		$serveur,
1741
-		$requeter
1742
-	);
1725
+    // type est le type d'entrée : table / index / view
1726
+    // on ne retourne que les tables (?) et non les vues...
1727
+    # ESCAPE non supporte par les versions sqlite <3
1728
+    #	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1729
+    $match = preg_quote($match);
1730
+    $match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1731
+    $match = str_replace('\\\%', '[[POURCENT]]', $match);
1732
+    $match = str_replace('_', '.', $match);
1733
+    $match = str_replace('%', '.*', $match);
1734
+    $match = str_replace('[[TIRETBAS]]', '_', $match);
1735
+    $match = str_replace('[[POURCENT]]', '%', $match);
1736
+    $match = "^$match$";
1737
+
1738
+    return spip_sqlite_query(
1739
+        "SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1740
+        $serveur,
1741
+        $requeter
1742
+    );
1743 1743
 }
1744 1744
 
1745 1745
 /**
@@ -1758,19 +1758,19 @@  discard block
 block discarded – undo
1758 1758
  **/
1759 1759
 function spip_sqlite_table_exists(string $table, $serveur = '', $requeter = true)
1760 1760
 {
1761
-	$r = spip_sqlite_query(
1762
-		'SELECT name FROM sqlite_master WHERE'
1763
-			. ' type=\'table\''
1764
-			. ' AND name=' . spip_sqlite_quote($table, 'string')
1765
-			. ' AND name NOT LIKE \'sqlite_%\'',
1766
-		$serveur,
1767
-		$requeter
1768
-	);
1769
-	if (!$requeter) {
1770
-		return $r;
1771
-	}
1772
-	$res = spip_sqlite_fetch($r, '', $serveur);
1773
-	return (bool) $res;
1761
+    $r = spip_sqlite_query(
1762
+        'SELECT name FROM sqlite_master WHERE'
1763
+            . ' type=\'table\''
1764
+            . ' AND name=' . spip_sqlite_quote($table, 'string')
1765
+            . ' AND name NOT LIKE \'sqlite_%\'',
1766
+        $serveur,
1767
+        $requeter
1768
+    );
1769
+    if (!$requeter) {
1770
+        return $r;
1771
+    }
1772
+    $res = spip_sqlite_fetch($r, '', $serveur);
1773
+    return (bool) $res;
1774 1774
 }
1775 1775
 
1776 1776
 define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -1794,129 +1794,129 @@  discard block
 block discarded – undo
1794 1794
  */
1795 1795
 function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true)
1796 1796
 {
1797
-	$query =
1798
-		'SELECT sql, type FROM'
1799
-		. ' (SELECT * FROM sqlite_master UNION ALL'
1800
-		. ' SELECT * FROM sqlite_temp_master)'
1801
-		. " WHERE tbl_name LIKE '$nom_table'"
1802
-		. " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1803
-		. ' ORDER BY substr(type,2,1), name';
1804
-
1805
-	$a = spip_sqlite_query($query, $serveur, $requeter);
1806
-	if (!$a) {
1807
-		return '';
1808
-	}
1809
-	if (!$requeter) {
1810
-		return $a;
1811
-	}
1812
-	if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1813
-		return '';
1814
-	}
1815
-	$vue = ($a['type'] == 'view'); // table | vue
1816
-
1817
-	// c'est une table
1818
-	// il faut parser le create
1819
-	if (!$vue) {
1820
-		if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1821
-			return '';
1822
-		} else {
1823
-			$desc = $r[1];
1824
-			// extraction d'une KEY éventuelle en prenant garde de ne pas
1825
-			// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1826
-			if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1827
-				$namedkeys = $r[2];
1828
-				$desc = $r[1];
1829
-			} else {
1830
-				$namedkeys = '';
1831
-			}
1832
-
1833
-			$fields = [];
1834
-			$keys = [];
1835
-
1836
-			// enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1837
-			// par exemple s'il contiennent une virgule.
1838
-			// /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1839
-			list($desc, $echaps) = query_echappe_textes($desc);
1840
-
1841
-			// separer toutes les descriptions de champs, separes par des virgules
1842
-			# /!\ explode peut exploser aussi DECIMAL(10,2) !
1843
-			$k_precedent = null;
1844
-			foreach (explode(',', $desc) as $v) {
1845
-				preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1846
-				// Les cles de champs peuvent etre entourees
1847
-				// de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1848
-				// http://www.sqlite.org/lang_keywords.html
1849
-				$k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1850
-				if ($char = strpbrk($k[0], '\'"[`')) {
1851
-					$k = trim($k, $char);
1852
-					if ($char == '[') {
1853
-						$k = rtrim($k, ']');
1854
-					}
1855
-				}
1856
-				$def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1857
-
1858
-				// rustine pour DECIMAL(10,2)
1859
-				// s'il y a une parenthèse fermante dans la clé
1860
-				// ou dans la définition sans qu'il n'y ait une ouverture avant
1861
-				if (str_contains($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1862
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1863
-					continue;
1864
-				}
1865
-
1866
-				// la primary key peut etre dans une des descriptions de champs
1867
-				// et non en fin de table, cas encore decouvert avec Sqlite Manager
1868
-				if (stripos($r[2], 'PRIMARY KEY') !== false) {
1869
-					$keys['PRIMARY KEY'] = $k;
1870
-				}
1871
-
1872
-				$fields[$k] = $def;
1873
-				$k_precedent = $k;
1874
-			}
1875
-			// key inclues dans la requete
1876
-			foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1877
-				if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1878
-					$k = str_replace('`', '', trim($r[1]));
1879
-					$t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1880
-					if ($k && !isset($keys[$k])) {
1881
-						$keys[$k] = $t;
1882
-					} else {
1883
-						$keys[] = $t;
1884
-					}
1885
-				}
1886
-			}
1887
-			// sinon ajouter les key index
1888
-			$query =
1889
-				'SELECT name,sql FROM'
1890
-				. ' (SELECT * FROM sqlite_master UNION ALL'
1891
-				. ' SELECT * FROM sqlite_temp_master)'
1892
-				. " WHERE tbl_name LIKE '$nom_table'"
1893
-				. " AND type='index' AND name NOT LIKE 'sqlite_%'"
1894
-				. 'ORDER BY substr(type,2,1), name';
1895
-			$a = spip_sqlite_query($query, $serveur, $requeter);
1896
-			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1897
-				$key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1898
-				$keytype = 'KEY';
1899
-				if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1900
-					$keytype = 'UNIQUE KEY';
1901
-				}
1902
-				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1903
-				$keys[$keytype . ' ' . $key] = $colonnes;
1904
-			}
1905
-		}
1906
-	} // c'est une vue, on liste les champs disponibles simplement
1907
-	else {
1908
-		if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1909
-			$fields = [];
1910
-			foreach ($res as $c => $v) {
1911
-				$fields[$c] = '';
1912
-			}
1913
-			$keys = [];
1914
-		} else {
1915
-			return '';
1916
-		}
1917
-	}
1918
-
1919
-	return ['field' => $fields, 'key' => $keys];
1797
+    $query =
1798
+        'SELECT sql, type FROM'
1799
+        . ' (SELECT * FROM sqlite_master UNION ALL'
1800
+        . ' SELECT * FROM sqlite_temp_master)'
1801
+        . " WHERE tbl_name LIKE '$nom_table'"
1802
+        . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1803
+        . ' ORDER BY substr(type,2,1), name';
1804
+
1805
+    $a = spip_sqlite_query($query, $serveur, $requeter);
1806
+    if (!$a) {
1807
+        return '';
1808
+    }
1809
+    if (!$requeter) {
1810
+        return $a;
1811
+    }
1812
+    if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1813
+        return '';
1814
+    }
1815
+    $vue = ($a['type'] == 'view'); // table | vue
1816
+
1817
+    // c'est une table
1818
+    // il faut parser le create
1819
+    if (!$vue) {
1820
+        if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1821
+            return '';
1822
+        } else {
1823
+            $desc = $r[1];
1824
+            // extraction d'une KEY éventuelle en prenant garde de ne pas
1825
+            // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1826
+            if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1827
+                $namedkeys = $r[2];
1828
+                $desc = $r[1];
1829
+            } else {
1830
+                $namedkeys = '';
1831
+            }
1832
+
1833
+            $fields = [];
1834
+            $keys = [];
1835
+
1836
+            // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1837
+            // par exemple s'il contiennent une virgule.
1838
+            // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1839
+            list($desc, $echaps) = query_echappe_textes($desc);
1840
+
1841
+            // separer toutes les descriptions de champs, separes par des virgules
1842
+            # /!\ explode peut exploser aussi DECIMAL(10,2) !
1843
+            $k_precedent = null;
1844
+            foreach (explode(',', $desc) as $v) {
1845
+                preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1846
+                // Les cles de champs peuvent etre entourees
1847
+                // de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1848
+                // http://www.sqlite.org/lang_keywords.html
1849
+                $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1850
+                if ($char = strpbrk($k[0], '\'"[`')) {
1851
+                    $k = trim($k, $char);
1852
+                    if ($char == '[') {
1853
+                        $k = rtrim($k, ']');
1854
+                    }
1855
+                }
1856
+                $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1857
+
1858
+                // rustine pour DECIMAL(10,2)
1859
+                // s'il y a une parenthèse fermante dans la clé
1860
+                // ou dans la définition sans qu'il n'y ait une ouverture avant
1861
+                if (str_contains($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1862
+                    $fields[$k_precedent] .= ',' . $k . ' ' . $def;
1863
+                    continue;
1864
+                }
1865
+
1866
+                // la primary key peut etre dans une des descriptions de champs
1867
+                // et non en fin de table, cas encore decouvert avec Sqlite Manager
1868
+                if (stripos($r[2], 'PRIMARY KEY') !== false) {
1869
+                    $keys['PRIMARY KEY'] = $k;
1870
+                }
1871
+
1872
+                $fields[$k] = $def;
1873
+                $k_precedent = $k;
1874
+            }
1875
+            // key inclues dans la requete
1876
+            foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1877
+                if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1878
+                    $k = str_replace('`', '', trim($r[1]));
1879
+                    $t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1880
+                    if ($k && !isset($keys[$k])) {
1881
+                        $keys[$k] = $t;
1882
+                    } else {
1883
+                        $keys[] = $t;
1884
+                    }
1885
+                }
1886
+            }
1887
+            // sinon ajouter les key index
1888
+            $query =
1889
+                'SELECT name,sql FROM'
1890
+                . ' (SELECT * FROM sqlite_master UNION ALL'
1891
+                . ' SELECT * FROM sqlite_temp_master)'
1892
+                . " WHERE tbl_name LIKE '$nom_table'"
1893
+                . " AND type='index' AND name NOT LIKE 'sqlite_%'"
1894
+                . 'ORDER BY substr(type,2,1), name';
1895
+            $a = spip_sqlite_query($query, $serveur, $requeter);
1896
+            while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1897
+                $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1898
+                $keytype = 'KEY';
1899
+                if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1900
+                    $keytype = 'UNIQUE KEY';
1901
+                }
1902
+                $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1903
+                $keys[$keytype . ' ' . $key] = $colonnes;
1904
+            }
1905
+        }
1906
+    } // c'est une vue, on liste les champs disponibles simplement
1907
+    else {
1908
+        if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1909
+            $fields = [];
1910
+            foreach ($res as $c => $v) {
1911
+                $fields[$c] = '';
1912
+            }
1913
+            $keys = [];
1914
+        } else {
1915
+            return '';
1916
+        }
1917
+    }
1918
+
1919
+    return ['field' => $fields, 'key' => $keys];
1920 1920
 }
1921 1921
 
1922 1922
 
@@ -1943,24 +1943,24 @@  discard block
 block discarded – undo
1943 1943
  */
1944 1944
 function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true)
1945 1945
 {
1946
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1947
-	$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1948
-
1949
-	$set = [];
1950
-	foreach ($champs as $champ => $val) {
1951
-		$set[] = $champ . "=$val";
1952
-	}
1953
-	if (!empty($set)) {
1954
-		return spip_sqlite_query(
1955
-			_sqlite_calculer_expression('UPDATE', $table, ',')
1956
-				. _sqlite_calculer_expression('SET', $set, ',')
1957
-				. _sqlite_calculer_expression('WHERE', $where),
1958
-			$serveur,
1959
-			$requeter
1960
-		);
1961
-	}
1962
-
1963
-	return false;
1946
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1947
+    $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1948
+
1949
+    $set = [];
1950
+    foreach ($champs as $champ => $val) {
1951
+        $set[] = $champ . "=$val";
1952
+    }
1953
+    if (!empty($set)) {
1954
+        return spip_sqlite_query(
1955
+            _sqlite_calculer_expression('UPDATE', $table, ',')
1956
+                . _sqlite_calculer_expression('SET', $set, ',')
1957
+                . _sqlite_calculer_expression('WHERE', $where),
1958
+            $serveur,
1959
+            $requeter
1960
+        );
1961
+    }
1962
+
1963
+    return false;
1964 1964
 }
1965 1965
 
1966 1966
 
@@ -1991,38 +1991,38 @@  discard block
 block discarded – undo
1991 1991
 function spip_sqlite_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true)
1992 1992
 {
1993 1993
 
1994
-	if (!$champs) {
1995
-		return;
1996
-	}
1997
-	if (!$desc) {
1998
-		$desc = description_table($table, $serveur);
1999
-	}
2000
-	if (!$desc) {
2001
-		die("$table insertion sans description");
2002
-	}
2003
-	$fields = $desc['field'];
2004
-
2005
-	$set = [];
2006
-	foreach ($champs as $champ => $val) {
2007
-		$set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
2008
-	}
2009
-
2010
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
2011
-	// attention ils sont deja quotes
2012
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
2013
-	foreach ($maj as $champ => $val) {
2014
-		if (!isset($set[$champ])) {
2015
-			$set[$champ] = $champ . '=' . $val;
2016
-		}
2017
-	}
2018
-
2019
-	return spip_sqlite_query(
2020
-		_sqlite_calculer_expression('UPDATE', $table, ',')
2021
-			. _sqlite_calculer_expression('SET', $set, ',')
2022
-			. _sqlite_calculer_expression('WHERE', $where),
2023
-		$serveur,
2024
-		$requeter
2025
-	);
1994
+    if (!$champs) {
1995
+        return;
1996
+    }
1997
+    if (!$desc) {
1998
+        $desc = description_table($table, $serveur);
1999
+    }
2000
+    if (!$desc) {
2001
+        die("$table insertion sans description");
2002
+    }
2003
+    $fields = $desc['field'];
2004
+
2005
+    $set = [];
2006
+    foreach ($champs as $champ => $val) {
2007
+        $set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
2008
+    }
2009
+
2010
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
2011
+    // attention ils sont deja quotes
2012
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
2013
+    foreach ($maj as $champ => $val) {
2014
+        if (!isset($set[$champ])) {
2015
+            $set[$champ] = $champ . '=' . $val;
2016
+        }
2017
+    }
2018
+
2019
+    return spip_sqlite_query(
2020
+        _sqlite_calculer_expression('UPDATE', $table, ',')
2021
+            . _sqlite_calculer_expression('SET', $set, ',')
2022
+            . _sqlite_calculer_expression('WHERE', $where),
2023
+        $serveur,
2024
+        $requeter
2025
+    );
2026 2026
 }
2027 2027
 
2028 2028
 
@@ -2041,17 +2041,17 @@  discard block
 block discarded – undo
2041 2041
  */
2042 2042
 function _sqlite_init()
2043 2043
 {
2044
-	if (!defined('_DIR_DB')) {
2045
-		define('_DIR_DB', _DIR_ETC . 'bases/');
2046
-	}
2047
-	if (!defined('_SQLITE_CHMOD')) {
2048
-		define('_SQLITE_CHMOD', _SPIP_CHMOD);
2049
-	}
2050
-
2051
-	if (!is_dir($d = _DIR_DB)) {
2052
-		include_spip('inc/flock');
2053
-		sous_repertoire($d);
2054
-	}
2044
+    if (!defined('_DIR_DB')) {
2045
+        define('_DIR_DB', _DIR_ETC . 'bases/');
2046
+    }
2047
+    if (!defined('_SQLITE_CHMOD')) {
2048
+        define('_SQLITE_CHMOD', _SPIP_CHMOD);
2049
+    }
2050
+
2051
+    if (!is_dir($d = _DIR_DB)) {
2052
+        include_spip('inc/flock');
2053
+        sous_repertoire($d);
2054
+    }
2055 2055
 }
2056 2056
 
2057 2057
 
@@ -2066,20 +2066,20 @@  discard block
 block discarded – undo
2066 2066
  */
2067 2067
 function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true)
2068 2068
 {
2069
-	if ($link === '') {
2070
-		$link = _sqlite_link($serveur);
2071
-	}
2072
-	if (!$link) {
2073
-		return false;
2074
-	}
2069
+    if ($link === '') {
2070
+        $link = _sqlite_link($serveur);
2071
+    }
2072
+    if (!$link) {
2073
+        return false;
2074
+    }
2075 2075
 
2076
-	$v = 3;
2076
+    $v = 3;
2077 2077
 
2078
-	if (!$version) {
2079
-		return $v;
2080
-	}
2078
+    if (!$version) {
2079
+        return $v;
2080
+    }
2081 2081
 
2082
-	return ($version == $v);
2082
+    return ($version == $v);
2083 2083
 }
2084 2084
 
2085 2085
 
@@ -2091,9 +2091,9 @@  discard block
 block discarded – undo
2091 2091
  */
2092 2092
 function _sqlite_link($serveur = ''): ?\PDO
2093 2093
 {
2094
-	$link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2094
+    $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2095 2095
 
2096
-	return $link;
2096
+    return $link;
2097 2097
 }
2098 2098
 
2099 2099
 
@@ -2109,54 +2109,54 @@  discard block
 block discarded – undo
2109 2109
  */
2110 2110
 function _sqlite_calculer_cite($v, $type)
2111 2111
 {
2112
-	if ($type) {
2113
-		if (
2114
-			is_null($v)
2115
-			and stripos($type, 'NOT NULL') === false
2116
-		) {
2117
-			// null php se traduit en NULL SQL
2118
-			return 'NULL';
2119
-		}
2120
-
2121
-		if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2122
-			return $v;
2123
-		}
2124
-		if (sql_test_int($type)) {
2125
-			if (is_numeric($v)) {
2126
-				return $v;
2127
-			} elseif ($v === null) {
2128
-				return 0;
2129
-			} elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) === 0) {
2130
-				return hexdec(substr($v, 2));
2131
-			} else {
2132
-				return intval($v);
2133
-			}
2134
-		}
2135
-	} else {
2136
-		// si on ne connait pas le type on le deduit de $v autant que possible
2137
-		if (is_bool($v)) {
2138
-			return strval(intval($v));
2139
-		} elseif (is_numeric($v)) {
2140
-			return strval($v);
2141
-		}
2142
-	}
2143
-
2144
-	// trouver un link sqlite pour faire l'echappement
2145
-	foreach ($GLOBALS['connexions'] as $s) {
2146
-		if (
2147
-			$l = $s['link']
2148
-			and is_object($l)
2149
-			and $l instanceof \PDO
2150
-			and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2151
-		) {
2152
-			return $l->quote($v ?? '');
2153
-		}
2154
-	}
2155
-
2156
-	// echapper les ' en ''
2157
-	spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2158
-
2159
-	return ("'" . str_replace("'", "''", $v) . "'");
2112
+    if ($type) {
2113
+        if (
2114
+            is_null($v)
2115
+            and stripos($type, 'NOT NULL') === false
2116
+        ) {
2117
+            // null php se traduit en NULL SQL
2118
+            return 'NULL';
2119
+        }
2120
+
2121
+        if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2122
+            return $v;
2123
+        }
2124
+        if (sql_test_int($type)) {
2125
+            if (is_numeric($v)) {
2126
+                return $v;
2127
+            } elseif ($v === null) {
2128
+                return 0;
2129
+            } elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) === 0) {
2130
+                return hexdec(substr($v, 2));
2131
+            } else {
2132
+                return intval($v);
2133
+            }
2134
+        }
2135
+    } else {
2136
+        // si on ne connait pas le type on le deduit de $v autant que possible
2137
+        if (is_bool($v)) {
2138
+            return strval(intval($v));
2139
+        } elseif (is_numeric($v)) {
2140
+            return strval($v);
2141
+        }
2142
+    }
2143
+
2144
+    // trouver un link sqlite pour faire l'echappement
2145
+    foreach ($GLOBALS['connexions'] as $s) {
2146
+        if (
2147
+            $l = $s['link']
2148
+            and is_object($l)
2149
+            and $l instanceof \PDO
2150
+            and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2151
+        ) {
2152
+            return $l->quote($v ?? '');
2153
+        }
2154
+    }
2155
+
2156
+    // echapper les ' en ''
2157
+    spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2158
+
2159
+    return ("'" . str_replace("'", "''", $v) . "'");
2160 2160
 }
2161 2161
 
2162 2162
 
@@ -2173,21 +2173,21 @@  discard block
 block discarded – undo
2173 2173
  */
2174 2174
 function _sqlite_calculer_expression($expression, $v, $join = 'AND')
2175 2175
 {
2176
-	if (empty($v)) {
2177
-		return '';
2178
-	}
2179
-
2180
-	$exp = "\n$expression ";
2181
-
2182
-	if (!is_array($v)) {
2183
-		return $exp . $v;
2184
-	} else {
2185
-		if (strtoupper($join) === 'AND') {
2186
-			return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2187
-		} else {
2188
-			return $exp . join($join, $v);
2189
-		}
2190
-	}
2176
+    if (empty($v)) {
2177
+        return '';
2178
+    }
2179
+
2180
+    $exp = "\n$expression ";
2181
+
2182
+    if (!is_array($v)) {
2183
+        return $exp . $v;
2184
+    } else {
2185
+        if (strtoupper($join) === 'AND') {
2186
+            return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2187
+        } else {
2188
+            return $exp . join($join, $v);
2189
+        }
2190
+    }
2191 2191
 }
2192 2192
 
2193 2193
 
@@ -2204,7 +2204,7 @@  discard block
 block discarded – undo
2204 2204
  */
2205 2205
 function _sqlite_calculer_order($orderby)
2206 2206
 {
2207
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2207
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2208 2208
 }
2209 2209
 
2210 2210
 
@@ -2216,26 +2216,26 @@  discard block
 block discarded – undo
2216 2216
  */
2217 2217
 function _sqlite_calculer_select_as($args)
2218 2218
 {
2219
-	$res = '';
2220
-	foreach ($args as $k => $v) {
2221
-		if (substr($k, -1) == '@') {
2222
-			// c'est une jointure qui se refere au from precedent
2223
-			// pas de virgule
2224
-			$res .= '  ' . $v;
2225
-		} else {
2226
-			if (!is_numeric($k)) {
2227
-				$p = strpos($v, ' ');
2228
-				if ($p) {
2229
-					$v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2230
-				} else {
2231
-					$v .= " AS '$k'";
2232
-				}
2233
-			}
2234
-			$res .= ', ' . $v;
2235
-		}
2236
-	}
2237
-
2238
-	return substr($res, 2);
2219
+    $res = '';
2220
+    foreach ($args as $k => $v) {
2221
+        if (substr($k, -1) == '@') {
2222
+            // c'est une jointure qui se refere au from precedent
2223
+            // pas de virgule
2224
+            $res .= '  ' . $v;
2225
+        } else {
2226
+            if (!is_numeric($k)) {
2227
+                $p = strpos($v, ' ');
2228
+                if ($p) {
2229
+                    $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2230
+                } else {
2231
+                    $v .= " AS '$k'";
2232
+                }
2233
+            }
2234
+            $res .= ', ' . $v;
2235
+        }
2236
+    }
2237
+
2238
+    return substr($res, 2);
2239 2239
 }
2240 2240
 
2241 2241
 
@@ -2259,26 +2259,26 @@  discard block
 block discarded – undo
2259 2259
  */
2260 2260
 function _sqlite_calculer_where($v)
2261 2261
 {
2262
-	if (!is_array($v)) {
2263
-		return $v;
2264
-	}
2265
-
2266
-	$op = array_shift($v);
2267
-	if (!($n = count($v))) {
2268
-		return $op;
2269
-	} else {
2270
-		$arg = _sqlite_calculer_where(array_shift($v));
2271
-		if ($n == 1) {
2272
-			return "$op($arg)";
2273
-		} else {
2274
-			$arg2 = _sqlite_calculer_where(array_shift($v));
2275
-			if ($n == 2) {
2276
-				return "($arg $op $arg2)";
2277
-			} else {
2278
-				return "($arg $op ($arg2) : $v[0])";
2279
-			}
2280
-		}
2281
-	}
2262
+    if (!is_array($v)) {
2263
+        return $v;
2264
+    }
2265
+
2266
+    $op = array_shift($v);
2267
+    if (!($n = count($v))) {
2268
+        return $op;
2269
+    } else {
2270
+        $arg = _sqlite_calculer_where(array_shift($v));
2271
+        if ($n == 1) {
2272
+            return "$op($arg)";
2273
+        } else {
2274
+            $arg2 = _sqlite_calculer_where(array_shift($v));
2275
+            if ($n == 2) {
2276
+                return "($arg $op $arg2)";
2277
+            } else {
2278
+                return "($arg $op ($arg2) : $v[0])";
2279
+            }
2280
+        }
2281
+    }
2282 2282
 }
2283 2283
 
2284 2284
 
@@ -2294,19 +2294,19 @@  discard block
 block discarded – undo
2294 2294
  */
2295 2295
 function _sqlite_charger_version($version = '')
2296 2296
 {
2297
-	$versions = [];
2298
-
2299
-	// version 3
2300
-	if (!$version || $version == 3) {
2301
-		if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2302
-			$versions[] = 3;
2303
-		}
2304
-	}
2305
-	if ($version) {
2306
-		return in_array($version, $versions);
2307
-	}
2308
-
2309
-	return $versions;
2297
+    $versions = [];
2298
+
2299
+    // version 3
2300
+    if (!$version || $version == 3) {
2301
+        if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2302
+            $versions[] = 3;
2303
+        }
2304
+    }
2305
+    if ($version) {
2306
+        return in_array($version, $versions);
2307
+    }
2308
+
2309
+    return $versions;
2310 2310
 }
2311 2311
 
2312 2312
 
@@ -2345,147 +2345,147 @@  discard block
 block discarded – undo
2345 2345
 function _sqlite_modifier_table($table, $colonne, $opt = [], $serveur = '')
2346 2346
 {
2347 2347
 
2348
-	if (is_array($table)) {
2349
-		$table_destination = reset($table);
2350
-		$table_origine = key($table);
2351
-	} else {
2352
-		$table_origine = $table_destination = $table;
2353
-	}
2354
-	// ne prend actuellement qu'un changement
2355
-	// mais pourra etre adapte pour changer plus qu'une colonne a la fois
2356
-	if (is_array($colonne)) {
2357
-		$colonne_destination = reset($colonne);
2358
-		$colonne_origine = key($colonne);
2359
-	} else {
2360
-		$colonne_origine = $colonne_destination = $colonne;
2361
-	}
2362
-	if (!isset($opt['field'])) {
2363
-		$opt['field'] = [];
2364
-	}
2365
-	if (!isset($opt['key'])) {
2366
-		$opt['key'] = [];
2367
-	}
2368
-
2369
-	// si les noms de tables sont differents, pas besoin de table temporaire
2370
-	// on prendra directement le nom de la future table
2371
-	$meme_table = ($table_origine == $table_destination);
2372
-
2373
-	$def_origine = sql_showtable($table_origine, false, $serveur);
2374
-	if (!$def_origine or !isset($def_origine['field'])) {
2375
-		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2376
-
2377
-		return false;
2378
-	}
2379
-
2380
-
2381
-	$table_tmp = $table_origine . '_tmp';
2382
-
2383
-	// 1) creer une table temporaire avec les modifications
2384
-	// - DROP : suppression de la colonne
2385
-	// - CHANGE : modification de la colonne
2386
-	// (foreach pour conserver l'ordre des champs)
2387
-
2388
-	// field
2389
-	$fields = [];
2390
-	// pour le INSERT INTO plus loin
2391
-	// stocker la correspondance nouvelles->anciennes colonnes
2392
-	$fields_correspondances = [];
2393
-	foreach ($def_origine['field'] as $c => $d) {
2394
-		if ($colonne_origine && ($c == $colonne_origine)) {
2395
-			// si pas DROP
2396
-			if ($colonne_destination) {
2397
-				$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2398
-				$fields_correspondances[$colonne_destination] = $c;
2399
-			}
2400
-		} else {
2401
-			$fields[$c] = $d;
2402
-			$fields_correspondances[$c] = $c;
2403
-		}
2404
-	}
2405
-	// cas de ADD sqlite2 (ajout du champ en fin de table):
2406
-	if (!$colonne_origine && $colonne_destination) {
2407
-		$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2408
-	}
2409
-
2410
-	// key...
2411
-	$keys = [];
2412
-	foreach ($def_origine['key'] as $c => $d) {
2413
-		$c = str_replace($colonne_origine, $colonne_destination, $c);
2414
-		$d = str_replace($colonne_origine, $colonne_destination, $d);
2415
-		// seulement si on ne supprime pas la colonne !
2416
-		if ($d) {
2417
-			$keys[$c] = $d;
2418
-		}
2419
-	}
2420
-
2421
-	// autres keys, on merge
2422
-	$keys = array_merge($keys, $opt['key']);
2423
-	$queries = [];
2424
-
2425
-	// copier dans destination (si differente de origine), sinon tmp
2426
-	$table_copie = ($meme_table) ? $table_tmp : $table_destination;
2427
-	$autoinc = (isset($keys['PRIMARY KEY'])
2428
-		and $keys['PRIMARY KEY']
2429
-		and stripos($keys['PRIMARY KEY'], ',') === false
2430
-		and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2431
-
2432
-	if (
2433
-		$q = _sqlite_requete_create(
2434
-			$table_copie,
2435
-			$fields,
2436
-			$keys,
2437
-			$autoinc,
2438
-			$temporary = false,
2439
-			$ifnotexists = true,
2440
-			$serveur
2441
-		)
2442
-	) {
2443
-		$queries[] = $q;
2444
-	}
2445
-
2446
-
2447
-	// 2) y copier les champs qui vont bien
2448
-	$champs_dest = join(', ', array_keys($fields_correspondances));
2449
-	$champs_ori = join(', ', $fields_correspondances);
2450
-	$queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2451
-
2452
-	// 3) supprimer la table d'origine
2453
-	$queries[] = "DROP TABLE $table_origine";
2454
-
2455
-	// 4) renommer la table temporaire
2456
-	// avec le nom de la table destination
2457
-	// si necessaire
2458
-	if ($meme_table) {
2459
-		$queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2460
-	}
2461
-
2462
-	// 5) remettre les index !
2463
-	foreach ($keys as $k => $v) {
2464
-		if ($k == 'PRIMARY KEY') {
2465
-		} else {
2466
-			// enlever KEY
2467
-			$k = substr($k, 4);
2468
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2469
-		}
2470
-	}
2471
-
2472
-
2473
-	if (count($queries)) {
2474
-		Sqlite::demarrer_transaction($serveur);
2475
-		// il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2476
-		foreach ($queries as $q) {
2477
-			if (!Sqlite::executer_requete($q, $serveur)) {
2478
-				spip_log('SQLite : ALTER TABLE table :'
2479
-					. " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2480
-				Sqlite::annuler_transaction($serveur);
2481
-
2482
-				return false;
2483
-			}
2484
-		}
2485
-		Sqlite::finir_transaction($serveur);
2486
-	}
2487
-
2488
-	return true;
2348
+    if (is_array($table)) {
2349
+        $table_destination = reset($table);
2350
+        $table_origine = key($table);
2351
+    } else {
2352
+        $table_origine = $table_destination = $table;
2353
+    }
2354
+    // ne prend actuellement qu'un changement
2355
+    // mais pourra etre adapte pour changer plus qu'une colonne a la fois
2356
+    if (is_array($colonne)) {
2357
+        $colonne_destination = reset($colonne);
2358
+        $colonne_origine = key($colonne);
2359
+    } else {
2360
+        $colonne_origine = $colonne_destination = $colonne;
2361
+    }
2362
+    if (!isset($opt['field'])) {
2363
+        $opt['field'] = [];
2364
+    }
2365
+    if (!isset($opt['key'])) {
2366
+        $opt['key'] = [];
2367
+    }
2368
+
2369
+    // si les noms de tables sont differents, pas besoin de table temporaire
2370
+    // on prendra directement le nom de la future table
2371
+    $meme_table = ($table_origine == $table_destination);
2372
+
2373
+    $def_origine = sql_showtable($table_origine, false, $serveur);
2374
+    if (!$def_origine or !isset($def_origine['field'])) {
2375
+        spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2376
+
2377
+        return false;
2378
+    }
2379
+
2380
+
2381
+    $table_tmp = $table_origine . '_tmp';
2382
+
2383
+    // 1) creer une table temporaire avec les modifications
2384
+    // - DROP : suppression de la colonne
2385
+    // - CHANGE : modification de la colonne
2386
+    // (foreach pour conserver l'ordre des champs)
2387
+
2388
+    // field
2389
+    $fields = [];
2390
+    // pour le INSERT INTO plus loin
2391
+    // stocker la correspondance nouvelles->anciennes colonnes
2392
+    $fields_correspondances = [];
2393
+    foreach ($def_origine['field'] as $c => $d) {
2394
+        if ($colonne_origine && ($c == $colonne_origine)) {
2395
+            // si pas DROP
2396
+            if ($colonne_destination) {
2397
+                $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2398
+                $fields_correspondances[$colonne_destination] = $c;
2399
+            }
2400
+        } else {
2401
+            $fields[$c] = $d;
2402
+            $fields_correspondances[$c] = $c;
2403
+        }
2404
+    }
2405
+    // cas de ADD sqlite2 (ajout du champ en fin de table):
2406
+    if (!$colonne_origine && $colonne_destination) {
2407
+        $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2408
+    }
2409
+
2410
+    // key...
2411
+    $keys = [];
2412
+    foreach ($def_origine['key'] as $c => $d) {
2413
+        $c = str_replace($colonne_origine, $colonne_destination, $c);
2414
+        $d = str_replace($colonne_origine, $colonne_destination, $d);
2415
+        // seulement si on ne supprime pas la colonne !
2416
+        if ($d) {
2417
+            $keys[$c] = $d;
2418
+        }
2419
+    }
2420
+
2421
+    // autres keys, on merge
2422
+    $keys = array_merge($keys, $opt['key']);
2423
+    $queries = [];
2424
+
2425
+    // copier dans destination (si differente de origine), sinon tmp
2426
+    $table_copie = ($meme_table) ? $table_tmp : $table_destination;
2427
+    $autoinc = (isset($keys['PRIMARY KEY'])
2428
+        and $keys['PRIMARY KEY']
2429
+        and stripos($keys['PRIMARY KEY'], ',') === false
2430
+        and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2431
+
2432
+    if (
2433
+        $q = _sqlite_requete_create(
2434
+            $table_copie,
2435
+            $fields,
2436
+            $keys,
2437
+            $autoinc,
2438
+            $temporary = false,
2439
+            $ifnotexists = true,
2440
+            $serveur
2441
+        )
2442
+    ) {
2443
+        $queries[] = $q;
2444
+    }
2445
+
2446
+
2447
+    // 2) y copier les champs qui vont bien
2448
+    $champs_dest = join(', ', array_keys($fields_correspondances));
2449
+    $champs_ori = join(', ', $fields_correspondances);
2450
+    $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2451
+
2452
+    // 3) supprimer la table d'origine
2453
+    $queries[] = "DROP TABLE $table_origine";
2454
+
2455
+    // 4) renommer la table temporaire
2456
+    // avec le nom de la table destination
2457
+    // si necessaire
2458
+    if ($meme_table) {
2459
+        $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2460
+    }
2461
+
2462
+    // 5) remettre les index !
2463
+    foreach ($keys as $k => $v) {
2464
+        if ($k == 'PRIMARY KEY') {
2465
+        } else {
2466
+            // enlever KEY
2467
+            $k = substr($k, 4);
2468
+            $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2469
+        }
2470
+    }
2471
+
2472
+
2473
+    if (count($queries)) {
2474
+        Sqlite::demarrer_transaction($serveur);
2475
+        // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2476
+        foreach ($queries as $q) {
2477
+            if (!Sqlite::executer_requete($q, $serveur)) {
2478
+                spip_log('SQLite : ALTER TABLE table :'
2479
+                    . " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2480
+                Sqlite::annuler_transaction($serveur);
2481
+
2482
+                return false;
2483
+            }
2484
+        }
2485
+        Sqlite::finir_transaction($serveur);
2486
+    }
2487
+
2488
+    return true;
2489 2489
 }
2490 2490
 
2491 2491
 
@@ -2496,61 +2496,61 @@  discard block
 block discarded – undo
2496 2496
  */
2497 2497
 function _sqlite_ref_fonctions()
2498 2498
 {
2499
-	$fonctions = [
2500
-		'alter' => 'spip_sqlite_alter',
2501
-		'count' => 'spip_sqlite_count',
2502
-		'countsel' => 'spip_sqlite_countsel',
2503
-		'create' => 'spip_sqlite_create',
2504
-		'create_base' => 'spip_sqlite_create_base',
2505
-		'create_view' => 'spip_sqlite_create_view',
2506
-		'date_proche' => 'spip_sqlite_date_proche',
2507
-		'delete' => 'spip_sqlite_delete',
2508
-		'drop_table' => 'spip_sqlite_drop_table',
2509
-		'drop_view' => 'spip_sqlite_drop_view',
2510
-		'errno' => 'spip_sqlite_errno',
2511
-		'error' => 'spip_sqlite_error',
2512
-		'explain' => 'spip_sqlite_explain',
2513
-		'fetch' => 'spip_sqlite_fetch',
2514
-		'seek' => 'spip_sqlite_seek',
2515
-		'free' => 'spip_sqlite_free',
2516
-		'hex' => 'spip_sqlite_hex',
2517
-		'in' => 'spip_sqlite_in',
2518
-		'insert' => 'spip_sqlite_insert',
2519
-		'insertq' => 'spip_sqlite_insertq',
2520
-		'insertq_multi' => 'spip_sqlite_insertq_multi',
2521
-		'listdbs' => 'spip_sqlite_listdbs',
2522
-		'multi' => 'spip_sqlite_multi',
2523
-		'optimize' => 'spip_sqlite_optimize',
2524
-		'query' => 'spip_sqlite_query',
2525
-		'quote' => 'spip_sqlite_quote',
2526
-		'repair' => 'spip_sqlite_repair',
2527
-		'replace' => 'spip_sqlite_replace',
2528
-		'replace_multi' => 'spip_sqlite_replace_multi',
2529
-		'select' => 'spip_sqlite_select',
2530
-		'selectdb' => 'spip_sqlite_selectdb',
2531
-		'set_charset' => 'spip_sqlite_set_charset',
2532
-		'get_charset' => 'spip_sqlite_get_charset',
2533
-		'showbase' => 'spip_sqlite_showbase',
2534
-		'showtable' => 'spip_sqlite_showtable',
2535
-		'table_exists' => 'spip_sqlite_table_exists',
2536
-		'update' => 'spip_sqlite_update',
2537
-		'updateq' => 'spip_sqlite_updateq',
2538
-		'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2539
-		'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2540
-		'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2541
-	];
2542
-
2543
-	// association de chaque nom http d'un charset aux couples sqlite
2544
-	// SQLite supporte utf-8 et utf-16 uniquement.
2545
-	$charsets = [
2546
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2547
-		//'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2548
-		//'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2549
-	];
2550
-
2551
-	$fonctions['charsets'] = $charsets;
2552
-
2553
-	return $fonctions;
2499
+    $fonctions = [
2500
+        'alter' => 'spip_sqlite_alter',
2501
+        'count' => 'spip_sqlite_count',
2502
+        'countsel' => 'spip_sqlite_countsel',
2503
+        'create' => 'spip_sqlite_create',
2504
+        'create_base' => 'spip_sqlite_create_base',
2505
+        'create_view' => 'spip_sqlite_create_view',
2506
+        'date_proche' => 'spip_sqlite_date_proche',
2507
+        'delete' => 'spip_sqlite_delete',
2508
+        'drop_table' => 'spip_sqlite_drop_table',
2509
+        'drop_view' => 'spip_sqlite_drop_view',
2510
+        'errno' => 'spip_sqlite_errno',
2511
+        'error' => 'spip_sqlite_error',
2512
+        'explain' => 'spip_sqlite_explain',
2513
+        'fetch' => 'spip_sqlite_fetch',
2514
+        'seek' => 'spip_sqlite_seek',
2515
+        'free' => 'spip_sqlite_free',
2516
+        'hex' => 'spip_sqlite_hex',
2517
+        'in' => 'spip_sqlite_in',
2518
+        'insert' => 'spip_sqlite_insert',
2519
+        'insertq' => 'spip_sqlite_insertq',
2520
+        'insertq_multi' => 'spip_sqlite_insertq_multi',
2521
+        'listdbs' => 'spip_sqlite_listdbs',
2522
+        'multi' => 'spip_sqlite_multi',
2523
+        'optimize' => 'spip_sqlite_optimize',
2524
+        'query' => 'spip_sqlite_query',
2525
+        'quote' => 'spip_sqlite_quote',
2526
+        'repair' => 'spip_sqlite_repair',
2527
+        'replace' => 'spip_sqlite_replace',
2528
+        'replace_multi' => 'spip_sqlite_replace_multi',
2529
+        'select' => 'spip_sqlite_select',
2530
+        'selectdb' => 'spip_sqlite_selectdb',
2531
+        'set_charset' => 'spip_sqlite_set_charset',
2532
+        'get_charset' => 'spip_sqlite_get_charset',
2533
+        'showbase' => 'spip_sqlite_showbase',
2534
+        'showtable' => 'spip_sqlite_showtable',
2535
+        'table_exists' => 'spip_sqlite_table_exists',
2536
+        'update' => 'spip_sqlite_update',
2537
+        'updateq' => 'spip_sqlite_updateq',
2538
+        'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2539
+        'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2540
+        'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2541
+    ];
2542
+
2543
+    // association de chaque nom http d'un charset aux couples sqlite
2544
+    // SQLite supporte utf-8 et utf-16 uniquement.
2545
+    $charsets = [
2546
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2547
+        //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2548
+        //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2549
+    ];
2550
+
2551
+    $fonctions['charsets'] = $charsets;
2552
+
2553
+    return $fonctions;
2554 2554
 }
2555 2555
 
2556 2556
 
@@ -2563,56 +2563,56 @@  discard block
 block discarded – undo
2563 2563
  */
2564 2564
 function _sqlite_remplacements_definitions_table($query, $autoinc = false)
2565 2565
 {
2566
-	// quelques remplacements
2567
-	$num = '(\s*\([0-9]*\))?';
2568
-	$enum = '(\s*\([^\)]*\))?';
2569
-
2570
-	$remplace = [
2571
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2572
-		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2573
-		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2574
-		'/auto_increment/is' => '',
2575
-		'/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2576
-		'/(timestamp .* )ON .*$/is' => '\\1',
2577
-		'/character set \w+/is' => '',
2578
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2579
-		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2580
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2581
-		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2582
-		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2583
-	];
2584
-
2585
-	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2586
-	$remplace_autocinc = [
2587
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2588
-	];
2589
-	// pour les int non autoincrement, il faut un DEFAULT
2590
-	$remplace_nonautocinc = [
2591
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2592
-	];
2593
-
2594
-	if (is_string($query)) {
2595
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
2596
-		if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2597
-			$query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2598
-		} else {
2599
-			$query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2600
-			$query = _sqlite_collate_ci($query);
2601
-		}
2602
-	} elseif (is_array($query)) {
2603
-		foreach ($query as $k => $q) {
2604
-			$ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2605
-			$query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2606
-			if ($ai) {
2607
-				$query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2608
-			} else {
2609
-				$query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2610
-				$query[$k] = _sqlite_collate_ci($query[$k]);
2611
-			}
2612
-		}
2613
-	}
2614
-
2615
-	return $query;
2566
+    // quelques remplacements
2567
+    $num = '(\s*\([0-9]*\))?';
2568
+    $enum = '(\s*\([^\)]*\))?';
2569
+
2570
+    $remplace = [
2571
+        '/enum' . $enum . '/is' => 'VARCHAR(255)',
2572
+        '/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2573
+        '/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2574
+        '/auto_increment/is' => '',
2575
+        '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2576
+        '/(timestamp .* )ON .*$/is' => '\\1',
2577
+        '/character set \w+/is' => '',
2578
+        '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2579
+        '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2580
+        '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2581
+        '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2582
+        '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2583
+    ];
2584
+
2585
+    // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2586
+    $remplace_autocinc = [
2587
+        '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2588
+    ];
2589
+    // pour les int non autoincrement, il faut un DEFAULT
2590
+    $remplace_nonautocinc = [
2591
+        '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2592
+    ];
2593
+
2594
+    if (is_string($query)) {
2595
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
2596
+        if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2597
+            $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2598
+        } else {
2599
+            $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2600
+            $query = _sqlite_collate_ci($query);
2601
+        }
2602
+    } elseif (is_array($query)) {
2603
+        foreach ($query as $k => $q) {
2604
+            $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2605
+            $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2606
+            if ($ai) {
2607
+                $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2608
+            } else {
2609
+                $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2610
+                $query[$k] = _sqlite_collate_ci($query[$k]);
2611
+            }
2612
+        }
2613
+    }
2614
+
2615
+    return $query;
2616 2616
 }
2617 2617
 
2618 2618
 /**
@@ -2624,17 +2624,17 @@  discard block
 block discarded – undo
2624 2624
  */
2625 2625
 function _sqlite_collate_ci($champ)
2626 2626
 {
2627
-	if (stripos($champ, 'COLLATE') !== false) {
2628
-		return $champ;
2629
-	}
2630
-	if (stripos($champ, 'BINARY') !== false) {
2631
-		return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2632
-	}
2633
-	if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2634
-		return $champ . ' COLLATE NOCASE';
2635
-	}
2636
-
2637
-	return $champ;
2627
+    if (stripos($champ, 'COLLATE') !== false) {
2628
+        return $champ;
2629
+    }
2630
+    if (stripos($champ, 'BINARY') !== false) {
2631
+        return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2632
+    }
2633
+    if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2634
+        return $champ . ' COLLATE NOCASE';
2635
+    }
2636
+
2637
+    return $champ;
2638 2638
 }
2639 2639
 
2640 2640
 
@@ -2653,84 +2653,84 @@  discard block
 block discarded – undo
2653 2653
  * @return bool|string
2654 2654
  */
2655 2655
 function _sqlite_requete_create(
2656
-	$nom,
2657
-	$champs,
2658
-	$cles,
2659
-	$autoinc = false,
2660
-	$temporary = false,
2661
-	$_ifnotexists = true,
2662
-	$serveur = '',
2663
-	$requeter = true
2656
+    $nom,
2657
+    $champs,
2658
+    $cles,
2659
+    $autoinc = false,
2660
+    $temporary = false,
2661
+    $_ifnotexists = true,
2662
+    $serveur = '',
2663
+    $requeter = true
2664 2664
 ) {
2665
-	$query = $keys = $s = $p = '';
2666
-
2667
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
2668
-	// sans les renseigner (laisse le compilo recuperer la description)
2669
-	if (!is_array($champs) || !is_array($cles)) {
2670
-		return;
2671
-	}
2672
-
2673
-	// sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2674
-	// il faut passer par des create index
2675
-	// Il gere par contre primary key !
2676
-	// Soit la PK est definie dans les cles, soit dans un champs
2677
-	// soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2678
-	$pk = 'PRIMARY KEY';
2679
-	// le champ de cle primaire
2680
-	$champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2681
-
2682
-	foreach ($champs as $k => $v) {
2683
-		if (false !== stripos($v, $pk)) {
2684
-			$champ_pk = $k;
2685
-			// on n'en a plus besoin dans field, vu que defini dans key
2686
-			$champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2687
-			break;
2688
-		}
2689
-	}
2690
-
2691
-	if ($champ_pk) {
2692
-		$keys = "\n\t\t$pk ($champ_pk)";
2693
-	}
2694
-	// Pas de DEFAULT 0 sur les cles primaires en auto-increment
2695
-	if (
2696
-		isset($champs[$champ_pk])
2697
-		and stripos($champs[$champ_pk], 'default 0') !== false
2698
-	) {
2699
-		$champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2700
-	}
2701
-
2702
-	$champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2703
-	foreach ($champs as $k => $v) {
2704
-		$query .= "$s\n\t\t$k $v";
2705
-		$s = ',';
2706
-	}
2707
-
2708
-	$ifnotexists = '';
2709
-	if ($_ifnotexists) {
2710
-		$version = spip_sqlite_fetch(
2711
-			spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2712
-			'',
2713
-			$serveur
2714
-		);
2715
-		if (!function_exists('spip_version_compare')) {
2716
-			include_spip('plugins/installer');
2717
-		}
2718
-
2719
-		if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2720
-			$ifnotexists = ' IF NOT EXISTS';
2721
-		} else {
2722
-			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2723
-			$a = spip_sqlite_showtable($nom, $serveur);
2724
-			if (isset($a['key']['KEY ' . $nom])) {
2725
-				return true;
2726
-			}
2727
-		}
2728
-	}
2729
-
2730
-	$temporary = $temporary ? ' TEMPORARY' : '';
2731
-	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2732
-
2733
-	return $q;
2665
+    $query = $keys = $s = $p = '';
2666
+
2667
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
2668
+    // sans les renseigner (laisse le compilo recuperer la description)
2669
+    if (!is_array($champs) || !is_array($cles)) {
2670
+        return;
2671
+    }
2672
+
2673
+    // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2674
+    // il faut passer par des create index
2675
+    // Il gere par contre primary key !
2676
+    // Soit la PK est definie dans les cles, soit dans un champs
2677
+    // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2678
+    $pk = 'PRIMARY KEY';
2679
+    // le champ de cle primaire
2680
+    $champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2681
+
2682
+    foreach ($champs as $k => $v) {
2683
+        if (false !== stripos($v, $pk)) {
2684
+            $champ_pk = $k;
2685
+            // on n'en a plus besoin dans field, vu que defini dans key
2686
+            $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2687
+            break;
2688
+        }
2689
+    }
2690
+
2691
+    if ($champ_pk) {
2692
+        $keys = "\n\t\t$pk ($champ_pk)";
2693
+    }
2694
+    // Pas de DEFAULT 0 sur les cles primaires en auto-increment
2695
+    if (
2696
+        isset($champs[$champ_pk])
2697
+        and stripos($champs[$champ_pk], 'default 0') !== false
2698
+    ) {
2699
+        $champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2700
+    }
2701
+
2702
+    $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2703
+    foreach ($champs as $k => $v) {
2704
+        $query .= "$s\n\t\t$k $v";
2705
+        $s = ',';
2706
+    }
2707
+
2708
+    $ifnotexists = '';
2709
+    if ($_ifnotexists) {
2710
+        $version = spip_sqlite_fetch(
2711
+            spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2712
+            '',
2713
+            $serveur
2714
+        );
2715
+        if (!function_exists('spip_version_compare')) {
2716
+            include_spip('plugins/installer');
2717
+        }
2718
+
2719
+        if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2720
+            $ifnotexists = ' IF NOT EXISTS';
2721
+        } else {
2722
+            /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2723
+            $a = spip_sqlite_showtable($nom, $serveur);
2724
+            if (isset($a['key']['KEY ' . $nom])) {
2725
+                return true;
2726
+            }
2727
+        }
2728
+    }
2729
+
2730
+    $temporary = $temporary ? ' TEMPORARY' : '';
2731
+    $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2732
+
2733
+    return $q;
2734 2734
 }
2735 2735
 
2736 2736
 
@@ -2750,40 +2750,40 @@  discard block
 block discarded – undo
2750 2750
  */
2751 2751
 function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '')
2752 2752
 {
2753
-	static $tables = [];
2754
-
2755
-	if (!isset($tables[$table])) {
2756
-		if (!$desc) {
2757
-			$trouver_table = charger_fonction('trouver_table', 'base');
2758
-			$desc = $trouver_table($table, $serveur);
2759
-			// si pas de description, on ne fait rien, ou on die() ?
2760
-			if (!$desc) {
2761
-				return $couples;
2762
-			}
2763
-		}
2764
-
2765
-		// recherche des champs avec simplement 'TIMESTAMP'
2766
-		// cependant, il faudra peut etre etendre
2767
-		// avec la gestion de DEFAULT et ON UPDATE
2768
-		// mais ceux-ci ne sont pas utilises dans le core
2769
-		$tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2770
-
2771
-		$now = _sqlite_func_now(true);
2772
-		foreach ($desc['field'] as $k => $v) {
2773
-			if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2774
-				$tables[$table]['desc'][$k] = $v;
2775
-				$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2776
-			}
2777
-		}
2778
-	} else {
2779
-		$now = _sqlite_func_now(true);
2780
-		foreach (array_keys($tables[$table]['desc']) as $k) {
2781
-			$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2782
-		}
2783
-	}
2784
-
2785
-	// ajout des champs type 'timestamp' absents
2786
-	return array_merge($tables[$table]['valeur'], $couples);
2753
+    static $tables = [];
2754
+
2755
+    if (!isset($tables[$table])) {
2756
+        if (!$desc) {
2757
+            $trouver_table = charger_fonction('trouver_table', 'base');
2758
+            $desc = $trouver_table($table, $serveur);
2759
+            // si pas de description, on ne fait rien, ou on die() ?
2760
+            if (!$desc) {
2761
+                return $couples;
2762
+            }
2763
+        }
2764
+
2765
+        // recherche des champs avec simplement 'TIMESTAMP'
2766
+        // cependant, il faudra peut etre etendre
2767
+        // avec la gestion de DEFAULT et ON UPDATE
2768
+        // mais ceux-ci ne sont pas utilises dans le core
2769
+        $tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2770
+
2771
+        $now = _sqlite_func_now(true);
2772
+        foreach ($desc['field'] as $k => $v) {
2773
+            if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2774
+                $tables[$table]['desc'][$k] = $v;
2775
+                $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2776
+            }
2777
+        }
2778
+    } else {
2779
+        $now = _sqlite_func_now(true);
2780
+        foreach (array_keys($tables[$table]['desc']) as $k) {
2781
+            $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2782
+        }
2783
+    }
2784
+
2785
+    // ajout des champs type 'timestamp' absents
2786
+    return array_merge($tables[$table]['valeur'], $couples);
2787 2787
 }
2788 2788
 
2789 2789
 
@@ -2795,5 +2795,5 @@  discard block
 block discarded – undo
2795 2795
  */
2796 2796
 function spip_versions_sqlite()
2797 2797
 {
2798
-	return _sqlite_charger_version();
2798
+    return _sqlite_charger_version();
2799 2799
 }
Please login to merge, or discard this patch.