From 9fb11ef6904677546f78cc124534044cb58cdffc Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Fri, 7 Sep 2007 16:44:57 +0000
Subject: [PATCH] =?UTF-8?q?#209:=20nouvelle=20rationnalisation=20de=20la?=
 =?UTF-8?q?=20fonction=20'''trouver=5Ftable'''=20introduite=20par=20[10133?=
 =?UTF-8?q?],=20qui=20affecte=20tous=20son=20r=C3=A9sultat=20=C3=A0=20la?=
 =?UTF-8?q?=20globale=20'''$connexions'''=20plutot=20que=20d'en=20recalcul?=
 =?UTF-8?q?er=20une=20partie=20=C3=A0=20chaque=20appel.=20Le=20tableau=20c?=
 =?UTF-8?q?onstruit=20a=20toujours=20=20les=20index=20'''field''',=20'''in?=
 =?UTF-8?q?dex''',=20'''table'''=20(nom=20SQL)=20et=20=C3=A0=20pr=C3=A9sen?=
 =?UTF-8?q?t=20'''id=5Ftable'''=20qui=20donne=20le=20nom=20du=20suivant=20?=
 =?UTF-8?q?le=20'''AS'''=20dans=20la=20requ=C3=AAte=20SQL=20(il=20=C3=A9ta?=
 =?UTF-8?q?it=20nomm=C3=A9=20"type"=20auparavant,=20ce=20qui=20=C3=A9tait?=
 =?UTF-8?q?=20trompeur=20maintenant=20qu'il=20existe=20le=20type=20du=20se?=
 =?UTF-8?q?rveur=20dans=20cette=20structure=20de=20donn=C3=A9es).?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Par ailleurs, les jointures dans une base externe ne marchaient plus. Quant aux balises #URL_ utilisées dans une base externe non SPIP, elles provoquaient une récursion infinie débouchant sur un {{{Illegal Instruction}}} par PHP.
---
 ecrire/public/compiler.php   | 32 ++++++++++++++++++--------------
 ecrire/public/criteres.php   |  2 +-
 ecrire/public/parametrer.php |  7 ++++---
 ecrire/public/references.php |  6 +++---
 4 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index c8a52f0c7e..333fa4bb86 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -623,9 +623,9 @@ function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
 // 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)
+// table = nom SQL de la table (avec le prefixe spip_ pour les stds)
+// id_table = nom SPIP de la table (i.e. type de boucle)
+// le compilateur produit  FROM $r['table'] AS $r['id_table']
 
 // http://doc.spip.org/@trouver_table
 function trouver_table($type, $boucle)
@@ -640,32 +640,36 @@ function trouver_table($type, $boucle)
     	// indirection (pour les rares cas ou le nom de la table!=type)
 		$t = $table_des_tables[$type];
 		$nom_table = 'spip_' . $t;
-		if (!isset($connexions[$s]['tables'][$nom_table]))
+		if (!isset($connexions[$s]['tables'][$nom_table])) {
 			$connexions[$s]['tables'][$nom_table] = 
 				$tables_principales[$nom_table];
+			$connexions[$s]['tables'][$nom_table]['table']= $nom_table;
+			$connexions[$s]['tables'][$nom_table]['id_table']= $t;
+		}
 	} elseif ($spip AND isset($tables_auxiliaires['spip_' .$type])) {
 		$t = $type;
 		$nom_table = 'spip_' . $t;
-		if (!isset($connexions[$s]['tables'][$nom_table]))
+		if (!isset($connexions[$s]['tables'][$nom_table])) {
 			$connexions[$s]['tables'][$nom_table] = 
 				$tables_auxiliaires[$nom_table];
+			$connexions[$s]['tables'][$nom_table]['table']= $nom_table;
+			$connexions[$s]['tables'][$nom_table]['id_table']= $t;
+		}
 	} else	$nom_table = $t = $type;
-	spip_log("%%%% $t $nom_table " . isset($connexions[$s]['tables'][$nom_table]));
+
 	if (!isset($connexions[$s]['tables'][$nom_table])) {
 		$desc = sql_showtable($nom_table, $serveur, ($nom_table != $type));
 		if (!$desc OR !$desc['field']) {
 		  erreur_squelette(_T('zbug_table_inconnue', array('table' => $s ? "$serveur:$type" : $type)),
 					 $boucle->id_boucle);
 			return null;
+		} else {
+			$desc['table']= $nom_table;
+			$desc['id_table']= $t;
 		}
 		$connexions[$s]['tables'][$nom_table] = $desc;
-	} else $desc = $connexions[$s]['tables'][$nom_table];
-	
-	$desc['table']= $nom_table;
-	$desc['serveur']= $s;
-	$desc['type']= $t;
-
-	return $desc;
+	}
+	return $connexions[$s]['tables'][$nom_table];
 }
 
 // affichage du code produit
@@ -757,7 +761,7 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='')
 			$show = trouver_table($type, $boucles[$id]);
 			if ($show) {
 				$nom_table = $show['table'];
-				$boucles[$id]->id_table = $show['type'];
+				$boucles[$id]->id_table = $show['id_table'];
 				$boucles[$id]->primary = $show['key']["PRIMARY KEY"];
 				$boucles[$id]->descr = &$descr;
 				if ((!$boucles[$id]->jointures)
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index d4ad437d0a..3a754b1ee1 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -436,8 +436,8 @@ function critere_par_jointure(&$boucle, $join)
   if (!$t) {
 	$type = $boucle->type_requete;
 	$desc = trouver_table($type, $boucle);
-
 	$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"; 
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index 585c5080a0..7314b1c3df 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -252,9 +252,10 @@ function generer_generer_url($type, $p)
 
 	if (!$s)
 		return "generer_url_$type($_id)";
-	elseif (!$GLOBALS['connexions'][$s]['spip_connect_version'])
-		return calculer_champ($p);
-	else {
+	elseif (!$GLOBALS['connexions'][$s]['spip_connect_version']) {
+		erreur_squelette("#URL_" . strtoupper($type). ' ' . _T('zbug_distant_interdit'));
+		return "";
+	} else {
 		$u = "quete_meta('adresse_site', '$s')";
 		if ($type != 'document')
 			return "$u . '?page=$type&amp;id_$type=' . " . $_id;
diff --git a/ecrire/public/references.php b/ecrire/public/references.php
index 88d070e547..43fd80d24a 100644
--- a/ecrire/public/references.php
+++ b/ecrire/public/references.php
@@ -65,13 +65,13 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles) {
 	$r = $boucles[$idb]->type_requete;
 
 	if ($r == 'boucle') return array();
-	$desc = trouver_table($r, $boucle);
+	$desc = trouver_table($r, $boucles[$idb]);
 	if(!$desc) {
 		# continuer pour chercher l'erreur suivante
 		return  array("'#" . $r . ':' . $nom_champ . "'",'');
 	}
 
-	$t= $desc['type'];
+	$t= $desc['id_table'];
 	$excep = isset($exceptions_des_tables[$r]) ? $exceptions_des_tables[$r] : '';
 	if ($excep)
 		$excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : '';
@@ -123,7 +123,7 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep)
 				}
 		}
 	} 
-	else $t = $desc['type'];
+	else $t = $desc['id_table'];
 	// demander a SQL de gerer le synonyme
 	// ca permet que excep soit dynamique (Cedric, 2/3/06)
 	if ($excep != $nom_champ) $excep .= ' AS '. $nom_champ;
-- 
GitLab