Completed
Push — master ( a00e03...ed3e1d )
by cam
05:20
created
ecrire/req/pg.exp.php 2 patches
Indentation   +1112 added lines, -1112 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  */
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 define('_DEFAULT_DB', 'spip');
@@ -32,128 +32,128 @@  discard block
 block discarded – undo
32 32
 
33 33
 // http://code.spip.net/@req_pg_dist
34 34
 function req_pg_dist($addr, $port, $login, $pass, $db = '', $prefixe = '') {
35
-	static $last_connect = array();
36
-	if (!extension_loaded('pgsql')) {
37
-		return false;
38
-	}
39
-
40
-	// si provient de selectdb
41
-	if (empty($addr) && empty($port) && empty($login) && empty($pass)) {
42
-		foreach (array('addr', 'port', 'login', 'pass', 'prefixe') as $a) {
43
-			$$a = $last_connect[$a];
44
-		}
45
-	}
46
-	@list($host, $p) = explode(';', $addr);
47
-	if ($p > 0) {
48
-		$port = " port=$p";
49
-	} else {
50
-		$port = '';
51
-	}
52
-	$erreurs = array();
53
-	if ($db) {
54
-		@$link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW);
55
-	} elseif (!@$link = pg_connect("host=$host$port user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) {
56
-		$erreurs[] = pg_last_error();
57
-		if (@$link = pg_connect("host=$host$port dbname=$login user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) {
58
-			$db = $login;
59
-		} else {
60
-			$erreurs[] = pg_last_error();
61
-			$db = _DEFAULT_DB;
62
-			$link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW);
63
-		}
64
-	}
65
-	if (!$link) {
66
-		$erreurs[] = pg_last_error();
67
-		foreach ($erreurs as $e) {
68
-			spip_log('Echec pg_connect. Erreur : ' . $e, 'pg.' . _LOG_HS);
69
-		}
70
-
71
-		return false;
72
-	}
73
-
74
-	if ($link) {
75
-		$last_connect = array(
76
-			'addr' => $addr,
77
-			'port' => $port,
78
-			'login' => $login,
79
-			'pass' => $pass,
80
-			'db' => $db,
81
-			'prefixe' => $prefixe,
82
-		);
83
-	}
84
-
85
-	spip_log("Connexion vers $host, base $db, prefixe $prefixe " . ($link ? 'operationnelle' : 'impossible'),
86
-		'pg.' . _LOG_DEBUG);
87
-
88
-	return !$link ? false : array(
89
-		'db' => $db,
90
-		'prefixe' => $prefixe ? $prefixe : $db,
91
-		'link' => $link,
92
-	);
35
+    static $last_connect = array();
36
+    if (!extension_loaded('pgsql')) {
37
+        return false;
38
+    }
39
+
40
+    // si provient de selectdb
41
+    if (empty($addr) && empty($port) && empty($login) && empty($pass)) {
42
+        foreach (array('addr', 'port', 'login', 'pass', 'prefixe') as $a) {
43
+            $$a = $last_connect[$a];
44
+        }
45
+    }
46
+    @list($host, $p) = explode(';', $addr);
47
+    if ($p > 0) {
48
+        $port = " port=$p";
49
+    } else {
50
+        $port = '';
51
+    }
52
+    $erreurs = array();
53
+    if ($db) {
54
+        @$link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW);
55
+    } elseif (!@$link = pg_connect("host=$host$port user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) {
56
+        $erreurs[] = pg_last_error();
57
+        if (@$link = pg_connect("host=$host$port dbname=$login user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) {
58
+            $db = $login;
59
+        } else {
60
+            $erreurs[] = pg_last_error();
61
+            $db = _DEFAULT_DB;
62
+            $link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW);
63
+        }
64
+    }
65
+    if (!$link) {
66
+        $erreurs[] = pg_last_error();
67
+        foreach ($erreurs as $e) {
68
+            spip_log('Echec pg_connect. Erreur : ' . $e, 'pg.' . _LOG_HS);
69
+        }
70
+
71
+        return false;
72
+    }
73
+
74
+    if ($link) {
75
+        $last_connect = array(
76
+            'addr' => $addr,
77
+            'port' => $port,
78
+            'login' => $login,
79
+            'pass' => $pass,
80
+            'db' => $db,
81
+            'prefixe' => $prefixe,
82
+        );
83
+    }
84
+
85
+    spip_log("Connexion vers $host, base $db, prefixe $prefixe " . ($link ? 'operationnelle' : 'impossible'),
86
+        'pg.' . _LOG_DEBUG);
87
+
88
+    return !$link ? false : array(
89
+        'db' => $db,
90
+        'prefixe' => $prefixe ? $prefixe : $db,
91
+        'link' => $link,
92
+    );
93 93
 }
94 94
 
95 95
 $GLOBALS['spip_pg_functions_1'] = array(
96
-	'alter' => 'spip_pg_alter',
97
-	'count' => 'spip_pg_count',
98
-	'countsel' => 'spip_pg_countsel',
99
-	'create' => 'spip_pg_create',
100
-	'create_base' => 'spip_pg_create_base',
101
-	'create_view' => 'spip_pg_create_view',
102
-	'date_proche' => 'spip_pg_date_proche',
103
-	'delete' => 'spip_pg_delete',
104
-	'drop_table' => 'spip_pg_drop_table',
105
-	'drop_view' => 'spip_pg_drop_view',
106
-	'errno' => 'spip_pg_errno',
107
-	'error' => 'spip_pg_error',
108
-	'explain' => 'spip_pg_explain',
109
-	'fetch' => 'spip_pg_fetch',
110
-	'seek' => 'spip_pg_seek',
111
-	'free' => 'spip_pg_free',
112
-	'hex' => 'spip_pg_hex',
113
-	'in' => 'spip_pg_in',
114
-	'insert' => 'spip_pg_insert',
115
-	'insertq' => 'spip_pg_insertq',
116
-	'insertq_multi' => 'spip_pg_insertq_multi',
117
-	'listdbs' => 'spip_pg_listdbs',
118
-	'multi' => 'spip_pg_multi',
119
-	'optimize' => 'spip_pg_optimize',
120
-	'query' => 'spip_pg_query',
121
-	'quote' => 'spip_pg_quote',
122
-	'replace' => 'spip_pg_replace',
123
-	'replace_multi' => 'spip_pg_replace_multi',
124
-	'select' => 'spip_pg_select',
125
-	'selectdb' => 'spip_pg_selectdb',
126
-	'set_connect_charset' => 'spip_pg_set_connect_charset',
127
-	'showbase' => 'spip_pg_showbase',
128
-	'showtable' => 'spip_pg_showtable',
129
-	'update' => 'spip_pg_update',
130
-	'updateq' => 'spip_pg_updateq',
96
+    'alter' => 'spip_pg_alter',
97
+    'count' => 'spip_pg_count',
98
+    'countsel' => 'spip_pg_countsel',
99
+    'create' => 'spip_pg_create',
100
+    'create_base' => 'spip_pg_create_base',
101
+    'create_view' => 'spip_pg_create_view',
102
+    'date_proche' => 'spip_pg_date_proche',
103
+    'delete' => 'spip_pg_delete',
104
+    'drop_table' => 'spip_pg_drop_table',
105
+    'drop_view' => 'spip_pg_drop_view',
106
+    'errno' => 'spip_pg_errno',
107
+    'error' => 'spip_pg_error',
108
+    'explain' => 'spip_pg_explain',
109
+    'fetch' => 'spip_pg_fetch',
110
+    'seek' => 'spip_pg_seek',
111
+    'free' => 'spip_pg_free',
112
+    'hex' => 'spip_pg_hex',
113
+    'in' => 'spip_pg_in',
114
+    'insert' => 'spip_pg_insert',
115
+    'insertq' => 'spip_pg_insertq',
116
+    'insertq_multi' => 'spip_pg_insertq_multi',
117
+    'listdbs' => 'spip_pg_listdbs',
118
+    'multi' => 'spip_pg_multi',
119
+    'optimize' => 'spip_pg_optimize',
120
+    'query' => 'spip_pg_query',
121
+    'quote' => 'spip_pg_quote',
122
+    'replace' => 'spip_pg_replace',
123
+    'replace_multi' => 'spip_pg_replace_multi',
124
+    'select' => 'spip_pg_select',
125
+    'selectdb' => 'spip_pg_selectdb',
126
+    'set_connect_charset' => 'spip_pg_set_connect_charset',
127
+    'showbase' => 'spip_pg_showbase',
128
+    'showtable' => 'spip_pg_showtable',
129
+    'update' => 'spip_pg_update',
130
+    'updateq' => 'spip_pg_updateq',
131 131
 );
132 132
 
133 133
 // Par ou ca passe une fois les traductions faites
134 134
 // http://code.spip.net/@spip_pg_trace_query
135 135
 function spip_pg_trace_query($query, $serveur = '') {
136
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
137
-	$prefixe = $connexion['prefixe'];
138
-	$link = $connexion['link'];
139
-	$db = $connexion['db'];
140
-
141
-	if (isset($_GET['var_profile'])) {
142
-		include_spip('public/tracer');
143
-		$t = trace_query_start();
144
-		$e = '';
145
-	} else {
146
-		$t = 0;
147
-	}
148
-
149
-	$connexion['last'] = $query;
150
-	$r = spip_pg_query_simple($link, $query);
151
-
152
-	// Log de l'erreur eventuelle
153
-	if ($e = spip_pg_errno($serveur)) {
154
-		$e .= spip_pg_error($query, $serveur);
155
-	} // et du fautif
156
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
136
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
137
+    $prefixe = $connexion['prefixe'];
138
+    $link = $connexion['link'];
139
+    $db = $connexion['db'];
140
+
141
+    if (isset($_GET['var_profile'])) {
142
+        include_spip('public/tracer');
143
+        $t = trace_query_start();
144
+        $e = '';
145
+    } else {
146
+        $t = 0;
147
+    }
148
+
149
+    $connexion['last'] = $query;
150
+    $r = spip_pg_query_simple($link, $query);
151
+
152
+    // Log de l'erreur eventuelle
153
+    if ($e = spip_pg_errno($serveur)) {
154
+        $e .= spip_pg_error($query, $serveur);
155
+    } // et du fautif
156
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
157 157
 }
158 158
 
159 159
 // Fonction de requete generale quand on est sur que c'est SQL standard.
@@ -161,30 +161,30 @@  discard block
 block discarded – undo
161 161
 
162 162
 // http://code.spip.net/@spip_pg_query
163 163
 function spip_pg_query($query, $serveur = '', $requeter = true) {
164
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
165
-	$prefixe = $connexion['prefixe'];
166
-	$link = $connexion['link'];
167
-	$db = $connexion['db'];
168
-
169
-	if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
170
-		$suite = strstr($query, $regs[0]);
171
-		$query = substr($query, 0, -strlen($suite));
172
-	} else {
173
-		$suite = '';
174
-	}
175
-	$query = preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', $query) . $suite;
176
-
177
-	// renvoyer la requete inerte si demandee
178
-	if (!$requeter) {
179
-		return $query;
180
-	}
181
-
182
-	return spip_pg_trace_query($query, $serveur);
164
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
165
+    $prefixe = $connexion['prefixe'];
166
+    $link = $connexion['link'];
167
+    $db = $connexion['db'];
168
+
169
+    if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
170
+        $suite = strstr($query, $regs[0]);
171
+        $query = substr($query, 0, -strlen($suite));
172
+    } else {
173
+        $suite = '';
174
+    }
175
+    $query = preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', $query) . $suite;
176
+
177
+    // renvoyer la requete inerte si demandee
178
+    if (!$requeter) {
179
+        return $query;
180
+    }
181
+
182
+    return spip_pg_trace_query($query, $serveur);
183 183
 }
184 184
 
185 185
 function spip_pg_query_simple($link, $query) {
186
-	#spip_log(var_export($query,true), 'pg.'._LOG_DEBUG);
187
-	return pg_query($link, $query);
186
+    #spip_log(var_export($query,true), 'pg.'._LOG_DEBUG);
187
+    return pg_query($link, $query);
188 188
 }
189 189
 
190 190
 /*
@@ -196,198 +196,198 @@  discard block
 block discarded – undo
196 196
  * de requetes showtable intempestives
197 197
  */
198 198
 function spip_pg_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') {
199
-	static $tables = array();
200
-
201
-	if (!isset($tables[$table])) {
202
-
203
-		if (!$desc) {
204
-			$trouver_table = charger_fonction('trouver_table', 'base');
205
-			$desc = $trouver_table($table, $serveur);
206
-			// si pas de description, on ne fait rien, ou on die() ?
207
-			if (!$desc) {
208
-				return $couples;
209
-			}
210
-		}
211
-
212
-		// recherche des champs avec simplement 'TIMESTAMP'
213
-		// cependant, il faudra peut etre etendre
214
-		// avec la gestion de DEFAULT et ON UPDATE
215
-		// mais ceux-ci ne sont pas utilises dans le core
216
-		$tables[$table] = array();
217
-		foreach ($desc['field'] as $k => $v) {
218
-			$v = strtolower(ltrim($v));
219
-			// ne pas ajouter de timestamp now() si un default est specifie
220
-			if (strpos($v, 'timestamp') === 0 and strpos($v, 'default') === false) {
221
-				$tables[$table][] = $k;
222
-			}
223
-		}
224
-	}
225
-
226
-	// ajout des champs type 'timestamp' absents
227
-	foreach ($tables[$table] as $maj) {
228
-		if (!array_key_exists($maj, $couples)) {
229
-			$couples[$maj] = "NOW()";
230
-		}
231
-	}
232
-
233
-	return $couples;
199
+    static $tables = array();
200
+
201
+    if (!isset($tables[$table])) {
202
+
203
+        if (!$desc) {
204
+            $trouver_table = charger_fonction('trouver_table', 'base');
205
+            $desc = $trouver_table($table, $serveur);
206
+            // si pas de description, on ne fait rien, ou on die() ?
207
+            if (!$desc) {
208
+                return $couples;
209
+            }
210
+        }
211
+
212
+        // recherche des champs avec simplement 'TIMESTAMP'
213
+        // cependant, il faudra peut etre etendre
214
+        // avec la gestion de DEFAULT et ON UPDATE
215
+        // mais ceux-ci ne sont pas utilises dans le core
216
+        $tables[$table] = array();
217
+        foreach ($desc['field'] as $k => $v) {
218
+            $v = strtolower(ltrim($v));
219
+            // ne pas ajouter de timestamp now() si un default est specifie
220
+            if (strpos($v, 'timestamp') === 0 and strpos($v, 'default') === false) {
221
+                $tables[$table][] = $k;
222
+            }
223
+        }
224
+    }
225
+
226
+    // ajout des champs type 'timestamp' absents
227
+    foreach ($tables[$table] as $maj) {
228
+        if (!array_key_exists($maj, $couples)) {
229
+            $couples[$maj] = "NOW()";
230
+        }
231
+    }
232
+
233
+    return $couples;
234 234
 }
235 235
 
236 236
 
237 237
 // Alter en PG ne traite pas les index
238 238
 // http://code.spip.net/@spip_pg_alter
239 239
 function spip_pg_alter($query, $serveur = '', $requeter = true) {
240
-	// il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
241
-	// tout en cassant en deux alter distincts "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... 
242
-	// ou revoir l'api de sql_alter en creant un 
243
-	// sql_alter_table($table,array($actions));
244
-	if (!preg_match("/\s*((\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)) {
245
-		spip_log("$query mal comprise", 'pg.' . _LOG_ERREUR);
246
-
247
-		return false;
248
-	}
249
-	$debut = $regs[1];
250
-	$table = $regs[3];
251
-	$suite = $regs[4];
252
-	$todo = explode(',', $suite);
253
-	// on remet les morceaux dechires ensembles... que c'est laid !
254
-	$todo2 = array();
255
-	$i = 0;
256
-	$ouverte = false;
257
-	while ($do = array_shift($todo)) {
258
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . "," . $do : $do;
259
-		$o = (false !== strpos($do, "("));
260
-		$f = (false !== strpos($do, ")"));
261
-		if ($o and !$f) {
262
-			$ouverte = true;
263
-		} elseif ($f) {
264
-			$ouverte = false;
265
-		}
266
-		if (!$ouverte) {
267
-			$i++;
268
-		}
269
-	}
270
-	$todo = $todo2;
271
-	$query = $debut . ' ' . array_shift($todo);
272
-
273
-	if (!preg_match('/^\s*(IGNORE\s*)?TABLE\s+(\w+)\s+(ADD|DROP|CHANGE|MODIFY|RENAME)\s*(.*)$/is', $query, $r)) {
274
-		spip_log("$query incompris", 'pg.' . _LOG_ERREUR);
275
-	} else {
276
-		if ($r[1]) {
277
-			spip_log("j'ignore IGNORE dans $query", 'pg.' . _LOG_AVERTISSEMENT);
278
-		}
279
-		$f = 'spip_pg_alter_' . strtolower($r[3]);
280
-		if (function_exists($f)) {
281
-			$f($r[2], $r[4], $serveur, $requeter);
282
-		} else {
283
-			spip_log("$query non prevu", 'pg.' . _LOG_ERREUR);
284
-		}
285
-	}
286
-	// Alter a plusieurs args. Faudrait optimiser.
287
-	if ($todo) {
288
-		spip_pg_alter("TABLE $table " . join(',', $todo));
289
-	}
240
+    // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
241
+    // tout en cassant en deux alter distincts "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... 
242
+    // ou revoir l'api de sql_alter en creant un 
243
+    // sql_alter_table($table,array($actions));
244
+    if (!preg_match("/\s*((\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)) {
245
+        spip_log("$query mal comprise", 'pg.' . _LOG_ERREUR);
246
+
247
+        return false;
248
+    }
249
+    $debut = $regs[1];
250
+    $table = $regs[3];
251
+    $suite = $regs[4];
252
+    $todo = explode(',', $suite);
253
+    // on remet les morceaux dechires ensembles... que c'est laid !
254
+    $todo2 = array();
255
+    $i = 0;
256
+    $ouverte = false;
257
+    while ($do = array_shift($todo)) {
258
+        $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . "," . $do : $do;
259
+        $o = (false !== strpos($do, "("));
260
+        $f = (false !== strpos($do, ")"));
261
+        if ($o and !$f) {
262
+            $ouverte = true;
263
+        } elseif ($f) {
264
+            $ouverte = false;
265
+        }
266
+        if (!$ouverte) {
267
+            $i++;
268
+        }
269
+    }
270
+    $todo = $todo2;
271
+    $query = $debut . ' ' . array_shift($todo);
272
+
273
+    if (!preg_match('/^\s*(IGNORE\s*)?TABLE\s+(\w+)\s+(ADD|DROP|CHANGE|MODIFY|RENAME)\s*(.*)$/is', $query, $r)) {
274
+        spip_log("$query incompris", 'pg.' . _LOG_ERREUR);
275
+    } else {
276
+        if ($r[1]) {
277
+            spip_log("j'ignore IGNORE dans $query", 'pg.' . _LOG_AVERTISSEMENT);
278
+        }
279
+        $f = 'spip_pg_alter_' . strtolower($r[3]);
280
+        if (function_exists($f)) {
281
+            $f($r[2], $r[4], $serveur, $requeter);
282
+        } else {
283
+            spip_log("$query non prevu", 'pg.' . _LOG_ERREUR);
284
+        }
285
+    }
286
+    // Alter a plusieurs args. Faudrait optimiser.
287
+    if ($todo) {
288
+        spip_pg_alter("TABLE $table " . join(',', $todo));
289
+    }
290 290
 
291 291
 }
292 292
 
293 293
 // http://code.spip.net/@spip_pg_alter_change
294 294
 function spip_pg_alter_change($table, $arg, $serveur = '', $requeter = true) {
295
-	if (!preg_match('/^`?(\w+)`?\s+`?(\w+)`?\s+(.*?)\s*(DEFAULT .*?)?(NOT\s+NULL)?\s*(DEFAULT .*?)?$/i', $arg, $r)) {
296
-		spip_log("alter change: $arg  incompris", 'pg.' . _LOG_ERREUR);
297
-	} else {
298
-		list(, $old, $new, $type, $default, $null, $def2) = $r;
299
-		$actions = array("ALTER $old TYPE " . mysql2pg_type($type));
300
-		if ($null) {
301
-			$actions[] = "ALTER $old SET NOT NULL";
302
-		} else {
303
-			$actions[] = "ALTER $old DROP NOT NULL";
304
-		}
305
-
306
-		if ($d = ($default ? $default : $def2)) {
307
-			$actions[] = "ALTER $old SET $d";
308
-		} else {
309
-			$actions[] = "ALTER $old DROP DEFAULT";
310
-		}
311
-
312
-		spip_pg_query("ALTER TABLE $table " . join(', ', $actions));
313
-
314
-		if ($old != $new) {
315
-			spip_pg_query("ALTER TABLE $table RENAME $old TO $new", $serveur);
316
-		}
317
-	}
295
+    if (!preg_match('/^`?(\w+)`?\s+`?(\w+)`?\s+(.*?)\s*(DEFAULT .*?)?(NOT\s+NULL)?\s*(DEFAULT .*?)?$/i', $arg, $r)) {
296
+        spip_log("alter change: $arg  incompris", 'pg.' . _LOG_ERREUR);
297
+    } else {
298
+        list(, $old, $new, $type, $default, $null, $def2) = $r;
299
+        $actions = array("ALTER $old TYPE " . mysql2pg_type($type));
300
+        if ($null) {
301
+            $actions[] = "ALTER $old SET NOT NULL";
302
+        } else {
303
+            $actions[] = "ALTER $old DROP NOT NULL";
304
+        }
305
+
306
+        if ($d = ($default ? $default : $def2)) {
307
+            $actions[] = "ALTER $old SET $d";
308
+        } else {
309
+            $actions[] = "ALTER $old DROP DEFAULT";
310
+        }
311
+
312
+        spip_pg_query("ALTER TABLE $table " . join(', ', $actions));
313
+
314
+        if ($old != $new) {
315
+            spip_pg_query("ALTER TABLE $table RENAME $old TO $new", $serveur);
316
+        }
317
+    }
318 318
 }
319 319
 
320 320
 // http://code.spip.net/@spip_pg_alter_add
321 321
 function spip_pg_alter_add($table, $arg, $serveur = '', $requeter = true) {
322
-	if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*(.*)$/', $arg, $r)) {
323
-		spip_log("alter add $arg  incompris", 'pg.' . _LOG_ERREUR);
324
-
325
-		return null;
326
-	}
327
-	if (!$r[1] or $r[1] == 'COLUMN') {
328
-		preg_match('/`?(\w+)`?(.*)/', $r[2], $m);
329
-		if (preg_match('/^(.*)(BEFORE|AFTER|FIRST)(.*)$/is', $m[2], $n)) {
330
-			$m[2] = $n[1];
331
-		}
332
-
333
-		return spip_pg_query("ALTER TABLE $table ADD " . $m[1] . ' ' . mysql2pg_type($m[2]), $serveur, $requeter);
334
-	} elseif ($r[1][0] == 'P') {
335
-		// la primary peut etre sur plusieurs champs
336
-		$r[2] = trim(str_replace('`', '', $r[2]));
337
-		$m = ($r[2][0] == '(') ? substr($r[2], 1, -1) : $r[2];
338
-
339
-		return spip_pg_query("ALTER TABLE $table ADD CONSTRAINT $table" . '_pkey PRIMARY KEY (' . $m . ')', $serveur,
340
-			$requeter);
341
-	} else {
342
-		preg_match('/([^\s,]*)\s*(.*)?/', $r[2], $m);
343
-		// peut etre "(colonne)" ou "nom_index (colonnes)"
344
-		// bug potentiel si qqn met "(colonne, colonne)"
345
-		//
346
-		// nom_index (colonnes)
347
-		if ($m[2]) {
348
-			$colonnes = substr($m[2], 1, -1);
349
-			$nom_index = $m[1];
350
-		} else {
351
-			// (colonne)
352
-			if ($m[1][0] == "(") {
353
-				$colonnes = substr($m[1], 1, -1);
354
-				if (false !== strpos(",", $colonnes)) {
355
-					spip_log("PG : Erreur, impossible de creer un index sur plusieurs colonnes"
356
-						. " sans qu'il ait de nom ($table, ($colonnes))", 'pg.' . _LOG_ERREUR);
357
-				} else {
358
-					$nom_index = $colonnes;
359
-				}
360
-			} // nom_index
361
-			else {
362
-				$nom_index = $colonnes = $m[1];
363
-			}
364
-		}
365
-
366
-		return spip_pg_create_index($nom_index, $table, $colonnes, $serveur, $requeter);
367
-	}
322
+    if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*(.*)$/', $arg, $r)) {
323
+        spip_log("alter add $arg  incompris", 'pg.' . _LOG_ERREUR);
324
+
325
+        return null;
326
+    }
327
+    if (!$r[1] or $r[1] == 'COLUMN') {
328
+        preg_match('/`?(\w+)`?(.*)/', $r[2], $m);
329
+        if (preg_match('/^(.*)(BEFORE|AFTER|FIRST)(.*)$/is', $m[2], $n)) {
330
+            $m[2] = $n[1];
331
+        }
332
+
333
+        return spip_pg_query("ALTER TABLE $table ADD " . $m[1] . ' ' . mysql2pg_type($m[2]), $serveur, $requeter);
334
+    } elseif ($r[1][0] == 'P') {
335
+        // la primary peut etre sur plusieurs champs
336
+        $r[2] = trim(str_replace('`', '', $r[2]));
337
+        $m = ($r[2][0] == '(') ? substr($r[2], 1, -1) : $r[2];
338
+
339
+        return spip_pg_query("ALTER TABLE $table ADD CONSTRAINT $table" . '_pkey PRIMARY KEY (' . $m . ')', $serveur,
340
+            $requeter);
341
+    } else {
342
+        preg_match('/([^\s,]*)\s*(.*)?/', $r[2], $m);
343
+        // peut etre "(colonne)" ou "nom_index (colonnes)"
344
+        // bug potentiel si qqn met "(colonne, colonne)"
345
+        //
346
+        // nom_index (colonnes)
347
+        if ($m[2]) {
348
+            $colonnes = substr($m[2], 1, -1);
349
+            $nom_index = $m[1];
350
+        } else {
351
+            // (colonne)
352
+            if ($m[1][0] == "(") {
353
+                $colonnes = substr($m[1], 1, -1);
354
+                if (false !== strpos(",", $colonnes)) {
355
+                    spip_log("PG : Erreur, impossible de creer un index sur plusieurs colonnes"
356
+                        . " sans qu'il ait de nom ($table, ($colonnes))", 'pg.' . _LOG_ERREUR);
357
+                } else {
358
+                    $nom_index = $colonnes;
359
+                }
360
+            } // nom_index
361
+            else {
362
+                $nom_index = $colonnes = $m[1];
363
+            }
364
+        }
365
+
366
+        return spip_pg_create_index($nom_index, $table, $colonnes, $serveur, $requeter);
367
+    }
368 368
 }
369 369
 
370 370
 // http://code.spip.net/@spip_pg_alter_drop
371 371
 function spip_pg_alter_drop($table, $arg, $serveur = '', $requeter = true) {
372
-	if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*`?(\w*)`?/', $arg, $r)) {
373
-		spip_log("alter drop: $arg  incompris", 'pg.' . _LOG_ERREUR);
374
-	} else {
375
-		if (!$r[1] or $r[1] == 'COLUMN') {
376
-			return spip_pg_query("ALTER TABLE $table DROP " . $r[2], $serveur);
377
-		} elseif ($r[1][0] == 'P') {
378
-			return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table" . '_pkey', $serveur);
379
-		} else {
380
-			return spip_pg_query("DROP INDEX " . $table . '_' . $r[2], $serveur);
381
-		}
382
-	}
372
+    if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*`?(\w*)`?/', $arg, $r)) {
373
+        spip_log("alter drop: $arg  incompris", 'pg.' . _LOG_ERREUR);
374
+    } else {
375
+        if (!$r[1] or $r[1] == 'COLUMN') {
376
+            return spip_pg_query("ALTER TABLE $table DROP " . $r[2], $serveur);
377
+        } elseif ($r[1][0] == 'P') {
378
+            return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table" . '_pkey', $serveur);
379
+        } else {
380
+            return spip_pg_query("DROP INDEX " . $table . '_' . $r[2], $serveur);
381
+        }
382
+    }
383 383
 }
384 384
 
385 385
 function spip_pg_alter_modify($table, $arg, $serveur = '', $requeter = true) {
386
-	if (!preg_match('/^`?(\w+)`?\s+(.*)$/', $arg, $r)) {
387
-		spip_log("alter modify: $arg  incompris", 'pg.' . _LOG_ERREUR);
388
-	} else {
389
-		return spip_pg_alter_change($table, $r[1] . ' ' . $arg, $serveur = '', $requeter = true);
390
-	}
386
+    if (!preg_match('/^`?(\w+)`?\s+(.*)$/', $arg, $r)) {
387
+        spip_log("alter modify: $arg  incompris", 'pg.' . _LOG_ERREUR);
388
+    } else {
389
+        return spip_pg_alter_change($table, $r[1] . ' ' . $arg, $serveur = '', $requeter = true);
390
+    }
391 391
 }
392 392
 
393 393
 // attention (en pg) : 
@@ -395,17 +395,17 @@  discard block
 block discarded – undo
395 395
 // - alter table A rename X to Y = changer le nom de la colonne X en Y 
396 396
 // pour l'instant, traiter simplement RENAME TO X
397 397
 function spip_pg_alter_rename($table, $arg, $serveur = '', $requeter = true) {
398
-	$rename = "";
399
-	// si TO, mais pas au debut
400
-	if (!stripos($arg, 'TO ')) {
401
-		$rename = $arg;
402
-	} elseif (preg_match('/^(TO)\s*`?(\w*)`?/', $arg, $r)) {
403
-		$rename = $r[2];
404
-	} else {
405
-		spip_log("alter rename: $arg  incompris", 'pg.' . _LOG_ERREUR);
406
-	}
407
-
408
-	return $rename ? spip_pg_query("ALTER TABLE $table RENAME TO $rename") : false;
398
+    $rename = "";
399
+    // si TO, mais pas au debut
400
+    if (!stripos($arg, 'TO ')) {
401
+        $rename = $arg;
402
+    } elseif (preg_match('/^(TO)\s*`?(\w*)`?/', $arg, $r)) {
403
+        $rename = $r[2];
404
+    } else {
405
+        spip_log("alter rename: $arg  incompris", 'pg.' . _LOG_ERREUR);
406
+    }
407
+
408
+    return $rename ? spip_pg_query("ALTER TABLE $table RENAME TO $rename") : false;
409 409
 }
410 410
 
411 411
 
@@ -421,58 +421,58 @@  discard block
 block discarded – undo
421 421
  * @return bool ou requete
422 422
  */
423 423
 function spip_pg_create_index($nom, $table, $champs, $serveur = '', $requeter = true) {
424
-	if (!($nom or $table or $champs)) {
425
-		spip_log("Champ manquant pour creer un index pg ($nom, $table, (" . @join(',', $champs) . "))",
426
-			'pg.' . _LOG_ERREUR);
427
-
428
-		return false;
429
-	}
430
-
431
-	$nom = str_replace("`", "", $nom);
432
-	$champs = str_replace("`", "", $champs);
433
-
434
-	// PG ne differentie pas noms des index en fonction des tables
435
-	// il faut donc creer des noms uniques d'index pour une base pg
436
-	$nom = $table . '_' . $nom;
437
-	// enlever d'eventuelles parentheses deja presentes sur champs
438
-	if (!is_array($champs)) {
439
-		if ($champs[0] == "(") {
440
-			$champs = substr($champs, 1, -1);
441
-		}
442
-		$champs = array($champs);
443
-	}
444
-	$query = "CREATE INDEX $nom ON $table (" . join(',', $champs) . ")";
445
-	if (!$requeter) {
446
-		return $query;
447
-	}
448
-	$res = spip_pg_query($query, $serveur, $requeter);
449
-
450
-	return $res;
424
+    if (!($nom or $table or $champs)) {
425
+        spip_log("Champ manquant pour creer un index pg ($nom, $table, (" . @join(',', $champs) . "))",
426
+            'pg.' . _LOG_ERREUR);
427
+
428
+        return false;
429
+    }
430
+
431
+    $nom = str_replace("`", "", $nom);
432
+    $champs = str_replace("`", "", $champs);
433
+
434
+    // PG ne differentie pas noms des index en fonction des tables
435
+    // il faut donc creer des noms uniques d'index pour une base pg
436
+    $nom = $table . '_' . $nom;
437
+    // enlever d'eventuelles parentheses deja presentes sur champs
438
+    if (!is_array($champs)) {
439
+        if ($champs[0] == "(") {
440
+            $champs = substr($champs, 1, -1);
441
+        }
442
+        $champs = array($champs);
443
+    }
444
+    $query = "CREATE INDEX $nom ON $table (" . join(',', $champs) . ")";
445
+    if (!$requeter) {
446
+        return $query;
447
+    }
448
+    $res = spip_pg_query($query, $serveur, $requeter);
449
+
450
+    return $res;
451 451
 }
452 452
 
453 453
 
454 454
 // http://code.spip.net/@spip_pg_explain
455 455
 function spip_pg_explain($query, $serveur = '', $requeter = true) {
456
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
457
-		return array();
458
-	}
459
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
460
-	$prefixe = $connexion['prefixe'];
461
-	$link = $connexion['link'];
462
-	if (preg_match('/\s(SET|VALUES|WHERE)\s/i', $query, $regs)) {
463
-		$suite = strstr($query, $regs[0]);
464
-		$query = substr($query, 0, -strlen($suite));
465
-	} else {
466
-		$suite = '';
467
-	}
468
-	$query = 'EXPLAIN ' . preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', $query) . $suite;
469
-
470
-	if (!$requeter) {
471
-		return $query;
472
-	}
473
-	$r = spip_pg_query_simple($link, $query);
474
-
475
-	return spip_pg_fetch($r, null, $serveur);
456
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
457
+        return array();
458
+    }
459
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
460
+    $prefixe = $connexion['prefixe'];
461
+    $link = $connexion['link'];
462
+    if (preg_match('/\s(SET|VALUES|WHERE)\s/i', $query, $regs)) {
463
+        $suite = strstr($query, $regs[0]);
464
+        $query = substr($query, 0, -strlen($suite));
465
+    } else {
466
+        $suite = '';
467
+    }
468
+    $query = 'EXPLAIN ' . preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', $query) . $suite;
469
+
470
+    if (!$requeter) {
471
+        return $query;
472
+    }
473
+    $r = spip_pg_query_simple($link, $query);
474
+
475
+    return spip_pg_fetch($r, null, $serveur);
476 476
 }
477 477
 
478 478
 
@@ -491,92 +491,92 @@  discard block
 block discarded – undo
491 491
  *     - False en cas d'erreur.
492 492
  **/
493 493
 function spip_pg_selectdb($db, $serveur = '', $requeter = true) {
494
-	// se connecter a la base indiquee
495
-	// avec les identifiants connus
496
-	$index = $serveur ? strtolower($serveur) : 0;
497
-
498
-	if ($link = spip_connect_db('', '', '', '', $db, 'pg', '', '')) {
499
-		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
500
-			return $db;
501
-		}
502
-	} else {
503
-		return false;
504
-	}
494
+    // se connecter a la base indiquee
495
+    // avec les identifiants connus
496
+    $index = $serveur ? strtolower($serveur) : 0;
497
+
498
+    if ($link = spip_connect_db('', '', '', '', $db, 'pg', '', '')) {
499
+        if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
500
+            return $db;
501
+        }
502
+    } else {
503
+        return false;
504
+    }
505 505
 }
506 506
 
507 507
 // Qu'une seule base pour le moment
508 508
 
509 509
 // http://code.spip.net/@spip_pg_listdbs
510 510
 function spip_pg_listdbs($serveur) {
511
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
512
-	$link = $connexion['link'];
513
-	$dbs = array();
514
-	$res = spip_pg_query_simple($link, "select * From pg_database");
515
-	while ($row = pg_fetch_array($res, null, PGSQL_NUM)) {
516
-		$dbs[] = reset($row);
517
-	}
518
-
519
-	return $dbs;
511
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
512
+    $link = $connexion['link'];
513
+    $dbs = array();
514
+    $res = spip_pg_query_simple($link, "select * From pg_database");
515
+    while ($row = pg_fetch_array($res, null, PGSQL_NUM)) {
516
+        $dbs[] = reset($row);
517
+    }
518
+
519
+    return $dbs;
520 520
 }
521 521
 
522 522
 // http://code.spip.net/@spip_pg_select
523 523
 function spip_pg_select(
524
-	$select,
525
-	$from,
526
-	$where = '',
527
-	$groupby = array(),
528
-	$orderby = '',
529
-	$limit = '',
530
-	$having = '',
531
-	$serveur = '',
532
-	$requeter = true
524
+    $select,
525
+    $from,
526
+    $where = '',
527
+    $groupby = array(),
528
+    $orderby = '',
529
+    $limit = '',
530
+    $having = '',
531
+    $serveur = '',
532
+    $requeter = true
533 533
 ) {
534 534
 
535
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
536
-	$prefixe = $connexion['prefixe'];
537
-	$link = $connexion['link'];
538
-	$db = $connexion['db'];
539
-
540
-	$limit = preg_match("/^\s*(([0-9]+),)?\s*([0-9]+)\s*$/", $limit, $limatch);
541
-	if ($limit) {
542
-		$offset = $limatch[2];
543
-		$count = $limatch[3];
544
-	}
545
-
546
-	$select = spip_pg_frommysql($select);
547
-
548
-	// si pas de tri explicitement demande, le GROUP BY ne
549
-	// contient que la clef primaire.
550
-	// lui ajouter alors le champ de tri par defaut
551
-	if (preg_match("/FIELD\(([a-z]+\.[a-z]+),/i", $orderby[0], $groupbyplus)) {
552
-		$groupby[] = $groupbyplus[1];
553
-	}
554
-
555
-	$orderby = spip_pg_orderby($orderby, $select);
556
-
557
-	if ($having) {
558
-		if (is_array($having)) {
559
-			$having = join("\n\tAND ", array_map('calculer_pg_where', $having));
560
-		}
561
-	}
562
-	$from = spip_pg_from($from, $prefixe);
563
-	$query = "SELECT " . $select
564
-		. (!$from ? '' : "\nFROM $from")
565
-		. (!$where ? '' : ("\nWHERE " . (!is_array($where) ? calculer_pg_where($where) : (join("\n\tAND ",
566
-				array_map('calculer_pg_where', $where))))))
567
-		. spip_pg_groupby($groupby, $from, $select)
568
-		. (!$having ? '' : "\nHAVING $having")
569
-		. ($orderby ? ("\nORDER BY $orderby") : '')
570
-		. (!$limit ? '' : (" LIMIT $count" . (!$offset ? '' : " OFFSET $offset")));
571
-
572
-	// renvoyer la requete inerte si demandee
573
-	if ($requeter === false) {
574
-		return $query;
575
-	}
576
-
577
-	$r = spip_pg_trace_query($query, $serveur);
578
-
579
-	return $r ? $r : $query;;
535
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
536
+    $prefixe = $connexion['prefixe'];
537
+    $link = $connexion['link'];
538
+    $db = $connexion['db'];
539
+
540
+    $limit = preg_match("/^\s*(([0-9]+),)?\s*([0-9]+)\s*$/", $limit, $limatch);
541
+    if ($limit) {
542
+        $offset = $limatch[2];
543
+        $count = $limatch[3];
544
+    }
545
+
546
+    $select = spip_pg_frommysql($select);
547
+
548
+    // si pas de tri explicitement demande, le GROUP BY ne
549
+    // contient que la clef primaire.
550
+    // lui ajouter alors le champ de tri par defaut
551
+    if (preg_match("/FIELD\(([a-z]+\.[a-z]+),/i", $orderby[0], $groupbyplus)) {
552
+        $groupby[] = $groupbyplus[1];
553
+    }
554
+
555
+    $orderby = spip_pg_orderby($orderby, $select);
556
+
557
+    if ($having) {
558
+        if (is_array($having)) {
559
+            $having = join("\n\tAND ", array_map('calculer_pg_where', $having));
560
+        }
561
+    }
562
+    $from = spip_pg_from($from, $prefixe);
563
+    $query = "SELECT " . $select
564
+        . (!$from ? '' : "\nFROM $from")
565
+        . (!$where ? '' : ("\nWHERE " . (!is_array($where) ? calculer_pg_where($where) : (join("\n\tAND ",
566
+                array_map('calculer_pg_where', $where))))))
567
+        . spip_pg_groupby($groupby, $from, $select)
568
+        . (!$having ? '' : "\nHAVING $having")
569
+        . ($orderby ? ("\nORDER BY $orderby") : '')
570
+        . (!$limit ? '' : (" LIMIT $count" . (!$offset ? '' : " OFFSET $offset")));
571
+
572
+    // renvoyer la requete inerte si demandee
573
+    if ($requeter === false) {
574
+        return $query;
575
+    }
576
+
577
+    $r = spip_pg_trace_query($query, $serveur);
578
+
579
+    return $r ? $r : $query;;
580 580
 }
581 581
 
582 582
 // Le traitement des prefixes de table dans un Select se limite au FROM
@@ -584,28 +584,28 @@  discard block
 block discarded – undo
584 584
 
585 585
 // http://code.spip.net/@spip_pg_from
586 586
 function spip_pg_from($from, $prefixe) {
587
-	if (is_array($from)) {
588
-		$from = spip_pg_select_as($from);
589
-	}
587
+    if (is_array($from)) {
588
+        $from = spip_pg_select_as($from);
589
+    }
590 590
 
591
-	return !$prefixe ? $from : preg_replace('/(\b)spip_/', '\1' . $prefixe . '_', $from);
591
+    return !$prefixe ? $from : preg_replace('/(\b)spip_/', '\1' . $prefixe . '_', $from);
592 592
 }
593 593
 
594 594
 // http://code.spip.net/@spip_pg_orderby
595 595
 function spip_pg_orderby($order, $select) {
596
-	$res = array();
597
-	$arg = (is_array($order) ? $order : preg_split('/\s*,\s*/', $order));
596
+    $res = array();
597
+    $arg = (is_array($order) ? $order : preg_split('/\s*,\s*/', $order));
598 598
 
599
-	foreach ($arg as $v) {
600
-		if (preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+' . $v . '/', $select, $m)) {
599
+    foreach ($arg as $v) {
600
+        if (preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+' . $v . '/', $select, $m)) {
601 601
 
602
-			$res[] = $m[1];
603
-		} else {
604
-			$res[] = $v;
605
-		}
606
-	}
602
+            $res[] = $m[1];
603
+        } else {
604
+            $res[] = $v;
605
+        }
606
+    }
607 607
 
608
-	return spip_pg_frommysql(join(',', $res));
608
+    return spip_pg_frommysql(join(',', $res));
609 609
 }
610 610
 
611 611
 // Conversion a l'arrach' des jointures MySQL en jointures PG
@@ -614,57 +614,57 @@  discard block
 block discarded – undo
614 614
 
615 615
 // http://code.spip.net/@spip_pg_groupby
616 616
 function spip_pg_groupby($groupby, $from, $select) {
617
-	$join = strpos($from, ",");
618
-	// ismplifier avant de decouper
619
-	if (is_string($select)) // fct SQL sur colonne et constante apostrophee ==> la colonne
620
-	{
621
-		$select = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $select);
622
-	}
623
-
624
-	if ($join or $groupby) {
625
-		$join = is_array($select) ? $select : explode(", ", $select);
626
-	}
627
-	if ($join) {
628
-		// enlever les 0 as points, '', ...
629
-		foreach ($join as $k => $v) {
630
-			$v = str_replace('DISTINCT ', '', $v);
631
-			// fct SQL sur colonne et constante apostrophee ==> la colonne
632
-			$v = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $v);
633
-			$v = preg_replace('/CAST\(\s*([^(),\' ]*\s+)as\s*\w+\)/', '\\1', $v);
634
-			// resultat d'agregat ne sont pas a mettre dans le groupby
635
-			$v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)(\s*AS\s+\w+)\s*,?/i', '', $v);
636
-			// idem sans AS (fetch numerique)
637
-			$v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)\s*,?/i', '', $v);
638
-			// des AS simples : on garde le cote droit du AS
639
-			$v = preg_replace('/^.*\sAS\s+(\w+)\s*$/i', '\\1', $v);
640
-			// ne reste plus que les vrais colonnes, ou des constantes a virer
641
-			if (preg_match(',^[\'"],', $v) or is_numeric($v)) {
642
-				unset($join[$k]);
643
-			} else {
644
-				$join[$k] = trim($v);
645
-			}
646
-		}
647
-		$join = array_diff($join, array(''));
648
-		$join = implode(',', $join);
649
-	}
650
-	if (is_array($groupby)) {
651
-		$groupby = join(',', $groupby);
652
-	}
653
-	if ($join) {
654
-		$groupby = $groupby ? "$groupby, $join" : $join;
655
-	}
656
-	if (!$groupby) {
657
-		return '';
658
-	}
659
-
660
-	$groupby = spip_pg_frommysql($groupby);
661
-	// Ne pas mettre dans le Group-By des valeurs numeriques
662
-	// issue de prepare_recherche
663
-	$groupby = preg_replace('/^\s*\d+\s+AS\s+\w+\s*,?\s*/i', '', $groupby);
664
-	$groupby = preg_replace('/,\s*\d+\s+AS\s+\w+\s*/i', '', $groupby);
665
-	$groupby = preg_replace('/\s+AS\s+\w+\s*/i', '', $groupby);
666
-
667
-	return "\nGROUP BY $groupby";
617
+    $join = strpos($from, ",");
618
+    // ismplifier avant de decouper
619
+    if (is_string($select)) // fct SQL sur colonne et constante apostrophee ==> la colonne
620
+    {
621
+        $select = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $select);
622
+    }
623
+
624
+    if ($join or $groupby) {
625
+        $join = is_array($select) ? $select : explode(", ", $select);
626
+    }
627
+    if ($join) {
628
+        // enlever les 0 as points, '', ...
629
+        foreach ($join as $k => $v) {
630
+            $v = str_replace('DISTINCT ', '', $v);
631
+            // fct SQL sur colonne et constante apostrophee ==> la colonne
632
+            $v = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $v);
633
+            $v = preg_replace('/CAST\(\s*([^(),\' ]*\s+)as\s*\w+\)/', '\\1', $v);
634
+            // resultat d'agregat ne sont pas a mettre dans le groupby
635
+            $v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)(\s*AS\s+\w+)\s*,?/i', '', $v);
636
+            // idem sans AS (fetch numerique)
637
+            $v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)\s*,?/i', '', $v);
638
+            // des AS simples : on garde le cote droit du AS
639
+            $v = preg_replace('/^.*\sAS\s+(\w+)\s*$/i', '\\1', $v);
640
+            // ne reste plus que les vrais colonnes, ou des constantes a virer
641
+            if (preg_match(',^[\'"],', $v) or is_numeric($v)) {
642
+                unset($join[$k]);
643
+            } else {
644
+                $join[$k] = trim($v);
645
+            }
646
+        }
647
+        $join = array_diff($join, array(''));
648
+        $join = implode(',', $join);
649
+    }
650
+    if (is_array($groupby)) {
651
+        $groupby = join(',', $groupby);
652
+    }
653
+    if ($join) {
654
+        $groupby = $groupby ? "$groupby, $join" : $join;
655
+    }
656
+    if (!$groupby) {
657
+        return '';
658
+    }
659
+
660
+    $groupby = spip_pg_frommysql($groupby);
661
+    // Ne pas mettre dans le Group-By des valeurs numeriques
662
+    // issue de prepare_recherche
663
+    $groupby = preg_replace('/^\s*\d+\s+AS\s+\w+\s*,?\s*/i', '', $groupby);
664
+    $groupby = preg_replace('/,\s*\d+\s+AS\s+\w+\s*/i', '', $groupby);
665
+    $groupby = preg_replace('/\s+AS\s+\w+\s*/i', '', $groupby);
666
+
667
+    return "\nGROUP BY $groupby";
668 668
 }
669 669
 
670 670
 // Conversion des operateurs MySQL en PG
@@ -676,472 +676,472 @@  discard block
 block discarded – undo
676 676
 
677 677
 // http://code.spip.net/@spip_pg_frommysql
678 678
 function spip_pg_frommysql($arg) {
679
-	if (is_array($arg)) {
680
-		$arg = join(", ", $arg);
681
-	}
679
+    if (is_array($arg)) {
680
+        $arg = join(", ", $arg);
681
+    }
682 682
 
683
-	$res = spip_pg_fromfield($arg);
683
+    $res = spip_pg_fromfield($arg);
684 684
 
685
-	$res = preg_replace('/\brand[(][)]/i', 'random()', $res);
685
+    $res = preg_replace('/\brand[(][)]/i', 'random()', $res);
686 686
 
687
-	$res = preg_replace('/\b0\.0[+]([a-zA-Z0-9_.]+)\s*/',
688
-		'CAST(substring(\1, \'^ *[0-9.]+\') as float)',
689
-		$res);
690
-	$res = preg_replace('/\b0[+]([a-zA-Z0-9_.]+)\s*/',
691
-		'CAST(substring(\1, \'^ *[0-9]+\') as int)',
692
-		$res);
693
-	$res = preg_replace('/\bconv[(]([^,]*)[^)]*[)]/i',
694
-		'CAST(substring(\1, \'^ *[0-9]+\') as int)',
695
-		$res);
687
+    $res = preg_replace('/\b0\.0[+]([a-zA-Z0-9_.]+)\s*/',
688
+        'CAST(substring(\1, \'^ *[0-9.]+\') as float)',
689
+        $res);
690
+    $res = preg_replace('/\b0[+]([a-zA-Z0-9_.]+)\s*/',
691
+        'CAST(substring(\1, \'^ *[0-9]+\') as int)',
692
+        $res);
693
+    $res = preg_replace('/\bconv[(]([^,]*)[^)]*[)]/i',
694
+        'CAST(substring(\1, \'^ *[0-9]+\') as int)',
695
+        $res);
696 696
 
697
-	$res = preg_replace('/UNIX_TIMESTAMP\s*[(]\s*[)]/',
698
-		' EXTRACT(epoch FROM NOW())', $res);
697
+    $res = preg_replace('/UNIX_TIMESTAMP\s*[(]\s*[)]/',
698
+        ' EXTRACT(epoch FROM NOW())', $res);
699 699
 
700
-	// la fonction md5(integer) n'est pas connu en pg
701
-	// il faut donc forcer les types en text (cas de md5(id_article))
702
-	$res = preg_replace('/md5\s*[(]([^)]*)[)]/i',
703
-		'MD5(CAST(\1 AS text))', $res);
700
+    // la fonction md5(integer) n'est pas connu en pg
701
+    // il faut donc forcer les types en text (cas de md5(id_article))
702
+    $res = preg_replace('/md5\s*[(]([^)]*)[)]/i',
703
+        'MD5(CAST(\1 AS text))', $res);
704 704
 
705
-	$res = preg_replace('/UNIX_TIMESTAMP\s*[(]([^)]*)[)]/',
706
-		' EXTRACT(epoch FROM \1)', $res);
705
+    $res = preg_replace('/UNIX_TIMESTAMP\s*[(]([^)]*)[)]/',
706
+        ' EXTRACT(epoch FROM \1)', $res);
707 707
 
708
-	$res = preg_replace('/\bDAYOFMONTH\s*[(]([^()]*([(][^()]*[)][^()]*)*[^)]*)[)]/',
709
-		' EXTRACT(day FROM \1)',
710
-		$res);
708
+    $res = preg_replace('/\bDAYOFMONTH\s*[(]([^()]*([(][^()]*[)][^()]*)*[^)]*)[)]/',
709
+        ' EXTRACT(day FROM \1)',
710
+        $res);
711 711
 
712
-	$res = preg_replace('/\bMONTH\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/',
713
-		' EXTRACT(month FROM \1)',
714
-		$res);
712
+    $res = preg_replace('/\bMONTH\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/',
713
+        ' EXTRACT(month FROM \1)',
714
+        $res);
715 715
 
716
-	$res = preg_replace('/\bYEAR\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/',
717
-		' EXTRACT(year FROM \1)',
718
-		$res);
716
+    $res = preg_replace('/\bYEAR\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/',
717
+        ' EXTRACT(year FROM \1)',
718
+        $res);
719 719
 
720
-	$res = preg_replace('/TO_DAYS\s*[(]([^()]*([(][^)]*[)][()]*)*)[)]/',
721
-		' EXTRACT(day FROM \1 - \'0001-01-01\')',
722
-		$res);
720
+    $res = preg_replace('/TO_DAYS\s*[(]([^()]*([(][^)]*[)][()]*)*)[)]/',
721
+        ' EXTRACT(day FROM \1 - \'0001-01-01\')',
722
+        $res);
723 723
 
724
-	$res = preg_replace("/(EXTRACT[(][^ ]* FROM *)\"([^\"]*)\"/", '\1\'\2\'', $res);
724
+    $res = preg_replace("/(EXTRACT[(][^ ]* FROM *)\"([^\"]*)\"/", '\1\'\2\'', $res);
725 725
 
726
-	$res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m%d\'[)]/', 'to_char(\1, \'YYYYMMDD\')', $res);
726
+    $res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m%d\'[)]/', 'to_char(\1, \'YYYYMMDD\')', $res);
727 727
 
728
-	$res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m\'[)]/', 'to_char(\1, \'YYYYMM\')', $res);
728
+    $res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m\'[)]/', 'to_char(\1, \'YYYYMM\')', $res);
729 729
 
730
-	$res = preg_replace('/DATE_SUB\s*[(]([^,]*),/', '(\1 -', $res);
731
-	$res = preg_replace('/DATE_ADD\s*[(]([^,]*),/', '(\1 +', $res);
732
-	$res = preg_replace('/INTERVAL\s+(\d+\s+\w+)/', 'INTERVAL \'\1\'', $res);
733
-	$res = preg_replace('/([+<>-]=?)\s*(\'\d+-\d+-\d+\s+\d+:\d+(:\d+)\')/', '\1 timestamp \2', $res);
734
-	$res = preg_replace('/(\'\d+-\d+-\d+\s+\d+:\d+:\d+\')\s*([+<>-]=?)/', 'timestamp \1 \2', $res);
730
+    $res = preg_replace('/DATE_SUB\s*[(]([^,]*),/', '(\1 -', $res);
731
+    $res = preg_replace('/DATE_ADD\s*[(]([^,]*),/', '(\1 +', $res);
732
+    $res = preg_replace('/INTERVAL\s+(\d+\s+\w+)/', 'INTERVAL \'\1\'', $res);
733
+    $res = preg_replace('/([+<>-]=?)\s*(\'\d+-\d+-\d+\s+\d+:\d+(:\d+)\')/', '\1 timestamp \2', $res);
734
+    $res = preg_replace('/(\'\d+-\d+-\d+\s+\d+:\d+:\d+\')\s*([+<>-]=?)/', 'timestamp \1 \2', $res);
735 735
 
736
-	$res = preg_replace('/([+<>-]=?)\s*(\'\d+-\d+-\d+\')/', '\1 timestamp \2', $res);
737
-	$res = preg_replace('/(\'\d+-\d+-\d+\')\s*([+<>-]=?)/', 'timestamp \1 \2', $res);
736
+    $res = preg_replace('/([+<>-]=?)\s*(\'\d+-\d+-\d+\')/', '\1 timestamp \2', $res);
737
+    $res = preg_replace('/(\'\d+-\d+-\d+\')\s*([+<>-]=?)/', 'timestamp \1 \2', $res);
738 738
 
739
-	$res = preg_replace('/(timestamp .\d+)-00-/', '\1-01-', $res);
740
-	$res = preg_replace('/(timestamp .\d+-\d+)-00/', '\1-01', $res);
739
+    $res = preg_replace('/(timestamp .\d+)-00-/', '\1-01-', $res);
740
+    $res = preg_replace('/(timestamp .\d+-\d+)-00/', '\1-01', $res);
741 741
 # correct en theorie mais produit des debordements arithmetiques
742 742
 #	$res = preg_replace("/(EXTRACT[(][^ ]* FROM *)(timestamp *'[^']*' *[+-] *timestamp *'[^']*') *[)]/", '\2', $res);
743
-	$res = preg_replace("/(EXTRACT[(][^ ]* FROM *)('[^']*')/", '\1 timestamp \2', $res);
744
-	$res = preg_replace("/\sLIKE\s+/", ' ILIKE ', $res);
743
+    $res = preg_replace("/(EXTRACT[(][^ ]* FROM *)('[^']*')/", '\1 timestamp \2', $res);
744
+    $res = preg_replace("/\sLIKE\s+/", ' ILIKE ', $res);
745 745
 
746
-	return str_replace('REGEXP', '~', $res);
746
+    return str_replace('REGEXP', '~', $res);
747 747
 }
748 748
 
749 749
 // http://code.spip.net/@spip_pg_fromfield
750 750
 function spip_pg_fromfield($arg) {
751
-	while (preg_match('/^(.*?)FIELD\s*\(([^,]*)((,[^,)]*)*)\)/', $arg, $m)) {
752
-
753
-		preg_match_all('/,([^,]*)/', $m[3], $r, PREG_PATTERN_ORDER);
754
-		$res = '';
755
-		$n = 0;
756
-		$index = $m[2];
757
-		foreach ($r[1] as $v) {
758
-			$n++;
759
-			$res .= "\nwhen $index=$v then $n";
760
-		}
761
-		$arg = $m[1] . "case $res else 0 end "
762
-			. substr($arg, strlen($m[0]));
763
-	}
764
-
765
-	return $arg;
751
+    while (preg_match('/^(.*?)FIELD\s*\(([^,]*)((,[^,)]*)*)\)/', $arg, $m)) {
752
+
753
+        preg_match_all('/,([^,]*)/', $m[3], $r, PREG_PATTERN_ORDER);
754
+        $res = '';
755
+        $n = 0;
756
+        $index = $m[2];
757
+        foreach ($r[1] as $v) {
758
+            $n++;
759
+            $res .= "\nwhen $index=$v then $n";
760
+        }
761
+        $arg = $m[1] . "case $res else 0 end "
762
+            . substr($arg, strlen($m[0]));
763
+    }
764
+
765
+    return $arg;
766 766
 }
767 767
 
768 768
 // http://code.spip.net/@calculer_pg_where
769 769
 function calculer_pg_where($v) {
770
-	if (!is_array($v)) {
771
-		return spip_pg_frommysql($v);
772
-	}
773
-
774
-	$op = str_replace('REGEXP', '~', array_shift($v));
775
-	if (!($n = count($v))) {
776
-		return $op;
777
-	} else {
778
-		$arg = calculer_pg_where(array_shift($v));
779
-		if ($n == 1) {
780
-			return "$op($arg)";
781
-		} else {
782
-			$arg2 = calculer_pg_where(array_shift($v));
783
-			if ($n == 2) {
784
-				return "($arg $op $arg2)";
785
-			} else {
786
-				return "($arg $op ($arg2) : $v[0])";
787
-			}
788
-		}
789
-	}
770
+    if (!is_array($v)) {
771
+        return spip_pg_frommysql($v);
772
+    }
773
+
774
+    $op = str_replace('REGEXP', '~', array_shift($v));
775
+    if (!($n = count($v))) {
776
+        return $op;
777
+    } else {
778
+        $arg = calculer_pg_where(array_shift($v));
779
+        if ($n == 1) {
780
+            return "$op($arg)";
781
+        } else {
782
+            $arg2 = calculer_pg_where(array_shift($v));
783
+            if ($n == 2) {
784
+                return "($arg $op $arg2)";
785
+            } else {
786
+                return "($arg $op ($arg2) : $v[0])";
787
+            }
788
+        }
789
+    }
790 790
 }
791 791
 
792 792
 
793 793
 // http://code.spip.net/@calculer_pg_expression
794 794
 function calculer_pg_expression($expression, $v, $join = 'AND') {
795
-	if (empty($v)) {
796
-		return '';
797
-	}
795
+    if (empty($v)) {
796
+        return '';
797
+    }
798 798
 
799
-	$exp = "\n$expression ";
799
+    $exp = "\n$expression ";
800 800
 
801
-	if (!is_array($v)) {
802
-		$v = array($v);
803
-	}
801
+    if (!is_array($v)) {
802
+        $v = array($v);
803
+    }
804 804
 
805
-	if (strtoupper($join) === 'AND') {
806
-		return $exp . join("\n\t$join ", array_map('calculer_pg_where', $v));
807
-	} else {
808
-		return $exp . join($join, $v);
809
-	}
805
+    if (strtoupper($join) === 'AND') {
806
+        return $exp . join("\n\t$join ", array_map('calculer_pg_where', $v));
807
+    } else {
808
+        return $exp . join($join, $v);
809
+    }
810 810
 }
811 811
 
812 812
 // http://code.spip.net/@spip_pg_select_as
813 813
 function spip_pg_select_as($args) {
814
-	$argsas = "";
815
-	foreach ($args as $k => $v) {
816
-		if (substr($k, -1) == '@') {
817
-			// c'est une jointure qui se refere au from precedent
818
-			// pas de virgule
819
-			$argsas .= '  ' . $v;
820
-		} else {
821
-			$as = '';
822
-			//  spip_log("$k : $v", _LOG_DEBUG);
823
-			if (!is_numeric($k)) {
824
-				if (preg_match('/\.(.*)$/', $k, $r)) {
825
-					$v = $k;
826
-				} elseif ($v != $k) {
827
-					$p = strpos($v, " ");
828
-					if ($p) {
829
-						$v = substr($v, 0, $p) . " AS $k" . substr($v, $p);
830
-					} else {
831
-						$as = " AS $k";
832
-					}
833
-				}
834
-			}
835
-			// spip_log("subs $k : $v avec $as", _LOG_DEBUG);
836
-			// if (strpos($v, 'JOIN') === false)  $argsas .= ', ';
837
-			$argsas .= ', ' . $v . $as;
838
-		}
839
-	}
840
-
841
-	return substr($argsas, 2);
814
+    $argsas = "";
815
+    foreach ($args as $k => $v) {
816
+        if (substr($k, -1) == '@') {
817
+            // c'est une jointure qui se refere au from precedent
818
+            // pas de virgule
819
+            $argsas .= '  ' . $v;
820
+        } else {
821
+            $as = '';
822
+            //  spip_log("$k : $v", _LOG_DEBUG);
823
+            if (!is_numeric($k)) {
824
+                if (preg_match('/\.(.*)$/', $k, $r)) {
825
+                    $v = $k;
826
+                } elseif ($v != $k) {
827
+                    $p = strpos($v, " ");
828
+                    if ($p) {
829
+                        $v = substr($v, 0, $p) . " AS $k" . substr($v, $p);
830
+                    } else {
831
+                        $as = " AS $k";
832
+                    }
833
+                }
834
+            }
835
+            // spip_log("subs $k : $v avec $as", _LOG_DEBUG);
836
+            // if (strpos($v, 'JOIN') === false)  $argsas .= ', ';
837
+            $argsas .= ', ' . $v . $as;
838
+        }
839
+    }
840
+
841
+    return substr($argsas, 2);
842 842
 }
843 843
 
844 844
 // http://code.spip.net/@spip_pg_fetch
845 845
 function spip_pg_fetch($res, $t = '', $serveur = '', $requeter = true) {
846 846
 
847
-	if ($res) {
848
-		$res = pg_fetch_array($res, null, PGSQL_ASSOC);
849
-	}
847
+    if ($res) {
848
+        $res = pg_fetch_array($res, null, PGSQL_ASSOC);
849
+    }
850 850
 
851
-	return $res;
851
+    return $res;
852 852
 }
853 853
 
854 854
 function spip_pg_seek($r, $row_number, $serveur = '', $requeter = true) {
855
-	if ($r) {
856
-		return pg_result_seek($r, $row_number);
857
-	}
855
+    if ($r) {
856
+        return pg_result_seek($r, $row_number);
857
+    }
858 858
 }
859 859
 
860 860
 
861 861
 // http://code.spip.net/@spip_pg_countsel
862 862
 function spip_pg_countsel(
863
-	$from = array(),
864
-	$where = array(),
865
-	$groupby = array(),
866
-	$having = array(),
867
-	$serveur = '',
868
-	$requeter = true
863
+    $from = array(),
864
+    $where = array(),
865
+    $groupby = array(),
866
+    $having = array(),
867
+    $serveur = '',
868
+    $requeter = true
869 869
 ) {
870
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
871
-	$r = spip_pg_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
872
-	if (!$requeter) {
873
-		return $r;
874
-	}
875
-	if (!is_resource($r)) {
876
-		return 0;
877
-	}
878
-	list($c) = pg_fetch_array($r, null, PGSQL_NUM);
879
-
880
-	return $c;
870
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
871
+    $r = spip_pg_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
872
+    if (!$requeter) {
873
+        return $r;
874
+    }
875
+    if (!is_resource($r)) {
876
+        return 0;
877
+    }
878
+    list($c) = pg_fetch_array($r, null, PGSQL_NUM);
879
+
880
+    return $c;
881 881
 }
882 882
 
883 883
 // http://code.spip.net/@spip_pg_count
884 884
 function spip_pg_count($res, $serveur = '', $requeter = true) {
885
-	return !$res ? 0 : pg_numrows($res);
885
+    return !$res ? 0 : pg_numrows($res);
886 886
 }
887 887
 
888 888
 // http://code.spip.net/@spip_pg_free
889 889
 function spip_pg_free($res, $serveur = '', $requeter = true) {
890
-	// rien a faire en postgres
890
+    // rien a faire en postgres
891 891
 }
892 892
 
893 893
 // http://code.spip.net/@spip_pg_delete
894 894
 function spip_pg_delete($table, $where = '', $serveur = '', $requeter = true) {
895 895
 
896
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
897
-	$table = prefixer_table_spip($table, $connexion['prefixe']);
896
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
897
+    $table = prefixer_table_spip($table, $connexion['prefixe']);
898 898
 
899
-	$query = calculer_pg_expression('DELETE FROM', $table, ',')
900
-		. calculer_pg_expression('WHERE', $where, 'AND');
899
+    $query = calculer_pg_expression('DELETE FROM', $table, ',')
900
+        . calculer_pg_expression('WHERE', $where, 'AND');
901 901
 
902
-	// renvoyer la requete inerte si demandee
903
-	if (!$requeter) {
904
-		return $query;
905
-	}
902
+    // renvoyer la requete inerte si demandee
903
+    if (!$requeter) {
904
+        return $query;
905
+    }
906 906
 
907
-	$res = spip_pg_trace_query($query, $serveur);
908
-	if ($res) {
909
-		return pg_affected_rows($res);
910
-	} else {
911
-		return false;
912
-	}
907
+    $res = spip_pg_trace_query($query, $serveur);
908
+    if ($res) {
909
+        return pg_affected_rows($res);
910
+    } else {
911
+        return false;
912
+    }
913 913
 }
914 914
 
915 915
 // http://code.spip.net/@spip_pg_insert
916 916
 function spip_pg_insert($table, $champs, $valeurs, $desc = array(), $serveur = '', $requeter = true) {
917
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
918
-	$prefixe = $connexion['prefixe'];
919
-	$link = $connexion['link'];
920
-
921
-	if (!$desc) {
922
-		$desc = description_table($table, $serveur);
923
-	}
924
-	$seq = spip_pg_sequence($table, true);
925
-	// si pas de cle primaire dans l'insertion, renvoyer curval
926
-	if (!preg_match(",\b$seq\b,", $champs)) {
927
-		$seq = spip_pg_sequence($table);
928
-		$seq = prefixer_table_spip($seq, $prefixe);
929
-		$seq = "currval('$seq')";
930
-	}
931
-
932
-	$table = prefixer_table_spip($table, $prefixe);
933
-	$ret = !$seq ? '' : (" RETURNING $seq");
934
-	$ins = (strlen($champs) < 3)
935
-		? " DEFAULT VALUES"
936
-		: "$champs VALUES $valeurs";
937
-	$q = "INSERT INTO $table $ins $ret";
938
-	if (!$requeter) {
939
-		return $q;
940
-	}
941
-	$connexion['last'] = $q;
942
-	$r = spip_pg_query_simple($link, $q);
917
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
918
+    $prefixe = $connexion['prefixe'];
919
+    $link = $connexion['link'];
920
+
921
+    if (!$desc) {
922
+        $desc = description_table($table, $serveur);
923
+    }
924
+    $seq = spip_pg_sequence($table, true);
925
+    // si pas de cle primaire dans l'insertion, renvoyer curval
926
+    if (!preg_match(",\b$seq\b,", $champs)) {
927
+        $seq = spip_pg_sequence($table);
928
+        $seq = prefixer_table_spip($seq, $prefixe);
929
+        $seq = "currval('$seq')";
930
+    }
931
+
932
+    $table = prefixer_table_spip($table, $prefixe);
933
+    $ret = !$seq ? '' : (" RETURNING $seq");
934
+    $ins = (strlen($champs) < 3)
935
+        ? " DEFAULT VALUES"
936
+        : "$champs VALUES $valeurs";
937
+    $q = "INSERT INTO $table $ins $ret";
938
+    if (!$requeter) {
939
+        return $q;
940
+    }
941
+    $connexion['last'] = $q;
942
+    $r = spip_pg_query_simple($link, $q);
943 943
 #	spip_log($q,'pg.'._LOG_DEBUG);
944
-	if ($r) {
945
-		if (!$ret) {
946
-			return 0;
947
-		}
948
-		if ($r2 = pg_fetch_array($r, null, PGSQL_NUM)) {
949
-			return $r2[0];
950
-		}
951
-	}
952
-
953
-	return false;
944
+    if ($r) {
945
+        if (!$ret) {
946
+            return 0;
947
+        }
948
+        if ($r2 = pg_fetch_array($r, null, PGSQL_NUM)) {
949
+            return $r2[0];
950
+        }
951
+    }
952
+
953
+    return false;
954 954
 }
955 955
 
956 956
 // http://code.spip.net/@spip_pg_insertq
957 957
 function spip_pg_insertq($table, $couples = array(), $desc = array(), $serveur = '', $requeter = true) {
958 958
 
959
-	if (!$desc) {
960
-		$desc = description_table($table, $serveur);
961
-	}
962
-	if (!$desc) {
963
-		die("$table insertion sans description");
964
-	}
965
-	$fields = $desc['field'];
959
+    if (!$desc) {
960
+        $desc = description_table($table, $serveur);
961
+    }
962
+    if (!$desc) {
963
+        die("$table insertion sans description");
964
+    }
965
+    $fields = $desc['field'];
966 966
 
967
-	foreach ($couples as $champ => $val) {
968
-		$couples[$champ] = spip_pg_cite($val, $fields[$champ]);
969
-	}
967
+    foreach ($couples as $champ => $val) {
968
+        $couples[$champ] = spip_pg_cite($val, $fields[$champ]);
969
+    }
970 970
 
971
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
972
-	$couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
971
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
972
+    $couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
973 973
 
974
-	return spip_pg_insert($table, "(" . join(',', array_keys($couples)) . ")", "(" . join(',', $couples) . ")", $desc,
975
-		$serveur, $requeter);
974
+    return spip_pg_insert($table, "(" . join(',', array_keys($couples)) . ")", "(" . join(',', $couples) . ")", $desc,
975
+        $serveur, $requeter);
976 976
 }
977 977
 
978 978
 
979 979
 // http://code.spip.net/@spip_pg_insertq_multi
980 980
 function spip_pg_insertq_multi($table, $tab_couples = array(), $desc = array(), $serveur = '', $requeter = true) {
981 981
 
982
-	if (!$desc) {
983
-		$desc = description_table($table, $serveur);
984
-	}
985
-	if (!$desc) {
986
-		die("$table insertion sans description");
987
-	}
988
-	$fields = isset($desc['field']) ? $desc['field'] : array();
989
-
990
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
991
-	// une premiere fois pour ajouter maj dans les cles
992
-	$c = isset($tab_couples[0]) ? $tab_couples[0] : array();
993
-	$les_cles = spip_pg_ajouter_champs_timestamp($table, $c, $desc, $serveur);
994
-
995
-	$cles = "(" . join(',', array_keys($les_cles)) . ')';
996
-	$valeurs = array();
997
-	foreach ($tab_couples as $couples) {
998
-		foreach ($couples as $champ => $val) {
999
-			$couples[$champ] = spip_pg_cite($val, $fields[$champ]);
1000
-		}
1001
-		// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1002
-		$couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1003
-
1004
-		$valeurs[] = '(' . join(',', $couples) . ')';
1005
-	}
1006
-	$valeurs = implode(', ', $valeurs);
1007
-
1008
-	return spip_pg_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
982
+    if (!$desc) {
983
+        $desc = description_table($table, $serveur);
984
+    }
985
+    if (!$desc) {
986
+        die("$table insertion sans description");
987
+    }
988
+    $fields = isset($desc['field']) ? $desc['field'] : array();
989
+
990
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
991
+    // une premiere fois pour ajouter maj dans les cles
992
+    $c = isset($tab_couples[0]) ? $tab_couples[0] : array();
993
+    $les_cles = spip_pg_ajouter_champs_timestamp($table, $c, $desc, $serveur);
994
+
995
+    $cles = "(" . join(',', array_keys($les_cles)) . ')';
996
+    $valeurs = array();
997
+    foreach ($tab_couples as $couples) {
998
+        foreach ($couples as $champ => $val) {
999
+            $couples[$champ] = spip_pg_cite($val, $fields[$champ]);
1000
+        }
1001
+        // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1002
+        $couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1003
+
1004
+        $valeurs[] = '(' . join(',', $couples) . ')';
1005
+    }
1006
+    $valeurs = implode(', ', $valeurs);
1007
+
1008
+    return spip_pg_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1009 1009
 }
1010 1010
 
1011 1011
 
1012 1012
 // http://code.spip.net/@spip_pg_update
1013 1013
 function spip_pg_update($table, $couples, $where = '', $desc = '', $serveur = '', $requeter = true) {
1014 1014
 
1015
-	if (!$couples) {
1016
-		return;
1017
-	}
1018
-	$connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1019
-	$table = prefixer_table_spip($table, $connexion['prefixe']);
1015
+    if (!$couples) {
1016
+        return;
1017
+    }
1018
+    $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1019
+    $table = prefixer_table_spip($table, $connexion['prefixe']);
1020 1020
 
1021
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1022
-	$couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1021
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1022
+    $couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1023 1023
 
1024
-	$set = array();
1025
-	foreach ($couples as $champ => $val) {
1026
-		$set[] = $champ . '=' . $val;
1027
-	}
1024
+    $set = array();
1025
+    foreach ($couples as $champ => $val) {
1026
+        $set[] = $champ . '=' . $val;
1027
+    }
1028 1028
 
1029
-	$query = calculer_pg_expression('UPDATE', $table, ',')
1030
-		. calculer_pg_expression('SET', $set, ',')
1031
-		. calculer_pg_expression('WHERE', $where, 'AND');
1029
+    $query = calculer_pg_expression('UPDATE', $table, ',')
1030
+        . calculer_pg_expression('SET', $set, ',')
1031
+        . calculer_pg_expression('WHERE', $where, 'AND');
1032 1032
 
1033
-	// renvoyer la requete inerte si demandee
1034
-	if (!$requeter) {
1035
-		return $query;
1036
-	}
1033
+    // renvoyer la requete inerte si demandee
1034
+    if (!$requeter) {
1035
+        return $query;
1036
+    }
1037 1037
 
1038
-	return spip_pg_trace_query($query, $serveur);
1038
+    return spip_pg_trace_query($query, $serveur);
1039 1039
 }
1040 1040
 
1041 1041
 // idem, mais les valeurs sont des constantes a mettre entre apostrophes
1042 1042
 // sauf les expressions de date lorsqu'il s'agit de fonctions SQL (NOW etc)
1043 1043
 // http://code.spip.net/@spip_pg_updateq
1044 1044
 function spip_pg_updateq($table, $couples, $where = '', $desc = array(), $serveur = '', $requeter = true) {
1045
-	if (!$couples) {
1046
-		return;
1047
-	}
1048
-	if (!$desc) {
1049
-		$desc = description_table($table, $serveur);
1050
-	}
1051
-	$fields = $desc['field'];
1052
-	foreach ($couples as $k => $val) {
1053
-		$couples[$k] = spip_pg_cite($val, $fields[$k]);
1054
-	}
1055
-
1056
-	return spip_pg_update($table, $couples, $where, $desc, $serveur, $requeter);
1045
+    if (!$couples) {
1046
+        return;
1047
+    }
1048
+    if (!$desc) {
1049
+        $desc = description_table($table, $serveur);
1050
+    }
1051
+    $fields = $desc['field'];
1052
+    foreach ($couples as $k => $val) {
1053
+        $couples[$k] = spip_pg_cite($val, $fields[$k]);
1054
+    }
1055
+
1056
+    return spip_pg_update($table, $couples, $where, $desc, $serveur, $requeter);
1057 1057
 }
1058 1058
 
1059 1059
 
1060 1060
 // http://code.spip.net/@spip_pg_replace
1061 1061
 function spip_pg_replace($table, $values, $desc, $serveur = '', $requeter = true) {
1062
-	if (!$values) {
1063
-		spip_log("replace vide $table", 'pg.' . _LOG_AVERTISSEMENT);
1064
-
1065
-		return 0;
1066
-	}
1067
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1068
-	$prefixe = $connexion['prefixe'];
1069
-	$link = $connexion['link'];
1070
-
1071
-	if (!$desc) {
1072
-		$desc = description_table($table, $serveur);
1073
-	}
1074
-	if (!$desc) {
1075
-		die("$table insertion sans description");
1076
-	}
1077
-	$prim = $desc['key']['PRIMARY KEY'];
1078
-	$ids = preg_split('/,\s*/', $prim);
1079
-	$noprims = $prims = array();
1080
-	foreach ($values as $k => $v) {
1081
-		$values[$k] = $v = spip_pg_cite($v, $desc['field'][$k]);
1082
-
1083
-		if (!in_array($k, $ids)) {
1084
-			$noprims[$k] = "$k=$v";
1085
-		} else {
1086
-			$prims[$k] = "$k=$v";
1087
-		}
1088
-	}
1089
-
1090
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1091
-	$values = spip_pg_ajouter_champs_timestamp($table, $values, $desc, $serveur);
1092
-
1093
-	$where = join(' AND ', $prims);
1094
-	if (!$where) {
1095
-		return spip_pg_insert($table, "(" . join(',', array_keys($values)) . ")", "(" . join(',', $values) . ")", $desc,
1096
-			$serveur);
1097
-	}
1098
-	$couples = join(',', $noprims);
1099
-
1100
-	$seq = spip_pg_sequence($table);
1101
-	$table = prefixer_table_spip($table, $prefixe);
1102
-	$seq = prefixer_table_spip($seq, $prefixe);
1103
-
1104
-	$connexion['last'] = $q = "UPDATE $table SET $couples WHERE $where";
1105
-	if ($couples) {
1106
-		$couples = spip_pg_query_simple($link, $q);
1062
+    if (!$values) {
1063
+        spip_log("replace vide $table", 'pg.' . _LOG_AVERTISSEMENT);
1064
+
1065
+        return 0;
1066
+    }
1067
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1068
+    $prefixe = $connexion['prefixe'];
1069
+    $link = $connexion['link'];
1070
+
1071
+    if (!$desc) {
1072
+        $desc = description_table($table, $serveur);
1073
+    }
1074
+    if (!$desc) {
1075
+        die("$table insertion sans description");
1076
+    }
1077
+    $prim = $desc['key']['PRIMARY KEY'];
1078
+    $ids = preg_split('/,\s*/', $prim);
1079
+    $noprims = $prims = array();
1080
+    foreach ($values as $k => $v) {
1081
+        $values[$k] = $v = spip_pg_cite($v, $desc['field'][$k]);
1082
+
1083
+        if (!in_array($k, $ids)) {
1084
+            $noprims[$k] = "$k=$v";
1085
+        } else {
1086
+            $prims[$k] = "$k=$v";
1087
+        }
1088
+    }
1089
+
1090
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1091
+    $values = spip_pg_ajouter_champs_timestamp($table, $values, $desc, $serveur);
1092
+
1093
+    $where = join(' AND ', $prims);
1094
+    if (!$where) {
1095
+        return spip_pg_insert($table, "(" . join(',', array_keys($values)) . ")", "(" . join(',', $values) . ")", $desc,
1096
+            $serveur);
1097
+    }
1098
+    $couples = join(',', $noprims);
1099
+
1100
+    $seq = spip_pg_sequence($table);
1101
+    $table = prefixer_table_spip($table, $prefixe);
1102
+    $seq = prefixer_table_spip($seq, $prefixe);
1103
+
1104
+    $connexion['last'] = $q = "UPDATE $table SET $couples WHERE $where";
1105
+    if ($couples) {
1106
+        $couples = spip_pg_query_simple($link, $q);
1107 1107
 #	  spip_log($q,'pg.'._LOG_DEBUG);
1108
-		if (!$couples) {
1109
-			return false;
1110
-		}
1111
-		$couples = pg_affected_rows($couples);
1112
-	}
1113
-	if (!$couples) {
1114
-		$ret = !$seq ? '' :
1115
-			(" RETURNING nextval('$seq') < $prim");
1116
-		$connexion['last'] = $q = "INSERT INTO $table (" . join(',', array_keys($values)) . ') VALUES (' . join(',',
1117
-				$values) . ")$ret";
1118
-		$couples = spip_pg_query_simple($link, $q);
1119
-		if (!$couples) {
1120
-			return false;
1121
-		} elseif ($ret) {
1122
-			$r = pg_fetch_array($couples, null, PGSQL_NUM);
1123
-			if ($r[0]) {
1124
-				$connexion['last'] = $q = "SELECT setval('$seq', $prim) from $table";
1125
-				// Le code de SPIP met parfois la sequence a 0 (dans l'import)
1126
-				// MySQL n'en dit rien, on fait pareil pour PG
1127
-				$r = @pg_query($link, $q);
1128
-			}
1129
-		}
1130
-	}
1131
-
1132
-	return $couples;
1108
+        if (!$couples) {
1109
+            return false;
1110
+        }
1111
+        $couples = pg_affected_rows($couples);
1112
+    }
1113
+    if (!$couples) {
1114
+        $ret = !$seq ? '' :
1115
+            (" RETURNING nextval('$seq') < $prim");
1116
+        $connexion['last'] = $q = "INSERT INTO $table (" . join(',', array_keys($values)) . ') VALUES (' . join(',',
1117
+                $values) . ")$ret";
1118
+        $couples = spip_pg_query_simple($link, $q);
1119
+        if (!$couples) {
1120
+            return false;
1121
+        } elseif ($ret) {
1122
+            $r = pg_fetch_array($couples, null, PGSQL_NUM);
1123
+            if ($r[0]) {
1124
+                $connexion['last'] = $q = "SELECT setval('$seq', $prim) from $table";
1125
+                // Le code de SPIP met parfois la sequence a 0 (dans l'import)
1126
+                // MySQL n'en dit rien, on fait pareil pour PG
1127
+                $r = @pg_query($link, $q);
1128
+            }
1129
+        }
1130
+    }
1131
+
1132
+    return $couples;
1133 1133
 }
1134 1134
 
1135 1135
 
1136 1136
 // http://code.spip.net/@spip_pg_replace_multi
1137 1137
 function spip_pg_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', $requeter = true) {
1138
-	// boucler pour traiter chaque requete independemment
1139
-	foreach ($tab_couples as $couples) {
1140
-		$retour = spip_pg_replace($table, $couples, $desc, $serveur, $requeter);
1141
-	}
1138
+    // boucler pour traiter chaque requete independemment
1139
+    foreach ($tab_couples as $couples) {
1140
+        $retour = spip_pg_replace($table, $couples, $desc, $serveur, $requeter);
1141
+    }
1142 1142
 
1143
-	// renvoie le dernier id
1144
-	return $retour;
1143
+    // renvoie le dernier id
1144
+    return $retour;
1145 1145
 }
1146 1146
 
1147 1147
 
@@ -1151,19 +1151,19 @@  discard block
 block discarded – undo
1151 1151
 // http://code.spip.net/@spip_pg_sequence
1152 1152
 function spip_pg_sequence($table, $raw = false) {
1153 1153
 
1154
-	include_spip('base/serial');
1155
-	if (!isset($GLOBALS['tables_principales'][$table])) {
1156
-		return false;
1157
-	}
1158
-	$desc = $GLOBALS['tables_principales'][$table];
1159
-	$prim = @$desc['key']['PRIMARY KEY'];
1160
-	if (!preg_match('/^\w+$/', $prim)
1161
-		or strpos($desc['field'][$prim], 'int') === false
1162
-	) {
1163
-		return '';
1164
-	} else {
1165
-		return $raw ? $prim : $table . '_' . $prim . "_seq";
1166
-	}
1154
+    include_spip('base/serial');
1155
+    if (!isset($GLOBALS['tables_principales'][$table])) {
1156
+        return false;
1157
+    }
1158
+    $desc = $GLOBALS['tables_principales'][$table];
1159
+    $prim = @$desc['key']['PRIMARY KEY'];
1160
+    if (!preg_match('/^\w+$/', $prim)
1161
+        or strpos($desc['field'][$prim], 'int') === false
1162
+    ) {
1163
+        return '';
1164
+    } else {
1165
+        return $raw ? $prim : $table . '_' . $prim . "_seq";
1166
+    }
1167 1167
 }
1168 1168
 
1169 1169
 // Explicite les conversions de Mysql d'une valeur $v de type $t
@@ -1171,65 +1171,65 @@  discard block
 block discarded – undo
1171 1171
 
1172 1172
 // http://code.spip.net/@spip_pg_cite
1173 1173
 function spip_pg_cite($v, $t) {
1174
-	if (is_null($v)) {
1175
-		return 'NULL';
1176
-	} // null php se traduit en NULL SQL
1177
-
1178
-	if (sql_test_date($t)) {
1179
-		if ($v and (strpos("0123456789", $v[0]) === false)) {
1180
-			return spip_pg_frommysql($v);
1181
-		} else {
1182
-			if (strncmp($v, '0000', 4) == 0) {
1183
-				$v = "0001" . substr($v, 4);
1184
-			}
1185
-			if (strpos($v, "-00-00") === 4) {
1186
-				$v = substr($v, 0, 4) . "-01-01" . substr($v, 10);
1187
-			}
1188
-
1189
-			return "timestamp '$v'";
1190
-		}
1191
-	} elseif (!sql_test_int($t)) {
1192
-		return ("'" . pg_escape_string($v) . "'");
1193
-	} elseif (is_numeric($v) or (strpos($v, 'CAST(') === 0)) {
1194
-		return $v;
1195
-	} elseif ($v[0] == '0' and $v[1] !== 'x' and ctype_xdigit(substr($v, 1))) {
1196
-		return substr($v, 1);
1197
-	} else {
1198
-		spip_log("Warning: '$v'  n'est pas de type $t", 'pg.' . _LOG_AVERTISSEMENT);
1199
-
1200
-		return intval($v);
1201
-	}
1174
+    if (is_null($v)) {
1175
+        return 'NULL';
1176
+    } // null php se traduit en NULL SQL
1177
+
1178
+    if (sql_test_date($t)) {
1179
+        if ($v and (strpos("0123456789", $v[0]) === false)) {
1180
+            return spip_pg_frommysql($v);
1181
+        } else {
1182
+            if (strncmp($v, '0000', 4) == 0) {
1183
+                $v = "0001" . substr($v, 4);
1184
+            }
1185
+            if (strpos($v, "-00-00") === 4) {
1186
+                $v = substr($v, 0, 4) . "-01-01" . substr($v, 10);
1187
+            }
1188
+
1189
+            return "timestamp '$v'";
1190
+        }
1191
+    } elseif (!sql_test_int($t)) {
1192
+        return ("'" . pg_escape_string($v) . "'");
1193
+    } elseif (is_numeric($v) or (strpos($v, 'CAST(') === 0)) {
1194
+        return $v;
1195
+    } elseif ($v[0] == '0' and $v[1] !== 'x' and ctype_xdigit(substr($v, 1))) {
1196
+        return substr($v, 1);
1197
+    } else {
1198
+        spip_log("Warning: '$v'  n'est pas de type $t", 'pg.' . _LOG_AVERTISSEMENT);
1199
+
1200
+        return intval($v);
1201
+    }
1202 1202
 }
1203 1203
 
1204 1204
 // http://code.spip.net/@spip_pg_hex
1205 1205
 function spip_pg_hex($v) {
1206
-	return "CAST(x'" . $v . "' as bigint)";
1206
+    return "CAST(x'" . $v . "' as bigint)";
1207 1207
 }
1208 1208
 
1209 1209
 function spip_pg_quote($v, $type = '') {
1210
-	if (!is_array($v)) {
1211
-		return spip_pg_cite($v, $type);
1212
-	}
1213
-	// si c'est un tableau, le parcourir en propageant le type
1214
-	foreach ($v as $k => $r) {
1215
-		$v[$k] = spip_pg_quote($r, $type);
1216
-	}
1217
-
1218
-	return join(",", $v);
1210
+    if (!is_array($v)) {
1211
+        return spip_pg_cite($v, $type);
1212
+    }
1213
+    // si c'est un tableau, le parcourir en propageant le type
1214
+    foreach ($v as $k => $r) {
1215
+        $v[$k] = spip_pg_quote($r, $type);
1216
+    }
1217
+
1218
+    return join(",", $v);
1219 1219
 }
1220 1220
 
1221 1221
 function spip_pg_date_proche($champ, $interval, $unite) {
1222
-	return '('
1223
-	. $champ
1224
-	. (($interval <= 0) ? '>' : '<')
1225
-	. (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1226
-	. '('
1227
-	. sql_quote(date('Y-m-d H:i:s'))
1228
-	. ', INTERVAL '
1229
-	. (($interval > 0) ? $interval : (0 - $interval))
1230
-	. ' '
1231
-	. $unite
1232
-	. '))';
1222
+    return '('
1223
+    . $champ
1224
+    . (($interval <= 0) ? '>' : '<')
1225
+    . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1226
+    . '('
1227
+    . sql_quote(date('Y-m-d H:i:s'))
1228
+    . ', INTERVAL '
1229
+    . (($interval > 0) ? $interval : (0 - $interval))
1230
+    . ' '
1231
+    . $unite
1232
+    . '))';
1233 1233
 }
1234 1234
 
1235 1235
 // http://code.spip.net/@spip_pg_in
@@ -1237,69 +1237,69 @@  discard block
 block discarded – undo
1237 1237
 //
1238 1238
 // IN (...) souvent limite a 255  elements, d'ou cette fonction assistante
1239 1239
 //
1240
-	// s'il n'y a pas de valeur, eviter de produire un IN vide: PG rale.
1241
-	if (!$valeurs) {
1242
-		return $not ? '0=0' : '0=1';
1243
-	}
1244
-	if (strpos($valeurs, "CAST(x'") !== false) {
1245
-		return "($val=" . join("OR $val=", explode(',', $valeurs)) . ')';
1246
-	}
1247
-	$n = $i = 0;
1248
-	$in_sql = "";
1249
-	while ($n = strpos($valeurs, ',', $n + 1)) {
1250
-		if ((++$i) >= 255) {
1251
-			$in_sql .= "($val $not IN (" .
1252
-				substr($valeurs, 0, $n) .
1253
-				"))\n" .
1254
-				($not ? "AND\t" : "OR\t");
1255
-			$valeurs = substr($valeurs, $n + 1);
1256
-			$i = $n = 0;
1257
-		}
1258
-	}
1259
-	$in_sql .= "($val $not IN ($valeurs))";
1260
-
1261
-	return "($in_sql)";
1240
+    // s'il n'y a pas de valeur, eviter de produire un IN vide: PG rale.
1241
+    if (!$valeurs) {
1242
+        return $not ? '0=0' : '0=1';
1243
+    }
1244
+    if (strpos($valeurs, "CAST(x'") !== false) {
1245
+        return "($val=" . join("OR $val=", explode(',', $valeurs)) . ')';
1246
+    }
1247
+    $n = $i = 0;
1248
+    $in_sql = "";
1249
+    while ($n = strpos($valeurs, ',', $n + 1)) {
1250
+        if ((++$i) >= 255) {
1251
+            $in_sql .= "($val $not IN (" .
1252
+                substr($valeurs, 0, $n) .
1253
+                "))\n" .
1254
+                ($not ? "AND\t" : "OR\t");
1255
+            $valeurs = substr($valeurs, $n + 1);
1256
+            $i = $n = 0;
1257
+        }
1258
+    }
1259
+    $in_sql .= "($val $not IN ($valeurs))";
1260
+
1261
+    return "($in_sql)";
1262 1262
 }
1263 1263
 
1264 1264
 // http://code.spip.net/@spip_pg_error
1265 1265
 function spip_pg_error($query = '', $serveur = '', $requeter = true) {
1266
-	$link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1267
-	$s = $link ? pg_last_error($link) : pg_last_error();
1268
-	if ($s) {
1269
-		$s = str_replace('ERROR', 'errcode: 1000 ', $s);
1270
-		spip_log("$s - $query", 'pg.' . _LOG_ERREUR);
1271
-	}
1272
-
1273
-	return $s;
1266
+    $link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1267
+    $s = $link ? pg_last_error($link) : pg_last_error();
1268
+    if ($s) {
1269
+        $s = str_replace('ERROR', 'errcode: 1000 ', $s);
1270
+        spip_log("$s - $query", 'pg.' . _LOG_ERREUR);
1271
+    }
1272
+
1273
+    return $s;
1274 1274
 }
1275 1275
 
1276 1276
 // http://code.spip.net/@spip_pg_errno
1277 1277
 function spip_pg_errno($serveur = '') {
1278
-	// il faudrait avoir la derniere ressource retournee et utiliser
1279
-	// http://fr2.php.net/manual/fr/function.pg-result-error.php
1280
-	return 0;
1278
+    // il faudrait avoir la derniere ressource retournee et utiliser
1279
+    // http://fr2.php.net/manual/fr/function.pg-result-error.php
1280
+    return 0;
1281 1281
 }
1282 1282
 
1283 1283
 // http://code.spip.net/@spip_pg_drop_table
1284 1284
 function spip_pg_drop_table($table, $exist = '', $serveur = '', $requeter = true) {
1285
-	if ($exist) {
1286
-		$exist = " IF EXISTS";
1287
-	}
1288
-	if (spip_pg_query("DROP TABLE$exist $table", $serveur, $requeter)) {
1289
-		return true;
1290
-	} else {
1291
-		return false;
1292
-	}
1285
+    if ($exist) {
1286
+        $exist = " IF EXISTS";
1287
+    }
1288
+    if (spip_pg_query("DROP TABLE$exist $table", $serveur, $requeter)) {
1289
+        return true;
1290
+    } else {
1291
+        return false;
1292
+    }
1293 1293
 }
1294 1294
 
1295 1295
 // supprime une vue 
1296 1296
 // http://code.spip.net/@spip_pg_drop_view
1297 1297
 function spip_pg_drop_view($view, $exist = '', $serveur = '', $requeter = true) {
1298
-	if ($exist) {
1299
-		$exist = " IF EXISTS";
1300
-	}
1298
+    if ($exist) {
1299
+        $exist = " IF EXISTS";
1300
+    }
1301 1301
 
1302
-	return spip_pg_query("DROP VIEW$exist $view", $serveur, $requeter);
1302
+    return spip_pg_query("DROP VIEW$exist $view", $serveur, $requeter);
1303 1303
 }
1304 1304
 
1305 1305
 /**
@@ -1316,41 +1316,41 @@  discard block
 block discarded – undo
1316 1316
  *     Ressource à utiliser avec sql_fetch()
1317 1317
  **/
1318 1318
 function spip_pg_showbase($match, $serveur = '', $requeter = true) {
1319
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1320
-	$link = $connexion['link'];
1321
-	$connexion['last'] = $q = "SELECT tablename FROM pg_tables WHERE tablename ILIKE " . _q($match);
1319
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1320
+    $link = $connexion['link'];
1321
+    $connexion['last'] = $q = "SELECT tablename FROM pg_tables WHERE tablename ILIKE " . _q($match);
1322 1322
 
1323
-	return spip_pg_query_simple($link, $q);
1323
+    return spip_pg_query_simple($link, $q);
1324 1324
 }
1325 1325
 
1326 1326
 // http://code.spip.net/@spip_pg_showtable
1327 1327
 function spip_pg_showtable($nom_table, $serveur = '', $requeter = true) {
1328
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1329
-	$link = $connexion['link'];
1330
-	$connexion['last'] = $q = "SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE " . _q($nom_table);
1331
-
1332
-	$res = spip_pg_query_simple($link, $q);
1333
-	if (!$res) {
1334
-		return false;
1335
-	}
1336
-
1337
-	// etrangement, $res peut ne rien contenir, mais arriver ici...
1338
-	// il faut en tenir compte dans le return
1339
-	$fields = array();
1340
-	while ($field = pg_fetch_array($res, null, PGSQL_NUM)) {
1341
-		$fields[$field[0]] = $field[2] . (!$field[1] ? '' : (" DEFAULT " . $field[1]));
1342
-	}
1343
-	$connexion['last'] = $q = "SELECT indexdef FROM pg_indexes WHERE tablename ILIKE " . _q($nom_table);
1344
-	$res = spip_pg_query_simple($link, $q);
1345
-	$keys = array();
1346
-	while ($index = pg_fetch_array($res, null, PGSQL_NUM)) {
1347
-		if (preg_match('/CREATE\s+(UNIQUE\s+)?INDEX\s([^\s]+).*\((.*)\)$/', $index[0], $r)) {
1348
-			$nom = str_replace($nom_table . '_', '', $r[2]);
1349
-			$keys[($r[1] ? "PRIMARY KEY" : ("KEY " . $nom))] = $r[3];
1350
-		}
1351
-	}
1352
-
1353
-	return count($fields) ? array('field' => $fields, 'key' => $keys) : false;
1328
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1329
+    $link = $connexion['link'];
1330
+    $connexion['last'] = $q = "SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE " . _q($nom_table);
1331
+
1332
+    $res = spip_pg_query_simple($link, $q);
1333
+    if (!$res) {
1334
+        return false;
1335
+    }
1336
+
1337
+    // etrangement, $res peut ne rien contenir, mais arriver ici...
1338
+    // il faut en tenir compte dans le return
1339
+    $fields = array();
1340
+    while ($field = pg_fetch_array($res, null, PGSQL_NUM)) {
1341
+        $fields[$field[0]] = $field[2] . (!$field[1] ? '' : (" DEFAULT " . $field[1]));
1342
+    }
1343
+    $connexion['last'] = $q = "SELECT indexdef FROM pg_indexes WHERE tablename ILIKE " . _q($nom_table);
1344
+    $res = spip_pg_query_simple($link, $q);
1345
+    $keys = array();
1346
+    while ($index = pg_fetch_array($res, null, PGSQL_NUM)) {
1347
+        if (preg_match('/CREATE\s+(UNIQUE\s+)?INDEX\s([^\s]+).*\((.*)\)$/', $index[0], $r)) {
1348
+            $nom = str_replace($nom_table . '_', '', $r[2]);
1349
+            $keys[($r[1] ? "PRIMARY KEY" : ("KEY " . $nom))] = $r[3];
1350
+        }
1351
+    }
1352
+
1353
+    return count($fields) ? array('field' => $fields, 'key' => $keys) : false;
1354 1354
 }
1355 1355
 
1356 1356
 // Fonction de creation d'une table SQL nommee $nom
@@ -1362,118 +1362,118 @@  discard block
 block discarded – undo
1362 1362
 // http://code.spip.net/@spip_pg_create
1363 1363
 function spip_pg_create($nom, $champs, $cles, $autoinc = false, $temporary = false, $serveur = '', $requeter = true) {
1364 1364
 
1365
-	$connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1366
-	$link = $connexion['link'];
1367
-	$nom = prefixer_table_spip($nom, $connexion['prefixe']);
1368
-
1369
-	$query = $prim = $prim_name = $v = $s = $p = '';
1370
-	$keys = array();
1371
-
1372
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
1373
-	// sans les renseigner (laisse le compilo recuperer la description)
1374
-	if (!is_array($champs) || !is_array($cles)) {
1375
-		return;
1376
-	}
1377
-
1378
-	foreach ($cles as $k => $v) {
1379
-		if (strpos($k, "KEY ") === 0) {
1380
-			$n = str_replace('`', '', $k);
1381
-			$v = str_replace('`', '"', $v);
1382
-			$i = $nom . preg_replace("/KEY +/", '_', $n);
1383
-			if ($k != $n) {
1384
-				$i = "\"$i\"";
1385
-			}
1386
-			$keys[] = "CREATE INDEX $i ON $nom ($v);";
1387
-		} elseif (strpos($k, "UNIQUE ") === 0) {
1388
-			$k = preg_replace("/^UNIQUE +/", '', $k);
1389
-			$prim .= "$s\n\t\tCONSTRAINT " . str_replace('`', '"', $k) . " UNIQUE ($v)";
1390
-		} else {
1391
-			$prim .= "$s\n\t\t" . str_replace('`', '"', $k) . " ($v)";
1392
-		}
1393
-		if ($k == "PRIMARY KEY") {
1394
-			$prim_name = $v;
1395
-		}
1396
-		$s = ",";
1397
-	}
1398
-	$s = '';
1399
-
1400
-	$character_set = "";
1401
-	if (@$GLOBALS['meta']['charset_sql_base']) {
1402
-		$character_set .= " CHARACTER SET " . $GLOBALS['meta']['charset_sql_base'];
1403
-	}
1404
-	if (@$GLOBALS['meta']['charset_collation_sql_base']) {
1405
-		$character_set .= " COLLATE " . $GLOBALS['meta']['charset_collation_sql_base'];
1406
-	}
1407
-
1408
-	foreach ($champs as $k => $v) {
1409
-		$k = str_replace('`', '"', $k);
1410
-		if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
1411
-			if (preg_match(',(char|text),i', $defs[1]) and !preg_match(',binary,i', $defs[1])) {
1412
-				$v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
1413
-			}
1414
-		}
1415
-
1416
-		$query .= "$s\n\t\t$k "
1417
-			. (($autoinc && ($prim_name == $k) && preg_match(',\b(big|small|medium|tiny)?int\b,i', $v))
1418
-				? " bigserial"
1419
-				: mysql2pg_type($v)
1420
-			);
1421
-		$s = ",";
1422
-	}
1423
-	$temporary = $temporary ? 'TEMPORARY' : '';
1424
-
1425
-	// En l'absence de "if not exists" en PG, on neutralise les erreurs
1426
-
1427
-	$q = "CREATE $temporary TABLE $nom ($query" . ($prim ? ",$prim" : '') . ")" .
1428
-		($character_set ? " DEFAULT $character_set" : "")
1429
-		. "\n";
1430
-
1431
-	if (!$requeter) {
1432
-		return $q;
1433
-	}
1434
-	$connexion['last'] = $q;
1435
-	$r = @pg_query($link, $q);
1436
-
1437
-	if (!$r) {
1438
-		spip_log("Impossible de creer cette table: $q", 'pg.' . _LOG_ERREUR);
1439
-	} else {
1440
-		foreach ($keys as $index) {
1441
-			pg_query($link, $index);
1442
-		}
1443
-	}
1444
-
1445
-	return $r;
1365
+    $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1366
+    $link = $connexion['link'];
1367
+    $nom = prefixer_table_spip($nom, $connexion['prefixe']);
1368
+
1369
+    $query = $prim = $prim_name = $v = $s = $p = '';
1370
+    $keys = array();
1371
+
1372
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
1373
+    // sans les renseigner (laisse le compilo recuperer la description)
1374
+    if (!is_array($champs) || !is_array($cles)) {
1375
+        return;
1376
+    }
1377
+
1378
+    foreach ($cles as $k => $v) {
1379
+        if (strpos($k, "KEY ") === 0) {
1380
+            $n = str_replace('`', '', $k);
1381
+            $v = str_replace('`', '"', $v);
1382
+            $i = $nom . preg_replace("/KEY +/", '_', $n);
1383
+            if ($k != $n) {
1384
+                $i = "\"$i\"";
1385
+            }
1386
+            $keys[] = "CREATE INDEX $i ON $nom ($v);";
1387
+        } elseif (strpos($k, "UNIQUE ") === 0) {
1388
+            $k = preg_replace("/^UNIQUE +/", '', $k);
1389
+            $prim .= "$s\n\t\tCONSTRAINT " . str_replace('`', '"', $k) . " UNIQUE ($v)";
1390
+        } else {
1391
+            $prim .= "$s\n\t\t" . str_replace('`', '"', $k) . " ($v)";
1392
+        }
1393
+        if ($k == "PRIMARY KEY") {
1394
+            $prim_name = $v;
1395
+        }
1396
+        $s = ",";
1397
+    }
1398
+    $s = '';
1399
+
1400
+    $character_set = "";
1401
+    if (@$GLOBALS['meta']['charset_sql_base']) {
1402
+        $character_set .= " CHARACTER SET " . $GLOBALS['meta']['charset_sql_base'];
1403
+    }
1404
+    if (@$GLOBALS['meta']['charset_collation_sql_base']) {
1405
+        $character_set .= " COLLATE " . $GLOBALS['meta']['charset_collation_sql_base'];
1406
+    }
1407
+
1408
+    foreach ($champs as $k => $v) {
1409
+        $k = str_replace('`', '"', $k);
1410
+        if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
1411
+            if (preg_match(',(char|text),i', $defs[1]) and !preg_match(',binary,i', $defs[1])) {
1412
+                $v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
1413
+            }
1414
+        }
1415
+
1416
+        $query .= "$s\n\t\t$k "
1417
+            . (($autoinc && ($prim_name == $k) && preg_match(',\b(big|small|medium|tiny)?int\b,i', $v))
1418
+                ? " bigserial"
1419
+                : mysql2pg_type($v)
1420
+            );
1421
+        $s = ",";
1422
+    }
1423
+    $temporary = $temporary ? 'TEMPORARY' : '';
1424
+
1425
+    // En l'absence de "if not exists" en PG, on neutralise les erreurs
1426
+
1427
+    $q = "CREATE $temporary TABLE $nom ($query" . ($prim ? ",$prim" : '') . ")" .
1428
+        ($character_set ? " DEFAULT $character_set" : "")
1429
+        . "\n";
1430
+
1431
+    if (!$requeter) {
1432
+        return $q;
1433
+    }
1434
+    $connexion['last'] = $q;
1435
+    $r = @pg_query($link, $q);
1436
+
1437
+    if (!$r) {
1438
+        spip_log("Impossible de creer cette table: $q", 'pg.' . _LOG_ERREUR);
1439
+    } else {
1440
+        foreach ($keys as $index) {
1441
+            pg_query($link, $index);
1442
+        }
1443
+    }
1444
+
1445
+    return $r;
1446 1446
 }
1447 1447
 
1448 1448
 
1449 1449
 function spip_pg_create_base($nom, $serveur = '', $requeter = true) {
1450
-	return spip_pg_query("CREATE DATABASE $nom", $serveur, $requeter);
1450
+    return spip_pg_query("CREATE DATABASE $nom", $serveur, $requeter);
1451 1451
 }
1452 1452
 
1453 1453
 // Fonction de creation d'une vue SQL nommee $nom
1454 1454
 // http://code.spip.net/@spip_pg_create_view
1455 1455
 function spip_pg_create_view($nom, $query_select, $serveur = '', $requeter = true) {
1456
-	if (!$query_select) {
1457
-		return false;
1458
-	}
1459
-	// vue deja presente
1460
-	if (sql_showtable($nom, false, $serveur)) {
1461
-		if ($requeter) {
1462
-			spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", 'pg.' . _LOG_ERREUR);
1463
-		}
1456
+    if (!$query_select) {
1457
+        return false;
1458
+    }
1459
+    // vue deja presente
1460
+    if (sql_showtable($nom, false, $serveur)) {
1461
+        if ($requeter) {
1462
+            spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", 'pg.' . _LOG_ERREUR);
1463
+        }
1464 1464
 
1465
-		return false;
1466
-	}
1465
+        return false;
1466
+    }
1467 1467
 
1468
-	$query = "CREATE VIEW $nom AS " . $query_select;
1468
+    $query = "CREATE VIEW $nom AS " . $query_select;
1469 1469
 
1470
-	return spip_pg_query($query, $serveur, $requeter);
1470
+    return spip_pg_query($query, $serveur, $requeter);
1471 1471
 }
1472 1472
 
1473 1473
 
1474 1474
 // http://code.spip.net/@spip_pg_set_connect_charset
1475 1475
 function spip_pg_set_connect_charset($charset, $serveur = '', $requeter = true) {
1476
-	spip_log("changement de charset sql a ecrire en PG", 'pg.' . _LOG_ERREUR);
1476
+    spip_log("changement de charset sql a ecrire en PG", 'pg.' . _LOG_ERREUR);
1477 1477
 }
1478 1478
 
1479 1479
 
@@ -1487,7 +1487,7 @@  discard block
 block discarded – undo
1487 1487
  **/
1488 1488
 // http://code.spip.net/@spip_sqlite_optimize
1489 1489
 function spip_pg_optimize($table, $serveur = '', $requeter = true) {
1490
-	return spip_pg_query("VACUUM " . $table, $serveur, $requeter);
1490
+    return spip_pg_query("VACUUM " . $table, $serveur, $requeter);
1491 1491
 }
1492 1492
 
1493 1493
 // Selectionner la sous-chaine dans $objet
@@ -1495,13 +1495,13 @@  discard block
 block discarded – undo
1495 1495
 
1496 1496
 // http://code.spip.net/@spip_pg_multi
1497 1497
 function spip_pg_multi($objet, $lang) {
1498
-	$r = "regexp_replace("
1499
-		. $objet
1500
-		. ",'<multi>.*[[]"
1501
-		. $lang
1502
-		. "[]]([^[]*).*</multi>', E'\\\\1') AS multi";
1498
+    $r = "regexp_replace("
1499
+        . $objet
1500
+        . ",'<multi>.*[[]"
1501
+        . $lang
1502
+        . "[]]([^[]*).*</multi>', E'\\\\1') AS multi";
1503 1503
 
1504
-	return $r;
1504
+    return $r;
1505 1505
 }
1506 1506
 
1507 1507
 // Palanquee d'idiosyncrasies MySQL dans les creations de table
@@ -1509,31 +1509,31 @@  discard block
 block discarded – undo
1509 1509
 
1510 1510
 // http://code.spip.net/@mysql2pg_type
1511 1511
 function mysql2pg_type($v) {
1512
-	$remplace = array(
1513
-		'/auto_increment/i' => '', // non reconnu
1514
-		'/bigint/i' => 'bigint',
1515
-		'/mediumint/i' => 'mediumint',
1516
-		'/smallint/i' => 'smallint',
1517
-		"/tinyint/i" => 'int',
1518
-		'/int\s*[(]\s*\d+\s*[)]/i' => 'int',
1519
-		"/longtext/i" => 'text',
1520
-		"/mediumtext/i" => 'text',
1521
-		"/tinytext/i" => 'text',
1522
-		"/longblob/i" => 'text',
1523
-		"/0000-00-00/" => '0001-01-01',
1524
-		"/datetime/i" => 'timestamp',
1525
-		"/unsigned/i" => '',
1526
-		"/double/i" => 'double precision',
1527
-		'/VARCHAR\((\d+)\)\s+BINARY/i' => 'varchar(\1)',
1528
-		"/ENUM *[(][^)]*[)]/i" => "varchar(255)",
1529
-		'/(timestamp .* )ON .*$/is' => '\\1',
1530
-	);
1531
-
1532
-	return preg_replace(array_keys($remplace), array_values($remplace), $v);
1512
+    $remplace = array(
1513
+        '/auto_increment/i' => '', // non reconnu
1514
+        '/bigint/i' => 'bigint',
1515
+        '/mediumint/i' => 'mediumint',
1516
+        '/smallint/i' => 'smallint',
1517
+        "/tinyint/i" => 'int',
1518
+        '/int\s*[(]\s*\d+\s*[)]/i' => 'int',
1519
+        "/longtext/i" => 'text',
1520
+        "/mediumtext/i" => 'text',
1521
+        "/tinytext/i" => 'text',
1522
+        "/longblob/i" => 'text',
1523
+        "/0000-00-00/" => '0001-01-01',
1524
+        "/datetime/i" => 'timestamp',
1525
+        "/unsigned/i" => '',
1526
+        "/double/i" => 'double precision',
1527
+        '/VARCHAR\((\d+)\)\s+BINARY/i' => 'varchar(\1)',
1528
+        "/ENUM *[(][^)]*[)]/i" => "varchar(255)",
1529
+        '/(timestamp .* )ON .*$/is' => '\\1',
1530
+    );
1531
+
1532
+    return preg_replace(array_keys($remplace), array_values($remplace), $v);
1533 1533
 }
1534 1534
 
1535 1535
 // Renvoie false si on n'a pas les fonctions pg (pour l'install)
1536 1536
 // http://code.spip.net/@spip_versions_pg
1537 1537
 function spip_versions_pg() {
1538
-	return function_exists('pg_connect');
1538
+    return function_exists('pg_connect');
1539 1539
 }
Please login to merge, or discard this patch.
Spacing   +82 added lines, -83 removed lines patch added patch discarded remove patch
@@ -65,7 +65,7 @@  discard block
 block discarded – undo
65 65
 	if (!$link) {
66 66
 		$erreurs[] = pg_last_error();
67 67
 		foreach ($erreurs as $e) {
68
-			spip_log('Echec pg_connect. Erreur : ' . $e, 'pg.' . _LOG_HS);
68
+			spip_log('Echec pg_connect. Erreur : '.$e, 'pg.'._LOG_HS);
69 69
 		}
70 70
 
71 71
 		return false;
@@ -82,8 +82,8 @@  discard block
 block discarded – undo
82 82
 		);
83 83
 	}
84 84
 
85
-	spip_log("Connexion vers $host, base $db, prefixe $prefixe " . ($link ? 'operationnelle' : 'impossible'),
86
-		'pg.' . _LOG_DEBUG);
85
+	spip_log("Connexion vers $host, base $db, prefixe $prefixe ".($link ? 'operationnelle' : 'impossible'),
86
+		'pg.'._LOG_DEBUG);
87 87
 
88 88
 	return !$link ? false : array(
89 89
 		'db' => $db,
@@ -172,7 +172,7 @@  discard block
 block discarded – undo
172 172
 	} else {
173 173
 		$suite = '';
174 174
 	}
175
-	$query = preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', $query) . $suite;
175
+	$query = preg_replace('/([,\s])spip_/', '\1'.$prefixe.'_', $query).$suite;
176 176
 
177 177
 	// renvoyer la requete inerte si demandee
178 178
 	if (!$requeter) {
@@ -242,7 +242,7 @@  discard block
 block discarded – undo
242 242
 	// ou revoir l'api de sql_alter en creant un 
243 243
 	// sql_alter_table($table,array($actions));
244 244
 	if (!preg_match("/\s*((\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)) {
245
-		spip_log("$query mal comprise", 'pg.' . _LOG_ERREUR);
245
+		spip_log("$query mal comprise", 'pg.'._LOG_ERREUR);
246 246
 
247 247
 		return false;
248 248
 	}
@@ -255,7 +255,7 @@  discard block
 block discarded – undo
255 255
 	$i = 0;
256 256
 	$ouverte = false;
257 257
 	while ($do = array_shift($todo)) {
258
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . "," . $do : $do;
258
+		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i].",".$do : $do;
259 259
 		$o = (false !== strpos($do, "("));
260 260
 		$f = (false !== strpos($do, ")"));
261 261
 		if ($o and !$f) {
@@ -268,24 +268,24 @@  discard block
 block discarded – undo
268 268
 		}
269 269
 	}
270 270
 	$todo = $todo2;
271
-	$query = $debut . ' ' . array_shift($todo);
271
+	$query = $debut.' '.array_shift($todo);
272 272
 
273 273
 	if (!preg_match('/^\s*(IGNORE\s*)?TABLE\s+(\w+)\s+(ADD|DROP|CHANGE|MODIFY|RENAME)\s*(.*)$/is', $query, $r)) {
274
-		spip_log("$query incompris", 'pg.' . _LOG_ERREUR);
274
+		spip_log("$query incompris", 'pg.'._LOG_ERREUR);
275 275
 	} else {
276 276
 		if ($r[1]) {
277
-			spip_log("j'ignore IGNORE dans $query", 'pg.' . _LOG_AVERTISSEMENT);
277
+			spip_log("j'ignore IGNORE dans $query", 'pg.'._LOG_AVERTISSEMENT);
278 278
 		}
279
-		$f = 'spip_pg_alter_' . strtolower($r[3]);
279
+		$f = 'spip_pg_alter_'.strtolower($r[3]);
280 280
 		if (function_exists($f)) {
281 281
 			$f($r[2], $r[4], $serveur, $requeter);
282 282
 		} else {
283
-			spip_log("$query non prevu", 'pg.' . _LOG_ERREUR);
283
+			spip_log("$query non prevu", 'pg.'._LOG_ERREUR);
284 284
 		}
285 285
 	}
286 286
 	// Alter a plusieurs args. Faudrait optimiser.
287 287
 	if ($todo) {
288
-		spip_pg_alter("TABLE $table " . join(',', $todo));
288
+		spip_pg_alter("TABLE $table ".join(',', $todo));
289 289
 	}
290 290
 
291 291
 }
@@ -293,10 +293,10 @@  discard block
 block discarded – undo
293 293
 // http://code.spip.net/@spip_pg_alter_change
294 294
 function spip_pg_alter_change($table, $arg, $serveur = '', $requeter = true) {
295 295
 	if (!preg_match('/^`?(\w+)`?\s+`?(\w+)`?\s+(.*?)\s*(DEFAULT .*?)?(NOT\s+NULL)?\s*(DEFAULT .*?)?$/i', $arg, $r)) {
296
-		spip_log("alter change: $arg  incompris", 'pg.' . _LOG_ERREUR);
296
+		spip_log("alter change: $arg  incompris", 'pg.'._LOG_ERREUR);
297 297
 	} else {
298 298
 		list(, $old, $new, $type, $default, $null, $def2) = $r;
299
-		$actions = array("ALTER $old TYPE " . mysql2pg_type($type));
299
+		$actions = array("ALTER $old TYPE ".mysql2pg_type($type));
300 300
 		if ($null) {
301 301
 			$actions[] = "ALTER $old SET NOT NULL";
302 302
 		} else {
@@ -309,7 +309,7 @@  discard block
 block discarded – undo
309 309
 			$actions[] = "ALTER $old DROP DEFAULT";
310 310
 		}
311 311
 
312
-		spip_pg_query("ALTER TABLE $table " . join(', ', $actions));
312
+		spip_pg_query("ALTER TABLE $table ".join(', ', $actions));
313 313
 
314 314
 		if ($old != $new) {
315 315
 			spip_pg_query("ALTER TABLE $table RENAME $old TO $new", $serveur);
@@ -320,7 +320,7 @@  discard block
 block discarded – undo
320 320
 // http://code.spip.net/@spip_pg_alter_add
321 321
 function spip_pg_alter_add($table, $arg, $serveur = '', $requeter = true) {
322 322
 	if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*(.*)$/', $arg, $r)) {
323
-		spip_log("alter add $arg  incompris", 'pg.' . _LOG_ERREUR);
323
+		spip_log("alter add $arg  incompris", 'pg.'._LOG_ERREUR);
324 324
 
325 325
 		return null;
326 326
 	}
@@ -330,13 +330,13 @@  discard block
 block discarded – undo
330 330
 			$m[2] = $n[1];
331 331
 		}
332 332
 
333
-		return spip_pg_query("ALTER TABLE $table ADD " . $m[1] . ' ' . mysql2pg_type($m[2]), $serveur, $requeter);
333
+		return spip_pg_query("ALTER TABLE $table ADD ".$m[1].' '.mysql2pg_type($m[2]), $serveur, $requeter);
334 334
 	} elseif ($r[1][0] == 'P') {
335 335
 		// la primary peut etre sur plusieurs champs
336 336
 		$r[2] = trim(str_replace('`', '', $r[2]));
337 337
 		$m = ($r[2][0] == '(') ? substr($r[2], 1, -1) : $r[2];
338 338
 
339
-		return spip_pg_query("ALTER TABLE $table ADD CONSTRAINT $table" . '_pkey PRIMARY KEY (' . $m . ')', $serveur,
339
+		return spip_pg_query("ALTER TABLE $table ADD CONSTRAINT $table".'_pkey PRIMARY KEY ('.$m.')', $serveur,
340 340
 			$requeter);
341 341
 	} else {
342 342
 		preg_match('/([^\s,]*)\s*(.*)?/', $r[2], $m);
@@ -353,7 +353,7 @@  discard block
 block discarded – undo
353 353
 				$colonnes = substr($m[1], 1, -1);
354 354
 				if (false !== strpos(",", $colonnes)) {
355 355
 					spip_log("PG : Erreur, impossible de creer un index sur plusieurs colonnes"
356
-						. " sans qu'il ait de nom ($table, ($colonnes))", 'pg.' . _LOG_ERREUR);
356
+						. " sans qu'il ait de nom ($table, ($colonnes))", 'pg.'._LOG_ERREUR);
357 357
 				} else {
358 358
 					$nom_index = $colonnes;
359 359
 				}
@@ -370,23 +370,23 @@  discard block
 block discarded – undo
370 370
 // http://code.spip.net/@spip_pg_alter_drop
371 371
 function spip_pg_alter_drop($table, $arg, $serveur = '', $requeter = true) {
372 372
 	if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*`?(\w*)`?/', $arg, $r)) {
373
-		spip_log("alter drop: $arg  incompris", 'pg.' . _LOG_ERREUR);
373
+		spip_log("alter drop: $arg  incompris", 'pg.'._LOG_ERREUR);
374 374
 	} else {
375 375
 		if (!$r[1] or $r[1] == 'COLUMN') {
376
-			return spip_pg_query("ALTER TABLE $table DROP " . $r[2], $serveur);
376
+			return spip_pg_query("ALTER TABLE $table DROP ".$r[2], $serveur);
377 377
 		} elseif ($r[1][0] == 'P') {
378
-			return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table" . '_pkey', $serveur);
378
+			return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table".'_pkey', $serveur);
379 379
 		} else {
380
-			return spip_pg_query("DROP INDEX " . $table . '_' . $r[2], $serveur);
380
+			return spip_pg_query("DROP INDEX ".$table.'_'.$r[2], $serveur);
381 381
 		}
382 382
 	}
383 383
 }
384 384
 
385 385
 function spip_pg_alter_modify($table, $arg, $serveur = '', $requeter = true) {
386 386
 	if (!preg_match('/^`?(\w+)`?\s+(.*)$/', $arg, $r)) {
387
-		spip_log("alter modify: $arg  incompris", 'pg.' . _LOG_ERREUR);
387
+		spip_log("alter modify: $arg  incompris", 'pg.'._LOG_ERREUR);
388 388
 	} else {
389
-		return spip_pg_alter_change($table, $r[1] . ' ' . $arg, $serveur = '', $requeter = true);
389
+		return spip_pg_alter_change($table, $r[1].' '.$arg, $serveur = '', $requeter = true);
390 390
 	}
391 391
 }
392 392
 
@@ -402,7 +402,7 @@  discard block
 block discarded – undo
402 402
 	} elseif (preg_match('/^(TO)\s*`?(\w*)`?/', $arg, $r)) {
403 403
 		$rename = $r[2];
404 404
 	} else {
405
-		spip_log("alter rename: $arg  incompris", 'pg.' . _LOG_ERREUR);
405
+		spip_log("alter rename: $arg  incompris", 'pg.'._LOG_ERREUR);
406 406
 	}
407 407
 
408 408
 	return $rename ? spip_pg_query("ALTER TABLE $table RENAME TO $rename") : false;
@@ -422,8 +422,8 @@  discard block
 block discarded – undo
422 422
  */
423 423
 function spip_pg_create_index($nom, $table, $champs, $serveur = '', $requeter = true) {
424 424
 	if (!($nom or $table or $champs)) {
425
-		spip_log("Champ manquant pour creer un index pg ($nom, $table, (" . @join(',', $champs) . "))",
426
-			'pg.' . _LOG_ERREUR);
425
+		spip_log("Champ manquant pour creer un index pg ($nom, $table, (".@join(',', $champs)."))",
426
+			'pg.'._LOG_ERREUR);
427 427
 
428 428
 		return false;
429 429
 	}
@@ -433,7 +433,7 @@  discard block
 block discarded – undo
433 433
 
434 434
 	// PG ne differentie pas noms des index en fonction des tables
435 435
 	// il faut donc creer des noms uniques d'index pour une base pg
436
-	$nom = $table . '_' . $nom;
436
+	$nom = $table.'_'.$nom;
437 437
 	// enlever d'eventuelles parentheses deja presentes sur champs
438 438
 	if (!is_array($champs)) {
439 439
 		if ($champs[0] == "(") {
@@ -441,7 +441,7 @@  discard block
 block discarded – undo
441 441
 		}
442 442
 		$champs = array($champs);
443 443
 	}
444
-	$query = "CREATE INDEX $nom ON $table (" . join(',', $champs) . ")";
444
+	$query = "CREATE INDEX $nom ON $table (".join(',', $champs).")";
445 445
 	if (!$requeter) {
446 446
 		return $query;
447 447
 	}
@@ -465,7 +465,7 @@  discard block
 block discarded – undo
465 465
 	} else {
466 466
 		$suite = '';
467 467
 	}
468
-	$query = 'EXPLAIN ' . preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', $query) . $suite;
468
+	$query = 'EXPLAIN '.preg_replace('/([,\s])spip_/', '\1'.$prefixe.'_', $query).$suite;
469 469
 
470 470
 	if (!$requeter) {
471 471
 		return $query;
@@ -560,14 +560,14 @@  discard block
 block discarded – undo
560 560
 		}
561 561
 	}
562 562
 	$from = spip_pg_from($from, $prefixe);
563
-	$query = "SELECT " . $select
563
+	$query = "SELECT ".$select
564 564
 		. (!$from ? '' : "\nFROM $from")
565
-		. (!$where ? '' : ("\nWHERE " . (!is_array($where) ? calculer_pg_where($where) : (join("\n\tAND ",
565
+		. (!$where ? '' : ("\nWHERE ".(!is_array($where) ? calculer_pg_where($where) : (join("\n\tAND ",
566 566
 				array_map('calculer_pg_where', $where))))))
567 567
 		. spip_pg_groupby($groupby, $from, $select)
568 568
 		. (!$having ? '' : "\nHAVING $having")
569 569
 		. ($orderby ? ("\nORDER BY $orderby") : '')
570
-		. (!$limit ? '' : (" LIMIT $count" . (!$offset ? '' : " OFFSET $offset")));
570
+		. (!$limit ? '' : (" LIMIT $count".(!$offset ? '' : " OFFSET $offset")));
571 571
 
572 572
 	// renvoyer la requete inerte si demandee
573 573
 	if ($requeter === false) {
@@ -576,7 +576,7 @@  discard block
 block discarded – undo
576 576
 
577 577
 	$r = spip_pg_trace_query($query, $serveur);
578 578
 
579
-	return $r ? $r : $query;;
579
+	return $r ? $r : $query; ;
580 580
 }
581 581
 
582 582
 // Le traitement des prefixes de table dans un Select se limite au FROM
@@ -588,7 +588,7 @@  discard block
 block discarded – undo
588 588
 		$from = spip_pg_select_as($from);
589 589
 	}
590 590
 
591
-	return !$prefixe ? $from : preg_replace('/(\b)spip_/', '\1' . $prefixe . '_', $from);
591
+	return !$prefixe ? $from : preg_replace('/(\b)spip_/', '\1'.$prefixe.'_', $from);
592 592
 }
593 593
 
594 594
 // http://code.spip.net/@spip_pg_orderby
@@ -597,7 +597,7 @@  discard block
 block discarded – undo
597 597
 	$arg = (is_array($order) ? $order : preg_split('/\s*,\s*/', $order));
598 598
 
599 599
 	foreach ($arg as $v) {
600
-		if (preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+' . $v . '/', $select, $m)) {
600
+		if (preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+'.$v.'/', $select, $m)) {
601 601
 
602 602
 			$res[] = $m[1];
603 603
 		} else {
@@ -758,7 +758,7 @@  discard block
 block discarded – undo
758 758
 			$n++;
759 759
 			$res .= "\nwhen $index=$v then $n";
760 760
 		}
761
-		$arg = $m[1] . "case $res else 0 end "
761
+		$arg = $m[1]."case $res else 0 end "
762 762
 			. substr($arg, strlen($m[0]));
763 763
 	}
764 764
 
@@ -803,9 +803,9 @@  discard block
 block discarded – undo
803 803
 	}
804 804
 
805 805
 	if (strtoupper($join) === 'AND') {
806
-		return $exp . join("\n\t$join ", array_map('calculer_pg_where', $v));
806
+		return $exp.join("\n\t$join ", array_map('calculer_pg_where', $v));
807 807
 	} else {
808
-		return $exp . join($join, $v);
808
+		return $exp.join($join, $v);
809 809
 	}
810 810
 }
811 811
 
@@ -816,7 +816,7 @@  discard block
 block discarded – undo
816 816
 		if (substr($k, -1) == '@') {
817 817
 			// c'est une jointure qui se refere au from precedent
818 818
 			// pas de virgule
819
-			$argsas .= '  ' . $v;
819
+			$argsas .= '  '.$v;
820 820
 		} else {
821 821
 			$as = '';
822 822
 			//  spip_log("$k : $v", _LOG_DEBUG);
@@ -826,7 +826,7 @@  discard block
 block discarded – undo
826 826
 				} elseif ($v != $k) {
827 827
 					$p = strpos($v, " ");
828 828
 					if ($p) {
829
-						$v = substr($v, 0, $p) . " AS $k" . substr($v, $p);
829
+						$v = substr($v, 0, $p)." AS $k".substr($v, $p);
830 830
 					} else {
831 831
 						$as = " AS $k";
832 832
 					}
@@ -834,7 +834,7 @@  discard block
 block discarded – undo
834 834
 			}
835 835
 			// spip_log("subs $k : $v avec $as", _LOG_DEBUG);
836 836
 			// if (strpos($v, 'JOIN') === false)  $argsas .= ', ';
837
-			$argsas .= ', ' . $v . $as;
837
+			$argsas .= ', '.$v.$as;
838 838
 		}
839 839
 	}
840 840
 
@@ -867,7 +867,7 @@  discard block
 block discarded – undo
867 867
 	$serveur = '',
868 868
 	$requeter = true
869 869
 ) {
870
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
870
+	$c = !$groupby ? '*' : ('DISTINCT '.(is_string($groupby) ? $groupby : join(',', $groupby)));
871 871
 	$r = spip_pg_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
872 872
 	if (!$requeter) {
873 873
 		return $r;
@@ -971,7 +971,7 @@  discard block
 block discarded – undo
971 971
 	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
972 972
 	$couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
973 973
 
974
-	return spip_pg_insert($table, "(" . join(',', array_keys($couples)) . ")", "(" . join(',', $couples) . ")", $desc,
974
+	return spip_pg_insert($table, "(".join(',', array_keys($couples)).")", "(".join(',', $couples).")", $desc,
975 975
 		$serveur, $requeter);
976 976
 }
977 977
 
@@ -992,7 +992,7 @@  discard block
 block discarded – undo
992 992
 	$c = isset($tab_couples[0]) ? $tab_couples[0] : array();
993 993
 	$les_cles = spip_pg_ajouter_champs_timestamp($table, $c, $desc, $serveur);
994 994
 
995
-	$cles = "(" . join(',', array_keys($les_cles)) . ')';
995
+	$cles = "(".join(',', array_keys($les_cles)).')';
996 996
 	$valeurs = array();
997 997
 	foreach ($tab_couples as $couples) {
998 998
 		foreach ($couples as $champ => $val) {
@@ -1001,7 +1001,7 @@  discard block
 block discarded – undo
1001 1001
 		// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1002 1002
 		$couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1003 1003
 
1004
-		$valeurs[] = '(' . join(',', $couples) . ')';
1004
+		$valeurs[] = '('.join(',', $couples).')';
1005 1005
 	}
1006 1006
 	$valeurs = implode(', ', $valeurs);
1007 1007
 
@@ -1023,7 +1023,7 @@  discard block
 block discarded – undo
1023 1023
 
1024 1024
 	$set = array();
1025 1025
 	foreach ($couples as $champ => $val) {
1026
-		$set[] = $champ . '=' . $val;
1026
+		$set[] = $champ.'='.$val;
1027 1027
 	}
1028 1028
 
1029 1029
 	$query = calculer_pg_expression('UPDATE', $table, ',')
@@ -1060,7 +1060,7 @@  discard block
 block discarded – undo
1060 1060
 // http://code.spip.net/@spip_pg_replace
1061 1061
 function spip_pg_replace($table, $values, $desc, $serveur = '', $requeter = true) {
1062 1062
 	if (!$values) {
1063
-		spip_log("replace vide $table", 'pg.' . _LOG_AVERTISSEMENT);
1063
+		spip_log("replace vide $table", 'pg.'._LOG_AVERTISSEMENT);
1064 1064
 
1065 1065
 		return 0;
1066 1066
 	}
@@ -1092,7 +1092,7 @@  discard block
 block discarded – undo
1092 1092
 
1093 1093
 	$where = join(' AND ', $prims);
1094 1094
 	if (!$where) {
1095
-		return spip_pg_insert($table, "(" . join(',', array_keys($values)) . ")", "(" . join(',', $values) . ")", $desc,
1095
+		return spip_pg_insert($table, "(".join(',', array_keys($values)).")", "(".join(',', $values).")", $desc,
1096 1096
 			$serveur);
1097 1097
 	}
1098 1098
 	$couples = join(',', $noprims);
@@ -1111,10 +1111,9 @@  discard block
 block discarded – undo
1111 1111
 		$couples = pg_affected_rows($couples);
1112 1112
 	}
1113 1113
 	if (!$couples) {
1114
-		$ret = !$seq ? '' :
1115
-			(" RETURNING nextval('$seq') < $prim");
1116
-		$connexion['last'] = $q = "INSERT INTO $table (" . join(',', array_keys($values)) . ') VALUES (' . join(',',
1117
-				$values) . ")$ret";
1114
+		$ret = !$seq ? '' : (" RETURNING nextval('$seq') < $prim");
1115
+		$connexion['last'] = $q = "INSERT INTO $table (".join(',', array_keys($values)).') VALUES ('.join(',',
1116
+				$values).")$ret";
1118 1117
 		$couples = spip_pg_query_simple($link, $q);
1119 1118
 		if (!$couples) {
1120 1119
 			return false;
@@ -1162,7 +1161,7 @@  discard block
 block discarded – undo
1162 1161
 	) {
1163 1162
 		return '';
1164 1163
 	} else {
1165
-		return $raw ? $prim : $table . '_' . $prim . "_seq";
1164
+		return $raw ? $prim : $table.'_'.$prim."_seq";
1166 1165
 	}
1167 1166
 }
1168 1167
 
@@ -1180,22 +1179,22 @@  discard block
 block discarded – undo
1180 1179
 			return spip_pg_frommysql($v);
1181 1180
 		} else {
1182 1181
 			if (strncmp($v, '0000', 4) == 0) {
1183
-				$v = "0001" . substr($v, 4);
1182
+				$v = "0001".substr($v, 4);
1184 1183
 			}
1185 1184
 			if (strpos($v, "-00-00") === 4) {
1186
-				$v = substr($v, 0, 4) . "-01-01" . substr($v, 10);
1185
+				$v = substr($v, 0, 4)."-01-01".substr($v, 10);
1187 1186
 			}
1188 1187
 
1189 1188
 			return "timestamp '$v'";
1190 1189
 		}
1191 1190
 	} elseif (!sql_test_int($t)) {
1192
-		return ("'" . pg_escape_string($v) . "'");
1191
+		return ("'".pg_escape_string($v)."'");
1193 1192
 	} elseif (is_numeric($v) or (strpos($v, 'CAST(') === 0)) {
1194 1193
 		return $v;
1195 1194
 	} elseif ($v[0] == '0' and $v[1] !== 'x' and ctype_xdigit(substr($v, 1))) {
1196 1195
 		return substr($v, 1);
1197 1196
 	} else {
1198
-		spip_log("Warning: '$v'  n'est pas de type $t", 'pg.' . _LOG_AVERTISSEMENT);
1197
+		spip_log("Warning: '$v'  n'est pas de type $t", 'pg.'._LOG_AVERTISSEMENT);
1199 1198
 
1200 1199
 		return intval($v);
1201 1200
 	}
@@ -1203,7 +1202,7 @@  discard block
 block discarded – undo
1203 1202
 
1204 1203
 // http://code.spip.net/@spip_pg_hex
1205 1204
 function spip_pg_hex($v) {
1206
-	return "CAST(x'" . $v . "' as bigint)";
1205
+	return "CAST(x'".$v."' as bigint)";
1207 1206
 }
1208 1207
 
1209 1208
 function spip_pg_quote($v, $type = '') {
@@ -1242,15 +1241,15 @@  discard block
 block discarded – undo
1242 1241
 		return $not ? '0=0' : '0=1';
1243 1242
 	}
1244 1243
 	if (strpos($valeurs, "CAST(x'") !== false) {
1245
-		return "($val=" . join("OR $val=", explode(',', $valeurs)) . ')';
1244
+		return "($val=".join("OR $val=", explode(',', $valeurs)).')';
1246 1245
 	}
1247 1246
 	$n = $i = 0;
1248 1247
 	$in_sql = "";
1249 1248
 	while ($n = strpos($valeurs, ',', $n + 1)) {
1250 1249
 		if ((++$i) >= 255) {
1251
-			$in_sql .= "($val $not IN (" .
1252
-				substr($valeurs, 0, $n) .
1253
-				"))\n" .
1250
+			$in_sql .= "($val $not IN (".
1251
+				substr($valeurs, 0, $n).
1252
+				"))\n".
1254 1253
 				($not ? "AND\t" : "OR\t");
1255 1254
 			$valeurs = substr($valeurs, $n + 1);
1256 1255
 			$i = $n = 0;
@@ -1267,7 +1266,7 @@  discard block
 block discarded – undo
1267 1266
 	$s = $link ? pg_last_error($link) : pg_last_error();
1268 1267
 	if ($s) {
1269 1268
 		$s = str_replace('ERROR', 'errcode: 1000 ', $s);
1270
-		spip_log("$s - $query", 'pg.' . _LOG_ERREUR);
1269
+		spip_log("$s - $query", 'pg.'._LOG_ERREUR);
1271 1270
 	}
1272 1271
 
1273 1272
 	return $s;
@@ -1318,7 +1317,7 @@  discard block
 block discarded – undo
1318 1317
 function spip_pg_showbase($match, $serveur = '', $requeter = true) {
1319 1318
 	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1320 1319
 	$link = $connexion['link'];
1321
-	$connexion['last'] = $q = "SELECT tablename FROM pg_tables WHERE tablename ILIKE " . _q($match);
1320
+	$connexion['last'] = $q = "SELECT tablename FROM pg_tables WHERE tablename ILIKE "._q($match);
1322 1321
 
1323 1322
 	return spip_pg_query_simple($link, $q);
1324 1323
 }
@@ -1327,7 +1326,7 @@  discard block
 block discarded – undo
1327 1326
 function spip_pg_showtable($nom_table, $serveur = '', $requeter = true) {
1328 1327
 	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1329 1328
 	$link = $connexion['link'];
1330
-	$connexion['last'] = $q = "SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE " . _q($nom_table);
1329
+	$connexion['last'] = $q = "SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE "._q($nom_table);
1331 1330
 
1332 1331
 	$res = spip_pg_query_simple($link, $q);
1333 1332
 	if (!$res) {
@@ -1338,15 +1337,15 @@  discard block
 block discarded – undo
1338 1337
 	// il faut en tenir compte dans le return
1339 1338
 	$fields = array();
1340 1339
 	while ($field = pg_fetch_array($res, null, PGSQL_NUM)) {
1341
-		$fields[$field[0]] = $field[2] . (!$field[1] ? '' : (" DEFAULT " . $field[1]));
1340
+		$fields[$field[0]] = $field[2].(!$field[1] ? '' : (" DEFAULT ".$field[1]));
1342 1341
 	}
1343
-	$connexion['last'] = $q = "SELECT indexdef FROM pg_indexes WHERE tablename ILIKE " . _q($nom_table);
1342
+	$connexion['last'] = $q = "SELECT indexdef FROM pg_indexes WHERE tablename ILIKE "._q($nom_table);
1344 1343
 	$res = spip_pg_query_simple($link, $q);
1345 1344
 	$keys = array();
1346 1345
 	while ($index = pg_fetch_array($res, null, PGSQL_NUM)) {
1347 1346
 		if (preg_match('/CREATE\s+(UNIQUE\s+)?INDEX\s([^\s]+).*\((.*)\)$/', $index[0], $r)) {
1348
-			$nom = str_replace($nom_table . '_', '', $r[2]);
1349
-			$keys[($r[1] ? "PRIMARY KEY" : ("KEY " . $nom))] = $r[3];
1347
+			$nom = str_replace($nom_table.'_', '', $r[2]);
1348
+			$keys[($r[1] ? "PRIMARY KEY" : ("KEY ".$nom))] = $r[3];
1350 1349
 		}
1351 1350
 	}
1352 1351
 
@@ -1379,16 +1378,16 @@  discard block
 block discarded – undo
1379 1378
 		if (strpos($k, "KEY ") === 0) {
1380 1379
 			$n = str_replace('`', '', $k);
1381 1380
 			$v = str_replace('`', '"', $v);
1382
-			$i = $nom . preg_replace("/KEY +/", '_', $n);
1381
+			$i = $nom.preg_replace("/KEY +/", '_', $n);
1383 1382
 			if ($k != $n) {
1384 1383
 				$i = "\"$i\"";
1385 1384
 			}
1386 1385
 			$keys[] = "CREATE INDEX $i ON $nom ($v);";
1387 1386
 		} elseif (strpos($k, "UNIQUE ") === 0) {
1388 1387
 			$k = preg_replace("/^UNIQUE +/", '', $k);
1389
-			$prim .= "$s\n\t\tCONSTRAINT " . str_replace('`', '"', $k) . " UNIQUE ($v)";
1388
+			$prim .= "$s\n\t\tCONSTRAINT ".str_replace('`', '"', $k)." UNIQUE ($v)";
1390 1389
 		} else {
1391
-			$prim .= "$s\n\t\t" . str_replace('`', '"', $k) . " ($v)";
1390
+			$prim .= "$s\n\t\t".str_replace('`', '"', $k)." ($v)";
1392 1391
 		}
1393 1392
 		if ($k == "PRIMARY KEY") {
1394 1393
 			$prim_name = $v;
@@ -1399,17 +1398,17 @@  discard block
 block discarded – undo
1399 1398
 
1400 1399
 	$character_set = "";
1401 1400
 	if (@$GLOBALS['meta']['charset_sql_base']) {
1402
-		$character_set .= " CHARACTER SET " . $GLOBALS['meta']['charset_sql_base'];
1401
+		$character_set .= " CHARACTER SET ".$GLOBALS['meta']['charset_sql_base'];
1403 1402
 	}
1404 1403
 	if (@$GLOBALS['meta']['charset_collation_sql_base']) {
1405
-		$character_set .= " COLLATE " . $GLOBALS['meta']['charset_collation_sql_base'];
1404
+		$character_set .= " COLLATE ".$GLOBALS['meta']['charset_collation_sql_base'];
1406 1405
 	}
1407 1406
 
1408 1407
 	foreach ($champs as $k => $v) {
1409 1408
 		$k = str_replace('`', '"', $k);
1410 1409
 		if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
1411 1410
 			if (preg_match(',(char|text),i', $defs[1]) and !preg_match(',binary,i', $defs[1])) {
1412
-				$v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
1411
+				$v = $defs[1].$character_set.' '.substr($v, strlen($defs[1]));
1413 1412
 			}
1414 1413
 		}
1415 1414
 
@@ -1424,7 +1423,7 @@  discard block
 block discarded – undo
1424 1423
 
1425 1424
 	// En l'absence de "if not exists" en PG, on neutralise les erreurs
1426 1425
 
1427
-	$q = "CREATE $temporary TABLE $nom ($query" . ($prim ? ",$prim" : '') . ")" .
1426
+	$q = "CREATE $temporary TABLE $nom ($query".($prim ? ",$prim" : '').")".
1428 1427
 		($character_set ? " DEFAULT $character_set" : "")
1429 1428
 		. "\n";
1430 1429
 
@@ -1435,7 +1434,7 @@  discard block
 block discarded – undo
1435 1434
 	$r = @pg_query($link, $q);
1436 1435
 
1437 1436
 	if (!$r) {
1438
-		spip_log("Impossible de creer cette table: $q", 'pg.' . _LOG_ERREUR);
1437
+		spip_log("Impossible de creer cette table: $q", 'pg.'._LOG_ERREUR);
1439 1438
 	} else {
1440 1439
 		foreach ($keys as $index) {
1441 1440
 			pg_query($link, $index);
@@ -1459,13 +1458,13 @@  discard block
 block discarded – undo
1459 1458
 	// vue deja presente
1460 1459
 	if (sql_showtable($nom, false, $serveur)) {
1461 1460
 		if ($requeter) {
1462
-			spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", 'pg.' . _LOG_ERREUR);
1461
+			spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", 'pg.'._LOG_ERREUR);
1463 1462
 		}
1464 1463
 
1465 1464
 		return false;
1466 1465
 	}
1467 1466
 
1468
-	$query = "CREATE VIEW $nom AS " . $query_select;
1467
+	$query = "CREATE VIEW $nom AS ".$query_select;
1469 1468
 
1470 1469
 	return spip_pg_query($query, $serveur, $requeter);
1471 1470
 }
@@ -1473,7 +1472,7 @@  discard block
 block discarded – undo
1473 1472
 
1474 1473
 // http://code.spip.net/@spip_pg_set_connect_charset
1475 1474
 function spip_pg_set_connect_charset($charset, $serveur = '', $requeter = true) {
1476
-	spip_log("changement de charset sql a ecrire en PG", 'pg.' . _LOG_ERREUR);
1475
+	spip_log("changement de charset sql a ecrire en PG", 'pg.'._LOG_ERREUR);
1477 1476
 }
1478 1477
 
1479 1478
 
@@ -1487,7 +1486,7 @@  discard block
 block discarded – undo
1487 1486
  **/
1488 1487
 // http://code.spip.net/@spip_sqlite_optimize
1489 1488
 function spip_pg_optimize($table, $serveur = '', $requeter = true) {
1490
-	return spip_pg_query("VACUUM " . $table, $serveur, $requeter);
1489
+	return spip_pg_query("VACUUM ".$table, $serveur, $requeter);
1491 1490
 }
1492 1491
 
1493 1492
 // Selectionner la sous-chaine dans $objet
Please login to merge, or discard this patch.
ecrire/req/sqlite_generique.php 2 patches
Indentation   +1896 added lines, -1896 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  */
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 // TODO: get/set_caracteres ?
@@ -42,91 +42,91 @@  discard block
 block discarded – undo
42 42
  * @return array|bool
43 43
  */
44 44
 function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $sqlite_version = '') {
45
-	static $last_connect = array();
46
-
47
-	// si provient de selectdb
48
-	// un code pour etre sur que l'on vient de select_db()
49
-	if (strpos($db, $code = '@selectdb@') !== false) {
50
-		foreach (array('addr', 'port', 'login', 'pass', 'prefixe') as $a) {
51
-			$$a = $last_connect[$a];
52
-		}
53
-		$db = str_replace($code, '', $db);
54
-	}
55
-
56
-	/*
45
+    static $last_connect = array();
46
+
47
+    // si provient de selectdb
48
+    // un code pour etre sur que l'on vient de select_db()
49
+    if (strpos($db, $code = '@selectdb@') !== false) {
50
+        foreach (array('addr', 'port', 'login', 'pass', 'prefixe') as $a) {
51
+            $$a = $last_connect[$a];
52
+        }
53
+        $db = str_replace($code, '', $db);
54
+    }
55
+
56
+    /*
57 57
 	 * En sqlite, seule l'adresse du fichier est importante.
58 58
 	 * Ce sera $db le nom,
59 59
 	 * le path est $addr
60 60
 	 * (_DIR_DB si $addr est vide)
61 61
 	 */
62
-	_sqlite_init();
63
-
64
-	// determiner le dossier de la base : $addr ou _DIR_DB
65
-	$f = _DIR_DB;
66
-	if ($addr and strpos($addr, '/') !== false) {
67
-		$f = rtrim($addr, '/') . '/';
68
-	}
69
-
70
-	// un nom de base demande et impossible d'obtenir la base, on s'en va :
71
-	// il faut que la base existe ou que le repertoire parent soit writable
72
-	if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
73
-		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
74
-
75
-		return false;
76
-	}
77
-
78
-	// charger les modules sqlite au besoin
79
-	if (!_sqlite_charger_version($sqlite_version)) {
80
-		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
81
-
82
-		return false;
83
-	}
84
-
85
-	// chargement des constantes
86
-	// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
87
-	$define = "spip_sqlite" . $sqlite_version . "_constantes";
88
-	$define();
89
-
90
-	$ok = false;
91
-	if (!$db) {
92
-		// si pas de db ->
93
-		// base temporaire tant qu'on ne connait pas son vrai nom
94
-		// pour tester la connexion
95
-		$db = "_sqlite" . $sqlite_version . "_install";
96
-		$tmp = _DIR_DB . $db . ".sqlite";
97
-		$ok = $link = new \PDO("sqlite:$tmp");
98
-	} else {
99
-		// Ouvrir (eventuellement creer la base)
100
-		$ok = $link = new \PDO("sqlite:$f");
101
-	}
102
-
103
-	if (!$ok) {
104
-		$e = _sqlite_last_error_from_link($link);
105
-		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
106
-
107
-		return false;
108
-	}
109
-
110
-	if ($link) {
111
-		$last_connect = array(
112
-			'addr' => $addr,
113
-			'port' => $port,
114
-			'login' => $login,
115
-			'pass' => $pass,
116
-			'db' => $db,
117
-			'prefixe' => $prefixe,
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
-
124
-	return array(
125
-		'db' => $db,
126
-		'prefixe' => $prefixe ? $prefixe : $db,
127
-		'link' => $link,
128
-		'total_requetes' => 0,
129
-	);
62
+    _sqlite_init();
63
+
64
+    // determiner le dossier de la base : $addr ou _DIR_DB
65
+    $f = _DIR_DB;
66
+    if ($addr and strpos($addr, '/') !== false) {
67
+        $f = rtrim($addr, '/') . '/';
68
+    }
69
+
70
+    // un nom de base demande et impossible d'obtenir la base, on s'en va :
71
+    // il faut que la base existe ou que le repertoire parent soit writable
72
+    if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
73
+        spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
74
+
75
+        return false;
76
+    }
77
+
78
+    // charger les modules sqlite au besoin
79
+    if (!_sqlite_charger_version($sqlite_version)) {
80
+        spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
81
+
82
+        return false;
83
+    }
84
+
85
+    // chargement des constantes
86
+    // il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
87
+    $define = "spip_sqlite" . $sqlite_version . "_constantes";
88
+    $define();
89
+
90
+    $ok = false;
91
+    if (!$db) {
92
+        // si pas de db ->
93
+        // base temporaire tant qu'on ne connait pas son vrai nom
94
+        // pour tester la connexion
95
+        $db = "_sqlite" . $sqlite_version . "_install";
96
+        $tmp = _DIR_DB . $db . ".sqlite";
97
+        $ok = $link = new \PDO("sqlite:$tmp");
98
+    } else {
99
+        // Ouvrir (eventuellement creer la base)
100
+        $ok = $link = new \PDO("sqlite:$f");
101
+    }
102
+
103
+    if (!$ok) {
104
+        $e = _sqlite_last_error_from_link($link);
105
+        spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
106
+
107
+        return false;
108
+    }
109
+
110
+    if ($link) {
111
+        $last_connect = array(
112
+            'addr' => $addr,
113
+            'port' => $port,
114
+            'login' => $login,
115
+            'pass' => $pass,
116
+            'db' => $db,
117
+            'prefixe' => $prefixe,
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
+
124
+    return array(
125
+        'db' => $db,
126
+        'prefixe' => $prefixe ? $prefixe : $db,
127
+        'link' => $link,
128
+        'total_requetes' => 0,
129
+    );
130 130
 }
131 131
 
132 132
 
@@ -145,14 +145,14 @@  discard block
 block discarded – undo
145 145
  *    Resultat de la requete
146 146
  */
147 147
 function spip_sqlite_query($query, $serveur = '', $requeter = true) {
148
-	#spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
149
-	#_sqlite_init(); // fait la premiere fois dans spip_sqlite
150
-	$query = spip_sqlite::traduire_requete($query, $serveur);
151
-	if (!$requeter) {
152
-		return $query;
153
-	}
148
+    #spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
149
+    #_sqlite_init(); // fait la premiere fois dans spip_sqlite
150
+    $query = spip_sqlite::traduire_requete($query, $serveur);
151
+    if (!$requeter) {
152
+        return $query;
153
+    }
154 154
 
155
-	return spip_sqlite::executer_requete($query, $serveur);
155
+    return spip_sqlite::executer_requete($query, $serveur);
156 156
 }
157 157
 
158 158
 
@@ -169,11 +169,11 @@  discard block
 block discarded – undo
169 169
  */
170 170
 function spip_sqlite_alter($query, $serveur = '', $requeter = true) {
171 171
 
172
-	$query = spip_sqlite_query("ALTER $query", $serveur, false);
173
-	// traduire la requete pour recuperer les bons noms de table
174
-	$query = spip_sqlite::traduire_requete($query, $serveur);
172
+    $query = spip_sqlite_query("ALTER $query", $serveur, false);
173
+    // traduire la requete pour recuperer les bons noms de table
174
+    $query = spip_sqlite::traduire_requete($query, $serveur);
175 175
 
176
-	/*
176
+    /*
177 177
 		 * la il faut faire les transformations
178 178
 		 * si ALTER TABLE x (DROP|CHANGE) y
179 179
 		 *
@@ -182,239 +182,239 @@  discard block
 block discarded – undo
182 182
 		 * 3) faire chaque requete independemment
183 183
 		 */
184 184
 
185
-	// 1
186
-	if (preg_match("/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)) {
187
-		$debut = $regs[1];
188
-		$table = $regs[3];
189
-		$suite = $regs[4];
190
-	} else {
191
-		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
192
-
193
-		return false;
194
-	}
195
-
196
-	// 2
197
-	// il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
198
-	// tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
199
-	// ou revoir l'api de sql_alter en creant un 
200
-	// sql_alter_table($table,array($actions));
201
-	$todo = explode(',', $suite);
202
-
203
-	// on remet les morceaux dechires ensembles... que c'est laid !
204
-	$todo2 = array();
205
-	$i = 0;
206
-	$ouverte = false;
207
-	while ($do = array_shift($todo)) {
208
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . "," . $do : $do;
209
-		$o = (false !== strpos($do, "("));
210
-		$f = (false !== strpos($do, ")"));
211
-		if ($o and !$f) {
212
-			$ouverte = true;
213
-		} elseif ($f) {
214
-			$ouverte = false;
215
-		}
216
-		if (!$ouverte) {
217
-			$i++;
218
-		}
219
-	}
220
-
221
-	// 3
222
-	$resultats = array();
223
-	foreach ($todo2 as $do) {
224
-		$do = trim($do);
225
-		if (!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
226
-			. '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
227
-			. '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
228
-			. '|ADD COLUMN|ADD'
229
-			. ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
230
-		) {
231
-			spip_log("SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
232
-				'sqlite.' . _LOG_ERREUR);
233
-
234
-			return false;
235
-		}
236
-
237
-		$cle = strtoupper($matches[1]);
238
-		$colonne_origine = $matches[2];
239
-		$colonne_destination = '';
240
-
241
-		$def = $matches[3];
242
-
243
-		// eluder une eventuelle clause before|after|first inutilisable
244
-		$defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
245
-		$defo = $defr; // garder la def d'origine pour certains cas
246
-		// remplacer les definitions venant de mysql
247
-		$defr = _sqlite_remplacements_definitions_table($defr);
248
-
249
-		// reinjecter dans le do
250
-		$do = str_replace($def, $defr, $do);
251
-		$def = $defr;
252
-
253
-		switch ($cle) {
254
-			// suppression d'un index
255
-			case 'DROP KEY':
256
-			case 'DROP INDEX':
257
-				$nom_index = $colonne_origine;
258
-				spip_sqlite_drop_index($nom_index, $table, $serveur);
259
-				break;
260
-
261
-			// suppression d'une pk
262
-			case 'DROP PRIMARY KEY':
263
-				if (!_sqlite_modifier_table(
264
-					$table,
265
-					$colonne_origine,
266
-					array('key' => array('PRIMARY KEY' => '')),
267
-					$serveur)
268
-				) {
269
-					return false;
270
-				}
271
-				break;
272
-			// suppression d'une colonne
273
-			case 'DROP COLUMN':
274
-			case 'DROP':
275
-				if (!_sqlite_modifier_table(
276
-					$table,
277
-					array($colonne_origine => ""),
278
-					array(),
279
-					$serveur)
280
-				) {
281
-					return false;
282
-				}
283
-				break;
284
-
285
-			case 'CHANGE COLUMN':
286
-			case 'CHANGE':
287
-				// recuperer le nom de la future colonne
288
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
289
-				// en tenant compte de la cle primaire (ce qui est mieux)
290
-				$def = trim($defo);
291
-				$colonne_destination = substr($def, 0, strpos($def, ' '));
292
-				$def = substr($def, strlen($colonne_destination) + 1);
293
-
294
-				if (!_sqlite_modifier_table(
295
-					$table,
296
-					array($colonne_origine => $colonne_destination),
297
-					array('field' => array($colonne_destination => $def)),
298
-					$serveur)
299
-				) {
300
-					return false;
301
-				}
302
-				break;
303
-
304
-			case 'MODIFY':
305
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
306
-				// en tenant compte de la cle primaire (ce qui est mieux)
307
-				if (!_sqlite_modifier_table(
308
-					$table,
309
-					$colonne_origine,
310
-					array('field' => array($colonne_origine => $defo)),
311
-					$serveur)
312
-				) {
313
-					return false;
314
-				}
315
-				break;
316
-
317
-			// pas geres en sqlite2
318
-			case 'RENAME':
319
-				$do = "RENAME TO" . substr($do, 6);
320
-			case 'RENAME TO':
321
-				if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
322
-					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
323
-
324
-					return false;
325
-				}
326
-				break;
327
-
328
-			// ajout d'une pk
329
-			case 'ADD PRIMARY KEY':
330
-				$pk = trim(substr($do, 16));
331
-				$pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
332
-				if (!_sqlite_modifier_table(
333
-					$table,
334
-					$colonne_origine,
335
-					array('key' => array('PRIMARY KEY' => $pk)),
336
-					$serveur)
337
-				) {
338
-					return false;
339
-				}
340
-				break;
341
-			// ajout d'un index
342
-			case 'ADD UNIQUE KEY':
343
-			case 'ADD UNIQUE':
344
-				$unique = true;
345
-			case 'ADD INDEX':
346
-			case 'ADD KEY':
347
-				if (!isset($unique)) {
348
-					$unique = false;
349
-				}
350
-				// peut etre "(colonne)" ou "nom_index (colonnes)"
351
-				// bug potentiel si qqn met "(colonne, colonne)"
352
-				//
353
-				// nom_index (colonnes)
354
-				if ($def) {
355
-					$colonnes = substr($def, 1, -1);
356
-					$nom_index = $colonne_origine;
357
-				} else {
358
-					// (colonne)
359
-					if ($colonne_origine[0] == "(") {
360
-						$colonnes = substr($colonne_origine, 1, -1);
361
-						if (false !== strpos(",", $colonnes)) {
362
-							spip_log("SQLite : Erreur, impossible de creer un index sur plusieurs colonnes"
363
-								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
364
-							break;
365
-						} else {
366
-							$nom_index = $colonnes;
367
-						}
368
-					} // nom_index
369
-					else {
370
-						$nom_index = $colonnes = $colonne_origine;
371
-					}
372
-				}
373
-				spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
374
-				break;
375
-
376
-			// pas geres en sqlite2
377
-			case 'ADD COLUMN':
378
-				$do = "ADD" . substr($do, 10);
379
-			case 'ADD':
380
-			default:
381
-				if (!preg_match(',primary\s+key,i', $do)) {
382
-					if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
383
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
384
-
385
-						return false;
386
-					}
387
-					break;
388
-
389
-				}
390
-				// ou si la colonne est aussi primary key
391
-				// cas du add id_truc int primary key
392
-				// ajout d'une colonne qui passe en primary key directe
393
-				else {
394
-					$def = trim(substr($do, 3));
395
-					$colonne_ajoutee = substr($def, 0, strpos($def, ' '));
396
-					$def = substr($def, strlen($colonne_ajoutee) + 1);
397
-					$opts = array();
398
-					if (preg_match(',primary\s+key,i', $def)) {
399
-						$opts['key'] = array('PRIMARY KEY' => $colonne_ajoutee);
400
-						$def = preg_replace(',primary\s+key,i', '', $def);
401
-					}
402
-					$opts['field'] = array($colonne_ajoutee => $def);
403
-					if (!_sqlite_modifier_table($table, array($colonne_ajoutee), $opts, $serveur)) {
404
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
405
-
406
-						return false;
407
-					}
408
-				}
409
-				break;
410
-		}
411
-		// tout est bon, ouf !
412
-		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
413
-	}
414
-
415
-	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
416
-
417
-	return true;
185
+    // 1
186
+    if (preg_match("/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)) {
187
+        $debut = $regs[1];
188
+        $table = $regs[3];
189
+        $suite = $regs[4];
190
+    } else {
191
+        spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
192
+
193
+        return false;
194
+    }
195
+
196
+    // 2
197
+    // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
198
+    // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
199
+    // ou revoir l'api de sql_alter en creant un 
200
+    // sql_alter_table($table,array($actions));
201
+    $todo = explode(',', $suite);
202
+
203
+    // on remet les morceaux dechires ensembles... que c'est laid !
204
+    $todo2 = array();
205
+    $i = 0;
206
+    $ouverte = false;
207
+    while ($do = array_shift($todo)) {
208
+        $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . "," . $do : $do;
209
+        $o = (false !== strpos($do, "("));
210
+        $f = (false !== strpos($do, ")"));
211
+        if ($o and !$f) {
212
+            $ouverte = true;
213
+        } elseif ($f) {
214
+            $ouverte = false;
215
+        }
216
+        if (!$ouverte) {
217
+            $i++;
218
+        }
219
+    }
220
+
221
+    // 3
222
+    $resultats = array();
223
+    foreach ($todo2 as $do) {
224
+        $do = trim($do);
225
+        if (!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
226
+            . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
227
+            . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
228
+            . '|ADD COLUMN|ADD'
229
+            . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
230
+        ) {
231
+            spip_log("SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
232
+                'sqlite.' . _LOG_ERREUR);
233
+
234
+            return false;
235
+        }
236
+
237
+        $cle = strtoupper($matches[1]);
238
+        $colonne_origine = $matches[2];
239
+        $colonne_destination = '';
240
+
241
+        $def = $matches[3];
242
+
243
+        // eluder une eventuelle clause before|after|first inutilisable
244
+        $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
245
+        $defo = $defr; // garder la def d'origine pour certains cas
246
+        // remplacer les definitions venant de mysql
247
+        $defr = _sqlite_remplacements_definitions_table($defr);
248
+
249
+        // reinjecter dans le do
250
+        $do = str_replace($def, $defr, $do);
251
+        $def = $defr;
252
+
253
+        switch ($cle) {
254
+            // suppression d'un index
255
+            case 'DROP KEY':
256
+            case 'DROP INDEX':
257
+                $nom_index = $colonne_origine;
258
+                spip_sqlite_drop_index($nom_index, $table, $serveur);
259
+                break;
260
+
261
+            // suppression d'une pk
262
+            case 'DROP PRIMARY KEY':
263
+                if (!_sqlite_modifier_table(
264
+                    $table,
265
+                    $colonne_origine,
266
+                    array('key' => array('PRIMARY KEY' => '')),
267
+                    $serveur)
268
+                ) {
269
+                    return false;
270
+                }
271
+                break;
272
+            // suppression d'une colonne
273
+            case 'DROP COLUMN':
274
+            case 'DROP':
275
+                if (!_sqlite_modifier_table(
276
+                    $table,
277
+                    array($colonne_origine => ""),
278
+                    array(),
279
+                    $serveur)
280
+                ) {
281
+                    return false;
282
+                }
283
+                break;
284
+
285
+            case 'CHANGE COLUMN':
286
+            case 'CHANGE':
287
+                // recuperer le nom de la future colonne
288
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
289
+                // en tenant compte de la cle primaire (ce qui est mieux)
290
+                $def = trim($defo);
291
+                $colonne_destination = substr($def, 0, strpos($def, ' '));
292
+                $def = substr($def, strlen($colonne_destination) + 1);
293
+
294
+                if (!_sqlite_modifier_table(
295
+                    $table,
296
+                    array($colonne_origine => $colonne_destination),
297
+                    array('field' => array($colonne_destination => $def)),
298
+                    $serveur)
299
+                ) {
300
+                    return false;
301
+                }
302
+                break;
303
+
304
+            case 'MODIFY':
305
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
306
+                // en tenant compte de la cle primaire (ce qui est mieux)
307
+                if (!_sqlite_modifier_table(
308
+                    $table,
309
+                    $colonne_origine,
310
+                    array('field' => array($colonne_origine => $defo)),
311
+                    $serveur)
312
+                ) {
313
+                    return false;
314
+                }
315
+                break;
316
+
317
+            // pas geres en sqlite2
318
+            case 'RENAME':
319
+                $do = "RENAME TO" . substr($do, 6);
320
+            case 'RENAME TO':
321
+                if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
322
+                    spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
323
+
324
+                    return false;
325
+                }
326
+                break;
327
+
328
+            // ajout d'une pk
329
+            case 'ADD PRIMARY KEY':
330
+                $pk = trim(substr($do, 16));
331
+                $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
332
+                if (!_sqlite_modifier_table(
333
+                    $table,
334
+                    $colonne_origine,
335
+                    array('key' => array('PRIMARY KEY' => $pk)),
336
+                    $serveur)
337
+                ) {
338
+                    return false;
339
+                }
340
+                break;
341
+            // ajout d'un index
342
+            case 'ADD UNIQUE KEY':
343
+            case 'ADD UNIQUE':
344
+                $unique = true;
345
+            case 'ADD INDEX':
346
+            case 'ADD KEY':
347
+                if (!isset($unique)) {
348
+                    $unique = false;
349
+                }
350
+                // peut etre "(colonne)" ou "nom_index (colonnes)"
351
+                // bug potentiel si qqn met "(colonne, colonne)"
352
+                //
353
+                // nom_index (colonnes)
354
+                if ($def) {
355
+                    $colonnes = substr($def, 1, -1);
356
+                    $nom_index = $colonne_origine;
357
+                } else {
358
+                    // (colonne)
359
+                    if ($colonne_origine[0] == "(") {
360
+                        $colonnes = substr($colonne_origine, 1, -1);
361
+                        if (false !== strpos(",", $colonnes)) {
362
+                            spip_log("SQLite : Erreur, impossible de creer un index sur plusieurs colonnes"
363
+                                . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
364
+                            break;
365
+                        } else {
366
+                            $nom_index = $colonnes;
367
+                        }
368
+                    } // nom_index
369
+                    else {
370
+                        $nom_index = $colonnes = $colonne_origine;
371
+                    }
372
+                }
373
+                spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
374
+                break;
375
+
376
+            // pas geres en sqlite2
377
+            case 'ADD COLUMN':
378
+                $do = "ADD" . substr($do, 10);
379
+            case 'ADD':
380
+            default:
381
+                if (!preg_match(',primary\s+key,i', $do)) {
382
+                    if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
383
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
384
+
385
+                        return false;
386
+                    }
387
+                    break;
388
+
389
+                }
390
+                // ou si la colonne est aussi primary key
391
+                // cas du add id_truc int primary key
392
+                // ajout d'une colonne qui passe en primary key directe
393
+                else {
394
+                    $def = trim(substr($do, 3));
395
+                    $colonne_ajoutee = substr($def, 0, strpos($def, ' '));
396
+                    $def = substr($def, strlen($colonne_ajoutee) + 1);
397
+                    $opts = array();
398
+                    if (preg_match(',primary\s+key,i', $def)) {
399
+                        $opts['key'] = array('PRIMARY KEY' => $colonne_ajoutee);
400
+                        $def = preg_replace(',primary\s+key,i', '', $def);
401
+                    }
402
+                    $opts['field'] = array($colonne_ajoutee => $def);
403
+                    if (!_sqlite_modifier_table($table, array($colonne_ajoutee), $opts, $serveur)) {
404
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
405
+
406
+                        return false;
407
+                    }
408
+                }
409
+                break;
410
+        }
411
+        // tout est bon, ouf !
412
+        spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
413
+    }
414
+
415
+    spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
416
+
417
+    return true;
418 418
 }
419 419
 
420 420
 
@@ -437,38 +437,38 @@  discard block
 block discarded – undo
437 437
  *     - true si la requête réussie, false sinon.
438 438
  */
439 439
 function spip_sqlite_create(
440
-	$nom,
441
-	$champs,
442
-	$cles,
443
-	$autoinc = false,
444
-	$temporary = false,
445
-	$serveur = '',
446
-	$requeter = true
440
+    $nom,
441
+    $champs,
442
+    $cles,
443
+    $autoinc = false,
444
+    $temporary = false,
445
+    $serveur = '',
446
+    $requeter = true
447 447
 ) {
448
-	$query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
449
-	if (!$query) {
450
-		return false;
451
-	}
452
-	$res = spip_sqlite_query($query, $serveur, $requeter);
453
-
454
-	// SQLite ne cree pas les KEY sur les requetes CREATE TABLE
455
-	// il faut donc les faire creer ensuite
456
-	if (!$requeter) {
457
-		return $res;
458
-	}
459
-
460
-	$ok = $res ? true : false;
461
-	if ($ok) {
462
-		foreach ($cles as $k => $v) {
463
-			if (preg_match(',^(KEY|UNIQUE)\s,i', $k, $m)) {
464
-				$index = trim(substr($k, strlen($m[1])));
465
-				$unique = (strlen($m[1]) > 3);
466
-				$ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
467
-			}
468
-		}
469
-	}
470
-
471
-	return $ok ? true : false;
448
+    $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
449
+    if (!$query) {
450
+        return false;
451
+    }
452
+    $res = spip_sqlite_query($query, $serveur, $requeter);
453
+
454
+    // SQLite ne cree pas les KEY sur les requetes CREATE TABLE
455
+    // il faut donc les faire creer ensuite
456
+    if (!$requeter) {
457
+        return $res;
458
+    }
459
+
460
+    $ok = $res ? true : false;
461
+    if ($ok) {
462
+        foreach ($cles as $k => $v) {
463
+            if (preg_match(',^(KEY|UNIQUE)\s,i', $k, $m)) {
464
+                $index = trim(substr($k, strlen($m[1])));
465
+                $unique = (strlen($m[1]) > 3);
466
+                $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
467
+            }
468
+        }
469
+    }
470
+
471
+    return $ok ? true : false;
472 472
 }
473 473
 
474 474
 /**
@@ -481,21 +481,21 @@  discard block
 block discarded – undo
481 481
  * @return bool true si la base est créee.
482 482
  **/
483 483
 function spip_sqlite_create_base($nom, $serveur = '', $option = true) {
484
-	$f = $nom . '.sqlite';
485
-	if (strpos($nom, "/") === false) {
486
-		$f = _DIR_DB . $f;
487
-	}
484
+    $f = $nom . '.sqlite';
485
+    if (strpos($nom, "/") === false) {
486
+        $f = _DIR_DB . $f;
487
+    }
488 488
 
489
-	$ok = new \PDO("sqlite:$f");
489
+    $ok = new \PDO("sqlite:$f");
490 490
 
491
-	if ($ok) {
492
-		unset($ok);
491
+    if ($ok) {
492
+        unset($ok);
493 493
 
494
-		return true;
495
-	}
496
-	unset($ok);
494
+        return true;
495
+    }
496
+    unset($ok);
497 497
 
498
-	return false;
498
+    return false;
499 499
 }
500 500
 
501 501
 
@@ -516,20 +516,20 @@  discard block
 block discarded – undo
516 516
  *     - string texte de la requête si $requeter vaut false
517 517
  */
518 518
 function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true) {
519
-	if (!$query_select) {
520
-		return false;
521
-	}
522
-	// vue deja presente
523
-	if (sql_showtable($nom, false, $serveur)) {
524
-		spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
525
-			'sqlite.' . _LOG_ERREUR);
519
+    if (!$query_select) {
520
+        return false;
521
+    }
522
+    // vue deja presente
523
+    if (sql_showtable($nom, false, $serveur)) {
524
+        spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
525
+            'sqlite.' . _LOG_ERREUR);
526 526
 
527
-		return false;
528
-	}
527
+        return false;
528
+    }
529 529
 
530
-	$query = "CREATE VIEW $nom AS " . $query_select;
530
+    $query = "CREATE VIEW $nom AS " . $query_select;
531 531
 
532
-	return spip_sqlite_query($query, $serveur, $requeter);
532
+    return spip_sqlite_query($query, $serveur, $requeter);
533 533
 }
534 534
 
535 535
 /**
@@ -551,52 +551,52 @@  discard block
 block discarded – undo
551 551
  *    string : requête, false si erreur, true sinon.
552 552
  */
553 553
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) {
554
-	if (!($nom or $table or $champs)) {
555
-		spip_log("Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . "))",
556
-			'sqlite.' . _LOG_ERREUR);
557
-
558
-		return false;
559
-	}
560
-
561
-	// SQLite ne differentie pas noms des index en fonction des tables
562
-	// il faut donc creer des noms uniques d'index pour une base sqlite
563
-	$nom = $table . '_' . $nom;
564
-	// enlever d'eventuelles parentheses deja presentes sur champs
565
-	if (!is_array($champs)) {
566
-		if ($champs[0] == "(") {
567
-			$champs = substr($champs, 1, -1);
568
-		}
569
-		$champs = array($champs);
570
-		// supprimer l'info de longueur d'index mysql en fin de champ
571
-		$champs = preg_replace(",\(\d+\)$,", "", $champs);
572
-	}
573
-
574
-	$ifnotexists = "";
575
-	$version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version", $serveur), '', $serveur);
576
-	if (!function_exists('spip_version_compare')) {
577
-		include_spip('plugins/installer');
578
-	}
579
-
580
-	if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
581
-		$ifnotexists = ' IF NOT EXISTS';
582
-	} else {
583
-		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
584
-		$a = spip_sqlite_showtable($table, $serveur);
585
-		if (isset($a['key']['KEY ' . $nom])) {
586
-			return true;
587
-		}
588
-	}
589
-
590
-	$query = "CREATE " . ($unique ? "UNIQUE " : "") . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ")";
591
-	$res = spip_sqlite_query($query, $serveur, $requeter);
592
-	if (!$requeter) {
593
-		return $res;
594
-	}
595
-	if ($res) {
596
-		return true;
597
-	} else {
598
-		return false;
599
-	}
554
+    if (!($nom or $table or $champs)) {
555
+        spip_log("Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . "))",
556
+            'sqlite.' . _LOG_ERREUR);
557
+
558
+        return false;
559
+    }
560
+
561
+    // SQLite ne differentie pas noms des index en fonction des tables
562
+    // il faut donc creer des noms uniques d'index pour une base sqlite
563
+    $nom = $table . '_' . $nom;
564
+    // enlever d'eventuelles parentheses deja presentes sur champs
565
+    if (!is_array($champs)) {
566
+        if ($champs[0] == "(") {
567
+            $champs = substr($champs, 1, -1);
568
+        }
569
+        $champs = array($champs);
570
+        // supprimer l'info de longueur d'index mysql en fin de champ
571
+        $champs = preg_replace(",\(\d+\)$,", "", $champs);
572
+    }
573
+
574
+    $ifnotexists = "";
575
+    $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version", $serveur), '', $serveur);
576
+    if (!function_exists('spip_version_compare')) {
577
+        include_spip('plugins/installer');
578
+    }
579
+
580
+    if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
581
+        $ifnotexists = ' IF NOT EXISTS';
582
+    } else {
583
+        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
584
+        $a = spip_sqlite_showtable($table, $serveur);
585
+        if (isset($a['key']['KEY ' . $nom])) {
586
+            return true;
587
+        }
588
+    }
589
+
590
+    $query = "CREATE " . ($unique ? "UNIQUE " : "") . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ")";
591
+    $res = spip_sqlite_query($query, $serveur, $requeter);
592
+    if (!$requeter) {
593
+        return $res;
594
+    }
595
+    if ($res) {
596
+        return true;
597
+    } else {
598
+        return false;
599
+    }
600 600
 }
601 601
 
602 602
 /**
@@ -613,31 +613,31 @@  discard block
 block discarded – undo
613 613
  * @return int                 Nombre de lignes
614 614
  */
615 615
 function spip_sqlite_count($r, $serveur = '', $requeter = true) {
616
-	if (!$r) {
617
-		return 0;
618
-	}
619
-
620
-	// select ou autre (insert, update,...) ?
621
-	// (link,requete) a compter
622
-	if (is_array($r->spipSqliteRowCount)) {
623
-		list($link, $query) = $r->spipSqliteRowCount;
624
-		// amelioration possible a tester intensivement : pas de order by pour compter !
625
-		// $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
626
-		$query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
627
-		$l = $link->query($query);
628
-		$i = 0;
629
-		if ($l and $z = $l->fetch()) {
630
-			$i = $z['zzzzsqlitecount'];
631
-		}
632
-		$r->spipSqliteRowCount = $i;
633
-	}
634
-	if (isset($r->spipSqliteRowCount)) {
635
-		// Ce compte est faux s'il y a des limit dans la requete :(
636
-		// il retourne le nombre d'enregistrements sans le limit
637
-		return $r->spipSqliteRowCount;
638
-	} else {
639
-		return $r->rowCount();
640
-	}
616
+    if (!$r) {
617
+        return 0;
618
+    }
619
+
620
+    // select ou autre (insert, update,...) ?
621
+    // (link,requete) a compter
622
+    if (is_array($r->spipSqliteRowCount)) {
623
+        list($link, $query) = $r->spipSqliteRowCount;
624
+        // amelioration possible a tester intensivement : pas de order by pour compter !
625
+        // $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
626
+        $query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
627
+        $l = $link->query($query);
628
+        $i = 0;
629
+        if ($l and $z = $l->fetch()) {
630
+            $i = $z['zzzzsqlitecount'];
631
+        }
632
+        $r->spipSqliteRowCount = $i;
633
+    }
634
+    if (isset($r->spipSqliteRowCount)) {
635
+        // Ce compte est faux s'il y a des limit dans la requete :(
636
+        // il retourne le nombre d'enregistrements sans le limit
637
+        return $r->spipSqliteRowCount;
638
+    } else {
639
+        return $r->rowCount();
640
+    }
641 641
 }
642 642
 
643 643
 
@@ -656,21 +656,21 @@  discard block
 block discarded – undo
656 656
  *     - false si la requête a échouée
657 657
  **/
658 658
 function spip_sqlite_countsel(
659
-	$from = array(),
660
-	$where = array(),
661
-	$groupby = '',
662
-	$having = array(),
663
-	$serveur = '',
664
-	$requeter = true
659
+    $from = array(),
660
+    $where = array(),
661
+    $groupby = '',
662
+    $having = array(),
663
+    $serveur = '',
664
+    $requeter = true
665 665
 ) {
666
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
667
-	$r = spip_sqlite_select("COUNT($c)", $from, $where, '', '', '',
668
-		$having, $serveur, $requeter);
669
-	if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
670
-		list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
671
-	}
666
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
667
+    $r = spip_sqlite_select("COUNT($c)", $from, $where, '', '', '',
668
+        $having, $serveur, $requeter);
669
+    if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
670
+        list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
671
+    }
672 672
 
673
-	return $r;
673
+    return $r;
674 674
 }
675 675
 
676 676
 
@@ -687,22 +687,22 @@  discard block
 block discarded – undo
687 687
  *     - False en cas d'erreur.
688 688
  **/
689 689
 function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true) {
690
-	$res = spip_sqlite_query(
691
-		_sqlite_calculer_expression('DELETE FROM', $table, ',')
692
-		. _sqlite_calculer_expression('WHERE', $where),
693
-		$serveur, $requeter);
690
+    $res = spip_sqlite_query(
691
+        _sqlite_calculer_expression('DELETE FROM', $table, ',')
692
+        . _sqlite_calculer_expression('WHERE', $where),
693
+        $serveur, $requeter);
694 694
 
695
-	// renvoyer la requete inerte si demandee
696
-	if (!$requeter) {
697
-		return $res;
698
-	}
695
+    // renvoyer la requete inerte si demandee
696
+    if (!$requeter) {
697
+        return $res;
698
+    }
699 699
 
700
-	if ($res) {
701
-		$link = _sqlite_link($serveur);
702
-		return $res->rowCount();
703
-	} else {
704
-		return false;
705
-	}
700
+    if ($res) {
701
+        $link = _sqlite_link($serveur);
702
+        return $res->rowCount();
703
+    } else {
704
+        return false;
705
+    }
706 706
 }
707 707
 
708 708
 
@@ -718,15 +718,15 @@  discard block
 block discarded – undo
718 718
  *     - true si la requête a réussie, false sinon
719 719
  */
720 720
 function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true) {
721
-	if ($exist) {
722
-		$exist = " IF EXISTS";
723
-	}
721
+    if ($exist) {
722
+        $exist = " IF EXISTS";
723
+    }
724 724
 
725
-	if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
726
-		return true;
727
-	} else {
728
-		return false;
729
-	}
725
+    if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
726
+        return true;
727
+    } else {
728
+        return false;
729
+    }
730 730
 }
731 731
 
732 732
 
@@ -742,11 +742,11 @@  discard block
 block discarded – undo
742 742
  *     - true si la requête a réussie, false sinon
743 743
  */
744 744
 function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true) {
745
-	if ($exist) {
746
-		$exist = " IF EXISTS";
747
-	}
745
+    if ($exist) {
746
+        $exist = " IF EXISTS";
747
+    }
748 748
 
749
-	return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
749
+    return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
750 750
 }
751 751
 
752 752
 /**
@@ -760,20 +760,20 @@  discard block
 block discarded – undo
760 760
  * @return bool ou requete
761 761
  */
762 762
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true) {
763
-	if (!($nom or $table)) {
764
-		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
763
+    if (!($nom or $table)) {
764
+        spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
765 765
 
766
-		return false;
767
-	}
766
+        return false;
767
+    }
768 768
 
769
-	// SQLite ne differentie pas noms des index en fonction des tables
770
-	// il faut donc creer des noms uniques d'index pour une base sqlite
771
-	$index = $table . '_' . $nom;
772
-	$exist = " IF EXISTS";
769
+    // SQLite ne differentie pas noms des index en fonction des tables
770
+    // il faut donc creer des noms uniques d'index pour une base sqlite
771
+    $index = $table . '_' . $nom;
772
+    $exist = " IF EXISTS";
773 773
 
774
-	$query = "DROP INDEX$exist $index";
774
+    $query = "DROP INDEX$exist $index";
775 775
 
776
-	return spip_sqlite_query($query, $serveur, $requeter);
776
+    return spip_sqlite_query($query, $serveur, $requeter);
777 777
 }
778 778
 
779 779
 /**
@@ -789,28 +789,28 @@  discard block
 block discarded – undo
789 789
  *     Erreur eventuelle
790 790
  **/
791 791
 function spip_sqlite_error($query = '', $serveur = '') {
792
-	$link = _sqlite_link($serveur);
792
+    $link = _sqlite_link($serveur);
793 793
 
794
-	if ($link) {
795
-		$errs = $link->errorInfo();
796
-		$s = _sqlite_last_error_from_link($link);
797
-	} else {
798
-		$s = ": aucune ressource sqlite (link)";
799
-	}
800
-	if ($s) {
801
-		$trace = debug_backtrace();
802
-		if ($trace[0]['function'] != "spip_sqlite_error") {
803
-			spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
804
-		}
805
-	}
794
+    if ($link) {
795
+        $errs = $link->errorInfo();
796
+        $s = _sqlite_last_error_from_link($link);
797
+    } else {
798
+        $s = ": aucune ressource sqlite (link)";
799
+    }
800
+    if ($s) {
801
+        $trace = debug_backtrace();
802
+        if ($trace[0]['function'] != "spip_sqlite_error") {
803
+            spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
804
+        }
805
+    }
806 806
 
807
-	return $s;
807
+    return $s;
808 808
 }
809 809
 
810 810
 function _sqlite_last_error_from_link($link) {
811
-	if ($link) {
812
-		$errs = $link->errorInfo();
813
-		/*
811
+    if ($link) {
812
+        $errs = $link->errorInfo();
813
+        /*
814 814
 			$errs[0]
815 815
 				numero SQLState ('HY000' souvent lors d'une erreur)
816 816
 				http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html
@@ -820,11 +820,11 @@  discard block
 block discarded – undo
820 820
 			$errs[2]
821 821
 				Le texte du message d'erreur
822 822
 		*/
823
-		if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
824
-			return "$errs[2]";
825
-		}
826
-	}
827
-	return "";
823
+        if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
824
+            return "$errs[2]";
825
+        }
826
+    }
827
+    return "";
828 828
 }
829 829
 
830 830
 /**
@@ -841,23 +841,23 @@  discard block
 block discarded – undo
841 841
  *    'HY000/1' : numéro de l'erreur SQLState / numéro d'erreur interne SQLite (en sqlite 3)
842 842
  **/
843 843
 function spip_sqlite_errno($serveur = '') {
844
-	$link = _sqlite_link($serveur);
844
+    $link = _sqlite_link($serveur);
845 845
 
846
-	if ($link) {
847
-		$t = $link->errorInfo();
848
-		$s = ltrim($t[0], '0'); // 00000 si pas d'erreur
849
-		if ($s) {
850
-			$s .= ' / ' . $t[1];
851
-		} // ajoute l'erreur du moteur SQLite
852
-	} else {
853
-		$s = ": aucune ressource sqlite (link)";
854
-	}
846
+    if ($link) {
847
+        $t = $link->errorInfo();
848
+        $s = ltrim($t[0], '0'); // 00000 si pas d'erreur
849
+        if ($s) {
850
+            $s .= ' / ' . $t[1];
851
+        } // ajoute l'erreur du moteur SQLite
852
+    } else {
853
+        $s = ": aucune ressource sqlite (link)";
854
+    }
855 855
 
856
-	if ($s) {
857
-		spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
858
-	}
856
+    if ($s) {
857
+        spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
858
+    }
859 859
 
860
-	return $s ? $s : 0;
860
+    return $s ? $s : 0;
861 861
 }
862 862
 
863 863
 
@@ -873,19 +873,19 @@  discard block
 block discarded – undo
873 873
  *     - false si on a pas pu avoir d'explication
874 874
  */
875 875
 function spip_sqlite_explain($query, $serveur = '', $requeter = true) {
876
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
877
-		return array();
878
-	}
876
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
877
+        return array();
878
+    }
879 879
 
880
-	$query = spip_sqlite::traduire_requete($query, $serveur);
881
-	$query = 'EXPLAIN ' . $query;
882
-	if (!$requeter) {
883
-		return $query;
884
-	}
885
-	// on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
886
-	$r = spip_sqlite::executer_requete($query, $serveur, false);
880
+    $query = spip_sqlite::traduire_requete($query, $serveur);
881
+    $query = 'EXPLAIN ' . $query;
882
+    if (!$requeter) {
883
+        return $query;
884
+    }
885
+    // on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
886
+    $r = spip_sqlite::executer_requete($query, $serveur, false);
887 887
 
888
-	return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
888
+    return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
889 889
 }
890 890
 
891 891
 
@@ -902,29 +902,29 @@  discard block
 block discarded – undo
902 902
  */
903 903
 function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true) {
904 904
 
905
-	$link = _sqlite_link($serveur);
906
-	$t = $t ? $t : SPIP_SQLITE3_ASSOC;
905
+    $link = _sqlite_link($serveur);
906
+    $t = $t ? $t : SPIP_SQLITE3_ASSOC;
907 907
 
908
-	$retour = false;
909
-	if ($r) {
910
-		$retour = $r->fetch($t);
911
-	}
908
+    $retour = false;
909
+    if ($r) {
910
+        $retour = $r->fetch($t);
911
+    }
912 912
 
913
-	// Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
914
-	// suppression de 'table.' pour toutes les cles (c'est un peu violent !)
915
-	// c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
916
-	if ($retour
917
-		and strpos(implode('', array_keys($retour)), '.') !== false
918
-	) {
919
-		foreach ($retour as $cle => $val) {
920
-			if (($pos = strpos($cle, '.')) !== false) {
921
-				$retour[substr($cle, $pos + 1)] = &$retour[$cle];
922
-				unset($retour[$cle]);
923
-			}
924
-		}
925
-	}
913
+    // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
914
+    // suppression de 'table.' pour toutes les cles (c'est un peu violent !)
915
+    // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
916
+    if ($retour
917
+        and strpos(implode('', array_keys($retour)), '.') !== false
918
+    ) {
919
+        foreach ($retour as $cle => $val) {
920
+            if (($pos = strpos($cle, '.')) !== false) {
921
+                $retour[substr($cle, $pos + 1)] = &$retour[$cle];
922
+                unset($retour[$cle]);
923
+            }
924
+        }
925
+    }
926 926
 
927
-	return $retour;
927
+    return $retour;
928 928
 }
929 929
 
930 930
 /**
@@ -937,8 +937,8 @@  discard block
 block discarded – undo
937 937
  * @return bool True si déplacement réussi, false sinon.
938 938
  **/
939 939
 function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true) {
940
-	// encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
941
-	return false;
940
+    // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
941
+    return false;
942 942
 }
943 943
 
944 944
 
@@ -954,10 +954,10 @@  discard block
 block discarded – undo
954 954
  * @return bool                True si réussi
955 955
  */
956 956
 function spip_sqlite_free(&$r, $serveur = '', $requeter = true) {
957
-	unset($r);
957
+    unset($r);
958 958
 
959
-	return true;
960
-	//return sqlite_free_result($r);
959
+    return true;
960
+    //return sqlite_free_result($r);
961 961
 }
962 962
 
963 963
 
@@ -972,8 +972,8 @@  discard block
 block discarded – undo
972 972
  * @return void
973 973
  */
974 974
 function spip_sqlite_get_charset($charset = array(), $serveur = '', $requeter = true) {
975
-	//$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
976
-	//return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
975
+    //$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
976
+    //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
977 977
 }
978 978
 
979 979
 
@@ -988,7 +988,7 @@  discard block
 block discarded – undo
988 988
  *     Valeur hexadécimale pour SQLite
989 989
  **/
990 990
 function spip_sqlite_hex($v) {
991
-	return hexdec($v);
991
+    return hexdec($v);
992 992
 }
993 993
 
994 994
 
@@ -1010,7 +1010,7 @@  discard block
 block discarded – undo
1010 1010
  *     Expression de requête SQL
1011 1011
  **/
1012 1012
 function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1013
-	return "($val $not IN ($valeurs))";
1013
+    return "($val $not IN ($valeurs))";
1014 1014
 }
1015 1015
 
1016 1016
 
@@ -1038,20 +1038,20 @@  discard block
 block discarded – undo
1038 1038
  **/
1039 1039
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = array(), $serveur = '', $requeter = true) {
1040 1040
 
1041
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : "DEFAULT VALUES");
1042
-	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1043
-		if (!$requeter) {
1044
-			return $r;
1045
-		}
1046
-		$nb = spip_sqlite::last_insert_id($serveur);
1047
-	} else {
1048
-		$nb = false;
1049
-	}
1041
+    $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : "DEFAULT VALUES");
1042
+    if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1043
+        if (!$requeter) {
1044
+            return $r;
1045
+        }
1046
+        $nb = spip_sqlite::last_insert_id($serveur);
1047
+    } else {
1048
+        $nb = false;
1049
+    }
1050 1050
 
1051
-	$err = spip_sqlite_error($query, $serveur);
1051
+    $err = spip_sqlite_error($query, $serveur);
1052 1052
 
1053
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1054
-	return isset($_GET['var_profile']) ? $r : $nb;
1053
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1054
+    return isset($_GET['var_profile']) ? $r : $nb;
1055 1055
 
1056 1056
 }
1057 1057
 
@@ -1077,28 +1077,28 @@  discard block
 block discarded – undo
1077 1077
  *     - Tableau de description de la requête et du temps d'exécution, si var_profile activé
1078 1078
  **/
1079 1079
 function spip_sqlite_insertq($table, $couples = array(), $desc = array(), $serveur = '', $requeter = true) {
1080
-	if (!$desc) {
1081
-		$desc = description_table($table, $serveur);
1082
-	}
1083
-	if (!$desc) {
1084
-		die("$table insertion sans description");
1085
-	}
1086
-	$fields = isset($desc['field']) ? $desc['field'] : array();
1080
+    if (!$desc) {
1081
+        $desc = description_table($table, $serveur);
1082
+    }
1083
+    if (!$desc) {
1084
+        die("$table insertion sans description");
1085
+    }
1086
+    $fields = isset($desc['field']) ? $desc['field'] : array();
1087 1087
 
1088
-	foreach ($couples as $champ => $val) {
1089
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1090
-	}
1088
+    foreach ($couples as $champ => $val) {
1089
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1090
+    }
1091 1091
 
1092
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1093
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1092
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1093
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1094 1094
 
1095
-	$cles = $valeurs = "";
1096
-	if (count($couples)) {
1097
-		$cles = "(" . join(',', array_keys($couples)) . ")";
1098
-		$valeurs = "(" . join(',', $couples) . ")";
1099
-	}
1095
+    $cles = $valeurs = "";
1096
+    if (count($couples)) {
1097
+        $cles = "(" . join(',', array_keys($couples)) . ")";
1098
+        $valeurs = "(" . join(',', $couples) . ")";
1099
+    }
1100 1100
 
1101
-	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1101
+    return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1102 1102
 }
1103 1103
 
1104 1104
 
@@ -1122,70 +1122,70 @@  discard block
 block discarded – undo
1122 1122
  *     - False en cas d'erreur.
1123 1123
  **/
1124 1124
 function spip_sqlite_insertq_multi($table, $tab_couples = array(), $desc = array(), $serveur = '', $requeter = true) {
1125
-	if (!$desc) {
1126
-		$desc = description_table($table, $serveur);
1127
-	}
1128
-	if (!$desc) {
1129
-		die("$table insertion sans description");
1130
-	}
1131
-	if (!isset($desc['field'])) {
1132
-		$desc['field'] = array();
1133
-	}
1134
-
1135
-	// recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1136
-	$maj = _sqlite_ajouter_champs_timestamp($table, array(), $desc, $serveur);
1137
-
1138
-	// seul le nom de la table est a traduire ici :
1139
-	// le faire une seule fois au debut
1140
-	$query_start = "INSERT INTO $table ";
1141
-	$query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1142
-
1143
-	// ouvrir une transaction
1144
-	if ($requeter) {
1145
-		spip_sqlite::demarrer_transaction($serveur);
1146
-	}
1147
-
1148
-	while ($couples = array_shift($tab_couples)) {
1149
-		foreach ($couples as $champ => $val) {
1150
-			$couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1151
-		}
1152
-
1153
-		// inserer les champs timestamp par defaut
1154
-		$couples = array_merge($maj, $couples);
1155
-
1156
-		$champs = $valeurs = "";
1157
-		if (count($couples)) {
1158
-			$champs = "(" . join(',', array_keys($couples)) . ")";
1159
-			$valeurs = "(" . join(',', $couples) . ")";
1160
-			$query = $query_start . "$champs VALUES $valeurs";
1161
-		} else {
1162
-			$query = $query_start . "DEFAULT VALUES";
1163
-		}
1164
-
1165
-		if ($requeter) {
1166
-			$retour = spip_sqlite::executer_requete($query, $serveur);
1167
-		}
1168
-
1169
-		// sur le dernier couple uniquement
1170
-		if (!count($tab_couples)) {
1171
-			$nb = 0;
1172
-			if ($requeter) {
1173
-				$nb = spip_sqlite::last_insert_id($serveur);
1174
-			} else {
1175
-				return $query;
1176
-			}
1177
-		}
1178
-
1179
-		$err = spip_sqlite_error($query, $serveur);
1180
-	}
1181
-
1182
-	if ($requeter) {
1183
-		spip_sqlite::finir_transaction($serveur);
1184
-	}
1185
-
1186
-	// renvoie le dernier id d'autoincrement ajoute
1187
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1188
-	return isset($_GET['var_profile']) ? $retour : $nb;
1125
+    if (!$desc) {
1126
+        $desc = description_table($table, $serveur);
1127
+    }
1128
+    if (!$desc) {
1129
+        die("$table insertion sans description");
1130
+    }
1131
+    if (!isset($desc['field'])) {
1132
+        $desc['field'] = array();
1133
+    }
1134
+
1135
+    // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1136
+    $maj = _sqlite_ajouter_champs_timestamp($table, array(), $desc, $serveur);
1137
+
1138
+    // seul le nom de la table est a traduire ici :
1139
+    // le faire une seule fois au debut
1140
+    $query_start = "INSERT INTO $table ";
1141
+    $query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1142
+
1143
+    // ouvrir une transaction
1144
+    if ($requeter) {
1145
+        spip_sqlite::demarrer_transaction($serveur);
1146
+    }
1147
+
1148
+    while ($couples = array_shift($tab_couples)) {
1149
+        foreach ($couples as $champ => $val) {
1150
+            $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1151
+        }
1152
+
1153
+        // inserer les champs timestamp par defaut
1154
+        $couples = array_merge($maj, $couples);
1155
+
1156
+        $champs = $valeurs = "";
1157
+        if (count($couples)) {
1158
+            $champs = "(" . join(',', array_keys($couples)) . ")";
1159
+            $valeurs = "(" . join(',', $couples) . ")";
1160
+            $query = $query_start . "$champs VALUES $valeurs";
1161
+        } else {
1162
+            $query = $query_start . "DEFAULT VALUES";
1163
+        }
1164
+
1165
+        if ($requeter) {
1166
+            $retour = spip_sqlite::executer_requete($query, $serveur);
1167
+        }
1168
+
1169
+        // sur le dernier couple uniquement
1170
+        if (!count($tab_couples)) {
1171
+            $nb = 0;
1172
+            if ($requeter) {
1173
+                $nb = spip_sqlite::last_insert_id($serveur);
1174
+            } else {
1175
+                return $query;
1176
+            }
1177
+        }
1178
+
1179
+        $err = spip_sqlite_error($query, $serveur);
1180
+    }
1181
+
1182
+    if ($requeter) {
1183
+        spip_sqlite::finir_transaction($serveur);
1184
+    }
1185
+
1186
+    // renvoie le dernier id d'autoincrement ajoute
1187
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1188
+    return isset($_GET['var_profile']) ? $retour : $nb;
1189 1189
 }
1190 1190
 
1191 1191
 
@@ -1200,7 +1200,7 @@  discard block
 block discarded – undo
1200 1200
  *     Toujours true.
1201 1201
  **/
1202 1202
 function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) {
1203
-	return true;
1203
+    return true;
1204 1204
 }
1205 1205
 
1206 1206
 /**
@@ -1217,12 +1217,12 @@  discard block
 block discarded – undo
1217 1217
  *     string si texte de la requête demandé, true sinon
1218 1218
  **/
1219 1219
 function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true) {
1220
-	if (!$requeter) {
1221
-		return "BEGIN TRANSACTION";
1222
-	}
1223
-	spip_sqlite::demarrer_transaction($serveur);
1220
+    if (!$requeter) {
1221
+        return "BEGIN TRANSACTION";
1222
+    }
1223
+    spip_sqlite::demarrer_transaction($serveur);
1224 1224
 
1225
-	return true;
1225
+    return true;
1226 1226
 }
1227 1227
 
1228 1228
 /**
@@ -1236,12 +1236,12 @@  discard block
 block discarded – undo
1236 1236
  *     string si texte de la requête demandé, true sinon
1237 1237
  **/
1238 1238
 function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) {
1239
-	if (!$requeter) {
1240
-		return "COMMIT";
1241
-	}
1242
-	spip_sqlite::finir_transaction($serveur);
1239
+    if (!$requeter) {
1240
+        return "COMMIT";
1241
+    }
1242
+    spip_sqlite::finir_transaction($serveur);
1243 1243
 
1244
-	return true;
1244
+    return true;
1245 1245
 }
1246 1246
 
1247 1247
 
@@ -1256,27 +1256,27 @@  discard block
 block discarded – undo
1256 1256
  *     Liste des noms de bases
1257 1257
  **/
1258 1258
 function spip_sqlite_listdbs($serveur = '', $requeter = true) {
1259
-	_sqlite_init();
1259
+    _sqlite_init();
1260 1260
 
1261
-	if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1262
-		return array();
1263
-	}
1261
+    if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1262
+        return array();
1263
+    }
1264 1264
 
1265
-	include_spip('inc/flock');
1266
-	$bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1267
-	$bds = array();
1265
+    include_spip('inc/flock');
1266
+    $bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1267
+    $bds = array();
1268 1268
 
1269
-	foreach ($bases as $b) {
1270
-		// pas de bases commencant pas sqlite 
1271
-		// (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1272
-		// les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1273
-		if (strpos($b, '_sqlite')) {
1274
-			continue;
1275
-		}
1276
-		$bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1277
-	}
1269
+    foreach ($bases as $b) {
1270
+        // pas de bases commencant pas sqlite 
1271
+        // (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1272
+        // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1273
+        if (strpos($b, '_sqlite')) {
1274
+            continue;
1275
+        }
1276
+        $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1277
+    }
1278 1278
 
1279
-	return $bds;
1279
+    return $bds;
1280 1280
 }
1281 1281
 
1282 1282
 
@@ -1291,9 +1291,9 @@  discard block
 block discarded – undo
1291 1291
  * @return string       Texte de sélection pour la requête
1292 1292
  */
1293 1293
 function spip_sqlite_multi($objet, $lang) {
1294
-	$r = "EXTRAIRE_MULTI(" . $objet . ", '" . $lang . "') AS multi";
1294
+    $r = "EXTRAIRE_MULTI(" . $objet . ", '" . $lang . "') AS multi";
1295 1295
 
1296
-	return $r;
1296
+    return $r;
1297 1297
 }
1298 1298
 
1299 1299
 
@@ -1310,15 +1310,15 @@  discard block
 block discarded – undo
1310 1310
  * @return bool|string true / false / requete
1311 1311
  **/
1312 1312
 function spip_sqlite_optimize($table, $serveur = '', $requeter = true) {
1313
-	static $do = false;
1314
-	if ($requeter and $do) {
1315
-		return true;
1316
-	}
1317
-	if ($requeter) {
1318
-		$do = true;
1319
-	}
1313
+    static $do = false;
1314
+    if ($requeter and $do) {
1315
+        return true;
1316
+    }
1317
+    if ($requeter) {
1318
+        $do = true;
1319
+    }
1320 1320
 
1321
-	return spip_sqlite_query("VACUUM", $serveur, $requeter);
1321
+    return spip_sqlite_query("VACUUM", $serveur, $requeter);
1322 1322
 }
1323 1323
 
1324 1324
 
@@ -1335,15 +1335,15 @@  discard block
 block discarded – undo
1335 1335
  *    Donnée prête à être utilisée par le gestionnaire SQL
1336 1336
  */
1337 1337
 function spip_sqlite_quote($v, $type = '') {
1338
-	if (!is_array($v)) {
1339
-		return _sqlite_calculer_cite($v, $type);
1340
-	}
1341
-	// si c'est un tableau, le parcourir en propageant le type
1342
-	foreach ($v as $k => $r) {
1343
-		$v[$k] = spip_sqlite_quote($r, $type);
1344
-	}
1338
+    if (!is_array($v)) {
1339
+        return _sqlite_calculer_cite($v, $type);
1340
+    }
1341
+    // si c'est un tableau, le parcourir en propageant le type
1342
+    foreach ($v as $k => $r) {
1343
+        $v[$k] = spip_sqlite_quote($r, $type);
1344
+    }
1345 1345
 
1346
-	return join(",", $v);
1346
+    return join(",", $v);
1347 1347
 }
1348 1348
 
1349 1349
 
@@ -1360,9 +1360,9 @@  discard block
 block discarded – undo
1360 1360
  *     Expression SQL
1361 1361
  **/
1362 1362
 function spip_sqlite_date_proche($champ, $interval, $unite) {
1363
-	$op = (($interval <= 0) ? '>' : '<');
1363
+    $op = (($interval <= 0) ? '>' : '<');
1364 1364
 
1365
-	return "($champ $op datetime('" . date("Y-m-d H:i:s") . "', '$interval $unite'))";
1365
+    return "($champ $op datetime('" . date("Y-m-d H:i:s") . "', '$interval $unite'))";
1366 1366
 }
1367 1367
 
1368 1368
 
@@ -1380,44 +1380,44 @@  discard block
 block discarded – undo
1380 1380
  *     l'état de la table après la réparation
1381 1381
  */
1382 1382
 function spip_sqlite_repair($table, $serveur = '', $requeter = true) {
1383
-	if ($desc = spip_sqlite_showtable($table, $serveur)
1384
-		and isset($desc['field'])
1385
-		and is_array($desc['field'])
1386
-	) {
1387
-		foreach ($desc['field'] as $c => $d) {
1388
-			if (preg_match(",^(tinytext|mediumtext|text|longtext|varchar|char),i", $d)
1389
-				and stripos($d, "NOT NULL") !== false
1390
-				and stripos($d, "DEFAULT") === false
1391
-				/* pas touche aux cles primaires */
1392
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1393
-			) {
1394
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1395
-				spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE);
1396
-			}
1397
-			if (preg_match(",^(INTEGER),i", $d)
1398
-				and stripos($d, "NOT NULL") !== false
1399
-				and stripos($d, "DEFAULT") === false
1400
-				/* pas touche aux cles primaires */
1401
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1402
-			) {
1403
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1404
-				spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE);
1405
-			}
1406
-			if (preg_match(",^(datetime),i", $d)
1407
-				and stripos($d, "NOT NULL") !== false
1408
-				and stripos($d, "DEFAULT") === false
1409
-				/* pas touche aux cles primaires */
1410
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1411
-			) {
1412
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1413
-				spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE);
1414
-			}
1415
-		}
1416
-
1417
-		return array(" OK ");
1418
-	}
1419
-
1420
-	return array(" ERROR ");
1383
+    if ($desc = spip_sqlite_showtable($table, $serveur)
1384
+        and isset($desc['field'])
1385
+        and is_array($desc['field'])
1386
+    ) {
1387
+        foreach ($desc['field'] as $c => $d) {
1388
+            if (preg_match(",^(tinytext|mediumtext|text|longtext|varchar|char),i", $d)
1389
+                and stripos($d, "NOT NULL") !== false
1390
+                and stripos($d, "DEFAULT") === false
1391
+                /* pas touche aux cles primaires */
1392
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1393
+            ) {
1394
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1395
+                spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE);
1396
+            }
1397
+            if (preg_match(",^(INTEGER),i", $d)
1398
+                and stripos($d, "NOT NULL") !== false
1399
+                and stripos($d, "DEFAULT") === false
1400
+                /* pas touche aux cles primaires */
1401
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1402
+            ) {
1403
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1404
+                spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE);
1405
+            }
1406
+            if (preg_match(",^(datetime),i", $d)
1407
+                and stripos($d, "NOT NULL") !== false
1408
+                and stripos($d, "DEFAULT") === false
1409
+                /* pas touche aux cles primaires */
1410
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1411
+            ) {
1412
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1413
+                spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE);
1414
+            }
1415
+        }
1416
+
1417
+        return array(" OK ");
1418
+    }
1419
+
1420
+    return array(" ERROR ");
1421 1421
 }
1422 1422
 
1423 1423
 
@@ -1446,23 +1446,23 @@  discard block
 block discarded – undo
1446 1446
  *     - False en cas d'erreur.
1447 1447
  **/
1448 1448
 function spip_sqlite_replace($table, $couples, $desc = array(), $serveur = '', $requeter = true) {
1449
-	if (!$desc) {
1450
-		$desc = description_table($table, $serveur);
1451
-	}
1452
-	if (!$desc) {
1453
-		die("$table insertion sans description");
1454
-	}
1455
-	$fields = isset($desc['field']) ? $desc['field'] : array();
1449
+    if (!$desc) {
1450
+        $desc = description_table($table, $serveur);
1451
+    }
1452
+    if (!$desc) {
1453
+        die("$table insertion sans description");
1454
+    }
1455
+    $fields = isset($desc['field']) ? $desc['field'] : array();
1456 1456
 
1457
-	foreach ($couples as $champ => $val) {
1458
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1459
-	}
1457
+    foreach ($couples as $champ => $val) {
1458
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1459
+    }
1460 1460
 
1461
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1462
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1461
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1462
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1463 1463
 
1464
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(',',
1465
-			$couples) . ')', $serveur);
1464
+    return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(',',
1465
+            $couples) . ')', $serveur);
1466 1466
 }
1467 1467
 
1468 1468
 
@@ -1492,13 +1492,13 @@  discard block
 block discarded – undo
1492 1492
  **/
1493 1493
 function spip_sqlite_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', $requeter = true) {
1494 1494
 
1495
-	// boucler pour trainter chaque requete independemment
1496
-	foreach ($tab_couples as $couples) {
1497
-		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1498
-	}
1495
+    // boucler pour trainter chaque requete independemment
1496
+    foreach ($tab_couples as $couples) {
1497
+        $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1498
+    }
1499 1499
 
1500
-	// renvoie le dernier id
1501
-	return $retour;
1500
+    // renvoie le dernier id
1501
+    return $retour;
1502 1502
 }
1503 1503
 
1504 1504
 
@@ -1525,44 +1525,44 @@  discard block
 block discarded – undo
1525 1525
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1526 1526
  */
1527 1527
 function spip_sqlite_select(
1528
-	$select,
1529
-	$from,
1530
-	$where = '',
1531
-	$groupby = '',
1532
-	$orderby = '',
1533
-	$limit = '',
1534
-	$having = '',
1535
-	$serveur = '',
1536
-	$requeter = true
1528
+    $select,
1529
+    $from,
1530
+    $where = '',
1531
+    $groupby = '',
1532
+    $orderby = '',
1533
+    $limit = '',
1534
+    $having = '',
1535
+    $serveur = '',
1536
+    $requeter = true
1537 1537
 ) {
1538 1538
 
1539
-	// version() n'est pas connu de sqlite
1540
-	$select = str_replace('version()', 'sqlite_version()', $select);
1539
+    // version() n'est pas connu de sqlite
1540
+    $select = str_replace('version()', 'sqlite_version()', $select);
1541 1541
 
1542
-	// recomposer from
1543
-	$from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1542
+    // recomposer from
1543
+    $from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1544 1544
 
1545
-	$query =
1546
-		_sqlite_calculer_expression('SELECT', $select, ', ')
1547
-		. _sqlite_calculer_expression('FROM', $from, ', ')
1548
-		. _sqlite_calculer_expression('WHERE', $where)
1549
-		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1550
-		. _sqlite_calculer_expression('HAVING', $having)
1551
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1552
-		. ($limit ? "\nLIMIT $limit" : '');
1545
+    $query =
1546
+        _sqlite_calculer_expression('SELECT', $select, ', ')
1547
+        . _sqlite_calculer_expression('FROM', $from, ', ')
1548
+        . _sqlite_calculer_expression('WHERE', $where)
1549
+        . _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1550
+        . _sqlite_calculer_expression('HAVING', $having)
1551
+        . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1552
+        . ($limit ? "\nLIMIT $limit" : '');
1553 1553
 
1554
-	// dans un select, on doit renvoyer la requête en cas d'erreur
1555
-	$res = spip_sqlite_query($query, $serveur, $requeter);
1556
-	// texte de la requete demande ?
1557
-	if (!$requeter) {
1558
-		return $res;
1559
-	}
1560
-	// erreur survenue ?
1561
-	if ($res === false) {
1562
-		return spip_sqlite::traduire_requete($query, $serveur);
1563
-	}
1554
+    // dans un select, on doit renvoyer la requête en cas d'erreur
1555
+    $res = spip_sqlite_query($query, $serveur, $requeter);
1556
+    // texte de la requete demande ?
1557
+    if (!$requeter) {
1558
+        return $res;
1559
+    }
1560
+    // erreur survenue ?
1561
+    if ($res === false) {
1562
+        return spip_sqlite::traduire_requete($query, $serveur);
1563
+    }
1564 1564
 
1565
-	return $res;
1565
+    return $res;
1566 1566
 }
1567 1567
 
1568 1568
 
@@ -1581,31 +1581,31 @@  discard block
 block discarded – undo
1581 1581
  *     - False en cas d'erreur.
1582 1582
  **/
1583 1583
 function spip_sqlite_selectdb($db, $serveur = '', $requeter = true) {
1584
-	_sqlite_init();
1584
+    _sqlite_init();
1585 1585
 
1586
-	// interdire la creation d'une nouvelle base, 
1587
-	// sauf si on est dans l'installation
1588
-	if (!is_file($f = _DIR_DB . $db . '.sqlite')
1589
-		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1590
-	) {
1591
-		spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1586
+    // interdire la creation d'une nouvelle base, 
1587
+    // sauf si on est dans l'installation
1588
+    if (!is_file($f = _DIR_DB . $db . '.sqlite')
1589
+        && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1590
+    ) {
1591
+        spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1592 1592
 
1593
-		return false;
1594
-	}
1593
+        return false;
1594
+    }
1595 1595
 
1596
-	// se connecter a la base indiquee
1597
-	// avec les identifiants connus
1598
-	$index = $serveur ? $serveur : 0;
1596
+    // se connecter a la base indiquee
1597
+    // avec les identifiants connus
1598
+    $index = $serveur ? $serveur : 0;
1599 1599
 
1600
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1601
-		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1602
-			return $db;
1603
-		}
1604
-	} else {
1605
-		spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1600
+    if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1601
+        if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1602
+            return $db;
1603
+        }
1604
+    } else {
1605
+        spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1606 1606
 
1607
-		return false;
1608
-	}
1607
+        return false;
1608
+    }
1609 1609
 
1610 1610
 }
1611 1611
 
@@ -1621,8 +1621,8 @@  discard block
 block discarded – undo
1621 1621
  * @return void
1622 1622
  */
1623 1623
 function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true) {
1624
-	# spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1625
-	# return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1624
+    # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1625
+    # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1626 1626
 }
1627 1627
 
1628 1628
 
@@ -1640,21 +1640,21 @@  discard block
 block discarded – undo
1640 1640
  *     Ressource à utiliser avec sql_fetch()
1641 1641
  **/
1642 1642
 function spip_sqlite_showbase($match, $serveur = '', $requeter = true) {
1643
-	// type est le type d'entrée : table / index / view
1644
-	// on ne retourne que les tables (?) et non les vues...
1645
-	# ESCAPE non supporte par les versions sqlite <3
1646
-	#	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1647
-	$match = preg_quote($match);
1648
-	$match = str_replace("\\\_", "[[TIRETBAS]]", $match);
1649
-	$match = str_replace("\\\%", "[[POURCENT]]", $match);
1650
-	$match = str_replace("_", ".", $match);
1651
-	$match = str_replace("%", ".*", $match);
1652
-	$match = str_replace("[[TIRETBAS]]", "_", $match);
1653
-	$match = str_replace("[[POURCENT]]", "%", $match);
1654
-	$match = "^$match$";
1655
-
1656
-	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1657
-		$serveur, $requeter);
1643
+    // type est le type d'entrée : table / index / view
1644
+    // on ne retourne que les tables (?) et non les vues...
1645
+    # ESCAPE non supporte par les versions sqlite <3
1646
+    #	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1647
+    $match = preg_quote($match);
1648
+    $match = str_replace("\\\_", "[[TIRETBAS]]", $match);
1649
+    $match = str_replace("\\\%", "[[POURCENT]]", $match);
1650
+    $match = str_replace("_", ".", $match);
1651
+    $match = str_replace("%", ".*", $match);
1652
+    $match = str_replace("[[TIRETBAS]]", "_", $match);
1653
+    $match = str_replace("[[POURCENT]]", "%", $match);
1654
+    $match = "^$match$";
1655
+
1656
+    return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1657
+        $serveur, $requeter);
1658 1658
 }
1659 1659
 
1660 1660
 define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -1677,129 +1677,129 @@  discard block
 block discarded – undo
1677 1677
  *     - array description de la table sinon
1678 1678
  */
1679 1679
 function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true) {
1680
-	$query =
1681
-		'SELECT sql, type FROM'
1682
-		. ' (SELECT * FROM sqlite_master UNION ALL'
1683
-		. ' SELECT * FROM sqlite_temp_master)'
1684
-		. " WHERE tbl_name LIKE '$nom_table'"
1685
-		. " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1686
-		. ' ORDER BY substr(type,2,1), name';
1687
-
1688
-	$a = spip_sqlite_query($query, $serveur, $requeter);
1689
-	if (!$a) {
1690
-		return "";
1691
-	}
1692
-	if (!$requeter) {
1693
-		return $a;
1694
-	}
1695
-	if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1696
-		return "";
1697
-	}
1698
-	$vue = ($a['type'] == 'view'); // table | vue
1699
-
1700
-	// c'est une table
1701
-	// il faut parser le create
1702
-	if (!$vue) {
1703
-		if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1704
-			return "";
1705
-		} else {
1706
-			$desc = $r[1];
1707
-			// extraction d'une KEY éventuelle en prenant garde de ne pas
1708
-			// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1709
-			if (preg_match("/^(.*?),([^,]*\sKEY[ (].*)$/s", $desc, $r)) {
1710
-				$namedkeys = $r[2];
1711
-				$desc = $r[1];
1712
-			} else {
1713
-				$namedkeys = "";
1714
-			}
1715
-
1716
-			$fields = array();
1717
-			$keys = array();
1718
-
1719
-			// enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1720
-			// par exemple s'il contiennent une virgule.
1721
-			// /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1722
-			list($desc, $echaps) = query_echappe_textes($desc);
1723
-
1724
-			// separer toutes les descriptions de champs, separes par des virgules
1725
-			# /!\ explode peut exploser aussi DECIMAL(10,2) !
1726
-			$k_precedent = null;
1727
-			foreach (explode(",", $desc) as $v) {
1728
-
1729
-				preg_match("/^\s*([^\s]+)\s+(.*)/", $v, $r);
1730
-				// Les cles de champs peuvent etre entourees
1731
-				// de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1732
-				// http://www.sqlite.org/lang_keywords.html
1733
-				$k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1734
-				if ($char = strpbrk($k[0], '\'"[`')) {
1735
-					$k = trim($k, $char);
1736
-					if ($char == '[') {
1737
-						$k = rtrim($k, ']');
1738
-					}
1739
-				}
1740
-				$def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1741
-
1742
-				# rustine pour DECIMAL(10,2)
1743
-				if (false !== strpos($k, ')')) {
1744
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1745
-					continue;
1746
-				}
1747
-
1748
-				// la primary key peut etre dans une des descriptions de champs
1749
-				// et non en fin de table, cas encore decouvert avec Sqlite Manager
1750
-				if (stripos($r[2], 'PRIMARY KEY') !== false) {
1751
-					$keys['PRIMARY KEY'] = $k;
1752
-				}
1753
-
1754
-				$fields[$k] = $def;
1755
-				$k_precedent = $k;
1756
-			}
1757
-			// key inclues dans la requete
1758
-			foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1759
-				if (preg_match("/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/", $v, $r)) {
1760
-					$k = str_replace("`", '', trim($r[1]));
1761
-					$t = trim(strtolower(str_replace("`", '', $r[2])), '"');
1762
-					if ($k && !isset($keys[$k])) {
1763
-						$keys[$k] = $t;
1764
-					} else {
1765
-						$keys[] = $t;
1766
-					}
1767
-				}
1768
-			}
1769
-			// sinon ajouter les key index
1770
-			$query =
1771
-				'SELECT name,sql FROM'
1772
-				. ' (SELECT * FROM sqlite_master UNION ALL'
1773
-				. ' SELECT * FROM sqlite_temp_master)'
1774
-				. " WHERE tbl_name LIKE '$nom_table'"
1775
-				. " AND type='index' AND name NOT LIKE 'sqlite_%'"
1776
-				. 'ORDER BY substr(type,2,1), name';
1777
-			$a = spip_sqlite_query($query, $serveur, $requeter);
1778
-			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1779
-				$key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1780
-				$keytype = "KEY";
1781
-				if (strpos($r['sql'], "UNIQUE INDEX") !== false) {
1782
-					$keytype = "UNIQUE KEY";
1783
-				}
1784
-				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1785
-				$keys[$keytype . ' ' . $key] = $colonnes;
1786
-			}
1787
-		}
1788
-
1789
-	} // c'est une vue, on liste les champs disponibles simplement
1790
-	else {
1791
-		if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1792
-			$fields = array();
1793
-			foreach ($res as $c => $v) {
1794
-				$fields[$c] = '';
1795
-			}
1796
-			$keys = array();
1797
-		} else {
1798
-			return "";
1799
-		}
1800
-	}
1801
-
1802
-	return array('field' => $fields, 'key' => $keys);
1680
+    $query =
1681
+        'SELECT sql, type FROM'
1682
+        . ' (SELECT * FROM sqlite_master UNION ALL'
1683
+        . ' SELECT * FROM sqlite_temp_master)'
1684
+        . " WHERE tbl_name LIKE '$nom_table'"
1685
+        . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1686
+        . ' ORDER BY substr(type,2,1), name';
1687
+
1688
+    $a = spip_sqlite_query($query, $serveur, $requeter);
1689
+    if (!$a) {
1690
+        return "";
1691
+    }
1692
+    if (!$requeter) {
1693
+        return $a;
1694
+    }
1695
+    if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1696
+        return "";
1697
+    }
1698
+    $vue = ($a['type'] == 'view'); // table | vue
1699
+
1700
+    // c'est une table
1701
+    // il faut parser le create
1702
+    if (!$vue) {
1703
+        if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1704
+            return "";
1705
+        } else {
1706
+            $desc = $r[1];
1707
+            // extraction d'une KEY éventuelle en prenant garde de ne pas
1708
+            // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1709
+            if (preg_match("/^(.*?),([^,]*\sKEY[ (].*)$/s", $desc, $r)) {
1710
+                $namedkeys = $r[2];
1711
+                $desc = $r[1];
1712
+            } else {
1713
+                $namedkeys = "";
1714
+            }
1715
+
1716
+            $fields = array();
1717
+            $keys = array();
1718
+
1719
+            // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1720
+            // par exemple s'il contiennent une virgule.
1721
+            // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1722
+            list($desc, $echaps) = query_echappe_textes($desc);
1723
+
1724
+            // separer toutes les descriptions de champs, separes par des virgules
1725
+            # /!\ explode peut exploser aussi DECIMAL(10,2) !
1726
+            $k_precedent = null;
1727
+            foreach (explode(",", $desc) as $v) {
1728
+
1729
+                preg_match("/^\s*([^\s]+)\s+(.*)/", $v, $r);
1730
+                // Les cles de champs peuvent etre entourees
1731
+                // de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1732
+                // http://www.sqlite.org/lang_keywords.html
1733
+                $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1734
+                if ($char = strpbrk($k[0], '\'"[`')) {
1735
+                    $k = trim($k, $char);
1736
+                    if ($char == '[') {
1737
+                        $k = rtrim($k, ']');
1738
+                    }
1739
+                }
1740
+                $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1741
+
1742
+                # rustine pour DECIMAL(10,2)
1743
+                if (false !== strpos($k, ')')) {
1744
+                    $fields[$k_precedent] .= ',' . $k . ' ' . $def;
1745
+                    continue;
1746
+                }
1747
+
1748
+                // la primary key peut etre dans une des descriptions de champs
1749
+                // et non en fin de table, cas encore decouvert avec Sqlite Manager
1750
+                if (stripos($r[2], 'PRIMARY KEY') !== false) {
1751
+                    $keys['PRIMARY KEY'] = $k;
1752
+                }
1753
+
1754
+                $fields[$k] = $def;
1755
+                $k_precedent = $k;
1756
+            }
1757
+            // key inclues dans la requete
1758
+            foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1759
+                if (preg_match("/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/", $v, $r)) {
1760
+                    $k = str_replace("`", '', trim($r[1]));
1761
+                    $t = trim(strtolower(str_replace("`", '', $r[2])), '"');
1762
+                    if ($k && !isset($keys[$k])) {
1763
+                        $keys[$k] = $t;
1764
+                    } else {
1765
+                        $keys[] = $t;
1766
+                    }
1767
+                }
1768
+            }
1769
+            // sinon ajouter les key index
1770
+            $query =
1771
+                'SELECT name,sql FROM'
1772
+                . ' (SELECT * FROM sqlite_master UNION ALL'
1773
+                . ' SELECT * FROM sqlite_temp_master)'
1774
+                . " WHERE tbl_name LIKE '$nom_table'"
1775
+                . " AND type='index' AND name NOT LIKE 'sqlite_%'"
1776
+                . 'ORDER BY substr(type,2,1), name';
1777
+            $a = spip_sqlite_query($query, $serveur, $requeter);
1778
+            while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1779
+                $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1780
+                $keytype = "KEY";
1781
+                if (strpos($r['sql'], "UNIQUE INDEX") !== false) {
1782
+                    $keytype = "UNIQUE KEY";
1783
+                }
1784
+                $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1785
+                $keys[$keytype . ' ' . $key] = $colonnes;
1786
+            }
1787
+        }
1788
+
1789
+    } // c'est une vue, on liste les champs disponibles simplement
1790
+    else {
1791
+        if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1792
+            $fields = array();
1793
+            foreach ($res as $c => $v) {
1794
+                $fields[$c] = '';
1795
+            }
1796
+            $keys = array();
1797
+        } else {
1798
+            return "";
1799
+        }
1800
+    }
1801
+
1802
+    return array('field' => $fields, 'key' => $keys);
1803 1803
 
1804 1804
 }
1805 1805
 
@@ -1826,20 +1826,20 @@  discard block
 block discarded – undo
1826 1826
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1827 1827
  */
1828 1828
 function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true) {
1829
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1830
-	$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1829
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1830
+    $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1831 1831
 
1832
-	$set = array();
1833
-	foreach ($champs as $champ => $val) {
1834
-		$set[] = $champ . "=$val";
1835
-	}
1836
-	if (!empty($set)) {
1837
-		return spip_sqlite_query(
1838
-			_sqlite_calculer_expression('UPDATE', $table, ',')
1839
-			. _sqlite_calculer_expression('SET', $set, ',')
1840
-			. _sqlite_calculer_expression('WHERE', $where),
1841
-			$serveur, $requeter);
1842
-	}
1832
+    $set = array();
1833
+    foreach ($champs as $champ => $val) {
1834
+        $set[] = $champ . "=$val";
1835
+    }
1836
+    if (!empty($set)) {
1837
+        return spip_sqlite_query(
1838
+            _sqlite_calculer_expression('UPDATE', $table, ',')
1839
+            . _sqlite_calculer_expression('SET', $set, ',')
1840
+            . _sqlite_calculer_expression('WHERE', $where),
1841
+            $serveur, $requeter);
1842
+    }
1843 1843
 }
1844 1844
 
1845 1845
 
@@ -1869,30 +1869,30 @@  discard block
 block discarded – undo
1869 1869
  */
1870 1870
 function spip_sqlite_updateq($table, $champs, $where = '', $desc = array(), $serveur = '', $requeter = true) {
1871 1871
 
1872
-	if (!$champs) {
1873
-		return;
1874
-	}
1875
-	if (!$desc) {
1876
-		$desc = description_table($table, $serveur);
1877
-	}
1878
-	if (!$desc) {
1879
-		die("$table insertion sans description");
1880
-	}
1881
-	$fields = $desc['field'];
1872
+    if (!$champs) {
1873
+        return;
1874
+    }
1875
+    if (!$desc) {
1876
+        $desc = description_table($table, $serveur);
1877
+    }
1878
+    if (!$desc) {
1879
+        die("$table insertion sans description");
1880
+    }
1881
+    $fields = $desc['field'];
1882 1882
 
1883
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1884
-	$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1883
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1884
+    $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1885 1885
 
1886
-	$set = array();
1887
-	foreach ($champs as $champ => $val) {
1888
-		$set[] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1889
-	}
1886
+    $set = array();
1887
+    foreach ($champs as $champ => $val) {
1888
+        $set[] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1889
+    }
1890 1890
 
1891
-	return spip_sqlite_query(
1892
-		_sqlite_calculer_expression('UPDATE', $table, ',')
1893
-		. _sqlite_calculer_expression('SET', $set, ',')
1894
-		. _sqlite_calculer_expression('WHERE', $where),
1895
-		$serveur, $requeter);
1891
+    return spip_sqlite_query(
1892
+        _sqlite_calculer_expression('UPDATE', $table, ',')
1893
+        . _sqlite_calculer_expression('SET', $set, ',')
1894
+        . _sqlite_calculer_expression('WHERE', $where),
1895
+        $serveur, $requeter);
1896 1896
 }
1897 1897
 
1898 1898
 
@@ -1910,17 +1910,17 @@  discard block
 block discarded – undo
1910 1910
  * @return void
1911 1911
  */
1912 1912
 function _sqlite_init() {
1913
-	if (!defined('_DIR_DB')) {
1914
-		define('_DIR_DB', _DIR_ETC . 'bases/');
1915
-	}
1916
-	if (!defined('_SQLITE_CHMOD')) {
1917
-		define('_SQLITE_CHMOD', _SPIP_CHMOD);
1918
-	}
1913
+    if (!defined('_DIR_DB')) {
1914
+        define('_DIR_DB', _DIR_ETC . 'bases/');
1915
+    }
1916
+    if (!defined('_SQLITE_CHMOD')) {
1917
+        define('_SQLITE_CHMOD', _SPIP_CHMOD);
1918
+    }
1919 1919
 
1920
-	if (!is_dir($d = _DIR_DB)) {
1921
-		include_spip('inc/flock');
1922
-		sous_repertoire($d);
1923
-	}
1920
+    if (!is_dir($d = _DIR_DB)) {
1921
+        include_spip('inc/flock');
1922
+        sous_repertoire($d);
1923
+    }
1924 1924
 }
1925 1925
 
1926 1926
 
@@ -1934,20 +1934,20 @@  discard block
 block discarded – undo
1934 1934
  * @return bool|int
1935 1935
  */
1936 1936
 function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true) {
1937
-	if ($link === '') {
1938
-		$link = _sqlite_link($serveur);
1939
-	}
1940
-	if (!$link) {
1941
-		return false;
1942
-	}
1937
+    if ($link === '') {
1938
+        $link = _sqlite_link($serveur);
1939
+    }
1940
+    if (!$link) {
1941
+        return false;
1942
+    }
1943 1943
 
1944
-	$v = 3;
1944
+    $v = 3;
1945 1945
 
1946
-	if (!$version) {
1947
-		return $v;
1948
-	}
1946
+    if (!$version) {
1947
+        return $v;
1948
+    }
1949 1949
 
1950
-	return ($version == $v);
1950
+    return ($version == $v);
1951 1951
 }
1952 1952
 
1953 1953
 
@@ -1958,9 +1958,9 @@  discard block
 block discarded – undo
1958 1958
  * @return Object Information de connexion pour SQLite
1959 1959
  */
1960 1960
 function _sqlite_link($serveur = '') {
1961
-	$link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
1961
+    $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
1962 1962
 
1963
-	return $link;
1963
+    return $link;
1964 1964
 }
1965 1965
 
1966 1966
 
@@ -1975,48 +1975,48 @@  discard block
 block discarded – undo
1975 1975
  * @return string|number     Texte ou nombre échappé
1976 1976
  */
1977 1977
 function _sqlite_calculer_cite($v, $type) {
1978
-	if ($type) {
1979
-		if (is_null($v)
1980
-			and stripos($type, "NOT NULL") === false
1981
-		) {
1982
-			return 'NULL';
1983
-		} // null php se traduit en NULL SQL
1984
-
1985
-		if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
1986
-			return $v;
1987
-		}
1988
-		if (sql_test_int($type)) {
1989
-			if (is_numeric($v)) {
1990
-				return $v;
1991
-			} elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
1992
-				return hexdec(substr($v, 2));
1993
-			} else {
1994
-				return intval($v);
1995
-			}
1996
-		}
1997
-	} else {
1998
-		// si on ne connait pas le type on le deduit de $v autant que possible
1999
-		if (is_numeric($v)) {
2000
-			return strval($v);
2001
-		}
2002
-	}
2003
-
2004
-	// trouver un link sqlite pour faire l'echappement
2005
-	foreach ($GLOBALS['connexions'] as $s) {
2006
-		if (
2007
-			$l = $s['link']
2008
-			and is_object($l)
2009
-			and $l instanceof \PDO
2010
-			and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2011
-		) {
2012
-			return $l->quote($v);
2013
-		}
2014
-	}
2015
-
2016
-	// echapper les ' en ''
2017
-	spip_log("Pas de methode ->quote pour echapper", "sqlite." . _LOG_INFO_IMPORTANTE);
2018
-
2019
-	return ("'" . str_replace("'", "''", $v) . "'");
1978
+    if ($type) {
1979
+        if (is_null($v)
1980
+            and stripos($type, "NOT NULL") === false
1981
+        ) {
1982
+            return 'NULL';
1983
+        } // null php se traduit en NULL SQL
1984
+
1985
+        if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
1986
+            return $v;
1987
+        }
1988
+        if (sql_test_int($type)) {
1989
+            if (is_numeric($v)) {
1990
+                return $v;
1991
+            } elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
1992
+                return hexdec(substr($v, 2));
1993
+            } else {
1994
+                return intval($v);
1995
+            }
1996
+        }
1997
+    } else {
1998
+        // si on ne connait pas le type on le deduit de $v autant que possible
1999
+        if (is_numeric($v)) {
2000
+            return strval($v);
2001
+        }
2002
+    }
2003
+
2004
+    // trouver un link sqlite pour faire l'echappement
2005
+    foreach ($GLOBALS['connexions'] as $s) {
2006
+        if (
2007
+            $l = $s['link']
2008
+            and is_object($l)
2009
+            and $l instanceof \PDO
2010
+            and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2011
+        ) {
2012
+            return $l->quote($v);
2013
+        }
2014
+    }
2015
+
2016
+    // echapper les ' en ''
2017
+    spip_log("Pas de methode ->quote pour echapper", "sqlite." . _LOG_INFO_IMPORTANTE);
2018
+
2019
+    return ("'" . str_replace("'", "''", $v) . "'");
2020 2020
 }
2021 2021
 
2022 2022
 
@@ -2032,21 +2032,21 @@  discard block
 block discarded – undo
2032 2032
  * @return string            Texte de l'expression, une partie donc, du texte la requête.
2033 2033
  */
2034 2034
 function _sqlite_calculer_expression($expression, $v, $join = 'AND') {
2035
-	if (empty($v)) {
2036
-		return '';
2037
-	}
2035
+    if (empty($v)) {
2036
+        return '';
2037
+    }
2038 2038
 
2039
-	$exp = "\n$expression ";
2039
+    $exp = "\n$expression ";
2040 2040
 
2041
-	if (!is_array($v)) {
2042
-		return $exp . $v;
2043
-	} else {
2044
-		if (strtoupper($join) === 'AND') {
2045
-			return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2046
-		} else {
2047
-			return $exp . join($join, $v);
2048
-		}
2049
-	}
2041
+    if (!is_array($v)) {
2042
+        return $exp . $v;
2043
+    } else {
2044
+        if (strtoupper($join) === 'AND') {
2045
+            return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2046
+        } else {
2047
+            return $exp . join($join, $v);
2048
+        }
2049
+    }
2050 2050
 }
2051 2051
 
2052 2052
 
@@ -2062,7 +2062,7 @@  discard block
 block discarded – undo
2062 2062
  * @return string Texte du orderby préparé
2063 2063
  */
2064 2064
 function _sqlite_calculer_order($orderby) {
2065
-	return (is_array($orderby)) ? join(", ", $orderby) : $orderby;
2065
+    return (is_array($orderby)) ? join(", ", $orderby) : $orderby;
2066 2066
 }
2067 2067
 
2068 2068
 
@@ -2073,26 +2073,26 @@  discard block
 block discarded – undo
2073 2073
  * @return string Sélection de colonnes pour une clause SELECT
2074 2074
  */
2075 2075
 function _sqlite_calculer_select_as($args) {
2076
-	$res = '';
2077
-	foreach ($args as $k => $v) {
2078
-		if (substr($k, -1) == '@') {
2079
-			// c'est une jointure qui se refere au from precedent
2080
-			// pas de virgule
2081
-			$res .= '  ' . $v;
2082
-		} else {
2083
-			if (!is_numeric($k)) {
2084
-				$p = strpos($v, " ");
2085
-				if ($p) {
2086
-					$v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2087
-				} else {
2088
-					$v .= " AS '$k'";
2089
-				}
2090
-			}
2091
-			$res .= ', ' . $v;
2092
-		}
2093
-	}
2094
-
2095
-	return substr($res, 2);
2076
+    $res = '';
2077
+    foreach ($args as $k => $v) {
2078
+        if (substr($k, -1) == '@') {
2079
+            // c'est une jointure qui se refere au from precedent
2080
+            // pas de virgule
2081
+            $res .= '  ' . $v;
2082
+        } else {
2083
+            if (!is_numeric($k)) {
2084
+                $p = strpos($v, " ");
2085
+                if ($p) {
2086
+                    $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2087
+                } else {
2088
+                    $v .= " AS '$k'";
2089
+                }
2090
+            }
2091
+            $res .= ', ' . $v;
2092
+        }
2093
+    }
2094
+
2095
+    return substr($res, 2);
2096 2096
 }
2097 2097
 
2098 2098
 
@@ -2115,26 +2115,26 @@  discard block
 block discarded – undo
2115 2115
  *     Contrainte pour clause WHERE
2116 2116
  */
2117 2117
 function _sqlite_calculer_where($v) {
2118
-	if (!is_array($v)) {
2119
-		return $v;
2120
-	}
2121
-
2122
-	$op = array_shift($v);
2123
-	if (!($n = count($v))) {
2124
-		return $op;
2125
-	} else {
2126
-		$arg = _sqlite_calculer_where(array_shift($v));
2127
-		if ($n == 1) {
2128
-			return "$op($arg)";
2129
-		} else {
2130
-			$arg2 = _sqlite_calculer_where(array_shift($v));
2131
-			if ($n == 2) {
2132
-				return "($arg $op $arg2)";
2133
-			} else {
2134
-				return "($arg $op ($arg2) : $v[0])";
2135
-			}
2136
-		}
2137
-	}
2118
+    if (!is_array($v)) {
2119
+        return $v;
2120
+    }
2121
+
2122
+    $op = array_shift($v);
2123
+    if (!($n = count($v))) {
2124
+        return $op;
2125
+    } else {
2126
+        $arg = _sqlite_calculer_where(array_shift($v));
2127
+        if ($n == 1) {
2128
+            return "$op($arg)";
2129
+        } else {
2130
+            $arg2 = _sqlite_calculer_where(array_shift($v));
2131
+            if ($n == 2) {
2132
+                return "($arg $op $arg2)";
2133
+            } else {
2134
+                return "($arg $op ($arg2) : $v[0])";
2135
+            }
2136
+        }
2137
+    }
2138 2138
 }
2139 2139
 
2140 2140
 
@@ -2149,19 +2149,19 @@  discard block
 block discarded – undo
2149 2149
  * @return array|bool
2150 2150
  */
2151 2151
 function _sqlite_charger_version($version = '') {
2152
-	$versions = array();
2152
+    $versions = array();
2153 2153
 
2154
-	// version 3
2155
-	if (!$version || $version == 3) {
2156
-		if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2157
-			$versions[] = 3;
2158
-		}
2159
-	}
2160
-	if ($version) {
2161
-		return in_array($version, $versions);
2162
-	}
2154
+    // version 3
2155
+    if (!$version || $version == 3) {
2156
+        if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2157
+            $versions[] = 3;
2158
+        }
2159
+    }
2160
+    if ($version) {
2161
+        return in_array($version, $versions);
2162
+    }
2163 2163
 
2164
-	return $versions;
2164
+    return $versions;
2165 2165
 }
2166 2166
 
2167 2167
 
@@ -2199,146 +2199,146 @@  discard block
 block discarded – undo
2199 2199
  */
2200 2200
 function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = '') {
2201 2201
 
2202
-	if (is_array($table)) {
2203
-		$table_destination = reset($table);
2204
-		$table_origine = key($table);
2205
-	} else {
2206
-		$table_origine = $table_destination = $table;
2207
-	}
2208
-	// ne prend actuellement qu'un changement
2209
-	// mais pourra etre adapte pour changer plus qu'une colonne a la fois
2210
-	if (is_array($colonne)) {
2211
-		$colonne_destination = reset($colonne);
2212
-		$colonne_origine = key($colonne);
2213
-	} else {
2214
-		$colonne_origine = $colonne_destination = $colonne;
2215
-	}
2216
-	if (!isset($opt['field'])) {
2217
-		$opt['field'] = array();
2218
-	}
2219
-	if (!isset($opt['key'])) {
2220
-		$opt['key'] = array();
2221
-	}
2222
-
2223
-	// si les noms de tables sont differents, pas besoin de table temporaire
2224
-	// on prendra directement le nom de la future table
2225
-	$meme_table = ($table_origine == $table_destination);
2226
-
2227
-	$def_origine = sql_showtable($table_origine, false, $serveur);
2228
-	if (!$def_origine or !isset($def_origine['field'])) {
2229
-		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2230
-
2231
-		return false;
2232
-	}
2233
-
2234
-
2235
-	$table_tmp = $table_origine . '_tmp';
2236
-
2237
-	// 1) creer une table temporaire avec les modifications	
2238
-	// - DROP : suppression de la colonne
2239
-	// - CHANGE : modification de la colonne
2240
-	// (foreach pour conserver l'ordre des champs)
2241
-
2242
-	// field 
2243
-	$fields = array();
2244
-	// pour le INSERT INTO plus loin
2245
-	// stocker la correspondance nouvelles->anciennes colonnes
2246
-	$fields_correspondances = array();
2247
-	foreach ($def_origine['field'] as $c => $d) {
2248
-
2249
-		if ($colonne_origine && ($c == $colonne_origine)) {
2250
-			// si pas DROP
2251
-			if ($colonne_destination) {
2252
-				$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2253
-				$fields_correspondances[$colonne_destination] = $c;
2254
-			}
2255
-		} else {
2256
-			$fields[$c] = $d;
2257
-			$fields_correspondances[$c] = $c;
2258
-		}
2259
-	}
2260
-	// cas de ADD sqlite2 (ajout du champ en fin de table):
2261
-	if (!$colonne_origine && $colonne_destination) {
2262
-		$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2263
-	}
2264
-
2265
-	// key...
2266
-	$keys = array();
2267
-	foreach ($def_origine['key'] as $c => $d) {
2268
-		$c = str_replace($colonne_origine, $colonne_destination, $c);
2269
-		$d = str_replace($colonne_origine, $colonne_destination, $d);
2270
-		// seulement si on ne supprime pas la colonne !
2271
-		if ($d) {
2272
-			$keys[$c] = $d;
2273
-		}
2274
-	}
2275
-
2276
-	// autres keys, on merge
2277
-	$keys = array_merge($keys, $opt['key']);
2278
-	$queries = array();
2279
-
2280
-	// copier dans destination (si differente de origine), sinon tmp
2281
-	$table_copie = ($meme_table) ? $table_tmp : $table_destination;
2282
-	$autoinc = (isset($keys['PRIMARY KEY'])
2283
-		and $keys['PRIMARY KEY']
2284
-		and stripos($keys['PRIMARY KEY'], ',') === false
2285
-		and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2286
-
2287
-	if ($q = _sqlite_requete_create(
2288
-		$table_copie,
2289
-		$fields,
2290
-		$keys,
2291
-		$autoinc,
2292
-		$temporary = false,
2293
-		$ifnotexists = true,
2294
-		$serveur)
2295
-	) {
2296
-		$queries[] = $q;
2297
-	}
2298
-
2299
-
2300
-	// 2) y copier les champs qui vont bien
2301
-	$champs_dest = join(', ', array_keys($fields_correspondances));
2302
-	$champs_ori = join(', ', $fields_correspondances);
2303
-	$queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2304
-
2305
-	// 3) supprimer la table d'origine
2306
-	$queries[] = "DROP TABLE $table_origine";
2307
-
2308
-	// 4) renommer la table temporaire 
2309
-	// avec le nom de la table destination
2310
-	// si necessaire
2311
-	if ($meme_table) {
2312
-		$queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2313
-	}
2314
-
2315
-	// 5) remettre les index !
2316
-	foreach ($keys as $k => $v) {
2317
-		if ($k == 'PRIMARY KEY') {
2318
-		} else {
2319
-			// enlever KEY
2320
-			$k = substr($k, 4);
2321
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2322
-		}
2323
-	}
2324
-
2325
-
2326
-	if (count($queries)) {
2327
-		spip_sqlite::demarrer_transaction($serveur);
2328
-		// il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2329
-		foreach ($queries as $q) {
2330
-			if (!spip_sqlite::executer_requete($q, $serveur)) {
2331
-				spip_log("SQLite : ALTER TABLE table :"
2332
-					. " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2333
-				spip_sqlite::annuler_transaction($serveur);
2334
-
2335
-				return false;
2336
-			}
2337
-		}
2338
-		spip_sqlite::finir_transaction($serveur);
2339
-	}
2340
-
2341
-	return true;
2202
+    if (is_array($table)) {
2203
+        $table_destination = reset($table);
2204
+        $table_origine = key($table);
2205
+    } else {
2206
+        $table_origine = $table_destination = $table;
2207
+    }
2208
+    // ne prend actuellement qu'un changement
2209
+    // mais pourra etre adapte pour changer plus qu'une colonne a la fois
2210
+    if (is_array($colonne)) {
2211
+        $colonne_destination = reset($colonne);
2212
+        $colonne_origine = key($colonne);
2213
+    } else {
2214
+        $colonne_origine = $colonne_destination = $colonne;
2215
+    }
2216
+    if (!isset($opt['field'])) {
2217
+        $opt['field'] = array();
2218
+    }
2219
+    if (!isset($opt['key'])) {
2220
+        $opt['key'] = array();
2221
+    }
2222
+
2223
+    // si les noms de tables sont differents, pas besoin de table temporaire
2224
+    // on prendra directement le nom de la future table
2225
+    $meme_table = ($table_origine == $table_destination);
2226
+
2227
+    $def_origine = sql_showtable($table_origine, false, $serveur);
2228
+    if (!$def_origine or !isset($def_origine['field'])) {
2229
+        spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2230
+
2231
+        return false;
2232
+    }
2233
+
2234
+
2235
+    $table_tmp = $table_origine . '_tmp';
2236
+
2237
+    // 1) creer une table temporaire avec les modifications	
2238
+    // - DROP : suppression de la colonne
2239
+    // - CHANGE : modification de la colonne
2240
+    // (foreach pour conserver l'ordre des champs)
2241
+
2242
+    // field 
2243
+    $fields = array();
2244
+    // pour le INSERT INTO plus loin
2245
+    // stocker la correspondance nouvelles->anciennes colonnes
2246
+    $fields_correspondances = array();
2247
+    foreach ($def_origine['field'] as $c => $d) {
2248
+
2249
+        if ($colonne_origine && ($c == $colonne_origine)) {
2250
+            // si pas DROP
2251
+            if ($colonne_destination) {
2252
+                $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2253
+                $fields_correspondances[$colonne_destination] = $c;
2254
+            }
2255
+        } else {
2256
+            $fields[$c] = $d;
2257
+            $fields_correspondances[$c] = $c;
2258
+        }
2259
+    }
2260
+    // cas de ADD sqlite2 (ajout du champ en fin de table):
2261
+    if (!$colonne_origine && $colonne_destination) {
2262
+        $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2263
+    }
2264
+
2265
+    // key...
2266
+    $keys = array();
2267
+    foreach ($def_origine['key'] as $c => $d) {
2268
+        $c = str_replace($colonne_origine, $colonne_destination, $c);
2269
+        $d = str_replace($colonne_origine, $colonne_destination, $d);
2270
+        // seulement si on ne supprime pas la colonne !
2271
+        if ($d) {
2272
+            $keys[$c] = $d;
2273
+        }
2274
+    }
2275
+
2276
+    // autres keys, on merge
2277
+    $keys = array_merge($keys, $opt['key']);
2278
+    $queries = array();
2279
+
2280
+    // copier dans destination (si differente de origine), sinon tmp
2281
+    $table_copie = ($meme_table) ? $table_tmp : $table_destination;
2282
+    $autoinc = (isset($keys['PRIMARY KEY'])
2283
+        and $keys['PRIMARY KEY']
2284
+        and stripos($keys['PRIMARY KEY'], ',') === false
2285
+        and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2286
+
2287
+    if ($q = _sqlite_requete_create(
2288
+        $table_copie,
2289
+        $fields,
2290
+        $keys,
2291
+        $autoinc,
2292
+        $temporary = false,
2293
+        $ifnotexists = true,
2294
+        $serveur)
2295
+    ) {
2296
+        $queries[] = $q;
2297
+    }
2298
+
2299
+
2300
+    // 2) y copier les champs qui vont bien
2301
+    $champs_dest = join(', ', array_keys($fields_correspondances));
2302
+    $champs_ori = join(', ', $fields_correspondances);
2303
+    $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2304
+
2305
+    // 3) supprimer la table d'origine
2306
+    $queries[] = "DROP TABLE $table_origine";
2307
+
2308
+    // 4) renommer la table temporaire 
2309
+    // avec le nom de la table destination
2310
+    // si necessaire
2311
+    if ($meme_table) {
2312
+        $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2313
+    }
2314
+
2315
+    // 5) remettre les index !
2316
+    foreach ($keys as $k => $v) {
2317
+        if ($k == 'PRIMARY KEY') {
2318
+        } else {
2319
+            // enlever KEY
2320
+            $k = substr($k, 4);
2321
+            $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2322
+        }
2323
+    }
2324
+
2325
+
2326
+    if (count($queries)) {
2327
+        spip_sqlite::demarrer_transaction($serveur);
2328
+        // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2329
+        foreach ($queries as $q) {
2330
+            if (!spip_sqlite::executer_requete($q, $serveur)) {
2331
+                spip_log("SQLite : ALTER TABLE table :"
2332
+                    . " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2333
+                spip_sqlite::annuler_transaction($serveur);
2334
+
2335
+                return false;
2336
+            }
2337
+        }
2338
+        spip_sqlite::finir_transaction($serveur);
2339
+    }
2340
+
2341
+    return true;
2342 2342
 }
2343 2343
 
2344 2344
 
@@ -2348,60 +2348,60 @@  discard block
 block discarded – undo
2348 2348
  * @return array
2349 2349
  */
2350 2350
 function _sqlite_ref_fonctions() {
2351
-	$fonctions = array(
2352
-		'alter' => 'spip_sqlite_alter',
2353
-		'count' => 'spip_sqlite_count',
2354
-		'countsel' => 'spip_sqlite_countsel',
2355
-		'create' => 'spip_sqlite_create',
2356
-		'create_base' => 'spip_sqlite_create_base',
2357
-		'create_view' => 'spip_sqlite_create_view',
2358
-		'date_proche' => 'spip_sqlite_date_proche',
2359
-		'delete' => 'spip_sqlite_delete',
2360
-		'drop_table' => 'spip_sqlite_drop_table',
2361
-		'drop_view' => 'spip_sqlite_drop_view',
2362
-		'errno' => 'spip_sqlite_errno',
2363
-		'error' => 'spip_sqlite_error',
2364
-		'explain' => 'spip_sqlite_explain',
2365
-		'fetch' => 'spip_sqlite_fetch',
2366
-		'seek' => 'spip_sqlite_seek',
2367
-		'free' => 'spip_sqlite_free',
2368
-		'hex' => 'spip_sqlite_hex',
2369
-		'in' => 'spip_sqlite_in',
2370
-		'insert' => 'spip_sqlite_insert',
2371
-		'insertq' => 'spip_sqlite_insertq',
2372
-		'insertq_multi' => 'spip_sqlite_insertq_multi',
2373
-		'listdbs' => 'spip_sqlite_listdbs',
2374
-		'multi' => 'spip_sqlite_multi',
2375
-		'optimize' => 'spip_sqlite_optimize',
2376
-		'query' => 'spip_sqlite_query',
2377
-		'quote' => 'spip_sqlite_quote',
2378
-		'repair' => 'spip_sqlite_repair',
2379
-		'replace' => 'spip_sqlite_replace',
2380
-		'replace_multi' => 'spip_sqlite_replace_multi',
2381
-		'select' => 'spip_sqlite_select',
2382
-		'selectdb' => 'spip_sqlite_selectdb',
2383
-		'set_charset' => 'spip_sqlite_set_charset',
2384
-		'get_charset' => 'spip_sqlite_get_charset',
2385
-		'showbase' => 'spip_sqlite_showbase',
2386
-		'showtable' => 'spip_sqlite_showtable',
2387
-		'update' => 'spip_sqlite_update',
2388
-		'updateq' => 'spip_sqlite_updateq',
2389
-		'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2390
-		'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2391
-		'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2392
-	);
2393
-
2394
-	// association de chaque nom http d'un charset aux couples sqlite 
2395
-	// SQLite supporte utf-8 et utf-16 uniquement.
2396
-	$charsets = array(
2397
-		'utf-8' => array('charset' => 'utf8', 'collation' => 'utf8_general_ci'),
2398
-		//'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2399
-		//'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2400
-	);
2401
-
2402
-	$fonctions['charsets'] = $charsets;
2403
-
2404
-	return $fonctions;
2351
+    $fonctions = array(
2352
+        'alter' => 'spip_sqlite_alter',
2353
+        'count' => 'spip_sqlite_count',
2354
+        'countsel' => 'spip_sqlite_countsel',
2355
+        'create' => 'spip_sqlite_create',
2356
+        'create_base' => 'spip_sqlite_create_base',
2357
+        'create_view' => 'spip_sqlite_create_view',
2358
+        'date_proche' => 'spip_sqlite_date_proche',
2359
+        'delete' => 'spip_sqlite_delete',
2360
+        'drop_table' => 'spip_sqlite_drop_table',
2361
+        'drop_view' => 'spip_sqlite_drop_view',
2362
+        'errno' => 'spip_sqlite_errno',
2363
+        'error' => 'spip_sqlite_error',
2364
+        'explain' => 'spip_sqlite_explain',
2365
+        'fetch' => 'spip_sqlite_fetch',
2366
+        'seek' => 'spip_sqlite_seek',
2367
+        'free' => 'spip_sqlite_free',
2368
+        'hex' => 'spip_sqlite_hex',
2369
+        'in' => 'spip_sqlite_in',
2370
+        'insert' => 'spip_sqlite_insert',
2371
+        'insertq' => 'spip_sqlite_insertq',
2372
+        'insertq_multi' => 'spip_sqlite_insertq_multi',
2373
+        'listdbs' => 'spip_sqlite_listdbs',
2374
+        'multi' => 'spip_sqlite_multi',
2375
+        'optimize' => 'spip_sqlite_optimize',
2376
+        'query' => 'spip_sqlite_query',
2377
+        'quote' => 'spip_sqlite_quote',
2378
+        'repair' => 'spip_sqlite_repair',
2379
+        'replace' => 'spip_sqlite_replace',
2380
+        'replace_multi' => 'spip_sqlite_replace_multi',
2381
+        'select' => 'spip_sqlite_select',
2382
+        'selectdb' => 'spip_sqlite_selectdb',
2383
+        'set_charset' => 'spip_sqlite_set_charset',
2384
+        'get_charset' => 'spip_sqlite_get_charset',
2385
+        'showbase' => 'spip_sqlite_showbase',
2386
+        'showtable' => 'spip_sqlite_showtable',
2387
+        'update' => 'spip_sqlite_update',
2388
+        'updateq' => 'spip_sqlite_updateq',
2389
+        'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2390
+        'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2391
+        'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2392
+    );
2393
+
2394
+    // association de chaque nom http d'un charset aux couples sqlite 
2395
+    // SQLite supporte utf-8 et utf-16 uniquement.
2396
+    $charsets = array(
2397
+        'utf-8' => array('charset' => 'utf8', 'collation' => 'utf8_general_ci'),
2398
+        //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2399
+        //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2400
+    );
2401
+
2402
+    $fonctions['charsets'] = $charsets;
2403
+
2404
+    return $fonctions;
2405 2405
 }
2406 2406
 
2407 2407
 
@@ -2413,55 +2413,55 @@  discard block
 block discarded – undo
2413 2413
  * @return mixed
2414 2414
  */
2415 2415
 function _sqlite_remplacements_definitions_table($query, $autoinc = false) {
2416
-	// quelques remplacements
2417
-	$num = "(\s*\([0-9]*\))?";
2418
-	$enum = "(\s*\([^\)]*\))?";
2419
-
2420
-	$remplace = array(
2421
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2422
-		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2423
-		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2424
-		'/auto_increment/is' => '',
2425
-		'/(timestamp .* )ON .*$/is' => '\\1',
2426
-		'/character set \w+/is' => '',
2427
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2428
-		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2429
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2430
-		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2431
-		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2432
-	);
2433
-
2434
-	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2435
-	$remplace_autocinc = array(
2436
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2437
-	);
2438
-	// pour les int non autoincrement, il faut un DEFAULT
2439
-	$remplace_nonautocinc = array(
2440
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2441
-	);
2442
-
2443
-	if (is_string($query)) {
2444
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
2445
-		if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2446
-			$query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2447
-		} else {
2448
-			$query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2449
-			$query = _sqlite_collate_ci($query);
2450
-		}
2451
-	} elseif (is_array($query)) {
2452
-		foreach ($query as $k => $q) {
2453
-			$ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2454
-			$query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2455
-			if ($ai) {
2456
-				$query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2457
-			} else {
2458
-				$query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2459
-				$query[$k] = _sqlite_collate_ci($query[$k]);
2460
-			}
2461
-		}
2462
-	}
2463
-
2464
-	return $query;
2416
+    // quelques remplacements
2417
+    $num = "(\s*\([0-9]*\))?";
2418
+    $enum = "(\s*\([^\)]*\))?";
2419
+
2420
+    $remplace = array(
2421
+        '/enum' . $enum . '/is' => 'VARCHAR(255)',
2422
+        '/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2423
+        '/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2424
+        '/auto_increment/is' => '',
2425
+        '/(timestamp .* )ON .*$/is' => '\\1',
2426
+        '/character set \w+/is' => '',
2427
+        '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2428
+        '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2429
+        '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2430
+        '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2431
+        '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2432
+    );
2433
+
2434
+    // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2435
+    $remplace_autocinc = array(
2436
+        '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2437
+    );
2438
+    // pour les int non autoincrement, il faut un DEFAULT
2439
+    $remplace_nonautocinc = array(
2440
+        '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2441
+    );
2442
+
2443
+    if (is_string($query)) {
2444
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
2445
+        if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2446
+            $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2447
+        } else {
2448
+            $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2449
+            $query = _sqlite_collate_ci($query);
2450
+        }
2451
+    } elseif (is_array($query)) {
2452
+        foreach ($query as $k => $q) {
2453
+            $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2454
+            $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2455
+            if ($ai) {
2456
+                $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2457
+            } else {
2458
+                $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2459
+                $query[$k] = _sqlite_collate_ci($query[$k]);
2460
+            }
2461
+        }
2462
+    }
2463
+
2464
+    return $query;
2465 2465
 }
2466 2466
 
2467 2467
 /**
@@ -2472,17 +2472,17 @@  discard block
 block discarded – undo
2472 2472
  * @return string
2473 2473
  */
2474 2474
 function _sqlite_collate_ci($champ) {
2475
-	if (stripos($champ, "COLLATE") !== false) {
2476
-		return $champ;
2477
-	}
2478
-	if (stripos($champ, "BINARY") !== false) {
2479
-		return str_ireplace("BINARY", "COLLATE BINARY", $champ);
2480
-	}
2481
-	if (preg_match(",^(char|varchar|(long|small|medium|tiny)?text),i", $champ)) {
2482
-		return $champ . " COLLATE NOCASE";
2483
-	}
2475
+    if (stripos($champ, "COLLATE") !== false) {
2476
+        return $champ;
2477
+    }
2478
+    if (stripos($champ, "BINARY") !== false) {
2479
+        return str_ireplace("BINARY", "COLLATE BINARY", $champ);
2480
+    }
2481
+    if (preg_match(",^(char|varchar|(long|small|medium|tiny)?text),i", $champ)) {
2482
+        return $champ . " COLLATE NOCASE";
2483
+    }
2484 2484
 
2485
-	return $champ;
2485
+    return $champ;
2486 2486
 }
2487 2487
 
2488 2488
 
@@ -2501,82 +2501,82 @@  discard block
 block discarded – undo
2501 2501
  * @return bool|string
2502 2502
  */
2503 2503
 function _sqlite_requete_create(
2504
-	$nom,
2505
-	$champs,
2506
-	$cles,
2507
-	$autoinc = false,
2508
-	$temporary = false,
2509
-	$_ifnotexists = true,
2510
-	$serveur = '',
2511
-	$requeter = true
2504
+    $nom,
2505
+    $champs,
2506
+    $cles,
2507
+    $autoinc = false,
2508
+    $temporary = false,
2509
+    $_ifnotexists = true,
2510
+    $serveur = '',
2511
+    $requeter = true
2512 2512
 ) {
2513
-	$query = $keys = $s = $p = '';
2514
-
2515
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
2516
-	// sans les renseigner (laisse le compilo recuperer la description)
2517
-	if (!is_array($champs) || !is_array($cles)) {
2518
-		return;
2519
-	}
2520
-
2521
-	// sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2522
-	// il faut passer par des create index
2523
-	// Il gere par contre primary key !
2524
-	// Soit la PK est definie dans les cles, soit dans un champs
2525
-	// soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2526
-	$pk = "PRIMARY KEY";
2527
-	// le champ de cle primaire
2528
-	$champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2529
-
2530
-	foreach ($champs as $k => $v) {
2531
-		if (false !== stripos($v, $pk)) {
2532
-			$champ_pk = $k;
2533
-			// on n'en a plus besoin dans field, vu que defini dans key
2534
-			$champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2535
-			break;
2536
-		}
2537
-	}
2538
-
2539
-	if ($champ_pk) {
2540
-		$keys = "\n\t\t$pk ($champ_pk)";
2541
-	}
2542
-	// Pas de DEFAULT 0 sur les cles primaires en auto-increment
2543
-	if (isset($champs[$champ_pk])
2544
-		and stripos($champs[$champ_pk], "default 0") !== false
2545
-	) {
2546
-		$champs[$champ_pk] = trim(str_ireplace("default 0", "", $champs[$champ_pk]));
2547
-	}
2548
-
2549
-	$champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2550
-	foreach ($champs as $k => $v) {
2551
-		$query .= "$s\n\t\t$k $v";
2552
-		$s = ",";
2553
-	}
2554
-
2555
-	$ifnotexists = "";
2556
-	if ($_ifnotexists) {
2557
-
2558
-		$version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version", $serveur), '',
2559
-			$serveur);
2560
-		if (!function_exists('spip_version_compare')) {
2561
-			include_spip('plugins/installer');
2562
-		}
2563
-
2564
-		if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2565
-			$ifnotexists = ' IF NOT EXISTS';
2566
-		} else {
2567
-			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2568
-			$a = spip_sqlite_showtable($nom, $serveur);
2569
-			if (isset($a['key']['KEY ' . $nom])) {
2570
-				return true;
2571
-			}
2572
-		}
2573
-
2574
-	}
2575
-
2576
-	$temporary = $temporary ? ' TEMPORARY' : '';
2577
-	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2578
-
2579
-	return $q;
2513
+    $query = $keys = $s = $p = '';
2514
+
2515
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
2516
+    // sans les renseigner (laisse le compilo recuperer la description)
2517
+    if (!is_array($champs) || !is_array($cles)) {
2518
+        return;
2519
+    }
2520
+
2521
+    // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2522
+    // il faut passer par des create index
2523
+    // Il gere par contre primary key !
2524
+    // Soit la PK est definie dans les cles, soit dans un champs
2525
+    // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2526
+    $pk = "PRIMARY KEY";
2527
+    // le champ de cle primaire
2528
+    $champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2529
+
2530
+    foreach ($champs as $k => $v) {
2531
+        if (false !== stripos($v, $pk)) {
2532
+            $champ_pk = $k;
2533
+            // on n'en a plus besoin dans field, vu que defini dans key
2534
+            $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2535
+            break;
2536
+        }
2537
+    }
2538
+
2539
+    if ($champ_pk) {
2540
+        $keys = "\n\t\t$pk ($champ_pk)";
2541
+    }
2542
+    // Pas de DEFAULT 0 sur les cles primaires en auto-increment
2543
+    if (isset($champs[$champ_pk])
2544
+        and stripos($champs[$champ_pk], "default 0") !== false
2545
+    ) {
2546
+        $champs[$champ_pk] = trim(str_ireplace("default 0", "", $champs[$champ_pk]));
2547
+    }
2548
+
2549
+    $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2550
+    foreach ($champs as $k => $v) {
2551
+        $query .= "$s\n\t\t$k $v";
2552
+        $s = ",";
2553
+    }
2554
+
2555
+    $ifnotexists = "";
2556
+    if ($_ifnotexists) {
2557
+
2558
+        $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version", $serveur), '',
2559
+            $serveur);
2560
+        if (!function_exists('spip_version_compare')) {
2561
+            include_spip('plugins/installer');
2562
+        }
2563
+
2564
+        if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2565
+            $ifnotexists = ' IF NOT EXISTS';
2566
+        } else {
2567
+            /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2568
+            $a = spip_sqlite_showtable($nom, $serveur);
2569
+            if (isset($a['key']['KEY ' . $nom])) {
2570
+                return true;
2571
+            }
2572
+        }
2573
+
2574
+    }
2575
+
2576
+    $temporary = $temporary ? ' TEMPORARY' : '';
2577
+    $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2578
+
2579
+    return $q;
2580 2580
 }
2581 2581
 
2582 2582
 
@@ -2595,35 +2595,35 @@  discard block
 block discarded – undo
2595 2595
  * @return
2596 2596
  */
2597 2597
 function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') {
2598
-	static $tables = array();
2598
+    static $tables = array();
2599 2599
 
2600
-	if (!isset($tables[$table])) {
2600
+    if (!isset($tables[$table])) {
2601 2601
 
2602
-		if (!$desc) {
2603
-			$trouver_table = charger_fonction('trouver_table', 'base');
2604
-			$desc = $trouver_table($table, $serveur);
2605
-			// si pas de description, on ne fait rien, ou on die() ?
2606
-			if (!$desc) {
2607
-				return $couples;
2608
-			}
2609
-		}
2602
+        if (!$desc) {
2603
+            $trouver_table = charger_fonction('trouver_table', 'base');
2604
+            $desc = $trouver_table($table, $serveur);
2605
+            // si pas de description, on ne fait rien, ou on die() ?
2606
+            if (!$desc) {
2607
+                return $couples;
2608
+            }
2609
+        }
2610 2610
 
2611
-		// recherche des champs avec simplement 'TIMESTAMP'
2612
-		// cependant, il faudra peut etre etendre
2613
-		// avec la gestion de DEFAULT et ON UPDATE
2614
-		// mais ceux-ci ne sont pas utilises dans le core
2615
-		$tables[$table] = array();
2611
+        // recherche des champs avec simplement 'TIMESTAMP'
2612
+        // cependant, il faudra peut etre etendre
2613
+        // avec la gestion de DEFAULT et ON UPDATE
2614
+        // mais ceux-ci ne sont pas utilises dans le core
2615
+        $tables[$table] = array();
2616 2616
 
2617
-		$now = _sqlite_func_now();
2618
-		foreach ($desc['field'] as $k => $v) {
2619
-			if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2620
-				$tables[$table][$k] = _sqlite_calculer_cite($now, $v);
2621
-			}
2622
-		}
2623
-	}
2617
+        $now = _sqlite_func_now();
2618
+        foreach ($desc['field'] as $k => $v) {
2619
+            if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2620
+                $tables[$table][$k] = _sqlite_calculer_cite($now, $v);
2621
+            }
2622
+        }
2623
+    }
2624 2624
 
2625
-	// ajout des champs type 'timestamp' absents
2626
-	return array_merge($tables[$table], $couples);
2625
+    // ajout des champs type 'timestamp' absents
2626
+    return array_merge($tables[$table], $couples);
2627 2627
 }
2628 2628
 
2629 2629
 
@@ -2634,7 +2634,7 @@  discard block
 block discarded – undo
2634 2634
  * @return array|bool
2635 2635
  */
2636 2636
 function spip_versions_sqlite() {
2637
-	return _sqlite_charger_version();
2637
+    return _sqlite_charger_version();
2638 2638
 }
2639 2639
 
2640 2640
 /**
@@ -2642,113 +2642,113 @@  discard block
 block discarded – undo
2642 2642
  * encadrées de transactions.
2643 2643
  **/
2644 2644
 class spip_sqlite {
2645
-	/** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2646
-	public static $requeteurs = array();
2647
-	/** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2648
-	public static $transaction_en_cours = array();
2649
-
2650
-
2651
-	/**
2652
-	 * Retourne une unique instance du requêteur
2653
-	 *
2654
-	 * Retourne une instance unique du requêteur pour une connexion SQLite
2655
-	 * donnée
2656
-	 *
2657
-	 * @param string $serveur
2658
-	 *    Nom du connecteur
2659
-	 * @return sqlite_requeteur
2660
-	 *    Instance unique du requêteur
2661
-	 **/
2662
-	public static function requeteur($serveur) {
2663
-		if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2664
-			spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2665
-		}
2666
-
2667
-		return spip_sqlite::$requeteurs[$serveur];
2668
-	}
2669
-
2670
-	/**
2671
-	 * Prépare le texte d'une requête avant son exécution
2672
-	 *
2673
-	 * Adapte la requête au format plus ou moins MySQL par un format
2674
-	 * compris de SQLite.
2675
-	 *
2676
-	 * Change les préfixes de tables SPIP par ceux véritables
2677
-	 *
2678
-	 * @param string $query Requête à préparer
2679
-	 * @param string $serveur Nom de la connexion
2680
-	 * @return string           Requête préparée
2681
-	 */
2682
-	public static function traduire_requete($query, $serveur) {
2683
-		$requeteur = spip_sqlite::requeteur($serveur);
2684
-		$traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2685
-
2686
-		return $traducteur->traduire_requete();
2687
-	}
2688
-
2689
-	/**
2690
-	 * Démarre une transaction
2691
-	 *
2692
-	 * @param string $serveur Nom de la connexion
2693
-	 **/
2694
-	public static function demarrer_transaction($serveur) {
2695
-		spip_sqlite::executer_requete("BEGIN TRANSACTION", $serveur);
2696
-		spip_sqlite::$transaction_en_cours[$serveur] = true;
2697
-	}
2698
-
2699
-	/**
2700
-	 * Exécute la requête donnée
2701
-	 *
2702
-	 * @param string $query Requête
2703
-	 * @param string $serveur Nom de la connexion
2704
-	 * @param null|bool $tracer Demander des statistiques (temps) ?
2705
-	 **/
2706
-	public static function executer_requete($query, $serveur, $tracer = null) {
2707
-		$requeteur = spip_sqlite::requeteur($serveur);
2708
-
2709
-		return $requeteur->executer_requete($query, $tracer);
2710
-	}
2711
-
2712
-	/**
2713
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2714
-	 *
2715
-	 * @param string $serveur Nom de la connexion
2716
-	 * return int                Identifiant
2717
-	 **/
2718
-	public static function last_insert_id($serveur) {
2719
-		$requeteur = spip_sqlite::requeteur($serveur);
2720
-
2721
-		return $requeteur->last_insert_id($serveur);
2722
-	}
2723
-
2724
-	/**
2725
-	 * Annule une transaction
2726
-	 *
2727
-	 * @param string $serveur Nom de la connexion
2728
-	 **/
2729
-	public static function annuler_transaction($serveur) {
2730
-		spip_sqlite::executer_requete("ROLLBACK", $serveur);
2731
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2732
-	}
2733
-
2734
-	/**
2735
-	 * Termine une transaction
2736
-	 *
2737
-	 * @param string $serveur Nom de la connexion
2738
-	 **/
2739
-	public static function finir_transaction($serveur) {
2740
-		// si pas de transaction en cours, ne rien faire et le dire
2741
-		if (!isset(spip_sqlite::$transaction_en_cours[$serveur])
2742
-			or spip_sqlite::$transaction_en_cours[$serveur] == false
2743
-		) {
2744
-			return false;
2745
-		}
2746
-		// sinon fermer la transaction et retourner true
2747
-		spip_sqlite::executer_requete("COMMIT", $serveur);
2748
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2749
-
2750
-		return true;
2751
-	}
2645
+    /** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2646
+    public static $requeteurs = array();
2647
+    /** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2648
+    public static $transaction_en_cours = array();
2649
+
2650
+
2651
+    /**
2652
+     * Retourne une unique instance du requêteur
2653
+     *
2654
+     * Retourne une instance unique du requêteur pour une connexion SQLite
2655
+     * donnée
2656
+     *
2657
+     * @param string $serveur
2658
+     *    Nom du connecteur
2659
+     * @return sqlite_requeteur
2660
+     *    Instance unique du requêteur
2661
+     **/
2662
+    public static function requeteur($serveur) {
2663
+        if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2664
+            spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2665
+        }
2666
+
2667
+        return spip_sqlite::$requeteurs[$serveur];
2668
+    }
2669
+
2670
+    /**
2671
+     * Prépare le texte d'une requête avant son exécution
2672
+     *
2673
+     * Adapte la requête au format plus ou moins MySQL par un format
2674
+     * compris de SQLite.
2675
+     *
2676
+     * Change les préfixes de tables SPIP par ceux véritables
2677
+     *
2678
+     * @param string $query Requête à préparer
2679
+     * @param string $serveur Nom de la connexion
2680
+     * @return string           Requête préparée
2681
+     */
2682
+    public static function traduire_requete($query, $serveur) {
2683
+        $requeteur = spip_sqlite::requeteur($serveur);
2684
+        $traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2685
+
2686
+        return $traducteur->traduire_requete();
2687
+    }
2688
+
2689
+    /**
2690
+     * Démarre une transaction
2691
+     *
2692
+     * @param string $serveur Nom de la connexion
2693
+     **/
2694
+    public static function demarrer_transaction($serveur) {
2695
+        spip_sqlite::executer_requete("BEGIN TRANSACTION", $serveur);
2696
+        spip_sqlite::$transaction_en_cours[$serveur] = true;
2697
+    }
2698
+
2699
+    /**
2700
+     * Exécute la requête donnée
2701
+     *
2702
+     * @param string $query Requête
2703
+     * @param string $serveur Nom de la connexion
2704
+     * @param null|bool $tracer Demander des statistiques (temps) ?
2705
+     **/
2706
+    public static function executer_requete($query, $serveur, $tracer = null) {
2707
+        $requeteur = spip_sqlite::requeteur($serveur);
2708
+
2709
+        return $requeteur->executer_requete($query, $tracer);
2710
+    }
2711
+
2712
+    /**
2713
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2714
+     *
2715
+     * @param string $serveur Nom de la connexion
2716
+     * return int                Identifiant
2717
+     **/
2718
+    public static function last_insert_id($serveur) {
2719
+        $requeteur = spip_sqlite::requeteur($serveur);
2720
+
2721
+        return $requeteur->last_insert_id($serveur);
2722
+    }
2723
+
2724
+    /**
2725
+     * Annule une transaction
2726
+     *
2727
+     * @param string $serveur Nom de la connexion
2728
+     **/
2729
+    public static function annuler_transaction($serveur) {
2730
+        spip_sqlite::executer_requete("ROLLBACK", $serveur);
2731
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2732
+    }
2733
+
2734
+    /**
2735
+     * Termine une transaction
2736
+     *
2737
+     * @param string $serveur Nom de la connexion
2738
+     **/
2739
+    public static function finir_transaction($serveur) {
2740
+        // si pas de transaction en cours, ne rien faire et le dire
2741
+        if (!isset(spip_sqlite::$transaction_en_cours[$serveur])
2742
+            or spip_sqlite::$transaction_en_cours[$serveur] == false
2743
+        ) {
2744
+            return false;
2745
+        }
2746
+        // sinon fermer la transaction et retourner true
2747
+        spip_sqlite::executer_requete("COMMIT", $serveur);
2748
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2749
+
2750
+        return true;
2751
+    }
2752 2752
 }
2753 2753
 
2754 2754
 /*
@@ -2761,119 +2761,119 @@  discard block
 block discarded – undo
2761 2761
  */
2762 2762
 
2763 2763
 class sqlite_requeteur {
2764
-	/** @var string Texte de la requête */
2765
-	public $query = ''; // la requete
2766
-	/** @var string Nom de la connexion */
2767
-	public $serveur = '';
2768
-	/** @var Ressource Identifiant de la connexion SQLite */
2769
-	public $link = '';
2770
-	/** @var string Prefixe des tables SPIP */
2771
-	public $prefixe = '';
2772
-	/** @var string Nom de la base de donnée */
2773
-	public $db = '';
2774
-	/** @var bool Doit-on tracer les requetes (var_profile) ? */
2775
-	public $tracer = false; // doit-on tracer les requetes (var_profile)
2776
-
2777
-	/** @var string Version de SQLite (2 ou 3) */
2778
-	public $sqlite_version = '';
2779
-
2780
-	/**
2781
-	 * Constructeur
2782
-	 *
2783
-	 * @param string $serveur
2784
-	 * @return bool
2785
-	 */
2786
-	public function __construct($serveur = '') {
2787
-		_sqlite_init();
2788
-		$this->serveur = strtolower($serveur);
2789
-
2790
-		if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2791
-			spip_log("Aucune connexion sqlite (link)", 'sqlite.' . _LOG_ERREUR);
2792
-
2793
-			return false;
2794
-		}
2795
-
2796
-		$this->sqlite_version = _sqlite_is_version('', $this->link);
2797
-
2798
-		$this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2799
-		$this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2800
-
2801
-		// tracage des requetes ?
2802
-		$this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2803
-	}
2804
-
2805
-	/**
2806
-	 * Lancer la requête transmise et faire le tracage si demandé
2807
-	 *
2808
-	 * @param string $query
2809
-	 *     Requête à exécuter
2810
-	 * @param bool|null $tracer
2811
-	 *     true pour tracer la requête
2812
-	 * @return bool|SQLiteResult
2813
-	 */
2814
-	public function executer_requete($query, $tracer = null) {
2815
-		if (is_null($tracer)) {
2816
-			$tracer = $this->tracer;
2817
-		}
2818
-		$err = "";
2819
-		$t = 0;
2820
-		if ($tracer) {
2821
-			include_spip('public/tracer');
2822
-			$t = trace_query_start();
2823
-		}
2824
-
2825
-		# spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2826
-		if ($this->link) {
2827
-			// memoriser la derniere erreur PHP vue
2828
-			$e = (function_exists('error_get_last') ? error_get_last() : "");
2829
-			// sauver la derniere requete
2830
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2831
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2832
-
2833
-			$r = $this->link->query($query);
2834
-			// sauvegarde de la requete (elle y est deja dans $r->queryString)
2835
-			# $r->spipQueryString = $query;
2836
-
2837
-			// comptage : oblige de compter le nombre d'entrees retournees
2838
-			// par une requete SELECT
2839
-			// aucune autre solution ne donne le nombre attendu :( !
2840
-			// particulierement s'il y a des LIMIT dans la requete.
2841
-			if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2842
-				if ($r) {
2843
-					// noter le link et la query pour faire le comptage *si* on en a besoin
2844
-					$r->spipSqliteRowCount = array($this->link, $query);
2845
-				} elseif ($r instanceof PDOStatement) {
2846
-					$r->spipSqliteRowCount = 0;
2847
-				}
2848
-			}
2849
-
2850
-			// loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2851
-			if ($err = (function_exists('error_get_last') ? error_get_last() : "") and $err != $e) {
2852
-				$err = strip_tags($err['message']) . " in " . $err['file'] . " line " . $err['line'];
2853
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2854
-			} else {
2855
-				$err = "";
2856
-			}
2857
-
2858
-		} else {
2859
-			$r = false;
2860
-		}
2861
-
2862
-		if (spip_sqlite_errno($this->serveur)) {
2863
-			$err .= spip_sqlite_error($query, $this->serveur);
2864
-		}
2865
-
2866
-		return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2867
-	}
2868
-
2869
-	/**
2870
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2871
-	 *
2872
-	 * @return int
2873
-	 **/
2874
-	public function last_insert_id() {
2875
-		return $this->link->lastInsertId();
2876
-	}
2764
+    /** @var string Texte de la requête */
2765
+    public $query = ''; // la requete
2766
+    /** @var string Nom de la connexion */
2767
+    public $serveur = '';
2768
+    /** @var Ressource Identifiant de la connexion SQLite */
2769
+    public $link = '';
2770
+    /** @var string Prefixe des tables SPIP */
2771
+    public $prefixe = '';
2772
+    /** @var string Nom de la base de donnée */
2773
+    public $db = '';
2774
+    /** @var bool Doit-on tracer les requetes (var_profile) ? */
2775
+    public $tracer = false; // doit-on tracer les requetes (var_profile)
2776
+
2777
+    /** @var string Version de SQLite (2 ou 3) */
2778
+    public $sqlite_version = '';
2779
+
2780
+    /**
2781
+     * Constructeur
2782
+     *
2783
+     * @param string $serveur
2784
+     * @return bool
2785
+     */
2786
+    public function __construct($serveur = '') {
2787
+        _sqlite_init();
2788
+        $this->serveur = strtolower($serveur);
2789
+
2790
+        if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2791
+            spip_log("Aucune connexion sqlite (link)", 'sqlite.' . _LOG_ERREUR);
2792
+
2793
+            return false;
2794
+        }
2795
+
2796
+        $this->sqlite_version = _sqlite_is_version('', $this->link);
2797
+
2798
+        $this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2799
+        $this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2800
+
2801
+        // tracage des requetes ?
2802
+        $this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2803
+    }
2804
+
2805
+    /**
2806
+     * Lancer la requête transmise et faire le tracage si demandé
2807
+     *
2808
+     * @param string $query
2809
+     *     Requête à exécuter
2810
+     * @param bool|null $tracer
2811
+     *     true pour tracer la requête
2812
+     * @return bool|SQLiteResult
2813
+     */
2814
+    public function executer_requete($query, $tracer = null) {
2815
+        if (is_null($tracer)) {
2816
+            $tracer = $this->tracer;
2817
+        }
2818
+        $err = "";
2819
+        $t = 0;
2820
+        if ($tracer) {
2821
+            include_spip('public/tracer');
2822
+            $t = trace_query_start();
2823
+        }
2824
+
2825
+        # spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2826
+        if ($this->link) {
2827
+            // memoriser la derniere erreur PHP vue
2828
+            $e = (function_exists('error_get_last') ? error_get_last() : "");
2829
+            // sauver la derniere requete
2830
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2831
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2832
+
2833
+            $r = $this->link->query($query);
2834
+            // sauvegarde de la requete (elle y est deja dans $r->queryString)
2835
+            # $r->spipQueryString = $query;
2836
+
2837
+            // comptage : oblige de compter le nombre d'entrees retournees
2838
+            // par une requete SELECT
2839
+            // aucune autre solution ne donne le nombre attendu :( !
2840
+            // particulierement s'il y a des LIMIT dans la requete.
2841
+            if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2842
+                if ($r) {
2843
+                    // noter le link et la query pour faire le comptage *si* on en a besoin
2844
+                    $r->spipSqliteRowCount = array($this->link, $query);
2845
+                } elseif ($r instanceof PDOStatement) {
2846
+                    $r->spipSqliteRowCount = 0;
2847
+                }
2848
+            }
2849
+
2850
+            // loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2851
+            if ($err = (function_exists('error_get_last') ? error_get_last() : "") and $err != $e) {
2852
+                $err = strip_tags($err['message']) . " in " . $err['file'] . " line " . $err['line'];
2853
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2854
+            } else {
2855
+                $err = "";
2856
+            }
2857
+
2858
+        } else {
2859
+            $r = false;
2860
+        }
2861
+
2862
+        if (spip_sqlite_errno($this->serveur)) {
2863
+            $err .= spip_sqlite_error($query, $this->serveur);
2864
+        }
2865
+
2866
+        return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2867
+    }
2868
+
2869
+    /**
2870
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2871
+     *
2872
+     * @return int
2873
+     **/
2874
+    public function last_insert_id() {
2875
+        return $this->link->lastInsertId();
2876
+    }
2877 2877
 }
2878 2878
 
2879 2879
 
@@ -2883,198 +2883,198 @@  discard block
 block discarded – undo
2883 2883
  * (fonction pour proteger les textes)
2884 2884
  */
2885 2885
 class sqlite_traducteur {
2886
-	/** @var string $query Texte de la requête */
2887
-	public $query = '';
2888
-	/** @var string $prefixe Préfixe des tables */
2889
-	public $prefixe = '';
2890
-	/** @var string $sqlite_version Version de sqlite (2 ou 3) */
2891
-	public $sqlite_version = '';
2892
-
2893
-	/** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
2894
-	 *
2895
-	 * @var array
2896
-	 */
2897
-	public $textes = array();
2898
-
2899
-	/**
2900
-	 * Constructeur
2901
-	 *
2902
-	 * @param string $query Requête à préparer
2903
-	 * @param string $prefixe Prefixe des tables à utiliser
2904
-	 * @param string $sqlite_version Version SQLite (2 ou 3)
2905
-	 */
2906
-	public function __construct($query, $prefixe, $sqlite_version) {
2907
-		$this->query = $query;
2908
-		$this->prefixe = $prefixe;
2909
-		$this->sqlite_version = $sqlite_version;
2910
-	}
2911
-
2912
-	/**
2913
-	 * Transformer la requete pour SQLite
2914
-	 *
2915
-	 * Enlève les textes, transforme la requête pour quelle soit
2916
-	 * bien interprétée par SQLite, puis remet les textes
2917
-	 * la fonction affecte `$this->query`
2918
-	 */
2919
-	public function traduire_requete() {
2920
-		//
2921
-		// 1) Protection des textes en les remplacant par des codes
2922
-		//
2923
-		// enlever les 'textes' et initialiser avec
2924
-		list($this->query, $textes) = query_echappe_textes($this->query);
2925
-
2926
-		//
2927
-		// 2) Corrections de la requete
2928
-		//
2929
-		// Correction Create Database
2930
-		// Create Database -> requete ignoree
2931
-		if (strpos($this->query, 'CREATE DATABASE') === 0) {
2932
-			spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
2933
-			$this->query = "SELECT 1";
2934
-		}
2935
-
2936
-		// Correction Insert Ignore
2937
-		// INSERT IGNORE -> insert (tout court et pas 'insert or replace')
2938
-		if (strpos($this->query, 'INSERT IGNORE') === 0) {
2939
-			spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
2940
-			$this->query = 'INSERT ' . substr($this->query, '13');
2941
-		}
2942
-
2943
-		// Correction des dates avec INTERVAL
2944
-		// utiliser sql_date_proche() de preference
2945
-		if (strpos($this->query, 'INTERVAL') !== false) {
2946
-			$this->query = preg_replace_callback("/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U",
2947
-				array(&$this, '_remplacerDateParTime'),
2948
-				$this->query);
2949
-		}
2950
-
2951
-		if (strpos($this->query, 'LEFT(') !== false) {
2952
-			$this->query = str_replace('LEFT(', '_LEFT(', $this->query);
2953
-		}
2954
-
2955
-		if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
2956
-			$this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
2957
-		}
2958
-
2959
-
2960
-		// Correction Using
2961
-		// USING (non reconnu en sqlite2)
2962
-		// problematique car la jointure ne se fait pas du coup.
2963
-		if (($this->sqlite_version == 2) && (strpos($this->query, "USING") !== false)) {
2964
-			spip_log("'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
2965
-				'sqlite.' . _LOG_ERREUR);
2966
-			$this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
2967
-		}
2968
-
2969
-		// Correction Field
2970
-		// remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
2971
-		if (strpos($this->query, 'FIELD') !== false) {
2972
-			$this->query = preg_replace_callback('/FIELD\s*\(([^\)]*)\)/',
2973
-				array(&$this, '_remplacerFieldParCase'),
2974
-				$this->query);
2975
-		}
2976
-
2977
-		// Correction des noms de tables FROM
2978
-		// mettre les bons noms de table dans from, update, insert, replace...
2979
-		if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
2980
-			$suite = strstr($this->query, $regs[0]);
2981
-			$this->query = substr($this->query, 0, -strlen($suite));
2982
-		} else {
2983
-			$suite = '';
2984
-		}
2985
-		$pref = ($this->prefixe) ? $this->prefixe . "_" : "";
2986
-		$this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
2987
-
2988
-		// Correction zero AS x
2989
-		// pg n'aime pas 0+x AS alias, sqlite, dans le meme style, 
2990
-		// n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
2991
-		// il dit que x ne doit pas être un integer dans le order by !
2992
-		// on remplace du coup x par vide() dans ce cas uniquement
2993
-		//
2994
-		// rien que pour public/vertebrer.php ?
2995
-		if ((strpos($this->query, "0 AS") !== false)) {
2996
-			// on ne remplace que dans ORDER BY ou GROUP BY
2997
-			if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
2998
-				$suite = strstr($this->query, $regs[0]);
2999
-				$this->query = substr($this->query, 0, -strlen($suite));
3000
-
3001
-				// on cherche les noms des x dans 0 AS x
3002
-				// on remplace dans $suite le nom par vide()
3003
-				preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3004
-				foreach ($matches[1] as $m) {
3005
-					$suite = str_replace($m, 'VIDE()', $suite);
3006
-				}
3007
-				$this->query .= $suite;
3008
-			}
3009
-		}
3010
-
3011
-		// Correction possible des divisions entieres
3012
-		// Le standard SQL (lequel? ou?) semble indiquer que
3013
-		// a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3014
-		// C'est ce que retournent effectivement SQL Server et SQLite
3015
-		// Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3016
-		// 
3017
-		// On peut forcer la conversion en multipliant par 1.0 avant la division
3018
-		// /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus ! 
3019
-		// cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3020
-		//     http://www.sqlite.org/cvstrac/tktview?tn=3202
3021
-		// (4*1.0/3) n'est pas rendu dans ce cas !
3022
-		# $this->query = str_replace('/','* 1.00 / ',$this->query);
3023
-
3024
-
3025
-		// Correction critere REGEXP, non reconnu en sqlite2
3026
-		if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3027
-			$this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3028
-		}
3029
-
3030
-		//
3031
-		// 3) Remise en place des textes d'origine
3032
-		//
3033
-		// Correction Antiquotes et echappements
3034
-		// ` => rien
3035
-		if (strpos($this->query, '`') !== false) {
3036
-			$this->query = str_replace('`', '', $this->query);
3037
-		}
3038
-
3039
-		$this->query = query_reinjecte_textes($this->query, $textes);
3040
-
3041
-		return $this->query;
3042
-	}
3043
-
3044
-
3045
-	/**
3046
-	 * Callback pour remplacer `DATE_` / `INTERVAL`
3047
-	 * par `DATE ... strtotime`
3048
-	 *
3049
-	 * @param array $matches Captures
3050
-	 * @return string Texte de date compris par SQLite
3051
-	 */
3052
-	public function _remplacerDateParTime($matches) {
3053
-		$op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3054
-
3055
-		return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3056
-	}
3057
-
3058
-	/**
3059
-	 * Callback pour remplacer `FIELD(table,i,j,k...)`
3060
-	 * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3061
-	 *
3062
-	 * @param array $matches Captures
3063
-	 * @return string Texte de liste ordonnée compris par SQLite
3064
-	 */
3065
-	public function _remplacerFieldParCase($matches) {
3066
-		$fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3067
-		$t = explode(',', $fields);
3068
-		$index = array_shift($t);
3069
-
3070
-		$res = '';
3071
-		$n = 0;
3072
-		foreach ($t as $v) {
3073
-			$n++;
3074
-			$res .= "\nWHEN $index=$v THEN $n";
3075
-		}
3076
-
3077
-		return "CASE $res ELSE 0 END ";
3078
-	}
2886
+    /** @var string $query Texte de la requête */
2887
+    public $query = '';
2888
+    /** @var string $prefixe Préfixe des tables */
2889
+    public $prefixe = '';
2890
+    /** @var string $sqlite_version Version de sqlite (2 ou 3) */
2891
+    public $sqlite_version = '';
2892
+
2893
+    /** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
2894
+     *
2895
+     * @var array
2896
+     */
2897
+    public $textes = array();
2898
+
2899
+    /**
2900
+     * Constructeur
2901
+     *
2902
+     * @param string $query Requête à préparer
2903
+     * @param string $prefixe Prefixe des tables à utiliser
2904
+     * @param string $sqlite_version Version SQLite (2 ou 3)
2905
+     */
2906
+    public function __construct($query, $prefixe, $sqlite_version) {
2907
+        $this->query = $query;
2908
+        $this->prefixe = $prefixe;
2909
+        $this->sqlite_version = $sqlite_version;
2910
+    }
2911
+
2912
+    /**
2913
+     * Transformer la requete pour SQLite
2914
+     *
2915
+     * Enlève les textes, transforme la requête pour quelle soit
2916
+     * bien interprétée par SQLite, puis remet les textes
2917
+     * la fonction affecte `$this->query`
2918
+     */
2919
+    public function traduire_requete() {
2920
+        //
2921
+        // 1) Protection des textes en les remplacant par des codes
2922
+        //
2923
+        // enlever les 'textes' et initialiser avec
2924
+        list($this->query, $textes) = query_echappe_textes($this->query);
2925
+
2926
+        //
2927
+        // 2) Corrections de la requete
2928
+        //
2929
+        // Correction Create Database
2930
+        // Create Database -> requete ignoree
2931
+        if (strpos($this->query, 'CREATE DATABASE') === 0) {
2932
+            spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
2933
+            $this->query = "SELECT 1";
2934
+        }
2935
+
2936
+        // Correction Insert Ignore
2937
+        // INSERT IGNORE -> insert (tout court et pas 'insert or replace')
2938
+        if (strpos($this->query, 'INSERT IGNORE') === 0) {
2939
+            spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
2940
+            $this->query = 'INSERT ' . substr($this->query, '13');
2941
+        }
2942
+
2943
+        // Correction des dates avec INTERVAL
2944
+        // utiliser sql_date_proche() de preference
2945
+        if (strpos($this->query, 'INTERVAL') !== false) {
2946
+            $this->query = preg_replace_callback("/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U",
2947
+                array(&$this, '_remplacerDateParTime'),
2948
+                $this->query);
2949
+        }
2950
+
2951
+        if (strpos($this->query, 'LEFT(') !== false) {
2952
+            $this->query = str_replace('LEFT(', '_LEFT(', $this->query);
2953
+        }
2954
+
2955
+        if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
2956
+            $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
2957
+        }
2958
+
2959
+
2960
+        // Correction Using
2961
+        // USING (non reconnu en sqlite2)
2962
+        // problematique car la jointure ne se fait pas du coup.
2963
+        if (($this->sqlite_version == 2) && (strpos($this->query, "USING") !== false)) {
2964
+            spip_log("'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
2965
+                'sqlite.' . _LOG_ERREUR);
2966
+            $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
2967
+        }
2968
+
2969
+        // Correction Field
2970
+        // remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
2971
+        if (strpos($this->query, 'FIELD') !== false) {
2972
+            $this->query = preg_replace_callback('/FIELD\s*\(([^\)]*)\)/',
2973
+                array(&$this, '_remplacerFieldParCase'),
2974
+                $this->query);
2975
+        }
2976
+
2977
+        // Correction des noms de tables FROM
2978
+        // mettre les bons noms de table dans from, update, insert, replace...
2979
+        if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
2980
+            $suite = strstr($this->query, $regs[0]);
2981
+            $this->query = substr($this->query, 0, -strlen($suite));
2982
+        } else {
2983
+            $suite = '';
2984
+        }
2985
+        $pref = ($this->prefixe) ? $this->prefixe . "_" : "";
2986
+        $this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
2987
+
2988
+        // Correction zero AS x
2989
+        // pg n'aime pas 0+x AS alias, sqlite, dans le meme style, 
2990
+        // n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
2991
+        // il dit que x ne doit pas être un integer dans le order by !
2992
+        // on remplace du coup x par vide() dans ce cas uniquement
2993
+        //
2994
+        // rien que pour public/vertebrer.php ?
2995
+        if ((strpos($this->query, "0 AS") !== false)) {
2996
+            // on ne remplace que dans ORDER BY ou GROUP BY
2997
+            if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
2998
+                $suite = strstr($this->query, $regs[0]);
2999
+                $this->query = substr($this->query, 0, -strlen($suite));
3000
+
3001
+                // on cherche les noms des x dans 0 AS x
3002
+                // on remplace dans $suite le nom par vide()
3003
+                preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3004
+                foreach ($matches[1] as $m) {
3005
+                    $suite = str_replace($m, 'VIDE()', $suite);
3006
+                }
3007
+                $this->query .= $suite;
3008
+            }
3009
+        }
3010
+
3011
+        // Correction possible des divisions entieres
3012
+        // Le standard SQL (lequel? ou?) semble indiquer que
3013
+        // a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3014
+        // C'est ce que retournent effectivement SQL Server et SQLite
3015
+        // Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3016
+        // 
3017
+        // On peut forcer la conversion en multipliant par 1.0 avant la division
3018
+        // /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus ! 
3019
+        // cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3020
+        //     http://www.sqlite.org/cvstrac/tktview?tn=3202
3021
+        // (4*1.0/3) n'est pas rendu dans ce cas !
3022
+        # $this->query = str_replace('/','* 1.00 / ',$this->query);
3023
+
3024
+
3025
+        // Correction critere REGEXP, non reconnu en sqlite2
3026
+        if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3027
+            $this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3028
+        }
3029
+
3030
+        //
3031
+        // 3) Remise en place des textes d'origine
3032
+        //
3033
+        // Correction Antiquotes et echappements
3034
+        // ` => rien
3035
+        if (strpos($this->query, '`') !== false) {
3036
+            $this->query = str_replace('`', '', $this->query);
3037
+        }
3038
+
3039
+        $this->query = query_reinjecte_textes($this->query, $textes);
3040
+
3041
+        return $this->query;
3042
+    }
3043
+
3044
+
3045
+    /**
3046
+     * Callback pour remplacer `DATE_` / `INTERVAL`
3047
+     * par `DATE ... strtotime`
3048
+     *
3049
+     * @param array $matches Captures
3050
+     * @return string Texte de date compris par SQLite
3051
+     */
3052
+    public function _remplacerDateParTime($matches) {
3053
+        $op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3054
+
3055
+        return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3056
+    }
3057
+
3058
+    /**
3059
+     * Callback pour remplacer `FIELD(table,i,j,k...)`
3060
+     * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3061
+     *
3062
+     * @param array $matches Captures
3063
+     * @return string Texte de liste ordonnée compris par SQLite
3064
+     */
3065
+    public function _remplacerFieldParCase($matches) {
3066
+        $fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3067
+        $t = explode(',', $fields);
3068
+        $index = array_shift($t);
3069
+
3070
+        $res = '';
3071
+        $n = 0;
3072
+        foreach ($t as $v) {
3073
+            $n++;
3074
+            $res .= "\nWHEN $index=$v THEN $n";
3075
+        }
3076
+
3077
+        return "CASE $res ELSE 0 END ";
3078
+    }
3079 3079
 
3080 3080
 }
Please login to merge, or discard this patch.
Spacing   +90 added lines, -90 removed lines patch added patch discarded remove patch
@@ -64,27 +64,27 @@  discard block
 block discarded – undo
64 64
 	// determiner le dossier de la base : $addr ou _DIR_DB
65 65
 	$f = _DIR_DB;
66 66
 	if ($addr and strpos($addr, '/') !== false) {
67
-		$f = rtrim($addr, '/') . '/';
67
+		$f = rtrim($addr, '/').'/';
68 68
 	}
69 69
 
70 70
 	// un nom de base demande et impossible d'obtenir la base, on s'en va :
71 71
 	// il faut que la base existe ou que le repertoire parent soit writable
72
-	if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
73
-		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
72
+	if ($db and !is_file($f .= $db.'.sqlite') and !is_writable(dirname($f))) {
73
+		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.'._LOG_HS);
74 74
 
75 75
 		return false;
76 76
 	}
77 77
 
78 78
 	// charger les modules sqlite au besoin
79 79
 	if (!_sqlite_charger_version($sqlite_version)) {
80
-		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
80
+		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.'._LOG_HS);
81 81
 
82 82
 		return false;
83 83
 	}
84 84
 
85 85
 	// chargement des constantes
86 86
 	// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
87
-	$define = "spip_sqlite" . $sqlite_version . "_constantes";
87
+	$define = "spip_sqlite".$sqlite_version."_constantes";
88 88
 	$define();
89 89
 
90 90
 	$ok = false;
@@ -92,8 +92,8 @@  discard block
 block discarded – undo
92 92
 		// si pas de db ->
93 93
 		// base temporaire tant qu'on ne connait pas son vrai nom
94 94
 		// pour tester la connexion
95
-		$db = "_sqlite" . $sqlite_version . "_install";
96
-		$tmp = _DIR_DB . $db . ".sqlite";
95
+		$db = "_sqlite".$sqlite_version."_install";
96
+		$tmp = _DIR_DB.$db.".sqlite";
97 97
 		$ok = $link = new \PDO("sqlite:$tmp");
98 98
 	} else {
99 99
 		// Ouvrir (eventuellement creer la base)
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
 
103 103
 	if (!$ok) {
104 104
 		$e = _sqlite_last_error_from_link($link);
105
-		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
105
+		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.'._LOG_HS);
106 106
 
107 107
 		return false;
108 108
 	}
@@ -188,7 +188,7 @@  discard block
 block discarded – undo
188 188
 		$table = $regs[3];
189 189
 		$suite = $regs[4];
190 190
 	} else {
191
-		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
191
+		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.'._LOG_ERREUR);
192 192
 
193 193
 		return false;
194 194
 	}
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
 	$i = 0;
206 206
 	$ouverte = false;
207 207
 	while ($do = array_shift($todo)) {
208
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . "," . $do : $do;
208
+		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i].",".$do : $do;
209 209
 		$o = (false !== strpos($do, "("));
210 210
 		$f = (false !== strpos($do, ")"));
211 211
 		if ($o and !$f) {
@@ -229,7 +229,7 @@  discard block
 block discarded – undo
229 229
 			. ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
230 230
 		) {
231 231
 			spip_log("SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
232
-				'sqlite.' . _LOG_ERREUR);
232
+				'sqlite.'._LOG_ERREUR);
233 233
 
234 234
 			return false;
235 235
 		}
@@ -316,10 +316,10 @@  discard block
 block discarded – undo
316 316
 
317 317
 			// pas geres en sqlite2
318 318
 			case 'RENAME':
319
-				$do = "RENAME TO" . substr($do, 6);
319
+				$do = "RENAME TO".substr($do, 6);
320 320
 			case 'RENAME TO':
321 321
 				if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
322
-					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
322
+					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.'._LOG_ERREUR);
323 323
 
324 324
 					return false;
325 325
 				}
@@ -360,7 +360,7 @@  discard block
 block discarded – undo
360 360
 						$colonnes = substr($colonne_origine, 1, -1);
361 361
 						if (false !== strpos(",", $colonnes)) {
362 362
 							spip_log("SQLite : Erreur, impossible de creer un index sur plusieurs colonnes"
363
-								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
363
+								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.'._LOG_ERREUR);
364 364
 							break;
365 365
 						} else {
366 366
 							$nom_index = $colonnes;
@@ -375,12 +375,12 @@  discard block
 block discarded – undo
375 375
 
376 376
 			// pas geres en sqlite2
377 377
 			case 'ADD COLUMN':
378
-				$do = "ADD" . substr($do, 10);
378
+				$do = "ADD".substr($do, 10);
379 379
 			case 'ADD':
380 380
 			default:
381 381
 				if (!preg_match(',primary\s+key,i', $do)) {
382 382
 					if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
383
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
383
+						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.'._LOG_ERREUR);
384 384
 
385 385
 						return false;
386 386
 					}
@@ -401,7 +401,7 @@  discard block
 block discarded – undo
401 401
 					}
402 402
 					$opts['field'] = array($colonne_ajoutee => $def);
403 403
 					if (!_sqlite_modifier_table($table, array($colonne_ajoutee), $opts, $serveur)) {
404
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
404
+						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.'._LOG_ERREUR);
405 405
 
406 406
 						return false;
407 407
 					}
@@ -409,10 +409,10 @@  discard block
 block discarded – undo
409 409
 				break;
410 410
 		}
411 411
 		// tout est bon, ouf !
412
-		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
412
+		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.'._LOG_INFO);
413 413
 	}
414 414
 
415
-	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
415
+	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.'._LOG_INFO);
416 416
 
417 417
 	return true;
418 418
 }
@@ -481,9 +481,9 @@  discard block
 block discarded – undo
481 481
  * @return bool true si la base est créee.
482 482
  **/
483 483
 function spip_sqlite_create_base($nom, $serveur = '', $option = true) {
484
-	$f = $nom . '.sqlite';
484
+	$f = $nom.'.sqlite';
485 485
 	if (strpos($nom, "/") === false) {
486
-		$f = _DIR_DB . $f;
486
+		$f = _DIR_DB.$f;
487 487
 	}
488 488
 
489 489
 	$ok = new \PDO("sqlite:$f");
@@ -522,12 +522,12 @@  discard block
 block discarded – undo
522 522
 	// vue deja presente
523 523
 	if (sql_showtable($nom, false, $serveur)) {
524 524
 		spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
525
-			'sqlite.' . _LOG_ERREUR);
525
+			'sqlite.'._LOG_ERREUR);
526 526
 
527 527
 		return false;
528 528
 	}
529 529
 
530
-	$query = "CREATE VIEW $nom AS " . $query_select;
530
+	$query = "CREATE VIEW $nom AS ".$query_select;
531 531
 
532 532
 	return spip_sqlite_query($query, $serveur, $requeter);
533 533
 }
@@ -552,15 +552,15 @@  discard block
 block discarded – undo
552 552
  */
553 553
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) {
554 554
 	if (!($nom or $table or $champs)) {
555
-		spip_log("Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . "))",
556
-			'sqlite.' . _LOG_ERREUR);
555
+		spip_log("Champ manquant pour creer un index sqlite ($nom, $table, (".join(',', $champs)."))",
556
+			'sqlite.'._LOG_ERREUR);
557 557
 
558 558
 		return false;
559 559
 	}
560 560
 
561 561
 	// SQLite ne differentie pas noms des index en fonction des tables
562 562
 	// il faut donc creer des noms uniques d'index pour une base sqlite
563
-	$nom = $table . '_' . $nom;
563
+	$nom = $table.'_'.$nom;
564 564
 	// enlever d'eventuelles parentheses deja presentes sur champs
565 565
 	if (!is_array($champs)) {
566 566
 		if ($champs[0] == "(") {
@@ -582,12 +582,12 @@  discard block
 block discarded – undo
582 582
 	} else {
583 583
 		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
584 584
 		$a = spip_sqlite_showtable($table, $serveur);
585
-		if (isset($a['key']['KEY ' . $nom])) {
585
+		if (isset($a['key']['KEY '.$nom])) {
586 586
 			return true;
587 587
 		}
588 588
 	}
589 589
 
590
-	$query = "CREATE " . ($unique ? "UNIQUE " : "") . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ")";
590
+	$query = "CREATE ".($unique ? "UNIQUE " : "")."INDEX$ifnotexists $nom ON $table (".join(',', $champs).")";
591 591
 	$res = spip_sqlite_query($query, $serveur, $requeter);
592 592
 	if (!$requeter) {
593 593
 		return $res;
@@ -663,7 +663,7 @@  discard block
 block discarded – undo
663 663
 	$serveur = '',
664 664
 	$requeter = true
665 665
 ) {
666
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
666
+	$c = !$groupby ? '*' : ('DISTINCT '.(is_string($groupby) ? $groupby : join(',', $groupby)));
667 667
 	$r = spip_sqlite_select("COUNT($c)", $from, $where, '', '', '',
668 668
 		$having, $serveur, $requeter);
669 669
 	if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
@@ -761,14 +761,14 @@  discard block
 block discarded – undo
761 761
  */
762 762
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true) {
763 763
 	if (!($nom or $table)) {
764
-		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
764
+		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.'._LOG_ERREUR);
765 765
 
766 766
 		return false;
767 767
 	}
768 768
 
769 769
 	// SQLite ne differentie pas noms des index en fonction des tables
770 770
 	// il faut donc creer des noms uniques d'index pour une base sqlite
771
-	$index = $table . '_' . $nom;
771
+	$index = $table.'_'.$nom;
772 772
 	$exist = " IF EXISTS";
773 773
 
774 774
 	$query = "DROP INDEX$exist $index";
@@ -800,7 +800,7 @@  discard block
 block discarded – undo
800 800
 	if ($s) {
801 801
 		$trace = debug_backtrace();
802 802
 		if ($trace[0]['function'] != "spip_sqlite_error") {
803
-			spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
803
+			spip_log("$s - $query - ".sql_error_backtrace(), 'sqlite.'._LOG_ERREUR);
804 804
 		}
805 805
 	}
806 806
 
@@ -847,14 +847,14 @@  discard block
 block discarded – undo
847 847
 		$t = $link->errorInfo();
848 848
 		$s = ltrim($t[0], '0'); // 00000 si pas d'erreur
849 849
 		if ($s) {
850
-			$s .= ' / ' . $t[1];
850
+			$s .= ' / '.$t[1];
851 851
 		} // ajoute l'erreur du moteur SQLite
852 852
 	} else {
853 853
 		$s = ": aucune ressource sqlite (link)";
854 854
 	}
855 855
 
856 856
 	if ($s) {
857
-		spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
857
+		spip_log("Erreur sqlite $s", 'sqlite.'._LOG_ERREUR);
858 858
 	}
859 859
 
860 860
 	return $s ? $s : 0;
@@ -878,7 +878,7 @@  discard block
 block discarded – undo
878 878
 	}
879 879
 
880 880
 	$query = spip_sqlite::traduire_requete($query, $serveur);
881
-	$query = 'EXPLAIN ' . $query;
881
+	$query = 'EXPLAIN '.$query;
882 882
 	if (!$requeter) {
883 883
 		return $query;
884 884
 	}
@@ -1038,7 +1038,7 @@  discard block
 block discarded – undo
1038 1038
  **/
1039 1039
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = array(), $serveur = '', $requeter = true) {
1040 1040
 
1041
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : "DEFAULT VALUES");
1041
+	$query = "INSERT INTO $table ".($champs ? "$champs VALUES $valeurs" : "DEFAULT VALUES");
1042 1042
 	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1043 1043
 		if (!$requeter) {
1044 1044
 			return $r;
@@ -1094,8 +1094,8 @@  discard block
 block discarded – undo
1094 1094
 
1095 1095
 	$cles = $valeurs = "";
1096 1096
 	if (count($couples)) {
1097
-		$cles = "(" . join(',', array_keys($couples)) . ")";
1098
-		$valeurs = "(" . join(',', $couples) . ")";
1097
+		$cles = "(".join(',', array_keys($couples)).")";
1098
+		$valeurs = "(".join(',', $couples).")";
1099 1099
 	}
1100 1100
 
1101 1101
 	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
@@ -1155,11 +1155,11 @@  discard block
 block discarded – undo
1155 1155
 
1156 1156
 		$champs = $valeurs = "";
1157 1157
 		if (count($couples)) {
1158
-			$champs = "(" . join(',', array_keys($couples)) . ")";
1159
-			$valeurs = "(" . join(',', $couples) . ")";
1160
-			$query = $query_start . "$champs VALUES $valeurs";
1158
+			$champs = "(".join(',', array_keys($couples)).")";
1159
+			$valeurs = "(".join(',', $couples).")";
1160
+			$query = $query_start."$champs VALUES $valeurs";
1161 1161
 		} else {
1162
-			$query = $query_start . "DEFAULT VALUES";
1162
+			$query = $query_start."DEFAULT VALUES";
1163 1163
 		}
1164 1164
 
1165 1165
 		if ($requeter) {
@@ -1291,7 +1291,7 @@  discard block
 block discarded – undo
1291 1291
  * @return string       Texte de sélection pour la requête
1292 1292
  */
1293 1293
 function spip_sqlite_multi($objet, $lang) {
1294
-	$r = "EXTRAIRE_MULTI(" . $objet . ", '" . $lang . "') AS multi";
1294
+	$r = "EXTRAIRE_MULTI(".$objet.", '".$lang."') AS multi";
1295 1295
 
1296 1296
 	return $r;
1297 1297
 }
@@ -1362,7 +1362,7 @@  discard block
 block discarded – undo
1362 1362
 function spip_sqlite_date_proche($champ, $interval, $unite) {
1363 1363
 	$op = (($interval <= 0) ? '>' : '<');
1364 1364
 
1365
-	return "($champ $op datetime('" . date("Y-m-d H:i:s") . "', '$interval $unite'))";
1365
+	return "($champ $op datetime('".date("Y-m-d H:i:s")."', '$interval $unite'))";
1366 1366
 }
1367 1367
 
1368 1368
 
@@ -1392,7 +1392,7 @@  discard block
 block discarded – undo
1392 1392
 				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1393 1393
 			) {
1394 1394
 				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1395
-				spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE);
1395
+				spip_log("ALTER $q", "repair"._LOG_INFO_IMPORTANTE);
1396 1396
 			}
1397 1397
 			if (preg_match(",^(INTEGER),i", $d)
1398 1398
 				and stripos($d, "NOT NULL") !== false
@@ -1401,7 +1401,7 @@  discard block
 block discarded – undo
1401 1401
 				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1402 1402
 			) {
1403 1403
 				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1404
-				spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE);
1404
+				spip_log("ALTER $q", "repair"._LOG_INFO_IMPORTANTE);
1405 1405
 			}
1406 1406
 			if (preg_match(",^(datetime),i", $d)
1407 1407
 				and stripos($d, "NOT NULL") !== false
@@ -1410,7 +1410,7 @@  discard block
 block discarded – undo
1410 1410
 				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1411 1411
 			) {
1412 1412
 				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1413
-				spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE);
1413
+				spip_log("ALTER $q", "repair"._LOG_INFO_IMPORTANTE);
1414 1414
 			}
1415 1415
 		}
1416 1416
 
@@ -1461,8 +1461,8 @@  discard block
 block discarded – undo
1461 1461
 	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1462 1462
 	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1463 1463
 
1464
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(',',
1465
-			$couples) . ')', $serveur);
1464
+	return spip_sqlite_query("REPLACE INTO $table (".join(',', array_keys($couples)).') VALUES ('.join(',',
1465
+			$couples).')', $serveur);
1466 1466
 }
1467 1467
 
1468 1468
 
@@ -1548,7 +1548,7 @@  discard block
 block discarded – undo
1548 1548
 		. _sqlite_calculer_expression('WHERE', $where)
1549 1549
 		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1550 1550
 		. _sqlite_calculer_expression('HAVING', $having)
1551
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1551
+		. ($orderby ? ("\nORDER BY "._sqlite_calculer_order($orderby)) : '')
1552 1552
 		. ($limit ? "\nLIMIT $limit" : '');
1553 1553
 
1554 1554
 	// dans un select, on doit renvoyer la requête en cas d'erreur
@@ -1585,10 +1585,10 @@  discard block
 block discarded – undo
1585 1585
 
1586 1586
 	// interdire la creation d'une nouvelle base, 
1587 1587
 	// sauf si on est dans l'installation
1588
-	if (!is_file($f = _DIR_DB . $db . '.sqlite')
1588
+	if (!is_file($f = _DIR_DB.$db.'.sqlite')
1589 1589
 		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1590 1590
 	) {
1591
-		spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1591
+		spip_log("Il est interdit de creer la base $db", 'sqlite.'._LOG_HS);
1592 1592
 
1593 1593
 		return false;
1594 1594
 	}
@@ -1597,12 +1597,12 @@  discard block
 block discarded – undo
1597 1597
 	// avec les identifiants connus
1598 1598
 	$index = $serveur ? $serveur : 0;
1599 1599
 
1600
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1600
+	if ($link = spip_connect_db('', '', '', '', '@selectdb@'.$db, $serveur, '', '')) {
1601 1601
 		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1602 1602
 			return $db;
1603 1603
 		}
1604 1604
 	} else {
1605
-		spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1605
+		spip_log("Impossible de selectionner la base $db", 'sqlite.'._LOG_HS);
1606 1606
 
1607 1607
 		return false;
1608 1608
 	}
@@ -1653,7 +1653,7 @@  discard block
 block discarded – undo
1653 1653
 	$match = str_replace("[[POURCENT]]", "%", $match);
1654 1654
 	$match = "^$match$";
1655 1655
 
1656
-	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1656
+	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP "._q($match),
1657 1657
 		$serveur, $requeter);
1658 1658
 }
1659 1659
 
@@ -1741,7 +1741,7 @@  discard block
 block discarded – undo
1741 1741
 
1742 1742
 				# rustine pour DECIMAL(10,2)
1743 1743
 				if (false !== strpos($k, ')')) {
1744
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1744
+					$fields[$k_precedent] .= ','.$k.' '.$def;
1745 1745
 					continue;
1746 1746
 				}
1747 1747
 
@@ -1776,13 +1776,13 @@  discard block
 block discarded – undo
1776 1776
 				. 'ORDER BY substr(type,2,1), name';
1777 1777
 			$a = spip_sqlite_query($query, $serveur, $requeter);
1778 1778
 			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1779
-				$key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1779
+				$key = str_replace($nom_table.'_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1780 1780
 				$keytype = "KEY";
1781 1781
 				if (strpos($r['sql'], "UNIQUE INDEX") !== false) {
1782 1782
 					$keytype = "UNIQUE KEY";
1783 1783
 				}
1784 1784
 				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1785
-				$keys[$keytype . ' ' . $key] = $colonnes;
1785
+				$keys[$keytype.' '.$key] = $colonnes;
1786 1786
 			}
1787 1787
 		}
1788 1788
 
@@ -1831,7 +1831,7 @@  discard block
 block discarded – undo
1831 1831
 
1832 1832
 	$set = array();
1833 1833
 	foreach ($champs as $champ => $val) {
1834
-		$set[] = $champ . "=$val";
1834
+		$set[] = $champ."=$val";
1835 1835
 	}
1836 1836
 	if (!empty($set)) {
1837 1837
 		return spip_sqlite_query(
@@ -1885,7 +1885,7 @@  discard block
 block discarded – undo
1885 1885
 
1886 1886
 	$set = array();
1887 1887
 	foreach ($champs as $champ => $val) {
1888
-		$set[] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1888
+		$set[] = $champ.'='._sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1889 1889
 	}
1890 1890
 
1891 1891
 	return spip_sqlite_query(
@@ -1911,7 +1911,7 @@  discard block
 block discarded – undo
1911 1911
  */
1912 1912
 function _sqlite_init() {
1913 1913
 	if (!defined('_DIR_DB')) {
1914
-		define('_DIR_DB', _DIR_ETC . 'bases/');
1914
+		define('_DIR_DB', _DIR_ETC.'bases/');
1915 1915
 	}
1916 1916
 	if (!defined('_SQLITE_CHMOD')) {
1917 1917
 		define('_SQLITE_CHMOD', _SPIP_CHMOD);
@@ -2014,9 +2014,9 @@  discard block
 block discarded – undo
2014 2014
 	}
2015 2015
 
2016 2016
 	// echapper les ' en ''
2017
-	spip_log("Pas de methode ->quote pour echapper", "sqlite." . _LOG_INFO_IMPORTANTE);
2017
+	spip_log("Pas de methode ->quote pour echapper", "sqlite."._LOG_INFO_IMPORTANTE);
2018 2018
 
2019
-	return ("'" . str_replace("'", "''", $v) . "'");
2019
+	return ("'".str_replace("'", "''", $v)."'");
2020 2020
 }
2021 2021
 
2022 2022
 
@@ -2039,12 +2039,12 @@  discard block
 block discarded – undo
2039 2039
 	$exp = "\n$expression ";
2040 2040
 
2041 2041
 	if (!is_array($v)) {
2042
-		return $exp . $v;
2042
+		return $exp.$v;
2043 2043
 	} else {
2044 2044
 		if (strtoupper($join) === 'AND') {
2045
-			return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2045
+			return $exp.join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2046 2046
 		} else {
2047
-			return $exp . join($join, $v);
2047
+			return $exp.join($join, $v);
2048 2048
 		}
2049 2049
 	}
2050 2050
 }
@@ -2078,17 +2078,17 @@  discard block
 block discarded – undo
2078 2078
 		if (substr($k, -1) == '@') {
2079 2079
 			// c'est une jointure qui se refere au from precedent
2080 2080
 			// pas de virgule
2081
-			$res .= '  ' . $v;
2081
+			$res .= '  '.$v;
2082 2082
 		} else {
2083 2083
 			if (!is_numeric($k)) {
2084 2084
 				$p = strpos($v, " ");
2085 2085
 				if ($p) {
2086
-					$v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2086
+					$v = substr($v, 0, $p)." AS '$k'".substr($v, $p);
2087 2087
 				} else {
2088 2088
 					$v .= " AS '$k'";
2089 2089
 				}
2090 2090
 			}
2091
-			$res .= ', ' . $v;
2091
+			$res .= ', '.$v;
2092 2092
 		}
2093 2093
 	}
2094 2094
 
@@ -2226,13 +2226,13 @@  discard block
 block discarded – undo
2226 2226
 
2227 2227
 	$def_origine = sql_showtable($table_origine, false, $serveur);
2228 2228
 	if (!$def_origine or !isset($def_origine['field'])) {
2229
-		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2229
+		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite'._LOG_ERREUR);
2230 2230
 
2231 2231
 		return false;
2232 2232
 	}
2233 2233
 
2234 2234
 
2235
-	$table_tmp = $table_origine . '_tmp';
2235
+	$table_tmp = $table_origine.'_tmp';
2236 2236
 
2237 2237
 	// 1) creer une table temporaire avec les modifications	
2238 2238
 	// - DROP : suppression de la colonne
@@ -2318,7 +2318,7 @@  discard block
 block discarded – undo
2318 2318
 		} else {
2319 2319
 			// enlever KEY
2320 2320
 			$k = substr($k, 4);
2321
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2321
+			$queries[] = "CREATE INDEX $table_destination"."_$k ON $table_destination ($v)";
2322 2322
 		}
2323 2323
 	}
2324 2324
 
@@ -2329,7 +2329,7 @@  discard block
 block discarded – undo
2329 2329
 		foreach ($queries as $q) {
2330 2330
 			if (!spip_sqlite::executer_requete($q, $serveur)) {
2331 2331
 				spip_log("SQLite : ALTER TABLE table :"
2332
-					. " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2332
+					. " Erreur a l'execution de la requete : $q", 'sqlite.'._LOG_ERREUR);
2333 2333
 				spip_sqlite::annuler_transaction($serveur);
2334 2334
 
2335 2335
 				return false;
@@ -2418,26 +2418,26 @@  discard block
 block discarded – undo
2418 2418
 	$enum = "(\s*\([^\)]*\))?";
2419 2419
 
2420 2420
 	$remplace = array(
2421
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2421
+		'/enum'.$enum.'/is' => 'VARCHAR(255)',
2422 2422
 		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2423 2423
 		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2424 2424
 		'/auto_increment/is' => '',
2425 2425
 		'/(timestamp .* )ON .*$/is' => '\\1',
2426 2426
 		'/character set \w+/is' => '',
2427
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2427
+		'/((big|small|medium|tiny)?int(eger)?)'.$num.'\s*unsigned/is' => '\\1 UNSIGNED',
2428 2428
 		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2429
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2429
+		'/((char|varchar)'.$num.'\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2430 2430
 		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2431 2431
 		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2432 2432
 	);
2433 2433
 
2434 2434
 	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2435 2435
 	$remplace_autocinc = array(
2436
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2436
+		'/(big|small|medium|tiny)?int(eger)?'.$num.'/is' => 'INTEGER'
2437 2437
 	);
2438 2438
 	// pour les int non autoincrement, il faut un DEFAULT
2439 2439
 	$remplace_nonautocinc = array(
2440
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2440
+		'/((big|small|medium|tiny)?int(eger)?'.$num.'\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2441 2441
 	);
2442 2442
 
2443 2443
 	if (is_string($query)) {
@@ -2479,7 +2479,7 @@  discard block
 block discarded – undo
2479 2479
 		return str_ireplace("BINARY", "COLLATE BINARY", $champ);
2480 2480
 	}
2481 2481
 	if (preg_match(",^(char|varchar|(long|small|medium|tiny)?text),i", $champ)) {
2482
-		return $champ . " COLLATE NOCASE";
2482
+		return $champ." COLLATE NOCASE";
2483 2483
 	}
2484 2484
 
2485 2485
 	return $champ;
@@ -2566,7 +2566,7 @@  discard block
 block discarded – undo
2566 2566
 		} else {
2567 2567
 			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2568 2568
 			$a = spip_sqlite_showtable($nom, $serveur);
2569
-			if (isset($a['key']['KEY ' . $nom])) {
2569
+			if (isset($a['key']['KEY '.$nom])) {
2570 2570
 				return true;
2571 2571
 			}
2572 2572
 		}
@@ -2574,7 +2574,7 @@  discard block
 block discarded – undo
2574 2574
 	}
2575 2575
 
2576 2576
 	$temporary = $temporary ? ' TEMPORARY' : '';
2577
-	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2577
+	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query".($keys ? ",$keys" : '').")\n";
2578 2578
 
2579 2579
 	return $q;
2580 2580
 }
@@ -2788,7 +2788,7 @@  discard block
 block discarded – undo
2788 2788
 		$this->serveur = strtolower($serveur);
2789 2789
 
2790 2790
 		if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2791
-			spip_log("Aucune connexion sqlite (link)", 'sqlite.' . _LOG_ERREUR);
2791
+			spip_log("Aucune connexion sqlite (link)", 'sqlite.'._LOG_ERREUR);
2792 2792
 
2793 2793
 			return false;
2794 2794
 		}
@@ -2849,8 +2849,8 @@  discard block
 block discarded – undo
2849 2849
 
2850 2850
 			// loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2851 2851
 			if ($err = (function_exists('error_get_last') ? error_get_last() : "") and $err != $e) {
2852
-				$err = strip_tags($err['message']) . " in " . $err['file'] . " line " . $err['line'];
2853
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2852
+				$err = strip_tags($err['message'])." in ".$err['file']." line ".$err['line'];
2853
+				spip_log("$err - ".$query, 'sqlite.'._LOG_ERREUR);
2854 2854
 			} else {
2855 2855
 				$err = "";
2856 2856
 			}
@@ -2929,15 +2929,15 @@  discard block
 block discarded – undo
2929 2929
 		// Correction Create Database
2930 2930
 		// Create Database -> requete ignoree
2931 2931
 		if (strpos($this->query, 'CREATE DATABASE') === 0) {
2932
-			spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
2932
+			spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.'._LOG_AVERTISSEMENT);
2933 2933
 			$this->query = "SELECT 1";
2934 2934
 		}
2935 2935
 
2936 2936
 		// Correction Insert Ignore
2937 2937
 		// INSERT IGNORE -> insert (tout court et pas 'insert or replace')
2938 2938
 		if (strpos($this->query, 'INSERT IGNORE') === 0) {
2939
-			spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
2940
-			$this->query = 'INSERT ' . substr($this->query, '13');
2939
+			spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.'._LOG_DEBUG);
2940
+			$this->query = 'INSERT '.substr($this->query, '13');
2941 2941
 		}
2942 2942
 
2943 2943
 		// Correction des dates avec INTERVAL
@@ -2962,7 +2962,7 @@  discard block
 block discarded – undo
2962 2962
 		// problematique car la jointure ne se fait pas du coup.
2963 2963
 		if (($this->sqlite_version == 2) && (strpos($this->query, "USING") !== false)) {
2964 2964
 			spip_log("'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
2965
-				'sqlite.' . _LOG_ERREUR);
2965
+				'sqlite.'._LOG_ERREUR);
2966 2966
 			$this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
2967 2967
 		}
2968 2968
 
@@ -2982,8 +2982,8 @@  discard block
 block discarded – undo
2982 2982
 		} else {
2983 2983
 			$suite = '';
2984 2984
 		}
2985
-		$pref = ($this->prefixe) ? $this->prefixe . "_" : "";
2986
-		$this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
2985
+		$pref = ($this->prefixe) ? $this->prefixe."_" : "";
2986
+		$this->query = preg_replace('/([,\s])spip_/S', '\1'.$pref, $this->query).$suite;
2987 2987
 
2988 2988
 		// Correction zero AS x
2989 2989
 		// pg n'aime pas 0+x AS alias, sqlite, dans le meme style, 
Please login to merge, or discard this patch.