[SPIP] +2.1.12
[velocampus/web/www.git] / www / ecrire / base / abstract_sql.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2011 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 define('sql_ABSTRACT_VERSION', 1);
16 include_spip('base/connect_sql');
17
18 // Ce fichier definit la couche d'abstraction entre SPIP et ses serveurs SQL.
19 // Cette version 1 est un ensemble de fonctions ecrites rapidement
20 // pour generaliser le code strictement MySQL de SPIP <= 1.9.2
21 // Des retouches sont a prevoir apres l'experience des premiers portages.
22 // Les symboles sql_* (constantes et nom de fonctions) sont reserves
23 // a cette interface, sans quoi le gestionnaire de version dysfonctionnera.
24
25 // Fonction principale. Elle charge l'interface au serveur de base de donnees
26 // via la fonction spip_connect_version qui etablira la connexion au besoin.
27 // Elle retourne la fonction produisant la requete SQL demandee
28 // Erreur fatale si la fonctionnalite est absente sauf si le 3e arg <> false
29
30 // http://doc.spip.org/@sql_serveur
31 function sql_serveur($ins_sql='', $serveur='', $continue=false) {
32 return spip_connect_sql(sql_ABSTRACT_VERSION, $ins_sql, $serveur, $continue);
33 }
34
35 // Demande si un charset est disponible.
36 // http://doc.spip.org/@sql_get_charset
37 function sql_get_charset($charset, $serveur='', $option=true){
38 // le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc.
39 $desc = sql_serveur('', $serveur, true,true);
40 $desc = $desc[sql_ABSTRACT_VERSION];
41 $c = $desc['charsets'][$charset];
42 if ($c) {
43 if (function_exists($f=@$desc['get_charset']))
44 if ($f($c, $serveur, $option!==false)) return $c;
45 }
46 spip_log("SPIP ne connait pas les Charsets disponibles sur le serveur $serveur. Le serveur choisira seul.");
47 return false;
48 }
49
50 // Regler le codage de connexion
51
52 // http://doc.spip.org/@sql_set_charset
53 function sql_set_charset($charset,$serveur='', $option=true){
54 $f = sql_serveur('set_charset', $serveur, $option==='continue' OR $option===false);
55 if (!is_string($f) OR !$f) return false;
56 return $f($charset, $serveur, $option!==false);
57 }
58
59 // Fonction pour SELECT, retournant la ressource interrogeable par sql_fetch.
60 // Recoit en argument:
61 // - le tableau (ou cha�ne) des champs a` ramener (Select)
62 // - le tableau (ou cha�ne) des tables a` consulter (From)
63 // - le tableau (ou cha�ne) des conditions a` remplir (Where)
64 // - le crite`re de regroupement (Group by)
65 // - le tableau de classement (Order By)
66 // - le crite`re de limite (Limit)
67 // - le tableau des des post-conditions a remplir (Having)
68 // - le serveur sollicite (pour retrouver la connexion)
69 // - option peut avoir 3 valeurs :
70 // false -> ne pas l'executer mais la retourner,
71 // continue -> ne pas echouer en cas de serveur sql indisponible,
72 // autre -> executer la requete.
73 // Le cas "autre" est, pour une requete produite par le compilateur,
74 // un tableau donnnant le contexte afin d'indiquer le lieu de l'erreur au besoin
75 // Retourne false en cas d'erreur, apres l'avoir denoncee.
76 // Les portages doivent retourner la requete elle-meme en cas d'erreur,
77 // afin de disposer du texte brut.
78
79 // http://doc.spip.org/@sql_select
80 function sql_select ($select = array(), $from = array(), $where = array(),
81 $groupby = array(), $orderby = array(), $limit = '', $having = array(),
82 $serveur='', $option=true) {
83 $f = sql_serveur('select', $serveur, $option==='continue' OR $option===false);
84 if (!is_string($f) OR !$f) return false;
85
86 $debug = (isset($GLOBALS['var_mode']) AND $GLOBALS['var_mode'] == 'debug' );
87 if (($option !== false) AND !$debug) {
88 $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, is_array($option) ? true : $option);
89 } else {
90 $query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
91 if (!$option) return $query;
92 // le debug, c'est pour ce qui a ete produit par le compilateur
93 if (isset($GLOBALS['debug']['aucasou'])) {
94 list($table, $id,) = $GLOBALS['debug']['aucasou'];
95 $nom = $GLOBALS['debug_objets']['courant'] . $id;
96 $GLOBALS['debug_objets']['requete'][$nom] = $query;
97 }
98 $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true);
99 }
100
101 if (!is_string($res)) return $res;
102 // denoncer l'erreur SQL dans sa version brute
103 spip_sql_erreur($serveur);
104 // idem dans sa version squelette (prefixe des tables non substitue)
105 erreur_squelette(array(sql_errno($serveur), sql_error($serveur), $res), $option);
106 return false;
107 }
108
109 // Recupere la syntaxe de la requete select sans l'executer
110 // simplement $option = false au lieu de true
111 // http://doc.spip.org/@sql_get_select
112 function sql_get_select($select = array(), $from = array(), $where = array(),
113 $groupby = array(), $orderby = array(), $limit = '', $having = array(),
114 $serveur='') {
115 return sql_select ($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false);
116 }
117
118 // Comme ci-dessus, mais ramene seulement et tout de suite le nombre de lignes
119 // Pas de colonne ni de tri a donner donc, et l'argument LIMIT est trompeur
120 // http://doc.spip.org/@sql_countsel
121 function sql_countsel($from = array(), $where = array(),
122 $groupby = array(), $having = array(),
123 $serveur='', $option=true) {
124 $f = sql_serveur('countsel', $serveur, $option==='continue' OR $option===false);
125 if (!is_string($f) OR !$f) return false;
126 $r = $f($from, $where, $groupby, $having, $serveur, $option!==false);
127 if ($r===false) spip_sql_erreur($serveur);
128 return $r;
129 }
130
131 // http://doc.spip.org/@sql_alter
132 function sql_alter($q, $serveur='', $option=true) {
133 $f = sql_serveur('alter', $serveur, $option==='continue' OR $option===false);
134 if (!is_string($f) OR !$f) return false;
135 $r = $f($q, $serveur, $option!==false);
136 if ($r===false) spip_sql_erreur($serveur);
137 return $r;
138 }
139
140 // http://doc.spip.org/@sql_fetch
141 function sql_fetch($res, $serveur='', $option=true) {
142 $f = sql_serveur('fetch', $serveur, $option==='continue' OR $option===false);
143 if (!is_string($f) OR !$f) return false;
144 return $f($res, NULL, $serveur, $option!==false);
145 }
146
147 function sql_fetch_all($res, $serveur='', $option=true){
148 $rows = array();
149 if (!$res) return $rows;
150 $f = sql_serveur('fetch', $serveur, $option==='continue' OR $option===false);
151 if (!is_string($f) OR !$f) return array();
152 while ($r = $f($res, NULL, $serveur, $option!==false))
153 $rows[] = $r;
154 sql_free($res, $serveur);
155 return $rows;
156 }
157
158 function sql_seek($res, $row_number, $serveur='', $option=true) {
159 $f = sql_serveur('seek', $serveur, $option==='continue' OR $option===false);
160 if (!is_string($f) OR !$f) return false;
161 $r = $f($res, $row_number, $serveur, $option!==false);
162 if ($r===false) spip_sql_erreur($serveur);
163 return $r;
164 }
165
166 // http://doc.spip.org/@sql_listdbs
167 function sql_listdbs($serveur='', $option=true) {
168 $f = sql_serveur('listdbs', $serveur, $option==='continue' OR $option===false);
169 if (!is_string($f) OR !$f) return false;
170 $r = $f($serveur);
171 if ($r===false) spip_sql_erreur($serveur);
172 return $r;
173 }
174
175 // http://doc.spip.org/@sql_selectdb
176 function sql_selectdb($nom, $serveur='', $option=true)
177 {
178 $f = sql_serveur('selectdb', $serveur, $option==='continue' OR $option===false);
179 if (!is_string($f) OR !$f) return false;
180 $r = $f($nom, $serveur, $option!==false);
181 if ($r===false) spip_sql_erreur($serveur);
182 return $r;
183 }
184
185 // http://doc.spip.org/@sql_count
186 function sql_count($res, $serveur='', $option=true)
187 {
188 $f = sql_serveur('count', $serveur, $option==='continue' OR $option===false);
189 if (!is_string($f) OR !$f) return false;
190 $r = $f($res, $serveur, $option!==false);
191 if ($r===false) spip_sql_erreur($serveur);
192 return $r;
193 }
194
195 // http://doc.spip.org/@sql_free
196 function sql_free($res, $serveur='', $option=true)
197 {
198 $f = sql_serveur('free', $serveur, $option==='continue' OR $option===false);
199 if (!is_string($f) OR !$f) return false;
200 return $f($res);
201 }
202
203 // Cette fonction ne garantit pas une portabilite totale
204 // ===> lui preferer la suivante.
205 // Elle est fournie pour permettre l'actualisation de vieux codes
206 // par un Sed brutal qui peut donner des resultats provisoirement acceptables
207 // http://doc.spip.org/@sql_insert
208 function sql_insert($table, $noms, $valeurs, $desc=array(), $serveur='', $option=true)
209 {
210 $f = sql_serveur('insert', $serveur, $option==='continue' OR $option===false);
211 if (!is_string($f) OR !$f) return false;
212 $r = $f($table, $noms, $valeurs, $desc, $serveur, $option!==false);
213 if ($r === false) spip_sql_erreur($serveur);
214 return $r;
215 }
216
217 // http://doc.spip.org/@sql_insertq
218 function sql_insertq($table, $couples=array(), $desc=array(), $serveur='', $option=true)
219 {
220 $f = sql_serveur('insertq', $serveur, $option==='continue' OR $option===false);
221 if (!is_string($f) OR !$f) return false;
222 $r = $f($table, $couples, $desc, $serveur, $option!==false);
223 if ($r === false) spip_sql_erreur($serveur);
224 return $r;
225 }
226
227 // http://doc.spip.org/@sql_insertq_multi
228 function sql_insertq_multi($table, $couples=array(), $desc=array(), $serveur='', $option=true)
229 {
230 $f = sql_serveur('insertq_multi', $serveur, $option==='continue' OR $option===false);
231 if (!is_string($f) OR !$f) return false;
232 $r = $f($table, $couples, $desc, $serveur, $option!==false);
233 if ($r === false) spip_sql_erreur($serveur);
234 return $r;
235 }
236
237 // http://doc.spip.org/@sql_update
238 function sql_update($table, $exp, $where='', $desc=array(), $serveur='', $option=true)
239 {
240 $f = sql_serveur('update', $serveur, $option==='continue' OR $option===false);
241 if (!is_string($f) OR !$f) return false;
242 $r = $f($table, $exp, $where, $desc, $serveur, $option!==false);
243 if ($r === false) spip_sql_erreur($serveur);
244 return $r;
245 }
246
247 // Update est presque toujours appelee sur des constantes ou des dates
248 // Cette fonction est donc plus utile que la precedente,d'autant qu'elle
249 // permet de gerer les differences de representation des constantes.
250 // http://doc.spip.org/@sql_updateq
251 function sql_updateq($table, $exp, $where='', $desc=array(), $serveur='', $option=true)
252 {
253 $f = sql_serveur('updateq', $serveur, $option==='continue' OR $option===false);
254 if (!is_string($f) OR !$f) return false;
255 $r = $f($table, $exp, $where, $desc, $serveur, $option!==false);
256 if ($r === false) spip_sql_erreur($serveur);
257 return $r;
258 }
259
260 // http://doc.spip.org/@sql_delete
261 function sql_delete($table, $where='', $serveur='', $option=true)
262 {
263 $f = sql_serveur('delete', $serveur, $option==='continue' OR $option===false);
264 if (!is_string($f) OR !$f) return false;
265 $r = $f($table, $where, $serveur, $option!==false);
266 if ($r === false) spip_sql_erreur($serveur);
267 return $r;
268 }
269
270 // http://doc.spip.org/@sql_replace
271 function sql_replace($table, $couples, $desc=array(), $serveur='', $option=true)
272 {
273 $f = sql_serveur('replace', $serveur, $option==='continue' OR $option===false);
274 if (!is_string($f) OR !$f) return false;
275 $r = $f($table, $couples, $desc, $serveur, $option!==false);
276 if ($r === false) spip_sql_erreur($serveur);
277 return $r;
278 }
279
280
281 // http://doc.spip.org/@sql_replace_multi
282 function sql_replace_multi($table, $tab_couples, $desc=array(), $serveur='', $option=true)
283 {
284 $f = sql_serveur('replace_multi', $serveur, $option==='continue' OR $option===false);
285 if (!is_string($f) OR !$f) return false;
286 $r = $f($table, $tab_couples, $desc, $serveur, $option!==false);
287 if ($r === false) spip_sql_erreur($serveur);
288 return $r;
289 }
290
291 // http://doc.spip.org/@sql_drop_table
292 function sql_drop_table($table, $exist='', $serveur='', $option=true)
293 {
294 $f = sql_serveur('drop_table', $serveur, $option==='continue' OR $option===false);
295 if (!is_string($f) OR !$f) return false;
296 $r = $f($table, $exist, $serveur, $option!==false);
297 if ($r === false) spip_sql_erreur($serveur);
298 return $r;
299 }
300
301 // supprimer une vue sql
302 // http://doc.spip.org/@sql_drop_view
303 function sql_drop_view($table, $exist='', $serveur='', $option=true)
304 {
305 $f = sql_serveur('drop_view', $serveur, $option==='continue' OR $option===false);
306 if (!is_string($f) OR !$f) return false;
307 $r = $f($table, $exist, $serveur, $option!==false);
308 if ($r === false) spip_sql_erreur($serveur);
309 return $r;
310 }
311
312 // http://doc.spip.org/@sql_showbase
313 function sql_showbase($spip=NULL, $serveur='', $option=true)
314 {
315 if ($spip == NULL){
316 $connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0];
317 $spip = $connexion['prefixe'] . '\_%';
318 }
319
320 $f = sql_serveur('showbase', $serveur, $option==='continue' OR $option===false);
321 if (!is_string($f) OR !$f) return false;
322 return $f($spip, $serveur, $option!==false);
323 }
324
325 function sql_alltable($spip=NULL, $serveur='', $option=true)
326 {
327 $q = sql_showbase($spip, $serveur, $option);
328 $r = array();
329 if ($q) while ($t = sql_fetch($q, $serveur)) { $r[] = array_shift($t);}
330 return $r;
331 }
332
333 // http://doc.spip.org/@sql_showtable
334 function sql_showtable($table, $table_spip = false, $serveur='', $option=true)
335 {
336 if ($table_spip){
337 $connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0];
338 $prefixe = $connexion['prefixe'];
339 $vraie_table = preg_replace('/^spip/', $prefixe, $table);
340 } else $vraie_table = $table;
341
342 $f = sql_serveur('showtable', $serveur, $option==='continue' OR $option===false);
343 if (!is_string($f) OR !$f) return false;
344 $f = $f($vraie_table, $serveur, $option!==false);
345 if (!$f) return array();
346 if (isset($GLOBALS['tables_principales'][$table]['join']))
347 $f['join'] = $GLOBALS['tables_principales'][$table]['join'];
348 elseif (isset($GLOBALS['tables_auxiliaires'][$table]['join']))
349 $f['join'] = $GLOBALS['tables_auxiliaires'][$table]['join'];
350 return $f;
351 }
352
353 // http://doc.spip.org/@sql_create
354 function sql_create($nom, $champs, $cles=array(), $autoinc=false, $temporary=false, $serveur='', $option=true) {
355 $f = sql_serveur('create', $serveur, $option==='continue' OR $option===false);
356 if (!is_string($f) OR !$f) return false;
357 $r = $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option!==false);
358 if ($r === false) spip_sql_erreur($serveur);
359 return $r;
360 }
361
362 function sql_create_base($nom, $serveur='', $option=true)
363 {
364 $f = sql_serveur('create_base', $serveur, $option==='continue' OR $option===false);
365 if (!is_string($f) OR !$f) return false;
366 $r = $f($nom, $serveur, $option!==false);
367 if ($r === false) spip_sql_erreur($serveur);
368 return $r;
369 }
370
371 // Fonction pour creer une vue
372 // nom : nom de la vue,
373 // select_query : une requete select, idealement cree avec $req = sql_select()
374 // (en mettant $option du sql_select a false pour recuperer la requete)
375 // http://doc.spip.org/@sql_create_view
376 function sql_create_view($nom, $select_query, $serveur='', $option=true) {
377 $f = sql_serveur('create_view', $serveur, $option==='continue' OR $option===false);
378 if (!is_string($f) OR !$f) return false;
379 $r = $f($nom, $select_query, $serveur, $option!==false);
380 if ($r === false) spip_sql_erreur($serveur);
381 return $r;
382 }
383
384 // http://doc.spip.org/@sql_multi
385 function sql_multi($sel, $lang, $serveur='', $option=true)
386 {
387 $f = sql_serveur('multi', $serveur, $option==='continue' OR $option===false);
388 if (!is_string($f) OR !$f) return false;
389 return $f($sel, $lang);
390 }
391
392 // http://doc.spip.org/@sql_error
393 function sql_error($serveur='') {
394 $f = sql_serveur('error', $serveur, 'continue');
395 if (!is_string($f) OR !$f) return false;
396 return $f('query inconnue', $serveur);
397 }
398
399 // http://doc.spip.org/@sql_errno
400 function sql_errno($serveur='') {
401 $f = sql_serveur('errno', $serveur, 'continue');
402 if (!is_string($f) OR !$f) return false;
403 return $f($serveur);
404 }
405
406 // http://doc.spip.org/@sql_explain
407 function sql_explain($q, $serveur='', $option=true) {
408 $f = sql_serveur('explain', $serveur, 'continue');
409 if (!is_string($f) OR !$f) return false;
410 $r = $f($q, $serveur, $option!==false);
411 if ($r === false) spip_sql_erreur($serveur);
412 return $r;
413 }
414
415 // http://doc.spip.org/@sql_optimize
416 function sql_optimize($table, $serveur='', $option=true) {
417 $f = sql_serveur('optimize', $serveur, $option==='continue' OR $option===false);
418 if (!is_string($f) OR !$f) return false;
419 $r = $f($table, $serveur, $option!==false);
420 if ($r === false) spip_sql_erreur($serveur);
421 return $r;
422 }
423
424 // http://doc.spip.org/@sql_repair
425 function sql_repair($table, $serveur='', $option=true) {
426 $f = sql_serveur('repair', $serveur, $option==='continue' OR $option===false);
427 if (!is_string($f) OR !$f) return false;
428 $r = $f($table, $serveur, $option!==false);
429 if ($r === false) spip_sql_erreur($serveur);
430 return $r;
431 }
432
433 // Fonction la plus generale ... et la moins portable
434 // A n'utiliser qu'en derniere extremite
435
436 // http://doc.spip.org/@sql_query
437 function sql_query($ins, $serveur='', $option=true) {
438 $f = sql_serveur('query', $serveur, $option==='continue' OR $option===false);
439 if (!is_string($f) OR !$f) return false;
440 $r = $f($ins, $serveur, $option!==false);
441 if ($r === false) spip_sql_erreur($serveur);
442 return $r;
443 }
444
445 # une composition tellement frequente...
446 // http://doc.spip.org/@sql_fetsel
447 function sql_fetsel($select = array(), $from = array(), $where = array(),
448 $groupby = array(), $orderby = array(), $limit = '',
449 $having = array(), $serveur='', $option=true) {
450 $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
451 if ($option===false) return $q;
452 if (!$q) return array();
453 $r = sql_fetch($q, $serveur, $option);
454 sql_free($q, $serveur, $option);
455 return $r;
456 }
457
458 // Retourne le tableau de toutes les lignes d'une requete Select
459 // http://doc.spip.org/@sql_allfetsel
460 function sql_allfetsel($select = array(), $from = array(), $where = array(),
461 $groupby = array(), $orderby = array(), $limit = '',
462 $having = array(), $serveur='', $option=true) {
463 $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
464 if ($option===false) return $q;
465 return sql_fetch_all($q, $serveur, $option);
466 }
467
468 # Retourne l'unique champ demande dans une requete Select a resultat unique
469 // http://doc.spip.org/@sql_getfetsel
470 function sql_getfetsel($select, $from = array(), $where = array(), $groupby = array(),
471 $orderby = array(), $limit = '', $having = array(), $serveur='', $option=true) {
472 if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) $id = $c[1];
473 elseif (!preg_match('/\W/', $select)) $id = $select;
474 else {$id = 'n'; $select .= ' AS n';}
475 $r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option);
476 if ($option===false) return $r;
477 if (!$r) return NULL;
478 return $r[$id];
479 }
480
481 // http://doc.spip.org/@sql_version
482 function sql_version($serveur='', $option=true) {
483 $row = sql_fetsel("version() AS n", '','','','','','',$serveur);
484 return ($row['n']);
485 }
486
487 // prend une chaine sur l'aphabet hexa
488 // et retourne sa representation numerique:
489 // FF ==> 0xFF en MySQL mais x'FF' en PG
490 // http://doc.spip.org/@sql_hex
491 function sql_hex($val, $serveur='', $option=true)
492 {
493 $f = sql_serveur('hex', $serveur, $option==='continue' OR $option===false);
494 if (!is_string($f) OR !$f) return false;
495 return $f($val);
496 }
497
498 function sql_quote($val, $serveur='', $type='')
499 {
500 $f = sql_serveur('quote', $serveur, true);
501 if (!is_string($f) OR !$f) $f = '_q';
502 return $f($val, $type);
503 }
504
505 function sql_date_proche($champ, $interval, $unite, $serveur='', $option=true)
506 {
507 $f = sql_serveur('date_proche', $serveur, true);
508 if (!is_string($f) OR !$f) return false;
509 return $f($champ, $interval, $unite);
510 }
511
512 function sql_in($val, $valeurs, $not='', $serveur='', $option=true) {
513 if (is_array($valeurs)) {
514 $f = sql_serveur('quote', $serveur, true);
515 if (!is_string($f) OR !$f) return false;
516 $valeurs = join(',', array_map($f, array_unique($valeurs)));
517 } elseif ($valeurs[0]===',') $valeurs = substr($valeurs,1);
518 if (!strlen(trim($valeurs))) return ($not ? "0=0" : '0=1');
519
520 $f = sql_serveur('in', $serveur, $option==='continue' OR $option===false);
521 if (!is_string($f) OR !$f) return false;
522 return $f($val, $valeurs, $not, $serveur, $option!==false);
523 }
524
525 // Penser a dire dans la description du serveur
526 // s'il accepte les requetes imbriquees afin d'optimiser ca
527
528 // http://doc.spip.org/@sql_in_select
529 function sql_in_select($in, $select, $from = array(), $where = array(),
530 $groupby = array(), $orderby = array(), $limit = '', $having = array(), $serveur='')
531 {
532 $liste = array();
533 $res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur);
534 while ($r = sql_fetch($res)) {$liste[] = array_shift($r);}
535 sql_free($res);
536 return sql_in($in, $liste);
537 }
538
539
540 // http://doc.spip.org/@sql_test_int
541 function sql_test_int($type, $serveur='', $option=true)
542 {
543 return (preg_match('/^bigint/i',$type)
544 OR preg_match('/^int/i',$type)
545 OR preg_match('/^tinyint/i',$type));
546 }
547
548 // http://doc.spip.org/@sql_test_date
549 function sql_test_date($type, $serveur='', $option=true)
550 {
551 return (preg_match('/^datetime/i',$type)
552 OR preg_match('/^timestamp/i',$type));
553 }
554
555
556 // Cette fonction devrait disparaitre
557
558 // http://doc.spip.org/@description_table
559 function description_table($nom){
560
561 global $tables_principales, $tables_auxiliaires;
562 static $f;
563
564 include_spip('base/serial');
565 if (isset($tables_principales[$nom]))
566 return $tables_principales[$nom];
567
568 include_spip('base/auxiliaires');
569 if (isset($tables_auxiliaires[$nom]))
570 return $tables_auxiliaires[$nom];
571
572 if (!$f) $f = charger_fonction('trouver_table', 'base');
573 return $f($nom);
574 }
575
576
577 if(!function_exists("ctype_xdigit")){
578 function ctype_xdigit($string = ""){
579 return !strlen( trim( $string, "1234567890abcdefABCDEF" ) );
580 }/* endfunction ctype_xdigit */
581 }/* endif not function_exists ctype_xdigit */
582
583 ?>