From 96654b417ffa0920d142209951778933e1bdee48 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Mon, 24 Sep 2007 12:32:52 +0000 Subject: [PATCH] =?UTF-8?q?Rationnalisation=20des=20appels=20=C3=A0=20'''t?= =?UTF-8?q?rouver=5Ftable''':=20=C3=A9tant=20=C3=A0=20pr=C3=A9sent=20parfo?= =?UTF-8?q?is=20appel=C3=A9e=20hors=20d'une=20boucle=20=C3=A0=20compiler,?= =?UTF-8?q?=20son=20deuxi=C3=A8me=20argument,=20toujours=20optionnel,=20ne?= =?UTF-8?q?=20peut=20=C3=AAtre=20un=20objet=20de=20la=20classe=20boucle,?= =?UTF-8?q?=20mais=20directement=20le=20nom=20du=20serveur.=20L'erreur=20d?= =?UTF-8?q?e=20table=20inconnue=20est=20indiqu=C3=A9e=20dans=20spip=5Flog,?= =?UTF-8?q?=20et=20=C3=A0=20l'=C3=A9cran=20une=20fois=20pour=20toutes=20lo?= =?UTF-8?q?rs=20de=20la=20compilation=20de=20{{{<BOUCLEn(inconnue)...}}}.?= =?UTF-8?q?=20Dans=20le=20cas=20d'une=20table=20de=20jointure=20inconnue,?= =?UTF-8?q?=20seul=20spip.log=20l'indiquera:=20il=20n'est=20pas=20s=C3=BBr?= =?UTF-8?q?=20que=20ce=20soit=20une=20erreur=20tellement=20fatale=20en=20l?= =?UTF-8?q?'=C3=A9tat=20des=20jointures=20automatiques=20calcul=C3=A9es=20?= =?UTF-8?q?par=20SPIP.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecrire/base/abstract_sql.php | 10 +--------- ecrire/public/compiler.php | 11 +++++++++-- ecrire/public/criteres.php | 18 +++++++++--------- ecrire/public/references.php | 14 ++++++++------ 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/ecrire/base/abstract_sql.php b/ecrire/base/abstract_sql.php index 194883c3d1..f8094bab61 100644 --- a/ecrire/base/abstract_sql.php +++ b/ecrire/base/abstract_sql.php @@ -312,11 +312,10 @@ function spip_sql_character_set($charset, $skip_verif=false){ // mais aussi pour la balise contextuelle EXPOSE. // http://doc.spip.org/@trouver_table -function trouver_table($nom, $boucle='') +function trouver_table($nom, $serveur='') { global $tables_principales, $tables_auxiliaires, $table_des_tables, $connexions; - $serveur = @$boucle->sql_serveur; if (!spip_connect($serveur)) return null; $s = $serveur ? $serveur : 0; $nom_sql = $nom; @@ -351,15 +350,8 @@ function trouver_table($nom, $boucle='') $desc = sql_showtable($nom_sql, $serveur, ($nom_sql != $nom)); if (!$desc OR !$desc['field']) { - if (!$boucle) spip_log("table inconnue $serveur $nom"); - else { - include_spip('public/debug'); - erreur_squelette(_T('zbug_table_inconnue', - array('table' => $s ? "$serveur:$nom" : $nom)), - $boucle->id_boucle); return null; - } } else { $desc['table']= $nom_sql; $desc['id_table']= $nom; diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php index 593d51458e..8b4a1695a0 100644 --- a/ecrire/public/compiler.php +++ b/ecrire/public/compiler.php @@ -698,7 +698,7 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='') if ($type != 'boucle') { if (!$boucles[$id]->sql_serveur AND $connect) $boucles[$id]->sql_serveur = $connect; - $show = trouver_table($type, $boucles[$id]); + $show = trouver_table($type, $boucles[$id]->sql_serveur); if ($show) { $boucles[$id]->id_table = $x = $show['id_table']; $boucles[$id]->from[$x] = $nom_table = $show['table']; @@ -709,7 +709,14 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='') $boucles[$id]->jointures = $x; if (($type == 'documents') && $boucle->doublons) { $descr['documents'] = true; } - } else $boucles[$id]->type_requete = ''; + } else { + $boucles[$id]->type_requete = ''; + $x = $boucles[$id]->sql_serveur; + $x = $x ? "$x:$type" : $type; + erreur_squelette(_T('zbug_table_inconnue', + array('table' => $x )), + $id); + } } } // Commencer par reperer les boucles appelees explicitement diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php index 3c4325d30e..7107c6ff77 100644 --- a/ecrire/public/criteres.php +++ b/ecrire/public/criteres.php @@ -241,7 +241,7 @@ function critere_branche_dist($idb, &$boucles, $crit) { //Trouver une jointure $type = $boucle->type_requete; - $desc = trouver_table($type, $boucle); + $desc = trouver_table($type, $boucle->sql_serveur); //Seulement si necessaire if (!array_key_exists('id_rubrique', $desc['field'])) { $cle = trouver_champ_exterieur('id_rubrique', $boucle->jointures, $boucle); @@ -316,7 +316,7 @@ function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix='') { $boucle = $boucles[$idb]; $arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent); - $desc = trouver_table($boucle->type_requete, $boucle); + $desc = trouver_table($boucle->type_requete, $boucle->sql_serveur); if (is_array($desc['field'])){ $liste_field = implode(',',array_map('_q',array_keys($desc['field']))); return "((\$x = preg_replace(\"/\\W/\",'',$arg)) ? ( in_array(\$x,array($liste_field)) ? ('$boucle->id_table.' . \$x$suffix):(\$x$suffix) ) : '')"; @@ -400,7 +400,7 @@ function critere_parinverse($idb, &$boucles, $crit, $sens='') { } // par champ. Verifier qu'ils sont presents. else { - $desc = trouver_table($boucle->type_requete, $boucle); + $desc = trouver_table($boucle->type_requete, $boucle->sql_serveur); if ($desc['field'][$par]) $par = $boucle->id_table.".".$par; // sinon tant pis, ca doit etre un champ synthetise (cf points) @@ -431,7 +431,7 @@ function critere_par_jointure(&$boucle, $join) $t = array_search($table, $boucle->from); if (!$t) { $type = $boucle->type_requete; - $desc = trouver_table($type, $boucle); + $desc = trouver_table($type, $boucle->sql_serveur); $cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle); if ($cle) @@ -703,7 +703,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $type = $boucle->type_requete; $table = $boucle->id_table; - $desc = trouver_table($type, $boucle); + $desc = trouver_table($type, $boucle->sql_serveur); list($fct, $col, $op, $val, $args_sql) = calculer_critere_infixe_ops($idb, $boucles, $crit); @@ -800,7 +800,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { // http://doc.spip.org/@critere_secteur_forum function critere_secteur_forum($idb, &$boucles, $val, $crit) { - $desc = trouver_table('articles', $boucles[$idb]); + $desc = trouver_table('articles', $boucles[$idb]->sql_serveur); return calculer_critere_externe_init($boucles[$idb], array($desc['table']), 'id_secteur', $desc, $crit->cond, true); } @@ -953,7 +953,7 @@ 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_table($v, $boucle))) { + ($def = trouver_table($v, $boucle->sql_serveur))) { $milieu = array_intersect($ddesc['key'], trouver_cles_table($def['key'])); $new[] = $v; foreach ($milieu as $k) @@ -993,7 +993,7 @@ function trouver_cles_table($keys) function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false) { foreach($joints as $k => $join) { - if ($join && $table = trouver_table($join, $boucle)) { + if ($join && $table = trouver_table($join, $boucle->sql_serveur)) { if (isset($table['field']) && 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); @@ -1120,7 +1120,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 - $t = trouver_table($boucle->type_requete, $boucle); + $t = trouver_table($boucle->type_requete, $boucle->sql_serveur); if ($t['field']["date$suite"]) $date_orig = 'date'.$suite; else diff --git a/ecrire/public/references.php b/ecrire/public/references.php index e71ff85ce8..f64d5396da 100644 --- a/ecrire/public/references.php +++ b/ecrire/public/references.php @@ -65,7 +65,7 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles) { $r = $boucles[$idb]->type_requete; if ($r == 'boucle') return array(); - $desc = trouver_table($r, $boucles[$idb]); + $desc = !$r ? '' : trouver_table($r, $boucles[$idb]->sql_serveur); if(!$desc) { # continuer pour chercher l'erreur suivante return array("'#" . $r . ':' . $nom_champ . "'",''); @@ -115,12 +115,14 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep) list($e, $x) = $excep; #PHP4 affecte de gauche a droite $excep = $x; #PHP5 de droite a gauche ! if (!$t = array_search($e, $boucle->from)) { - $j = trouver_table($e, $boucle); - $t = 'J' . count($boucle->from); - $boucle->from[$t] = $j['table']; - $j = $j['key']['PRIMARY KEY']; - $boucle->where[]= array("'='", "'$boucle->id_table." . "$j'", "'$t.$j'"); + $j = trouver_table($e, $boucle->sql_serveur); + if ($j) { + $t = 'J' . count($boucle->from); + $boucle->from[$t] = $j['table']; + $j = $j['key']['PRIMARY KEY']; + $boucle->where[]= array("'='", "'$boucle->id_table." . "$j'", "'$t.$j'"); } + } } } else $t = $desc['id_table']; -- GitLab