squellete2
[aidenligne_francais_universite.git] / ecrire / base / abstract_sql.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2007 *
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 // Chargement a la volee de la description d'un serveur de base de donnees
16
17 // http://doc.spip.org/@spip_abstract_serveur
18 function spip_abstract_serveur($ins_sql, $serveur) {
19
20 // le serveur par defaut est indique par spip_connect
21 // qui etablira la premiere connexion si ce n'est fait.
22 if (!$serveur) {
23 if (spip_connect())
24 $f = 'spip_mysql_' . $ins_sql;
25 else $f = '';
26 } else {
27 // c'est un autre; s'y connecter si ce n'est fait
28 $f = 'spip_' . $serveur . '_' . $ins_sql;
29 if (function_exists($f)) return $f;
30
31 $d = find_in_path('inc_connect-' . $serveur . '.php');
32 if (@file_exists($d))
33 include($d);
34 else spip_log("pas de fichier $d pour decrire le serveur '$serveur'");
35 }
36 if (function_exists($f)) return $f;
37
38 include_spip('public/debug');
39 erreur_squelette(" $f " ._T('zbug_serveur_indefini'), $serveur);
40
41 // hack pour continuer la chasse aux erreurs
42 return 'spip_log';
43 }
44
45 // Cette fonction est systematiquement appelee par les squelettes
46 // pour constuire une requete SQL de type "lecture" (SELECT) a partir
47 // de chaque boucle.
48 // Elle construit et exe'cute une reque^te SQL correspondant a` une balise
49 // Boucle ; elle notifie une erreur SQL dans le flux de sortie et termine
50 // le processus.
51 // Sinon, retourne la ressource interrogeable par spip_abstract_fetch.
52 // Recoit en argument:
53 // - le tableau des champs a` ramener (Select)
54 // - le tableau des tables a` consulter (From)
55 // - le tableau des conditions a` remplir (Where)
56 // - le crite`re de regroupement (Group by)
57 // - le tableau de classement (Order By)
58 // - le crite`re de limite (Limit)
59 // - une sous-requete e'ventuelle (inutilisee pour le moment. MySQL > 4.1)
60 // - le tableau des des post-conditions a remplir (Having)
61 // - le nom de la table (pour le message d'erreur e'ventuel)
62 // - le nom de la boucle (pour le message d'erreur e'ventuel)
63 // - le serveur sollicite (pour retrouver la connexion)
64
65 // http://doc.spip.org/@spip_abstract_select
66 function spip_abstract_select (
67 $select = array(), $from = array(), $where = array(),
68 $groupby = '', $orderby = array(), $limit = '',
69 $sousrequete = '', $having = array(),
70 $table = '', $id = '', $serveur='') {
71
72 $f = spip_abstract_serveur('select', $serveur);
73
74 return $f($select, $from, $where,
75 $groupby, $orderby, $limit,
76 $sousrequete, $having,
77 $table, $id, $serveur);
78 }
79
80 // http://doc.spip.org/@spip_abstract_fetch
81 function spip_abstract_fetch($res, $serveur='') {
82 $f = spip_abstract_serveur('fetch', $serveur);
83 return $f($res);
84 }
85
86 // http://doc.spip.org/@spip_abstract_count
87 function spip_abstract_count($res, $serveur='')
88 {
89 $f = spip_abstract_serveur('count', $serveur);
90 return $f($res);
91 }
92
93 // http://doc.spip.org/@spip_abstract_free
94 function spip_abstract_free($res, $serveur='')
95 {
96 $f = spip_abstract_serveur('free', $serveur);
97 return $f($res);
98 }
99
100 // http://doc.spip.org/@spip_abstract_insert
101 function spip_abstract_insert($table, $noms, $valeurs, $serveur='')
102 {
103 $f = spip_abstract_serveur('insert', $serveur);
104 return $f($table, $noms, $valeurs);
105 }
106
107 // http://doc.spip.org/@spip_abstract_showtable
108 function spip_abstract_showtable($table, $serveur='', $table_spip = false)
109 {
110 if ($table_spip){
111 if ($GLOBALS['table_prefix']) $table_pref = $GLOBALS['table_prefix']."_";
112 else $table_pref = "";
113 $table = preg_replace('/^spip_/', $table_pref, $table);
114 }
115
116 $f = spip_abstract_serveur('showtable', $serveur);
117 return $f($table);
118 }
119
120 // http://doc.spip.org/@spip_abstract_create
121 function spip_abstract_create($nom, $champs, $cles, $autoinc=false, $temporary=false, $serveur='') {
122 $f = spip_abstract_serveur('create', $serveur);
123 return $f($nom, $champs, $cles, $autoinc, $temporary);
124 }
125
126 # une composition tellement frequente...
127 // http://doc.spip.org/@spip_abstract_fetsel
128 function spip_abstract_fetsel(
129 $select = array(), $from = array(), $where = array(),
130 $groupby = '', $orderby = array(), $limit = '',
131 $sousrequete = '', $having = array(),
132 $table = '', $id = '', $serveur='') {
133 return spip_abstract_fetch(spip_abstract_select(
134 $select, $from, $where, $groupby, $orderby, $limit,
135 $sousrequete, $having, $table, $id, $serveur),
136 $serveur);
137 }
138
139
140 //
141 // IN (...) est limite a 255 elements, d'ou cette fonction assistante
142 //
143 // http://doc.spip.org/@calcul_mysql_in
144 function calcul_mysql_in($val, $valeurs, $not='') {
145 if (!strlen(trim($valeurs))) return ($not ? "0=0" : '0=1');
146
147 $n = $i = 0;
148 $in_sql ="";
149 while ($n = strpos($valeurs, ',', $n+1)) {
150 if ((++$i) >= 255) {
151 $in_sql .= "($val $not IN (" .
152 substr($valeurs, 0, $n) .
153 "))\n" .
154 ($not ? "AND\t" : "OR\t");
155 $valeurs = substr($valeurs, $n+1);
156 $i = $n = 0;
157 }
158 }
159 $in_sql .= "($val $not IN ($valeurs))";
160
161 return "($in_sql)";
162 }
163
164
165 // Une version d'abstract_showtable prenant en compte les tables predefinies
166 // Faudrait tester un jour si ca accelere vraiment.
167
168 // http://doc.spip.org/@description_table
169 function description_table($nom){
170 global $tables_principales, $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql;
171 static $tables_externes = array();
172
173 if (isset($tables_externes[$nom]))
174 return array($nom, $tables_externes[$nom]);
175
176 $nom_table = $nom;
177 if (in_array($nom, $table_des_tables))
178 $nom_table = 'spip_' . $nom;
179
180 include_spip('base/serial');
181 if (isset($tables_principales[$nom_table]))
182 return array($nom_table, $tables_principales[$nom_table]);
183
184 include_spip('base/auxiliaires');
185 $nom_table = 'spip_' . $nom;
186 if (isset($tables_auxiliaires[$nom_table]))
187 return array($nom_table, $tables_auxiliaires[$nom_table]);
188
189 if ($desc = spip_abstract_showtable($nom, '', true))
190 if (isset($desc['field'])) {
191 $tables_externes[$nom] = $desc;
192 return array($nom, $desc);
193 }
194
195 return array($nom,array());
196 }
197 ?>