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