Completed
Push — master ( 6d7580...98d900 )
by cam
01:11
created
ecrire/iterateur/sql.php 1 patch
Indentation   +204 added lines, -204 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 
@@ -28,210 +28,210 @@  discard block
 block discarded – undo
28 28
  */
29 29
 class IterateurSQL implements Iterator {
30 30
 
31
-	/**
32
-	 * Ressource sql
33
-	 *
34
-	 * @var Object|bool
35
-	 */
36
-	protected $sqlresult = false;
37
-
38
-	/**
39
-	 * row sql courante
40
-	 *
41
-	 * @var array|null
42
-	 */
43
-	protected $row = null;
44
-
45
-	protected $firstseek = false;
46
-
47
-	/**
48
-	 * Erreur presente ?
49
-	 *
50
-	 * @var bool
51
-	 **/
52
-	public $err = false;
53
-
54
-	/**
55
-	 * Calcul du total des elements
56
-	 *
57
-	 * @var int|null
58
-	 **/
59
-	public $total = null;
60
-
61
-	/**
62
-	 * selectionner les donnees, ie faire la requete SQL
63
-	 *
64
-	 * @return void
65
-	 */
66
-	protected function select() {
67
-		$this->row = null;
68
-		$v = &$this->command;
69
-		$this->sqlresult = calculer_select(
70
-			$v['select'],
71
-			$v['from'],
72
-			$v['type'],
73
-			$v['where'],
74
-			$v['join'],
75
-			$v['groupby'],
76
-			$v['orderby'],
77
-			$v['limit'],
78
-			$v['having'],
79
-			$v['table'],
80
-			$v['id'],
81
-			$v['connect'],
82
-			$this->info
83
-		);
84
-		$this->err = !$this->sqlresult;
85
-		$this->firstseek = false;
86
-		$this->pos = -1;
87
-
88
-		// pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite)
89
-		//$this->total = $this->count();
90
-	}
91
-
92
-	/*
31
+    /**
32
+     * Ressource sql
33
+     *
34
+     * @var Object|bool
35
+     */
36
+    protected $sqlresult = false;
37
+
38
+    /**
39
+     * row sql courante
40
+     *
41
+     * @var array|null
42
+     */
43
+    protected $row = null;
44
+
45
+    protected $firstseek = false;
46
+
47
+    /**
48
+     * Erreur presente ?
49
+     *
50
+     * @var bool
51
+     **/
52
+    public $err = false;
53
+
54
+    /**
55
+     * Calcul du total des elements
56
+     *
57
+     * @var int|null
58
+     **/
59
+    public $total = null;
60
+
61
+    /**
62
+     * selectionner les donnees, ie faire la requete SQL
63
+     *
64
+     * @return void
65
+     */
66
+    protected function select() {
67
+        $this->row = null;
68
+        $v = &$this->command;
69
+        $this->sqlresult = calculer_select(
70
+            $v['select'],
71
+            $v['from'],
72
+            $v['type'],
73
+            $v['where'],
74
+            $v['join'],
75
+            $v['groupby'],
76
+            $v['orderby'],
77
+            $v['limit'],
78
+            $v['having'],
79
+            $v['table'],
80
+            $v['id'],
81
+            $v['connect'],
82
+            $this->info
83
+        );
84
+        $this->err = !$this->sqlresult;
85
+        $this->firstseek = false;
86
+        $this->pos = -1;
87
+
88
+        // pas d'init a priori, le calcul ne sera fait qu'en cas de besoin (provoque une double requete souvent inutile en sqlite)
89
+        //$this->total = $this->count();
90
+    }
91
+
92
+    /*
93 93
 	 * array command: les commandes d'initialisation
94 94
 	 * array info: les infos sur le squelette
95 95
 	 */
96
-	public function __construct($command, $info = []) {
97
-		$this->type = 'SQL';
98
-		$this->command = $command;
99
-		$this->info = $info;
100
-		$this->select();
101
-	}
102
-
103
-	/**
104
-	 * Rembobiner
105
-	 *
106
-	 * @return bool
107
-	 */
108
-	public function rewind() : void {
109
-		if ($this->pos > 0) {
110
-			$this->seek(0);
111
-		}
112
-	}
113
-
114
-	/**
115
-	 * Verifier l'etat de l'iterateur
116
-	 *
117
-	 * @return bool
118
-	 */
119
-	public function valid(): bool {
120
-		if ($this->err) {
121
-			return false;
122
-		}
123
-		if (!$this->firstseek) {
124
-			$this->next();
125
-		}
126
-
127
-		return is_array($this->row);
128
-	}
129
-
130
-	/**
131
-	 * Valeurs sur la position courante
132
-	 *
133
-	 * @return array
134
-	 */
135
-	#[\ReturnTypeWillChange]
136
-	public function current() {
137
-		return $this->row;
138
-	}
139
-
140
-	#[\ReturnTypeWillChange]
141
-	public function key() {
142
-		return $this->pos;
143
-	}
144
-
145
-	/**
146
-	 * Sauter a une position absolue
147
-	 *
148
-	 * @param int $n
149
-	 * @param null|string $continue
150
-	 * @return bool
151
-	 */
152
-	public function seek($n = 0, $continue = null) {
153
-		if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) {
154
-			// SQLite ne sait pas seek(), il faut relancer la query
155
-			// si la position courante est apres la position visee
156
-			// il faut relancer la requete
157
-			if ($this->pos > $n) {
158
-				$this->free();
159
-				$this->select();
160
-				$this->valid();
161
-			}
162
-			// et utiliser la methode par defaut pour se deplacer au bon endroit
163
-			// (sera fait en cas d'echec de cette fonction)
164
-			return false;
165
-		}
166
-		$this->row = sql_fetch($this->sqlresult, $this->command['connect']);
167
-		$this->pos = min($n, $this->count());
168
-
169
-		return true;
170
-	}
171
-
172
-	/**
173
-	 * Avancer d'un cran
174
-	 *
175
-	 * @return void
176
-	 */
177
-	public function next() : void {
178
-		$this->row = sql_fetch($this->sqlresult, $this->command['connect']);
179
-		$this->pos++;
180
-		$this->firstseek |= true;
181
-	}
182
-
183
-	/**
184
-	 * Avancer et retourner les donnees pour le nouvel element
185
-	 *
186
-	 * @return array|bool|null
187
-	 */
188
-	public function fetch() {
189
-		if ($this->valid()) {
190
-			$r = $this->current();
191
-			$this->next();
192
-		} else {
193
-			$r = false;
194
-		}
195
-
196
-		return $r;
197
-	}
198
-
199
-	/**
200
-	 * liberer les ressources
201
-	 *
202
-	 * @return bool
203
-	 */
204
-	public function free() {
205
-		if (!$this->sqlresult) {
206
-			return true;
207
-		}
208
-		$a = sql_free($this->sqlresult, $this->command['connect']);
209
-		$this->sqlresult = null;
210
-
211
-		return $a;
212
-	}
213
-
214
-	/**
215
-	 * Compter le nombre de resultats
216
-	 *
217
-	 * @return int
218
-	 */
219
-	public function count() {
220
-		if (is_null($this->total)) {
221
-			if (!$this->sqlresult) {
222
-				$this->total = 0;
223
-			} else {
224
-				# cas count(*)
225
-				if (in_array('count(*)', $this->command['select'])) {
226
-					$this->valid();
227
-					$s = $this->current();
228
-					$this->total = $s['count(*)'];
229
-				} else {
230
-					$this->total = sql_count($this->sqlresult, $this->command['connect']);
231
-				}
232
-			}
233
-		}
234
-
235
-		return $this->total;
236
-	}
96
+    public function __construct($command, $info = []) {
97
+        $this->type = 'SQL';
98
+        $this->command = $command;
99
+        $this->info = $info;
100
+        $this->select();
101
+    }
102
+
103
+    /**
104
+     * Rembobiner
105
+     *
106
+     * @return bool
107
+     */
108
+    public function rewind() : void {
109
+        if ($this->pos > 0) {
110
+            $this->seek(0);
111
+        }
112
+    }
113
+
114
+    /**
115
+     * Verifier l'etat de l'iterateur
116
+     *
117
+     * @return bool
118
+     */
119
+    public function valid(): bool {
120
+        if ($this->err) {
121
+            return false;
122
+        }
123
+        if (!$this->firstseek) {
124
+            $this->next();
125
+        }
126
+
127
+        return is_array($this->row);
128
+    }
129
+
130
+    /**
131
+     * Valeurs sur la position courante
132
+     *
133
+     * @return array
134
+     */
135
+    #[\ReturnTypeWillChange]
136
+    public function current() {
137
+        return $this->row;
138
+    }
139
+
140
+    #[\ReturnTypeWillChange]
141
+    public function key() {
142
+        return $this->pos;
143
+    }
144
+
145
+    /**
146
+     * Sauter a une position absolue
147
+     *
148
+     * @param int $n
149
+     * @param null|string $continue
150
+     * @return bool
151
+     */
152
+    public function seek($n = 0, $continue = null) {
153
+        if (!sql_seek($this->sqlresult, $n, $this->command['connect'], $continue)) {
154
+            // SQLite ne sait pas seek(), il faut relancer la query
155
+            // si la position courante est apres la position visee
156
+            // il faut relancer la requete
157
+            if ($this->pos > $n) {
158
+                $this->free();
159
+                $this->select();
160
+                $this->valid();
161
+            }
162
+            // et utiliser la methode par defaut pour se deplacer au bon endroit
163
+            // (sera fait en cas d'echec de cette fonction)
164
+            return false;
165
+        }
166
+        $this->row = sql_fetch($this->sqlresult, $this->command['connect']);
167
+        $this->pos = min($n, $this->count());
168
+
169
+        return true;
170
+    }
171
+
172
+    /**
173
+     * Avancer d'un cran
174
+     *
175
+     * @return void
176
+     */
177
+    public function next() : void {
178
+        $this->row = sql_fetch($this->sqlresult, $this->command['connect']);
179
+        $this->pos++;
180
+        $this->firstseek |= true;
181
+    }
182
+
183
+    /**
184
+     * Avancer et retourner les donnees pour le nouvel element
185
+     *
186
+     * @return array|bool|null
187
+     */
188
+    public function fetch() {
189
+        if ($this->valid()) {
190
+            $r = $this->current();
191
+            $this->next();
192
+        } else {
193
+            $r = false;
194
+        }
195
+
196
+        return $r;
197
+    }
198
+
199
+    /**
200
+     * liberer les ressources
201
+     *
202
+     * @return bool
203
+     */
204
+    public function free() {
205
+        if (!$this->sqlresult) {
206
+            return true;
207
+        }
208
+        $a = sql_free($this->sqlresult, $this->command['connect']);
209
+        $this->sqlresult = null;
210
+
211
+        return $a;
212
+    }
213
+
214
+    /**
215
+     * Compter le nombre de resultats
216
+     *
217
+     * @return int
218
+     */
219
+    public function count() {
220
+        if (is_null($this->total)) {
221
+            if (!$this->sqlresult) {
222
+                $this->total = 0;
223
+            } else {
224
+                # cas count(*)
225
+                if (in_array('count(*)', $this->command['select'])) {
226
+                    $this->valid();
227
+                    $s = $this->current();
228
+                    $this->total = $s['count(*)'];
229
+                } else {
230
+                    $this->total = sql_count($this->sqlresult, $this->command['connect']);
231
+                }
232
+            }
233
+        }
234
+
235
+        return $this->total;
236
+    }
237 237
 }
Please login to merge, or discard this patch.
ecrire/req/sqlite_fonctions.php 1 patch
Indentation   +229 added lines, -229 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
  */
23 23
 
24 24
 if (!defined('_ECRIRE_INC_VERSION')) {
25
-	return;
25
+    return;
26 26
 }
27 27
 
28 28
 /**
@@ -43,90 +43,90 @@  discard block
 block discarded – undo
43 43
  */
44 44
 function _sqlite_init_functions(&$sqlite) {
45 45
 
46
-	if (!$sqlite) {
47
-		return false;
48
-	}
46
+    if (!$sqlite) {
47
+        return false;
48
+    }
49 49
 
50 50
 
51
-	$fonctions = [
52
-		// A
53
-		'ACOS'  => ['acos', 1],
54
-		'ASIN'  => ['asin', 1],
55
-		'ATAN'  => ['atan', 1], // mysql accepte 2 params comme atan2… hum ?
56
-		'ATAN2' => ['atan2', 2],
51
+    $fonctions = [
52
+        // A
53
+        'ACOS'  => ['acos', 1],
54
+        'ASIN'  => ['asin', 1],
55
+        'ATAN'  => ['atan', 1], // mysql accepte 2 params comme atan2… hum ?
56
+        'ATAN2' => ['atan2', 2],
57 57
 
58
-		// C
59
-		'CEIL'   => ['_sqlite_func_ceil', 1],
60
-		'CONCAT' => ['_sqlite_func_concat', -1],
61
-		'COS'    => ['cos', 1],
58
+        // C
59
+        'CEIL'   => ['_sqlite_func_ceil', 1],
60
+        'CONCAT' => ['_sqlite_func_concat', -1],
61
+        'COS'    => ['cos', 1],
62 62
 
63
-		// D
64
-		'DATE_FORMAT' => ['_sqlite_func_date_format', 2], // équivalent a strftime avec args inversés
65
-		'DAYOFMONTH'  => ['_sqlite_func_dayofmonth', 1],
66
-		'DEGREES'     => ['rad2deg', 1],
63
+        // D
64
+        'DATE_FORMAT' => ['_sqlite_func_date_format', 2], // équivalent a strftime avec args inversés
65
+        'DAYOFMONTH'  => ['_sqlite_func_dayofmonth', 1],
66
+        'DEGREES'     => ['rad2deg', 1],
67 67
 
68
-		// E
69
-		'EXTRAIRE_MULTI' => ['_sqlite_func_extraire_multi', 2], // specifique a SPIP/sql_multi()
70
-		'EXP'            => ['exp', 1],
68
+        // E
69
+        'EXTRAIRE_MULTI' => ['_sqlite_func_extraire_multi', 2], // specifique a SPIP/sql_multi()
70
+        'EXP'            => ['exp', 1],
71 71
 
72
-		// F
73
-		'FIND_IN_SET' => ['_sqlite_func_find_in_set', 2],
74
-		'FLOOR'       => ['_sqlite_func_floor', 1],
72
+        // F
73
+        'FIND_IN_SET' => ['_sqlite_func_find_in_set', 2],
74
+        'FLOOR'       => ['_sqlite_func_floor', 1],
75 75
 
76
-		// G
77
-		'GREATEST' => ['_sqlite_func_greatest', -1],
76
+        // G
77
+        'GREATEST' => ['_sqlite_func_greatest', -1],
78 78
 
79
-		// I
80
-		'IF'     => ['_sqlite_func_if', 3],
81
-		'INSERT' => ['_sqlite_func_insert', 4],
82
-		'INSTR'  => ['_sqlite_func_instr', 2],
79
+        // I
80
+        'IF'     => ['_sqlite_func_if', 3],
81
+        'INSERT' => ['_sqlite_func_insert', 4],
82
+        'INSTR'  => ['_sqlite_func_instr', 2],
83 83
 
84
-		// L
85
-		'LEAST'  => ['_sqlite_func_least', -1],
86
-		'_LEFT'  => ['_sqlite_func_left', 2],
84
+        // L
85
+        'LEAST'  => ['_sqlite_func_least', -1],
86
+        '_LEFT'  => ['_sqlite_func_left', 2],
87 87
 
88
-		// N
89
-		'NOW' => ['_sqlite_func_now', 0],
88
+        // N
89
+        'NOW' => ['_sqlite_func_now', 0],
90 90
 
91
-		// M
92
-		'MD5'   => ['md5', 1],
93
-		'MONTH' => ['_sqlite_func_month', 1],
91
+        // M
92
+        'MD5'   => ['md5', 1],
93
+        'MONTH' => ['_sqlite_func_month', 1],
94 94
 
95
-		// P
96
-		'PREG_REPLACE' => ['_sqlite_func_preg_replace', 3],
95
+        // P
96
+        'PREG_REPLACE' => ['_sqlite_func_preg_replace', 3],
97 97
 
98
-		// R
99
-		'RADIANS' => ['deg2rad', 1],
100
-		'RAND'    => ['_sqlite_func_rand', 0], // sinon random() v2.4
101
-		'REGEXP'  => ['_sqlite_func_regexp_match', 2], // critere REGEXP supporte a partir de v3.3.2
102
-		'RIGHT'   => ['_sqlite_func_right', 2],
98
+        // R
99
+        'RADIANS' => ['deg2rad', 1],
100
+        'RAND'    => ['_sqlite_func_rand', 0], // sinon random() v2.4
101
+        'REGEXP'  => ['_sqlite_func_regexp_match', 2], // critere REGEXP supporte a partir de v3.3.2
102
+        'RIGHT'   => ['_sqlite_func_right', 2],
103 103
 
104
-		// S
105
-		'SETTYPE'   => ['settype', 2], // CAST present en v3.2.3
106
-		'SIN'       => ['sin', 1],
107
-		'SQRT'      => ['sqrt', 1],
108
-		'SUBSTRING' => ['_sqlite_func_substring' /*, 3*/], // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0
104
+        // S
105
+        'SETTYPE'   => ['settype', 2], // CAST present en v3.2.3
106
+        'SIN'       => ['sin', 1],
107
+        'SQRT'      => ['sqrt', 1],
108
+        'SUBSTRING' => ['_sqlite_func_substring' /*, 3*/], // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0
109 109
 
110
-		// T
111
-		'TAN'           => ['tan', 1],
112
-		'TIMESTAMPDIFF' => ['_sqlite_timestampdiff'    /*, 3*/],
113
-		'TO_DAYS'       => ['_sqlite_func_to_days', 1],
110
+        // T
111
+        'TAN'           => ['tan', 1],
112
+        'TIMESTAMPDIFF' => ['_sqlite_timestampdiff'    /*, 3*/],
113
+        'TO_DAYS'       => ['_sqlite_func_to_days', 1],
114 114
 
115
-		// U
116
-		'UNIX_TIMESTAMP' => ['_sqlite_func_unix_timestamp', 1],
115
+        // U
116
+        'UNIX_TIMESTAMP' => ['_sqlite_func_unix_timestamp', 1],
117 117
 
118
-		// V
119
-		'VIDE' => ['_sqlite_func_vide', 0], // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide()
118
+        // V
119
+        'VIDE' => ['_sqlite_func_vide', 0], // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide()
120 120
 
121
-		// Y
122
-		'YEAR' => ['_sqlite_func_year', 1]
123
-	];
121
+        // Y
122
+        'YEAR' => ['_sqlite_func_year', 1]
123
+    ];
124 124
 
125
-	foreach ($fonctions as $f => $r) {
126
-		_sqlite_add_function($sqlite, $f, $r);
127
-	}
125
+    foreach ($fonctions as $f => $r) {
126
+        _sqlite_add_function($sqlite, $f, $r);
127
+    }
128 128
 
129
-	#spip_log('functions sqlite chargees ','sqlite.'._LOG_DEBUG);
129
+    #spip_log('functions sqlite chargees ','sqlite.'._LOG_DEBUG);
130 130
 }
131 131
 
132 132
 
@@ -147,9 +147,9 @@  discard block
 block discarded – undo
147 147
  *
148 148
 **/
149 149
 function _sqlite_add_function(&$sqlite, &$f, &$r) {
150
-	isset($r[1])
151
-		? $sqlite->sqliteCreateFunction($f, $r[0], $r[1])
152
-		: $sqlite->sqliteCreateFunction($f, $r[0]);
150
+    isset($r[1])
151
+        ? $sqlite->sqliteCreateFunction($f, $r[0], $r[1])
152
+        : $sqlite->sqliteCreateFunction($f, $r[0]);
153 153
 }
154 154
 
155 155
 /**
@@ -159,7 +159,7 @@  discard block
 block discarded – undo
159 159
  * @return int
160 160
  */
161 161
 function _sqlite_func_ceil($a) {
162
-	return ceil($a);
162
+    return ceil($a);
163 163
 }
164 164
 
165 165
 /**
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
  * @return string
170 170
  */
171 171
 function _sqlite_func_concat(...$args) {
172
-	return join('', $args);
172
+    return join('', $args);
173 173
 }
174 174
 
175 175
 
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
  * @return string
183 183
  */
184 184
 function _sqlite_func_dayofmonth($d) {
185
-	return _sqlite_func_date('d', $d);
185
+    return _sqlite_func_date('d', $d);
186 186
 }
187 187
 
188 188
 
@@ -194,15 +194,15 @@  discard block
 block discarded – undo
194 194
  * @return int
195 195
  */
196 196
 function _sqlite_func_find_in_set($num, $set) {
197
-	$rank = 0;
198
-	foreach (explode(',', $set) as $v) {
199
-		if ($v == $num) {
200
-			return (++$rank);
201
-		}
202
-		$rank++;
203
-	}
204
-
205
-	return 0;
197
+    $rank = 0;
198
+    foreach (explode(',', $set) as $v) {
199
+        if ($v == $num) {
200
+            return (++$rank);
201
+        }
202
+        $rank++;
203
+    }
204
+
205
+    return 0;
206 206
 }
207 207
 
208 208
 /**
@@ -212,7 +212,7 @@  discard block
 block discarded – undo
212 212
  * @return int
213 213
  */
214 214
 function _sqlite_func_floor($a) {
215
-	return floor($a);
215
+    return floor($a);
216 216
 }
217 217
 
218 218
 
@@ -225,7 +225,7 @@  discard block
 block discarded – undo
225 225
  * @return mixed
226 226
  */
227 227
 function _sqlite_func_if($bool, $oui, $non) {
228
-	return ($bool) ? $oui : $non;
228
+    return ($bool) ? $oui : $non;
229 229
 }
230 230
 
231 231
 
@@ -242,10 +242,10 @@  discard block
 block discarded – undo
242 242
  * @return string
243 243
  */
244 244
 function _sqlite_func_insert($s, $index, $longueur, $chaine) {
245
-	return
246
-		substr($s, 0, $index)
247
-		. $chaine
248
-		. substr(substr($s, $index), $longueur);
245
+    return
246
+        substr($s, 0, $index)
247
+        . $chaine
248
+        . substr(substr($s, $index), $longueur);
249 249
 }
250 250
 
251 251
 
@@ -257,7 +257,7 @@  discard block
 block discarded – undo
257 257
  * @return int
258 258
  */
259 259
 function _sqlite_func_instr($s, $search) {
260
-	return strpos($s, $search);
260
+    return strpos($s, $search);
261 261
 }
262 262
 
263 263
 
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
  * @return int
269 269
  */
270 270
 function _sqlite_func_least(...$args) {
271
-	return min($args);
271
+    return min($args);
272 272
 }
273 273
 
274 274
 
@@ -279,7 +279,7 @@  discard block
 block discarded – undo
279 279
  * @return int
280 280
  */
281 281
 function _sqlite_func_greatest(...$args) {
282
-	return max($args);
282
+    return max($args);
283 283
 }
284 284
 
285 285
 
@@ -291,7 +291,7 @@  discard block
 block discarded – undo
291 291
  * @return string
292 292
  */
293 293
 function _sqlite_func_left($s, $lenght) {
294
-	return substr($s, $lenght);
294
+    return substr($s, $lenght);
295 295
 }
296 296
 
297 297
 /**
@@ -301,13 +301,13 @@  discard block
 block discarded – undo
301 301
  * @return string
302 302
  */
303 303
 function _sqlite_func_now($force_refresh = false) {
304
-	static $now = null;
305
-	if (is_null($now) or $force_refresh) {
306
-		$now = date('Y-m-d H:i:s');
307
-	}
304
+    static $now = null;
305
+    if (is_null($now) or $force_refresh) {
306
+        $now = date('Y-m-d H:i:s');
307
+    }
308 308
 
309
-	#spip_log("Passage avec NOW : $now | ".time(),'sqlite.'._LOG_DEBUG);
310
-	return $now;
309
+    #spip_log("Passage avec NOW : $now | ".time(),'sqlite.'._LOG_DEBUG);
310
+    return $now;
311 311
 }
312 312
 
313 313
 
@@ -320,7 +320,7 @@  discard block
 block discarded – undo
320 320
  * @return string
321 321
  */
322 322
 function _sqlite_func_month($d) {
323
-	return _sqlite_func_date('m', $d);
323
+    return _sqlite_func_date('m', $d);
324 324
 }
325 325
 
326 326
 
@@ -333,10 +333,10 @@  discard block
 block discarded – undo
333 333
  * @return string
334 334
  */
335 335
 function _sqlite_func_preg_replace($quoi, $cherche, $remplace) {
336
-	$return = preg_replace('%' . $cherche . '%', $remplace, $quoi);
336
+    $return = preg_replace('%' . $cherche . '%', $remplace, $quoi);
337 337
 
338
-	#spip_log("preg_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG);
339
-	return $return;
338
+    #spip_log("preg_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG);
339
+    return $return;
340 340
 }
341 341
 
342 342
 /**
@@ -349,26 +349,26 @@  discard block
 block discarded – undo
349 349
  * @return string, l'extrait trouve.
350 350
  **/
351 351
 function _sqlite_func_extraire_multi($quoi, $lang) {
352
-	if (!defined('_EXTRAIRE_MULTI')) {
353
-		include_spip('inc/filtres');
354
-	}
355
-	if (!function_exists('approcher_langue')) {
356
-		include_spip('inc/lang');
357
-	}
358
-	if (preg_match_all(_EXTRAIRE_MULTI, $quoi, $regs, PREG_SET_ORDER)) {
359
-		foreach ($regs as $reg) {
360
-			// chercher la version de la langue courante
361
-			$trads = extraire_trads($reg[1]);
362
-			if ($l = approcher_langue($trads, $lang)) {
363
-				$trad = $trads[$l];
364
-			} else {
365
-				$trad = reset($trads);
366
-			}
367
-			$quoi = str_replace($reg[0], $trad, $quoi);
368
-		}
369
-	}
370
-
371
-	return $quoi;
352
+    if (!defined('_EXTRAIRE_MULTI')) {
353
+        include_spip('inc/filtres');
354
+    }
355
+    if (!function_exists('approcher_langue')) {
356
+        include_spip('inc/lang');
357
+    }
358
+    if (preg_match_all(_EXTRAIRE_MULTI, $quoi, $regs, PREG_SET_ORDER)) {
359
+        foreach ($regs as $reg) {
360
+            // chercher la version de la langue courante
361
+            $trads = extraire_trads($reg[1]);
362
+            if ($l = approcher_langue($trads, $lang)) {
363
+                $trad = $trads[$l];
364
+            } else {
365
+                $trad = reset($trads);
366
+            }
367
+            $quoi = str_replace($reg[0], $trad, $quoi);
368
+        }
369
+    }
370
+
371
+    return $quoi;
372 372
 }
373 373
 
374 374
 
@@ -378,7 +378,7 @@  discard block
 block discarded – undo
378 378
  * @return float
379 379
  */
380 380
 function _sqlite_func_rand() {
381
-	return random_int(0, mt_getrandmax());
381
+    return random_int(0, mt_getrandmax());
382 382
 }
383 383
 
384 384
 
@@ -390,7 +390,7 @@  discard block
 block discarded – undo
390 390
  * @return string
391 391
  */
392 392
 function _sqlite_func_right($s, $length) {
393
-	return substr($s, 0 - $length);
393
+    return substr($s, 0 - $length);
394 394
 }
395 395
 
396 396
 
@@ -402,17 +402,17 @@  discard block
 block discarded – undo
402 402
  * @return bool
403 403
  */
404 404
 function _sqlite_func_regexp_match($cherche, $quoi) {
405
-	// optimiser un cas tres courant avec les requetes en base
406
-	if (!$quoi and !strlen($quoi)) {
407
-		return false;
408
-	}
409
-	// il faut enlever un niveau d'echappement pour être homogène à mysql
410
-	$cherche = str_replace('\\\\', '\\', $cherche);
411
-	$u = $GLOBALS['meta']['pcre_u'] ?? 'u';
412
-	$return = preg_match('%' . $cherche . '%imsS' . $u, $quoi);
413
-
414
-	#spip_log("regexp_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG);
415
-	return $return;
405
+    // optimiser un cas tres courant avec les requetes en base
406
+    if (!$quoi and !strlen($quoi)) {
407
+        return false;
408
+    }
409
+    // il faut enlever un niveau d'echappement pour être homogène à mysql
410
+    $cherche = str_replace('\\\\', '\\', $cherche);
411
+    $u = $GLOBALS['meta']['pcre_u'] ?? 'u';
412
+    $return = preg_match('%' . $cherche . '%imsS' . $u, $quoi);
413
+
414
+    #spip_log("regexp_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG);
415
+    return $return;
416 416
 }
417 417
 
418 418
 
@@ -427,8 +427,8 @@  discard block
 block discarded – undo
427 427
  * @return string
428 428
  */
429 429
 function _sqlite_func_date_format($date, $conv) {
430
-	$conv = _sqlite_func_strftime_format_converter($conv);
431
-	return strftime($conv, is_int($date) ? $date : strtotime($date));
430
+    $conv = _sqlite_func_strftime_format_converter($conv);
431
+    return strftime($conv, is_int($date) ? $date : strtotime($date));
432 432
 }
433 433
 
434 434
 /**
@@ -444,28 +444,28 @@  discard block
 block discarded – undo
444 444
  * @return void
445 445
  */
446 446
 function _sqlite_func_strftime_format_converter(string $conv): string {
447
-	// ok : %a %b %d %e %H %I %l %j %k %m %p %r %S %T %w %y %Y
448
-	// on ne sait pas en gérer certains...
449
-	static $mysql_to_strftime_not_ok = ['%c', '%D', '%f', '%U', '%V', '%W', '%X'];
450
-	static $mysql_to_strftime = [
451
-		'%h' => '%I',
452
-		'%i' => '%M',
453
-		'%M' => '%B',
454
-		'%s' => '%S',
455
-		'%u' => '%U',
456
-		'%v' => '%V',
457
-		'%x' => '%G',
458
-	];
459
-	static $to_strftime = [];
460
-	if (!isset($to_strftime[$conv])) {
461
-		$count = 0;
462
-		str_replace($mysql_to_strftime_not_ok, '', $conv, $count);
463
-		if ($count > 0) {
464
-			spip_log("DATE_FORMAT : At least one parameter can't be parsed by strftime with format '$conv'", 'sqlite.' . _LOG_ERREUR);
465
-		}
466
-		$to_strftime[$conv] = str_replace(array_keys($mysql_to_strftime), $mysql_to_strftime, $conv);
467
-	}
468
-	return $to_strftime[$conv];
447
+    // ok : %a %b %d %e %H %I %l %j %k %m %p %r %S %T %w %y %Y
448
+    // on ne sait pas en gérer certains...
449
+    static $mysql_to_strftime_not_ok = ['%c', '%D', '%f', '%U', '%V', '%W', '%X'];
450
+    static $mysql_to_strftime = [
451
+        '%h' => '%I',
452
+        '%i' => '%M',
453
+        '%M' => '%B',
454
+        '%s' => '%S',
455
+        '%u' => '%U',
456
+        '%v' => '%V',
457
+        '%x' => '%G',
458
+    ];
459
+    static $to_strftime = [];
460
+    if (!isset($to_strftime[$conv])) {
461
+        $count = 0;
462
+        str_replace($mysql_to_strftime_not_ok, '', $conv, $count);
463
+        if ($count > 0) {
464
+            spip_log("DATE_FORMAT : At least one parameter can't be parsed by strftime with format '$conv'", 'sqlite.' . _LOG_ERREUR);
465
+        }
466
+        $to_strftime[$conv] = str_replace(array_keys($mysql_to_strftime), $mysql_to_strftime, $conv);
467
+    }
468
+    return $to_strftime[$conv];
469 469
 }
470 470
 
471 471
 /**
@@ -479,11 +479,11 @@  discard block
 block discarded – undo
479 479
  * @return int
480 480
  */
481 481
 function _sqlite_func_to_days($d) {
482
-	static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01
483
-	$result = $offset + (int)ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600));
482
+    static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01
483
+    $result = $offset + (int)ceil(_sqlite_func_unix_timestamp($d) / (24 * 3600));
484 484
 
485
-	#spip_log("Passage avec TO_DAYS : $d, $result",'sqlite.'._LOG_DEBUG);
486
-	return $result;
485
+    #spip_log("Passage avec TO_DAYS : $d, $result",'sqlite.'._LOG_DEBUG);
486
+    return $result;
487 487
 }
488 488
 
489 489
 /**
@@ -495,13 +495,13 @@  discard block
 block discarded – undo
495 495
  * @return string
496 496
  */
497 497
 function _sqlite_func_substring($string, $start, $len = null) {
498
-	// SQL compte a partir de 1, php a partir de 0
499
-	$start = ($start > 0) ? $start - 1 : $start;
500
-	if (is_null($len)) {
501
-		return substr($string, $start);
502
-	} else {
503
-		return substr($string, $start, $len);
504
-	}
498
+    // SQL compte a partir de 1, php a partir de 0
499
+    $start = ($start > 0) ? $start - 1 : $start;
500
+    if (is_null($len)) {
501
+        return substr($string, $start);
502
+    } else {
503
+        return substr($string, $start, $len);
504
+    }
505 505
 }
506 506
 
507 507
 /**
@@ -517,33 +517,33 @@  discard block
 block discarded – undo
517 517
  * @return int
518 518
  */
519 519
 function _sqlite_timestampdiff($unit, $date1, $date2) {
520
-	$d1 = date_create($date1);
521
-	$d2 = date_create($date2);
522
-	$diff = date_diff($d1, $d2);
523
-	$inv = $diff->invert ? -1 : 1;
524
-	switch ($unit) {
525
-		case 'YEAR':
526
-			return $inv * $diff->y;
527
-		case 'QUARTER':
528
-			return $inv * (4 * $diff->y + intval(floor($diff->m / 3)));
529
-		case 'MONTH':
530
-			return $inv * (12 * $diff->y + $diff->m);
531
-		case 'WEEK':
532
-			return $inv * intval(floor($diff->days / 7));
533
-		case 'DAY':
534
-			#var_dump($inv*$diff->days);
535
-			return $inv * $diff->days;
536
-		case 'HOUR':
537
-			return $inv * (24 * $diff->days + $diff->h);
538
-		case 'MINUTE':
539
-			return $inv * ((24 * $diff->days + $diff->h) * 60 + $diff->i);
540
-		case 'SECOND':
541
-			return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s);
542
-		case 'MICROSECOND':
543
-			return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s) * 1_000_000;
544
-	}
545
-
546
-	return 0;
520
+    $d1 = date_create($date1);
521
+    $d2 = date_create($date2);
522
+    $diff = date_diff($d1, $d2);
523
+    $inv = $diff->invert ? -1 : 1;
524
+    switch ($unit) {
525
+        case 'YEAR':
526
+            return $inv * $diff->y;
527
+        case 'QUARTER':
528
+            return $inv * (4 * $diff->y + intval(floor($diff->m / 3)));
529
+        case 'MONTH':
530
+            return $inv * (12 * $diff->y + $diff->m);
531
+        case 'WEEK':
532
+            return $inv * intval(floor($diff->days / 7));
533
+        case 'DAY':
534
+            #var_dump($inv*$diff->days);
535
+            return $inv * $diff->days;
536
+        case 'HOUR':
537
+            return $inv * (24 * $diff->days + $diff->h);
538
+        case 'MINUTE':
539
+            return $inv * ((24 * $diff->days + $diff->h) * 60 + $diff->i);
540
+        case 'SECOND':
541
+            return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s);
542
+        case 'MICROSECOND':
543
+            return $inv * (((24 * $diff->days + $diff->h) * 60 + $diff->i) * 60 + $diff->s) * 1_000_000;
544
+    }
545
+
546
+    return 0;
547 547
 }
548 548
 
549 549
 /**
@@ -553,24 +553,24 @@  discard block
 block discarded – undo
553 553
  * @return int
554 554
  */
555 555
 function _sqlite_func_unix_timestamp($d) {
556
-	static $mem = [];
557
-	static $n = 0;
558
-	if (isset($mem[$d])) {
559
-		return $mem[$d];
560
-	}
561
-	if ($n++ > 100) {
562
-		$mem = [];
563
-		$n = 0;
564
-	}
565
-
566
-	//2005-12-02 20:53:53
567
-	#spip_log("Passage avec UNIX_TIMESTAMP : $d",'sqlite.'._LOG_DEBUG);
568
-	if (!$d) {
569
-		return $mem[$d] = time();
570
-	}
571
-
572
-	// une pile plus grosse n'accelere pas le calcul
573
-	return $mem[$d] = strtotime($d);
556
+    static $mem = [];
557
+    static $n = 0;
558
+    if (isset($mem[$d])) {
559
+        return $mem[$d];
560
+    }
561
+    if ($n++ > 100) {
562
+        $mem = [];
563
+        $n = 0;
564
+    }
565
+
566
+    //2005-12-02 20:53:53
567
+    #spip_log("Passage avec UNIX_TIMESTAMP : $d",'sqlite.'._LOG_DEBUG);
568
+    if (!$d) {
569
+        return $mem[$d] = time();
570
+    }
571
+
572
+    // une pile plus grosse n'accelere pas le calcul
573
+    return $mem[$d] = strtotime($d);
574 574
 }
575 575
 
576 576
 
@@ -583,7 +583,7 @@  discard block
 block discarded – undo
583 583
  * @return string
584 584
  */
585 585
 function _sqlite_func_year($d) {
586
-	return _sqlite_func_date('Y', $d);
586
+    return _sqlite_func_date('Y', $d);
587 587
 }
588 588
 
589 589
 /**
@@ -596,20 +596,20 @@  discard block
 block discarded – undo
596 596
  * @return string
597 597
  */
598 598
 function _sqlite_func_date($quoi, $d) {
599
-	static $mem = [];
600
-	static $n = 0;
601
-	if (isset($mem[$d])) {
602
-		return $mem[$d][$quoi];
603
-	}
604
-	if ($n++ > 100) {
605
-		$mem = [];
606
-		$n = 0;
607
-	}
608
-
609
-	$dec = date('Y-m-d', _sqlite_func_unix_timestamp($d));
610
-	$mem[$d] = ['Y' => substr($dec, 0, 4), 'm' => substr($dec, 5, 2), 'd' => substr($dec, 8, 2)];
611
-
612
-	return $mem[$d][$quoi];
599
+    static $mem = [];
600
+    static $n = 0;
601
+    if (isset($mem[$d])) {
602
+        return $mem[$d][$quoi];
603
+    }
604
+    if ($n++ > 100) {
605
+        $mem = [];
606
+        $n = 0;
607
+    }
608
+
609
+    $dec = date('Y-m-d', _sqlite_func_unix_timestamp($d));
610
+    $mem[$d] = ['Y' => substr($dec, 0, 4), 'm' => substr($dec, 5, 2), 'd' => substr($dec, 8, 2)];
611
+
612
+    return $mem[$d][$quoi];
613 613
 }
614 614
 
615 615
 /**
@@ -618,5 +618,5 @@  discard block
 block discarded – undo
618 618
  * @return void
619 619
  */
620 620
 function _sqlite_func_vide() {
621
-	return;
621
+    return;
622 622
 }
Please login to merge, or discard this patch.
ecrire/req/mysql.php 1 patch
Indentation   +861 added lines, -861 removed lines patch added patch discarded remove patch
@@ -20,11 +20,11 @@  discard block
 block discarded – undo
20 20
  */
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 if (!defined('_MYSQL_NOPLANES')) {
27
-	define('_MYSQL_NOPLANES', true);
27
+    define('_MYSQL_NOPLANES', true);
28 28
 }
29 29
 
30 30
 /**
@@ -41,112 +41,112 @@  discard block
 block discarded – undo
41 41
  *     - tableau décrivant la connexion sinon
42 42
  */
43 43
 function req_mysql_dist($host, $port, $login, $pass, $db = '', $prefixe = '') {
44
-	if (!extension_loaded(\mysqli::class)) {
45
-		return false;
46
-	}
47
-
48
-	// si port est fourni mais pas host, c'est un socket -> compat avec vieille syntaxe de mysql_connect() et anciens fichiers connect.php
49
-	try {
50
-		if (
51
-			$port and !is_numeric($socket = $port)
52
-			and (!$host or $host === 'localhost')
53
-		) {
54
-			$link = @mysqli_connect($host, $login, $pass, '', null, $socket);
55
-		} elseif ($port) {
56
-			$link = @mysqli_connect($host, $login, $pass, '', $port);
57
-		} else {
58
-			$link = @mysqli_connect($host, $login, $pass);
59
-		}
60
-	} catch (\mysqli_sql_exception $e) {
61
-		spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
62
-		$link = false;
63
-	}
64
-
65
-	if (!$link) {
66
-		spip_log('Echec mysqli_connect. Erreur : ' . mysqli_connect_error(), 'mysql.' . _LOG_HS);
67
-
68
-		return false;
69
-	}
70
-	$last = '';
71
-	if (!$db) {
72
-		$ok = $link;
73
-		$db = 'spip';
74
-	} else {
75
-		$ok = mysqli_select_db($link, $db);
76
-		if (
77
-			defined('_MYSQL_SET_SQL_MODE')
78
-			or defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite
79
-		) {
80
-			mysqli_query($link, $last = "set sql_mode=''");
81
-		}
82
-	}
83
-
84
-	spip_log(
85
-		"Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? 'operationnelle' : 'impossible'),
86
-		_LOG_DEBUG
87
-	);
88
-
89
-	return !$ok ? false : [
90
-		'db' => $db,
91
-		'last' => $last,
92
-		'prefixe' => $prefixe ?: $db,
93
-		'link' => $link,
94
-		'total_requetes' => 0,
95
-	];
44
+    if (!extension_loaded(\mysqli::class)) {
45
+        return false;
46
+    }
47
+
48
+    // si port est fourni mais pas host, c'est un socket -> compat avec vieille syntaxe de mysql_connect() et anciens fichiers connect.php
49
+    try {
50
+        if (
51
+            $port and !is_numeric($socket = $port)
52
+            and (!$host or $host === 'localhost')
53
+        ) {
54
+            $link = @mysqli_connect($host, $login, $pass, '', null, $socket);
55
+        } elseif ($port) {
56
+            $link = @mysqli_connect($host, $login, $pass, '', $port);
57
+        } else {
58
+            $link = @mysqli_connect($host, $login, $pass);
59
+        }
60
+    } catch (\mysqli_sql_exception $e) {
61
+        spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
62
+        $link = false;
63
+    }
64
+
65
+    if (!$link) {
66
+        spip_log('Echec mysqli_connect. Erreur : ' . mysqli_connect_error(), 'mysql.' . _LOG_HS);
67
+
68
+        return false;
69
+    }
70
+    $last = '';
71
+    if (!$db) {
72
+        $ok = $link;
73
+        $db = 'spip';
74
+    } else {
75
+        $ok = mysqli_select_db($link, $db);
76
+        if (
77
+            defined('_MYSQL_SET_SQL_MODE')
78
+            or defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite
79
+        ) {
80
+            mysqli_query($link, $last = "set sql_mode=''");
81
+        }
82
+    }
83
+
84
+    spip_log(
85
+        "Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? 'operationnelle' : 'impossible'),
86
+        _LOG_DEBUG
87
+    );
88
+
89
+    return !$ok ? false : [
90
+        'db' => $db,
91
+        'last' => $last,
92
+        'prefixe' => $prefixe ?: $db,
93
+        'link' => $link,
94
+        'total_requetes' => 0,
95
+    ];
96 96
 }
97 97
 
98 98
 
99 99
 $GLOBALS['spip_mysql_functions_1'] = [
100
-	'alter' => 'spip_mysql_alter',
101
-	'count' => 'spip_mysql_count',
102
-	'countsel' => 'spip_mysql_countsel',
103
-	'create' => 'spip_mysql_create',
104
-	'create_base' => 'spip_mysql_create_base',
105
-	'create_view' => 'spip_mysql_create_view',
106
-	'date_proche' => 'spip_mysql_date_proche',
107
-	'delete' => 'spip_mysql_delete',
108
-	'drop_table' => 'spip_mysql_drop_table',
109
-	'drop_view' => 'spip_mysql_drop_view',
110
-	'errno' => 'spip_mysql_errno',
111
-	'error' => 'spip_mysql_error',
112
-	'explain' => 'spip_mysql_explain',
113
-	'fetch' => 'spip_mysql_fetch',
114
-	'seek' => 'spip_mysql_seek',
115
-	'free' => 'spip_mysql_free',
116
-	'hex' => 'spip_mysql_hex',
117
-	'in' => 'spip_mysql_in',
118
-	'insert' => 'spip_mysql_insert',
119
-	'insertq' => 'spip_mysql_insertq',
120
-	'insertq_multi' => 'spip_mysql_insertq_multi',
121
-	'listdbs' => 'spip_mysql_listdbs',
122
-	'multi' => 'spip_mysql_multi',
123
-	'optimize' => 'spip_mysql_optimize',
124
-	'query' => 'spip_mysql_query',
125
-	'quote' => 'spip_mysql_quote',
126
-	'replace' => 'spip_mysql_replace',
127
-	'replace_multi' => 'spip_mysql_replace_multi',
128
-	'repair' => 'spip_mysql_repair',
129
-	'select' => 'spip_mysql_select',
130
-	'selectdb' => 'spip_mysql_selectdb',
131
-	'set_charset' => 'spip_mysql_set_charset',
132
-	'get_charset' => 'spip_mysql_get_charset',
133
-	'showbase' => 'spip_mysql_showbase',
134
-	'showtable' => 'spip_mysql_showtable',
135
-	'table_exists' => 'spip_mysql_table_exists',
136
-	'update' => 'spip_mysql_update',
137
-	'updateq' => 'spip_mysql_updateq',
138
-
139
-	// association de chaque nom http d'un charset aux couples MySQL
140
-	'charsets' => [
141
-		'cp1250' => ['charset' => 'cp1250', 'collation' => 'cp1250_general_ci'],
142
-		'cp1251' => ['charset' => 'cp1251', 'collation' => 'cp1251_general_ci'],
143
-		'cp1256' => ['charset' => 'cp1256', 'collation' => 'cp1256_general_ci'],
144
-		'iso-8859-1' => ['charset' => 'latin1', 'collation' => 'latin1_swedish_ci'],
100
+    'alter' => 'spip_mysql_alter',
101
+    'count' => 'spip_mysql_count',
102
+    'countsel' => 'spip_mysql_countsel',
103
+    'create' => 'spip_mysql_create',
104
+    'create_base' => 'spip_mysql_create_base',
105
+    'create_view' => 'spip_mysql_create_view',
106
+    'date_proche' => 'spip_mysql_date_proche',
107
+    'delete' => 'spip_mysql_delete',
108
+    'drop_table' => 'spip_mysql_drop_table',
109
+    'drop_view' => 'spip_mysql_drop_view',
110
+    'errno' => 'spip_mysql_errno',
111
+    'error' => 'spip_mysql_error',
112
+    'explain' => 'spip_mysql_explain',
113
+    'fetch' => 'spip_mysql_fetch',
114
+    'seek' => 'spip_mysql_seek',
115
+    'free' => 'spip_mysql_free',
116
+    'hex' => 'spip_mysql_hex',
117
+    'in' => 'spip_mysql_in',
118
+    'insert' => 'spip_mysql_insert',
119
+    'insertq' => 'spip_mysql_insertq',
120
+    'insertq_multi' => 'spip_mysql_insertq_multi',
121
+    'listdbs' => 'spip_mysql_listdbs',
122
+    'multi' => 'spip_mysql_multi',
123
+    'optimize' => 'spip_mysql_optimize',
124
+    'query' => 'spip_mysql_query',
125
+    'quote' => 'spip_mysql_quote',
126
+    'replace' => 'spip_mysql_replace',
127
+    'replace_multi' => 'spip_mysql_replace_multi',
128
+    'repair' => 'spip_mysql_repair',
129
+    'select' => 'spip_mysql_select',
130
+    'selectdb' => 'spip_mysql_selectdb',
131
+    'set_charset' => 'spip_mysql_set_charset',
132
+    'get_charset' => 'spip_mysql_get_charset',
133
+    'showbase' => 'spip_mysql_showbase',
134
+    'showtable' => 'spip_mysql_showtable',
135
+    'table_exists' => 'spip_mysql_table_exists',
136
+    'update' => 'spip_mysql_update',
137
+    'updateq' => 'spip_mysql_updateq',
138
+
139
+    // association de chaque nom http d'un charset aux couples MySQL
140
+    'charsets' => [
141
+        'cp1250' => ['charset' => 'cp1250', 'collation' => 'cp1250_general_ci'],
142
+        'cp1251' => ['charset' => 'cp1251', 'collation' => 'cp1251_general_ci'],
143
+        'cp1256' => ['charset' => 'cp1256', 'collation' => 'cp1256_general_ci'],
144
+        'iso-8859-1' => ['charset' => 'latin1', 'collation' => 'latin1_swedish_ci'],
145 145
 //'iso-8859-6'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
146
-		'iso-8859-9' => ['charset' => 'latin5', 'collation' => 'latin5_turkish_ci'],
146
+        'iso-8859-9' => ['charset' => 'latin5', 'collation' => 'latin5_turkish_ci'],
147 147
 //'iso-8859-15'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'),
148
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci']
149
-	]
148
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci']
149
+    ]
150 150
 ];
151 151
 
152 152
 
@@ -157,9 +157,9 @@  discard block
 block discarded – undo
157 157
  * @return Object Information de connexion pour mysqli
158 158
  */
159 159
 function _mysql_link($serveur = '') {
160
-	$link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
160
+    $link = &$GLOBALS['connexions'][$serveur ?: 0]['link'];
161 161
 
162
-	return $link;
162
+    return $link;
163 163
 }
164 164
 
165 165
 
@@ -172,10 +172,10 @@  discard block
 block discarded – undo
172 172
  * @return mysqli_result|bool Jeu de résultats pour fetch()
173 173
  */
174 174
 function spip_mysql_set_charset($charset, $serveur = '', $requeter = true) {
175
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
176
-	spip_log('changement de charset sql : ' . 'SET NAMES ' . _q($charset), _LOG_DEBUG);
175
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
176
+    spip_log('changement de charset sql : ' . 'SET NAMES ' . _q($charset), _LOG_DEBUG);
177 177
 
178
-	return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES ' . _q($charset));
178
+    return mysqli_query($connexion['link'], $connexion['last'] = 'SET NAMES ' . _q($charset));
179 179
 }
180 180
 
181 181
 
@@ -188,11 +188,11 @@  discard block
 block discarded – undo
188 188
  * @return array Description du charset (son nom est dans 'charset')
189 189
  */
190 190
 function spip_mysql_get_charset($charset = [], $serveur = '', $requeter = true) {
191
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
192
-	$connexion['last'] = $c = 'SHOW CHARACTER SET'
193
-		. (!$charset ? '' : (' LIKE ' . _q($charset['charset'])));
191
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
192
+    $connexion['last'] = $c = 'SHOW CHARACTER SET'
193
+        . (!$charset ? '' : (' LIKE ' . _q($charset['charset'])));
194 194
 
195
-	return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur);
195
+    return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur);
196 196
 }
197 197
 
198 198
 /**
@@ -208,80 +208,80 @@  discard block
 block discarded – undo
208 208
  */
209 209
 function spip_mysql_query($query, $serveur = '', $requeter = true) {
210 210
 
211
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
212
-	$prefixe = $connexion['prefixe'];
213
-	$link = $connexion['link'];
214
-	$db = $connexion['db'];
215
-
216
-	$query = _mysql_traite_query($query, $db, $prefixe);
217
-
218
-	// renvoyer la requete inerte si demandee
219
-	if (!$requeter) {
220
-		return $query;
221
-	}
222
-
223
-	if (isset($_GET['var_profile']) or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
224
-		include_spip('public/tracer');
225
-		$t = trace_query_start();
226
-	} else {
227
-		$t = 0;
228
-	}
229
-
230
-	$connexion['last'] = $query;
231
-	$connexion['total_requetes']++;
232
-
233
-	// ajouter un debug utile dans log/mysql-slow.log ?
234
-	$debug = '';
235
-	if (defined('_DEBUG_SLOW_QUERIES') and _DEBUG_SLOW_QUERIES) {
236
-		if (isset($GLOBALS['debug']['aucasou'])) {
237
-			[, $id, , $infos] = $GLOBALS['debug']['aucasou'];
238
-			$debug .= "BOUCLE$id @ " . ($infos[0] ?? '') . ' | ';
239
-		}
240
-		if (isset($_SERVER['REQUEST_URI'])) {
241
-			$debug .= $_SERVER['REQUEST_URI'];
242
-		}
243
-		if (!empty($GLOBALS['ip'])) {
244
-			$debug .= ' + ' . $GLOBALS['ip'];
245
-		}
246
-		$debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
247
-	}
248
-	try {
249
-		$r = mysqli_query($link, $query . $debug);
250
-	} catch (\mysqli_sql_exception $e) {
251
-		spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
252
-		$r = false;
253
-		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
254
-		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
255
-	}
256
-
257
-	//Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP
258
-	if ($e = spip_mysql_errno($serveur)) {  // Log d'un Gone Away
259
-		if ($e == 2006) { //Si Gone Away on relance une connexion vierge
260
-			//Fermer la connexion defaillante
261
-			mysqli_close($connexion['link']);
262
-			unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
263
-			//Relancer une connexion vierge
264
-			spip_connect($serveur);
265
-			$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
266
-			$link = $connexion['link'];
267
-			//On retente au cas où
268
-			try {
269
-				$r = mysqli_query($link, $query . $debug);
270
-			} catch (\mysqli_sql_exception $e) {
271
-				spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
272
-				$r = false;
273
-				// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
274
-				// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
275
-			}
276
-		}
277
-	}
278
-
279
-	// Log de l'erreur eventuelle
280
-	if ($e = spip_mysql_errno($serveur)) {
281
-		// et du fautif
282
-		$e .= spip_mysql_error($query, $serveur);
283
-	} 
284
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
211
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
212
+    $prefixe = $connexion['prefixe'];
213
+    $link = $connexion['link'];
214
+    $db = $connexion['db'];
215
+
216
+    $query = _mysql_traite_query($query, $db, $prefixe);
217
+
218
+    // renvoyer la requete inerte si demandee
219
+    if (!$requeter) {
220
+        return $query;
221
+    }
222
+
223
+    if (isset($_GET['var_profile']) or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
224
+        include_spip('public/tracer');
225
+        $t = trace_query_start();
226
+    } else {
227
+        $t = 0;
228
+    }
229
+
230
+    $connexion['last'] = $query;
231
+    $connexion['total_requetes']++;
232
+
233
+    // ajouter un debug utile dans log/mysql-slow.log ?
234
+    $debug = '';
235
+    if (defined('_DEBUG_SLOW_QUERIES') and _DEBUG_SLOW_QUERIES) {
236
+        if (isset($GLOBALS['debug']['aucasou'])) {
237
+            [, $id, , $infos] = $GLOBALS['debug']['aucasou'];
238
+            $debug .= "BOUCLE$id @ " . ($infos[0] ?? '') . ' | ';
239
+        }
240
+        if (isset($_SERVER['REQUEST_URI'])) {
241
+            $debug .= $_SERVER['REQUEST_URI'];
242
+        }
243
+        if (!empty($GLOBALS['ip'])) {
244
+            $debug .= ' + ' . $GLOBALS['ip'];
245
+        }
246
+        $debug = ' /* ' . mysqli_real_escape_string($link, str_replace('*/', '@/', $debug)) . ' */';
247
+    }
248
+    try {
249
+        $r = mysqli_query($link, $query . $debug);
250
+    } catch (\mysqli_sql_exception $e) {
251
+        spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
252
+        $r = false;
253
+        // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
254
+        // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
255
+    }
256
+
257
+    //Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP
258
+    if ($e = spip_mysql_errno($serveur)) {  // Log d'un Gone Away
259
+        if ($e == 2006) { //Si Gone Away on relance une connexion vierge
260
+            //Fermer la connexion defaillante
261
+            mysqli_close($connexion['link']);
262
+            unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
263
+            //Relancer une connexion vierge
264
+            spip_connect($serveur);
265
+            $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
266
+            $link = $connexion['link'];
267
+            //On retente au cas où
268
+            try {
269
+                $r = mysqli_query($link, $query . $debug);
270
+            } catch (\mysqli_sql_exception $e) {
271
+                spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
272
+                $r = false;
273
+                // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
274
+                // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
275
+            }
276
+        }
277
+    }
278
+
279
+    // Log de l'erreur eventuelle
280
+    if ($e = spip_mysql_errno($serveur)) {
281
+        // et du fautif
282
+        $e .= spip_mysql_error($query, $serveur);
283
+    } 
284
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
285 285
 }
286 286
 
287 287
 /**
@@ -296,12 +296,12 @@  discard block
 block discarded – undo
296 296
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
297 297
  */
298 298
 function spip_mysql_alter($query, $serveur = '', $requeter = true) {
299
-	// ici on supprime les ` entourant le nom de table pour permettre
300
-	// la transposition du prefixe, compte tenu que les plugins ont la mauvaise habitude
301
-	// d'utiliser ceux-ci, copie-colle de phpmyadmin
302
-	$query = preg_replace(',^TABLE\s*`([^`]*)`,i', "TABLE \\1", $query);
299
+    // ici on supprime les ` entourant le nom de table pour permettre
300
+    // la transposition du prefixe, compte tenu que les plugins ont la mauvaise habitude
301
+    // d'utiliser ceux-ci, copie-colle de phpmyadmin
302
+    $query = preg_replace(',^TABLE\s*`([^`]*)`,i', "TABLE \\1", $query);
303 303
 
304
-	return spip_mysql_query('ALTER ' . $query, $serveur, $requeter); # i.e. que PG se debrouille
304
+    return spip_mysql_query('ALTER ' . $query, $serveur, $requeter); # i.e. que PG se debrouille
305 305
 }
306 306
 
307 307
 
@@ -314,9 +314,9 @@  discard block
 block discarded – undo
314 314
  * @return bool            Toujours true
315 315
  */
316 316
 function spip_mysql_optimize($table, $serveur = '', $requeter = true) {
317
-	spip_mysql_query('OPTIMIZE TABLE ' . $table);
317
+    spip_mysql_query('OPTIMIZE TABLE ' . $table);
318 318
 
319
-	return true;
319
+    return true;
320 320
 }
321 321
 
322 322
 
@@ -329,18 +329,18 @@  discard block
 block discarded – undo
329 329
  * @return array           Tableau de l'explication
330 330
  */
331 331
 function spip_mysql_explain($query, $serveur = '', $requeter = true) {
332
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
333
-		return [];
334
-	}
335
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
336
-	$prefixe = $connexion['prefixe'];
337
-	$link = $connexion['link'];
338
-	$db = $connexion['db'];
339
-
340
-	$query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe);
341
-	$r = mysqli_query($link, $query);
342
-
343
-	return spip_mysql_fetch($r, null, $serveur);
332
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
333
+        return [];
334
+    }
335
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
336
+    $prefixe = $connexion['prefixe'];
337
+    $link = $connexion['link'];
338
+    $db = $connexion['db'];
339
+
340
+    $query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe);
341
+    $r = mysqli_query($link, $query);
342
+
343
+    return spip_mysql_fetch($r, null, $serveur);
344 344
 }
345 345
 
346 346
 
@@ -369,35 +369,35 @@  discard block
 block discarded – undo
369 369
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
370 370
  */
371 371
 function spip_mysql_select(
372
-	$select,
373
-	$from,
374
-	$where = '',
375
-	$groupby = '',
376
-	$orderby = '',
377
-	$limit = '',
378
-	$having = '',
379
-	$serveur = '',
380
-	$requeter = true
372
+    $select,
373
+    $from,
374
+    $where = '',
375
+    $groupby = '',
376
+    $orderby = '',
377
+    $limit = '',
378
+    $having = '',
379
+    $serveur = '',
380
+    $requeter = true
381 381
 ) {
382 382
 
383 383
 
384
-	$from = (!is_array($from) ? $from : spip_mysql_select_as($from));
385
-	$query =
386
-		calculer_mysql_expression('SELECT', $select, ', ')
387
-		. calculer_mysql_expression('FROM', $from, ', ')
388
-		. calculer_mysql_expression('WHERE', $where)
389
-		. calculer_mysql_expression('GROUP BY', $groupby, ',')
390
-		. calculer_mysql_expression('HAVING', $having)
391
-		. ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '')
392
-		. ($limit ? "\nLIMIT $limit" : '');
384
+    $from = (!is_array($from) ? $from : spip_mysql_select_as($from));
385
+    $query =
386
+        calculer_mysql_expression('SELECT', $select, ', ')
387
+        . calculer_mysql_expression('FROM', $from, ', ')
388
+        . calculer_mysql_expression('WHERE', $where)
389
+        . calculer_mysql_expression('GROUP BY', $groupby, ',')
390
+        . calculer_mysql_expression('HAVING', $having)
391
+        . ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '')
392
+        . ($limit ? "\nLIMIT $limit" : '');
393 393
 
394
-	// renvoyer la requete inerte si demandee
395
-	if ($requeter === false) {
396
-		return $query;
397
-	}
398
-	$r = spip_mysql_query($query, $serveur, $requeter);
394
+    // renvoyer la requete inerte si demandee
395
+    if ($requeter === false) {
396
+        return $query;
397
+    }
398
+    $r = spip_mysql_query($query, $serveur, $requeter);
399 399
 
400
-	return $r ?: $query;
400
+    return $r ?: $query;
401 401
 }
402 402
 
403 403
 
@@ -414,7 +414,7 @@  discard block
 block discarded – undo
414 414
  * @return string Texte du orderby préparé
415 415
  */
416 416
 function spip_mysql_order($orderby) {
417
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
417
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
418 418
 }
419 419
 
420 420
 
@@ -437,26 +437,26 @@  discard block
 block discarded – undo
437 437
  *     Contrainte pour clause WHERE
438 438
  */
439 439
 function calculer_mysql_where($v) {
440
-	if (!is_array($v)) {
441
-		return $v;
442
-	}
443
-
444
-	$op = array_shift($v);
445
-	if (!($n = count($v))) {
446
-		return $op;
447
-	} else {
448
-		$arg = calculer_mysql_where(array_shift($v));
449
-		if ($n == 1) {
450
-			return "$op($arg)";
451
-		} else {
452
-			$arg2 = calculer_mysql_where(array_shift($v));
453
-			if ($n == 2) {
454
-				return "($arg $op $arg2)";
455
-			} else {
456
-				return "($arg $op ($arg2) : $v[0])";
457
-			}
458
-		}
459
-	}
440
+    if (!is_array($v)) {
441
+        return $v;
442
+    }
443
+
444
+    $op = array_shift($v);
445
+    if (!($n = count($v))) {
446
+        return $op;
447
+    } else {
448
+        $arg = calculer_mysql_where(array_shift($v));
449
+        if ($n == 1) {
450
+            return "$op($arg)";
451
+        } else {
452
+            $arg2 = calculer_mysql_where(array_shift($v));
453
+            if ($n == 2) {
454
+                return "($arg $op $arg2)";
455
+            } else {
456
+                return "($arg $op ($arg2) : $v[0])";
457
+            }
458
+        }
459
+    }
460 460
 }
461 461
 
462 462
 /**
@@ -471,21 +471,21 @@  discard block
 block discarded – undo
471 471
  * @return string            Texte de l'expression, une partie donc, du texte la requête.
472 472
  */
473 473
 function calculer_mysql_expression($expression, $v, $join = 'AND') {
474
-	if (empty($v)) {
475
-		return '';
476
-	}
477
-
478
-	$exp = "\n$expression ";
479
-
480
-	if (!is_array($v)) {
481
-		return $exp . $v;
482
-	} else {
483
-		if (strtoupper($join) === 'AND') {
484
-			return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
485
-		} else {
486
-			return $exp . join($join, $v);
487
-		}
488
-	}
474
+    if (empty($v)) {
475
+        return '';
476
+    }
477
+
478
+    $exp = "\n$expression ";
479
+
480
+    if (!is_array($v)) {
481
+        return $exp . $v;
482
+    } else {
483
+        if (strtoupper($join) === 'AND') {
484
+            return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v));
485
+        } else {
486
+            return $exp . join($join, $v);
487
+        }
488
+    }
489 489
 }
490 490
 
491 491
 
@@ -496,26 +496,26 @@  discard block
 block discarded – undo
496 496
  * @return string Sélection de colonnes pour une clause SELECT
497 497
  */
498 498
 function spip_mysql_select_as($args) {
499
-	$res = '';
500
-	foreach ($args as $k => $v) {
501
-		if (substr($k, -1) == '@') {
502
-			// c'est une jointure qui se refere au from precedent
503
-			// pas de virgule
504
-			$res .= '  ' . $v;
505
-		} else {
506
-			if (!is_numeric($k)) {
507
-				$p = strpos($v, ' ');
508
-				if ($p) {
509
-					$v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p);
510
-				} else {
511
-					$v .= " AS `$k`";
512
-				}
513
-			}
514
-			$res .= ', ' . $v;
515
-		}
516
-	}
517
-
518
-	return substr($res, 2);
499
+    $res = '';
500
+    foreach ($args as $k => $v) {
501
+        if (substr($k, -1) == '@') {
502
+            // c'est une jointure qui se refere au from precedent
503
+            // pas de virgule
504
+            $res .= '  ' . $v;
505
+        } else {
506
+            if (!is_numeric($k)) {
507
+                $p = strpos($v, ' ');
508
+                if ($p) {
509
+                    $v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p);
510
+                } else {
511
+                    $v .= " AS `$k`";
512
+                }
513
+            }
514
+            $res .= ', ' . $v;
515
+        }
516
+    }
517
+
518
+    return substr($res, 2);
519 519
 }
520 520
 
521 521
 
@@ -540,58 +540,58 @@  discard block
 block discarded – undo
540 540
  */
541 541
 function _mysql_traite_query($query, $db = '', $prefixe = '', $echappe_textes = true) {
542 542
 
543
-	if ($GLOBALS['mysql_rappel_nom_base'] and $db) {
544
-		$pref = '`' . $db . '`.';
545
-	} else {
546
-		$pref = '';
547
-	}
548
-
549
-	if ($prefixe) {
550
-		$pref .= $prefixe . '_';
551
-	}
552
-
553
-	if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
554
-		$suite = '';
555
-	} else {
556
-		$suite = strstr($query, (string) $regs[0]);
557
-		$query = substr($query, 0, -strlen($suite));
558
-		// propager le prefixe en cas de requete imbriquee
559
-		// il faut alors echapper les chaine avant de le faire, pour ne pas risquer de
560
-		// modifier une requete qui est en fait juste du texte dans un champ
561
-		if (stripos($suite, 'SELECT') !== false) {
562
-			if ($echappe_textes) {
563
-				[$suite_echap, $textes] = query_echappe_textes($suite);
564
-			}
565
-			else {
566
-				$suite_echap = $suite;
567
-			}
568
-			if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
569
-				$suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
570
-				if ($echappe_textes) {
571
-					$suite = query_reinjecte_textes($suite_echap, $textes);
572
-				}
573
-				else {
574
-					$suite = $suite_echap;
575
-				}
576
-			}
577
-		}
578
-	}
579
-	$r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
580
-
581
-	// en option, remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
582
-	// remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
583
-	if (
584
-		defined('_MYSQL_NOPLANES')
585
-		and _MYSQL_NOPLANES
586
-		and !empty($GLOBALS['meta']['charset_sql_connexion'])
587
-		and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
588
-	) {
589
-		include_spip('inc/charsets');
590
-		$r = utf8_noplanes($r);
591
-	}
592
-
593
-	#spip_log("_mysql_traite_query: " . substr($r,0, 50) . ".... $db, $prefixe", _LOG_DEBUG);
594
-	return $r;
543
+    if ($GLOBALS['mysql_rappel_nom_base'] and $db) {
544
+        $pref = '`' . $db . '`.';
545
+    } else {
546
+        $pref = '';
547
+    }
548
+
549
+    if ($prefixe) {
550
+        $pref .= $prefixe . '_';
551
+    }
552
+
553
+    if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) {
554
+        $suite = '';
555
+    } else {
556
+        $suite = strstr($query, (string) $regs[0]);
557
+        $query = substr($query, 0, -strlen($suite));
558
+        // propager le prefixe en cas de requete imbriquee
559
+        // il faut alors echapper les chaine avant de le faire, pour ne pas risquer de
560
+        // modifier une requete qui est en fait juste du texte dans un champ
561
+        if (stripos($suite, 'SELECT') !== false) {
562
+            if ($echappe_textes) {
563
+                [$suite_echap, $textes] = query_echappe_textes($suite);
564
+            }
565
+            else {
566
+                $suite_echap = $suite;
567
+            }
568
+            if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite_echap, $r)) {
569
+                $suite_echap = $r[1] . _mysql_traite_query($r[2], $db, $prefixe, false);
570
+                if ($echappe_textes) {
571
+                    $suite = query_reinjecte_textes($suite_echap, $textes);
572
+                }
573
+                else {
574
+                    $suite = $suite_echap;
575
+                }
576
+            }
577
+        }
578
+    }
579
+    $r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite;
580
+
581
+    // en option, remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
582
+    // remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
583
+    if (
584
+        defined('_MYSQL_NOPLANES')
585
+        and _MYSQL_NOPLANES
586
+        and !empty($GLOBALS['meta']['charset_sql_connexion'])
587
+        and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
588
+    ) {
589
+        include_spip('inc/charsets');
590
+        $r = utf8_noplanes($r);
591
+    }
592
+
593
+    #spip_log("_mysql_traite_query: " . substr($r,0, 50) . ".... $db, $prefixe", _LOG_DEBUG);
594
+    return $r;
595 595
 }
596 596
 
597 597
 /**
@@ -609,13 +609,13 @@  discard block
 block discarded – undo
609 609
  *     - False en cas d'erreur.
610 610
  **/
611 611
 function spip_mysql_selectdb($db, $serveur = '', $requeter = true) {
612
-	$link = _mysql_link($serveur);
613
-	$ok = mysqli_select_db($link, $db);
614
-	if (!$ok) {
615
-		spip_log('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link), 'mysql.' . _LOG_CRITIQUE);
616
-	}
612
+    $link = _mysql_link($serveur);
613
+    $ok = mysqli_select_db($link, $db);
614
+    if (!$ok) {
615
+        spip_log('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link), 'mysql.' . _LOG_CRITIQUE);
616
+    }
617 617
 
618
-	return $ok;
618
+    return $ok;
619 619
 }
620 620
 
621 621
 
@@ -636,14 +636,14 @@  discard block
 block discarded – undo
636 636
  *     Liste de noms de bases de données
637 637
  **/
638 638
 function spip_mysql_listdbs($serveur = '', $requeter = true) {
639
-	$dbs = [];
640
-	if ($res = spip_mysql_query('SHOW DATABASES', $serveur)) {
641
-		while ($row = mysqli_fetch_assoc($res)) {
642
-			$dbs[] = $row['Database'];
643
-		}
644
-	}
645
-
646
-	return $dbs;
639
+    $dbs = [];
640
+    if ($res = spip_mysql_query('SHOW DATABASES', $serveur)) {
641
+        while ($row = mysqli_fetch_assoc($res)) {
642
+            $dbs[] = $row['Database'];
643
+        }
644
+    }
645
+
646
+    return $dbs;
647 647
 }
648 648
 
649 649
 
@@ -666,73 +666,73 @@  discard block
 block discarded – undo
666 666
  *     - true si la requête réussie, false sinon.
667 667
  */
668 668
 function spip_mysql_create(
669
-	$nom,
670
-	$champs,
671
-	$cles,
672
-	$autoinc = false,
673
-	$temporary = false,
674
-	$serveur = '',
675
-	$requeter = true
669
+    $nom,
670
+    $champs,
671
+    $cles,
672
+    $autoinc = false,
673
+    $temporary = false,
674
+    $serveur = '',
675
+    $requeter = true
676 676
 ) {
677 677
 
678
-	$query = '';
679
-	$keys = '';
680
-	$s = '';
681
-	$p = '';
682
-
683
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
684
-	// sans les renseigner (laisse le compilo recuperer la description)
685
-	if (!is_array($champs) || !is_array($cles)) {
686
-		return;
687
-	}
688
-
689
-	$res = spip_mysql_query('SELECT version() as v', $serveur);
690
-	if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'], '5.0', '>='))) {
691
-		spip_mysql_query("SET sql_mode=''", $serveur);
692
-	}
693
-
694
-	foreach ($cles as $k => $v) {
695
-		$keys .= "$s\n\t\t$k ($v)";
696
-		if ($k == 'PRIMARY KEY') {
697
-			$p = $v;
698
-		}
699
-		$s = ',';
700
-	}
701
-	$s = '';
702
-
703
-	$character_set = '';
704
-	if (@$GLOBALS['meta']['charset_sql_base']) {
705
-		$character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
706
-	}
707
-	if (@$GLOBALS['meta']['charset_collation_sql_base']) {
708
-		$character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
709
-	}
710
-
711
-	foreach ($champs as $k => $v) {
712
-		$v = _mysql_remplacements_definitions_table($v);
713
-		if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
714
-			if (
715
-				preg_match(',(char|text),i', $defs[1])
716
-				and !preg_match(',(binary|CHARACTER|COLLATE),i', $v)
717
-			) {
718
-				$v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
719
-			}
720
-		}
721
-
722
-		$query .= "$s\n\t\t$k $v"
723
-			. (($autoinc && ($p == $k) && preg_match(',\b(big|small|medium)?int\b,i', $v))
724
-				? ' auto_increment'
725
-				: ''
726
-			);
727
-		$s = ',';
728
-	}
729
-	$temporary = $temporary ? 'TEMPORARY' : '';
730
-	$q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
731
-		. ' ENGINE=MyISAM'
732
-		. ($character_set ? " DEFAULT $character_set" : '')
733
-		. "\n";
734
-
735
-	return spip_mysql_query($q, $serveur);
678
+    $query = '';
679
+    $keys = '';
680
+    $s = '';
681
+    $p = '';
682
+
683
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
684
+    // sans les renseigner (laisse le compilo recuperer la description)
685
+    if (!is_array($champs) || !is_array($cles)) {
686
+        return;
687
+    }
688
+
689
+    $res = spip_mysql_query('SELECT version() as v', $serveur);
690
+    if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'], '5.0', '>='))) {
691
+        spip_mysql_query("SET sql_mode=''", $serveur);
692
+    }
693
+
694
+    foreach ($cles as $k => $v) {
695
+        $keys .= "$s\n\t\t$k ($v)";
696
+        if ($k == 'PRIMARY KEY') {
697
+            $p = $v;
698
+        }
699
+        $s = ',';
700
+    }
701
+    $s = '';
702
+
703
+    $character_set = '';
704
+    if (@$GLOBALS['meta']['charset_sql_base']) {
705
+        $character_set .= ' CHARACTER SET ' . $GLOBALS['meta']['charset_sql_base'];
706
+    }
707
+    if (@$GLOBALS['meta']['charset_collation_sql_base']) {
708
+        $character_set .= ' COLLATE ' . $GLOBALS['meta']['charset_collation_sql_base'];
709
+    }
710
+
711
+    foreach ($champs as $k => $v) {
712
+        $v = _mysql_remplacements_definitions_table($v);
713
+        if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) {
714
+            if (
715
+                preg_match(',(char|text),i', $defs[1])
716
+                and !preg_match(',(binary|CHARACTER|COLLATE),i', $v)
717
+            ) {
718
+                $v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1]));
719
+            }
720
+        }
721
+
722
+        $query .= "$s\n\t\t$k $v"
723
+            . (($autoinc && ($p == $k) && preg_match(',\b(big|small|medium)?int\b,i', $v))
724
+                ? ' auto_increment'
725
+                : ''
726
+            );
727
+        $s = ',';
728
+    }
729
+    $temporary = $temporary ? 'TEMPORARY' : '';
730
+    $q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ')'
731
+        . ' ENGINE=MyISAM'
732
+        . ($character_set ? " DEFAULT $character_set" : '')
733
+        . "\n";
734
+
735
+    return spip_mysql_query($q, $serveur);
736 736
 }
737 737
 
738 738
 
@@ -745,25 +745,25 @@  discard block
 block discarded – undo
745 745
  *     Définition SQL adaptée pour MySQL d'un champ de table
746 746
  */
747 747
 function _mysql_remplacements_definitions_table($query) {
748
-	// quelques remplacements
749
-	$num = '(\s*\([0-9]*\))?';
750
-	$enum = '(\s*\([^\)]*\))?';
751
-
752
-	$remplace = [
753
-		'/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
754
-		'/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
755
-	];
756
-
757
-	if (is_string($query)) {
758
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
759
-	} elseif (is_array($query)) {
760
-		$keys = array_keys($remplace);
761
-		foreach ($query as $k => $q) {
762
-			$query[$k] = preg_replace($keys, $remplace, $q);
763
-		}
764
-	}
765
-
766
-	return $query;
748
+    // quelques remplacements
749
+    $num = '(\s*\([0-9]*\))?';
750
+    $enum = '(\s*\([^\)]*\))?';
751
+
752
+    $remplace = [
753
+        '/VARCHAR(\s*[^\s\(])/is' => 'VARCHAR(255)\\1',
754
+        '/^TIMESTAMP($| NULL DEFAULT NULL)/is' => 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
755
+    ];
756
+
757
+    if (is_string($query)) {
758
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
759
+    } elseif (is_array($query)) {
760
+        $keys = array_keys($remplace);
761
+        foreach ($query as $k => $q) {
762
+            $query[$k] = preg_replace($keys, $remplace, $q);
763
+        }
764
+    }
765
+
766
+    return $query;
767 767
 }
768 768
 
769 769
 
@@ -776,7 +776,7 @@  discard block
 block discarded – undo
776 776
  * @return bool true si la base est créee.
777 777
  **/
778 778
 function spip_mysql_create_base($nom, $serveur = '', $requeter = true) {
779
-	return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter);
779
+    return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter);
780 780
 }
781 781
 
782 782
 
@@ -797,19 +797,19 @@  discard block
 block discarded – undo
797 797
  *     - string texte de la requête si $requeter vaut false
798 798
  */
799 799
 function spip_mysql_create_view($nom, $query_select, $serveur = '', $requeter = true) {
800
-	if (!$query_select) {
801
-		return false;
802
-	}
803
-	// vue deja presente
804
-	if (sql_showtable($nom, false, $serveur)) {
805
-		spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", _LOG_ERREUR);
800
+    if (!$query_select) {
801
+        return false;
802
+    }
803
+    // vue deja presente
804
+    if (sql_showtable($nom, false, $serveur)) {
805
+        spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", _LOG_ERREUR);
806 806
 
807
-		return false;
808
-	}
807
+        return false;
808
+    }
809 809
 
810
-	$query = "CREATE VIEW $nom AS " . $query_select;
810
+    $query = "CREATE VIEW $nom AS " . $query_select;
811 811
 
812
-	return spip_mysql_query($query, $serveur, $requeter);
812
+    return spip_mysql_query($query, $serveur, $requeter);
813 813
 }
814 814
 
815 815
 
@@ -825,11 +825,11 @@  discard block
 block discarded – undo
825 825
  *     - true si la requête a réussie, false sinon
826 826
  */
827 827
 function spip_mysql_drop_table($table, $exist = '', $serveur = '', $requeter = true) {
828
-	if ($exist) {
829
-		$exist = ' IF EXISTS';
830
-	}
828
+    if ($exist) {
829
+        $exist = ' IF EXISTS';
830
+    }
831 831
 
832
-	return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter);
832
+    return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter);
833 833
 }
834 834
 
835 835
 /**
@@ -844,11 +844,11 @@  discard block
 block discarded – undo
844 844
  *     - true si la requête a réussie, false sinon
845 845
  */
846 846
 function spip_mysql_drop_view($view, $exist = '', $serveur = '', $requeter = true) {
847
-	if ($exist) {
848
-		$exist = ' IF EXISTS';
849
-	}
847
+    if ($exist) {
848
+        $exist = ' IF EXISTS';
849
+    }
850 850
 
851
-	return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter);
851
+    return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter);
852 852
 }
853 853
 
854 854
 /**
@@ -865,7 +865,7 @@  discard block
 block discarded – undo
865 865
  *     Ressource à utiliser avec sql_fetch()
866 866
  **/
867 867
 function spip_mysql_showbase($match, $serveur = '', $requeter = true) {
868
-	return spip_mysql_query('SHOW TABLES LIKE ' . _q($match), $serveur, $requeter);
868
+    return spip_mysql_query('SHOW TABLES LIKE ' . _q($match), $serveur, $requeter);
869 869
 }
870 870
 
871 871
 /**
@@ -881,7 +881,7 @@  discard block
 block discarded – undo
881 881
  *     - true si la requête a réussie, false sinon
882 882
  */
883 883
 function spip_mysql_repair($table, $serveur = '', $requeter = true) {
884
-	return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
884
+    return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter);
885 885
 }
886 886
 
887 887
 /**
@@ -899,12 +899,12 @@  discard block
 block discarded – undo
899 899
  *     - string : requete sql, si $requeter = true
900 900
  **/
901 901
 function spip_mysql_table_exists(string $table, $serveur = '', $requeter = true) {
902
-	$r = spip_mysql_query('SHOW TABLES LIKE ' . _q($table), $serveur, $requeter);
903
-	if (!$requeter) {
904
-		return $r;
905
-	}
906
-	$res = spip_mysql_fetch($r);
907
-	return (bool) $res;
902
+    $r = spip_mysql_query('SHOW TABLES LIKE ' . _q($table), $serveur, $requeter);
903
+    if (!$requeter) {
904
+        return $r;
905
+    }
906
+    $res = spip_mysql_fetch($r);
907
+    return (bool) $res;
908 908
 }
909 909
 
910 910
 define('_MYSQL_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -927,86 +927,86 @@  discard block
 block discarded – undo
927 927
  *     - array description de la table sinon
928 928
  */
929 929
 function spip_mysql_showtable($nom_table, $serveur = '', $requeter = true) {
930
-	$s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter);
931
-	if (!$s) {
932
-		return '';
933
-	}
934
-	if (!$requeter) {
935
-		return $s;
936
-	}
937
-
938
-	[, $a] = mysqli_fetch_array($s, MYSQLI_NUM);
939
-	if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)) {
940
-		$desc = $r[1];
941
-		// extraction d'une KEY éventuelle en prenant garde de ne pas
942
-		// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
943
-		if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
944
-			$namedkeys = $r[2];
945
-			$desc = $r[1];
946
-		} else {
947
-			$namedkeys = '';
948
-		}
949
-
950
-		$fields = [];
951
-		foreach (preg_split('/,\s*`/', $desc) as $v) {
952
-			preg_match('/^\s*`?([^`]*)`\s*(.*)/', $v, $r);
953
-			$fields[strtolower($r[1])] = $r[2];
954
-		}
955
-		$keys = [];
956
-
957
-		foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
958
-			if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
959
-				$k = str_replace('`', '', trim($r[1]));
960
-				$t = strtolower(str_replace('`', '', $r[2]));
961
-				if ($k && !isset($keys[$k])) {
962
-					$keys[$k] = $t;
963
-				} else {
964
-					$keys[] = $t;
965
-				}
966
-			}
967
-		}
968
-		spip_mysql_free($s);
969
-
970
-		return ['field' => $fields, 'key' => $keys];
971
-	}
972
-
973
-	$res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur);
974
-	if ($res) {
975
-		$nfields = [];
976
-		$nkeys = [];
977
-		while ($val = spip_mysql_fetch($res)) {
978
-			$nfields[$val['Field']] = $val['Type'];
979
-			if ($val['Null'] == 'NO') {
980
-				$nfields[$val['Field']] .= ' NOT NULL';
981
-			}
982
-			if ($val['Default'] === '0' || $val['Default']) {
983
-				if (preg_match('/[A-Z_]/', $val['Default'])) {
984
-					$nfields[$val['Field']] .= ' DEFAULT ' . $val['Default'];
985
-				} else {
986
-					$nfields[$val['Field']] .= " DEFAULT '" . $val['Default'] . "'";
987
-				}
988
-			}
989
-			if ($val['Extra']) {
990
-				$nfields[$val['Field']] .= ' ' . $val['Extra'];
991
-			}
992
-			if ($val['Key'] == 'PRI') {
993
-				$nkeys['PRIMARY KEY'] = $val['Field'];
994
-			} else {
995
-				if ($val['Key'] == 'MUL') {
996
-					$nkeys['KEY ' . $val['Field']] = $val['Field'];
997
-				} else {
998
-					if ($val['Key'] == 'UNI') {
999
-						$nkeys['UNIQUE KEY ' . $val['Field']] = $val['Field'];
1000
-					}
1001
-				}
1002
-			}
1003
-		}
1004
-		spip_mysql_free($res);
1005
-
1006
-		return ['field' => $nfields, 'key' => $nkeys];
1007
-	}
1008
-
1009
-	return '';
930
+    $s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter);
931
+    if (!$s) {
932
+        return '';
933
+    }
934
+    if (!$requeter) {
935
+        return $s;
936
+    }
937
+
938
+    [, $a] = mysqli_fetch_array($s, MYSQLI_NUM);
939
+    if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)) {
940
+        $desc = $r[1];
941
+        // extraction d'une KEY éventuelle en prenant garde de ne pas
942
+        // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
943
+        if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
944
+            $namedkeys = $r[2];
945
+            $desc = $r[1];
946
+        } else {
947
+            $namedkeys = '';
948
+        }
949
+
950
+        $fields = [];
951
+        foreach (preg_split('/,\s*`/', $desc) as $v) {
952
+            preg_match('/^\s*`?([^`]*)`\s*(.*)/', $v, $r);
953
+            $fields[strtolower($r[1])] = $r[2];
954
+        }
955
+        $keys = [];
956
+
957
+        foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
958
+            if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
959
+                $k = str_replace('`', '', trim($r[1]));
960
+                $t = strtolower(str_replace('`', '', $r[2]));
961
+                if ($k && !isset($keys[$k])) {
962
+                    $keys[$k] = $t;
963
+                } else {
964
+                    $keys[] = $t;
965
+                }
966
+            }
967
+        }
968
+        spip_mysql_free($s);
969
+
970
+        return ['field' => $fields, 'key' => $keys];
971
+    }
972
+
973
+    $res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur);
974
+    if ($res) {
975
+        $nfields = [];
976
+        $nkeys = [];
977
+        while ($val = spip_mysql_fetch($res)) {
978
+            $nfields[$val['Field']] = $val['Type'];
979
+            if ($val['Null'] == 'NO') {
980
+                $nfields[$val['Field']] .= ' NOT NULL';
981
+            }
982
+            if ($val['Default'] === '0' || $val['Default']) {
983
+                if (preg_match('/[A-Z_]/', $val['Default'])) {
984
+                    $nfields[$val['Field']] .= ' DEFAULT ' . $val['Default'];
985
+                } else {
986
+                    $nfields[$val['Field']] .= " DEFAULT '" . $val['Default'] . "'";
987
+                }
988
+            }
989
+            if ($val['Extra']) {
990
+                $nfields[$val['Field']] .= ' ' . $val['Extra'];
991
+            }
992
+            if ($val['Key'] == 'PRI') {
993
+                $nkeys['PRIMARY KEY'] = $val['Field'];
994
+            } else {
995
+                if ($val['Key'] == 'MUL') {
996
+                    $nkeys['KEY ' . $val['Field']] = $val['Field'];
997
+                } else {
998
+                    if ($val['Key'] == 'UNI') {
999
+                        $nkeys['UNIQUE KEY ' . $val['Field']] = $val['Field'];
1000
+                    }
1001
+                }
1002
+            }
1003
+        }
1004
+        spip_mysql_free($res);
1005
+
1006
+        return ['field' => $nfields, 'key' => $nkeys];
1007
+    }
1008
+
1009
+    return '';
1010 1010
 }
1011 1011
 
1012 1012
 
@@ -1022,12 +1022,12 @@  discard block
 block discarded – undo
1022 1022
  * @return array           Ligne de résultat
1023 1023
  */
1024 1024
 function spip_mysql_fetch($r, $t = '', $serveur = '', $requeter = true) {
1025
-	if (!$t) {
1026
-		$t = \MYSQLI_ASSOC;
1027
-	}
1028
-	if ($r) {
1029
-		return mysqli_fetch_array($r, $t);
1030
-	}
1025
+    if (!$t) {
1026
+        $t = \MYSQLI_ASSOC;
1027
+    }
1028
+    if ($r) {
1029
+        return mysqli_fetch_array($r, $t);
1030
+    }
1031 1031
 }
1032 1032
 
1033 1033
 /**
@@ -1040,9 +1040,9 @@  discard block
 block discarded – undo
1040 1040
  * @return bool True si déplacement réussi, false sinon.
1041 1041
  **/
1042 1042
 function spip_mysql_seek($r, $row_number, $serveur = '', $requeter = true) {
1043
-	if ($r and mysqli_num_rows($r)) {
1044
-		return mysqli_data_seek($r, $row_number);
1045
-	}
1043
+    if ($r and mysqli_num_rows($r)) {
1044
+        return mysqli_data_seek($r, $row_number);
1045
+    }
1046 1046
 }
1047 1047
 
1048 1048
 
@@ -1060,26 +1060,26 @@  discard block
 block discarded – undo
1060 1060
  *     - int Nombre de lignes (0 si la requête n'a pas réussie)
1061 1061
  **/
1062 1062
 function spip_mysql_countsel(
1063
-	$from = [],
1064
-	$where = [],
1065
-	$groupby = '',
1066
-	$having = [],
1067
-	$serveur = '',
1068
-	$requeter = true
1063
+    $from = [],
1064
+    $where = [],
1065
+    $groupby = '',
1066
+    $having = [],
1067
+    $serveur = '',
1068
+    $requeter = true
1069 1069
 ) {
1070
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
1071
-
1072
-	$r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
1073
-	if (!$requeter) {
1074
-		return $r;
1075
-	}
1076
-	if (!$r instanceof mysqli_result) {
1077
-		return 0;
1078
-	}
1079
-	[$c] = mysqli_fetch_array($r, MYSQLI_NUM);
1080
-	mysqli_free_result($r);
1081
-
1082
-	return $c;
1070
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
1071
+
1072
+    $r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter);
1073
+    if (!$requeter) {
1074
+        return $r;
1075
+    }
1076
+    if (!$r instanceof mysqli_result) {
1077
+        return 0;
1078
+    }
1079
+    [$c] = mysqli_fetch_array($r, MYSQLI_NUM);
1080
+    mysqli_free_result($r);
1081
+
1082
+    return $c;
1083 1083
 }
1084 1084
 
1085 1085
 
@@ -1102,16 +1102,16 @@  discard block
 block discarded – undo
1102 1102
  *     Erreur eventuelle
1103 1103
  **/
1104 1104
 function spip_mysql_error($query = '', $serveur = '', $requeter = true) {
1105
-	$link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1106
-	$s = mysqli_error($link);
1107
-	if ($s) {
1108
-		$trace = debug_backtrace();
1109
-		if ($trace[0]['function'] != 'spip_mysql_error') {
1110
-			spip_log("$s - $query - " . sql_error_backtrace(), 'mysql.' . _LOG_ERREUR);
1111
-		}
1112
-	}
1113
-
1114
-	return $s;
1105
+    $link = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]['link'];
1106
+    $s = mysqli_error($link);
1107
+    if ($s) {
1108
+        $trace = debug_backtrace();
1109
+        if ($trace[0]['function'] != 'spip_mysql_error') {
1110
+            spip_log("$s - $query - " . sql_error_backtrace(), 'mysql.' . _LOG_ERREUR);
1111
+        }
1112
+    }
1113
+
1114
+    return $s;
1115 1115
 }
1116 1116
 
1117 1117
 
@@ -1126,18 +1126,18 @@  discard block
 block discarded – undo
1126 1126
  *     0, pas d'erreur. Autre, numéro de l'erreur.
1127 1127
  **/
1128 1128
 function spip_mysql_errno($serveur = '', $requeter = true) {
1129
-	$link = $GLOBALS['connexions'][$serveur ?: 0]['link'];
1130
-	$s = mysqli_errno($link);
1131
-	// 2006 MySQL server has gone away
1132
-	// 2013 Lost connection to MySQL server during query
1133
-	if (in_array($s, [2006, 2013])) {
1134
-		define('spip_interdire_cache', true);
1135
-	}
1136
-	if ($s) {
1137
-		spip_log("Erreur mysql $s", _LOG_ERREUR);
1138
-	}
1139
-
1140
-	return $s;
1129
+    $link = $GLOBALS['connexions'][$serveur ?: 0]['link'];
1130
+    $s = mysqli_errno($link);
1131
+    // 2006 MySQL server has gone away
1132
+    // 2013 Lost connection to MySQL server during query
1133
+    if (in_array($s, [2006, 2013])) {
1134
+        define('spip_interdire_cache', true);
1135
+    }
1136
+    if ($s) {
1137
+        spip_log("Erreur mysql $s", _LOG_ERREUR);
1138
+    }
1139
+
1140
+    return $s;
1141 1141
 }
1142 1142
 
1143 1143
 
@@ -1151,9 +1151,9 @@  discard block
 block discarded – undo
1151 1151
  * @return int               Nombre de lignes
1152 1152
  */
1153 1153
 function spip_mysql_count($r, $serveur = '', $requeter = true) {
1154
-	if ($r) {
1155
-		return mysqli_num_rows($r);
1156
-	}
1154
+    if ($r) {
1155
+        return mysqli_num_rows($r);
1156
+    }
1157 1157
 }
1158 1158
 
1159 1159
 
@@ -1169,7 +1169,7 @@  discard block
 block discarded – undo
1169 1169
  * @return bool              True si réussi
1170 1170
  */
1171 1171
 function spip_mysql_free($r, $serveur = '', $requeter = true) {
1172
-	return (($r instanceof mysqli_result) ? mysqli_free_result($r) : false);
1172
+    return (($r instanceof mysqli_result) ? mysqli_free_result($r) : false);
1173 1173
 }
1174 1174
 
1175 1175
 
@@ -1197,59 +1197,59 @@  discard block
 block discarded – undo
1197 1197
  **/
1198 1198
 function spip_mysql_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1199 1199
 
1200
-	$e = null;
1201
-	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1202
-	$link = $connexion['link'];
1203
-	$table = prefixer_table_spip($table, $connexion['prefixe']);
1204
-
1205
-	// remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
1206
-	if (
1207
-		defined('_MYSQL_NOPLANES')
1208
-		and _MYSQL_NOPLANES
1209
-		and !empty($GLOBALS['meta']['charset_sql_connexion'])
1210
-		and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
1211
-	) {
1212
-		include_spip('inc/charsets');
1213
-		$valeurs = utf8_noplanes($valeurs);
1214
-	}
1215
-
1216
-	$query = "INSERT INTO $table $champs VALUES $valeurs";
1217
-	if (!$requeter) {
1218
-		return $query;
1219
-	}
1220
-
1221
-	if (isset($_GET['var_profile'])) {
1222
-		include_spip('public/tracer');
1223
-		$t = trace_query_start();
1224
-		$e = '';
1225
-	} else {
1226
-		$t = 0;
1227
-	}
1228
-
1229
-	$connexion['last'] = $query;
1230
-	#spip_log($query, 'mysql.'._LOG_DEBUG);
1231
-	$r = false;
1232
-	$insert = false;
1233
-	try {
1234
-		$insert = mysqli_query($link, $query);
1235
-	} catch (\mysqli_sql_exception $e) {
1236
-		spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
1237
-		// TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
1238
-		// mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
1239
-	}
1240
-	if ($insert) {
1241
-		$r = mysqli_insert_id($link);
1242
-	} else {
1243
-		// Log de l'erreur eventuelle
1244
-		if ($e = spip_mysql_errno($serveur)) {
1245
-			// et du fautif
1246
-			$e .= spip_mysql_error($query, $serveur);
1247
-		} 
1248
-	}
1249
-
1250
-	return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
1251
-
1252
-	// return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base.
1200
+    $e = null;
1201
+    $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
1202
+    $link = $connexion['link'];
1203
+    $table = prefixer_table_spip($table, $connexion['prefixe']);
1204
+
1205
+    // remplacer les emoji (que mysql ne sait pas gérer) en &#128169;
1206
+    if (
1207
+        defined('_MYSQL_NOPLANES')
1208
+        and _MYSQL_NOPLANES
1209
+        and !empty($GLOBALS['meta']['charset_sql_connexion'])
1210
+        and $GLOBALS['meta']['charset_sql_connexion'] == 'utf8'
1211
+    ) {
1212
+        include_spip('inc/charsets');
1213
+        $valeurs = utf8_noplanes($valeurs);
1214
+    }
1215
+
1216
+    $query = "INSERT INTO $table $champs VALUES $valeurs";
1217
+    if (!$requeter) {
1218
+        return $query;
1219
+    }
1220
+
1221
+    if (isset($_GET['var_profile'])) {
1222
+        include_spip('public/tracer');
1223
+        $t = trace_query_start();
1224
+        $e = '';
1225
+    } else {
1226
+        $t = 0;
1227
+    }
1228
+
1229
+    $connexion['last'] = $query;
1230
+    #spip_log($query, 'mysql.'._LOG_DEBUG);
1231
+    $r = false;
1232
+    $insert = false;
1233
+    try {
1234
+        $insert = mysqli_query($link, $query);
1235
+    } catch (\mysqli_sql_exception $e) {
1236
+        spip_log('mysqli_sql_exception: ' . $e->getMessage(), 'mysql.' . _LOG_DEBUG);
1237
+        // TODO: utiliser l’exception ensuite plutôt que les appels à spip_mysql_errno()
1238
+        // mais il faut pour php < 8.1 forcer les exeptions via mysqli_report().
1239
+    }
1240
+    if ($insert) {
1241
+        $r = mysqli_insert_id($link);
1242
+    } else {
1243
+        // Log de l'erreur eventuelle
1244
+        if ($e = spip_mysql_errno($serveur)) {
1245
+            // et du fautif
1246
+            $e .= spip_mysql_error($query, $serveur);
1247
+        } 
1248
+    }
1249
+
1250
+    return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r;
1251
+
1252
+    // return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base.
1253 1253
 }
1254 1254
 
1255 1255
 /**
@@ -1274,26 +1274,26 @@  discard block
 block discarded – undo
1274 1274
  **/
1275 1275
 function spip_mysql_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
1276 1276
 
1277
-	if (!$desc) {
1278
-		$desc = description_table($table, $serveur);
1279
-	}
1280
-	if (!$desc) {
1281
-		$couples = [];
1282
-	}
1283
-	$fields = $desc['field'] ?? [];
1284
-
1285
-	foreach ($couples as $champ => $val) {
1286
-		$couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1287
-	}
1288
-
1289
-	return spip_mysql_insert(
1290
-		$table,
1291
-		'(' . join(',', array_keys($couples)) . ')',
1292
-		'(' . join(',', $couples) . ')',
1293
-		$desc,
1294
-		$serveur,
1295
-		$requeter
1296
-	);
1277
+    if (!$desc) {
1278
+        $desc = description_table($table, $serveur);
1279
+    }
1280
+    if (!$desc) {
1281
+        $couples = [];
1282
+    }
1283
+    $fields = $desc['field'] ?? [];
1284
+
1285
+    foreach ($couples as $champ => $val) {
1286
+        $couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1287
+    }
1288
+
1289
+    return spip_mysql_insert(
1290
+        $table,
1291
+        '(' . join(',', array_keys($couples)) . ')',
1292
+        '(' . join(',', $couples) . ')',
1293
+        $desc,
1294
+        $serveur,
1295
+        $requeter
1296
+    );
1297 1297
 }
1298 1298
 
1299 1299
 
@@ -1318,34 +1318,34 @@  discard block
 block discarded – undo
1318 1318
  **/
1319 1319
 function spip_mysql_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
1320 1320
 
1321
-	if (!$desc) {
1322
-		$desc = description_table($table, $serveur);
1323
-	}
1324
-	if (!$desc) {
1325
-		$tab_couples = [];
1326
-	}
1327
-	$fields = $desc['field'] ?? [];
1328
-
1329
-	$cles = '(' . join(',', array_keys(reset($tab_couples))) . ')';
1330
-	$valeurs = [];
1331
-	$r = false;
1332
-
1333
-	// Quoter et Inserer par groupes de 100 max pour eviter un debordement de pile
1334
-	foreach ($tab_couples as $couples) {
1335
-		foreach ($couples as $champ => $val) {
1336
-			$couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1337
-		}
1338
-		$valeurs[] = '(' . join(',', $couples) . ')';
1339
-		if (count($valeurs) >= 100) {
1340
-			$r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1341
-			$valeurs = [];
1342
-		}
1343
-	}
1344
-	if (count($valeurs)) {
1345
-		$r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1346
-	}
1347
-
1348
-	return $r; // dans le cas d'une table auto_increment, le dernier insert_id
1321
+    if (!$desc) {
1322
+        $desc = description_table($table, $serveur);
1323
+    }
1324
+    if (!$desc) {
1325
+        $tab_couples = [];
1326
+    }
1327
+    $fields = $desc['field'] ?? [];
1328
+
1329
+    $cles = '(' . join(',', array_keys(reset($tab_couples))) . ')';
1330
+    $valeurs = [];
1331
+    $r = false;
1332
+
1333
+    // Quoter et Inserer par groupes de 100 max pour eviter un debordement de pile
1334
+    foreach ($tab_couples as $couples) {
1335
+        foreach ($couples as $champ => $val) {
1336
+            $couples[$champ] = spip_mysql_cite($val, $fields[$champ]);
1337
+        }
1338
+        $valeurs[] = '(' . join(',', $couples) . ')';
1339
+        if (count($valeurs) >= 100) {
1340
+            $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1341
+            $valeurs = [];
1342
+        }
1343
+    }
1344
+    if (count($valeurs)) {
1345
+        $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter);
1346
+    }
1347
+
1348
+    return $r; // dans le cas d'une table auto_increment, le dernier insert_id
1349 1349
 }
1350 1350
 
1351 1351
 /**
@@ -1370,19 +1370,19 @@  discard block
 block discarded – undo
1370 1370
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1371 1371
  */
1372 1372
 function spip_mysql_update($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1373
-	$set = [];
1374
-	foreach ($champs as $champ => $val) {
1375
-		$set[] = $champ . "=$val";
1376
-	}
1377
-	if (!empty($set)) {
1378
-		return spip_mysql_query(
1379
-			calculer_mysql_expression('UPDATE', $table, ',')
1380
-			. calculer_mysql_expression('SET', $set, ',')
1381
-			. calculer_mysql_expression('WHERE', $where),
1382
-			$serveur,
1383
-			$requeter
1384
-		);
1385
-	}
1373
+    $set = [];
1374
+    foreach ($champs as $champ => $val) {
1375
+        $set[] = $champ . "=$val";
1376
+    }
1377
+    if (!empty($set)) {
1378
+        return spip_mysql_query(
1379
+            calculer_mysql_expression('UPDATE', $table, ',')
1380
+            . calculer_mysql_expression('SET', $set, ',')
1381
+            . calculer_mysql_expression('WHERE', $where),
1382
+            $serveur,
1383
+            $requeter
1384
+        );
1385
+    }
1386 1386
 }
1387 1387
 
1388 1388
 /**
@@ -1415,29 +1415,29 @@  discard block
 block discarded – undo
1415 1415
  */
1416 1416
 function spip_mysql_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1417 1417
 
1418
-	if (!$champs) {
1419
-		return;
1420
-	}
1421
-	if (!$desc) {
1422
-		$desc = description_table($table, $serveur);
1423
-	}
1424
-	if (!$desc) {
1425
-		$champs = [];
1426
-	} else {
1427
-		$fields = $desc['field'];
1428
-	}
1429
-	$set = [];
1430
-	foreach ($champs as $champ => $val) {
1431
-		$set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]);
1432
-	}
1433
-
1434
-	return spip_mysql_query(
1435
-		calculer_mysql_expression('UPDATE', $table, ',')
1436
-		. calculer_mysql_expression('SET', $set, ',')
1437
-		. calculer_mysql_expression('WHERE', $where),
1438
-		$serveur,
1439
-		$requeter
1440
-	);
1418
+    if (!$champs) {
1419
+        return;
1420
+    }
1421
+    if (!$desc) {
1422
+        $desc = description_table($table, $serveur);
1423
+    }
1424
+    if (!$desc) {
1425
+        $champs = [];
1426
+    } else {
1427
+        $fields = $desc['field'];
1428
+    }
1429
+    $set = [];
1430
+    foreach ($champs as $champ => $val) {
1431
+        $set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]);
1432
+    }
1433
+
1434
+    return spip_mysql_query(
1435
+        calculer_mysql_expression('UPDATE', $table, ',')
1436
+        . calculer_mysql_expression('SET', $set, ',')
1437
+        . calculer_mysql_expression('WHERE', $where),
1438
+        $serveur,
1439
+        $requeter
1440
+    );
1441 1441
 }
1442 1442
 
1443 1443
 /**
@@ -1453,22 +1453,22 @@  discard block
 block discarded – undo
1453 1453
  *     - False en cas d'erreur.
1454 1454
  **/
1455 1455
 function spip_mysql_delete($table, $where = '', $serveur = '', $requeter = true) {
1456
-	$res = spip_mysql_query(
1457
-		calculer_mysql_expression('DELETE FROM', $table, ',')
1458
-		. calculer_mysql_expression('WHERE', $where),
1459
-		$serveur,
1460
-		$requeter
1461
-	);
1462
-	if (!$requeter) {
1463
-		return $res;
1464
-	}
1465
-	if ($res) {
1466
-		$link = _mysql_link($serveur);
1467
-
1468
-		return mysqli_affected_rows($link);
1469
-	} else {
1470
-		return false;
1471
-	}
1456
+    $res = spip_mysql_query(
1457
+        calculer_mysql_expression('DELETE FROM', $table, ',')
1458
+        . calculer_mysql_expression('WHERE', $where),
1459
+        $serveur,
1460
+        $requeter
1461
+    );
1462
+    if (!$requeter) {
1463
+        return $res;
1464
+    }
1465
+    if ($res) {
1466
+        $link = _mysql_link($serveur);
1467
+
1468
+        return mysqli_affected_rows($link);
1469
+    } else {
1470
+        return false;
1471
+    }
1472 1472
 }
1473 1473
 
1474 1474
 
@@ -1497,10 +1497,10 @@  discard block
 block discarded – undo
1497 1497
  *     - False en cas d'erreur.
1498 1498
  **/
1499 1499
 function spip_mysql_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1500
-	return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1501
-		',',
1502
-		array_map('_q', $couples)
1503
-	) . ')', $serveur, $requeter);
1500
+    return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1501
+        ',',
1502
+        array_map('_q', $couples)
1503
+    ) . ')', $serveur, $requeter);
1504 1504
 }
1505 1505
 
1506 1506
 
@@ -1529,14 +1529,14 @@  discard block
 block discarded – undo
1529 1529
  *     - False en cas d'erreur.
1530 1530
  **/
1531 1531
 function spip_mysql_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1532
-	$cles = '(' . join(',', array_keys($tab_couples[0])) . ')';
1533
-	$valeurs = [];
1534
-	foreach ($tab_couples as $couples) {
1535
-		$valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')';
1536
-	}
1537
-	$valeurs = implode(', ', $valeurs);
1538
-
1539
-	return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
1532
+    $cles = '(' . join(',', array_keys($tab_couples[0])) . ')';
1533
+    $valeurs = [];
1534
+    foreach ($tab_couples as $couples) {
1535
+        $valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')';
1536
+    }
1537
+    $valeurs = implode(', ', $valeurs);
1538
+
1539
+    return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
1540 1540
 }
1541 1541
 
1542 1542
 
@@ -1551,32 +1551,32 @@  discard block
 block discarded – undo
1551 1551
  * @return string       Texte de sélection pour la requête
1552 1552
  */
1553 1553
 function spip_mysql_multi($objet, $lang) {
1554
-	$lengthlang = strlen("[$lang]");
1555
-	$posmulti = 'INSTR(' . $objet . ", '<multi>')";
1556
-	$posfinmulti = 'INSTR(' . $objet . ", '</multi>')";
1557
-	$debutchaine = 'LEFT(' . $objet . ", $posmulti-1)";
1558
-	$finchaine = 'RIGHT(' . $objet . ', CHAR_LENGTH(' . $objet . ") -(7+$posfinmulti))";
1559
-	$chainemulti = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1560
-	$poslang = "INSTR($chainemulti,'[" . $lang . "]')";
1561
-	$poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
1562
-	$chainelang = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1563
-	$posfinlang = 'INSTR(' . $chainelang . ", '[')";
1564
-	$chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
1565
-	//$chainelang = "LEFT($chainelang,$posfinlang-1)";
1566
-	$retour = "(TRIM(IF($posmulti = 0 , " .
1567
-		'     TRIM(' . $objet . '), ' .
1568
-		'     CONCAT( ' .
1569
-		"          $debutchaine, " .
1570
-		'          IF( ' .
1571
-		"               $poslang = 0, " .
1572
-		"                     $chainemulti, " .
1573
-		"               $chainelang" .
1574
-		'          ), ' .
1575
-		"          $finchaine" .
1576
-		'     ) ' .
1577
-		'))) AS multi';
1578
-
1579
-	return $retour;
1554
+    $lengthlang = strlen("[$lang]");
1555
+    $posmulti = 'INSTR(' . $objet . ", '<multi>')";
1556
+    $posfinmulti = 'INSTR(' . $objet . ", '</multi>')";
1557
+    $debutchaine = 'LEFT(' . $objet . ", $posmulti-1)";
1558
+    $finchaine = 'RIGHT(' . $objet . ', CHAR_LENGTH(' . $objet . ") -(7+$posfinmulti))";
1559
+    $chainemulti = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))";
1560
+    $poslang = "INSTR($chainemulti,'[" . $lang . "]')";
1561
+    $poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)";
1562
+    $chainelang = 'TRIM(SUBSTRING(' . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))";
1563
+    $posfinlang = 'INSTR(' . $chainelang . ", '[')";
1564
+    $chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)";
1565
+    //$chainelang = "LEFT($chainelang,$posfinlang-1)";
1566
+    $retour = "(TRIM(IF($posmulti = 0 , " .
1567
+        '     TRIM(' . $objet . '), ' .
1568
+        '     CONCAT( ' .
1569
+        "          $debutchaine, " .
1570
+        '          IF( ' .
1571
+        "               $poslang = 0, " .
1572
+        "                     $chainemulti, " .
1573
+        "               $chainelang" .
1574
+        '          ), ' .
1575
+        "          $finchaine" .
1576
+        '     ) ' .
1577
+        '))) AS multi';
1578
+
1579
+    return $retour;
1580 1580
 }
1581 1581
 
1582 1582
 /**
@@ -1590,7 +1590,7 @@  discard block
 block discarded – undo
1590 1590
  *     Valeur hexadécimale pour MySQL
1591 1591
  **/
1592 1592
 function spip_mysql_hex($v) {
1593
-	return '0x' . $v;
1593
+    return '0x' . $v;
1594 1594
 }
1595 1595
 
1596 1596
 /**
@@ -1606,15 +1606,15 @@  discard block
 block discarded – undo
1606 1606
  *    Donnée prête à être utilisée par le gestionnaire SQL
1607 1607
  */
1608 1608
 function spip_mysql_quote($v, $type = '') {
1609
-	if (!is_array($v)) {
1610
-		return spip_mysql_cite($v, $type);
1611
-	}
1612
-
1613
-	// si c'est un tableau, le parcourir en propageant le type
1614
-	foreach ($v as $k => $r) {
1615
-		$v[$k] = spip_mysql_quote($r, $type);
1616
-	}
1617
-	return implode(',', $v);
1609
+    if (!is_array($v)) {
1610
+        return spip_mysql_cite($v, $type);
1611
+    }
1612
+
1613
+    // si c'est un tableau, le parcourir en propageant le type
1614
+    foreach ($v as $k => $r) {
1615
+        $v[$k] = spip_mysql_quote($r, $type);
1616
+    }
1617
+    return implode(',', $v);
1618 1618
 }
1619 1619
 
1620 1620
 /**
@@ -1630,18 +1630,18 @@  discard block
 block discarded – undo
1630 1630
  *     Expression SQL
1631 1631
  **/
1632 1632
 function spip_mysql_date_proche($champ, $interval, $unite) {
1633
-	$use_now = ( ($champ === 'maj' or strpos($champ, '.maj')) ? true : false );
1634
-	return '('
1635
-	. $champ
1636
-	. (($interval <= 0) ? '>' : '<')
1637
-	. (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1638
-	. '('
1639
-	. ($use_now ? 'NOW()' : sql_quote(date('Y-m-d H:i:s')))
1640
-	. ', INTERVAL '
1641
-	. (($interval > 0) ? $interval : (0 - $interval))
1642
-	. ' '
1643
-	. $unite
1644
-	. '))';
1633
+    $use_now = ( ($champ === 'maj' or strpos($champ, '.maj')) ? true : false );
1634
+    return '('
1635
+    . $champ
1636
+    . (($interval <= 0) ? '>' : '<')
1637
+    . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD')
1638
+    . '('
1639
+    . ($use_now ? 'NOW()' : sql_quote(date('Y-m-d H:i:s')))
1640
+    . ', INTERVAL '
1641
+    . (($interval > 0) ? $interval : (0 - $interval))
1642
+    . ' '
1643
+    . $unite
1644
+    . '))';
1645 1645
 }
1646 1646
 
1647 1647
 
@@ -1665,7 +1665,7 @@  discard block
 block discarded – undo
1665 1665
  *     Expression de requête SQL
1666 1666
  **/
1667 1667
 function spip_mysql_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1668
-	return "($val $not IN ($valeurs))";
1668
+    return "($val $not IN ($valeurs))";
1669 1669
 }
1670 1670
 
1671 1671
 
@@ -1677,39 +1677,39 @@  discard block
 block discarded – undo
1677 1677
  * @return string|number     Texte ou nombre échappé
1678 1678
  */
1679 1679
 function spip_mysql_cite($v, $type) {
1680
-	if (!$type) {
1681
-		if (is_bool($v)) {
1682
-			return strval(intval($v));
1683
-		} elseif (is_numeric($v)) {
1684
-			return strval($v);
1685
-		} elseif ($v === null) {
1686
-			return "''";
1687
-		}
1688
-		return "'" . addslashes($v) . "'";
1689
-	}
1690
-
1691
-	if ($v === null) {
1692
-		if (stripos($type, 'NOT NULL') === false) {
1693
-			// null php se traduit en NULL SQL
1694
-			return 'NULL';
1695
-		} else {
1696
-			return "''";
1697
-		}
1698
-	} elseif (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
1699
-		return $v;
1700
-	} elseif (sql_test_int($type)) {
1701
-		if (
1702
-			is_numeric($v) 
1703
-			or ($v and ctype_xdigit(substr($v, 2)) and $v[0] === '0' and $v[1] === 'x')
1704
-		) {
1705
-			return $v;
1706
-		} else {
1707
-			// si pas numerique, forcer le intval
1708
-			return intval($v);
1709
-		}
1710
-	}
1711
-
1712
-	return ("'" . addslashes($v) . "'");
1680
+    if (!$type) {
1681
+        if (is_bool($v)) {
1682
+            return strval(intval($v));
1683
+        } elseif (is_numeric($v)) {
1684
+            return strval($v);
1685
+        } elseif ($v === null) {
1686
+            return "''";
1687
+        }
1688
+        return "'" . addslashes($v) . "'";
1689
+    }
1690
+
1691
+    if ($v === null) {
1692
+        if (stripos($type, 'NOT NULL') === false) {
1693
+            // null php se traduit en NULL SQL
1694
+            return 'NULL';
1695
+        } else {
1696
+            return "''";
1697
+        }
1698
+    } elseif (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
1699
+        return $v;
1700
+    } elseif (sql_test_int($type)) {
1701
+        if (
1702
+            is_numeric($v) 
1703
+            or ($v and ctype_xdigit(substr($v, 2)) and $v[0] === '0' and $v[1] === 'x')
1704
+        ) {
1705
+            return $v;
1706
+        } else {
1707
+            // si pas numerique, forcer le intval
1708
+            return intval($v);
1709
+        }
1710
+    }
1711
+
1712
+    return ("'" . addslashes($v) . "'");
1713 1713
 }
1714 1714
 
1715 1715
 /**
@@ -1719,7 +1719,7 @@  discard block
 block discarded – undo
1719 1719
  *     True si on a les fonctions, false sinon
1720 1720
  */
1721 1721
 function spip_versions_mysql() {
1722
-	return function_exists('mysqli_query');
1722
+    return function_exists('mysqli_query');
1723 1723
 }
1724 1724
 
1725 1725
 
@@ -1732,20 +1732,20 @@  discard block
 block discarded – undo
1732 1732
  *     - chaîne : code compilé pour le faire désactiver par SPIP sinon
1733 1733
  */
1734 1734
 function test_rappel_nom_base_mysql($server_db) {
1735
-	$GLOBALS['mysql_rappel_nom_base'] = true;
1736
-	sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1737
-	$ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db);
1735
+    $GLOBALS['mysql_rappel_nom_base'] = true;
1736
+    sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1737
+    $ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db);
1738 1738
 
1739
-	if ($ok) {
1740
-		sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1739
+    if ($ok) {
1740
+        sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db);
1741 1741
 
1742
-		return '';
1743
-	} else {
1744
-		$GLOBALS['mysql_rappel_nom_base'] = false;
1742
+        return '';
1743
+    } else {
1744
+        $GLOBALS['mysql_rappel_nom_base'] = false;
1745 1745
 
1746
-		return "\$GLOBALS['mysql_rappel_nom_base'] = false; " .
1747
-		"/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
1748
-	}
1746
+        return "\$GLOBALS['mysql_rappel_nom_base'] = false; " .
1747
+        "/* echec de test_rappel_nom_base_mysql a l'installation. */\n";
1748
+    }
1749 1749
 }
1750 1750
 
1751 1751
 /**
@@ -1759,13 +1759,13 @@  discard block
 block discarded – undo
1759 1759
  *     - chaîne : code compilé pour l'indiquer le résultat du test à SPIP
1760 1760
  */
1761 1761
 function test_sql_mode_mysql($server_db) {
1762
-	$res = sql_select('version() as v', '', '', '', '', '', '', $server_db);
1763
-	$row = sql_fetch($res, $server_db);
1764
-	if (version_compare($row['v'], '5.0.0', '>=')) {
1765
-		defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE', true);
1762
+    $res = sql_select('version() as v', '', '', '', '', '', '', $server_db);
1763
+    $row = sql_fetch($res, $server_db);
1764
+    if (version_compare($row['v'], '5.0.0', '>=')) {
1765
+        defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE', true);
1766 1766
 
1767
-		return "defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);\n";
1768
-	}
1767
+        return "defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);\n";
1768
+    }
1769 1769
 
1770
-	return '';
1770
+    return '';
1771 1771
 }
Please login to merge, or discard this patch.
ecrire/req/sqlite_generique.php 1 patch
Indentation   +1999 added lines, -1999 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 = [];
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 (['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 = [];
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 (['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 = [
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 [
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 = [
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 [
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,251 +182,251 @@  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 = [];
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 = [];
223
-	foreach ($todo2 as $do) {
224
-		$do = trim($do);
225
-		if (
226
-			!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
227
-			. '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
228
-			. '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
229
-			. '|ADD COLUMN|ADD'
230
-			. ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
231
-		) {
232
-			spip_log(
233
-				"SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
234
-				'sqlite.' . _LOG_ERREUR
235
-			);
236
-
237
-			return false;
238
-		}
239
-
240
-		$cle = strtoupper($matches[1]);
241
-		$colonne_origine = $matches[2];
242
-		$colonne_destination = '';
243
-
244
-		$def = $matches[3];
245
-
246
-		// eluder une eventuelle clause before|after|first inutilisable
247
-		$defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
248
-		$defo = $defr; // garder la def d'origine pour certains cas
249
-		// remplacer les definitions venant de mysql
250
-		$defr = _sqlite_remplacements_definitions_table($defr);
251
-
252
-		// reinjecter dans le do
253
-		$do = str_replace($def, $defr, $do);
254
-		$def = $defr;
255
-
256
-		switch ($cle) {
257
-			// suppression d'un index
258
-			case 'DROP KEY':
259
-			case 'DROP INDEX':
260
-				$nom_index = $colonne_origine;
261
-				spip_sqlite_drop_index($nom_index, $table, $serveur);
262
-				break;
263
-
264
-			// suppression d'une pk
265
-			case 'DROP PRIMARY KEY':
266
-				if (
267
-					!_sqlite_modifier_table(
268
-						$table,
269
-						$colonne_origine,
270
-						['key' => ['PRIMARY KEY' => '']],
271
-						$serveur
272
-					)
273
-				) {
274
-					return false;
275
-				}
276
-				break;
277
-			// suppression d'une colonne
278
-			case 'DROP COLUMN':
279
-			case 'DROP':
280
-				if (
281
-					!_sqlite_modifier_table(
282
-						$table,
283
-						[$colonne_origine => ''],
284
-						[],
285
-						$serveur
286
-					)
287
-				) {
288
-					return false;
289
-				}
290
-				break;
291
-
292
-			case 'CHANGE COLUMN':
293
-			case 'CHANGE':
294
-				// recuperer le nom de la future colonne
295
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
296
-				// en tenant compte de la cle primaire (ce qui est mieux)
297
-				$def = trim($defo);
298
-				$colonne_destination = substr($def, 0, strpos($def, ' '));
299
-				$def = substr($def, strlen($colonne_destination) + 1);
300
-
301
-				if (
302
-					!_sqlite_modifier_table(
303
-						$table,
304
-						[$colonne_origine => $colonne_destination],
305
-						['field' => [$colonne_destination => $def]],
306
-						$serveur
307
-					)
308
-				) {
309
-					return false;
310
-				}
311
-				break;
312
-
313
-			case 'MODIFY':
314
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
315
-				// en tenant compte de la cle primaire (ce qui est mieux)
316
-				if (
317
-					!_sqlite_modifier_table(
318
-						$table,
319
-						$colonne_origine,
320
-						['field' => [$colonne_origine => $defo]],
321
-						$serveur
322
-					)
323
-				) {
324
-					return false;
325
-				}
326
-				break;
327
-
328
-			// pas geres en sqlite2
329
-			case 'RENAME':
330
-				$do = 'RENAME TO' . substr($do, 6);
331
-			case 'RENAME TO':
332
-				if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
333
-					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
334
-
335
-					return false;
336
-				}
337
-				break;
338
-
339
-			// ajout d'une pk
340
-			case 'ADD PRIMARY KEY':
341
-				$pk = trim(substr($do, 16));
342
-				$pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
343
-				if (
344
-					!_sqlite_modifier_table(
345
-						$table,
346
-						$colonne_origine,
347
-						['key' => ['PRIMARY KEY' => $pk]],
348
-						$serveur
349
-					)
350
-				) {
351
-					return false;
352
-				}
353
-				break;
354
-			// ajout d'un index
355
-			case 'ADD UNIQUE KEY':
356
-			case 'ADD UNIQUE':
357
-				$unique = true;
358
-			case 'ADD INDEX':
359
-			case 'ADD KEY':
360
-				if (!isset($unique)) {
361
-					$unique = false;
362
-				}
363
-				// peut etre "(colonne)" ou "nom_index (colonnes)"
364
-				// bug potentiel si qqn met "(colonne, colonne)"
365
-				//
366
-				// nom_index (colonnes)
367
-				if ($def) {
368
-					$colonnes = substr($def, 1, -1);
369
-					$nom_index = $colonne_origine;
370
-				} else {
371
-					// (colonne)
372
-					if ($colonne_origine[0] == '(') {
373
-						$colonnes = substr($colonne_origine, 1, -1);
374
-						if (false !== strpos(',', $colonnes)) {
375
-							spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
376
-								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
377
-							break;
378
-						} else {
379
-							$nom_index = $colonnes;
380
-						}
381
-					} // nom_index
382
-					else {
383
-						$nom_index = $colonnes = $colonne_origine;
384
-					}
385
-				}
386
-				spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
387
-				break;
388
-
389
-			// pas geres en sqlite2
390
-			case 'ADD COLUMN':
391
-				$do = 'ADD' . substr($do, 10);
392
-			case 'ADD':
393
-			default:
394
-				if (!preg_match(',primary\s+key,i', $do)) {
395
-					if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
396
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
397
-
398
-						return false;
399
-					}
400
-					break;
401
-				}
402
-				// ou si la colonne est aussi primary key
403
-				// cas du add id_truc int primary key
404
-				// ajout d'une colonne qui passe en primary key directe
405
-				else {
406
-					$def = trim(substr($do, 3));
407
-					$colonne_ajoutee = substr($def, 0, strpos($def, ' '));
408
-					$def = substr($def, strlen($colonne_ajoutee) + 1);
409
-					$opts = [];
410
-					if (preg_match(',primary\s+key,i', $def)) {
411
-						$opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
412
-						$def = preg_replace(',primary\s+key,i', '', $def);
413
-					}
414
-					$opts['field'] = [$colonne_ajoutee => $def];
415
-					if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
416
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
417
-
418
-						return false;
419
-					}
420
-				}
421
-				break;
422
-		}
423
-		// tout est bon, ouf !
424
-		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
425
-	}
426
-
427
-	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
428
-
429
-	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 = [];
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 = [];
223
+    foreach ($todo2 as $do) {
224
+        $do = trim($do);
225
+        if (
226
+            !preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
227
+            . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
228
+            . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
229
+            . '|ADD COLUMN|ADD'
230
+            . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
231
+        ) {
232
+            spip_log(
233
+                "SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
234
+                'sqlite.' . _LOG_ERREUR
235
+            );
236
+
237
+            return false;
238
+        }
239
+
240
+        $cle = strtoupper($matches[1]);
241
+        $colonne_origine = $matches[2];
242
+        $colonne_destination = '';
243
+
244
+        $def = $matches[3];
245
+
246
+        // eluder une eventuelle clause before|after|first inutilisable
247
+        $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
248
+        $defo = $defr; // garder la def d'origine pour certains cas
249
+        // remplacer les definitions venant de mysql
250
+        $defr = _sqlite_remplacements_definitions_table($defr);
251
+
252
+        // reinjecter dans le do
253
+        $do = str_replace($def, $defr, $do);
254
+        $def = $defr;
255
+
256
+        switch ($cle) {
257
+            // suppression d'un index
258
+            case 'DROP KEY':
259
+            case 'DROP INDEX':
260
+                $nom_index = $colonne_origine;
261
+                spip_sqlite_drop_index($nom_index, $table, $serveur);
262
+                break;
263
+
264
+            // suppression d'une pk
265
+            case 'DROP PRIMARY KEY':
266
+                if (
267
+                    !_sqlite_modifier_table(
268
+                        $table,
269
+                        $colonne_origine,
270
+                        ['key' => ['PRIMARY KEY' => '']],
271
+                        $serveur
272
+                    )
273
+                ) {
274
+                    return false;
275
+                }
276
+                break;
277
+            // suppression d'une colonne
278
+            case 'DROP COLUMN':
279
+            case 'DROP':
280
+                if (
281
+                    !_sqlite_modifier_table(
282
+                        $table,
283
+                        [$colonne_origine => ''],
284
+                        [],
285
+                        $serveur
286
+                    )
287
+                ) {
288
+                    return false;
289
+                }
290
+                break;
291
+
292
+            case 'CHANGE COLUMN':
293
+            case 'CHANGE':
294
+                // recuperer le nom de la future colonne
295
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
296
+                // en tenant compte de la cle primaire (ce qui est mieux)
297
+                $def = trim($defo);
298
+                $colonne_destination = substr($def, 0, strpos($def, ' '));
299
+                $def = substr($def, strlen($colonne_destination) + 1);
300
+
301
+                if (
302
+                    !_sqlite_modifier_table(
303
+                        $table,
304
+                        [$colonne_origine => $colonne_destination],
305
+                        ['field' => [$colonne_destination => $def]],
306
+                        $serveur
307
+                    )
308
+                ) {
309
+                    return false;
310
+                }
311
+                break;
312
+
313
+            case 'MODIFY':
314
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
315
+                // en tenant compte de la cle primaire (ce qui est mieux)
316
+                if (
317
+                    !_sqlite_modifier_table(
318
+                        $table,
319
+                        $colonne_origine,
320
+                        ['field' => [$colonne_origine => $defo]],
321
+                        $serveur
322
+                    )
323
+                ) {
324
+                    return false;
325
+                }
326
+                break;
327
+
328
+            // pas geres en sqlite2
329
+            case 'RENAME':
330
+                $do = 'RENAME TO' . substr($do, 6);
331
+            case 'RENAME TO':
332
+                if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
333
+                    spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
334
+
335
+                    return false;
336
+                }
337
+                break;
338
+
339
+            // ajout d'une pk
340
+            case 'ADD PRIMARY KEY':
341
+                $pk = trim(substr($do, 16));
342
+                $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
343
+                if (
344
+                    !_sqlite_modifier_table(
345
+                        $table,
346
+                        $colonne_origine,
347
+                        ['key' => ['PRIMARY KEY' => $pk]],
348
+                        $serveur
349
+                    )
350
+                ) {
351
+                    return false;
352
+                }
353
+                break;
354
+            // ajout d'un index
355
+            case 'ADD UNIQUE KEY':
356
+            case 'ADD UNIQUE':
357
+                $unique = true;
358
+            case 'ADD INDEX':
359
+            case 'ADD KEY':
360
+                if (!isset($unique)) {
361
+                    $unique = false;
362
+                }
363
+                // peut etre "(colonne)" ou "nom_index (colonnes)"
364
+                // bug potentiel si qqn met "(colonne, colonne)"
365
+                //
366
+                // nom_index (colonnes)
367
+                if ($def) {
368
+                    $colonnes = substr($def, 1, -1);
369
+                    $nom_index = $colonne_origine;
370
+                } else {
371
+                    // (colonne)
372
+                    if ($colonne_origine[0] == '(') {
373
+                        $colonnes = substr($colonne_origine, 1, -1);
374
+                        if (false !== strpos(',', $colonnes)) {
375
+                            spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
376
+                                . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
377
+                            break;
378
+                        } else {
379
+                            $nom_index = $colonnes;
380
+                        }
381
+                    } // nom_index
382
+                    else {
383
+                        $nom_index = $colonnes = $colonne_origine;
384
+                    }
385
+                }
386
+                spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
387
+                break;
388
+
389
+            // pas geres en sqlite2
390
+            case 'ADD COLUMN':
391
+                $do = 'ADD' . substr($do, 10);
392
+            case 'ADD':
393
+            default:
394
+                if (!preg_match(',primary\s+key,i', $do)) {
395
+                    if (!spip_sqlite::executer_requete("$debut $do", $serveur)) {
396
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
397
+
398
+                        return false;
399
+                    }
400
+                    break;
401
+                }
402
+                // ou si la colonne est aussi primary key
403
+                // cas du add id_truc int primary key
404
+                // ajout d'une colonne qui passe en primary key directe
405
+                else {
406
+                    $def = trim(substr($do, 3));
407
+                    $colonne_ajoutee = substr($def, 0, strpos($def, ' '));
408
+                    $def = substr($def, strlen($colonne_ajoutee) + 1);
409
+                    $opts = [];
410
+                    if (preg_match(',primary\s+key,i', $def)) {
411
+                        $opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
412
+                        $def = preg_replace(',primary\s+key,i', '', $def);
413
+                    }
414
+                    $opts['field'] = [$colonne_ajoutee => $def];
415
+                    if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
416
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
417
+
418
+                        return false;
419
+                    }
420
+                }
421
+                break;
422
+        }
423
+        // tout est bon, ouf !
424
+        spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
425
+    }
426
+
427
+    spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
428
+
429
+    return true;
430 430
 }
431 431
 
432 432
 
@@ -449,38 +449,38 @@  discard block
 block discarded – undo
449 449
  *     - true si la requête réussie, false sinon.
450 450
  */
451 451
 function spip_sqlite_create(
452
-	$nom,
453
-	$champs,
454
-	$cles,
455
-	$autoinc = false,
456
-	$temporary = false,
457
-	$serveur = '',
458
-	$requeter = true
452
+    $nom,
453
+    $champs,
454
+    $cles,
455
+    $autoinc = false,
456
+    $temporary = false,
457
+    $serveur = '',
458
+    $requeter = true
459 459
 ) {
460
-	$query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
461
-	if (!$query) {
462
-		return false;
463
-	}
464
-	$res = spip_sqlite_query($query, $serveur, $requeter);
465
-
466
-	// SQLite ne cree pas les KEY sur les requetes CREATE TABLE
467
-	// il faut donc les faire creer ensuite
468
-	if (!$requeter) {
469
-		return $res;
470
-	}
471
-
472
-	$ok = $res ? true : false;
473
-	if ($ok) {
474
-		foreach ($cles as $k => $v) {
475
-			if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
476
-				$index = trim(substr($k, strlen($m[1])));
477
-				$unique = (strlen($m[1]) > 3);
478
-				$ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
479
-			}
480
-		}
481
-	}
482
-
483
-	return $ok ? true : false;
460
+    $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
461
+    if (!$query) {
462
+        return false;
463
+    }
464
+    $res = spip_sqlite_query($query, $serveur, $requeter);
465
+
466
+    // SQLite ne cree pas les KEY sur les requetes CREATE TABLE
467
+    // il faut donc les faire creer ensuite
468
+    if (!$requeter) {
469
+        return $res;
470
+    }
471
+
472
+    $ok = $res ? true : false;
473
+    if ($ok) {
474
+        foreach ($cles as $k => $v) {
475
+            if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
476
+                $index = trim(substr($k, strlen($m[1])));
477
+                $unique = (strlen($m[1]) > 3);
478
+                $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
479
+            }
480
+        }
481
+    }
482
+
483
+    return $ok ? true : false;
484 484
 }
485 485
 
486 486
 /**
@@ -493,21 +493,21 @@  discard block
 block discarded – undo
493 493
  * @return bool true si la base est créee.
494 494
  **/
495 495
 function spip_sqlite_create_base($nom, $serveur = '', $option = true) {
496
-	$f = $nom . '.sqlite';
497
-	if (strpos($nom, '/') === false) {
498
-		$f = _DIR_DB . $f;
499
-	}
496
+    $f = $nom . '.sqlite';
497
+    if (strpos($nom, '/') === false) {
498
+        $f = _DIR_DB . $f;
499
+    }
500 500
 
501
-	$ok = new \PDO("sqlite:$f");
501
+    $ok = new \PDO("sqlite:$f");
502 502
 
503
-	if ($ok) {
504
-		unset($ok);
503
+    if ($ok) {
504
+        unset($ok);
505 505
 
506
-		return true;
507
-	}
508
-	unset($ok);
506
+        return true;
507
+    }
508
+    unset($ok);
509 509
 
510
-	return false;
510
+    return false;
511 511
 }
512 512
 
513 513
 
@@ -528,22 +528,22 @@  discard block
 block discarded – undo
528 528
  *     - string texte de la requête si $requeter vaut false
529 529
  */
530 530
 function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true) {
531
-	if (!$query_select) {
532
-		return false;
533
-	}
534
-	// vue deja presente
535
-	if (sql_showtable($nom, false, $serveur)) {
536
-		spip_log(
537
-			"Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
538
-			'sqlite.' . _LOG_ERREUR
539
-		);
531
+    if (!$query_select) {
532
+        return false;
533
+    }
534
+    // vue deja presente
535
+    if (sql_showtable($nom, false, $serveur)) {
536
+        spip_log(
537
+            "Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
538
+            'sqlite.' . _LOG_ERREUR
539
+        );
540 540
 
541
-		return false;
542
-	}
541
+        return false;
542
+    }
543 543
 
544
-	$query = "CREATE VIEW $nom AS " . $query_select;
544
+    $query = "CREATE VIEW $nom AS " . $query_select;
545 545
 
546
-	return spip_sqlite_query($query, $serveur, $requeter);
546
+    return spip_sqlite_query($query, $serveur, $requeter);
547 547
 }
548 548
 
549 549
 /**
@@ -565,54 +565,54 @@  discard block
 block discarded – undo
565 565
  *    string : requête, false si erreur, true sinon.
566 566
  */
567 567
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) {
568
-	if (!($nom or $table or $champs)) {
569
-		spip_log(
570
-			"Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
571
-			'sqlite.' . _LOG_ERREUR
572
-		);
573
-
574
-		return false;
575
-	}
576
-
577
-	// SQLite ne differentie pas noms des index en fonction des tables
578
-	// il faut donc creer des noms uniques d'index pour une base sqlite
579
-	$nom = $table . '_' . $nom;
580
-	// enlever d'eventuelles parentheses deja presentes sur champs
581
-	if (!is_array($champs)) {
582
-		if ($champs[0] == '(') {
583
-			$champs = substr($champs, 1, -1);
584
-		}
585
-		$champs = [$champs];
586
-		// supprimer l'info de longueur d'index mysql en fin de champ
587
-		$champs = preg_replace(',\(\d+\)$,', '', $champs);
588
-	}
589
-
590
-	$ifnotexists = '';
591
-	$version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
592
-	if (!function_exists('spip_version_compare')) {
593
-		include_spip('plugins/installer');
594
-	}
595
-
596
-	if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
597
-		$ifnotexists = ' IF NOT EXISTS';
598
-	} else {
599
-		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
600
-		$a = spip_sqlite_showtable($table, $serveur);
601
-		if (isset($a['key']['KEY ' . $nom])) {
602
-			return true;
603
-		}
604
-	}
605
-
606
-	$query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
607
-	$res = spip_sqlite_query($query, $serveur, $requeter);
608
-	if (!$requeter) {
609
-		return $res;
610
-	}
611
-	if ($res) {
612
-		return true;
613
-	} else {
614
-		return false;
615
-	}
568
+    if (!($nom or $table or $champs)) {
569
+        spip_log(
570
+            "Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
571
+            'sqlite.' . _LOG_ERREUR
572
+        );
573
+
574
+        return false;
575
+    }
576
+
577
+    // SQLite ne differentie pas noms des index en fonction des tables
578
+    // il faut donc creer des noms uniques d'index pour une base sqlite
579
+    $nom = $table . '_' . $nom;
580
+    // enlever d'eventuelles parentheses deja presentes sur champs
581
+    if (!is_array($champs)) {
582
+        if ($champs[0] == '(') {
583
+            $champs = substr($champs, 1, -1);
584
+        }
585
+        $champs = [$champs];
586
+        // supprimer l'info de longueur d'index mysql en fin de champ
587
+        $champs = preg_replace(',\(\d+\)$,', '', $champs);
588
+    }
589
+
590
+    $ifnotexists = '';
591
+    $version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
592
+    if (!function_exists('spip_version_compare')) {
593
+        include_spip('plugins/installer');
594
+    }
595
+
596
+    if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
597
+        $ifnotexists = ' IF NOT EXISTS';
598
+    } else {
599
+        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
600
+        $a = spip_sqlite_showtable($table, $serveur);
601
+        if (isset($a['key']['KEY ' . $nom])) {
602
+            return true;
603
+        }
604
+    }
605
+
606
+    $query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
607
+    $res = spip_sqlite_query($query, $serveur, $requeter);
608
+    if (!$requeter) {
609
+        return $res;
610
+    }
611
+    if ($res) {
612
+        return true;
613
+    } else {
614
+        return false;
615
+    }
616 616
 }
617 617
 
618 618
 /**
@@ -629,31 +629,31 @@  discard block
 block discarded – undo
629 629
  * @return int                 Nombre de lignes
630 630
  */
631 631
 function spip_sqlite_count($r, $serveur = '', $requeter = true) {
632
-	if (!$r) {
633
-		return 0;
634
-	}
635
-
636
-	// select ou autre (insert, update,...) ?
637
-	// (link,requete) a compter
638
-	if (is_array($r->spipSqliteRowCount)) {
639
-		list($link, $query) = $r->spipSqliteRowCount;
640
-		// amelioration possible a tester intensivement : pas de order by pour compter !
641
-		// $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
642
-		$query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
643
-		$l = $link->query($query);
644
-		$i = 0;
645
-		if ($l and $z = $l->fetch()) {
646
-			$i = $z['zzzzsqlitecount'];
647
-		}
648
-		$r->spipSqliteRowCount = $i;
649
-	}
650
-	if (isset($r->spipSqliteRowCount)) {
651
-		// Ce compte est faux s'il y a des limit dans la requete :(
652
-		// il retourne le nombre d'enregistrements sans le limit
653
-		return $r->spipSqliteRowCount;
654
-	} else {
655
-		return $r->rowCount();
656
-	}
632
+    if (!$r) {
633
+        return 0;
634
+    }
635
+
636
+    // select ou autre (insert, update,...) ?
637
+    // (link,requete) a compter
638
+    if (is_array($r->spipSqliteRowCount)) {
639
+        list($link, $query) = $r->spipSqliteRowCount;
640
+        // amelioration possible a tester intensivement : pas de order by pour compter !
641
+        // $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
642
+        $query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
643
+        $l = $link->query($query);
644
+        $i = 0;
645
+        if ($l and $z = $l->fetch()) {
646
+            $i = $z['zzzzsqlitecount'];
647
+        }
648
+        $r->spipSqliteRowCount = $i;
649
+    }
650
+    if (isset($r->spipSqliteRowCount)) {
651
+        // Ce compte est faux s'il y a des limit dans la requete :(
652
+        // il retourne le nombre d'enregistrements sans le limit
653
+        return $r->spipSqliteRowCount;
654
+    } else {
655
+        return $r->rowCount();
656
+    }
657 657
 }
658 658
 
659 659
 
@@ -672,30 +672,30 @@  discard block
 block discarded – undo
672 672
  *     - false si la requête a échouée
673 673
  **/
674 674
 function spip_sqlite_countsel(
675
-	$from = [],
676
-	$where = [],
677
-	$groupby = '',
678
-	$having = [],
679
-	$serveur = '',
680
-	$requeter = true
675
+    $from = [],
676
+    $where = [],
677
+    $groupby = '',
678
+    $having = [],
679
+    $serveur = '',
680
+    $requeter = true
681 681
 ) {
682
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
683
-	$r = spip_sqlite_select(
684
-		"COUNT($c)",
685
-		$from,
686
-		$where,
687
-		'',
688
-		'',
689
-		'',
690
-		$having,
691
-		$serveur,
692
-		$requeter
693
-	);
694
-	if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
-		list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
-	}
697
-
698
-	return $r;
682
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
683
+    $r = spip_sqlite_select(
684
+        "COUNT($c)",
685
+        $from,
686
+        $where,
687
+        '',
688
+        '',
689
+        '',
690
+        $having,
691
+        $serveur,
692
+        $requeter
693
+    );
694
+    if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
695
+        list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
696
+    }
697
+
698
+    return $r;
699 699
 }
700 700
 
701 701
 
@@ -712,24 +712,24 @@  discard block
 block discarded – undo
712 712
  *     - False en cas d'erreur.
713 713
  **/
714 714
 function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true) {
715
-	$res = spip_sqlite_query(
716
-		_sqlite_calculer_expression('DELETE FROM', $table, ',')
717
-		. _sqlite_calculer_expression('WHERE', $where),
718
-		$serveur,
719
-		$requeter
720
-	);
715
+    $res = spip_sqlite_query(
716
+        _sqlite_calculer_expression('DELETE FROM', $table, ',')
717
+        . _sqlite_calculer_expression('WHERE', $where),
718
+        $serveur,
719
+        $requeter
720
+    );
721 721
 
722
-	// renvoyer la requete inerte si demandee
723
-	if (!$requeter) {
724
-		return $res;
725
-	}
722
+    // renvoyer la requete inerte si demandee
723
+    if (!$requeter) {
724
+        return $res;
725
+    }
726 726
 
727
-	if ($res) {
728
-		$link = _sqlite_link($serveur);
729
-		return $res->rowCount();
730
-	} else {
731
-		return false;
732
-	}
727
+    if ($res) {
728
+        $link = _sqlite_link($serveur);
729
+        return $res->rowCount();
730
+    } else {
731
+        return false;
732
+    }
733 733
 }
734 734
 
735 735
 
@@ -745,15 +745,15 @@  discard block
 block discarded – undo
745 745
  *     - true si la requête a réussie, false sinon
746 746
  */
747 747
 function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true) {
748
-	if ($exist) {
749
-		$exist = ' IF EXISTS';
750
-	}
748
+    if ($exist) {
749
+        $exist = ' IF EXISTS';
750
+    }
751 751
 
752
-	if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
753
-		return true;
754
-	} else {
755
-		return false;
756
-	}
752
+    if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
753
+        return true;
754
+    } else {
755
+        return false;
756
+    }
757 757
 }
758 758
 
759 759
 
@@ -769,11 +769,11 @@  discard block
 block discarded – undo
769 769
  *     - true si la requête a réussie, false sinon
770 770
  */
771 771
 function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true) {
772
-	if ($exist) {
773
-		$exist = ' IF EXISTS';
774
-	}
772
+    if ($exist) {
773
+        $exist = ' IF EXISTS';
774
+    }
775 775
 
776
-	return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
776
+    return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
777 777
 }
778 778
 
779 779
 /**
@@ -787,20 +787,20 @@  discard block
 block discarded – undo
787 787
  * @return bool ou requete
788 788
  */
789 789
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true) {
790
-	if (!($nom or $table)) {
791
-		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
790
+    if (!($nom or $table)) {
791
+        spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
792 792
 
793
-		return false;
794
-	}
793
+        return false;
794
+    }
795 795
 
796
-	// SQLite ne differentie pas noms des index en fonction des tables
797
-	// il faut donc creer des noms uniques d'index pour une base sqlite
798
-	$index = $table . '_' . $nom;
799
-	$exist = ' IF EXISTS';
796
+    // SQLite ne differentie pas noms des index en fonction des tables
797
+    // il faut donc creer des noms uniques d'index pour une base sqlite
798
+    $index = $table . '_' . $nom;
799
+    $exist = ' IF EXISTS';
800 800
 
801
-	$query = "DROP INDEX$exist $index";
801
+    $query = "DROP INDEX$exist $index";
802 802
 
803
-	return spip_sqlite_query($query, $serveur, $requeter);
803
+    return spip_sqlite_query($query, $serveur, $requeter);
804 804
 }
805 805
 
806 806
 /**
@@ -816,28 +816,28 @@  discard block
 block discarded – undo
816 816
  *     Erreur eventuelle
817 817
  **/
818 818
 function spip_sqlite_error($query = '', $serveur = '') {
819
-	$link = _sqlite_link($serveur);
819
+    $link = _sqlite_link($serveur);
820 820
 
821
-	if ($link) {
822
-		$errs = $link->errorInfo();
823
-		$s = _sqlite_last_error_from_link($link);
824
-	} else {
825
-		$s = ': aucune ressource sqlite (link)';
826
-	}
827
-	if ($s) {
828
-		$trace = debug_backtrace();
829
-		if ($trace[0]['function'] != 'spip_sqlite_error') {
830
-			spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
831
-		}
832
-	}
821
+    if ($link) {
822
+        $errs = $link->errorInfo();
823
+        $s = _sqlite_last_error_from_link($link);
824
+    } else {
825
+        $s = ': aucune ressource sqlite (link)';
826
+    }
827
+    if ($s) {
828
+        $trace = debug_backtrace();
829
+        if ($trace[0]['function'] != 'spip_sqlite_error') {
830
+            spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
831
+        }
832
+    }
833 833
 
834
-	return $s;
834
+    return $s;
835 835
 }
836 836
 
837 837
 function _sqlite_last_error_from_link($link) {
838
-	if ($link) {
839
-		$errs = $link->errorInfo();
840
-		/*
838
+    if ($link) {
839
+        $errs = $link->errorInfo();
840
+        /*
841 841
 			$errs[0]
842 842
 				numero SQLState ('HY000' souvent lors d'une erreur)
843 843
 				http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html
@@ -847,11 +847,11 @@  discard block
 block discarded – undo
847 847
 			$errs[2]
848 848
 				Le texte du message d'erreur
849 849
 		*/
850
-		if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
851
-			return "$errs[2]";
852
-		}
853
-	}
854
-	return '';
850
+        if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
851
+            return "$errs[2]";
852
+        }
853
+    }
854
+    return '';
855 855
 }
856 856
 
857 857
 /**
@@ -868,23 +868,23 @@  discard block
 block discarded – undo
868 868
  *    'HY000/1' : numéro de l'erreur SQLState / numéro d'erreur interne SQLite (en sqlite 3)
869 869
  **/
870 870
 function spip_sqlite_errno($serveur = '') {
871
-	$link = _sqlite_link($serveur);
871
+    $link = _sqlite_link($serveur);
872 872
 
873
-	if ($link) {
874
-		$t = $link->errorInfo();
875
-		$s = ltrim($t[0], '0'); // 00000 si pas d'erreur
876
-		if ($s) {
877
-			$s .= ' / ' . $t[1];
878
-		} // ajoute l'erreur du moteur SQLite
879
-	} else {
880
-		$s = ': aucune ressource sqlite (link)';
881
-	}
873
+    if ($link) {
874
+        $t = $link->errorInfo();
875
+        $s = ltrim($t[0], '0'); // 00000 si pas d'erreur
876
+        if ($s) {
877
+            $s .= ' / ' . $t[1];
878
+        } // ajoute l'erreur du moteur SQLite
879
+    } else {
880
+        $s = ': aucune ressource sqlite (link)';
881
+    }
882 882
 
883
-	if ($s) {
884
-		spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
885
-	}
883
+    if ($s) {
884
+        spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
885
+    }
886 886
 
887
-	return $s ? $s : 0;
887
+    return $s ? $s : 0;
888 888
 }
889 889
 
890 890
 
@@ -900,19 +900,19 @@  discard block
 block discarded – undo
900 900
  *     - false si on a pas pu avoir d'explication
901 901
  */
902 902
 function spip_sqlite_explain($query, $serveur = '', $requeter = true) {
903
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
904
-		return [];
905
-	}
903
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
904
+        return [];
905
+    }
906 906
 
907
-	$query = spip_sqlite::traduire_requete($query, $serveur);
908
-	$query = 'EXPLAIN ' . $query;
909
-	if (!$requeter) {
910
-		return $query;
911
-	}
912
-	// on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
913
-	$r = spip_sqlite::executer_requete($query, $serveur, false);
907
+    $query = spip_sqlite::traduire_requete($query, $serveur);
908
+    $query = 'EXPLAIN ' . $query;
909
+    if (!$requeter) {
910
+        return $query;
911
+    }
912
+    // on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
913
+    $r = spip_sqlite::executer_requete($query, $serveur, false);
914 914
 
915
-	return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
915
+    return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
916 916
 }
917 917
 
918 918
 
@@ -929,30 +929,30 @@  discard block
 block discarded – undo
929 929
  */
930 930
 function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true) {
931 931
 
932
-	$link = _sqlite_link($serveur);
933
-	$t = $t ? $t : SPIP_SQLITE3_ASSOC;
932
+    $link = _sqlite_link($serveur);
933
+    $t = $t ? $t : SPIP_SQLITE3_ASSOC;
934 934
 
935
-	$retour = false;
936
-	if ($r) {
937
-		$retour = $r->fetch($t);
938
-	}
935
+    $retour = false;
936
+    if ($r) {
937
+        $retour = $r->fetch($t);
938
+    }
939 939
 
940
-	// Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
941
-	// suppression de 'table.' pour toutes les cles (c'est un peu violent !)
942
-	// c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
943
-	if (
944
-		$retour
945
-		and strpos(implode('', array_keys($retour)), '.') !== false
946
-	) {
947
-		foreach ($retour as $cle => $val) {
948
-			if (($pos = strpos($cle, '.')) !== false) {
949
-				$retour[substr($cle, $pos + 1)] = &$retour[$cle];
950
-				unset($retour[$cle]);
951
-			}
952
-		}
953
-	}
940
+    // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
941
+    // suppression de 'table.' pour toutes les cles (c'est un peu violent !)
942
+    // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
943
+    if (
944
+        $retour
945
+        and strpos(implode('', array_keys($retour)), '.') !== false
946
+    ) {
947
+        foreach ($retour as $cle => $val) {
948
+            if (($pos = strpos($cle, '.')) !== false) {
949
+                $retour[substr($cle, $pos + 1)] = &$retour[$cle];
950
+                unset($retour[$cle]);
951
+            }
952
+        }
953
+    }
954 954
 
955
-	return $retour;
955
+    return $retour;
956 956
 }
957 957
 
958 958
 /**
@@ -965,8 +965,8 @@  discard block
 block discarded – undo
965 965
  * @return bool True si déplacement réussi, false sinon.
966 966
  **/
967 967
 function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true) {
968
-	// encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
969
-	return false;
968
+    // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
969
+    return false;
970 970
 }
971 971
 
972 972
 
@@ -982,10 +982,10 @@  discard block
 block discarded – undo
982 982
  * @return bool                True si réussi
983 983
  */
984 984
 function spip_sqlite_free(&$r, $serveur = '', $requeter = true) {
985
-	unset($r);
985
+    unset($r);
986 986
 
987
-	return true;
988
-	//return sqlite_free_result($r);
987
+    return true;
988
+    //return sqlite_free_result($r);
989 989
 }
990 990
 
991 991
 
@@ -1000,8 +1000,8 @@  discard block
 block discarded – undo
1000 1000
  * @return void
1001 1001
  */
1002 1002
 function spip_sqlite_get_charset($charset = [], $serveur = '', $requeter = true) {
1003
-	//$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1004
-	//return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1003
+    //$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1004
+    //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1005 1005
 }
1006 1006
 
1007 1007
 
@@ -1016,7 +1016,7 @@  discard block
 block discarded – undo
1016 1016
  *     Valeur hexadécimale pour SQLite
1017 1017
  **/
1018 1018
 function spip_sqlite_hex($v) {
1019
-	return hexdec($v);
1019
+    return hexdec($v);
1020 1020
 }
1021 1021
 
1022 1022
 
@@ -1038,7 +1038,7 @@  discard block
 block discarded – undo
1038 1038
  *     Expression de requête SQL
1039 1039
  **/
1040 1040
 function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) {
1041
-	return "($val $not IN ($valeurs))";
1041
+    return "($val $not IN ($valeurs))";
1042 1042
 }
1043 1043
 
1044 1044
 
@@ -1066,20 +1066,20 @@  discard block
 block discarded – undo
1066 1066
  **/
1067 1067
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true) {
1068 1068
 
1069
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1070
-	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1071
-		if (!$requeter) {
1072
-			return $r;
1073
-		}
1074
-		$nb = spip_sqlite::last_insert_id($serveur);
1075
-	} else {
1076
-		$nb = false;
1077
-	}
1069
+    $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1070
+    if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1071
+        if (!$requeter) {
1072
+            return $r;
1073
+        }
1074
+        $nb = spip_sqlite::last_insert_id($serveur);
1075
+    } else {
1076
+        $nb = false;
1077
+    }
1078 1078
 
1079
-	$err = spip_sqlite_error($query, $serveur);
1079
+    $err = spip_sqlite_error($query, $serveur);
1080 1080
 
1081
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1082
-	return isset($_GET['var_profile']) ? $r : $nb;
1081
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1082
+    return isset($_GET['var_profile']) ? $r : $nb;
1083 1083
 }
1084 1084
 
1085 1085
 
@@ -1104,28 +1104,28 @@  discard block
 block discarded – undo
1104 1104
  *     - Tableau de description de la requête et du temps d'exécution, si var_profile activé
1105 1105
  **/
1106 1106
 function spip_sqlite_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true) {
1107
-	if (!$desc) {
1108
-		$desc = description_table($table, $serveur);
1109
-	}
1110
-	if (!$desc) {
1111
-		die("$table insertion sans description");
1112
-	}
1113
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1107
+    if (!$desc) {
1108
+        $desc = description_table($table, $serveur);
1109
+    }
1110
+    if (!$desc) {
1111
+        die("$table insertion sans description");
1112
+    }
1113
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1114 1114
 
1115
-	foreach ($couples as $champ => $val) {
1116
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1117
-	}
1115
+    foreach ($couples as $champ => $val) {
1116
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1117
+    }
1118 1118
 
1119
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1120
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1119
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1120
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1121 1121
 
1122
-	$cles = $valeurs = '';
1123
-	if (count($couples)) {
1124
-		$cles = '(' . join(',', array_keys($couples)) . ')';
1125
-		$valeurs = '(' . join(',', $couples) . ')';
1126
-	}
1122
+    $cles = $valeurs = '';
1123
+    if (count($couples)) {
1124
+        $cles = '(' . join(',', array_keys($couples)) . ')';
1125
+        $valeurs = '(' . join(',', $couples) . ')';
1126
+    }
1127 1127
 
1128
-	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1128
+    return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1129 1129
 }
1130 1130
 
1131 1131
 
@@ -1149,70 +1149,70 @@  discard block
 block discarded – undo
1149 1149
  *     - False en cas d'erreur.
1150 1150
  **/
1151 1151
 function spip_sqlite_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true) {
1152
-	if (!$desc) {
1153
-		$desc = description_table($table, $serveur);
1154
-	}
1155
-	if (!$desc) {
1156
-		die("$table insertion sans description");
1157
-	}
1158
-	if (!isset($desc['field'])) {
1159
-		$desc['field'] = [];
1160
-	}
1161
-
1162
-	// recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1163
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1164
-
1165
-	// seul le nom de la table est a traduire ici :
1166
-	// le faire une seule fois au debut
1167
-	$query_start = "INSERT INTO $table ";
1168
-	$query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1169
-
1170
-	// ouvrir une transaction
1171
-	if ($requeter) {
1172
-		spip_sqlite::demarrer_transaction($serveur);
1173
-	}
1174
-
1175
-	while ($couples = array_shift($tab_couples)) {
1176
-		foreach ($couples as $champ => $val) {
1177
-			$couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1178
-		}
1179
-
1180
-		// inserer les champs timestamp par defaut
1181
-		$couples = array_merge($maj, $couples);
1182
-
1183
-		$champs = $valeurs = '';
1184
-		if (count($couples)) {
1185
-			$champs = '(' . join(',', array_keys($couples)) . ')';
1186
-			$valeurs = '(' . join(',', $couples) . ')';
1187
-			$query = $query_start . "$champs VALUES $valeurs";
1188
-		} else {
1189
-			$query = $query_start . 'DEFAULT VALUES';
1190
-		}
1191
-
1192
-		if ($requeter) {
1193
-			$retour = spip_sqlite::executer_requete($query, $serveur);
1194
-		}
1195
-
1196
-		// sur le dernier couple uniquement
1197
-		if (!count($tab_couples)) {
1198
-			$nb = 0;
1199
-			if ($requeter) {
1200
-				$nb = spip_sqlite::last_insert_id($serveur);
1201
-			} else {
1202
-				return $query;
1203
-			}
1204
-		}
1205
-
1206
-		$err = spip_sqlite_error($query, $serveur);
1207
-	}
1208
-
1209
-	if ($requeter) {
1210
-		spip_sqlite::finir_transaction($serveur);
1211
-	}
1212
-
1213
-	// renvoie le dernier id d'autoincrement ajoute
1214
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1215
-	return isset($_GET['var_profile']) ? $retour : $nb;
1152
+    if (!$desc) {
1153
+        $desc = description_table($table, $serveur);
1154
+    }
1155
+    if (!$desc) {
1156
+        die("$table insertion sans description");
1157
+    }
1158
+    if (!isset($desc['field'])) {
1159
+        $desc['field'] = [];
1160
+    }
1161
+
1162
+    // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1163
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1164
+
1165
+    // seul le nom de la table est a traduire ici :
1166
+    // le faire une seule fois au debut
1167
+    $query_start = "INSERT INTO $table ";
1168
+    $query_start = spip_sqlite::traduire_requete($query_start, $serveur);
1169
+
1170
+    // ouvrir une transaction
1171
+    if ($requeter) {
1172
+        spip_sqlite::demarrer_transaction($serveur);
1173
+    }
1174
+
1175
+    while ($couples = array_shift($tab_couples)) {
1176
+        foreach ($couples as $champ => $val) {
1177
+            $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1178
+        }
1179
+
1180
+        // inserer les champs timestamp par defaut
1181
+        $couples = array_merge($maj, $couples);
1182
+
1183
+        $champs = $valeurs = '';
1184
+        if (count($couples)) {
1185
+            $champs = '(' . join(',', array_keys($couples)) . ')';
1186
+            $valeurs = '(' . join(',', $couples) . ')';
1187
+            $query = $query_start . "$champs VALUES $valeurs";
1188
+        } else {
1189
+            $query = $query_start . 'DEFAULT VALUES';
1190
+        }
1191
+
1192
+        if ($requeter) {
1193
+            $retour = spip_sqlite::executer_requete($query, $serveur);
1194
+        }
1195
+
1196
+        // sur le dernier couple uniquement
1197
+        if (!count($tab_couples)) {
1198
+            $nb = 0;
1199
+            if ($requeter) {
1200
+                $nb = spip_sqlite::last_insert_id($serveur);
1201
+            } else {
1202
+                return $query;
1203
+            }
1204
+        }
1205
+
1206
+        $err = spip_sqlite_error($query, $serveur);
1207
+    }
1208
+
1209
+    if ($requeter) {
1210
+        spip_sqlite::finir_transaction($serveur);
1211
+    }
1212
+
1213
+    // renvoie le dernier id d'autoincrement ajoute
1214
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1215
+    return isset($_GET['var_profile']) ? $retour : $nb;
1216 1216
 }
1217 1217
 
1218 1218
 
@@ -1227,7 +1227,7 @@  discard block
 block discarded – undo
1227 1227
  *     Toujours true.
1228 1228
  **/
1229 1229
 function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) {
1230
-	return true;
1230
+    return true;
1231 1231
 }
1232 1232
 
1233 1233
 /**
@@ -1244,12 +1244,12 @@  discard block
 block discarded – undo
1244 1244
  *     string si texte de la requête demandé, true sinon
1245 1245
  **/
1246 1246
 function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true) {
1247
-	if (!$requeter) {
1248
-		return 'BEGIN TRANSACTION';
1249
-	}
1250
-	spip_sqlite::demarrer_transaction($serveur);
1247
+    if (!$requeter) {
1248
+        return 'BEGIN TRANSACTION';
1249
+    }
1250
+    spip_sqlite::demarrer_transaction($serveur);
1251 1251
 
1252
-	return true;
1252
+    return true;
1253 1253
 }
1254 1254
 
1255 1255
 /**
@@ -1263,12 +1263,12 @@  discard block
 block discarded – undo
1263 1263
  *     string si texte de la requête demandé, true sinon
1264 1264
  **/
1265 1265
 function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) {
1266
-	if (!$requeter) {
1267
-		return 'COMMIT';
1268
-	}
1269
-	spip_sqlite::finir_transaction($serveur);
1266
+    if (!$requeter) {
1267
+        return 'COMMIT';
1268
+    }
1269
+    spip_sqlite::finir_transaction($serveur);
1270 1270
 
1271
-	return true;
1271
+    return true;
1272 1272
 }
1273 1273
 
1274 1274
 
@@ -1283,27 +1283,27 @@  discard block
 block discarded – undo
1283 1283
  *     Liste des noms de bases
1284 1284
  **/
1285 1285
 function spip_sqlite_listdbs($serveur = '', $requeter = true) {
1286
-	_sqlite_init();
1286
+    _sqlite_init();
1287 1287
 
1288
-	if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1289
-		return [];
1290
-	}
1288
+    if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1289
+        return [];
1290
+    }
1291 1291
 
1292
-	include_spip('inc/flock');
1293
-	$bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1294
-	$bds = [];
1292
+    include_spip('inc/flock');
1293
+    $bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1294
+    $bds = [];
1295 1295
 
1296
-	foreach ($bases as $b) {
1297
-		// pas de bases commencant pas sqlite
1298
-		// (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1299
-		// les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1300
-		if (strpos($b, '_sqlite')) {
1301
-			continue;
1302
-		}
1303
-		$bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1304
-	}
1296
+    foreach ($bases as $b) {
1297
+        // pas de bases commencant pas sqlite
1298
+        // (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1299
+        // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1300
+        if (strpos($b, '_sqlite')) {
1301
+            continue;
1302
+        }
1303
+        $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1304
+    }
1305 1305
 
1306
-	return $bds;
1306
+    return $bds;
1307 1307
 }
1308 1308
 
1309 1309
 
@@ -1318,9 +1318,9 @@  discard block
 block discarded – undo
1318 1318
  * @return string       Texte de sélection pour la requête
1319 1319
  */
1320 1320
 function spip_sqlite_multi($objet, $lang) {
1321
-	$r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1321
+    $r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1322 1322
 
1323
-	return $r;
1323
+    return $r;
1324 1324
 }
1325 1325
 
1326 1326
 
@@ -1337,15 +1337,15 @@  discard block
 block discarded – undo
1337 1337
  * @return bool|string true / false / requete
1338 1338
  **/
1339 1339
 function spip_sqlite_optimize($table, $serveur = '', $requeter = true) {
1340
-	static $do = false;
1341
-	if ($requeter and $do) {
1342
-		return true;
1343
-	}
1344
-	if ($requeter) {
1345
-		$do = true;
1346
-	}
1340
+    static $do = false;
1341
+    if ($requeter and $do) {
1342
+        return true;
1343
+    }
1344
+    if ($requeter) {
1345
+        $do = true;
1346
+    }
1347 1347
 
1348
-	return spip_sqlite_query('VACUUM', $serveur, $requeter);
1348
+    return spip_sqlite_query('VACUUM', $serveur, $requeter);
1349 1349
 }
1350 1350
 
1351 1351
 
@@ -1362,15 +1362,15 @@  discard block
 block discarded – undo
1362 1362
  *    Donnée prête à être utilisée par le gestionnaire SQL
1363 1363
  */
1364 1364
 function spip_sqlite_quote($v, $type = '') {
1365
-	if (!is_array($v)) {
1366
-		return _sqlite_calculer_cite($v, $type);
1367
-	}
1368
-	// si c'est un tableau, le parcourir en propageant le type
1369
-	foreach ($v as $k => $r) {
1370
-		$v[$k] = spip_sqlite_quote($r, $type);
1371
-	}
1365
+    if (!is_array($v)) {
1366
+        return _sqlite_calculer_cite($v, $type);
1367
+    }
1368
+    // si c'est un tableau, le parcourir en propageant le type
1369
+    foreach ($v as $k => $r) {
1370
+        $v[$k] = spip_sqlite_quote($r, $type);
1371
+    }
1372 1372
 
1373
-	return join(',', $v);
1373
+    return join(',', $v);
1374 1374
 }
1375 1375
 
1376 1376
 
@@ -1387,9 +1387,9 @@  discard block
 block discarded – undo
1387 1387
  *     Expression SQL
1388 1388
  **/
1389 1389
 function spip_sqlite_date_proche($champ, $interval, $unite) {
1390
-	$op = (($interval <= 0) ? '>' : '<');
1390
+    $op = (($interval <= 0) ? '>' : '<');
1391 1391
 
1392
-	return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1392
+    return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1393 1393
 }
1394 1394
 
1395 1395
 
@@ -1407,48 +1407,48 @@  discard block
 block discarded – undo
1407 1407
  *     l'état de la table après la réparation
1408 1408
  */
1409 1409
 function spip_sqlite_repair($table, $serveur = '', $requeter = true) {
1410
-	if (
1411
-		$desc = spip_sqlite_showtable($table, $serveur)
1412
-		and isset($desc['field'])
1413
-		and is_array($desc['field'])
1414
-	) {
1415
-		foreach ($desc['field'] as $c => $d) {
1416
-			if (
1417
-				preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1418
-				and stripos($d, 'NOT NULL') !== false
1419
-				and stripos($d, 'DEFAULT') === false
1420
-				/* pas touche aux cles primaires */
1421
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1422
-			) {
1423
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1424
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1425
-			}
1426
-			if (
1427
-				preg_match(',^(INTEGER),i', $d)
1428
-				and stripos($d, 'NOT NULL') !== false
1429
-				and stripos($d, 'DEFAULT') === false
1430
-				/* pas touche aux cles primaires */
1431
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1432
-			) {
1433
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1434
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1435
-			}
1436
-			if (
1437
-				preg_match(',^(datetime),i', $d)
1438
-				and stripos($d, 'NOT NULL') !== false
1439
-				and stripos($d, 'DEFAULT') === false
1440
-				/* pas touche aux cles primaires */
1441
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1442
-			) {
1443
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1444
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1445
-			}
1446
-		}
1447
-
1448
-		return [' OK '];
1449
-	}
1450
-
1451
-	return [' ERROR '];
1410
+    if (
1411
+        $desc = spip_sqlite_showtable($table, $serveur)
1412
+        and isset($desc['field'])
1413
+        and is_array($desc['field'])
1414
+    ) {
1415
+        foreach ($desc['field'] as $c => $d) {
1416
+            if (
1417
+                preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1418
+                and stripos($d, 'NOT NULL') !== false
1419
+                and stripos($d, 'DEFAULT') === false
1420
+                /* pas touche aux cles primaires */
1421
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1422
+            ) {
1423
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1424
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1425
+            }
1426
+            if (
1427
+                preg_match(',^(INTEGER),i', $d)
1428
+                and stripos($d, 'NOT NULL') !== false
1429
+                and stripos($d, 'DEFAULT') === false
1430
+                /* pas touche aux cles primaires */
1431
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1432
+            ) {
1433
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1434
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1435
+            }
1436
+            if (
1437
+                preg_match(',^(datetime),i', $d)
1438
+                and stripos($d, 'NOT NULL') !== false
1439
+                and stripos($d, 'DEFAULT') === false
1440
+                /* pas touche aux cles primaires */
1441
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1442
+            ) {
1443
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1444
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1445
+            }
1446
+        }
1447
+
1448
+        return [' OK '];
1449
+    }
1450
+
1451
+    return [' ERROR '];
1452 1452
 }
1453 1453
 
1454 1454
 
@@ -1477,25 +1477,25 @@  discard block
 block discarded – undo
1477 1477
  *     - False en cas d'erreur.
1478 1478
  **/
1479 1479
 function spip_sqlite_replace($table, $couples, $desc = [], $serveur = '', $requeter = true) {
1480
-	if (!$desc) {
1481
-		$desc = description_table($table, $serveur);
1482
-	}
1483
-	if (!$desc) {
1484
-		die("$table insertion sans description");
1485
-	}
1486
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1480
+    if (!$desc) {
1481
+        $desc = description_table($table, $serveur);
1482
+    }
1483
+    if (!$desc) {
1484
+        die("$table insertion sans description");
1485
+    }
1486
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1487 1487
 
1488
-	foreach ($couples as $champ => $val) {
1489
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1490
-	}
1488
+    foreach ($couples as $champ => $val) {
1489
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1490
+    }
1491 1491
 
1492
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1493
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1492
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1493
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1494 1494
 
1495
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1496
-		',',
1497
-		$couples
1498
-	) . ')', $serveur);
1495
+    return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1496
+        ',',
1497
+        $couples
1498
+    ) . ')', $serveur);
1499 1499
 }
1500 1500
 
1501 1501
 
@@ -1525,13 +1525,13 @@  discard block
 block discarded – undo
1525 1525
  **/
1526 1526
 function spip_sqlite_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true) {
1527 1527
 
1528
-	// boucler pour trainter chaque requete independemment
1529
-	foreach ($tab_couples as $couples) {
1530
-		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1531
-	}
1528
+    // boucler pour trainter chaque requete independemment
1529
+    foreach ($tab_couples as $couples) {
1530
+        $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1531
+    }
1532 1532
 
1533
-	// renvoie le dernier id
1534
-	return $retour;
1533
+    // renvoie le dernier id
1534
+    return $retour;
1535 1535
 }
1536 1536
 
1537 1537
 
@@ -1558,44 +1558,44 @@  discard block
 block discarded – undo
1558 1558
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1559 1559
  */
1560 1560
 function spip_sqlite_select(
1561
-	$select,
1562
-	$from,
1563
-	$where = '',
1564
-	$groupby = '',
1565
-	$orderby = '',
1566
-	$limit = '',
1567
-	$having = '',
1568
-	$serveur = '',
1569
-	$requeter = true
1561
+    $select,
1562
+    $from,
1563
+    $where = '',
1564
+    $groupby = '',
1565
+    $orderby = '',
1566
+    $limit = '',
1567
+    $having = '',
1568
+    $serveur = '',
1569
+    $requeter = true
1570 1570
 ) {
1571 1571
 
1572
-	// version() n'est pas connu de sqlite
1573
-	$select = str_replace('version()', 'sqlite_version()', $select);
1572
+    // version() n'est pas connu de sqlite
1573
+    $select = str_replace('version()', 'sqlite_version()', $select);
1574 1574
 
1575
-	// recomposer from
1576
-	$from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1575
+    // recomposer from
1576
+    $from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1577 1577
 
1578
-	$query =
1579
-		_sqlite_calculer_expression('SELECT', $select, ', ')
1580
-		. _sqlite_calculer_expression('FROM', $from, ', ')
1581
-		. _sqlite_calculer_expression('WHERE', $where)
1582
-		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1583
-		. _sqlite_calculer_expression('HAVING', $having)
1584
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1585
-		. ($limit ? "\nLIMIT $limit" : '');
1578
+    $query =
1579
+        _sqlite_calculer_expression('SELECT', $select, ', ')
1580
+        . _sqlite_calculer_expression('FROM', $from, ', ')
1581
+        . _sqlite_calculer_expression('WHERE', $where)
1582
+        . _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1583
+        . _sqlite_calculer_expression('HAVING', $having)
1584
+        . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1585
+        . ($limit ? "\nLIMIT $limit" : '');
1586 1586
 
1587
-	// dans un select, on doit renvoyer la requête en cas d'erreur
1588
-	$res = spip_sqlite_query($query, $serveur, $requeter);
1589
-	// texte de la requete demande ?
1590
-	if (!$requeter) {
1591
-		return $res;
1592
-	}
1593
-	// erreur survenue ?
1594
-	if ($res === false) {
1595
-		return spip_sqlite::traduire_requete($query, $serveur);
1596
-	}
1587
+    // dans un select, on doit renvoyer la requête en cas d'erreur
1588
+    $res = spip_sqlite_query($query, $serveur, $requeter);
1589
+    // texte de la requete demande ?
1590
+    if (!$requeter) {
1591
+        return $res;
1592
+    }
1593
+    // erreur survenue ?
1594
+    if ($res === false) {
1595
+        return spip_sqlite::traduire_requete($query, $serveur);
1596
+    }
1597 1597
 
1598
-	return $res;
1598
+    return $res;
1599 1599
 }
1600 1600
 
1601 1601
 
@@ -1614,32 +1614,32 @@  discard block
 block discarded – undo
1614 1614
  *     - False en cas d'erreur.
1615 1615
  **/
1616 1616
 function spip_sqlite_selectdb($db, $serveur = '', $requeter = true) {
1617
-	_sqlite_init();
1617
+    _sqlite_init();
1618 1618
 
1619
-	// interdire la creation d'une nouvelle base,
1620
-	// sauf si on est dans l'installation
1621
-	if (
1622
-		!is_file($f = _DIR_DB . $db . '.sqlite')
1623
-		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1624
-	) {
1625
-		spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1619
+    // interdire la creation d'une nouvelle base,
1620
+    // sauf si on est dans l'installation
1621
+    if (
1622
+        !is_file($f = _DIR_DB . $db . '.sqlite')
1623
+        && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1624
+    ) {
1625
+        spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1626 1626
 
1627
-		return false;
1628
-	}
1627
+        return false;
1628
+    }
1629 1629
 
1630
-	// se connecter a la base indiquee
1631
-	// avec les identifiants connus
1632
-	$index = $serveur ? $serveur : 0;
1630
+    // se connecter a la base indiquee
1631
+    // avec les identifiants connus
1632
+    $index = $serveur ? $serveur : 0;
1633 1633
 
1634
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1635
-		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1636
-			return $db;
1637
-		}
1638
-	} else {
1639
-		spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1634
+    if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1635
+        if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1636
+            return $db;
1637
+        }
1638
+    } else {
1639
+        spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1640 1640
 
1641
-		return false;
1642
-	}
1641
+        return false;
1642
+    }
1643 1643
 }
1644 1644
 
1645 1645
 
@@ -1654,8 +1654,8 @@  discard block
 block discarded – undo
1654 1654
  * @return void
1655 1655
  */
1656 1656
 function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true) {
1657
-	# spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1658
-	# return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1657
+    # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1658
+    # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1659 1659
 }
1660 1660
 
1661 1661
 
@@ -1673,24 +1673,24 @@  discard block
 block discarded – undo
1673 1673
  *     Ressource à utiliser avec sql_fetch()
1674 1674
  **/
1675 1675
 function spip_sqlite_showbase($match, $serveur = '', $requeter = true) {
1676
-	// type est le type d'entrée : table / index / view
1677
-	// on ne retourne que les tables (?) et non les vues...
1678
-	# ESCAPE non supporte par les versions sqlite <3
1679
-	#	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1680
-	$match = preg_quote($match);
1681
-	$match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1682
-	$match = str_replace('\\\%', '[[POURCENT]]', $match);
1683
-	$match = str_replace('_', '.', $match);
1684
-	$match = str_replace('%', '.*', $match);
1685
-	$match = str_replace('[[TIRETBAS]]', '_', $match);
1686
-	$match = str_replace('[[POURCENT]]', '%', $match);
1687
-	$match = "^$match$";
1688
-
1689
-	return spip_sqlite_query(
1690
-		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1691
-		$serveur,
1692
-		$requeter
1693
-	);
1676
+    // type est le type d'entrée : table / index / view
1677
+    // on ne retourne que les tables (?) et non les vues...
1678
+    # ESCAPE non supporte par les versions sqlite <3
1679
+    #	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1680
+    $match = preg_quote($match);
1681
+    $match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1682
+    $match = str_replace('\\\%', '[[POURCENT]]', $match);
1683
+    $match = str_replace('_', '.', $match);
1684
+    $match = str_replace('%', '.*', $match);
1685
+    $match = str_replace('[[TIRETBAS]]', '_', $match);
1686
+    $match = str_replace('[[POURCENT]]', '%', $match);
1687
+    $match = "^$match$";
1688
+
1689
+    return spip_sqlite_query(
1690
+        "SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1691
+        $serveur,
1692
+        $requeter
1693
+    );
1694 1694
 }
1695 1695
 
1696 1696
 /**
@@ -1708,19 +1708,19 @@  discard block
 block discarded – undo
1708 1708
  *     - string : requete sql, si $requeter = true
1709 1709
  **/
1710 1710
 function spip_sqlite_table_exists(string $table, $serveur = '', $requeter = true) {
1711
-	$r = spip_sqlite_query(
1712
-		'SELECT name FROM sqlite_master WHERE'
1713
-		. ' type=\'table\''
1714
-		. ' AND name=' . spip_sqlite_quote($table, 'string')
1715
-		. ' AND name NOT LIKE \'sqlite_%\'',
1716
-		$serveur,
1717
-		$requeter
1718
-	);
1719
-	if (!$requeter) {
1720
-		return $r;
1721
-	}
1722
-	$res = spip_sqlite_fetch($r);
1723
-	return (bool) $res;
1711
+    $r = spip_sqlite_query(
1712
+        'SELECT name FROM sqlite_master WHERE'
1713
+        . ' type=\'table\''
1714
+        . ' AND name=' . spip_sqlite_quote($table, 'string')
1715
+        . ' AND name NOT LIKE \'sqlite_%\'',
1716
+        $serveur,
1717
+        $requeter
1718
+    );
1719
+    if (!$requeter) {
1720
+        return $r;
1721
+    }
1722
+    $res = spip_sqlite_fetch($r);
1723
+    return (bool) $res;
1724 1724
 }
1725 1725
 
1726 1726
 define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -1743,129 +1743,129 @@  discard block
 block discarded – undo
1743 1743
  *     - array description de la table sinon
1744 1744
  */
1745 1745
 function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true) {
1746
-	$query =
1747
-		'SELECT sql, type FROM'
1748
-		. ' (SELECT * FROM sqlite_master UNION ALL'
1749
-		. ' SELECT * FROM sqlite_temp_master)'
1750
-		. " WHERE tbl_name LIKE '$nom_table'"
1751
-		. " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1752
-		. ' ORDER BY substr(type,2,1), name';
1753
-
1754
-	$a = spip_sqlite_query($query, $serveur, $requeter);
1755
-	if (!$a) {
1756
-		return '';
1757
-	}
1758
-	if (!$requeter) {
1759
-		return $a;
1760
-	}
1761
-	if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1762
-		return '';
1763
-	}
1764
-	$vue = ($a['type'] == 'view'); // table | vue
1765
-
1766
-	// c'est une table
1767
-	// il faut parser le create
1768
-	if (!$vue) {
1769
-		if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1770
-			return '';
1771
-		} else {
1772
-			$desc = $r[1];
1773
-			// extraction d'une KEY éventuelle en prenant garde de ne pas
1774
-			// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1775
-			if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1776
-				$namedkeys = $r[2];
1777
-				$desc = $r[1];
1778
-			} else {
1779
-				$namedkeys = '';
1780
-			}
1781
-
1782
-			$fields = [];
1783
-			$keys = [];
1784
-
1785
-			// enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1786
-			// par exemple s'il contiennent une virgule.
1787
-			// /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1788
-			list($desc, $echaps) = query_echappe_textes($desc);
1789
-
1790
-			// separer toutes les descriptions de champs, separes par des virgules
1791
-			# /!\ explode peut exploser aussi DECIMAL(10,2) !
1792
-			$k_precedent = null;
1793
-			foreach (explode(',', $desc) as $v) {
1794
-				preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1795
-				// Les cles de champs peuvent etre entourees
1796
-				// de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1797
-				// http://www.sqlite.org/lang_keywords.html
1798
-				$k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1799
-				if ($char = strpbrk($k[0], '\'"[`')) {
1800
-					$k = trim($k, $char);
1801
-					if ($char == '[') {
1802
-						$k = rtrim($k, ']');
1803
-					}
1804
-				}
1805
-				$def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1806
-
1807
-				// rustine pour DECIMAL(10,2)
1808
-				// s'il y a une parenthèse fermante dans la clé
1809
-				// ou dans la définition sans qu'il n'y ait une ouverture avant
1810
-				if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1811
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1812
-					continue;
1813
-				}
1814
-
1815
-				// la primary key peut etre dans une des descriptions de champs
1816
-				// et non en fin de table, cas encore decouvert avec Sqlite Manager
1817
-				if (stripos($r[2], 'PRIMARY KEY') !== false) {
1818
-					$keys['PRIMARY KEY'] = $k;
1819
-				}
1820
-
1821
-				$fields[$k] = $def;
1822
-				$k_precedent = $k;
1823
-			}
1824
-			// key inclues dans la requete
1825
-			foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1826
-				if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1827
-					$k = str_replace('`', '', trim($r[1]));
1828
-					$t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1829
-					if ($k && !isset($keys[$k])) {
1830
-						$keys[$k] = $t;
1831
-					} else {
1832
-						$keys[] = $t;
1833
-					}
1834
-				}
1835
-			}
1836
-			// sinon ajouter les key index
1837
-			$query =
1838
-				'SELECT name,sql FROM'
1839
-				. ' (SELECT * FROM sqlite_master UNION ALL'
1840
-				. ' SELECT * FROM sqlite_temp_master)'
1841
-				. " WHERE tbl_name LIKE '$nom_table'"
1842
-				. " AND type='index' AND name NOT LIKE 'sqlite_%'"
1843
-				. 'ORDER BY substr(type,2,1), name';
1844
-			$a = spip_sqlite_query($query, $serveur, $requeter);
1845
-			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1846
-				$key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1847
-				$keytype = 'KEY';
1848
-				if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1849
-					$keytype = 'UNIQUE KEY';
1850
-				}
1851
-				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1852
-				$keys[$keytype . ' ' . $key] = $colonnes;
1853
-			}
1854
-		}
1855
-	} // c'est une vue, on liste les champs disponibles simplement
1856
-	else {
1857
-		if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1858
-			$fields = [];
1859
-			foreach ($res as $c => $v) {
1860
-				$fields[$c] = '';
1861
-			}
1862
-			$keys = [];
1863
-		} else {
1864
-			return '';
1865
-		}
1866
-	}
1867
-
1868
-	return ['field' => $fields, 'key' => $keys];
1746
+    $query =
1747
+        'SELECT sql, type FROM'
1748
+        . ' (SELECT * FROM sqlite_master UNION ALL'
1749
+        . ' SELECT * FROM sqlite_temp_master)'
1750
+        . " WHERE tbl_name LIKE '$nom_table'"
1751
+        . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1752
+        . ' ORDER BY substr(type,2,1), name';
1753
+
1754
+    $a = spip_sqlite_query($query, $serveur, $requeter);
1755
+    if (!$a) {
1756
+        return '';
1757
+    }
1758
+    if (!$requeter) {
1759
+        return $a;
1760
+    }
1761
+    if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1762
+        return '';
1763
+    }
1764
+    $vue = ($a['type'] == 'view'); // table | vue
1765
+
1766
+    // c'est une table
1767
+    // il faut parser le create
1768
+    if (!$vue) {
1769
+        if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1770
+            return '';
1771
+        } else {
1772
+            $desc = $r[1];
1773
+            // extraction d'une KEY éventuelle en prenant garde de ne pas
1774
+            // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1775
+            if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1776
+                $namedkeys = $r[2];
1777
+                $desc = $r[1];
1778
+            } else {
1779
+                $namedkeys = '';
1780
+            }
1781
+
1782
+            $fields = [];
1783
+            $keys = [];
1784
+
1785
+            // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1786
+            // par exemple s'il contiennent une virgule.
1787
+            // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1788
+            list($desc, $echaps) = query_echappe_textes($desc);
1789
+
1790
+            // separer toutes les descriptions de champs, separes par des virgules
1791
+            # /!\ explode peut exploser aussi DECIMAL(10,2) !
1792
+            $k_precedent = null;
1793
+            foreach (explode(',', $desc) as $v) {
1794
+                preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1795
+                // Les cles de champs peuvent etre entourees
1796
+                // de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1797
+                // http://www.sqlite.org/lang_keywords.html
1798
+                $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1799
+                if ($char = strpbrk($k[0], '\'"[`')) {
1800
+                    $k = trim($k, $char);
1801
+                    if ($char == '[') {
1802
+                        $k = rtrim($k, ']');
1803
+                    }
1804
+                }
1805
+                $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1806
+
1807
+                // rustine pour DECIMAL(10,2)
1808
+                // s'il y a une parenthèse fermante dans la clé
1809
+                // ou dans la définition sans qu'il n'y ait une ouverture avant
1810
+                if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1811
+                    $fields[$k_precedent] .= ',' . $k . ' ' . $def;
1812
+                    continue;
1813
+                }
1814
+
1815
+                // la primary key peut etre dans une des descriptions de champs
1816
+                // et non en fin de table, cas encore decouvert avec Sqlite Manager
1817
+                if (stripos($r[2], 'PRIMARY KEY') !== false) {
1818
+                    $keys['PRIMARY KEY'] = $k;
1819
+                }
1820
+
1821
+                $fields[$k] = $def;
1822
+                $k_precedent = $k;
1823
+            }
1824
+            // key inclues dans la requete
1825
+            foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1826
+                if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1827
+                    $k = str_replace('`', '', trim($r[1]));
1828
+                    $t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1829
+                    if ($k && !isset($keys[$k])) {
1830
+                        $keys[$k] = $t;
1831
+                    } else {
1832
+                        $keys[] = $t;
1833
+                    }
1834
+                }
1835
+            }
1836
+            // sinon ajouter les key index
1837
+            $query =
1838
+                'SELECT name,sql FROM'
1839
+                . ' (SELECT * FROM sqlite_master UNION ALL'
1840
+                . ' SELECT * FROM sqlite_temp_master)'
1841
+                . " WHERE tbl_name LIKE '$nom_table'"
1842
+                . " AND type='index' AND name NOT LIKE 'sqlite_%'"
1843
+                . 'ORDER BY substr(type,2,1), name';
1844
+            $a = spip_sqlite_query($query, $serveur, $requeter);
1845
+            while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1846
+                $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1847
+                $keytype = 'KEY';
1848
+                if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1849
+                    $keytype = 'UNIQUE KEY';
1850
+                }
1851
+                $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1852
+                $keys[$keytype . ' ' . $key] = $colonnes;
1853
+            }
1854
+        }
1855
+    } // c'est une vue, on liste les champs disponibles simplement
1856
+    else {
1857
+        if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1858
+            $fields = [];
1859
+            foreach ($res as $c => $v) {
1860
+                $fields[$c] = '';
1861
+            }
1862
+            $keys = [];
1863
+        } else {
1864
+            return '';
1865
+        }
1866
+    }
1867
+
1868
+    return ['field' => $fields, 'key' => $keys];
1869 1869
 }
1870 1870
 
1871 1871
 
@@ -1891,22 +1891,22 @@  discard block
 block discarded – undo
1891 1891
  *     - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif
1892 1892
  */
1893 1893
 function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true) {
1894
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1895
-	$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1894
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1895
+    $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1896 1896
 
1897
-	$set = [];
1898
-	foreach ($champs as $champ => $val) {
1899
-		$set[] = $champ . "=$val";
1900
-	}
1901
-	if (!empty($set)) {
1902
-		return spip_sqlite_query(
1903
-			_sqlite_calculer_expression('UPDATE', $table, ',')
1904
-			. _sqlite_calculer_expression('SET', $set, ',')
1905
-			. _sqlite_calculer_expression('WHERE', $where),
1906
-			$serveur,
1907
-			$requeter
1908
-		);
1909
-	}
1897
+    $set = [];
1898
+    foreach ($champs as $champ => $val) {
1899
+        $set[] = $champ . "=$val";
1900
+    }
1901
+    if (!empty($set)) {
1902
+        return spip_sqlite_query(
1903
+            _sqlite_calculer_expression('UPDATE', $table, ',')
1904
+            . _sqlite_calculer_expression('SET', $set, ',')
1905
+            . _sqlite_calculer_expression('WHERE', $where),
1906
+            $serveur,
1907
+            $requeter
1908
+        );
1909
+    }
1910 1910
 }
1911 1911
 
1912 1912
 
@@ -1936,38 +1936,38 @@  discard block
 block discarded – undo
1936 1936
  */
1937 1937
 function spip_sqlite_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true) {
1938 1938
 
1939
-	if (!$champs) {
1940
-		return;
1941
-	}
1942
-	if (!$desc) {
1943
-		$desc = description_table($table, $serveur);
1944
-	}
1945
-	if (!$desc) {
1946
-		die("$table insertion sans description");
1947
-	}
1948
-	$fields = $desc['field'];
1949
-
1950
-	$set = [];
1951
-	foreach ($champs as $champ => $val) {
1952
-		$set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1953
-	}
1954
-
1955
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1956
-	// attention ils sont deja quotes
1957
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1958
-	foreach ($maj as $champ => $val) {
1959
-		if (!isset($set[$champ])) {
1960
-			$set[$champ] = $champ . '=' . $val;
1961
-		}
1962
-	}
1963
-
1964
-	return spip_sqlite_query(
1965
-		_sqlite_calculer_expression('UPDATE', $table, ',')
1966
-		. _sqlite_calculer_expression('SET', $set, ',')
1967
-		. _sqlite_calculer_expression('WHERE', $where),
1968
-		$serveur,
1969
-		$requeter
1970
-	);
1939
+    if (!$champs) {
1940
+        return;
1941
+    }
1942
+    if (!$desc) {
1943
+        $desc = description_table($table, $serveur);
1944
+    }
1945
+    if (!$desc) {
1946
+        die("$table insertion sans description");
1947
+    }
1948
+    $fields = $desc['field'];
1949
+
1950
+    $set = [];
1951
+    foreach ($champs as $champ => $val) {
1952
+        $set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
1953
+    }
1954
+
1955
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1956
+    // attention ils sont deja quotes
1957
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1958
+    foreach ($maj as $champ => $val) {
1959
+        if (!isset($set[$champ])) {
1960
+            $set[$champ] = $champ . '=' . $val;
1961
+        }
1962
+    }
1963
+
1964
+    return spip_sqlite_query(
1965
+        _sqlite_calculer_expression('UPDATE', $table, ',')
1966
+        . _sqlite_calculer_expression('SET', $set, ',')
1967
+        . _sqlite_calculer_expression('WHERE', $where),
1968
+        $serveur,
1969
+        $requeter
1970
+    );
1971 1971
 }
1972 1972
 
1973 1973
 
@@ -1985,17 +1985,17 @@  discard block
 block discarded – undo
1985 1985
  * @return void
1986 1986
  */
1987 1987
 function _sqlite_init() {
1988
-	if (!defined('_DIR_DB')) {
1989
-		define('_DIR_DB', _DIR_ETC . 'bases/');
1990
-	}
1991
-	if (!defined('_SQLITE_CHMOD')) {
1992
-		define('_SQLITE_CHMOD', _SPIP_CHMOD);
1993
-	}
1988
+    if (!defined('_DIR_DB')) {
1989
+        define('_DIR_DB', _DIR_ETC . 'bases/');
1990
+    }
1991
+    if (!defined('_SQLITE_CHMOD')) {
1992
+        define('_SQLITE_CHMOD', _SPIP_CHMOD);
1993
+    }
1994 1994
 
1995
-	if (!is_dir($d = _DIR_DB)) {
1996
-		include_spip('inc/flock');
1997
-		sous_repertoire($d);
1998
-	}
1995
+    if (!is_dir($d = _DIR_DB)) {
1996
+        include_spip('inc/flock');
1997
+        sous_repertoire($d);
1998
+    }
1999 1999
 }
2000 2000
 
2001 2001
 
@@ -2009,20 +2009,20 @@  discard block
 block discarded – undo
2009 2009
  * @return bool|int
2010 2010
  */
2011 2011
 function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true) {
2012
-	if ($link === '') {
2013
-		$link = _sqlite_link($serveur);
2014
-	}
2015
-	if (!$link) {
2016
-		return false;
2017
-	}
2012
+    if ($link === '') {
2013
+        $link = _sqlite_link($serveur);
2014
+    }
2015
+    if (!$link) {
2016
+        return false;
2017
+    }
2018 2018
 
2019
-	$v = 3;
2019
+    $v = 3;
2020 2020
 
2021
-	if (!$version) {
2022
-		return $v;
2023
-	}
2021
+    if (!$version) {
2022
+        return $v;
2023
+    }
2024 2024
 
2025
-	return ($version == $v);
2025
+    return ($version == $v);
2026 2026
 }
2027 2027
 
2028 2028
 
@@ -2033,9 +2033,9 @@  discard block
 block discarded – undo
2033 2033
  * @return PDO Information de connexion pour SQLite
2034 2034
  */
2035 2035
 function _sqlite_link($serveur = '') {
2036
-	$link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2036
+    $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2037 2037
 
2038
-	return $link;
2038
+    return $link;
2039 2039
 }
2040 2040
 
2041 2041
 
@@ -2050,52 +2050,52 @@  discard block
 block discarded – undo
2050 2050
  * @return string|number     Texte ou nombre échappé
2051 2051
  */
2052 2052
 function _sqlite_calculer_cite($v, $type) {
2053
-	if ($type) {
2054
-		if (
2055
-			is_null($v)
2056
-			and stripos($type, 'NOT NULL') === false
2057
-		) {
2058
-			return 'NULL';
2059
-		} // null php se traduit en NULL SQL
2060
-
2061
-		if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2062
-			return $v;
2063
-		}
2064
-		if (sql_test_int($type)) {
2065
-			if (is_numeric($v)) {
2066
-				return $v;
2067
-			} elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
2068
-				return hexdec(substr($v, 2));
2069
-			} else {
2070
-				return intval($v);
2071
-			}
2072
-		}
2073
-	} else {
2074
-		// si on ne connait pas le type on le deduit de $v autant que possible
2075
-		if (is_bool($v)) {
2076
-			return strval(intval($v));
2077
-		}
2078
-		elseif (is_numeric($v)) {
2079
-			return strval($v);
2080
-		}
2081
-	}
2082
-
2083
-	// trouver un link sqlite pour faire l'echappement
2084
-	foreach ($GLOBALS['connexions'] as $s) {
2085
-		if (
2086
-			$l = $s['link']
2087
-			and is_object($l)
2088
-			and $l instanceof \PDO
2089
-			and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2090
-		) {
2091
-			return $l->quote($v);
2092
-		}
2093
-	}
2094
-
2095
-	// echapper les ' en ''
2096
-	spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2097
-
2098
-	return ("'" . str_replace("'", "''", $v) . "'");
2053
+    if ($type) {
2054
+        if (
2055
+            is_null($v)
2056
+            and stripos($type, 'NOT NULL') === false
2057
+        ) {
2058
+            return 'NULL';
2059
+        } // null php se traduit en NULL SQL
2060
+
2061
+        if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2062
+            return $v;
2063
+        }
2064
+        if (sql_test_int($type)) {
2065
+            if (is_numeric($v)) {
2066
+                return $v;
2067
+            } elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) == 0) {
2068
+                return hexdec(substr($v, 2));
2069
+            } else {
2070
+                return intval($v);
2071
+            }
2072
+        }
2073
+    } else {
2074
+        // si on ne connait pas le type on le deduit de $v autant que possible
2075
+        if (is_bool($v)) {
2076
+            return strval(intval($v));
2077
+        }
2078
+        elseif (is_numeric($v)) {
2079
+            return strval($v);
2080
+        }
2081
+    }
2082
+
2083
+    // trouver un link sqlite pour faire l'echappement
2084
+    foreach ($GLOBALS['connexions'] as $s) {
2085
+        if (
2086
+            $l = $s['link']
2087
+            and is_object($l)
2088
+            and $l instanceof \PDO
2089
+            and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2090
+        ) {
2091
+            return $l->quote($v);
2092
+        }
2093
+    }
2094
+
2095
+    // echapper les ' en ''
2096
+    spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2097
+
2098
+    return ("'" . str_replace("'", "''", $v) . "'");
2099 2099
 }
2100 2100
 
2101 2101
 
@@ -2111,21 +2111,21 @@  discard block
 block discarded – undo
2111 2111
  * @return string            Texte de l'expression, une partie donc, du texte la requête.
2112 2112
  */
2113 2113
 function _sqlite_calculer_expression($expression, $v, $join = 'AND') {
2114
-	if (empty($v)) {
2115
-		return '';
2116
-	}
2114
+    if (empty($v)) {
2115
+        return '';
2116
+    }
2117 2117
 
2118
-	$exp = "\n$expression ";
2118
+    $exp = "\n$expression ";
2119 2119
 
2120
-	if (!is_array($v)) {
2121
-		return $exp . $v;
2122
-	} else {
2123
-		if (strtoupper($join) === 'AND') {
2124
-			return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2125
-		} else {
2126
-			return $exp . join($join, $v);
2127
-		}
2128
-	}
2120
+    if (!is_array($v)) {
2121
+        return $exp . $v;
2122
+    } else {
2123
+        if (strtoupper($join) === 'AND') {
2124
+            return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2125
+        } else {
2126
+            return $exp . join($join, $v);
2127
+        }
2128
+    }
2129 2129
 }
2130 2130
 
2131 2131
 
@@ -2141,7 +2141,7 @@  discard block
 block discarded – undo
2141 2141
  * @return string Texte du orderby préparé
2142 2142
  */
2143 2143
 function _sqlite_calculer_order($orderby) {
2144
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2144
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2145 2145
 }
2146 2146
 
2147 2147
 
@@ -2152,26 +2152,26 @@  discard block
 block discarded – undo
2152 2152
  * @return string Sélection de colonnes pour une clause SELECT
2153 2153
  */
2154 2154
 function _sqlite_calculer_select_as($args) {
2155
-	$res = '';
2156
-	foreach ($args as $k => $v) {
2157
-		if (substr($k, -1) == '@') {
2158
-			// c'est une jointure qui se refere au from precedent
2159
-			// pas de virgule
2160
-			$res .= '  ' . $v;
2161
-		} else {
2162
-			if (!is_numeric($k)) {
2163
-				$p = strpos($v, ' ');
2164
-				if ($p) {
2165
-					$v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2166
-				} else {
2167
-					$v .= " AS '$k'";
2168
-				}
2169
-			}
2170
-			$res .= ', ' . $v;
2171
-		}
2172
-	}
2173
-
2174
-	return substr($res, 2);
2155
+    $res = '';
2156
+    foreach ($args as $k => $v) {
2157
+        if (substr($k, -1) == '@') {
2158
+            // c'est une jointure qui se refere au from precedent
2159
+            // pas de virgule
2160
+            $res .= '  ' . $v;
2161
+        } else {
2162
+            if (!is_numeric($k)) {
2163
+                $p = strpos($v, ' ');
2164
+                if ($p) {
2165
+                    $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2166
+                } else {
2167
+                    $v .= " AS '$k'";
2168
+                }
2169
+            }
2170
+            $res .= ', ' . $v;
2171
+        }
2172
+    }
2173
+
2174
+    return substr($res, 2);
2175 2175
 }
2176 2176
 
2177 2177
 
@@ -2194,26 +2194,26 @@  discard block
 block discarded – undo
2194 2194
  *     Contrainte pour clause WHERE
2195 2195
  */
2196 2196
 function _sqlite_calculer_where($v) {
2197
-	if (!is_array($v)) {
2198
-		return $v;
2199
-	}
2200
-
2201
-	$op = array_shift($v);
2202
-	if (!($n = count($v))) {
2203
-		return $op;
2204
-	} else {
2205
-		$arg = _sqlite_calculer_where(array_shift($v));
2206
-		if ($n == 1) {
2207
-			return "$op($arg)";
2208
-		} else {
2209
-			$arg2 = _sqlite_calculer_where(array_shift($v));
2210
-			if ($n == 2) {
2211
-				return "($arg $op $arg2)";
2212
-			} else {
2213
-				return "($arg $op ($arg2) : $v[0])";
2214
-			}
2215
-		}
2216
-	}
2197
+    if (!is_array($v)) {
2198
+        return $v;
2199
+    }
2200
+
2201
+    $op = array_shift($v);
2202
+    if (!($n = count($v))) {
2203
+        return $op;
2204
+    } else {
2205
+        $arg = _sqlite_calculer_where(array_shift($v));
2206
+        if ($n == 1) {
2207
+            return "$op($arg)";
2208
+        } else {
2209
+            $arg2 = _sqlite_calculer_where(array_shift($v));
2210
+            if ($n == 2) {
2211
+                return "($arg $op $arg2)";
2212
+            } else {
2213
+                return "($arg $op ($arg2) : $v[0])";
2214
+            }
2215
+        }
2216
+    }
2217 2217
 }
2218 2218
 
2219 2219
 
@@ -2228,19 +2228,19 @@  discard block
 block discarded – undo
2228 2228
  * @return array|bool
2229 2229
  */
2230 2230
 function _sqlite_charger_version($version = '') {
2231
-	$versions = [];
2231
+    $versions = [];
2232 2232
 
2233
-	// version 3
2234
-	if (!$version || $version == 3) {
2235
-		if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2236
-			$versions[] = 3;
2237
-		}
2238
-	}
2239
-	if ($version) {
2240
-		return in_array($version, $versions);
2241
-	}
2233
+    // version 3
2234
+    if (!$version || $version == 3) {
2235
+        if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2236
+            $versions[] = 3;
2237
+        }
2238
+    }
2239
+    if ($version) {
2240
+        return in_array($version, $versions);
2241
+    }
2242 2242
 
2243
-	return $versions;
2243
+    return $versions;
2244 2244
 }
2245 2245
 
2246 2246
 
@@ -2278,147 +2278,147 @@  discard block
 block discarded – undo
2278 2278
  */
2279 2279
 function _sqlite_modifier_table($table, $colonne, $opt = [], $serveur = '') {
2280 2280
 
2281
-	if (is_array($table)) {
2282
-		$table_destination = reset($table);
2283
-		$table_origine = key($table);
2284
-	} else {
2285
-		$table_origine = $table_destination = $table;
2286
-	}
2287
-	// ne prend actuellement qu'un changement
2288
-	// mais pourra etre adapte pour changer plus qu'une colonne a la fois
2289
-	if (is_array($colonne)) {
2290
-		$colonne_destination = reset($colonne);
2291
-		$colonne_origine = key($colonne);
2292
-	} else {
2293
-		$colonne_origine = $colonne_destination = $colonne;
2294
-	}
2295
-	if (!isset($opt['field'])) {
2296
-		$opt['field'] = [];
2297
-	}
2298
-	if (!isset($opt['key'])) {
2299
-		$opt['key'] = [];
2300
-	}
2301
-
2302
-	// si les noms de tables sont differents, pas besoin de table temporaire
2303
-	// on prendra directement le nom de la future table
2304
-	$meme_table = ($table_origine == $table_destination);
2305
-
2306
-	$def_origine = sql_showtable($table_origine, false, $serveur);
2307
-	if (!$def_origine or !isset($def_origine['field'])) {
2308
-		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2309
-
2310
-		return false;
2311
-	}
2312
-
2313
-
2314
-	$table_tmp = $table_origine . '_tmp';
2315
-
2316
-	// 1) creer une table temporaire avec les modifications
2317
-	// - DROP : suppression de la colonne
2318
-	// - CHANGE : modification de la colonne
2319
-	// (foreach pour conserver l'ordre des champs)
2320
-
2321
-	// field
2322
-	$fields = [];
2323
-	// pour le INSERT INTO plus loin
2324
-	// stocker la correspondance nouvelles->anciennes colonnes
2325
-	$fields_correspondances = [];
2326
-	foreach ($def_origine['field'] as $c => $d) {
2327
-		if ($colonne_origine && ($c == $colonne_origine)) {
2328
-			// si pas DROP
2329
-			if ($colonne_destination) {
2330
-				$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2331
-				$fields_correspondances[$colonne_destination] = $c;
2332
-			}
2333
-		} else {
2334
-			$fields[$c] = $d;
2335
-			$fields_correspondances[$c] = $c;
2336
-		}
2337
-	}
2338
-	// cas de ADD sqlite2 (ajout du champ en fin de table):
2339
-	if (!$colonne_origine && $colonne_destination) {
2340
-		$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2341
-	}
2342
-
2343
-	// key...
2344
-	$keys = [];
2345
-	foreach ($def_origine['key'] as $c => $d) {
2346
-		$c = str_replace($colonne_origine, $colonne_destination, $c);
2347
-		$d = str_replace($colonne_origine, $colonne_destination, $d);
2348
-		// seulement si on ne supprime pas la colonne !
2349
-		if ($d) {
2350
-			$keys[$c] = $d;
2351
-		}
2352
-	}
2353
-
2354
-	// autres keys, on merge
2355
-	$keys = array_merge($keys, $opt['key']);
2356
-	$queries = [];
2357
-
2358
-	// copier dans destination (si differente de origine), sinon tmp
2359
-	$table_copie = ($meme_table) ? $table_tmp : $table_destination;
2360
-	$autoinc = (isset($keys['PRIMARY KEY'])
2361
-		and $keys['PRIMARY KEY']
2362
-		and stripos($keys['PRIMARY KEY'], ',') === false
2363
-		and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2364
-
2365
-	if (
2366
-		$q = _sqlite_requete_create(
2367
-			$table_copie,
2368
-			$fields,
2369
-			$keys,
2370
-			$autoinc,
2371
-			$temporary = false,
2372
-			$ifnotexists = true,
2373
-			$serveur
2374
-		)
2375
-	) {
2376
-		$queries[] = $q;
2377
-	}
2378
-
2379
-
2380
-	// 2) y copier les champs qui vont bien
2381
-	$champs_dest = join(', ', array_keys($fields_correspondances));
2382
-	$champs_ori = join(', ', $fields_correspondances);
2383
-	$queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2384
-
2385
-	// 3) supprimer la table d'origine
2386
-	$queries[] = "DROP TABLE $table_origine";
2387
-
2388
-	// 4) renommer la table temporaire
2389
-	// avec le nom de la table destination
2390
-	// si necessaire
2391
-	if ($meme_table) {
2392
-		$queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2393
-	}
2394
-
2395
-	// 5) remettre les index !
2396
-	foreach ($keys as $k => $v) {
2397
-		if ($k == 'PRIMARY KEY') {
2398
-		} else {
2399
-			// enlever KEY
2400
-			$k = substr($k, 4);
2401
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2402
-		}
2403
-	}
2404
-
2405
-
2406
-	if (count($queries)) {
2407
-		spip_sqlite::demarrer_transaction($serveur);
2408
-		// il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2409
-		foreach ($queries as $q) {
2410
-			if (!spip_sqlite::executer_requete($q, $serveur)) {
2411
-				spip_log('SQLite : ALTER TABLE table :'
2412
-					. " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2413
-				spip_sqlite::annuler_transaction($serveur);
2414
-
2415
-				return false;
2416
-			}
2417
-		}
2418
-		spip_sqlite::finir_transaction($serveur);
2419
-	}
2420
-
2421
-	return true;
2281
+    if (is_array($table)) {
2282
+        $table_destination = reset($table);
2283
+        $table_origine = key($table);
2284
+    } else {
2285
+        $table_origine = $table_destination = $table;
2286
+    }
2287
+    // ne prend actuellement qu'un changement
2288
+    // mais pourra etre adapte pour changer plus qu'une colonne a la fois
2289
+    if (is_array($colonne)) {
2290
+        $colonne_destination = reset($colonne);
2291
+        $colonne_origine = key($colonne);
2292
+    } else {
2293
+        $colonne_origine = $colonne_destination = $colonne;
2294
+    }
2295
+    if (!isset($opt['field'])) {
2296
+        $opt['field'] = [];
2297
+    }
2298
+    if (!isset($opt['key'])) {
2299
+        $opt['key'] = [];
2300
+    }
2301
+
2302
+    // si les noms de tables sont differents, pas besoin de table temporaire
2303
+    // on prendra directement le nom de la future table
2304
+    $meme_table = ($table_origine == $table_destination);
2305
+
2306
+    $def_origine = sql_showtable($table_origine, false, $serveur);
2307
+    if (!$def_origine or !isset($def_origine['field'])) {
2308
+        spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2309
+
2310
+        return false;
2311
+    }
2312
+
2313
+
2314
+    $table_tmp = $table_origine . '_tmp';
2315
+
2316
+    // 1) creer une table temporaire avec les modifications
2317
+    // - DROP : suppression de la colonne
2318
+    // - CHANGE : modification de la colonne
2319
+    // (foreach pour conserver l'ordre des champs)
2320
+
2321
+    // field
2322
+    $fields = [];
2323
+    // pour le INSERT INTO plus loin
2324
+    // stocker la correspondance nouvelles->anciennes colonnes
2325
+    $fields_correspondances = [];
2326
+    foreach ($def_origine['field'] as $c => $d) {
2327
+        if ($colonne_origine && ($c == $colonne_origine)) {
2328
+            // si pas DROP
2329
+            if ($colonne_destination) {
2330
+                $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2331
+                $fields_correspondances[$colonne_destination] = $c;
2332
+            }
2333
+        } else {
2334
+            $fields[$c] = $d;
2335
+            $fields_correspondances[$c] = $c;
2336
+        }
2337
+    }
2338
+    // cas de ADD sqlite2 (ajout du champ en fin de table):
2339
+    if (!$colonne_origine && $colonne_destination) {
2340
+        $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2341
+    }
2342
+
2343
+    // key...
2344
+    $keys = [];
2345
+    foreach ($def_origine['key'] as $c => $d) {
2346
+        $c = str_replace($colonne_origine, $colonne_destination, $c);
2347
+        $d = str_replace($colonne_origine, $colonne_destination, $d);
2348
+        // seulement si on ne supprime pas la colonne !
2349
+        if ($d) {
2350
+            $keys[$c] = $d;
2351
+        }
2352
+    }
2353
+
2354
+    // autres keys, on merge
2355
+    $keys = array_merge($keys, $opt['key']);
2356
+    $queries = [];
2357
+
2358
+    // copier dans destination (si differente de origine), sinon tmp
2359
+    $table_copie = ($meme_table) ? $table_tmp : $table_destination;
2360
+    $autoinc = (isset($keys['PRIMARY KEY'])
2361
+        and $keys['PRIMARY KEY']
2362
+        and stripos($keys['PRIMARY KEY'], ',') === false
2363
+        and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2364
+
2365
+    if (
2366
+        $q = _sqlite_requete_create(
2367
+            $table_copie,
2368
+            $fields,
2369
+            $keys,
2370
+            $autoinc,
2371
+            $temporary = false,
2372
+            $ifnotexists = true,
2373
+            $serveur
2374
+        )
2375
+    ) {
2376
+        $queries[] = $q;
2377
+    }
2378
+
2379
+
2380
+    // 2) y copier les champs qui vont bien
2381
+    $champs_dest = join(', ', array_keys($fields_correspondances));
2382
+    $champs_ori = join(', ', $fields_correspondances);
2383
+    $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2384
+
2385
+    // 3) supprimer la table d'origine
2386
+    $queries[] = "DROP TABLE $table_origine";
2387
+
2388
+    // 4) renommer la table temporaire
2389
+    // avec le nom de la table destination
2390
+    // si necessaire
2391
+    if ($meme_table) {
2392
+        $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2393
+    }
2394
+
2395
+    // 5) remettre les index !
2396
+    foreach ($keys as $k => $v) {
2397
+        if ($k == 'PRIMARY KEY') {
2398
+        } else {
2399
+            // enlever KEY
2400
+            $k = substr($k, 4);
2401
+            $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2402
+        }
2403
+    }
2404
+
2405
+
2406
+    if (count($queries)) {
2407
+        spip_sqlite::demarrer_transaction($serveur);
2408
+        // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2409
+        foreach ($queries as $q) {
2410
+            if (!spip_sqlite::executer_requete($q, $serveur)) {
2411
+                spip_log('SQLite : ALTER TABLE table :'
2412
+                    . " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2413
+                spip_sqlite::annuler_transaction($serveur);
2414
+
2415
+                return false;
2416
+            }
2417
+        }
2418
+        spip_sqlite::finir_transaction($serveur);
2419
+    }
2420
+
2421
+    return true;
2422 2422
 }
2423 2423
 
2424 2424
 
@@ -2428,61 +2428,61 @@  discard block
 block discarded – undo
2428 2428
  * @return array
2429 2429
  */
2430 2430
 function _sqlite_ref_fonctions() {
2431
-	$fonctions = [
2432
-		'alter' => 'spip_sqlite_alter',
2433
-		'count' => 'spip_sqlite_count',
2434
-		'countsel' => 'spip_sqlite_countsel',
2435
-		'create' => 'spip_sqlite_create',
2436
-		'create_base' => 'spip_sqlite_create_base',
2437
-		'create_view' => 'spip_sqlite_create_view',
2438
-		'date_proche' => 'spip_sqlite_date_proche',
2439
-		'delete' => 'spip_sqlite_delete',
2440
-		'drop_table' => 'spip_sqlite_drop_table',
2441
-		'drop_view' => 'spip_sqlite_drop_view',
2442
-		'errno' => 'spip_sqlite_errno',
2443
-		'error' => 'spip_sqlite_error',
2444
-		'explain' => 'spip_sqlite_explain',
2445
-		'fetch' => 'spip_sqlite_fetch',
2446
-		'seek' => 'spip_sqlite_seek',
2447
-		'free' => 'spip_sqlite_free',
2448
-		'hex' => 'spip_sqlite_hex',
2449
-		'in' => 'spip_sqlite_in',
2450
-		'insert' => 'spip_sqlite_insert',
2451
-		'insertq' => 'spip_sqlite_insertq',
2452
-		'insertq_multi' => 'spip_sqlite_insertq_multi',
2453
-		'listdbs' => 'spip_sqlite_listdbs',
2454
-		'multi' => 'spip_sqlite_multi',
2455
-		'optimize' => 'spip_sqlite_optimize',
2456
-		'query' => 'spip_sqlite_query',
2457
-		'quote' => 'spip_sqlite_quote',
2458
-		'repair' => 'spip_sqlite_repair',
2459
-		'replace' => 'spip_sqlite_replace',
2460
-		'replace_multi' => 'spip_sqlite_replace_multi',
2461
-		'select' => 'spip_sqlite_select',
2462
-		'selectdb' => 'spip_sqlite_selectdb',
2463
-		'set_charset' => 'spip_sqlite_set_charset',
2464
-		'get_charset' => 'spip_sqlite_get_charset',
2465
-		'showbase' => 'spip_sqlite_showbase',
2466
-		'showtable' => 'spip_sqlite_showtable',
2467
-		'table_exists' => 'spip_sqlite_table_exists',
2468
-		'update' => 'spip_sqlite_update',
2469
-		'updateq' => 'spip_sqlite_updateq',
2470
-		'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2471
-		'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2472
-		'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2473
-	];
2474
-
2475
-	// association de chaque nom http d'un charset aux couples sqlite
2476
-	// SQLite supporte utf-8 et utf-16 uniquement.
2477
-	$charsets = [
2478
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2479
-		//'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2480
-		//'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2481
-	];
2482
-
2483
-	$fonctions['charsets'] = $charsets;
2484
-
2485
-	return $fonctions;
2431
+    $fonctions = [
2432
+        'alter' => 'spip_sqlite_alter',
2433
+        'count' => 'spip_sqlite_count',
2434
+        'countsel' => 'spip_sqlite_countsel',
2435
+        'create' => 'spip_sqlite_create',
2436
+        'create_base' => 'spip_sqlite_create_base',
2437
+        'create_view' => 'spip_sqlite_create_view',
2438
+        'date_proche' => 'spip_sqlite_date_proche',
2439
+        'delete' => 'spip_sqlite_delete',
2440
+        'drop_table' => 'spip_sqlite_drop_table',
2441
+        'drop_view' => 'spip_sqlite_drop_view',
2442
+        'errno' => 'spip_sqlite_errno',
2443
+        'error' => 'spip_sqlite_error',
2444
+        'explain' => 'spip_sqlite_explain',
2445
+        'fetch' => 'spip_sqlite_fetch',
2446
+        'seek' => 'spip_sqlite_seek',
2447
+        'free' => 'spip_sqlite_free',
2448
+        'hex' => 'spip_sqlite_hex',
2449
+        'in' => 'spip_sqlite_in',
2450
+        'insert' => 'spip_sqlite_insert',
2451
+        'insertq' => 'spip_sqlite_insertq',
2452
+        'insertq_multi' => 'spip_sqlite_insertq_multi',
2453
+        'listdbs' => 'spip_sqlite_listdbs',
2454
+        'multi' => 'spip_sqlite_multi',
2455
+        'optimize' => 'spip_sqlite_optimize',
2456
+        'query' => 'spip_sqlite_query',
2457
+        'quote' => 'spip_sqlite_quote',
2458
+        'repair' => 'spip_sqlite_repair',
2459
+        'replace' => 'spip_sqlite_replace',
2460
+        'replace_multi' => 'spip_sqlite_replace_multi',
2461
+        'select' => 'spip_sqlite_select',
2462
+        'selectdb' => 'spip_sqlite_selectdb',
2463
+        'set_charset' => 'spip_sqlite_set_charset',
2464
+        'get_charset' => 'spip_sqlite_get_charset',
2465
+        'showbase' => 'spip_sqlite_showbase',
2466
+        'showtable' => 'spip_sqlite_showtable',
2467
+        'table_exists' => 'spip_sqlite_table_exists',
2468
+        'update' => 'spip_sqlite_update',
2469
+        'updateq' => 'spip_sqlite_updateq',
2470
+        'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2471
+        'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2472
+        'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2473
+    ];
2474
+
2475
+    // association de chaque nom http d'un charset aux couples sqlite
2476
+    // SQLite supporte utf-8 et utf-16 uniquement.
2477
+    $charsets = [
2478
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2479
+        //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2480
+        //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2481
+    ];
2482
+
2483
+    $fonctions['charsets'] = $charsets;
2484
+
2485
+    return $fonctions;
2486 2486
 }
2487 2487
 
2488 2488
 
@@ -2494,56 +2494,56 @@  discard block
 block discarded – undo
2494 2494
  * @return mixed
2495 2495
  */
2496 2496
 function _sqlite_remplacements_definitions_table($query, $autoinc = false) {
2497
-	// quelques remplacements
2498
-	$num = '(\s*\([0-9]*\))?';
2499
-	$enum = '(\s*\([^\)]*\))?';
2500
-
2501
-	$remplace = [
2502
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2503
-		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2504
-		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2505
-		'/auto_increment/is' => '',
2506
-		'/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2507
-		'/(timestamp .* )ON .*$/is' => '\\1',
2508
-		'/character set \w+/is' => '',
2509
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2510
-		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2511
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2512
-		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2513
-		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2514
-	];
2515
-
2516
-	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2517
-	$remplace_autocinc = [
2518
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2519
-	];
2520
-	// pour les int non autoincrement, il faut un DEFAULT
2521
-	$remplace_nonautocinc = [
2522
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2523
-	];
2524
-
2525
-	if (is_string($query)) {
2526
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
2527
-		if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2528
-			$query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2529
-		} else {
2530
-			$query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2531
-			$query = _sqlite_collate_ci($query);
2532
-		}
2533
-	} elseif (is_array($query)) {
2534
-		foreach ($query as $k => $q) {
2535
-			$ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2536
-			$query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2537
-			if ($ai) {
2538
-				$query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2539
-			} else {
2540
-				$query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2541
-				$query[$k] = _sqlite_collate_ci($query[$k]);
2542
-			}
2543
-		}
2544
-	}
2545
-
2546
-	return $query;
2497
+    // quelques remplacements
2498
+    $num = '(\s*\([0-9]*\))?';
2499
+    $enum = '(\s*\([^\)]*\))?';
2500
+
2501
+    $remplace = [
2502
+        '/enum' . $enum . '/is' => 'VARCHAR(255)',
2503
+        '/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2504
+        '/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2505
+        '/auto_increment/is' => '',
2506
+        '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2507
+        '/(timestamp .* )ON .*$/is' => '\\1',
2508
+        '/character set \w+/is' => '',
2509
+        '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2510
+        '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2511
+        '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2512
+        '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2513
+        '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2514
+    ];
2515
+
2516
+    // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2517
+    $remplace_autocinc = [
2518
+        '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2519
+    ];
2520
+    // pour les int non autoincrement, il faut un DEFAULT
2521
+    $remplace_nonautocinc = [
2522
+        '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2523
+    ];
2524
+
2525
+    if (is_string($query)) {
2526
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
2527
+        if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2528
+            $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2529
+        } else {
2530
+            $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2531
+            $query = _sqlite_collate_ci($query);
2532
+        }
2533
+    } elseif (is_array($query)) {
2534
+        foreach ($query as $k => $q) {
2535
+            $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2536
+            $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2537
+            if ($ai) {
2538
+                $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2539
+            } else {
2540
+                $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2541
+                $query[$k] = _sqlite_collate_ci($query[$k]);
2542
+            }
2543
+        }
2544
+    }
2545
+
2546
+    return $query;
2547 2547
 }
2548 2548
 
2549 2549
 /**
@@ -2554,17 +2554,17 @@  discard block
 block discarded – undo
2554 2554
  * @return string
2555 2555
  */
2556 2556
 function _sqlite_collate_ci($champ) {
2557
-	if (stripos($champ, 'COLLATE') !== false) {
2558
-		return $champ;
2559
-	}
2560
-	if (stripos($champ, 'BINARY') !== false) {
2561
-		return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2562
-	}
2563
-	if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2564
-		return $champ . ' COLLATE NOCASE';
2565
-	}
2557
+    if (stripos($champ, 'COLLATE') !== false) {
2558
+        return $champ;
2559
+    }
2560
+    if (stripos($champ, 'BINARY') !== false) {
2561
+        return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2562
+    }
2563
+    if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2564
+        return $champ . ' COLLATE NOCASE';
2565
+    }
2566 2566
 
2567
-	return $champ;
2567
+    return $champ;
2568 2568
 }
2569 2569
 
2570 2570
 
@@ -2583,84 +2583,84 @@  discard block
 block discarded – undo
2583 2583
  * @return bool|string
2584 2584
  */
2585 2585
 function _sqlite_requete_create(
2586
-	$nom,
2587
-	$champs,
2588
-	$cles,
2589
-	$autoinc = false,
2590
-	$temporary = false,
2591
-	$_ifnotexists = true,
2592
-	$serveur = '',
2593
-	$requeter = true
2586
+    $nom,
2587
+    $champs,
2588
+    $cles,
2589
+    $autoinc = false,
2590
+    $temporary = false,
2591
+    $_ifnotexists = true,
2592
+    $serveur = '',
2593
+    $requeter = true
2594 2594
 ) {
2595
-	$query = $keys = $s = $p = '';
2596
-
2597
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
2598
-	// sans les renseigner (laisse le compilo recuperer la description)
2599
-	if (!is_array($champs) || !is_array($cles)) {
2600
-		return;
2601
-	}
2602
-
2603
-	// sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2604
-	// il faut passer par des create index
2605
-	// Il gere par contre primary key !
2606
-	// Soit la PK est definie dans les cles, soit dans un champs
2607
-	// soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2608
-	$pk = 'PRIMARY KEY';
2609
-	// le champ de cle primaire
2610
-	$champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2611
-
2612
-	foreach ($champs as $k => $v) {
2613
-		if (false !== stripos($v, $pk)) {
2614
-			$champ_pk = $k;
2615
-			// on n'en a plus besoin dans field, vu que defini dans key
2616
-			$champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2617
-			break;
2618
-		}
2619
-	}
2620
-
2621
-	if ($champ_pk) {
2622
-		$keys = "\n\t\t$pk ($champ_pk)";
2623
-	}
2624
-	// Pas de DEFAULT 0 sur les cles primaires en auto-increment
2625
-	if (
2626
-		isset($champs[$champ_pk])
2627
-		and stripos($champs[$champ_pk], 'default 0') !== false
2628
-	) {
2629
-		$champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2630
-	}
2631
-
2632
-	$champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2633
-	foreach ($champs as $k => $v) {
2634
-		$query .= "$s\n\t\t$k $v";
2635
-		$s = ',';
2636
-	}
2637
-
2638
-	$ifnotexists = '';
2639
-	if ($_ifnotexists) {
2640
-		$version = spip_sqlite_fetch(
2641
-			spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2642
-			'',
2643
-			$serveur
2644
-		);
2645
-		if (!function_exists('spip_version_compare')) {
2646
-			include_spip('plugins/installer');
2647
-		}
2648
-
2649
-		if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2650
-			$ifnotexists = ' IF NOT EXISTS';
2651
-		} else {
2652
-			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2653
-			$a = spip_sqlite_showtable($nom, $serveur);
2654
-			if (isset($a['key']['KEY ' . $nom])) {
2655
-				return true;
2656
-			}
2657
-		}
2658
-	}
2659
-
2660
-	$temporary = $temporary ? ' TEMPORARY' : '';
2661
-	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2662
-
2663
-	return $q;
2595
+    $query = $keys = $s = $p = '';
2596
+
2597
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
2598
+    // sans les renseigner (laisse le compilo recuperer la description)
2599
+    if (!is_array($champs) || !is_array($cles)) {
2600
+        return;
2601
+    }
2602
+
2603
+    // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2604
+    // il faut passer par des create index
2605
+    // Il gere par contre primary key !
2606
+    // Soit la PK est definie dans les cles, soit dans un champs
2607
+    // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2608
+    $pk = 'PRIMARY KEY';
2609
+    // le champ de cle primaire
2610
+    $champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2611
+
2612
+    foreach ($champs as $k => $v) {
2613
+        if (false !== stripos($v, $pk)) {
2614
+            $champ_pk = $k;
2615
+            // on n'en a plus besoin dans field, vu que defini dans key
2616
+            $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2617
+            break;
2618
+        }
2619
+    }
2620
+
2621
+    if ($champ_pk) {
2622
+        $keys = "\n\t\t$pk ($champ_pk)";
2623
+    }
2624
+    // Pas de DEFAULT 0 sur les cles primaires en auto-increment
2625
+    if (
2626
+        isset($champs[$champ_pk])
2627
+        and stripos($champs[$champ_pk], 'default 0') !== false
2628
+    ) {
2629
+        $champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2630
+    }
2631
+
2632
+    $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2633
+    foreach ($champs as $k => $v) {
2634
+        $query .= "$s\n\t\t$k $v";
2635
+        $s = ',';
2636
+    }
2637
+
2638
+    $ifnotexists = '';
2639
+    if ($_ifnotexists) {
2640
+        $version = spip_sqlite_fetch(
2641
+            spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2642
+            '',
2643
+            $serveur
2644
+        );
2645
+        if (!function_exists('spip_version_compare')) {
2646
+            include_spip('plugins/installer');
2647
+        }
2648
+
2649
+        if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2650
+            $ifnotexists = ' IF NOT EXISTS';
2651
+        } else {
2652
+            /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2653
+            $a = spip_sqlite_showtable($nom, $serveur);
2654
+            if (isset($a['key']['KEY ' . $nom])) {
2655
+                return true;
2656
+            }
2657
+        }
2658
+    }
2659
+
2660
+    $temporary = $temporary ? ' TEMPORARY' : '';
2661
+    $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2662
+
2663
+    return $q;
2664 2664
 }
2665 2665
 
2666 2666
 
@@ -2679,41 +2679,41 @@  discard block
 block discarded – undo
2679 2679
  * @return
2680 2680
  */
2681 2681
 function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') {
2682
-	static $tables = [];
2683
-
2684
-	if (!isset($tables[$table])) {
2685
-		if (!$desc) {
2686
-			$trouver_table = charger_fonction('trouver_table', 'base');
2687
-			$desc = $trouver_table($table, $serveur);
2688
-			// si pas de description, on ne fait rien, ou on die() ?
2689
-			if (!$desc) {
2690
-				return $couples;
2691
-			}
2692
-		}
2693
-
2694
-		// recherche des champs avec simplement 'TIMESTAMP'
2695
-		// cependant, il faudra peut etre etendre
2696
-		// avec la gestion de DEFAULT et ON UPDATE
2697
-		// mais ceux-ci ne sont pas utilises dans le core
2698
-		$tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2699
-
2700
-		$now = _sqlite_func_now(true);
2701
-		foreach ($desc['field'] as $k => $v) {
2702
-			if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2703
-				$tables[$table]['desc'][$k] = $v;
2704
-				$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2705
-			}
2706
-		}
2707
-	}
2708
-	else {
2709
-		$now = _sqlite_func_now(true);
2710
-		foreach (array_keys($tables[$table]['desc']) as $k) {
2711
-			$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2712
-		}
2713
-	}
2714
-
2715
-	// ajout des champs type 'timestamp' absents
2716
-	return array_merge($tables[$table]['valeur'], $couples);
2682
+    static $tables = [];
2683
+
2684
+    if (!isset($tables[$table])) {
2685
+        if (!$desc) {
2686
+            $trouver_table = charger_fonction('trouver_table', 'base');
2687
+            $desc = $trouver_table($table, $serveur);
2688
+            // si pas de description, on ne fait rien, ou on die() ?
2689
+            if (!$desc) {
2690
+                return $couples;
2691
+            }
2692
+        }
2693
+
2694
+        // recherche des champs avec simplement 'TIMESTAMP'
2695
+        // cependant, il faudra peut etre etendre
2696
+        // avec la gestion de DEFAULT et ON UPDATE
2697
+        // mais ceux-ci ne sont pas utilises dans le core
2698
+        $tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2699
+
2700
+        $now = _sqlite_func_now(true);
2701
+        foreach ($desc['field'] as $k => $v) {
2702
+            if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2703
+                $tables[$table]['desc'][$k] = $v;
2704
+                $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2705
+            }
2706
+        }
2707
+    }
2708
+    else {
2709
+        $now = _sqlite_func_now(true);
2710
+        foreach (array_keys($tables[$table]['desc']) as $k) {
2711
+            $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2712
+        }
2713
+    }
2714
+
2715
+    // ajout des champs type 'timestamp' absents
2716
+    return array_merge($tables[$table]['valeur'], $couples);
2717 2717
 }
2718 2718
 
2719 2719
 
@@ -2724,7 +2724,7 @@  discard block
 block discarded – undo
2724 2724
  * @return array|bool
2725 2725
  */
2726 2726
 function spip_versions_sqlite() {
2727
-	return _sqlite_charger_version();
2727
+    return _sqlite_charger_version();
2728 2728
 }
2729 2729
 
2730 2730
 /**
@@ -2732,114 +2732,114 @@  discard block
 block discarded – undo
2732 2732
  * encadrées de transactions.
2733 2733
  **/
2734 2734
 class spip_sqlite {
2735
-	/** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2736
-	public static $requeteurs = [];
2737
-	/** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2738
-	public static $transaction_en_cours = [];
2739
-
2740
-
2741
-	/**
2742
-	 * Retourne une unique instance du requêteur
2743
-	 *
2744
-	 * Retourne une instance unique du requêteur pour une connexion SQLite
2745
-	 * donnée
2746
-	 *
2747
-	 * @param string $serveur
2748
-	 *    Nom du connecteur
2749
-	 * @return sqlite_requeteur
2750
-	 *    Instance unique du requêteur
2751
-	 **/
2752
-	public static function requeteur($serveur) {
2753
-		if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2754
-			spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2755
-		}
2756
-
2757
-		return spip_sqlite::$requeteurs[$serveur];
2758
-	}
2759
-
2760
-	/**
2761
-	 * Prépare le texte d'une requête avant son exécution
2762
-	 *
2763
-	 * Adapte la requête au format plus ou moins MySQL par un format
2764
-	 * compris de SQLite.
2765
-	 *
2766
-	 * Change les préfixes de tables SPIP par ceux véritables
2767
-	 *
2768
-	 * @param string $query Requête à préparer
2769
-	 * @param string $serveur Nom de la connexion
2770
-	 * @return string           Requête préparée
2771
-	 */
2772
-	public static function traduire_requete($query, $serveur) {
2773
-		$requeteur = spip_sqlite::requeteur($serveur);
2774
-		$traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2775
-
2776
-		return $traducteur->traduire_requete();
2777
-	}
2778
-
2779
-	/**
2780
-	 * Démarre une transaction
2781
-	 *
2782
-	 * @param string $serveur Nom de la connexion
2783
-	 **/
2784
-	public static function demarrer_transaction($serveur) {
2785
-		spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur);
2786
-		spip_sqlite::$transaction_en_cours[$serveur] = true;
2787
-	}
2788
-
2789
-	/**
2790
-	 * Exécute la requête donnée
2791
-	 *
2792
-	 * @param string $query Requête
2793
-	 * @param string $serveur Nom de la connexion
2794
-	 * @param null|bool $tracer Demander des statistiques (temps) ?
2795
-	 **/
2796
-	public static function executer_requete($query, $serveur, $tracer = null) {
2797
-		$requeteur = spip_sqlite::requeteur($serveur);
2798
-
2799
-		return $requeteur->executer_requete($query, $tracer);
2800
-	}
2801
-
2802
-	/**
2803
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2804
-	 *
2805
-	 * @param string $serveur Nom de la connexion
2806
-	 * return int                Identifiant
2807
-	 **/
2808
-	public static function last_insert_id($serveur) {
2809
-		$requeteur = spip_sqlite::requeteur($serveur);
2810
-
2811
-		return $requeteur->last_insert_id($serveur);
2812
-	}
2813
-
2814
-	/**
2815
-	 * Annule une transaction
2816
-	 *
2817
-	 * @param string $serveur Nom de la connexion
2818
-	 **/
2819
-	public static function annuler_transaction($serveur) {
2820
-		spip_sqlite::executer_requete('ROLLBACK', $serveur);
2821
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2822
-	}
2823
-
2824
-	/**
2825
-	 * Termine une transaction
2826
-	 *
2827
-	 * @param string $serveur Nom de la connexion
2828
-	 **/
2829
-	public static function finir_transaction($serveur) {
2830
-		// si pas de transaction en cours, ne rien faire et le dire
2831
-		if (
2832
-			!isset(spip_sqlite::$transaction_en_cours[$serveur])
2833
-			or spip_sqlite::$transaction_en_cours[$serveur] == false
2834
-		) {
2835
-			return false;
2836
-		}
2837
-		// sinon fermer la transaction et retourner true
2838
-		spip_sqlite::executer_requete('COMMIT', $serveur);
2839
-		spip_sqlite::$transaction_en_cours[$serveur] = false;
2840
-
2841
-		return true;
2842
-	}
2735
+    /** @var sqlite_requeteur[] Liste des instances de requêteurs créés */
2736
+    public static $requeteurs = [];
2737
+    /** @var bool[] Pour chaque connexion, flag pour savoir si une transaction est en cours */
2738
+    public static $transaction_en_cours = [];
2739
+
2740
+
2741
+    /**
2742
+     * Retourne une unique instance du requêteur
2743
+     *
2744
+     * Retourne une instance unique du requêteur pour une connexion SQLite
2745
+     * donnée
2746
+     *
2747
+     * @param string $serveur
2748
+     *    Nom du connecteur
2749
+     * @return sqlite_requeteur
2750
+     *    Instance unique du requêteur
2751
+     **/
2752
+    public static function requeteur($serveur) {
2753
+        if (!isset(spip_sqlite::$requeteurs[$serveur])) {
2754
+            spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur);
2755
+        }
2756
+
2757
+        return spip_sqlite::$requeteurs[$serveur];
2758
+    }
2759
+
2760
+    /**
2761
+     * Prépare le texte d'une requête avant son exécution
2762
+     *
2763
+     * Adapte la requête au format plus ou moins MySQL par un format
2764
+     * compris de SQLite.
2765
+     *
2766
+     * Change les préfixes de tables SPIP par ceux véritables
2767
+     *
2768
+     * @param string $query Requête à préparer
2769
+     * @param string $serveur Nom de la connexion
2770
+     * @return string           Requête préparée
2771
+     */
2772
+    public static function traduire_requete($query, $serveur) {
2773
+        $requeteur = spip_sqlite::requeteur($serveur);
2774
+        $traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version);
2775
+
2776
+        return $traducteur->traduire_requete();
2777
+    }
2778
+
2779
+    /**
2780
+     * Démarre une transaction
2781
+     *
2782
+     * @param string $serveur Nom de la connexion
2783
+     **/
2784
+    public static function demarrer_transaction($serveur) {
2785
+        spip_sqlite::executer_requete('BEGIN TRANSACTION', $serveur);
2786
+        spip_sqlite::$transaction_en_cours[$serveur] = true;
2787
+    }
2788
+
2789
+    /**
2790
+     * Exécute la requête donnée
2791
+     *
2792
+     * @param string $query Requête
2793
+     * @param string $serveur Nom de la connexion
2794
+     * @param null|bool $tracer Demander des statistiques (temps) ?
2795
+     **/
2796
+    public static function executer_requete($query, $serveur, $tracer = null) {
2797
+        $requeteur = spip_sqlite::requeteur($serveur);
2798
+
2799
+        return $requeteur->executer_requete($query, $tracer);
2800
+    }
2801
+
2802
+    /**
2803
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2804
+     *
2805
+     * @param string $serveur Nom de la connexion
2806
+     * return int                Identifiant
2807
+     **/
2808
+    public static function last_insert_id($serveur) {
2809
+        $requeteur = spip_sqlite::requeteur($serveur);
2810
+
2811
+        return $requeteur->last_insert_id($serveur);
2812
+    }
2813
+
2814
+    /**
2815
+     * Annule une transaction
2816
+     *
2817
+     * @param string $serveur Nom de la connexion
2818
+     **/
2819
+    public static function annuler_transaction($serveur) {
2820
+        spip_sqlite::executer_requete('ROLLBACK', $serveur);
2821
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2822
+    }
2823
+
2824
+    /**
2825
+     * Termine une transaction
2826
+     *
2827
+     * @param string $serveur Nom de la connexion
2828
+     **/
2829
+    public static function finir_transaction($serveur) {
2830
+        // si pas de transaction en cours, ne rien faire et le dire
2831
+        if (
2832
+            !isset(spip_sqlite::$transaction_en_cours[$serveur])
2833
+            or spip_sqlite::$transaction_en_cours[$serveur] == false
2834
+        ) {
2835
+            return false;
2836
+        }
2837
+        // sinon fermer la transaction et retourner true
2838
+        spip_sqlite::executer_requete('COMMIT', $serveur);
2839
+        spip_sqlite::$transaction_en_cours[$serveur] = false;
2840
+
2841
+        return true;
2842
+    }
2843 2843
 }
2844 2844
 
2845 2845
 /*
@@ -2852,127 +2852,127 @@  discard block
 block discarded – undo
2852 2852
  */
2853 2853
 
2854 2854
 class sqlite_requeteur {
2855
-	/** @var string Texte de la requête */
2856
-	public $query = ''; // la requete
2857
-	/** @var string Nom de la connexion */
2858
-	public $serveur = '';
2859
-	/** @var PDO Identifiant de la connexion SQLite */
2860
-	public $link = '';
2861
-	/** @var string Prefixe des tables SPIP */
2862
-	public $prefixe = '';
2863
-	/** @var string Nom de la base de donnée */
2864
-	public $db = '';
2865
-	/** @var bool Doit-on tracer les requetes (var_profile) ? */
2866
-	public $tracer = false; // doit-on tracer les requetes (var_profile)
2867
-
2868
-	/** @var string Version de SQLite (2 ou 3) */
2869
-	public $sqlite_version = '';
2870
-
2871
-	/**
2872
-	 * Constructeur
2873
-	 *
2874
-	 * @param string $serveur
2875
-	 * @return bool
2876
-	 */
2877
-	public function __construct($serveur = '') {
2878
-		_sqlite_init();
2879
-		$this->serveur = strtolower($serveur);
2880
-
2881
-		if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2882
-			spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
2883
-
2884
-			return false;
2885
-		}
2886
-
2887
-		$this->sqlite_version = _sqlite_is_version('', $this->link);
2888
-
2889
-		$this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2890
-		$this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2891
-
2892
-		// tracage des requetes ?
2893
-		$this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2894
-	}
2895
-
2896
-	/**
2897
-	 * Lancer la requête transmise et faire le tracage si demandé
2898
-	 *
2899
-	 * @param string $query
2900
-	 *     Requête à exécuter
2901
-	 * @param bool|null $tracer
2902
-	 *     true pour tracer la requête
2903
-	 * @return bool|PDOStatement|array
2904
-	 */
2905
-	public function executer_requete($query, $tracer = null) {
2906
-		if (is_null($tracer)) {
2907
-			$tracer = $this->tracer;
2908
-		}
2909
-		$err = '';
2910
-		$t = 0;
2911
-		if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
2912
-			include_spip('public/tracer');
2913
-			$t = trace_query_start();
2914
-		}
2915
-
2916
-		# spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2917
-		if ($this->link) {
2918
-			// memoriser la derniere erreur PHP vue
2919
-			$last_error = (function_exists('error_get_last') ? error_get_last() : '');
2920
-			$e = null;
2921
-			// sauver la derniere requete
2922
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2923
-			$GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2924
-
2925
-			try {
2926
-				$r = $this->link->query($query);
2927
-			} catch (\PDOException $e) {
2928
-				spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
2929
-				$r = false;
2930
-			}
2931
-			// sauvegarde de la requete (elle y est deja dans $r->queryString)
2932
-			# $r->spipQueryString = $query;
2933
-
2934
-			// comptage : oblige de compter le nombre d'entrees retournees
2935
-			// par une requete SELECT
2936
-			// aucune autre solution ne donne le nombre attendu :( !
2937
-			// particulierement s'il y a des LIMIT dans la requete.
2938
-			if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2939
-				if ($r) {
2940
-					// noter le link et la query pour faire le comptage *si* on en a besoin
2941
-					$r->spipSqliteRowCount = [$this->link, $query];
2942
-				} elseif ($r instanceof PDOStatement) {
2943
-					$r->spipSqliteRowCount = 0;
2944
-				}
2945
-			}
2946
-
2947
-			// loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2948
-			if ($e and $e instanceof \PDOException) {
2949
-				$err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
2950
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2951
-			} elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) {
2952
-				$err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
2953
-				spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2954
-			} else {
2955
-				$err = '';
2956
-			}
2957
-		} else {
2958
-			$r = false;
2959
-		}
2960
-
2961
-		if (spip_sqlite_errno($this->serveur)) {
2962
-			$err .= spip_sqlite_error($query, $this->serveur);
2963
-		}
2964
-
2965
-		return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2966
-	}
2967
-
2968
-	/**
2969
-	 * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2970
-	 *
2971
-	 * @return string|false
2972
-	 **/
2973
-	public function last_insert_id() {
2974
-		return $this->link->lastInsertId();
2975
-	}
2855
+    /** @var string Texte de la requête */
2856
+    public $query = ''; // la requete
2857
+    /** @var string Nom de la connexion */
2858
+    public $serveur = '';
2859
+    /** @var PDO Identifiant de la connexion SQLite */
2860
+    public $link = '';
2861
+    /** @var string Prefixe des tables SPIP */
2862
+    public $prefixe = '';
2863
+    /** @var string Nom de la base de donnée */
2864
+    public $db = '';
2865
+    /** @var bool Doit-on tracer les requetes (var_profile) ? */
2866
+    public $tracer = false; // doit-on tracer les requetes (var_profile)
2867
+
2868
+    /** @var string Version de SQLite (2 ou 3) */
2869
+    public $sqlite_version = '';
2870
+
2871
+    /**
2872
+     * Constructeur
2873
+     *
2874
+     * @param string $serveur
2875
+     * @return bool
2876
+     */
2877
+    public function __construct($serveur = '') {
2878
+        _sqlite_init();
2879
+        $this->serveur = strtolower($serveur);
2880
+
2881
+        if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) {
2882
+            spip_log('Aucune connexion sqlite (link)', 'sqlite.' . _LOG_ERREUR);
2883
+
2884
+            return false;
2885
+        }
2886
+
2887
+        $this->sqlite_version = _sqlite_is_version('', $this->link);
2888
+
2889
+        $this->prefixe = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['prefixe'];
2890
+        $this->db = $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['db'];
2891
+
2892
+        // tracage des requetes ?
2893
+        $this->tracer = (isset($_GET['var_profile']) && $_GET['var_profile']);
2894
+    }
2895
+
2896
+    /**
2897
+     * Lancer la requête transmise et faire le tracage si demandé
2898
+     *
2899
+     * @param string $query
2900
+     *     Requête à exécuter
2901
+     * @param bool|null $tracer
2902
+     *     true pour tracer la requête
2903
+     * @return bool|PDOStatement|array
2904
+     */
2905
+    public function executer_requete($query, $tracer = null) {
2906
+        if (is_null($tracer)) {
2907
+            $tracer = $this->tracer;
2908
+        }
2909
+        $err = '';
2910
+        $t = 0;
2911
+        if ($tracer or (defined('_DEBUG_TRACE_QUERIES') and _DEBUG_TRACE_QUERIES)) {
2912
+            include_spip('public/tracer');
2913
+            $t = trace_query_start();
2914
+        }
2915
+
2916
+        # spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ?
2917
+        if ($this->link) {
2918
+            // memoriser la derniere erreur PHP vue
2919
+            $last_error = (function_exists('error_get_last') ? error_get_last() : '');
2920
+            $e = null;
2921
+            // sauver la derniere requete
2922
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query;
2923
+            $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++;
2924
+
2925
+            try {
2926
+                $r = $this->link->query($query);
2927
+            } catch (\PDOException $e) {
2928
+                spip_log('PDOException: ' . $e->getMessage(), 'sqlite.' . _LOG_DEBUG);
2929
+                $r = false;
2930
+            }
2931
+            // sauvegarde de la requete (elle y est deja dans $r->queryString)
2932
+            # $r->spipQueryString = $query;
2933
+
2934
+            // comptage : oblige de compter le nombre d'entrees retournees
2935
+            // par une requete SELECT
2936
+            // aucune autre solution ne donne le nombre attendu :( !
2937
+            // particulierement s'il y a des LIMIT dans la requete.
2938
+            if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') {
2939
+                if ($r) {
2940
+                    // noter le link et la query pour faire le comptage *si* on en a besoin
2941
+                    $r->spipSqliteRowCount = [$this->link, $query];
2942
+                } elseif ($r instanceof PDOStatement) {
2943
+                    $r->spipSqliteRowCount = 0;
2944
+                }
2945
+            }
2946
+
2947
+            // loger les warnings/erreurs eventuels de sqlite remontant dans PHP
2948
+            if ($e and $e instanceof \PDOException) {
2949
+                $err = strip_tags($e->getMessage()) . ' in ' . $e->getFile() . ' line ' . $e->getLine();
2950
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2951
+            } elseif ($err = (function_exists('error_get_last') ? error_get_last() : '') and $err != $last_error) {
2952
+                $err = strip_tags($err['message']) . ' in ' . $err['file'] . ' line ' . $err['line'];
2953
+                spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR);
2954
+            } else {
2955
+                $err = '';
2956
+            }
2957
+        } else {
2958
+            $r = false;
2959
+        }
2960
+
2961
+        if (spip_sqlite_errno($this->serveur)) {
2962
+            $err .= spip_sqlite_error($query, $this->serveur);
2963
+        }
2964
+
2965
+        return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r;
2966
+    }
2967
+
2968
+    /**
2969
+     * Obtient l'identifiant de la dernière ligne insérée ou modifiée
2970
+     *
2971
+     * @return string|false
2972
+     **/
2973
+    public function last_insert_id() {
2974
+        return $this->link->lastInsertId();
2975
+    }
2976 2976
 }
2977 2977
 
2978 2978
 
@@ -2982,206 +2982,206 @@  discard block
 block discarded – undo
2982 2982
  * (fonction pour proteger les textes)
2983 2983
  */
2984 2984
 class sqlite_traducteur {
2985
-	/** @var string $query Texte de la requête */
2986
-	public $query = '';
2987
-	/** @var string $prefixe Préfixe des tables */
2988
-	public $prefixe = '';
2989
-	/** @var string $sqlite_version Version de sqlite (2 ou 3) */
2990
-	public $sqlite_version = '';
2991
-
2992
-	/** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
2993
-	 *
2994
-	 * @var array
2995
-	 */
2996
-	public $textes = [];
2997
-
2998
-	/**
2999
-	 * Constructeur
3000
-	 *
3001
-	 * @param string $query Requête à préparer
3002
-	 * @param string $prefixe Prefixe des tables à utiliser
3003
-	 * @param string $sqlite_version Version SQLite (2 ou 3)
3004
-	 */
3005
-	public function __construct($query, $prefixe, $sqlite_version) {
3006
-		$this->query = $query;
3007
-		$this->prefixe = $prefixe;
3008
-		$this->sqlite_version = $sqlite_version;
3009
-	}
3010
-
3011
-	/**
3012
-	 * Transformer la requete pour SQLite
3013
-	 *
3014
-	 * Enlève les textes, transforme la requête pour quelle soit
3015
-	 * bien interprétée par SQLite, puis remet les textes
3016
-	 * la fonction affecte `$this->query`
3017
-	 */
3018
-	public function traduire_requete() {
3019
-		//
3020
-		// 1) Protection des textes en les remplacant par des codes
3021
-		//
3022
-		// enlever les 'textes' et initialiser avec
3023
-		list($this->query, $textes) = query_echappe_textes($this->query);
3024
-
3025
-		//
3026
-		// 2) Corrections de la requete
3027
-		//
3028
-		// Correction Create Database
3029
-		// Create Database -> requete ignoree
3030
-		if (strpos($this->query, 'CREATE DATABASE') === 0) {
3031
-			spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
3032
-			$this->query = 'SELECT 1';
3033
-		}
3034
-
3035
-		// Correction Insert Ignore
3036
-		// INSERT IGNORE -> insert (tout court et pas 'insert or replace')
3037
-		if (strpos($this->query, 'INSERT IGNORE') === 0) {
3038
-			spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
3039
-			$this->query = 'INSERT ' . substr($this->query, '13');
3040
-		}
3041
-
3042
-		// Correction des dates avec INTERVAL
3043
-		// utiliser sql_date_proche() de preference
3044
-		if (strpos($this->query, 'INTERVAL') !== false) {
3045
-			$this->query = preg_replace_callback(
3046
-				'/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
3047
-				[&$this, '_remplacerDateParTime'],
3048
-				$this->query
3049
-			);
3050
-		}
3051
-
3052
-		if (strpos($this->query, 'LEFT(') !== false) {
3053
-			$this->query = str_replace('LEFT(', '_LEFT(', $this->query);
3054
-		}
3055
-
3056
-		if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
3057
-			$this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
3058
-		}
3059
-
3060
-
3061
-		// Correction Using
3062
-		// USING (non reconnu en sqlite2)
3063
-		// problematique car la jointure ne se fait pas du coup.
3064
-		if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) {
3065
-			spip_log(
3066
-				"'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
3067
-				'sqlite.' . _LOG_ERREUR
3068
-			);
3069
-			$this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
3070
-		}
3071
-
3072
-		// Correction Field
3073
-		// remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
3074
-		if (strpos($this->query, 'FIELD') !== false) {
3075
-			$this->query = preg_replace_callback(
3076
-				'/FIELD\s*\(([^\)]*)\)/',
3077
-				[&$this, '_remplacerFieldParCase'],
3078
-				$this->query
3079
-			);
3080
-		}
3081
-
3082
-		// Correction des noms de tables FROM
3083
-		// mettre les bons noms de table dans from, update, insert, replace...
3084
-		if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
3085
-			$suite = strstr($this->query, $regs[0]);
3086
-			$this->query = substr($this->query, 0, -strlen($suite));
3087
-		} else {
3088
-			$suite = '';
3089
-		}
3090
-		$pref = ($this->prefixe) ? $this->prefixe . '_' : '';
3091
-		$this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
3092
-
3093
-		// Correction zero AS x
3094
-		// pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
3095
-		// n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
3096
-		// il dit que x ne doit pas être un integer dans le order by !
3097
-		// on remplace du coup x par vide() dans ce cas uniquement
3098
-		//
3099
-		// apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
3100
-		// mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
3101
-		if ((strpos($this->query, '0 AS') !== false)) {
3102
-			// on ne remplace que dans ORDER BY ou GROUP BY
3103
-			if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
3104
-				$suite = strstr($this->query, $regs[0]);
3105
-				$this->query = substr($this->query, 0, -strlen($suite));
3106
-
3107
-				// on cherche les noms des x dans 0 AS x
3108
-				// on remplace dans $suite le nom par vide()
3109
-				preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3110
-				foreach ($matches[1] as $m) {
3111
-					if (strpos($suite, $m) !== false) {
3112
-						$suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
3113
-					}
3114
-				}
3115
-				$this->query .= $suite;
3116
-			}
3117
-		}
3118
-
3119
-		// Correction possible des divisions entieres
3120
-		// Le standard SQL (lequel? ou?) semble indiquer que
3121
-		// a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3122
-		// C'est ce que retournent effectivement SQL Server et SQLite
3123
-		// Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3124
-		//
3125
-		// On peut forcer la conversion en multipliant par 1.0 avant la division
3126
-		// /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
3127
-		// cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3128
-		//     http://www.sqlite.org/cvstrac/tktview?tn=3202
3129
-		// (4*1.0/3) n'est pas rendu dans ce cas !
3130
-		# $this->query = str_replace('/','* 1.00 / ',$this->query);
3131
-
3132
-
3133
-		// Correction critere REGEXP, non reconnu en sqlite2
3134
-		if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3135
-			$this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3136
-		}
3137
-
3138
-		//
3139
-		// 3) Remise en place des textes d'origine
3140
-		//
3141
-		// Correction Antiquotes et echappements
3142
-		// ` => rien
3143
-		if (strpos($this->query, '`') !== false) {
3144
-			$this->query = str_replace('`', '', $this->query);
3145
-		}
3146
-
3147
-		$this->query = query_reinjecte_textes($this->query, $textes);
3148
-
3149
-		return $this->query;
3150
-	}
3151
-
3152
-
3153
-	/**
3154
-	 * Callback pour remplacer `DATE_` / `INTERVAL`
3155
-	 * par `DATE ... strtotime`
3156
-	 *
3157
-	 * @param array $matches Captures
3158
-	 * @return string Texte de date compris par SQLite
3159
-	 */
3160
-	public function _remplacerDateParTime($matches) {
3161
-		$op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3162
-
3163
-		return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3164
-	}
3165
-
3166
-	/**
3167
-	 * Callback pour remplacer `FIELD(table,i,j,k...)`
3168
-	 * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3169
-	 *
3170
-	 * @param array $matches Captures
3171
-	 * @return string Texte de liste ordonnée compris par SQLite
3172
-	 */
3173
-	public function _remplacerFieldParCase($matches) {
3174
-		$fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3175
-		$t = explode(',', $fields);
3176
-		$index = array_shift($t);
3177
-
3178
-		$res = '';
3179
-		$n = 0;
3180
-		foreach ($t as $v) {
3181
-			$n++;
3182
-			$res .= "\nWHEN $index=$v THEN $n";
3183
-		}
3184
-
3185
-		return "CASE $res ELSE 0 END ";
3186
-	}
2985
+    /** @var string $query Texte de la requête */
2986
+    public $query = '';
2987
+    /** @var string $prefixe Préfixe des tables */
2988
+    public $prefixe = '';
2989
+    /** @var string $sqlite_version Version de sqlite (2 ou 3) */
2990
+    public $sqlite_version = '';
2991
+
2992
+    /** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé
2993
+     *
2994
+     * @var array
2995
+     */
2996
+    public $textes = [];
2997
+
2998
+    /**
2999
+     * Constructeur
3000
+     *
3001
+     * @param string $query Requête à préparer
3002
+     * @param string $prefixe Prefixe des tables à utiliser
3003
+     * @param string $sqlite_version Version SQLite (2 ou 3)
3004
+     */
3005
+    public function __construct($query, $prefixe, $sqlite_version) {
3006
+        $this->query = $query;
3007
+        $this->prefixe = $prefixe;
3008
+        $this->sqlite_version = $sqlite_version;
3009
+    }
3010
+
3011
+    /**
3012
+     * Transformer la requete pour SQLite
3013
+     *
3014
+     * Enlève les textes, transforme la requête pour quelle soit
3015
+     * bien interprétée par SQLite, puis remet les textes
3016
+     * la fonction affecte `$this->query`
3017
+     */
3018
+    public function traduire_requete() {
3019
+        //
3020
+        // 1) Protection des textes en les remplacant par des codes
3021
+        //
3022
+        // enlever les 'textes' et initialiser avec
3023
+        list($this->query, $textes) = query_echappe_textes($this->query);
3024
+
3025
+        //
3026
+        // 2) Corrections de la requete
3027
+        //
3028
+        // Correction Create Database
3029
+        // Create Database -> requete ignoree
3030
+        if (strpos($this->query, 'CREATE DATABASE') === 0) {
3031
+            spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT);
3032
+            $this->query = 'SELECT 1';
3033
+        }
3034
+
3035
+        // Correction Insert Ignore
3036
+        // INSERT IGNORE -> insert (tout court et pas 'insert or replace')
3037
+        if (strpos($this->query, 'INSERT IGNORE') === 0) {
3038
+            spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG);
3039
+            $this->query = 'INSERT ' . substr($this->query, '13');
3040
+        }
3041
+
3042
+        // Correction des dates avec INTERVAL
3043
+        // utiliser sql_date_proche() de preference
3044
+        if (strpos($this->query, 'INTERVAL') !== false) {
3045
+            $this->query = preg_replace_callback(
3046
+                '/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U',
3047
+                [&$this, '_remplacerDateParTime'],
3048
+                $this->query
3049
+            );
3050
+        }
3051
+
3052
+        if (strpos($this->query, 'LEFT(') !== false) {
3053
+            $this->query = str_replace('LEFT(', '_LEFT(', $this->query);
3054
+        }
3055
+
3056
+        if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) {
3057
+            $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query);
3058
+        }
3059
+
3060
+
3061
+        // Correction Using
3062
+        // USING (non reconnu en sqlite2)
3063
+        // problematique car la jointure ne se fait pas du coup.
3064
+        if (($this->sqlite_version == 2) && (strpos($this->query, 'USING') !== false)) {
3065
+            spip_log(
3066
+                "'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'",
3067
+                'sqlite.' . _LOG_ERREUR
3068
+            );
3069
+            $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query);
3070
+        }
3071
+
3072
+        // Correction Field
3073
+        // remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END
3074
+        if (strpos($this->query, 'FIELD') !== false) {
3075
+            $this->query = preg_replace_callback(
3076
+                '/FIELD\s*\(([^\)]*)\)/',
3077
+                [&$this, '_remplacerFieldParCase'],
3078
+                $this->query
3079
+            );
3080
+        }
3081
+
3082
+        // Correction des noms de tables FROM
3083
+        // mettre les bons noms de table dans from, update, insert, replace...
3084
+        if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) {
3085
+            $suite = strstr($this->query, $regs[0]);
3086
+            $this->query = substr($this->query, 0, -strlen($suite));
3087
+        } else {
3088
+            $suite = '';
3089
+        }
3090
+        $pref = ($this->prefixe) ? $this->prefixe . '_' : '';
3091
+        $this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite;
3092
+
3093
+        // Correction zero AS x
3094
+        // pg n'aime pas 0+x AS alias, sqlite, dans le meme style,
3095
+        // n'apprecie pas du tout SELECT 0 as x ... ORDER BY x
3096
+        // il dit que x ne doit pas être un integer dans le order by !
3097
+        // on remplace du coup x par vide() dans ce cas uniquement
3098
+        //
3099
+        // apparait dans public/vertebrer.php et dans le plugin menu aussi qui genere aussi ce genre de requete via un {par num #GET{tri_num}}
3100
+        // mais est-ce encore un soucis pour sqlite en 2021 ? (ie commenter le preg_replace marche très bien en sqlite 3.28)
3101
+        if ((strpos($this->query, '0 AS') !== false)) {
3102
+            // on ne remplace que dans ORDER BY ou GROUP BY
3103
+            if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) {
3104
+                $suite = strstr($this->query, $regs[0]);
3105
+                $this->query = substr($this->query, 0, -strlen($suite));
3106
+
3107
+                // on cherche les noms des x dans 0 AS x
3108
+                // on remplace dans $suite le nom par vide()
3109
+                preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER);
3110
+                foreach ($matches[1] as $m) {
3111
+                    if (strpos($suite, $m) !== false) {
3112
+                        $suite = preg_replace(",\b$m\b,", 'VIDE()', $suite);
3113
+                    }
3114
+                }
3115
+                $this->query .= $suite;
3116
+            }
3117
+        }
3118
+
3119
+        // Correction possible des divisions entieres
3120
+        // Le standard SQL (lequel? ou?) semble indiquer que
3121
+        // a/b=c doit donner c entier si a et b sont entiers 4/3=1.
3122
+        // C'est ce que retournent effectivement SQL Server et SQLite
3123
+        // Ce n'est pas ce qu'applique MySQL qui retourne un reel : 4/3=1.333...
3124
+        //
3125
+        // On peut forcer la conversion en multipliant par 1.0 avant la division
3126
+        // /!\ SQLite 3.5.9 Debian/Ubuntu est victime d'un bug en plus !
3127
+        // cf. https://bugs.launchpad.net/ubuntu/+source/sqlite3/+bug/254228
3128
+        //     http://www.sqlite.org/cvstrac/tktview?tn=3202
3129
+        // (4*1.0/3) n'est pas rendu dans ce cas !
3130
+        # $this->query = str_replace('/','* 1.00 / ',$this->query);
3131
+
3132
+
3133
+        // Correction critere REGEXP, non reconnu en sqlite2
3134
+        if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) {
3135
+            $this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query);
3136
+        }
3137
+
3138
+        //
3139
+        // 3) Remise en place des textes d'origine
3140
+        //
3141
+        // Correction Antiquotes et echappements
3142
+        // ` => rien
3143
+        if (strpos($this->query, '`') !== false) {
3144
+            $this->query = str_replace('`', '', $this->query);
3145
+        }
3146
+
3147
+        $this->query = query_reinjecte_textes($this->query, $textes);
3148
+
3149
+        return $this->query;
3150
+    }
3151
+
3152
+
3153
+    /**
3154
+     * Callback pour remplacer `DATE_` / `INTERVAL`
3155
+     * par `DATE ... strtotime`
3156
+     *
3157
+     * @param array $matches Captures
3158
+     * @return string Texte de date compris par SQLite
3159
+     */
3160
+    public function _remplacerDateParTime($matches) {
3161
+        $op = strtoupper($matches[1] == 'ADD') ? '+' : '-';
3162
+
3163
+        return "datetime$matches[2] '$op$matches[3] $matches[4]')";
3164
+    }
3165
+
3166
+    /**
3167
+     * Callback pour remplacer `FIELD(table,i,j,k...)`
3168
+     * par `CASE WHEN table=i THEN n ... ELSE 0 END`
3169
+     *
3170
+     * @param array $matches Captures
3171
+     * @return string Texte de liste ordonnée compris par SQLite
3172
+     */
3173
+    public function _remplacerFieldParCase($matches) {
3174
+        $fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X)
3175
+        $t = explode(',', $fields);
3176
+        $index = array_shift($t);
3177
+
3178
+        $res = '';
3179
+        $n = 0;
3180
+        foreach ($t as $v) {
3181
+            $n++;
3182
+            $res .= "\nWHEN $index=$v THEN $n";
3183
+        }
3184
+
3185
+        return "CASE $res ELSE 0 END ";
3186
+    }
3187 3187
 }
Please login to merge, or discard this patch.
ecrire/base/upgrade.php 1 patch
Indentation   +282 added lines, -282 removed lines patch added patch discarded remove patch
@@ -17,17 +17,17 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 if (!defined('_UPGRADE_TIME_OUT')) {
24
-	/**
25
-	 * Durée en secondes pour relancer les scripts de mises à jour, x secondes
26
-	 * avant que la durée d'exécution du script provoque un timeout
27
-	 *
28
-	 * @var int
29
-	 **/
30
-	define('_UPGRADE_TIME_OUT', 20);
24
+    /**
25
+     * Durée en secondes pour relancer les scripts de mises à jour, x secondes
26
+     * avant que la durée d'exécution du script provoque un timeout
27
+     *
28
+     * @var int
29
+     **/
30
+    define('_UPGRADE_TIME_OUT', 20);
31 31
 }
32 32
 
33 33
 /**
@@ -50,40 +50,40 @@  discard block
 block discarded – undo
50 50
  * @return void
51 51
  */
52 52
 function base_upgrade_dist($titre = '', $reprise = '') {
53
-	if (!$titre) {
54
-		return;
55
-	} // anti-testeur automatique
56
-	if ($GLOBALS['spip_version_base'] != $GLOBALS['meta']['version_installee']) {
57
-		if (!is_numeric(_request('reinstall'))) {
58
-			include_spip('base/create');
59
-			spip_log('recree les tables eventuellement disparues', 'maj.' . _LOG_INFO_IMPORTANTE);
60
-			creer_base();
61
-		}
62
-
63
-		// quand on rentre par ici, c'est toujours une mise a jour de SPIP
64
-		// lancement de l'upgrade SPIP
65
-		$res = maj_base();
66
-
67
-		if ($res) {
68
-			// on arrete tout ici !
69
-			exit;
70
-		}
71
-	}
72
-	spip_log('Fin de mise a jour SQL. Debut m-a-j acces et config', 'maj.' . _LOG_INFO_IMPORTANTE);
73
-
74
-	// supprimer quelques fichiers temporaires qui peuvent se retrouver invalides
75
-	@spip_unlink(_CACHE_RUBRIQUES);
76
-	@spip_unlink(_CACHE_PIPELINES);
77
-	@spip_unlink(_CACHE_PLUGINS_PATH);
78
-	@spip_unlink(_CACHE_PLUGINS_OPT);
79
-	@spip_unlink(_CACHE_PLUGINS_FCT);
80
-	@spip_unlink(_CACHE_CHEMIN);
81
-	@spip_unlink(_DIR_TMP . 'plugin_xml_cache.gz');
82
-
83
-	include_spip('inc/auth');
84
-	auth_synchroniser_distant();
85
-	$config = charger_fonction('config', 'inc');
86
-	$config();
53
+    if (!$titre) {
54
+        return;
55
+    } // anti-testeur automatique
56
+    if ($GLOBALS['spip_version_base'] != $GLOBALS['meta']['version_installee']) {
57
+        if (!is_numeric(_request('reinstall'))) {
58
+            include_spip('base/create');
59
+            spip_log('recree les tables eventuellement disparues', 'maj.' . _LOG_INFO_IMPORTANTE);
60
+            creer_base();
61
+        }
62
+
63
+        // quand on rentre par ici, c'est toujours une mise a jour de SPIP
64
+        // lancement de l'upgrade SPIP
65
+        $res = maj_base();
66
+
67
+        if ($res) {
68
+            // on arrete tout ici !
69
+            exit;
70
+        }
71
+    }
72
+    spip_log('Fin de mise a jour SQL. Debut m-a-j acces et config', 'maj.' . _LOG_INFO_IMPORTANTE);
73
+
74
+    // supprimer quelques fichiers temporaires qui peuvent se retrouver invalides
75
+    @spip_unlink(_CACHE_RUBRIQUES);
76
+    @spip_unlink(_CACHE_PIPELINES);
77
+    @spip_unlink(_CACHE_PLUGINS_PATH);
78
+    @spip_unlink(_CACHE_PLUGINS_OPT);
79
+    @spip_unlink(_CACHE_PLUGINS_FCT);
80
+    @spip_unlink(_CACHE_CHEMIN);
81
+    @spip_unlink(_DIR_TMP . 'plugin_xml_cache.gz');
82
+
83
+    include_spip('inc/auth');
84
+    auth_synchroniser_distant();
85
+    $config = charger_fonction('config', 'inc');
86
+    $config();
87 87
 }
88 88
 
89 89
 /**
@@ -114,51 +114,51 @@  discard block
 block discarded – undo
114 114
  */
115 115
 function maj_base($version_cible = 0, $redirect = '', $debut_page = true) {
116 116
 
117
-	$version_installee = $GLOBALS['meta']['version_installee'] ?? null;
118
-
119
-	spip_log(
120
-		"Version anterieure: $version_installee. Courante: " . $GLOBALS['spip_version_base'],
121
-		'maj.' . _LOG_INFO_IMPORTANTE
122
-	);
123
-	if (!$version_installee or ($GLOBALS['spip_version_base'] < $version_installee)) {
124
-		sql_replace(
125
-			'spip_meta',
126
-			[
127
-				'nom' => 'version_installee',
128
-				'valeur' => $GLOBALS['spip_version_base'],
129
-				'impt' => 'non'
130
-			]
131
-		);
132
-		return false;
133
-	}
134
-	if (!upgrade_test()) {
135
-		return true;
136
-	}
137
-
138
-	$cible = ($version_cible ?: $GLOBALS['spip_version_base']);
139
-
140
-	if ($version_installee < 2021_01_01_00) {
141
-		include_spip('maj/legacy/v21');
142
-		include_spip('maj/legacy/v30');
143
-		include_spip('maj/legacy/v31');
144
-		include_spip('maj/legacy/v32');
145
-		include_spip('maj/legacy/v40');
146
-	}
147
-
148
-	include_spip('maj/2021');
149
-
150
-	ksort($GLOBALS['maj']);
151
-	$res = maj_while($version_installee, $cible, $GLOBALS['maj'], 'version_installee', 'meta', $redirect, $debut_page);
152
-	if ($res) {
153
-		if (!is_array($res)) {
154
-			spip_log("Pb d'acces SQL a la mise a jour", 'maj.' . _LOG_ERREUR);
155
-		} else {
156
-			echo _T('avis_operation_echec') . ' ' . join(' ', $res);
157
-			echo install_fin_html();
158
-		}
159
-	}
160
-
161
-	return $res;
117
+    $version_installee = $GLOBALS['meta']['version_installee'] ?? null;
118
+
119
+    spip_log(
120
+        "Version anterieure: $version_installee. Courante: " . $GLOBALS['spip_version_base'],
121
+        'maj.' . _LOG_INFO_IMPORTANTE
122
+    );
123
+    if (!$version_installee or ($GLOBALS['spip_version_base'] < $version_installee)) {
124
+        sql_replace(
125
+            'spip_meta',
126
+            [
127
+                'nom' => 'version_installee',
128
+                'valeur' => $GLOBALS['spip_version_base'],
129
+                'impt' => 'non'
130
+            ]
131
+        );
132
+        return false;
133
+    }
134
+    if (!upgrade_test()) {
135
+        return true;
136
+    }
137
+
138
+    $cible = ($version_cible ?: $GLOBALS['spip_version_base']);
139
+
140
+    if ($version_installee < 2021_01_01_00) {
141
+        include_spip('maj/legacy/v21');
142
+        include_spip('maj/legacy/v30');
143
+        include_spip('maj/legacy/v31');
144
+        include_spip('maj/legacy/v32');
145
+        include_spip('maj/legacy/v40');
146
+    }
147
+
148
+    include_spip('maj/2021');
149
+
150
+    ksort($GLOBALS['maj']);
151
+    $res = maj_while($version_installee, $cible, $GLOBALS['maj'], 'version_installee', 'meta', $redirect, $debut_page);
152
+    if ($res) {
153
+        if (!is_array($res)) {
154
+            spip_log("Pb d'acces SQL a la mise a jour", 'maj.' . _LOG_ERREUR);
155
+        } else {
156
+            echo _T('avis_operation_echec') . ' ' . join(' ', $res);
157
+            echo install_fin_html();
158
+        }
159
+    }
160
+
161
+    return $res;
162 162
 }
163 163
 
164 164
 /**
@@ -200,53 +200,53 @@  discard block
 block discarded – undo
200 200
  */
201 201
 function maj_plugin($nom_meta_base_version, $version_cible, $maj, $table_meta = 'meta') {
202 202
 
203
-	if ($table_meta !== 'meta') {
204
-		installer_table_meta($table_meta);
205
-	}
206
-
207
-	$current_version = null;
208
-
209
-	if (
210
-		(!isset($GLOBALS[$table_meta][$nom_meta_base_version]))
211
-		|| (!spip_version_compare($current_version = $GLOBALS[$table_meta][$nom_meta_base_version], $version_cible, '='))
212
-	) {
213
-		// $maj['create'] contient les directives propres a la premiere creation de base
214
-		// c'est une operation derogatoire qui fait aboutir directement dans la version_cible
215
-		if (isset($maj['create'])) {
216
-			if (!isset($GLOBALS[$table_meta][$nom_meta_base_version])) {
217
-				// installation : on ne fait que l'operation create
218
-				$maj = ['init' => $maj['create']];
219
-				// et on lui ajoute un appel a inc/config
220
-				// pour creer les metas par defaut
221
-				$config = charger_fonction('config', 'inc');
222
-				$maj[$version_cible] = [[$config]];
223
-			}
224
-			// dans tous les cas enlever cet index du tableau
225
-			unset($maj['create']);
226
-		}
227
-		// si init, deja dans le bon ordre
228
-		if (!isset($maj['init'])) {
229
-			include_spip('inc/plugin'); // pour spip_version_compare
230
-			uksort($maj, 'spip_version_compare');
231
-		}
232
-
233
-		// la redirection se fait par defaut sur la page d'administration des plugins
234
-		// sauf lorsque nous sommes sur l'installation de SPIP
235
-		// ou define _REDIRECT_MAJ_PLUGIN
236
-		$redirect = (defined('_REDIRECT_MAJ_PLUGIN') ? _REDIRECT_MAJ_PLUGIN : generer_url_ecrire('admin_plugin'));
237
-		if (defined('_ECRIRE_INSTALL')) {
238
-			$redirect = parametre_url(generer_url_ecrire('install'), 'etape', _request('etape'));
239
-		}
240
-
241
-		$res = maj_while($current_version, $version_cible, $maj, $nom_meta_base_version, $table_meta, $redirect);
242
-		if ($res) {
243
-			if (!is_array($res)) {
244
-				spip_log("Pb d'acces SQL a la mise a jour", 'maj.' . _LOG_ERREUR);
245
-			} else {
246
-				echo '<p>' . _T('avis_operation_echec') . ' ' . join(' ', $res) . '</p>';
247
-			}
248
-		}
249
-	}
203
+    if ($table_meta !== 'meta') {
204
+        installer_table_meta($table_meta);
205
+    }
206
+
207
+    $current_version = null;
208
+
209
+    if (
210
+        (!isset($GLOBALS[$table_meta][$nom_meta_base_version]))
211
+        || (!spip_version_compare($current_version = $GLOBALS[$table_meta][$nom_meta_base_version], $version_cible, '='))
212
+    ) {
213
+        // $maj['create'] contient les directives propres a la premiere creation de base
214
+        // c'est une operation derogatoire qui fait aboutir directement dans la version_cible
215
+        if (isset($maj['create'])) {
216
+            if (!isset($GLOBALS[$table_meta][$nom_meta_base_version])) {
217
+                // installation : on ne fait que l'operation create
218
+                $maj = ['init' => $maj['create']];
219
+                // et on lui ajoute un appel a inc/config
220
+                // pour creer les metas par defaut
221
+                $config = charger_fonction('config', 'inc');
222
+                $maj[$version_cible] = [[$config]];
223
+            }
224
+            // dans tous les cas enlever cet index du tableau
225
+            unset($maj['create']);
226
+        }
227
+        // si init, deja dans le bon ordre
228
+        if (!isset($maj['init'])) {
229
+            include_spip('inc/plugin'); // pour spip_version_compare
230
+            uksort($maj, 'spip_version_compare');
231
+        }
232
+
233
+        // la redirection se fait par defaut sur la page d'administration des plugins
234
+        // sauf lorsque nous sommes sur l'installation de SPIP
235
+        // ou define _REDIRECT_MAJ_PLUGIN
236
+        $redirect = (defined('_REDIRECT_MAJ_PLUGIN') ? _REDIRECT_MAJ_PLUGIN : generer_url_ecrire('admin_plugin'));
237
+        if (defined('_ECRIRE_INSTALL')) {
238
+            $redirect = parametre_url(generer_url_ecrire('install'), 'etape', _request('etape'));
239
+        }
240
+
241
+        $res = maj_while($current_version, $version_cible, $maj, $nom_meta_base_version, $table_meta, $redirect);
242
+        if ($res) {
243
+            if (!is_array($res)) {
244
+                spip_log("Pb d'acces SQL a la mise a jour", 'maj.' . _LOG_ERREUR);
245
+            } else {
246
+                echo '<p>' . _T('avis_operation_echec') . ' ' . join(' ', $res) . '</p>';
247
+            }
248
+        }
249
+    }
250 250
 }
251 251
 
252 252
 /**
@@ -263,17 +263,17 @@  discard block
 block discarded – undo
263 263
  * @return void
264 264
  */
265 265
 function relance_maj($meta, $table, $redirect = '') {
266
-	include_spip('inc/headers');
267
-	if (!$redirect) {
268
-		// recuperer la valeur installee en cours
269
-		// on la tronque numeriquement, elle ne sert pas reellement
270
-		// sauf pour verifier que ce n'est pas oui ou non
271
-		// sinon is_numeric va echouer sur un numero de version 1.2.3
272
-		$installee = intval($GLOBALS[$table][$meta]);
273
-		$redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
274
-	}
275
-	echo redirige_formulaire($redirect);
276
-	exit();
266
+    include_spip('inc/headers');
267
+    if (!$redirect) {
268
+        // recuperer la valeur installee en cours
269
+        // on la tronque numeriquement, elle ne sert pas reellement
270
+        // sauf pour verifier que ce n'est pas oui ou non
271
+        // sinon is_numeric va echouer sur un numero de version 1.2.3
272
+        $installee = intval($GLOBALS[$table][$meta]);
273
+        $redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
274
+    }
275
+    echo redirige_formulaire($redirect);
276
+    exit();
277 277
 }
278 278
 
279 279
 /**
@@ -286,26 +286,26 @@  discard block
 block discarded – undo
286 286
  * @return void
287 287
  */
288 288
 function maj_debut_page($installee, $meta, $table) {
289
-	static $done = false;
290
-	if ($done) {
291
-		return;
292
-	}
293
-	include_spip('inc/minipres');
294
-	@ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure
295
-	$timeout = _UPGRADE_TIME_OUT * 2;
296
-	$titre = _T('titre_page_upgrade');
297
-	$balise_img = charger_filtre('balise_img');
298
-	$titre .= $balise_img(chemin_image('loader.svg'), '', 'loader');
299
-	echo(install_debut_html($titre));
300
-	// script de rechargement auto sur timeout
301
-	$redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
302
-	echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . ($timeout * 1000) . ')');
303
-	echo "<div style='text-align: left'>\n";
304
-	if (ob_get_level()) {
305
-		ob_flush();
306
-	}
307
-	flush();
308
-	$done = true;
289
+    static $done = false;
290
+    if ($done) {
291
+        return;
292
+    }
293
+    include_spip('inc/minipres');
294
+    @ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure
295
+    $timeout = _UPGRADE_TIME_OUT * 2;
296
+    $titre = _T('titre_page_upgrade');
297
+    $balise_img = charger_filtre('balise_img');
298
+    $titre .= $balise_img(chemin_image('loader.svg'), '', 'loader');
299
+    echo(install_debut_html($titre));
300
+    // script de rechargement auto sur timeout
301
+    $redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true);
302
+    echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . ($timeout * 1000) . ')');
303
+    echo "<div style='text-align: left'>\n";
304
+    if (ob_get_level()) {
305
+        ob_flush();
306
+    }
307
+    flush();
308
+    $done = true;
309 309
 }
310 310
 
311 311
 
@@ -349,64 +349,64 @@  discard block
 block discarded – undo
349 349
  *    - tableau vide sinon.
350 350
  */
351 351
 function maj_while($installee, $cible, $maj, $meta = '', $table = 'meta', $redirect = '', $debut_page = false) {
352
-	# inclusions pour que les procedures d'upgrade disposent des fonctions de base
353
-	include_spip('base/create');
354
-	include_spip('base/abstract_sql');
355
-	$trouver_table = charger_fonction('trouver_table', 'base');
356
-	include_spip('inc/plugin'); // pour spip_version_compare
357
-	$n = 0;
358
-	$time = time();
359
-
360
-	if (!defined('_TIME_OUT')) {
361
-		/**
362
-		 * Définir le timeout qui peut-être utilisé dans les fonctions
363
-		 * de mises à jour qui durent trop longtemps
364
-		 *
365
-		 * À utiliser tel que : `if (time() >= _TIME_OUT)`
366
-		 *
367
-		 * @var int
368
-		 */
369
-		define('_TIME_OUT', $time + _UPGRADE_TIME_OUT);
370
-	}
371
-
372
-	foreach ($maj as $v => $operations) {
373
-		// si une maj pour cette version
374
-		if (
375
-			$v == 'init' or
376
-			(spip_version_compare($v, $installee, '>')
377
-				and spip_version_compare($v, $cible, '<='))
378
-		) {
379
-			if ($debut_page) {
380
-				maj_debut_page($v, $meta, $table);
381
-			}
382
-			echo "MAJ $v";
383
-			$etape = serie_alter($v, $operations, $meta, $table, $redirect);
384
-			$trouver_table(''); // vider le cache des descriptions de table
385
-			# echec sur une etape en cours ?
386
-			# on sort
387
-			if ($etape) {
388
-				return [$v, $etape];
389
-			}
390
-			$n = time() - $time;
391
-			spip_log("$table $meta: $v en $n secondes", 'maj.' . _LOG_INFO_IMPORTANTE);
392
-			if ($meta) {
393
-				ecrire_meta($meta, $installee = $v, 'oui', $table);
394
-			}
395
-			echo (_IS_CLI ? "\n" : '<br />');
396
-		}
397
-		if (time() >= _TIME_OUT) {
398
-			relance_maj($meta, $table, $redirect);
399
-		}
400
-	}
401
-	$trouver_table(''); // vider le cache des descriptions de table
402
-	// indispensable pour les chgt de versions qui n'ecrivent pas en base
403
-	// tant pis pour la redondance eventuelle avec ci-dessus
404
-	if ($meta) {
405
-		ecrire_meta($meta, $cible, 'oui', $table);
406
-	}
407
-	spip_log("MAJ terminee. $meta: $installee", 'maj.' . _LOG_INFO_IMPORTANTE);
408
-
409
-	return [];
352
+    # inclusions pour que les procedures d'upgrade disposent des fonctions de base
353
+    include_spip('base/create');
354
+    include_spip('base/abstract_sql');
355
+    $trouver_table = charger_fonction('trouver_table', 'base');
356
+    include_spip('inc/plugin'); // pour spip_version_compare
357
+    $n = 0;
358
+    $time = time();
359
+
360
+    if (!defined('_TIME_OUT')) {
361
+        /**
362
+         * Définir le timeout qui peut-être utilisé dans les fonctions
363
+         * de mises à jour qui durent trop longtemps
364
+         *
365
+         * À utiliser tel que : `if (time() >= _TIME_OUT)`
366
+         *
367
+         * @var int
368
+         */
369
+        define('_TIME_OUT', $time + _UPGRADE_TIME_OUT);
370
+    }
371
+
372
+    foreach ($maj as $v => $operations) {
373
+        // si une maj pour cette version
374
+        if (
375
+            $v == 'init' or
376
+            (spip_version_compare($v, $installee, '>')
377
+                and spip_version_compare($v, $cible, '<='))
378
+        ) {
379
+            if ($debut_page) {
380
+                maj_debut_page($v, $meta, $table);
381
+            }
382
+            echo "MAJ $v";
383
+            $etape = serie_alter($v, $operations, $meta, $table, $redirect);
384
+            $trouver_table(''); // vider le cache des descriptions de table
385
+            # echec sur une etape en cours ?
386
+            # on sort
387
+            if ($etape) {
388
+                return [$v, $etape];
389
+            }
390
+            $n = time() - $time;
391
+            spip_log("$table $meta: $v en $n secondes", 'maj.' . _LOG_INFO_IMPORTANTE);
392
+            if ($meta) {
393
+                ecrire_meta($meta, $installee = $v, 'oui', $table);
394
+            }
395
+            echo (_IS_CLI ? "\n" : '<br />');
396
+        }
397
+        if (time() >= _TIME_OUT) {
398
+            relance_maj($meta, $table, $redirect);
399
+        }
400
+    }
401
+    $trouver_table(''); // vider le cache des descriptions de table
402
+    // indispensable pour les chgt de versions qui n'ecrivent pas en base
403
+    // tant pis pour la redondance eventuelle avec ci-dessus
404
+    if ($meta) {
405
+        ecrire_meta($meta, $cible, 'oui', $table);
406
+    }
407
+    spip_log("MAJ terminee. $meta: $installee", 'maj.' . _LOG_INFO_IMPORTANTE);
408
+
409
+    return [];
410 410
 }
411 411
 
412 412
 /**
@@ -429,53 +429,53 @@  discard block
 block discarded – undo
429 429
  * @return int
430 430
  */
431 431
 function serie_alter($serie, $q = [], $meta = '', $table = 'meta', $redirect = '') {
432
-	$meta2 = $meta . '_maj_' . $serie;
433
-	$etape = 0;
434
-	if (isset($GLOBALS[$table][$meta2])) {
435
-		$etape = intval($GLOBALS[$table][$meta2]);
436
-	}
437
-	foreach ($q as $i => $r) {
438
-		if ($i >= $etape) {
439
-			$msg = "maj $table $meta2 etape $i";
440
-			if (
441
-				is_array($r)
442
-				and function_exists($f = array_shift($r))
443
-			) {
444
-				// note: $r (arguments de la fonction $f) peut avoir des données tabulaires
445
-				spip_log("$msg: $f " . @join(',', $r), 'maj.' . _LOG_INFO_IMPORTANTE);
446
-				// pour les fonctions atomiques sql_xx
447
-				// on enregistre le meta avant de lancer la fonction,
448
-				// de maniere a eviter de boucler sur timeout
449
-				// mais pour les fonctions complexes,
450
-				// il faut les rejouer jusqu'a achevement.
451
-				// C'est a elle d'assurer qu'elles progressent a chaque rappel
452
-				if (strncmp($f, 'sql_', 4) == 0) {
453
-					ecrire_meta($meta2, $i + 1, 'non', $table);
454
-				}
455
-				echo (_IS_CLI ? '.' : " <span title='$i'>.</span>");
456
-				call_user_func_array($f, $r);
457
-				// si temps imparti depasse, on relance sans ecrire en meta
458
-				// car on est peut etre sorti sur timeout si c'est une fonction longue
459
-				if (time() >= _TIME_OUT) {
460
-					relance_maj($meta, $table, $redirect);
461
-				}
462
-				ecrire_meta($meta2, $i + 1, 'non', $table);
463
-				spip_log("$meta2: ok", 'maj.' . _LOG_INFO_IMPORTANTE);
464
-			} else {
465
-				if (!is_array($r)) {
466
-					spip_log("maj $i format incorrect", 'maj.' . _LOG_ERREUR);
467
-				} else {
468
-					spip_log("maj $i fonction $f non definie", 'maj.' . _LOG_ERREUR);
469
-				}
470
-				// en cas d'erreur serieuse, on s'arrete
471
-				// mais on permet de passer par dessus en rechargeant la page.
472
-				return $i + 1;
473
-			}
474
-		}
475
-	}
476
-	effacer_meta($meta2, $table);
477
-
478
-	return 0;
432
+    $meta2 = $meta . '_maj_' . $serie;
433
+    $etape = 0;
434
+    if (isset($GLOBALS[$table][$meta2])) {
435
+        $etape = intval($GLOBALS[$table][$meta2]);
436
+    }
437
+    foreach ($q as $i => $r) {
438
+        if ($i >= $etape) {
439
+            $msg = "maj $table $meta2 etape $i";
440
+            if (
441
+                is_array($r)
442
+                and function_exists($f = array_shift($r))
443
+            ) {
444
+                // note: $r (arguments de la fonction $f) peut avoir des données tabulaires
445
+                spip_log("$msg: $f " . @join(',', $r), 'maj.' . _LOG_INFO_IMPORTANTE);
446
+                // pour les fonctions atomiques sql_xx
447
+                // on enregistre le meta avant de lancer la fonction,
448
+                // de maniere a eviter de boucler sur timeout
449
+                // mais pour les fonctions complexes,
450
+                // il faut les rejouer jusqu'a achevement.
451
+                // C'est a elle d'assurer qu'elles progressent a chaque rappel
452
+                if (strncmp($f, 'sql_', 4) == 0) {
453
+                    ecrire_meta($meta2, $i + 1, 'non', $table);
454
+                }
455
+                echo (_IS_CLI ? '.' : " <span title='$i'>.</span>");
456
+                call_user_func_array($f, $r);
457
+                // si temps imparti depasse, on relance sans ecrire en meta
458
+                // car on est peut etre sorti sur timeout si c'est une fonction longue
459
+                if (time() >= _TIME_OUT) {
460
+                    relance_maj($meta, $table, $redirect);
461
+                }
462
+                ecrire_meta($meta2, $i + 1, 'non', $table);
463
+                spip_log("$meta2: ok", 'maj.' . _LOG_INFO_IMPORTANTE);
464
+            } else {
465
+                if (!is_array($r)) {
466
+                    spip_log("maj $i format incorrect", 'maj.' . _LOG_ERREUR);
467
+                } else {
468
+                    spip_log("maj $i fonction $f non definie", 'maj.' . _LOG_ERREUR);
469
+                }
470
+                // en cas d'erreur serieuse, on s'arrete
471
+                // mais on permet de passer par dessus en rechargeant la page.
472
+                return $i + 1;
473
+            }
474
+        }
475
+    }
476
+    effacer_meta($meta2, $table);
477
+
478
+    return 0;
479 479
 }
480 480
 
481 481
 /**
@@ -484,16 +484,16 @@  discard block
 block discarded – undo
484 484
  * @return bool True si possible.
485 485
  **/
486 486
 function upgrade_test() {
487
-	sql_drop_table('spip_test', true);
488
-	sql_create('spip_test', ['a' => 'int']);
489
-	sql_alter('TABLE spip_test ADD b INT');
490
-	sql_insertq('spip_test', ['b' => 1], ['field' => ['b' => 'int']]);
491
-	$result = sql_select('b', 'spip_test');
492
-	// ne pas garder le resultat de la requete sinon sqlite3
493
-	// ne peut pas supprimer la table spip_test lors du sql_alter qui suit
494
-	// car cette table serait alors 'verouillee'
495
-	$result = $result ? true : false;
496
-	sql_alter('TABLE spip_test DROP b');
497
-
498
-	return $result;
487
+    sql_drop_table('spip_test', true);
488
+    sql_create('spip_test', ['a' => 'int']);
489
+    sql_alter('TABLE spip_test ADD b INT');
490
+    sql_insertq('spip_test', ['b' => 1], ['field' => ['b' => 'int']]);
491
+    $result = sql_select('b', 'spip_test');
492
+    // ne pas garder le resultat de la requete sinon sqlite3
493
+    // ne peut pas supprimer la table spip_test lors du sql_alter qui suit
494
+    // car cette table serait alors 'verouillee'
495
+    $result = $result ? true : false;
496
+    sql_alter('TABLE spip_test DROP b');
497
+
498
+    return $result;
499 499
 }
Please login to merge, or discard this patch.
ecrire/balise/menu_lang_ecrire.php 1 patch
Indentation   +31 added lines, -31 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -37,7 +37,7 @@  discard block
 block discarded – undo
37 37
  *     Pile complétée du code compilé
38 38
  **/
39 39
 function balise_MENU_LANG_ECRIRE($p) {
40
-	return calculer_balise_dynamique($p, 'MENU_LANG_ECRIRE', ['lang']);
40
+    return calculer_balise_dynamique($p, 'MENU_LANG_ECRIRE', ['lang']);
41 41
 }
42 42
 
43 43
 /**
@@ -55,12 +55,12 @@  discard block
 block discarded – undo
55 55
  *   Liste (lang) des arguments collectés et fournis.
56 56
  */
57 57
 function balise_MENU_LANG_ECRIRE_stat($args, $context_compil) {
58
-	include_spip('inc/lang');
59
-	if (strpos($GLOBALS['meta']['langues_proposees'], ',') === false) {
60
-		return '';
61
-	}
58
+    include_spip('inc/lang');
59
+    if (strpos($GLOBALS['meta']['langues_proposees'], ',') === false) {
60
+        return '';
61
+    }
62 62
 
63
-	return $args;
63
+    return $args;
64 64
 }
65 65
 
66 66
 /**
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
  *     Liste : Chemin du squelette, durée du cache, contexte
77 77
  **/
78 78
 function balise_MENU_LANG_ECRIRE_dyn($opt) {
79
-	return menu_lang_pour_tous('var_lang_ecrire', $opt);
79
+    return menu_lang_pour_tous('var_lang_ecrire', $opt);
80 80
 }
81 81
 
82 82
 /**
@@ -96,30 +96,30 @@  discard block
 block discarded – undo
96 96
  *     Liste : Chemin du squelette, durée du cache, contexte
97 97
  **/
98 98
 function menu_lang_pour_tous($nom, $default) {
99
-	include_spip('inc/lang');
99
+    include_spip('inc/lang');
100 100
 
101
-	if ($GLOBALS['spip_lang'] <> $default) {
102
-		$opt = lang_select($default);  # et remplace
103
-		if ($GLOBALS['spip_lang'] <> $default) {
104
-			$default = '';  # annule tout choix par defaut
105
-			if ($opt) {
106
-				lang_select();
107
-			}
108
-		}
109
-	}
101
+    if ($GLOBALS['spip_lang'] <> $default) {
102
+        $opt = lang_select($default);  # et remplace
103
+        if ($GLOBALS['spip_lang'] <> $default) {
104
+            $default = '';  # annule tout choix par defaut
105
+            if ($opt) {
106
+                lang_select();
107
+            }
108
+        }
109
+    }
110 110
 
111
-	# lien a partir de /
112
-	$cible = parametre_url(self(), 'lang', '', '&');
113
-	$post = generer_url_action('converser', 'redirect=' . rawurlencode($cible), true);
111
+    # lien a partir de /
112
+    $cible = parametre_url(self(), 'lang', '', '&');
113
+    $post = generer_url_action('converser', 'redirect=' . rawurlencode($cible), true);
114 114
 
115
-	return [
116
-		'formulaires/menu_lang',
117
-		3600,
118
-		[
119
-			'nom' => $nom,
120
-			'url' => $post,
121
-			'name' => $nom,
122
-			'default' => $default,
123
-		]
124
-	];
115
+    return [
116
+        'formulaires/menu_lang',
117
+        3600,
118
+        [
119
+            'nom' => $nom,
120
+            'url' => $post,
121
+            'name' => $nom,
122
+            'default' => $default,
123
+        ]
124
+    ];
125 125
 }
Please login to merge, or discard this patch.
ecrire/balise/menu_lang.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -37,7 +37,7 @@  discard block
 block discarded – undo
37 37
  *     Pile complétée du code compilé
38 38
  **/
39 39
 function balise_MENU_LANG($p) {
40
-	return calculer_balise_dynamique($p, 'MENU_LANG', ['lang']);
40
+    return calculer_balise_dynamique($p, 'MENU_LANG', ['lang']);
41 41
 }
42 42
 
43 43
 /**
@@ -56,11 +56,11 @@  discard block
 block discarded – undo
56 56
  *   string: (vide) si pas de multilinguisme
57 57
  */
58 58
 function balise_MENU_LANG_stat($args, $context_compil) {
59
-	if (strpos($GLOBALS['meta']['langues_multilingue'], ',') === false) {
60
-		return '';
61
-	}
59
+    if (strpos($GLOBALS['meta']['langues_multilingue'], ',') === false) {
60
+        return '';
61
+    }
62 62
 
63
-	return $args;
63
+    return $args;
64 64
 }
65 65
 
66 66
 /**
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
  *     Liste : Chemin du squelette, durée du cache, contexte
77 77
  **/
78 78
 function balise_MENU_LANG_dyn($opt) {
79
-	include_spip('balise/menu_lang_ecrire');
79
+    include_spip('balise/menu_lang_ecrire');
80 80
 
81
-	return menu_lang_pour_tous('var_lang', $opt);
81
+    return menu_lang_pour_tous('var_lang', $opt);
82 82
 }
Please login to merge, or discard this patch.
ecrire/balise/formulaire_.php 1 patch
Indentation   +266 added lines, -266 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Formulaires
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('inc/filtres');
@@ -35,22 +35,22 @@  discard block
 block discarded – undo
35 35
  *     Saisie protégée
36 36
  **/
37 37
 function protege_champ($texte) {
38
-	if (is_array($texte)) {
39
-		return array_map('protege_champ', $texte);
40
-	} elseif ($texte === null) {
41
-		return $texte;
42
-	} elseif (is_bool($texte)) {
43
-		return $texte ? '1' : '';
44
-	} elseif (is_string($texte) and $texte) {
45
-		if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
-			// ne pas corrompre une valeur serialize
47
-			return $texte;
48
-		} elseif (strpbrk($texte, "&\"'<>") !== false) {
49
-			return spip_htmlspecialchars($texte, ENT_QUOTES);
50
-		}
51
-	}
52
-
53
-	return $texte;
38
+    if (is_array($texte)) {
39
+        return array_map('protege_champ', $texte);
40
+    } elseif ($texte === null) {
41
+        return $texte;
42
+    } elseif (is_bool($texte)) {
43
+        return $texte ? '1' : '';
44
+    } elseif (is_string($texte) and $texte) {
45
+        if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
+            // ne pas corrompre une valeur serialize
47
+            return $texte;
48
+        } elseif (strpbrk($texte, "&\"'<>") !== false) {
49
+            return spip_htmlspecialchars($texte, ENT_QUOTES);
50
+        }
51
+    }
52
+
53
+    return $texte;
54 54
 }
55 55
 
56 56
 /**
@@ -64,17 +64,17 @@  discard block
 block discarded – undo
64 64
  *     - false : pas de squelette trouvé
65 65
  **/
66 66
 function existe_formulaire($form) {
67
-	if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
-		$form = strtolower(substr($form, 11));
69
-	} else {
70
-		$form = strtolower($form);
71
-	}
67
+    if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
+        $form = strtolower(substr($form, 11));
69
+    } else {
70
+        $form = strtolower($form);
71
+    }
72 72
 
73
-	if (!$form) {
74
-		return '';
75
-	} // on ne sait pas, le nom du formulaire n'est pas fourni ici
73
+    if (!$form) {
74
+        return '';
75
+    } // on ne sait pas, le nom du formulaire n'est pas fourni ici
76 76
 
77
-	return trouver_fond($form, 'formulaires/') ? $form : false;
77
+    return trouver_fond($form, 'formulaires/') ? $form : false;
78 78
 }
79 79
 
80 80
 /**
@@ -83,31 +83,31 @@  discard block
 block discarded – undo
83 83
  * @return false|array
84 84
  */
85 85
 function test_formulaire_inclus_par_modele() {
86
-	$trace = debug_backtrace(0, 20);
87
-	$trace_fonctions = array_column($trace, 'function');
88
-	$trace_fonctions = array_map('strtolower', $trace_fonctions);
89
-
90
-	// regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
-	if (
92
-		function_exists('arguments_balise_dyn_depuis_modele')
93
-		and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
-	) {
95
-		if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
-			$k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
-			if ($trace[$k]['args'][0] === $form) {
98
-				return $trace[$k]['args'];
99
-			}
100
-		}
101
-	}
102
-
103
-	// fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
-	// mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
-	if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
-		$k = array_search('inclure_modele', $trace_fonctions);
107
-		// les arguments de recuperer_fond() passes par inclure_modele()
108
-		return $trace[$k - 1]['args'][1]['args'];
109
-	}
110
-	return false;
86
+    $trace = debug_backtrace(0, 20);
87
+    $trace_fonctions = array_column($trace, 'function');
88
+    $trace_fonctions = array_map('strtolower', $trace_fonctions);
89
+
90
+    // regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
+    if (
92
+        function_exists('arguments_balise_dyn_depuis_modele')
93
+        and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
+    ) {
95
+        if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
+            $k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
+            if ($trace[$k]['args'][0] === $form) {
98
+                return $trace[$k]['args'];
99
+            }
100
+        }
101
+    }
102
+
103
+    // fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
+    // mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
+    if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
+        $k = array_search('inclure_modele', $trace_fonctions);
107
+        // les arguments de recuperer_fond() passes par inclure_modele()
108
+        return $trace[$k - 1]['args'][1]['args'];
109
+    }
110
+    return false;
111 111
 }
112 112
 
113 113
 /**
@@ -122,32 +122,32 @@  discard block
 block discarded – undo
122 122
  **/
123 123
 function balise_FORMULAIRE__dist($p) {
124 124
 
125
-	// Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
-	// mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
-	if (existe_formulaire($p->nom_champ) === false) {
128
-		$p->code = "''";
129
-		$p->interdire_scripts = false;
130
-
131
-		return $p;
132
-	}
133
-
134
-	// sinon renvoyer un code php dynamique
135
-	$p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
-
137
-	if (
138
-		!test_espace_prive()
139
-		and !empty($p->descr['sourcefile'])
140
-		and $f = $p->descr['sourcefile']
141
-		and basename(dirname($f)) === 'modeles'
142
-	) {
143
-		// un modele est toujours inséré en texte dans son contenant
144
-		// donc si on est dans le public avec un cache on va perdre le dynamisme
145
-		// et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
-		// on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
-		$p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
-		// dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
-	}
150
-	return $p;
125
+    // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
+    // mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
+    if (existe_formulaire($p->nom_champ) === false) {
128
+        $p->code = "''";
129
+        $p->interdire_scripts = false;
130
+
131
+        return $p;
132
+    }
133
+
134
+    // sinon renvoyer un code php dynamique
135
+    $p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
+
137
+    if (
138
+        !test_espace_prive()
139
+        and !empty($p->descr['sourcefile'])
140
+        and $f = $p->descr['sourcefile']
141
+        and basename(dirname($f)) === 'modeles'
142
+    ) {
143
+        // un modele est toujours inséré en texte dans son contenant
144
+        // donc si on est dans le public avec un cache on va perdre le dynamisme
145
+        // et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
+        // on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
+        $p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
+        // dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
+    }
150
+    return $p;
151 151
 }
152 152
 
153 153
 /**
@@ -167,17 +167,17 @@  discard block
 block discarded – undo
167 167
  *     - string : texte à afficher directement
168 168
  */
169 169
 function balise_FORMULAIRE__dyn($form, ...$args) {
170
-	$form = existe_formulaire($form);
171
-	if (!$form) {
172
-		return '';
173
-	}
170
+    $form = existe_formulaire($form);
171
+    if (!$form) {
172
+        return '';
173
+    }
174 174
 
175
-	$contexte = balise_FORMULAIRE__contexte($form, $args);
176
-	if (!is_array($contexte)) {
177
-		return $contexte;
178
-	}
175
+    $contexte = balise_FORMULAIRE__contexte($form, $args);
176
+    if (!is_array($contexte)) {
177
+        return $contexte;
178
+    }
179 179
 
180
-	return ["formulaires/$form", 3600, $contexte];
180
+    return ["formulaires/$form", 3600, $contexte];
181 181
 }
182 182
 
183 183
 /**
@@ -192,84 +192,84 @@  discard block
 block discarded – undo
192 192
  *     string: Formulaire non applicable (message d’explication)
193 193
  **/
194 194
 function balise_FORMULAIRE__contexte($form, $args) {
195
-	// tester si ce formulaire vient d'etre poste (memes arguments)
196
-	// pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
197
-	// si poste, on recupere les erreurs
198
-
199
-	$je_suis_poste = false;
200
-	if (
201
-		$post_form = _request('formulaire_action')
202
-		and $post_form == $form
203
-		and $p = _request('formulaire_action_args')
204
-		and is_array($p = decoder_contexte_ajax($p, $post_form))
205
-	) {
206
-		// enlever le faux attribut de langue masque
207
-		array_shift($p);
208
-		if (formulaire__identifier($form, $args, $p)) {
209
-			$je_suis_poste = true;
210
-		}
211
-	}
212
-
213
-	$editable = true;
214
-	$erreurs = $post = [];
215
-	if ($je_suis_poste) {
216
-		$post = traiter_formulaires_dynamiques(true);
217
-		$e = "erreurs_$form";
218
-		$erreurs = $post[$e] ?? [];
219
-		$editable = "editable_$form";
220
-		$editable = (!isset($post[$e]))
221
-			|| (is_countable($erreurs) ? count($erreurs) : 0)
222
-			|| (isset($post[$editable]) && $post[$editable]);
223
-	}
224
-
225
-	$valeurs = formulaire__charger($form, $args, $je_suis_poste);
226
-
227
-	// si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
228
-	// C'est plus fort qu'editable qui est gere par le squelette
229
-	// Idealement $valeur doit etre alors un message explicatif.
230
-	if (!is_array($valeurs)) {
231
-		return is_string($valeurs) ? $valeurs : '';
232
-	}
233
-
234
-	// charger peut passer une action si le formulaire ne tourne pas sur self()
235
-	// ou une action vide si elle ne sert pas
236
-	$action = $valeurs['action'] ?? self('&amp;', true);
237
-	// bug IEx : si action finit par /
238
-	// IE croit que le <form ... action=../ > est autoferme
239
-	if (substr($action, -1) == '/') {
240
-		// on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
241
-		$action .= '#';
242
-	}
243
-
244
-	// recuperer la saisie en cours si erreurs
245
-	// seulement si c'est ce formulaire qui est poste
246
-	// ou si on le demande explicitement par le parametre _forcer_request = true
247
-	$dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
248
-	foreach (array_keys($valeurs) as $champ) {
249
-		if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
250
-			if ($dispo and (($v = _request($champ)) !== null)) {
251
-				$valeurs[$champ] = $v;
252
-			}
253
-			// nettoyer l'url des champs qui vont etre saisis
254
-			if ($action) {
255
-				$action = parametre_url($action, $champ, '');
256
-			}
257
-			// proteger les ' et les " dans les champs que l'on va injecter
258
-			$valeurs[$champ] = protege_champ($valeurs[$champ]);
259
-		}
260
-	}
261
-
262
-	if ($action) {
263
-		// nettoyer l'url
264
-		$action = parametre_url($action, 'formulaire_action', '');
265
-		$action = parametre_url($action, 'formulaire_action_args', '');
266
-	}
267
-
268
-	/**
269
-	 * @deprecated 4.0
270
-	 * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
271
-	 */
272
-	/*
195
+    // tester si ce formulaire vient d'etre poste (memes arguments)
196
+    // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
197
+    // si poste, on recupere les erreurs
198
+
199
+    $je_suis_poste = false;
200
+    if (
201
+        $post_form = _request('formulaire_action')
202
+        and $post_form == $form
203
+        and $p = _request('formulaire_action_args')
204
+        and is_array($p = decoder_contexte_ajax($p, $post_form))
205
+    ) {
206
+        // enlever le faux attribut de langue masque
207
+        array_shift($p);
208
+        if (formulaire__identifier($form, $args, $p)) {
209
+            $je_suis_poste = true;
210
+        }
211
+    }
212
+
213
+    $editable = true;
214
+    $erreurs = $post = [];
215
+    if ($je_suis_poste) {
216
+        $post = traiter_formulaires_dynamiques(true);
217
+        $e = "erreurs_$form";
218
+        $erreurs = $post[$e] ?? [];
219
+        $editable = "editable_$form";
220
+        $editable = (!isset($post[$e]))
221
+            || (is_countable($erreurs) ? count($erreurs) : 0)
222
+            || (isset($post[$editable]) && $post[$editable]);
223
+    }
224
+
225
+    $valeurs = formulaire__charger($form, $args, $je_suis_poste);
226
+
227
+    // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
228
+    // C'est plus fort qu'editable qui est gere par le squelette
229
+    // Idealement $valeur doit etre alors un message explicatif.
230
+    if (!is_array($valeurs)) {
231
+        return is_string($valeurs) ? $valeurs : '';
232
+    }
233
+
234
+    // charger peut passer une action si le formulaire ne tourne pas sur self()
235
+    // ou une action vide si elle ne sert pas
236
+    $action = $valeurs['action'] ?? self('&amp;', true);
237
+    // bug IEx : si action finit par /
238
+    // IE croit que le <form ... action=../ > est autoferme
239
+    if (substr($action, -1) == '/') {
240
+        // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
241
+        $action .= '#';
242
+    }
243
+
244
+    // recuperer la saisie en cours si erreurs
245
+    // seulement si c'est ce formulaire qui est poste
246
+    // ou si on le demande explicitement par le parametre _forcer_request = true
247
+    $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
248
+    foreach (array_keys($valeurs) as $champ) {
249
+        if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
250
+            if ($dispo and (($v = _request($champ)) !== null)) {
251
+                $valeurs[$champ] = $v;
252
+            }
253
+            // nettoyer l'url des champs qui vont etre saisis
254
+            if ($action) {
255
+                $action = parametre_url($action, $champ, '');
256
+            }
257
+            // proteger les ' et les " dans les champs que l'on va injecter
258
+            $valeurs[$champ] = protege_champ($valeurs[$champ]);
259
+        }
260
+    }
261
+
262
+    if ($action) {
263
+        // nettoyer l'url
264
+        $action = parametre_url($action, 'formulaire_action', '');
265
+        $action = parametre_url($action, 'formulaire_action_args', '');
266
+    }
267
+
268
+    /**
269
+     * @deprecated 4.0
270
+     * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
271
+     */
272
+    /*
273 273
 	if (isset($valeurs['_action'])) {
274 274
 		$securiser_action = charger_fonction('securiser_action', 'inc');
275 275
 		$secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1);
@@ -279,59 +279,59 @@  discard block
 block discarded – undo
279 279
 	}
280 280
 	*/
281 281
 
282
-	// empiler la lang en tant que premier argument implicite du CVT
283
-	// pour permettre de la restaurer au moment du Verifier et du Traiter
284
-	array_unshift($args, $GLOBALS['spip_lang']);
285
-
286
-	$valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
287
-	$valeurs['erreurs'] = $erreurs;
288
-	$valeurs['action'] = $action;
289
-	$valeurs['form'] = $form;
290
-
291
-	$valeurs['formulaire_sign'] = '';
292
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
293
-		$securiser_action = charger_fonction('securiser_action', 'inc');
294
-		$secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
295
-		$valeurs['formulaire_sign'] = $secu['hash'];
296
-	}
297
-
298
-	if (!isset($valeurs['id'])) {
299
-		$valeurs['id'] = 'new';
300
-	}
301
-	// editable peut venir de charger() ou de traiter() sinon
302
-	if (!isset($valeurs['editable'])) {
303
-		$valeurs['editable'] = $editable;
304
-	}
305
-	// dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
306
-	$valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
307
-
308
-	if ($je_suis_poste) {
309
-		$valeurs['message_erreur'] = '';
310
-		if (isset($erreurs['message_erreur'])) {
311
-			$valeurs['message_erreur'] = $erreurs['message_erreur'];
312
-		}
313
-
314
-		$valeurs['message_ok'] = '';
315
-		if (isset($post["message_ok_$form"])) {
316
-			$valeurs['message_ok'] = $post["message_ok_$form"];
317
-		} elseif (isset($erreurs['message_ok'])) {
318
-			$valeurs['message_ok'] = $erreurs['message_ok'];
319
-		}
320
-
321
-		// accessibilite : encapsuler toutes les erreurs dans un role='alert'
322
-		// uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
323
-		// et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
324
-		if (html5_permis()) {
325
-			foreach ($erreurs as $k => $v) {
326
-				if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
327
-					// on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
328
-					$valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
329
-				}
330
-			}
331
-		}
332
-	}
333
-
334
-	return $valeurs;
282
+    // empiler la lang en tant que premier argument implicite du CVT
283
+    // pour permettre de la restaurer au moment du Verifier et du Traiter
284
+    array_unshift($args, $GLOBALS['spip_lang']);
285
+
286
+    $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
287
+    $valeurs['erreurs'] = $erreurs;
288
+    $valeurs['action'] = $action;
289
+    $valeurs['form'] = $form;
290
+
291
+    $valeurs['formulaire_sign'] = '';
292
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
293
+        $securiser_action = charger_fonction('securiser_action', 'inc');
294
+        $secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
295
+        $valeurs['formulaire_sign'] = $secu['hash'];
296
+    }
297
+
298
+    if (!isset($valeurs['id'])) {
299
+        $valeurs['id'] = 'new';
300
+    }
301
+    // editable peut venir de charger() ou de traiter() sinon
302
+    if (!isset($valeurs['editable'])) {
303
+        $valeurs['editable'] = $editable;
304
+    }
305
+    // dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
306
+    $valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
307
+
308
+    if ($je_suis_poste) {
309
+        $valeurs['message_erreur'] = '';
310
+        if (isset($erreurs['message_erreur'])) {
311
+            $valeurs['message_erreur'] = $erreurs['message_erreur'];
312
+        }
313
+
314
+        $valeurs['message_ok'] = '';
315
+        if (isset($post["message_ok_$form"])) {
316
+            $valeurs['message_ok'] = $post["message_ok_$form"];
317
+        } elseif (isset($erreurs['message_ok'])) {
318
+            $valeurs['message_ok'] = $erreurs['message_ok'];
319
+        }
320
+
321
+        // accessibilite : encapsuler toutes les erreurs dans un role='alert'
322
+        // uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
323
+        // et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
324
+        if (html5_permis()) {
325
+            foreach ($erreurs as $k => $v) {
326
+                if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
327
+                    // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
328
+                    $valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
329
+                }
330
+            }
331
+        }
332
+    }
333
+
334
+    return $valeurs;
335 335
 }
336 336
 
337 337
 /**
@@ -343,51 +343,51 @@  discard block
 block discarded – undo
343 343
  * @return array
344 344
  */
345 345
 function formulaire__charger($form, $args, $poste) {
346
-	if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
347
-		$valeurs = call_user_func_array($charger_valeurs, $args);
348
-	} else {
349
-		$valeurs = [];
350
-	}
351
-
352
-	$valeurs = pipeline(
353
-		'formulaire_charger',
354
-		[
355
-			'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
356
-			'data' => $valeurs
357
-		]
358
-	);
359
-
360
-	// prise en charge CVT multi etape
361
-	if (is_array($valeurs) and isset($valeurs['_etapes'])) {
362
-		include_spip('inc/cvt_multietapes');
363
-		$valeurs = cvtmulti_formulaire_charger_etapes(
364
-			['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
365
-			$valeurs
366
-		);
367
-	}
368
-
369
-	// si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
370
-	if (is_array($valeurs)) {
371
-		if (!isset($valeurs['_pipelines'])) {
372
-			$valeurs['_pipelines'] = [];
373
-		}
374
-		// l'ancien argument _pipeline devient maintenant _pipelines
375
-		// reinjectons le vieux _pipeline au debut de _pipelines
376
-		if (isset($valeurs['_pipeline'])) {
377
-			$pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
378
-			$args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
379
-
380
-			$pipelines = [$pipe => $args];
381
-			$valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
382
-		}
383
-
384
-		// et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
385
-		// qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
386
-		// (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
387
-		$valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
388
-	}
389
-
390
-	return $valeurs;
346
+    if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
347
+        $valeurs = call_user_func_array($charger_valeurs, $args);
348
+    } else {
349
+        $valeurs = [];
350
+    }
351
+
352
+    $valeurs = pipeline(
353
+        'formulaire_charger',
354
+        [
355
+            'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
356
+            'data' => $valeurs
357
+        ]
358
+    );
359
+
360
+    // prise en charge CVT multi etape
361
+    if (is_array($valeurs) and isset($valeurs['_etapes'])) {
362
+        include_spip('inc/cvt_multietapes');
363
+        $valeurs = cvtmulti_formulaire_charger_etapes(
364
+            ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
365
+            $valeurs
366
+        );
367
+    }
368
+
369
+    // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
370
+    if (is_array($valeurs)) {
371
+        if (!isset($valeurs['_pipelines'])) {
372
+            $valeurs['_pipelines'] = [];
373
+        }
374
+        // l'ancien argument _pipeline devient maintenant _pipelines
375
+        // reinjectons le vieux _pipeline au debut de _pipelines
376
+        if (isset($valeurs['_pipeline'])) {
377
+            $pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
378
+            $args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
379
+
380
+            $pipelines = [$pipe => $args];
381
+            $valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
382
+        }
383
+
384
+        // et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
385
+        // qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
386
+        // (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
387
+        $valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
388
+    }
389
+
390
+    return $valeurs;
391 391
 }
392 392
 
393 393
 /**
@@ -406,9 +406,9 @@  discard block
 block discarded – undo
406 406
  * @return bool
407 407
  */
408 408
 function formulaire__identifier($form, $args, $p) {
409
-	if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
410
-		return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
411
-	}
409
+    if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
410
+        return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
411
+    }
412 412
 
413
-	return $args === $p;
413
+    return $args === $p;
414 414
 }
Please login to merge, or discard this patch.