Commit | Line | Data |
---|---|---|
c495c100 P |
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 | ?> |