diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 5410e761e7fa009bf8d9383f64d07da4c36b4c93..8e163eb274fd3234e1234b55b25157eb33d67c07 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -202,12 +202,12 @@ function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $pr AND !defined('_ECRIRE_INSTALL')) { return; } - if (!$prefixe) $prefixe = isset($GLOBALS['table_prefix']) ? $GLOBALS['table_prefix'] : $db; $db_ok = charger_fonction('db_' . $type, 'base', true); - if ($db_ok AND $db_ok = $db_ok($host, $port, $login, $pass, $db, $prefixe)) + if ($db_ok + AND $db_ok = $db_ok($host, $port, $login, $pass, $db, $prefixe)) return $db_ok; @@ -229,7 +229,7 @@ function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $pr // http://doc.spip.org/@spip_connect function spip_connect($serveur='') { - global $connexions; + global $connexions, $type_des_serveurs; $index = $serveur ? $serveur : 0; if (isset($connexions[$index])) return $connexions[$index]; @@ -244,6 +244,7 @@ function spip_connect($serveur='') { : ($install ? (_FILE_CONNECT_INS . '.php') : '')); + unset($GLOBALS['spip_connect_version']); if ($f AND is_readable($f)) include($f); if (!isset($GLOBALS['db_ok'])) { if ($install) return 'spip_' . $serveur . '_query'; @@ -252,13 +253,14 @@ function spip_connect($serveur='') { } $connexions[$index] = $GLOBALS['db_ok']; + $type_des_serveurs[$index] = isset($GLOBALS['spip_connect_version']) + ? 'spip' : 'inconnu'; + + if ($serveur) return $connexions[$index]; // Premiere connexion au serveur principal: // verifier que la table principale est la // et que le fichier de connexion n'est pas une version trop vieille - - if (!$serveur) { - // Version courante = 0.6 (indication du prefixe comme 6e arg) // // La version 0.0 (non numerotee) doit etre refaite par un admin @@ -266,19 +268,17 @@ function spip_connect($serveur='') { // - la version 0.1 est moins performante que la 0.2 // - la 0.2 fait un include_ecrire('inc_db_mysql.php3') // - la version 0.5 indique le serveur comme 5e arg - // On ne force pas la mise a niveau pour les autres. - 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 ($GLOBALS['spip_connect_version']< 0.1 AND _DIR_RESTREINT){ + include_spip('inc/headers'); + redirige_par_entete(generer_url_ecrire('upgrade', 'reinstall=oui', true)); + } - $f = str_replace('query', 'countsel', $GLOBALS['db_ok']['query']); - if (!$f('spip_meta', '', '', '', '', '', '', $index)) { - unset($connexions[$index]); - spip_log("spip_connect: table meta vide ($index)"); - return false; - } + $f = $GLOBALS['db_ok']['countsel']; + if (!$f('spip_meta', '', '', '', '', '', '', $index)) { + unset($connexions[$index]); + spip_log("spip_connect: table meta vide ($index)"); + return false; } return $connexions[$index]; diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php index 29691cd3e0fb17357cddbf710c08d85a98a5834b..cc0a1b49c77f67521c733a8734e34d5535da4bba 100644 --- a/ecrire/public/compiler.php +++ b/ecrire/public/compiler.php @@ -38,6 +38,7 @@ include_spip('public/interfaces'); # definition des tables include_spip('base/serial'); +include_spip('base/auxiliaires'); // http://doc.spip.org/@argumenter_inclure function argumenter_inclure($struct, $descr, &$boucles, $id_boucle, $echap=true){ @@ -697,19 +698,17 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile) { // Initialiser les champs necessaires a la compilation // et signaler une boucle documents (les autres influent dessus) + $tables_des_serveurs_sql[0] = + array_merge($tables_principales, $tables_auxiliaires); foreach($boucles as $id => $boucle) { $type = $boucle->type_requete; if ($type != 'boucle') { - $table = isset($table_des_tables[$type]) - ? $table_des_tables[$type] - : $type; - $show = trouver_def_table($table, $boucles[$id]); + $show = trouver_table($type, $boucles[$id]); if ($show) { - $nom_table = $show[0]; - $show = $show[1]['key']; + $nom_table = $show['table']; + $boucles[$id]->id_table = $show['type']; + $boucles[$id]->primary = $show['key']["PRIMARY KEY"]; $boucles[$id]->descr = &$descr; - $boucles[$id]->id_table = $table; - $boucles[$id]->primary = $show["PRIMARY KEY"]; if ((!$boucles[$id]->jointures) AND (is_array($x = $tables_jointures[$nom_table]))) $boucles[$id]->jointures = $x; diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php index 7a17f71ed11416b23f415509c6f91f193a767e03..fab22e77b33c5e88008b47f89b8136b684f7efa1 100644 --- a/ecrire/public/criteres.php +++ b/ecrire/public/criteres.php @@ -245,8 +245,7 @@ function critere_branche_dist($idb, &$boucles, $crit) { //Trouver une jointure $type = $boucle->type_requete; - $nom = $table_des_tables[$type]; - list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle); + $desc = trouver_table($type, $boucle); //Seulement si necessaire if (!array_key_exists('id_rubrique', $desc['field'])) { $cle = trouver_champ_exterieur('id_rubrique', $boucle->jointures, $boucle); @@ -326,7 +325,7 @@ function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix='') $arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent); $r = $boucle->type_requete; $s = $boucles[$idb]->sql_serveur; - if (!$s) $s = 'localhost'; + if (!$s) $s = 0; $t = $table_des_tables[$r]; // pour les tables non Spip if (!$t) $t = $r; else $t = "spip_$t"; @@ -417,7 +416,7 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) { else { $r = $boucle->type_requete; $s = $boucles[$idb]->sql_serveur; - if (!$s) $s = 'localhost'; + if (!$s) $s = 0; $t = $table_des_tables[$r]; // pour les tables non Spip if (!$t) $t = $r; else $t = "spip_$t"; @@ -454,15 +453,14 @@ function critere_par_jointure(&$boucle, $join) list($table, $champ) = $join; $t = array_search($table, $boucle->from); if (!$t) { - $type = $boucle->type_requete; - $nom = $table_des_tables[$type]; - list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle); + $type = $boucle->type_requete; + $desc = trouver_table($type, $boucle); - $cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle); - if ($cle) - $cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle, false); - if ($cle) $t = "L$cle"; - else erreur_squelette(_T('zbug_info_erreur_squelette'), "{par ?} BOUCLE$idb"); + $cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle); + if ($cle) + $cle = calculer_jointure($boucle, array($desc['table'], $desc), $cle, false); + if ($cle) $t = "L$cle"; + else erreur_squelette(_T('zbug_info_erreur_squelette'), "{par ?} BOUCLE$idb"); } return "'" . $t . '.' . $champ . "'"; @@ -728,8 +726,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $type = $boucle->type_requete; $table = $boucle->id_table; - $nom = $table_des_tables[$type]; - list(, $desc) = trouver_def_table($nom ? $nom : $type, $boucle); + $desc = trouver_table($type, $boucle); list($fct, $col, $op, $val, $args_sql) = calculer_critere_infixe_ops($idb, $boucles, $crit); @@ -831,8 +828,8 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { // http://doc.spip.org/@critere_secteur_forum function critere_secteur_forum($idb, &$boucles, $val, $crit) { - list($nom, $desc) = trouver_def_table('articles', $boucles[$idb]); - return calculer_critere_externe_init($boucles[$idb], array($nom), 'id_secteur', $desc, $crit->cond, true); + $desc = trouver_table('articles', $boucles[$idb]); + return calculer_critere_externe_init($boucles[$idb], array($desc['table']), 'id_secteur', $desc, $crit->cond, true); } // Champ hors table, ca ne peut etre qu'une jointure. @@ -984,16 +981,15 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array(), $mi $new = $vu; foreach($boucle->jointures as $v) { if ($v && (!in_array($v,$vu)) && - ($def = trouver_def_table($v, $boucle))) { - list($table,$join) = $def; - $milieu = array_intersect($ddesc['key'], trouver_cles_table($join['key'])); + ($def = trouver_table($v, $boucle))) { + $milieu = array_intersect($ddesc['key'], trouver_cles_table($def['key'])); $new[] = $v; foreach ($milieu as $k) if ($k!=$milieu_prec) // ne pas repasser par la meme cle car c'est un chemin inutilement long { - $r = calculer_chaine_jointures($boucle, array($v, $join), $arrivee, $new, $k); + $r = calculer_chaine_jointures($boucle, array($v, $def), $arrivee, $new, $k); if ($r) { - array_unshift($r, array($dnom, $def, $k)); + array_unshift($r, array($dnom, array($def['table'], $def), $k)); return $r; } } @@ -1021,52 +1017,60 @@ function trouver_cles_table($keys) return array_keys($res); } -// Trouve la description d'une table dans les globales de Spip -// (le prefixe des tables y est toujours 'spip_', son chgt est ulterieur) -// Si on ne la trouve pas, on demande au serveur SQL (marche pas toujours) - -// http://doc.spip.org/@trouver_def_table -function trouver_def_table($nom, &$boucle) +// Trouve la description d'une table, en particulier celle d'une boucle +// Si on ne la trouve pas, on demande au serveur SQL +// retourne False si lui non plus ne la trouve pas. +// Si on la trouve, le tableau resultat a les entrees: +// field (comme dans serial.php) +// key (comme dans serial.php) +// serveur = serveur bd associe +// table = nom complet de la table (avec le prefixe spip_ pour les stds) +// type = nom court (i.e. type de boucle) + +function trouver_table($type, $boucle) { - global $tables_principales, $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql; - - $nom_table = $nom; - $s = $boucle->sql_serveur; - if (!$s) { - $s = 'localhost'; - if (in_array($nom, $table_des_tables)) - $nom_table = 'spip_' . $nom; - } - - $desc = $tables_des_serveurs_sql[$s]; - - if (isset($desc[$nom_table])) - return array($nom_table, $desc[$nom_table]); - - include_spip('base/auxiliaires'); - $nom_table = 'spip_' . $nom; - if ($desc = $tables_auxiliaires[$nom_table]) - return array($nom_table, $desc); + global $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql, $type_des_serveurs; + + $serveur = $boucle->sql_serveur; + $s = $serveur ? $serveur : 0; + if (!isset($type_des_serveurs[$s])) spip_connect($serveur); + + $spip = ($type_des_serveurs[$s] == 'spip'); + + if ($spip AND isset($table_des_tables[$type])) { + // indirection (pour les rares cas ou le nom de la table!=type) + $t = $table_des_tables[$type]; + $nom_table = 'spip_' . $t; + } elseif ($spip AND isset($tables_auxiliaires['spip_' .$type])) { + $t = $type; + $nom_table = 'spip_' . $t; + } else $nom_table = $t = $type; + + if (!isset($tables_des_serveurs_sql[$s][$nom_table])) { + $desc = sql_showtable($nom_table, $serveur, ($nom_table != $type)); + if (!$desc) { + erreur_squelette(_T('zbug_table_inconnue', array('table' => $type)), + $boucle->id_boucle); + return null; + } + $tables_des_serveurs_sql[$s][$nom_table] = $desc; + } else $desc = $tables_des_serveurs_sql[$s][$nom_table]; + + $desc['table']= $nom_table; + $desc['serveur']= $s; + $desc['type']= $t; - if ($desc = sql_showtable($nom, $boucle->sql_serveur)) - if (isset($desc['field'])) { - // faudrait aussi prevoir le cas du serveur externe - $tables_principales[$nom] = $desc; - return array($nom, $desc); - } - erreur_squelette(_T('zbug_table_inconnue', array('table' => $nom)), - $boucle->id_boucle); - return false; + return $desc; } // http://doc.spip.org/@trouver_champ_exterieur function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false) { foreach($joints as $k => $join) { - if ($join && $table = trouver_def_table($join, $boucle)) { - if (array_key_exists($cle, $table[1]['field']) - && ($checkarrivee==false || $checkarrivee==$table[0])) // si on sait ou on veut arriver, il faut que ca colle - return $table; + if ($join && $table = trouver_table($join, $boucle)) { + if (array_key_exists($cle, $table['field']) + && ($checkarrivee==false || $checkarrivee==$table['table'])) // si on sait ou on veut arriver, il faut que ca colle + return array($table['table'], $table); } } return ""; @@ -1189,7 +1193,7 @@ function calculer_critere_infixe_date($idb, &$boucles, $regs) if ($suite) { # Recherche de l'existence du champ date_xxxx, # si oui choisir ce champ, sinon choisir xxxx - list(,$t)= trouver_def_table($boucle->type_requete, $boucle); + $t = trouver_table($boucle->type_requete, $boucle); if ($t['field']["date$suite"]) $date_orig = 'date'.$suite; else diff --git a/ecrire/public/references.php b/ecrire/public/references.php index 8ce6b22eaa9dafb0ea5ab98315a9d71ff43062ac..c6587ecc9a862c5120dc00df2e5130da91d7c08d 100644 --- a/ecrire/public/references.php +++ b/ecrire/public/references.php @@ -10,8 +10,6 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ - - // fonctions de recherche et de reservation // dans l'arborescence des boucles @@ -27,7 +25,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // http://doc.spip.org/@index_pile function index_pile($idb, $nom_champ, &$boucles, $explicite='') { - global $exceptions_des_tables, $table_des_tables, $tables_des_serveurs_sql; + global $exceptions_des_tables, $table_des_tables; $i = 0; if (strlen($explicite)) { @@ -61,57 +59,15 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite='') { return('@$Pile[0][\''. strtolower($nom_champ) . '\']'); } -/** - * retourne la description de la table associee a un type de boucle - * retourne un tableau avec les entrees field et key (comme dans serial.php) - * et type = type de boucle, serveur = serveur bdd associe et table = nom de - * la table concernee - * retourne null si on ne trouve pas la table - */ -// http://doc.spip.org/@description_type_requete -function description_type_requete($type, $serveur='') { - global $table_des_tables, $tables_des_serveurs_sql, $tables_auxiliaires; - - if (!$serveur) { - $s = 'localhost'; - } else $s = $serveur; - // pour les tables non Spip - if (isset($table_des_tables[$type])) { - // indirection (pour les rares cas ou le nom de la table!=type) - $t = $table_des_tables[$type]; - $nom_table = 'spip_' . $t; - } elseif (isset($tables_auxiliaires['spip_' .$type])) { - $t = $type; - $nom_table = 'spip_' . $t; - } else $nom_table = $t = $type; - - $desc = $tables_des_serveurs_sql[$s][$nom_table]; - if (!isset($desc['field'])) { - $desc = sql_showtable($nom_table, $serveur, ($nom_table != $type)); - if (!isset($desc['field'])) - return null; - $tables_des_serveurs_sql[$s][$nom_table]= $desc; - } - $desc['serveur']= $s; - $desc['type']= $t; - $desc['table']= $nom_table; - - return $desc; -} - // http://doc.spip.org/@index_tables_en_pile function index_tables_en_pile($idb, $nom_champ, &$boucles) { global $exceptions_des_tables; $r = $boucles[$idb]->type_requete; - $s = $boucles[$idb]->sql_serveur; if ($r == 'boucle') return array(); - $desc= description_type_requete($r, $s); - + $desc = trouver_table($r, $boucle); if(!$desc) { - erreur_squelette(_T('zbug_table_inconnue', array('table' => $r)), - "'$idb'"); # continuer pour chercher l'erreur suivante return array("'#" . $r . ':' . $nom_champ . "'",''); } @@ -441,7 +397,7 @@ function applique_filtres($p) { // S'il y a un lien avec la session, ajouter un code qui levera // un drapeau dans la structure d'invalidation $Cache - if ($p->descr['session']) + if (isset($p->descr['session'])) $code = "$code . invalideur_session(\$Cache)"; // ramasser les images intermediaires inutiles et graver l'image finale