From a80e6f9d5e018b0e88a5130daf65b8b55caa70b9 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Tue, 29 Aug 2006 19:37:39 +0000 Subject: [PATCH] Interface au serveur SQL pour permettre la connexion multi-base. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- ecrire/balise/formulaire_signature.php | 5 +- ecrire/base/db_mysql.php | 31 ++++++++++++- ecrire/exec/install.php | 2 +- ecrire/inc/actions.php | 4 +- ecrire/inc/auth.php | 2 +- ecrire/inc/install_4.php | 8 +--- ecrire/inc/meta.php | 12 +++-- ecrire/inc/utils.php | 64 ++++++++++---------------- ecrire/public/cacher.php | 11 ++--- 9 files changed, 71 insertions(+), 68 deletions(-) diff --git a/ecrire/balise/formulaire_signature.php b/ecrire/balise/formulaire_signature.php index fbed9222c9..2cf7b12a88 100644 --- a/ecrire/balise/formulaire_signature.php +++ b/ecrire/balise/formulaire_signature.php @@ -93,8 +93,7 @@ function reponse_confirmation($var_confirm = '') { static $confirm = ''; if (!$var_confirm) return $confirm; - spip_connect(); - if ($GLOBALS['db_ok']) { + if (spip_connect()) { include_spip('inc/texte'); include_spip('inc/filtres'); @@ -177,7 +176,7 @@ function reponse_confirmation($var_confirm = '') { function reponse_signature($id_article, $nom_email, $adresse_email, $message, $nom_site, $url_site, $url_page) { - if (!$GLOBALS['db_ok']) return _T('form_pet_probleme_technique'); + if (!spip_connect()) return _T('form_pet_probleme_technique'); include_spip('inc/texte'); include_spip('inc/filtres'); diff --git a/ecrire/base/db_mysql.php b/ecrire/base/db_mysql.php index 22ac341d08..1d0437f53c 100644 --- a/ecrire/base/db_mysql.php +++ b/ecrire/base/db_mysql.php @@ -21,6 +21,35 @@ define('SPIP_NUM', MYSQL_NUM); // Appel de requetes SQL // +// fonction pour la premiere connexion + +function base_db_mysql_dist() +{ + // fichier d'init present ? + if (!_FILE_CONNECT) { + if ($GLOBALS['exec'] != 'install') // est-ce l'installation ? + return false; // non, faut faire sans + else return 'spip_query_db'; // oui; valeur d'office + } + + include_once(_FILE_CONNECT); + + // Version courante = 0.3 + // + // les versions 0.1 et 0.2 fonctionnent toujours, meme si : + // - la version 0.1 est moins performante que la 0.2 + // - la 0.2 fait un include_ecrire('inc_db_mysql.php3') + // En tout cas on ne force pas la mise a niveau + if ($GLOBALS['spip_connect_version'] >= 0.1) + return 'spip_query_db'; + + // La version 0.0 (non numerotee) doit etre refaite par un admin + + if (!_DIR_RESTREINT) return false; + + redirige_par_entete(generer_url_ecrire('upgrade', 'reinstall=oui', true)); +} + // http://doc.spip.org/@spip_query_db function spip_query_db($query) { @@ -197,7 +226,7 @@ function spip_connect_db($host, $port, $login, $pass, $db) { $err = 'Echec connexion MySQL '.spip_sql_errno().' '.spip_sql_error(); spip_log($err); spip_log($err, 'mysql'); - } + } else $GLOBALS['db_ok'] = 'spip_query_db'; return $GLOBALS['db_ok']; } diff --git a/ecrire/exec/install.php b/ecrire/exec/install.php index 8cb614b129..d7c342a56f 100644 --- a/ecrire/exec/install.php +++ b/ecrire/exec/install.php @@ -29,7 +29,7 @@ function exec_install_dist() @unlink(_FILE_META); unset($GLOBALS['meta']); include_spip('inc/lang'); - init_langues(); + init_langues(); // pourquoi faut-il l'appeler encore une fois ? include_spip('base/create'); include_spip('base/db_mysql'); diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php index 3958df19e7..cf2c279f1f 100644 --- a/ecrire/inc/actions.php +++ b/ecrire/inc/actions.php @@ -186,9 +186,7 @@ function verifier_php_auth() { && !$GLOBALS['ignore_auth_http']) { $result = spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($_SERVER['PHP_AUTH_USER'])); - if (!$GLOBALS['db_ok']) return false; - - $row = spip_fetch_array($result); + $row = @spip_fetch_array($result); if ($row AND $row['source'] != 'ldap') { if ($row['pass'] == md5($row['alea_actuel'] . $_SERVER['PHP_AUTH_PW'])) { $GLOBALS['auteur_session'] = $row; diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php index d9c0ec41fa..540f14d634 100644 --- a/ecrire/inc/auth.php +++ b/ecrire/inc/auth.php @@ -218,7 +218,7 @@ function auth_prefs() function auth_areconnecter($auth_login) { include_spip('inc/minipres'); - if (!$GLOBALS['db_ok']) { + if (!spip_connect()) { spip_log("Erreur base de donnees"); minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'). "<p><tt>".spip_sql_errno()." ".spip_sql_error()."</tt></p>"); diff --git a/ecrire/inc/install_4.php b/ecrire/inc/install_4.php index 293901e5da..9208d92281 100644 --- a/ecrire/inc/install_4.php +++ b/ecrire/inc/install_4.php @@ -17,9 +17,6 @@ function inc_install_4() install_debut_html(); - // Necessaire pour appeler les fonctions SQL wrappees - include_spip('base/db_mysql'); - echo "<BR />\n<FONT FACE='Verdana,Arial,Sans,sans-serif' SIZE=3>"._T('info_creation_tables')."</FONT>"; echo "<P>\n"; @@ -38,7 +35,7 @@ function inc_install_4() mysql_select_db($sel_db); // Message pour spip_query : tout va bien ! - $GLOBALS['db_ok'] = true; + $GLOBALS['db_ok'] = 'spip_connect_db'; $GLOBALS['spip_connect_version'] = 0.3; // Test si SPIP deja installe @@ -57,7 +54,7 @@ function inc_install_4() $ligne_rappel = ''; spip_query("DELETE FROM spip_meta WHERE nom='mysql_rappel_nom_base'"); } else { - echo " (erreur rappel nom base `$sel_db`.spip_meta) "; + echo " (erreur rappel nom base `$sel_db`.spip_meta $nouvelle) "; $GLOBALS['mysql_rappel_nom_base'] = false; $ligne_rappel = "\$GLOBALS['mysql_rappel_nom_base'] = false; ". "/* echec du test sur `$sel_db`.spip_meta lors de l'installation. */\n"; @@ -74,7 +71,6 @@ function inc_install_4() } echo "($result_ok) -->"; - if ($result_ok) { if (preg_match(',(.*):(.*),', $adresse_db, $r)) list(,$adresse_db, $port) = $r; diff --git a/ecrire/inc/meta.php b/ecrire/inc/meta.php index 4014dc0b6e..627f7a887b 100644 --- a/ecrire/inc/meta.php +++ b/ecrire/inc/meta.php @@ -14,14 +14,16 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // http://doc.spip.org/@lire_metas function lire_metas() { - $result = spip_query("SELECT nom,valeur FROM spip_meta"); - if($GLOBALS['db_ok']) { + if (!_FILE_CONNECT) return; + if ($result = @spip_query("SELECT nom,valeur FROM spip_meta")) { + $GLOBALS['meta'] = array(); while ($row = spip_fetch_array($result)) $GLOBALS['meta'][$row['nom']] = $row['valeur']; + + if (!$GLOBALS['meta']['charset']) + ecrire_meta('charset', _DEFAULT_CHARSET); } - if (!$GLOBALS['meta']['charset']) - ecrire_meta('charset', _DEFAULT_CHARSET); } // http://doc.spip.org/@ecrire_meta @@ -73,7 +75,7 @@ if (!isset($GLOBALS['meta'])) // On force le renouvellement de l'alea de l'espace prive tous les 2 jours -if (!_DIR_RESTREINT AND abs(time() - $GLOBALS['meta']['alea_ephemere_date']) > 2 * 24*3600) { +if ((!_DIR_RESTREINT) AND _FILE_CONNECT AND abs(time() - $GLOBALS['meta']['alea_ephemere_date']) > 2 * 24*3600) { include_spip('inc/acces'); renouvelle_alea(); } diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 1ea0b0e58b..95a2d9afa8 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -203,53 +203,37 @@ function spip_log($message, $logname='spip') { spip_log($message); } +// API d'appel a la base de donnees: +// on charge le fichier du repertoire base/ donne en argument +// et on execute la fonction homonyme censee initaliser la connexion +// et renvoyer le nom de la fonction a connexion persistante. +// On memorise ce nom dans une statique pour n'appeler qu'une fois. -// API d'appel a la base de donnees // http://doc.spip.org/@spip_connect -function spip_connect() { - static $t; - if ($t++) return; +function spip_connect($serveur='') { + static $t = array(); - include_spip('base/db_mysql'); - include_once(_FILE_CONNECT); +// Assimiler spip_connect() et spip_connect('') [PHP les distingue]. +// Tous deux designent le serveur SQL std (moche mais historique) - // Version courante = 0.3 - // - // les versions 0.1 et 0.2 fonctionnent toujours, meme si : - // - la version 0.1 est moins performante que la 0.2 - // - la 0.2 fait un include_ecrire('inc_db_mysql.php3') - // En tout cas on ne force pas la mise a niveau - if ($GLOBALS['spip_connect_version'] >= 0.1) - return; - - // La version 0.0 (non numerotee) doit etre refaite - if ($GLOBALS['spip_connect_version'] < 0.1) { - if (!_DIR_RESTREINT) { - $GLOBALS['db_ok'] = false; - return; - } - redirige_par_entete( - generer_url_ecrire('upgrade', 'reinstall=oui', true)); - } + if (!$serveur) $serveur = 'db_mysql'; + + if (isset($t[$serveur])) return $t[$serveur]; + + $f = charger_fonction($serveur, 'base', true); + + $t[$serveur] = ($f ? $f() : false); + spip_log("spip_connect($serveur) $f " . $t[$serveur]); + return $t[$serveur]; } // http://doc.spip.org/@spip_query -function spip_query($query) { - - // Remarque : si on est appele par l'install, - // la connexion initiale a ete faite avant - if (!$GLOBALS['db_ok']) { - // Essaie de se connecter - if (_FILE_CONNECT) - spip_connect(); - - // Erreur de connexion - if (!$GLOBALS['db_ok']) - return; - } +function spip_query($query, $serveur='') { + + if (!($f = spip_connect($serveur))) return; // Erreur de connexion - // Faire la requete - return spip_query_db($query); + // executer la requete + return $f($query); } // a demenager dans base/abstract_sql a terme @@ -1084,7 +1068,7 @@ function spip_initialisation() { $GLOBALS['spip_lang'] = $GLOBALS['langue_site']; // Verifier le visiteur - verifier_visiteur(); + if (_FILE_CONNECT) verifier_visiteur(); } // Annuler les magic quotes \' sur GET POST COOKIE et GLOBALS ; diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php index 371448c22b..c97a1d1e3c 100644 --- a/ecrire/public/cacher.php +++ b/ecrire/public/cacher.php @@ -294,9 +294,8 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ? if (isset($GLOBALS['meta']['invalider'])) { - // tester si la base est dispo - spip_connect(); - if ($GLOBALS['db_ok']) { + // le faire si la base est disponible + if (spip_connect()) { include_spip('inc/meta'); lire_metas(); retire_caches($chemin_cache); @@ -321,12 +320,8 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la $use_cache = 1; } - - // tester si la base est dispo - spip_connect(); - // Si pas valide mais pas de connexion a la base, le garder quand meme - if (!$GLOBALS['db_ok']) { + if (!spip_connect()) { if (file_exists(_DIR_CACHE . $chemin_cache)) $use_cache = 0 ; else { -- GitLab