Skip to content
Extraits de code Groupes Projets
Valider a80e6f9d rédigé par esj's avatar esj
Parcourir les fichiers

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.
parent 3828dc44
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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');
......
......@@ -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'];
}
......
......@@ -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');
......
......@@ -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;
......
......@@ -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>");
......
......@@ -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;
......
......@@ -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();
}
......
......@@ -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 ;
......
......@@ -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 {
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter