diff --git a/ecrire/base/abstract_sql.php b/ecrire/base/abstract_sql.php index c64d415655b14c5be2a7d1124631ad48026284f0..5ec184d9219f8efa571078c35b8e63f9dfc1d6c1 100644 --- a/ecrire/base/abstract_sql.php +++ b/ecrire/base/abstract_sql.php @@ -12,35 +12,32 @@ if (!defined("_ECRIRE_INC_VERSION")) return; +define('sql_ABSTRACT_VERSION', 1); + // Ce fichier definit la couche d'abstraction entre SPIP et ses serveurs SQL. -// Cette couche n'est pour le moment qu'un ensemble de fonctions ecrites -// rapidement pour generaliser le code strictement MySQL de SPIP < 1.9.3. +// Cette version 1 est un ensemble de fonctions ecrites rapidement +// pour generaliser le code strictement MySQL de SPIP < 1.9.3. // Des retouches sont a prevoir apres l'experience des premiers portages. +// Les symboles sql_* (constantes et nom de fonctions) sont reserves +// a cette interface, sans quoi le gestionnaire de version dysfonctionnera. -// Cette fonction charge la description d'un serveur de base de donnees -// (via la fonction spip_connect qui etablira la connexion si ce n'est fait) -// et retourne la fonction produisant la requête SQL demandee +// Fonction principale. Elle charge l'interface au serveur de base de donnees +// via la fonction spip_connect_version qui etablira la connexion au besoin. +// Elle retourne la fonction produisant la requête SQL demandee // Erreur fatale si la fonctionnalite est absente sauf si le 3e arg <> false // http://doc.spip.org/@sql_serveur function sql_serveur($ins_sql='', $serveur='', $continue=false) { - - $desc = spip_connect($serveur); - if (function_exists($f = @$desc[$ins_sql])) return $f; - if ($ins_sql) - spip_log("Le serveur '$serveur' n'a pas '$ins_sql'"); - if ($continue) return $desc; - include_spip('inc/minipres'); - echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique')); - exit; + return spip_connect_sql(sql_ABSTRACT_VERSION, $ins_sql, $serveur, $continue); } // Demande si un charset est disponible. // http://doc.spip.org/@sql_get_charset function sql_get_charset($charset, $serveur=''){ // le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc. - $desc = spip_connect($serveur); - $c = @$desc['charsets'][$charset]; + $desc = sql_serveur('', $serveur, true); + $desc = $desc[sql_ABSTRACT_VERSION]; + $c = $desc['charsets'][$charset]; if ($c) { if (function_exists($f=@$desc['get_charset'])) if ($f($c, $serveur)) return $c; diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 43d821784fbba927b4849395454dcc4d018c1244..1e27395a0ecb31300b946744148fbcdb957883c7 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -229,40 +229,58 @@ function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $pr } // API d'appel aux bases de donnees: -// on charge le fichier config/connect$serveur ($serveur='' pour le principal) +// 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='') { - global $connexions; +function spip_connect($serveur='', $version='') { + global $connexions, $spip_sql_version; $index = $serveur ? $serveur : 0; - if (isset($connexions[$index])) return $connexions[$index]; + 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'); - $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'])) { - if ($install) return false; // fera mieux la prochaine fois - spip_log("spip_connect: serveur $index mal defini dans '$f'."); - // ne plus reessayer si ce n'est pas l'install - return $connexions[$index]=false; + // 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] = $GLOBALS['db_ok']; $connexions[$index]['spip_connect_version'] = isset($GLOBALS['spip_connect_version']) ? $GLOBALS['spip_connect_version'] : 0; // initialisation de l'alphabet utilise dans les connexions SQL @@ -271,7 +289,7 @@ function spip_connect($serveur='') { // s'ils le connaissent if (!$serveur) { - $charset = spip_connect_main($GLOBALS['db_ok']); + $charset = spip_connect_main($GLOBALS[$jeu]); if (!$charset) { unset($connexions[$index]); spip_log("spip_connect: absence de charset"); @@ -282,13 +300,37 @@ function spip_connect($serveur='') { $GLOBALS['meta']['charset_sql_connexion'] : 'utf8'; } if ($charset != -1) { - $f = $GLOBALS['db_ok']['set_charset']; + $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 + +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 @@ -317,13 +359,6 @@ function spip_connect_main($connexion) return ($r['valeur'] ? $r['valeur'] : -1); } -// http://doc.spip.org/@spip_query -function spip_query($query, $serveur='') { - if (!($desc = spip_connect($serveur))) return false; - $f = $desc['query']; - return $f($query, $serveur); -} - // http://doc.spip.org/@spip_connect_ldap function spip_connect_ldap($serveur='') { $connexion = spip_connect($serveur); diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php index 7268b5e090ef7fac0c57a6edd19966b6cf9912c0..70c13e5257b6d31bec6d92a2bfa2842f0e218742 100644 --- a/ecrire/inc_version.php +++ b/ecrire/inc_version.php @@ -288,6 +288,9 @@ $liste_des_statuts = array( // version de la base $spip_version = 1.958; +// version de l'interface a la base +$spip_sql_version = 1; + // version de spip en chaine // et en numerique a incrementer sur les evolutions qui cassent la compatibilite descendante // 1.xxyy : xx00 versions stables publiees, xxyy versions de dev diff --git a/ecrire/install/etape_2.php b/ecrire/install/etape_2.php index 46eb1d7fae47cf21ff3feb4a911849e8894bc309..2fb296df42da9e9f523774ffa7e7cf31cb737059 100644 --- a/ecrire/install/etape_2.php +++ b/ecrire/install/etape_2.php @@ -38,6 +38,9 @@ function install_etape_2_dist() $GLOBALS['connexions'][$server_db] = $link; + $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] + = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; + echo install_debut_html(); // prenons toutes les dispositions possibles pour que rien ne s'affiche ! diff --git a/ecrire/install/etape_3.php b/ecrire/install/etape_3.php index a32b46402b6006379da482e4682552c88da86a8d..57a36ffc6008cafcc3459376a8935b253b069aa8 100644 --- a/ecrire/install/etape_3.php +++ b/ecrire/install/etape_3.php @@ -34,10 +34,13 @@ function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $table_prefix = _INSTALL_TABLE_PREFIX; } - $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, 0, $login_db, $pass_db, '', $server_db); + $GLOBALS['connexions'][$server_db] + = spip_connect_db($adresse_db, 0, $login_db, $pass_db, '', $server_db); - $fquery = sql_serveur('query', $server_db); + $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] + = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; + $fquery = sql_serveur('query', $server_db); if ($choix_db == "new_spip") { if (preg_match(',^[a-z_0-9]+$,i', $sel_db)) $fquery("CREATE DATABASE $sel_db", $server_db); @@ -55,7 +58,6 @@ function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, // Si possible, demander au serveur d'envoyer les textes // dans le codage std de SPIP, - $charset = sql_get_charset(_DEFAULT_CHARSET, $server_db); if ($charset) { diff --git a/ecrire/install/etape_sup1.php b/ecrire/install/etape_sup1.php index da4292dc53deac59d9e0eacb00c103a61824ded8..31991316ce06d34a367998b696db422a33c2670a 100644 --- a/ecrire/install/etape_sup1.php +++ b/ecrire/install/etape_sup1.php @@ -48,6 +48,9 @@ function install_etape_sup1_dist() echo install_debut_html(_L("Déclaration d'une base supplémentaire")); $link = spip_connect_db($adresse_db, 0, $login_db, $pass_db, '', $server_db); + $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] + = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; + if ($link) { $GLOBALS['connexions'][$server_db] = $link; diff --git a/ecrire/install/etape_sup2.php b/ecrire/install/etape_sup2.php index e1b32f1f6ac2068fa1a73c4056e4d6baa1e174e9..fed776c05157a0778f740bf142455adf6a248e77 100644 --- a/ecrire/install/etape_sup2.php +++ b/ecrire/install/etape_sup2.php @@ -21,6 +21,9 @@ function install_bases_sup($adresse_db, $login_db, $pass_db, $server_db, $sup_d return "<!-- connection perdue -->"; + $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] + = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; + if (!sql_selectdb($sup_db, $server_db)) return "<!-- base inaccessible -->"; diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php index d643f9f7180b2ac89ca3d9340c08e9b20dc74e11..bfbd91b653e73a3d2fca17ccc3ab80a8264e6ae0 100644 --- a/ecrire/req/mysql.php +++ b/ecrire/req/mysql.php @@ -35,6 +35,10 @@ function req_mysql_dist($host, $port, $login, $pass, $db='', $prefixe='', $ldap= 'prefixe' => $prefixe ? $prefixe : $db, 'link' => $GLOBALS['mysql_rappel_connexion'] ? $link : false, 'ldap' => $ldap, + ); +} + +$GLOBALS['spip_mysql_functions_1'] = array( 'alter' => 'spip_mysql_alter', 'count' => 'spip_mysql_count', 'countsel' => 'spip_mysql_countsel', @@ -76,7 +80,6 @@ function req_mysql_dist($host, $port, $login, $pass, $db='', $prefixe='', $ldap= //'iso-8859-15'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'), 'utf-8'=>array('charset'=>'utf8','collation'=>'utf8_general_ci')) ); -} // http://doc.spip.org/@spip_mysql_set_charset function spip_mysql_set_charset($charset, $serveur=''){ diff --git a/ecrire/req/pg.php b/ecrire/req/pg.php index 656ac8a7a9e8ae75de4916b6c2f698d59c86f1d5..757cd1d9576ef27fbc736a4c6b1ca172178b1d15 100644 --- a/ecrire/req/pg.php +++ b/ecrire/req/pg.php @@ -44,7 +44,11 @@ function req_pg_dist($addr, $port, $login, $pass, $db='', $prefixe='', $ldap='') 'db' => $db, 'prefixe' => $prefixe ? $prefixe : $db, 'link' => $link, - 'ldap' => $ldap, + 'ldap' => $ldap + ); +} + +$GLOBALS['spip_pg_functions_1'] = array( 'alter' => 'spip_pg_alter', 'count' => 'spip_pg_count', 'countsel' => 'spip_pg_countsel', @@ -72,7 +76,6 @@ function req_pg_dist($addr, $port, $login, $pass, $db='', $prefixe='', $ldap='') 'update' => 'spip_pg_update', 'updateq' => 'spip_pg_updateq', ); -} // Par ou ca passe une fois les traductions faites // http://doc.spip.org/@spip_pg_trace_query