PageRenderTime 47ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/spip/ecrire/base/connect_sql.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 358 lines | 241 code | 36 blank | 81 comment | 47 complexity | 8f7815cb5346daf63c070e02a8049b04 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. //
  13. // Utilitaires indispensables autour des serveurs SQL
  14. //
  15. // API d'appel aux bases de donnees:
  16. // on charge le fichier config/$serveur ($serveur='connect' pour le principal)
  17. // qui est cense initaliser la connexion en appelant spip_connect_db
  18. // laquelle met dans la globale db_ok la description de la connexion
  19. // On la memorise dans un tableau pour permettre plusieurs serveurs.
  20. // A l'installation, il faut simuler l'existence de ce fichier
  21. // http://doc.spip.org/@spip_connect
  22. function spip_connect($serveur='', $version='') {
  23. global $connexions, $spip_sql_version;
  24. $serveur = !is_string($serveur) ? '' : strtolower($serveur);
  25. $index = $serveur ? $serveur : 0;
  26. if (!$version) $version = $spip_sql_version;
  27. if (isset($connexions[$index][$version])) return $connexions[$index];
  28. include_spip('base/abstract_sql');
  29. $install = (_request('exec') == 'install');
  30. // Premiere connexion ?
  31. if (!($old = isset($connexions[$index]))) {
  32. $f = (!preg_match('/^[\w\.]*$/', $serveur))
  33. ? '' // nom de serveur mal ecrit
  34. : ($serveur ?
  35. ( _DIR_CONNECT. $serveur . '.php') // serveur externe
  36. : (_FILE_CONNECT ? _FILE_CONNECT // serveur principal ok
  37. : ($install ? _FILE_CONNECT_TMP // init du serveur principal
  38. : ''))); // installation pas faite
  39. unset($GLOBALS['db_ok']);
  40. unset($GLOBALS['spip_connect_version']);
  41. if ($f) {
  42. if (is_readable($f)) {
  43. include($f);
  44. } elseif ($serveur AND !$install) {
  45. // chercher une declaration de serveur dans le path
  46. // qui pourra un jour servir a declarer des bases sqlite
  47. // par des plugins. Et sert aussi aux boucles POUR.
  48. find_in_path("$serveur.php",'connect/',true);
  49. }
  50. }
  51. if (!isset($GLOBALS['db_ok'])) {
  52. // fera mieux la prochaine fois
  53. if ($install) return false;
  54. if ($f AND $readable)
  55. spip_log("spip_connect: fichier de connexion '$f' OK.");
  56. else
  57. spip_log("spip_connect: fichier de connexion '$f' non trouve");
  58. spip_log("spip_connect: echec connexion ou serveur $index mal defini dans '$f'.");
  59. // ne plus reessayer si ce n'est pas l'install
  60. return $connexions[$index]=false;
  61. }
  62. $connexions[$index] = $GLOBALS['db_ok'];
  63. }
  64. // si la connexion a deja ete tentee mais a echoue, le dire!
  65. if (!$connexions[$index]) return false;
  66. // la connexion a reussi ou etait deja faite.
  67. // chargement de la version du jeu de fonctions
  68. // si pas dans le fichier par defaut
  69. $type = $GLOBALS['db_ok']['type'];
  70. $jeu = 'spip_' . $type .'_functions_' . $version;
  71. if (!isset($GLOBALS[$jeu])) {
  72. if (!find_in_path($type . '_' . $version . '.php', 'req/', true)){
  73. spip_log("spip_connect: serveur $index version '$version' non defini pour '$type'");
  74. // ne plus reessayer
  75. return $connexions[$index][$version] = array();
  76. }
  77. }
  78. $connexions[$index][$version] = $GLOBALS[$jeu];
  79. if ($old) return $connexions[$index];
  80. $connexions[$index]['spip_connect_version'] = isset($GLOBALS['spip_connect_version']) ? $GLOBALS['spip_connect_version'] : 0;
  81. // initialisation de l'alphabet utilise dans les connexions SQL
  82. // si l'installation l'a determine.
  83. // Celui du serveur principal l'impose aux serveurs secondaires
  84. // s'ils le connaissent
  85. if (!$serveur) {
  86. $charset = spip_connect_main($GLOBALS[$jeu]);
  87. if (!$charset) {
  88. unset($connexions[$index]);
  89. spip_log("spip_connect: absence de charset");
  90. return false;
  91. }
  92. } else {
  93. if ($connexions[$index]['spip_connect_version']
  94. AND $r = sql_getfetsel('valeur', 'spip_meta', "nom='charset_sql_connexion'",'','','','',$serveur))
  95. $charset = $r;
  96. else $charset = -1;
  97. }
  98. if ($charset != -1) {
  99. $f = $GLOBALS[$jeu]['set_charset'];
  100. if (function_exists($f))
  101. $f($charset, $serveur);
  102. }
  103. return $connexions[$index];
  104. }
  105. function spip_sql_erreur($serveur='')
  106. {
  107. $connexion = spip_connect($serveur);
  108. $e = sql_errno($serveur);
  109. $t = (isset($connexion['type']) ? $connexion['type'] : 'sql');
  110. $m = "Erreur $e de $t: " . sql_error($serveur) . "\n" . $connexion['last'];
  111. $f = $t . $serveur;
  112. spip_log($m, $f);
  113. }
  114. // Cette fonction ne doit etre appelee qu'a travers la fonction sql_serveur
  115. // definie dans base/abstract_sql
  116. // Elle existe en tant que gestionnaire de versions,
  117. // connue seulement des convertisseurs automatiques
  118. // http://doc.spip.org/@spip_connect_sql
  119. function spip_connect_sql($version, $ins='', $serveur='', $cont=false) {
  120. $desc = spip_connect($serveur, $version);
  121. if (function_exists($f = @$desc[$version][$ins])) return $f;
  122. if ($cont) return $desc;
  123. if ($ins)
  124. spip_log("Le serveur '$serveur' version $version n'a pas '$ins'");
  125. include_spip('inc/minipres');
  126. echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
  127. exit;
  128. }
  129. // Fonction appelee par le fichier cree dans config/ a l'instal'.
  130. // Il contient un appel direct a cette fonction avec comme arguments
  131. // les identifants de connexion.
  132. // Si la connexion reussit, la globale db_ok memorise sa description.
  133. // C'est un tableau egalement retourne en valeur, pour les appels a l'install'
  134. // http://doc.spip.org/@spip_connect_db
  135. function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $prefixe='', $auth='') {
  136. global $db_ok;
  137. ## TODO : mieux differencier les serveurs
  138. $f = _DIR_TMP . $type . 'out';
  139. if (@file_exists($f)
  140. AND (time() - @filemtime($f) < 30)
  141. AND !defined('_ECRIRE_INSTALL')) {
  142. spip_log("Echec : $f recent. Pas de tentative de connexion");
  143. return;
  144. }
  145. if (!$prefixe)
  146. $prefixe = isset($GLOBALS['table_prefix'])
  147. ? $GLOBALS['table_prefix'] : $db;
  148. $h = charger_fonction($type, 'req', true);
  149. if (!$h) {
  150. spip_log("les requetes $type ne sont pas fournies");
  151. return;
  152. }
  153. if ($g = $h($host, $port, $login, $pass, $db, $prefixe)) {
  154. if (!is_array($auth)) {
  155. // compatibilite version 0.7 initiale
  156. $g['ldap'] = $auth;
  157. $auth = array('ldap' => $auth);
  158. }
  159. $g['authentification'] = $auth;
  160. $g['type'] = $type;
  161. return $db_ok = $g;
  162. }
  163. // En cas d'indisponibilite du serveur, eviter de le bombarder
  164. if (!defined('_ECRIRE_INSTALL')) {
  165. @touch($f);
  166. spip_log("Echec connexion serveur $type : host[$host] port[$port] login[$login] base[$db]", $type);
  167. }
  168. }
  169. // Premiere connexion au serveur principal:
  170. // retourner le charset donnee par la table principale
  171. // mais verifier que le fichier de connexion n'est pas trop vieux
  172. // Version courante = 0.7
  173. // La version 0.7 indique un serveur d'authentification comme 8e arg
  174. // La version 0.6 indique le prefixe comme 7e arg
  175. // La version 0.5 indique le serveur comme 6e arg
  176. //
  177. // La version 0.0 (non numerotee) doit etre refaite par un admin
  178. // les autres fonctionnent toujours, meme si :
  179. // - la version 0.1 est moins performante que la 0.2
  180. // - la 0.2 fait un include_ecrire('inc_db_mysql.php3').
  181. // http://doc.spip.org/@spip_connect_main
  182. function spip_connect_main($connexion)
  183. {
  184. if ($GLOBALS['spip_connect_version']< 0.1 AND _DIR_RESTREINT){
  185. include_spip('inc/headers');
  186. redirige_url_ecrire('upgrade', 'reinstall=oui');
  187. }
  188. if (!($f = $connexion['select'])) return false;
  189. if (!$r = $f('valeur','spip_meta', "nom='charset_sql_connexion'"))
  190. return false;
  191. if (!($f = $connexion['fetch'])) return false;
  192. $r = $f($r);
  193. return ($r['valeur'] ? $r['valeur'] : -1);
  194. }
  195. // compatibilite
  196. function spip_connect_ldap($serveur='') {
  197. include_spip('auth/ldap');
  198. return auth_ldap_connect($serveur);
  199. }
  200. // 1 interface de abstract_sql a demenager dans base/abstract_sql a terme
  201. // http://doc.spip.org/@_q
  202. function _q ($a) {
  203. return (is_numeric($a)) ? strval($a) :
  204. (!is_array($a) ? ("'" . addslashes($a) . "'")
  205. : join(",", array_map('_q', $a)));
  206. }
  207. // Nommage bizarre des tables d'objets
  208. // http://doc.spip.org/@table_objet
  209. function table_objet($type) {
  210. static $surnoms = null;
  211. if (!$type) return;
  212. if (!$surnoms){
  213. // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
  214. $surnoms = pipeline('declarer_tables_objets_surnoms',
  215. array(
  216. 'article' => 'articles',
  217. 'auteur' => 'auteurs',
  218. 'breve' => 'breves',
  219. 'document' => 'documents',
  220. 'doc' => 'documents', # pour les modeles
  221. 'img' => 'documents',
  222. 'emb' => 'documents',
  223. 'groupe_mots' => 'groupes_mots', # hum
  224. 'groupe_mot' => 'groupes_mots', # hum
  225. 'groupe' => 'groupes_mots', # hum (EXPOSE)
  226. 'message' => 'messages',
  227. 'mot' => 'mots',
  228. 'petition' => 'petitions',
  229. 'rubrique' => 'rubriques',
  230. 'signature' => 'signatures',
  231. 'syndic' => 'syndic',
  232. 'site' => 'syndic', # hum hum
  233. 'syndic_article' => 'syndic_articles',
  234. 'type_document' => 'types_documents', # hum
  235. 'extension' => 'types_documents' # hum
  236. ));
  237. }
  238. return isset($surnoms[$type])
  239. ? $surnoms[$type]
  240. : preg_replace(',ss$,', 's', $type."s");
  241. }
  242. // http://doc.spip.org/@table_objet_sql
  243. function table_objet_sql($type) {
  244. global $table_des_tables;
  245. $nom = table_objet($type);
  246. include_spip('public/interfaces');
  247. if (isset($table_des_tables[$nom])) {
  248. $t = $table_des_tables[$nom];
  249. $nom = 'spip_' . $t;
  250. }
  251. return $nom ;
  252. }
  253. // http://doc.spip.org/@id_table_objet
  254. function id_table_objet($type,$serveur='') {
  255. $type = preg_replace(',^spip_|s$,', '', $type);
  256. if ($type == 'type')
  257. return 'extension';
  258. else {
  259. if (!$type) return;
  260. $t = table_objet($type);
  261. $trouver_table = charger_fonction('trouver_table', 'base');
  262. $desc = $trouver_table($t,$serveur);
  263. return @$desc['key']["PRIMARY KEY"];
  264. }
  265. }
  266. // http://doc.spip.org/@objet_type
  267. function objet_type($table_objet){
  268. static $surnoms = null;
  269. if (!$surnoms){
  270. // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions
  271. $surnoms = pipeline('declarer_type_surnoms', array());
  272. }
  273. // scenario de base
  274. // le type est decline a partir du nom de la table en enlevant le prefixe eventuel
  275. // et la marque du pluriel
  276. $type = preg_replace(',^spip_|s$,', '', $table_objet);
  277. if (isset($surnoms[$type]))
  278. return $surnoms[$type];
  279. // si le type redonne bien la table c'est bon
  280. if ( (table_objet($type)==$table_objet)
  281. OR (table_objet_sql($type)==$table_objet))
  282. return $type;
  283. // sinon on passe par la cle primaire id_xx pour trouver le type
  284. // car le s a la fin est incertain
  285. // notamment en cas de pluriel derogatoire
  286. // id_jeu/spip_jeux id_journal/spip_journaux qui necessitent tout deux
  287. // une declaration jeu => jeux, journal => journaux
  288. // dans le pipeline declarer_tables_objets_surnoms
  289. $trouver_table = charger_fonction('trouver_table', 'base');
  290. if ($desc = $trouver_table($table_objet)
  291. AND isset($desc['key']["PRIMARY KEY"])){
  292. $primary = $desc['key']["PRIMARY KEY"];
  293. $primary = explode(',',$primary);
  294. $primary = reset($primary);
  295. $type = preg_replace(',^id_,', '', $primary);
  296. }
  297. // on a fait ce qu'on a pu
  298. return $type;
  299. }
  300. // Recuperer le nom de la table de jointure xxxx sur l'objet yyyy
  301. // http://doc.spip.org/@table_jointure
  302. function table_jointure($x, $y) {
  303. $trouver_table = charger_fonction('trouver_table', 'base');
  304. $xdesc = $trouver_table(table_objet($x));
  305. $ydesc = $trouver_table(table_objet($y));
  306. $tx = $xdesc['table'];
  307. $ty = $ydesc['table'];
  308. $ix = @$xdesc['key']["PRIMARY KEY"];
  309. $iy = @$ydesc['key']["PRIMARY KEY"];
  310. if ($table = $GLOBALS['tables_jointures'][$ty][$ix]) return $table;
  311. if ($table = $GLOBALS['tables_jointures'][$tx][$iy]) return $table;
  312. return '';
  313. }
  314. // Pour compatibilite. Ne plus utiliser.
  315. // http://doc.spip.org/@spip_query
  316. function spip_query($query, $serveur='') {
  317. global $spip_sql_version;
  318. $f = spip_connect_sql($spip_sql_version, 'query', $serveur, true);
  319. return function_exists($f) ? $f($query, $serveur) : false;
  320. }
  321. ?>