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&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