Skip to content
Extraits de code Groupes Projets
Valider c41988f2 rédigé par esj's avatar esj
Parcourir les fichiers

permettre l'acces aux champs d'une table de jointure explicite; ca reste...

permettre l'acces aux champs d'une table de jointure explicite; ca reste lacunaire mais c'est tout de meme plus homogene que de faire la jointure et n'y avoir acces qu'en partie
parent 3e781848
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -42,10 +42,11 @@ class Boucle { ...@@ -42,10 +42,11 @@ class Boucle {
var $lang_select; var $lang_select;
var $type_requete; var $type_requete;
var $sql_serveur; var $sql_serveur;
var $jointures;
var $param = array(); var $param = array();
var $criteres = array(); var $criteres = array();
var $separateur = array(); var $separateur = array();
var $jointures = array();
var $jointures_explicites = false;
var $doublons; var $doublons;
var $partie, $total_parties,$mode_partie; var $partie, $total_parties,$mode_partie;
var $externe = ''; # appel a partir d'une autre boucle (recursion) var $externe = ''; # appel a partir d'une autre boucle (recursion)
......
...@@ -39,80 +39,88 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite='') { ...@@ -39,80 +39,88 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite='') {
} }
# spip_log("Cherche: $nom_champ a partir de '$idb'"); # spip_log("Cherche: $nom_champ a partir de '$idb'");
$c = strtolower($nom_champ); $nom_champ = strtolower($nom_champ);
// attention: entre la boucle nommee 0, "" et le tableau vide, // attention: entre la boucle nommee 0, "" et le tableau vide,
// il y a incoherences qu'il vaut mieux eviter // il y a incoherences qu'il vaut mieux eviter
while ($boucles[$idb]) { while ($boucles[$idb]) {
$r = $boucles[$idb]->type_requete; list ($t, $c) = index_tables_en_pile($idb, $nom_champ, $boucles);
$s = $boucles[$idb]->sql_serveur; if ($t) {
if (!$s) if (!in_array($t, $boucles[$idb]->select))
{ $s = 'localhost'; $boucles[$idb]->select[] = $t;
return '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
}
# spip_log("On remonte vers $i");
// Sinon on remonte d'un cran
$idb = $boucles[$idb]->id_parent;
$i++;
}
# spip_log("Pas vu $nom_champ");
// esperons qu'il y sera
return('$Pile[0][\''. strtolower($nom_champ) . '\']');
}
function index_tables_en_pile($idb, $nom_champ, &$boucles)
{
global $exceptions_des_tables, $table_des_tables, $tables_des_serveurs_sql;
$r = $boucles[$idb]->type_requete;
$s = $boucles[$idb]->sql_serveur;
if (!$s)
{ $s = 'localhost';
// indirection (pour les rares cas ou le nom de la table!=type) // indirection (pour les rares cas ou le nom de la table!=type)
$t = $table_des_tables[$r]; $t = $table_des_tables[$r];
} }
// pour les tables non Spip // pour les tables non Spip
if (!$t) {$nom_table = $t = $r; } if (!$t) {$nom_table = $t = $r; } else $nom_table = 'spip_' . $t;
else $nom_table = 'spip_' . $t;
$desc = $tables_des_serveurs_sql[$s][$nom_table]; $desc = $tables_des_serveurs_sql[$s][$nom_table];
# spip_log("Go: idb='$idb' r='$r' c='$c' nom='$nom_champ' s=$s t=$t desc=" . array_keys($desc)); # spip_log("Go: idb='$idb' r='$r' nom='$nom_champ' s=$s t=$t desc=" . array_keys($desc));
if (!isset($desc['field'])) { if (!isset($desc['field'])) {
$desc = $table_des_tables[$r] ? (($GLOBALS['table_prefix'] ? $GLOBALS['table_prefix'] : 'spip') . '_' . $t) : $nom_table; $desc = $table_des_tables[$r] ? (($GLOBALS['table_prefix'] ? $GLOBALS['table_prefix'] : 'spip') . '_' . $t) : $nom_table;
$desc = spip_abstract_showtable($desc, $boucles[$idb]->sql_serveur); $desc = spip_abstract_showtable($desc, $boucles[$idb]->sql_serveur);
if (!isset($desc['field'])) { if (!isset($desc['field'])) {
erreur_squelette(_T('zbug_table_inconnue', array('table' => $r)), erreur_squelette(_T('zbug_table_inconnue', array('table' => $r)),
"'$idb'"); "'$idb'");
# continuer pour chercher l'erreur suivante # continuer pour chercher l'erreur suivante
return "'#" . $r . ':' . $nom_champ . "'"; return array("'#" . $r . ':' . $nom_champ . "'",'');
}
$tables_des_serveurs_sql[$s][$nom_table] = $desc;
} }
$excep = $exceptions_des_tables[$r][$c]; $tables_des_serveurs_sql[$s][$nom_table] = $desc;
if ($excep) { }
$excep = $exceptions_des_tables[$r][$nom_champ];
if ($excep) {
// entite SPIP alias d'un champ SQL // entite SPIP alias d'un champ SQL
if (!is_array($excep)) { if (!is_array($excep)) {
$e = $excep; $e = $excep;
$c = $excep; $c = $excep;
} }
// entite SPIP alias d'un champ dans une jointure // entite SPIP alias d'un champ dans une jointure
else { else {
if (!$t = array_search($excep[0], $boucles[$idb]->from)) { if (!$t = array_search($excep[0], $boucles[$idb]->from)) {
$t = 'J' . count($boucles[$idb]->from); $t = 'J' . count($boucles[$idb]->from);
$boucles[$idb]->from[$t] = $excep[0]; $boucles[$idb]->from[$t] = $excep[0];
}
$e = $excep[1];
if ($e != $c) $e .= ' AS '.$c;
} }
$e = $excep[1];
if ($e != $c) $e .= ' AS '.$c;
} }
else { return array("$t.$e", $c);
// $e est le type SQL de l'entree
// entite SPIP homonyme au champ SQL
if ($desc['field'][$c])
$e = $c;
else
unset($e);
}
# spip_log("Dans $idb ('$t' '$e' '$c'): $desc"); } else {
if ($desc['field'][$nom_champ])
// On l'a trouve return array("$t.$nom_champ", $nom_champ);
if ($e) { else {
$t .= ".$e"; if ($boucles[$idb]->jointures_explicites) {
if (!in_array($t, $boucles[$idb]->select)) $t = trouver_champ_exterieur($nom_champ,
$boucles[$idb]->select[] = $t; $boucles[$idb]->jointures,
return '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']'; $boucles[$idb]);
if ($t) $t = array_search($t[0], $boucles[$idb]->from);
if ($t) return array($t .'.' . $nom_champ, $nom_champ);
}
return array('','');
} }
# spip_log("On remonte vers $i");
// Sinon on remonte d'un cran
$idb = $boucles[$idb]->id_parent;
$i++;
} }
# spip_log("Pas vu $nom_champ");
// esperons qu'il y sera
return('$Pile[0][\''. strtolower($nom_champ) . '\']');
} }
// cette fonction sert d'API pour demander le champ '$champ' dans la pile // cette fonction sert d'API pour demander le champ '$champ' dans la pile
......
...@@ -612,11 +612,9 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) { ...@@ -612,11 +612,9 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) {
if ($x = $table_des_tables[$type]) { if ($x = $table_des_tables[$type]) {
$boucles[$id]->id_table = $x; $boucles[$id]->id_table = $x;
$boucles[$id]->primary = $tables_principales["spip_$x"]['key']["PRIMARY KEY"]; $boucles[$id]->primary = $tables_principales["spip_$x"]['key']["PRIMARY KEY"];
if (is_array($x = $tables_jointures['spip_' . $x])) { if ((!$boucles[$id]->jointures)
foreach($x as $j) { AND (is_array($x = $tables_jointures['spip_' . $x])))
$boucles[$id]->jointures[]= $j; $boucles[$id]->jointures = $x;
}
}
} else { } else {
// table non Spip. // table non Spip.
$boucles[$id]->id_table = $type; $boucles[$id]->id_table = $type;
......
...@@ -515,8 +515,12 @@ function phraser($texte, $id_parent, &$boucles, $nom, $ligne=1) { ...@@ -515,8 +515,12 @@ function phraser($texte, $id_parent, &$boucles, $nom, $ligne=1) {
preg_match(SPEC_BOUCLE, $milieu, $match); preg_match(SPEC_BOUCLE, $milieu, $match);
$milieu = substr($milieu, strlen($match[0])); $milieu = substr($milieu, strlen($match[0]));
$type = $match[1]; $type = $match[1];
$jointures = $match[2]; $jointures = trim($match[2]);
$result->jointures = preg_split("/\s+/",trim($match[2])); if ($jointures) {
$result->jointures = preg_split("/\s+/",$jointures);
$result->jointures_explicites = $jointures;
}
if ($p = strpos($type, ':')) if ($p = strpos($type, ':'))
{ {
$result->sql_serveur = substr($type,0,$p); $result->sql_serveur = substr($type,0,$p);
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter