Dépôt officiel du core SPIP * Anciennement présent sur svn://trac.rezo.net/spip * Les plugins-dist faisant partie de la distribution SPIP sont présents dans https://git.spip.net/SPIP/[nom du plugin dist] https://www.spip.net
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.5 KiB

20 years ago
17 years ago
17 years ago
20 years ago
20 years ago
Interface au serveur SQL pour permettre la connexion multi-base. Les fonctions spip_query et spip_connect admettent un argument supplémentaire optionnel indiquant un serveur de base de données. Le résultat de spip_connect est la fonction à appeler pour effectuer une requete au serveur. Ces fonctions de requetes sont indiquées dans un tableau statique indexé par les différents serveurs. Le tableau est vide au départ, et s'enrichit lors du premiere appe de spip_connect avec un argument nouveau, S. A ce moment, spip_connect charge le fichier base/S.php et invoque la fonction sans argument base_S censée initialisée la connexion au serveur et retourner le nom de la fonction de requetes. Cette fonction est mémorisée dans le tableau statique, afin qu'aux appels suivants, spip_connect retourne immédiatement cette fonction. Ainsi, spip_query peut appeler systématiquement spip_connect sans perte de performances. Cette interface est complètement transparente dans le cas habituel. La globale db_ok (qui n'apparait plus que dans base/db_mysql et une fois à l'installation) est en particulier toujours disponible, mais doit etre considérée comme obsolète: il faut appeler spip_connect() pour savoir si la base est disponible et initialiser la connexion si ce n'est fait. L'utilisation principale de ces changements est de pouvoir appeler spip_query(requete, serveur) dans les fonctions implémentant les modèles de fonctions de abstract_sql.php. En particulier, la fonction par défaut spip_query_db qui repose sur des globales décrivant la connexion standard, peut etre remplacée par une autre fonction s'adressant à un autre serveur SQL, tout en profitant de toutes les autres fonctions de db_mysql.
15 years ago
Interface au serveur SQL pour permettre la connexion multi-base. Les fonctions spip_query et spip_connect admettent un argument supplémentaire optionnel indiquant un serveur de base de données. Le résultat de spip_connect est la fonction à appeler pour effectuer une requete au serveur. Ces fonctions de requetes sont indiquées dans un tableau statique indexé par les différents serveurs. Le tableau est vide au départ, et s'enrichit lors du premiere appe de spip_connect avec un argument nouveau, S. A ce moment, spip_connect charge le fichier base/S.php et invoque la fonction sans argument base_S censée initialisée la connexion au serveur et retourner le nom de la fonction de requetes. Cette fonction est mémorisée dans le tableau statique, afin qu'aux appels suivants, spip_connect retourne immédiatement cette fonction. Ainsi, spip_query peut appeler systématiquement spip_connect sans perte de performances. Cette interface est complètement transparente dans le cas habituel. La globale db_ok (qui n'apparait plus que dans base/db_mysql et une fois à l'installation) est en particulier toujours disponible, mais doit etre considérée comme obsolète: il faut appeler spip_connect() pour savoir si la base est disponible et initialiser la connexion si ce n'est fait. L'utilisation principale de ces changements est de pouvoir appeler spip_query(requete, serveur) dans les fonctions implémentant les modèles de fonctions de abstract_sql.php. En particulier, la fonction par défaut spip_query_db qui repose sur des globales décrivant la connexion standard, peut etre remplacée par une autre fonction s'adressant à un autre serveur SQL, tout en profitant de toutes les autres fonctions de db_mysql.
15 years ago
20 years ago
20 years ago
20 years ago
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2007 *
  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. // Les parametres generaux du site sont dans une table SQL;
  13. // Recopie dans le tableau PHP global meta, car on en a souvent besoin
  14. // http://doc.spip.org/@inc_meta_dist
  15. function inc_meta_dist()
  16. {
  17. // Lire les meta, en cache si present, valide et lisible
  18. if ($new = jeune_fichier(_FILE_META, 1<<24)
  19. # AND (@filemtime(_FILE_META) > @filemtime(_DIR_RESTREINT . '.svn/entries'))
  20. AND lire_fichier(_FILE_META, $meta))
  21. $GLOBALS['meta'] = @unserialize($meta);
  22. // sinon lire en base
  23. if (!$GLOBALS['meta']) $new = !lire_metas();
  24. // renouveller l'alea au besoin
  25. if (test_espace_prive()
  26. AND $GLOBALS['meta']
  27. AND (time() >/* _RENOUVELLE_ALEA + */ @$GLOBALS['meta']['alea_ephemere_date'])) {
  28. // si on n'a pas l'acces en ecriture sur le cache,
  29. // ne pas renouveller l'alea sinon le cache devient faux
  30. if (supprimer_fichier(_FILE_META)) {
  31. include_spip('inc/acces');
  32. renouvelle_alea();
  33. $new = false;
  34. } else spip_log("impossible d'ecrire dans " . _FILE_META);
  35. }
  36. // et refaire le cache si on a du lire en base
  37. if (!$new) ecrire_fichier(_FILE_META, serialize($GLOBALS['meta']));
  38. }
  39. // fonctions aussi appelees a l'install ==> spip_query en premiere requete
  40. // pour eviter l'erreur fatale (serveur non encore configure)
  41. // http://doc.spip.org/@lire_metas
  42. function lire_metas() {
  43. if ($result = spip_query("SELECT nom,valeur FROM spip_meta")) {
  44. include_spip('base/abstract_sql');
  45. $GLOBALS['meta'] = array();
  46. while ($row = sql_fetch($result))
  47. $GLOBALS['meta'][$row['nom']] = $row['valeur'];
  48. if (!$GLOBALS['meta']['charset'])
  49. ecrire_meta('charset', _DEFAULT_CHARSET);
  50. }
  51. return $GLOBALS['meta'];
  52. }
  53. // http://doc.spip.org/@effacer_meta
  54. function effacer_meta($nom) {
  55. // section critique sur le cache:
  56. // l'invalider avant et apres la MAJ de la BD
  57. // c'est un peu moints bien qu'un vrai verrou mais ca suffira
  58. @touch(_FILE_META,0);
  59. sql_delete("spip_meta", "nom='$nom'");
  60. @touch(_FILE_META,0);
  61. }
  62. // http://doc.spip.org/@ecrire_meta
  63. function ecrire_meta($nom, $valeur, $importable = NULL) {
  64. if (!$nom) return;
  65. $GLOBALS['meta'][$nom] = $valeur;
  66. $res = spip_query("SELECT impt,valeur FROM spip_meta WHERE nom=" . _q($nom));
  67. if (!$res) return;
  68. include_spip('base/abstract_sql');
  69. $res = sql_fetch($res);
  70. // conserver la valeur de impt si existante
  71. // et ne pas invalider le cache si affectation a l'identique
  72. if ($res AND $valeur == $res['valeur']) return;
  73. // cf effacer pour le double touch
  74. @touch(_FILE_META, 0);
  75. if ($res) {
  76. $r = ($importable === NULL) ? ''
  77. : (", impt=" . _q($importable));
  78. spip_query("UPDATE spip_meta SET valeur=" . _q($valeur) ."$r WHERE nom=" . _q($nom) );
  79. } else {
  80. $r = array('nom' => $nom, 'valeur' => $valeur);
  81. if ($importable) $r['impt'] = $importable;
  82. sql_insertq('spip_meta', $r);
  83. @touch(_FILE_META, 0);
  84. }
  85. }
  86. ?>