diff --git a/.gitattributes b/.gitattributes index 35a7577c52b291807c38e417f91ecc71ebbd398b..35d03b01d527cade34020cb3149ac0dde53c6798 100644 --- a/.gitattributes +++ b/.gitattributes @@ -419,6 +419,7 @@ ecrire/balise/index.php -text ecrire/balise/logo_.php -text ecrire/balise/url_.php -text ecrire/base/admin_repair.php -text +ecrire/base/connect_sql.php -text ecrire/base/convert_sql_utf8.php -text ecrire/base/convert_utf8.php -text ecrire/base/delete_all.php -text diff --git a/ecrire/base/connect_sql.php b/ecrire/base/connect_sql.php new file mode 100644 index 0000000000000000000000000000000000000000..82a1e4ecd704dd65b52ef424c9d162c9481f0c38 --- /dev/null +++ b/ecrire/base/connect_sql.php @@ -0,0 +1,271 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2007 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + +// +// Utilitaires indispensables autour des serveurs SQL +// + +// API d'appel aux bases de donnees: +// on charge le fichier config/$serveur ($serveur='connect' pour le principal) +// qui est cense initaliser la connexion en appelant spip_connect_db +// laquelle met dans la globale db_ok la description de la connexion +// On la memorise dans un tableau pour permettre plusieurs serveurs. +// A l'installation, il faut simuler l'existence de ce fichier + +// http://doc.spip.org/@spip_connect +function spip_connect($serveur='', $version='') { + global $connexions, $spip_sql_version; + + $index = $serveur ? $serveur : 0; + if (!$version) $version = $spip_sql_version; + if (isset($connexions[$index][$version])) return $connexions[$index]; + + include_spip('base/abstract_sql'); + if (isset($_GET['var_profile'])) include_spip('public/debug'); + $install = (_request('exec') == 'install'); + + // Premiere connexion ? + if (!($old = isset($connexions[$index]))) { + $f = (!preg_match('/^\w*$/', $serveur)) ? '' + : (($serveur AND !$install) ? + ( _DIR_CONNECT. $serveur . '.php') + : (_FILE_CONNECT ? _FILE_CONNECT + : ($install ? _FILE_CONNECT_TMP : ''))); + + unset($GLOBALS['db_ok']); + unset($GLOBALS['spip_connect_version']); + if ($f AND is_readable($f)) include($f); + if (!isset($GLOBALS['db_ok'])) { + // fera mieux la prochaine fois + if ($install) return false; + spip_log("spip_connect: serveur $index mal defini dans '$f'."); + // ne plus reessayer si ce n'est pas l'install + return $connexions[$index]=false; + } + $connexions[$index] = $GLOBALS['db_ok']; + } + // la connexion a reussi ou etait deja faite. + // chargement de la version du jeu de fonctions + // si pas dans le fichier par defaut + $type = $GLOBALS['db_ok']['type']; + $jeu = 'spip_' . $type .'_functions_' . $version; + if (!isset($GLOBALS[$jeu])) { + if (!include_spip($type . '_' . $version, 'req')) + spip_log("spip_connect: serveur $index version '$version' non defini par $jeu."); + // ne plus reessayer + return $connexions[$index][$version] = array(); + } + $connexions[$index][$version] = $GLOBALS[$jeu]; + if ($old) return $connexions[$index]; + + $connexions[$index]['spip_connect_version'] = isset($GLOBALS['spip_connect_version']) ? $GLOBALS['spip_connect_version'] : 0; + + // initialisation de l'alphabet utilise dans les connexions SQL + // si l'installation l'a determine. + // Celui du serveur principal l'impose aux serveurs secondaires + // s'ils le connaissent + + if (!$serveur) { + $charset = spip_connect_main($GLOBALS[$jeu]); + if (!$charset) { + unset($connexions[$index]); + spip_log("spip_connect: absence de charset"); + return false; + } + } else { + $charset = isset($GLOBALS['meta']['charset_sql_connexion']) ? + $GLOBALS['meta']['charset_sql_connexion'] : 'utf8'; + } + if ($charset != -1) { + $f = $GLOBALS[$jeu]['set_charset']; + if (function_exists($f)) + $f($charset, $serveur); + } + return $connexions[$index]; +} + +// Cette fonction ne doit etre appelee qu'a travers la fonction sql_serveur +// definie dans base/abstract_sql +// Elle existe en tant que gestionnaire de versions, +// connue seulement des convertisseurs automatiques + +// http://doc.spip.org/@spip_connect_sql +function spip_connect_sql($version, $ins='', $serveur='', $cont=false) { + $desc = spip_connect($serveur, $version); + if (function_exists($f = @$desc[$version][$ins])) return $f; + if ($ins) + spip_log("Le serveur '$serveur' version $version n'a pas '$ins'"); + if ($cont) return $desc; + include_spip('inc/minipres'); + echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique')); + exit; +} + +// Fonction appelee par le fichier cree dans config/ a l'instal'. +// Il contient un appel direct a cette fonction avec comme arguments +// les identifants de connexion. +// Si la connexion reussit, la globale db_ok memorise sa description. +// C'est un tableau egalement retourne en valeur, pour les appels a l'install' + +// http://doc.spip.org/@spip_connect_db +function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $prefixe='', $ldap='') { + global $db_ok; + + ## TODO : mieux differencier les serveurs + $f = _DIR_TMP . $type . 'out'; + + if (@file_exists($f) + AND (time() - @filemtime($f) < 30) + AND !defined('_ECRIRE_INSTALL')) { + return; + } + if (!$prefixe) + $prefixe = isset($GLOBALS['table_prefix']) + ? $GLOBALS['table_prefix'] : $db; + $h = charger_fonction($type, 'req', true); + if (!$h) { + spip_log("les reqûetes $type ne sont pas fournies"); + return; + } + + if ($g = $h($host, $port, $login, $pass, $db, $prefixe, $ldap)) { + + $g['type'] = $type; + return $db_ok = $g; + } + // En cas d'indisponibilite du serveur, eviter de le bombarder + if (!defined('_ECRIRE_INSTALL')) { + @touch($f); + $err = "Echec connexion $host $port $login $db"; + spip_log($err); + spip_log($err, $type); + } +} + +// Premiere connexion au serveur principal: +// retourner le charset donnee par la table principale +// mais verifier que le fichier de connexion n'est pas trop vieux +// Version courante = 0.7 (indication d'un LDAP comme 7e arg) +// La version 0.6 indique le prefixe comme 6e arg +// La version 0.5 indique le serveur comme 5e arg +// +// La version 0.0 (non numerotee) doit etre refaite par un admin +// les autres 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'). + +// http://doc.spip.org/@spip_connect_main +function spip_connect_main($connexion) +{ + if ($GLOBALS['spip_connect_version']< 0.1 AND _DIR_RESTREINT){ + include_spip('inc/headers'); + redirige_par_entete(generer_url_ecrire('upgrade', 'reinstall=oui', true)); + } + + if (!($f = $connexion['select'])) return false; + if (!$r = $f('valeur','spip_meta', "nom='charset_sql_connexion'")) + return false; + if (!($f = $connexion['fetch'])) return false; + $r = $f($r); + return ($r['valeur'] ? $r['valeur'] : -1); +} + +// http://doc.spip.org/@spip_connect_ldap +function spip_connect_ldap($serveur='') { + $connexion = spip_connect($serveur); + if ($connexion['ldap'] AND is_string($connexion['ldap'])) { + include_once( _DIR_CONNECT . $connexion['ldap']); + if ($GLOBALS['ldap_link']) + $connexion['ldap'] = array('link' => $GLOBALS['ldap_link'], + 'base' => $GLOBALS['ldap_base']); + } + return $connexion['ldap']; +} + +// 1 interface de abstract_sql a demenager dans base/abstract_sql a terme + +// http://doc.spip.org/@_q +function _q($a) { + return (is_int($a)) ? strval($a) : + (!is_array($a) ? ("'" . addslashes($a) . "'") + : join(",", array_map('_q', $a))); +} + +// Nommage bizarre des tables d'objets +// http://doc.spip.org/@table_objet +function table_objet($type) { + static $surnoms = array( + 'article' => 'articles', + 'auteur' => 'auteurs', + 'breve' => 'breves', + 'document' => 'documents', + 'doc' => 'documents', # pour les modeles + 'img' => 'documents', + 'emb' => 'documents', + 'forum' => 'forum', # hum + 'groupe_mots' => 'groupes_mots', # hum + 'groupe' => 'groupes_mots', # hum (EXPOSE) + 'message' => 'messages', + 'mot' => 'mots', + 'petition' => 'petitions', + 'rubrique' => 'rubriques', + 'signature' => 'signatures', + 'syndic' => 'syndic', + 'site' => 'syndic', # hum hum + 'syndic_article' => 'syndic_articles', + 'type_document' => 'types_documents', # hum + 'extension' => 'types_documents' # hum + ); + return isset($surnoms[$type]) ? $surnoms[$type] : $type."s"; +} + +// http://doc.spip.org/@table_objet_sql +function table_objet_sql($type) { + return 'spip_' . table_objet($type); +} + +// http://doc.spip.org/@id_table_objet +function id_table_objet($type) { + $type = preg_replace(',^spip_|s$,', '', $type); + if ($type == 'forum') + return 'id_forum'; + else if ($type == 'type') + return 'extension'; + else { + if (!$type) return; + $t = table_objet($type); + $trouver_table = charger_fonction('trouver_table', 'base'); + $desc = $trouver_table($t); + return @$desc['key']["PRIMARY KEY"]; + } +} + +// Recuperer le nom de la table de jointure xxxx sur l'objet yyyy +// http://doc.spip.org/@table_jointure +function table_jointure($x, $y) { + include_spip('public/interfaces'); + if ($table = $GLOBALS['tables_jointures'][table_objet_sql($y)][id_table_objet($x)] + OR $table = $GLOBALS['tables_jointures'][table_objet_sql($x)][id_table_objet($y)]) + return $table; +} + +// Pour compatibilite. Ne plus utiliser. +// http://doc.spip.org/@spip_query +function spip_query($query, $serveur='') { + global $spip_sql_version; + $f = spip_connect_sql($spip_sql_version, 'query', $serveur, true); + return function_exists($f) ? $f($query, $serveur) : false; +} + +?> diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 5dd21b5c6262444ab38eed968425e10e3f1a152c..dd8531e7055f97f98ed89d5e9a1cb29eda37316a 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -13,7 +13,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // -// Gestion des inclusions et infos repertoires +// Utilitaires indispensables autour du serveur Http. // // charge un fichier perso ou, a defaut, standard @@ -187,200 +187,6 @@ function spip_log($message, $logname=NULL, $logdir=NULL, $logsuf=NULL) { spip_log($logname=='maj' ? 'cf maj.log' : $message); } -// Fonction appelee par le fichier cree dans config/ a l'instal'. -// Il contient un appel direct a cette fonction avec comme arguments -// les identifants de connexion. -// Si la connexion reussit, la globale db_ok memorise sa description. -// C'est un tableau egalement retourne en valeur, pour les appels a l'install' - -// http://doc.spip.org/@spip_connect_db -function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $prefixe='', $ldap='') { - global $db_ok; - - ## TODO : mieux differencier les serveurs - $f = _DIR_TMP . $type . 'out'; - - if (@file_exists($f) - AND (time() - @filemtime($f) < 30) - AND !defined('_ECRIRE_INSTALL')) { - return; - } - if (!$prefixe) - $prefixe = isset($GLOBALS['table_prefix']) - ? $GLOBALS['table_prefix'] : $db; - $h = charger_fonction($type, 'req', true); - if (!$h) { - spip_log("les reqûetes $type ne sont pas fournies"); - return; - } - - if ($g = $h($host, $port, $login, $pass, $db, $prefixe, $ldap)) { - - $g['type'] = $type; - return $db_ok = $g; - } - // En cas d'indisponibilite du serveur, eviter de le bombarder - if (!defined('_ECRIRE_INSTALL')) { - @touch($f); - $err = "Echec connexion $host $port $login $db"; - spip_log($err); - spip_log($err, $type); - } -} - -// API d'appel aux bases de donnees: -// on charge le fichier config/$serveur ($serveur='connect' pour le principal) -// qui est cense initaliser la connexion en appelant spip_connect_db -// laquelle met dans la globale db_ok la description de la connexion -// On la memorise dans un tableau pour permettre plusieurs serveurs. -// A l'installation, il faut simuler l'existence de ce fichier - -// http://doc.spip.org/@spip_connect -function spip_connect($serveur='', $version='') { - global $connexions, $spip_sql_version; - - $index = $serveur ? $serveur : 0; - if (!$version) $version = $spip_sql_version; - if (isset($connexions[$index][$version])) return $connexions[$index]; - - include_spip('base/abstract_sql'); - if (isset($_GET['var_profile'])) include_spip('public/debug'); - $install = (_request('exec') == 'install'); - - // Premiere connexion ? - if (!($old = isset($connexions[$index]))) { - $f = (!preg_match('/^\w*$/', $serveur)) ? '' - : (($serveur AND !$install) ? - ( _DIR_CONNECT. $serveur . '.php') - : (_FILE_CONNECT ? _FILE_CONNECT - : ($install ? _FILE_CONNECT_TMP : ''))); - - unset($GLOBALS['db_ok']); - unset($GLOBALS['spip_connect_version']); - if ($f AND is_readable($f)) include($f); - if (!isset($GLOBALS['db_ok'])) { - // fera mieux la prochaine fois - if ($install) return false; - spip_log("spip_connect: serveur $index mal defini dans '$f'."); - // ne plus reessayer si ce n'est pas l'install - return $connexions[$index]=false; - } - $connexions[$index] = $GLOBALS['db_ok']; - } - // la connexion a reussi ou etait deja faite. - // chargement de la version du jeu de fonctions - // si pas dans le fichier par defaut - $type = $GLOBALS['db_ok']['type']; - $jeu = 'spip_' . $type .'_functions_' . $version; - if (!isset($GLOBALS[$jeu])) { - if (!include_spip($type . '_' . $version, 'req')) - spip_log("spip_connect: serveur $index version '$version' non defini par $jeu."); - // ne plus reessayer - return $connexions[$index][$version] = array(); - } - $connexions[$index][$version] = $GLOBALS[$jeu]; - if ($old) return $connexions[$index]; - - $connexions[$index]['spip_connect_version'] = isset($GLOBALS['spip_connect_version']) ? $GLOBALS['spip_connect_version'] : 0; - - // initialisation de l'alphabet utilise dans les connexions SQL - // si l'installation l'a determine. - // Celui du serveur principal l'impose aux serveurs secondaires - // s'ils le connaissent - - if (!$serveur) { - $charset = spip_connect_main($GLOBALS[$jeu]); - if (!$charset) { - unset($connexions[$index]); - spip_log("spip_connect: absence de charset"); - return false; - } - } else { - $charset = isset($GLOBALS['meta']['charset_sql_connexion']) ? - $GLOBALS['meta']['charset_sql_connexion'] : 'utf8'; - } - if ($charset != -1) { - $f = $GLOBALS[$jeu]['set_charset']; - if (function_exists($f)) - $f($charset, $serveur); - } - return $connexions[$index]; -} - -// Cette fonction ne doit etre appelee qu'a travers la fonction sql_serveur -// definie dans base/abstract_sql -// Elle existe en tant que gestionnaire de versions, -// connue seulement des convertisseurs automatiques - -// http://doc.spip.org/@spip_connect_sql -function spip_connect_sql($version, $ins='', $serveur='', $cont=false) { - $desc = spip_connect($serveur, $version); - if (function_exists($f = @$desc[$version][$ins])) return $f; - if ($ins) - spip_log("Le serveur '$serveur' version $version n'a pas '$ins'"); - if ($cont) return $desc; - include_spip('inc/minipres'); - echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique')); - exit; -} - -// Ici pour compatibilite. Ne plus utiliser. -// http://doc.spip.org/@spip_query -function spip_query($query, $serveur='') { - global $spip_sql_version; - $f = spip_connect_sql($spip_sql_version, 'query', $serveur, true); - return function_exists($f) ? $f($query, $serveur) : false; -} - -// Premiere connexion au serveur principal: -// retourner le charset donnee par la table principale -// mais verifier que le fichier de connexion n'est pas trop vieux -// Version courante = 0.7 (indication d'un LDAP comme 7e arg) -// La version 0.6 indique le prefixe comme 6e arg -// La version 0.5 indique le serveur comme 5e arg -// -// La version 0.0 (non numerotee) doit etre refaite par un admin -// les autres 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'). - -// http://doc.spip.org/@spip_connect_main -function spip_connect_main($connexion) -{ - if ($GLOBALS['spip_connect_version']< 0.1 AND _DIR_RESTREINT){ - include_spip('inc/headers'); - redirige_par_entete(generer_url_ecrire('upgrade', 'reinstall=oui', true)); - } - - if (!($f = $connexion['select'])) return false; - if (!$r = $f('valeur','spip_meta', "nom='charset_sql_connexion'")) - return false; - if (!($f = $connexion['fetch'])) return false; - $r = $f($r); - return ($r['valeur'] ? $r['valeur'] : -1); -} - -// http://doc.spip.org/@spip_connect_ldap -function spip_connect_ldap($serveur='') { - $connexion = spip_connect($serveur); - if ($connexion['ldap'] AND is_string($connexion['ldap'])) { - include_once( _DIR_CONNECT . $connexion['ldap']); - if ($GLOBALS['ldap_link']) - $connexion['ldap'] = array('link' => $GLOBALS['ldap_link'], - 'base' => $GLOBALS['ldap_base']); - } - return $connexion['ldap']; -} - -// 1 interface de abstract_sql a demenager dans base/abstract_sql a terme - -// http://doc.spip.org/@_q -function _q($a) { - return (is_int($a)) ? strval($a) : - (!is_array($a) ? ("'" . addslashes($a) . "'") - : join(",", array_map('_q', $a))); -} - // Renvoie le _GET ou le _POST emis par l'utilisateur // ou pioche dans $c si c'est un array() // http://doc.spip.org/@_request @@ -608,63 +414,6 @@ function joli_repertoire($rep) { return $rep; } -// Nommage bizarre des tables d'objets -// http://doc.spip.org/@table_objet -function table_objet($type) { - static $surnoms = array( - 'article' => 'articles', - 'auteur' => 'auteurs', - 'breve' => 'breves', - 'document' => 'documents', - 'doc' => 'documents', # pour les modeles - 'img' => 'documents', - 'emb' => 'documents', - 'forum' => 'forum', # hum - 'groupe_mots' => 'groupes_mots', # hum - 'groupe' => 'groupes_mots', # hum (EXPOSE) - 'message' => 'messages', - 'mot' => 'mots', - 'petition' => 'petitions', - 'rubrique' => 'rubriques', - 'signature' => 'signatures', - 'syndic' => 'syndic', - 'site' => 'syndic', # hum hum - 'syndic_article' => 'syndic_articles', - 'type_document' => 'types_documents', # hum - 'extension' => 'types_documents' # hum - ); - return isset($surnoms[$type]) ? $surnoms[$type] : $type."s"; -} - -// http://doc.spip.org/@table_objet_sql -function table_objet_sql($type) { - return 'spip_' . table_objet($type); -} - -// http://doc.spip.org/@id_table_objet -function id_table_objet($type) { - $type = preg_replace(',^spip_|s$,', '', $type); - if ($type == 'forum') - return 'id_forum'; - else if ($type == 'type') - return 'extension'; - else { - if (!$type) return; - $t = table_objet($type); - $trouver_table = charger_fonction('trouver_table', 'base'); - $desc = $trouver_table($t); - return @$desc['key']["PRIMARY KEY"]; - } -} - -// Recuperer le nom de la table de jointure xxxx sur l'objet yyyy -// http://doc.spip.org/@table_jointure -function table_jointure($x, $y) { - include_spip('public/interfaces'); - if ($table = $GLOBALS['tables_jointures'][table_objet_sql($y)][id_table_objet($x)] - OR $table = $GLOBALS['tables_jointures'][table_objet_sql($x)][id_table_objet($y)]) - return $table; -} // // spip_timer : on l'appelle deux fois et on a la difference, affichable diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php index 70c13e5257b6d31bec6d92a2bfa2842f0e218742..63cedb5038cbe62a1390e8aebcac23ea08eca2f8 100644 --- a/ecrire/inc_version.php +++ b/ecrire/inc_version.php @@ -306,9 +306,10 @@ $meta = $connect_id_rubrique = array(); // *** Fin des globales *** // // -// Definitions des fonctions (charge aussi inc/flock) +// Charger les fonctions liees aux serveurs Http et Sql. // require_once _DIR_RESTREINT . 'inc/utils.php'; +require_once _DIR_RESTREINT . 'base/connect_sql.php'; // Definition personnelles eventuelles @@ -321,6 +322,7 @@ error_reporting(SPIP_ERREUR_REPORT); // // INITIALISER LES REPERTOIRES NON PARTAGEABLES ET LES CONSTANTES +// (charge aussi inc/flock) // // mais l'inclusion precedente a peut-etre deja appele cette fonction // ou a defini certaines des constantes que cette fonction doit definir