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

gaffe aux cles multiples dans les jointures automatiques (Pierre Bourgeois)

parent 9790c459
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -164,26 +164,31 @@ function spip_mysql_showtable($nom_table) ...@@ -164,26 +164,31 @@ function spip_mysql_showtable($nom_table)
if (!a) return ""; if (!a) return "";
if (!spip_fetch_array($a)) return ""; if (!spip_fetch_array($a)) return "";
list(,$a) = spip_fetch_array(spip_query("SHOW CREATE TABLE $nom_table")); list(,$a) = spip_fetch_array(spip_query("SHOW CREATE TABLE $nom_table"));
if (!ereg("^[^()]*\(([^()]*(\([^()]*\)[^()]*)*)\)", $a, $r))
if (!preg_match("/^[^(),]*\((([^()]*\([^()]*\)[^()]*)*)\)[^()]*$/", $a, $r))
return ""; return "";
else { else {
$dec = $r[1];
if (preg_match("/^(.*),(.*KEY.*)$/s", $dec, $r)) {
$namedkeys = $r[2];
$dec = $r[1];
}
else
$namedkeys = "";
$a = preg_split("/,\s*`/",$r[1]);
$n = count($a)-1;
ereg("^([^(),]*([^(),]*(\([^()]*\)[^(),]*)*)),(.*)", $a[$n], $r);
$a[$n]= $r[1];
$namedkeys = $r[count($r)-1];
$fields = array(); $fields = array();
foreach($a as $v) { foreach(preg_split("/,\s*`/",$dec) as $v) {
preg_match("/^\s*`?([^`]*)`\s*(.*)$/",$v,$r); preg_match("/^\s*`?([^`]*)`\s*(.*)$/",$v,$r);
$fields[strtolower($r[1])] = $r[2]; $fields[strtolower($r[1])] = $r[2];
} }
$keys = array(); $keys = array();
foreach(split(",",$namedkeys) as $v) {
preg_match("/^([^(]*)\((.*)\)\s*$/",$v,$r); foreach(split(")",$namedkeys) as $v) {
$k = str_replace("`", '', $r[1]); if (preg_match("/^\s*([^(]*)\((.*)$/",$v,$r)) {
$t = strtolower(str_replace("`", '', $r[2])); $k = str_replace("`", '', trim($r[1]));
$keys[$k] = $t; $t = strtolower(str_replace("`", '', $r[2]));
if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t;
}
} }
return array('field' => $fields, 'key' => $keys); return array('field' => $fields, 'key' => $keys);
} }
......
...@@ -569,7 +569,8 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array()) ...@@ -569,7 +569,8 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array())
list($dnom,$ddesc) = $depart; list($dnom,$ddesc) = $depart;
list($anom,$adesc) = $arrivee; list($anom,$adesc) = $arrivee;
$prim = $ddesc['key']['PRIMARY KEY']; $prim = $ddesc['key']['PRIMARY KEY'];
$v = array_intersect($prim ? array($prim): $ddesc['key'], $adesc['key']); # spip_log("ccj $dnom $prim");
$v = array_intersect($prim ? split(',',$prim): $ddesc['key'], $adesc['key']);
if ($v) if ($v)
return array(array($dnom, $anom, array_shift($v))); return array(array($dnom, $anom, array_shift($v)));
else { else {
...@@ -578,6 +579,7 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array()) ...@@ -578,6 +579,7 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array())
if ($v && (!in_array($v,$vu)) && if ($v && (!in_array($v,$vu)) &&
($j = trouver_def_table($v, $boucle))) { ($j = trouver_def_table($v, $boucle))) {
list($table,$join) = $j; list($table,$join) = $j;
# spip_log(" trouver $table " . join(",",$join['key']));
$milieu = array_intersect($ddesc['key'], trouver_cles_table($join['key'])); $milieu = array_intersect($ddesc['key'], trouver_cles_table($join['key']));
foreach ($milieu as $k) foreach ($milieu as $k)
{ {
...@@ -604,8 +606,9 @@ function trouver_cles_table($keys) ...@@ -604,8 +606,9 @@ function trouver_cles_table($keys)
if (!strpos($v,",")) if (!strpos($v,","))
$res[$v]=1; $res[$v]=1;
else { else {
foreach (split(" *, *", $v) as $k) foreach (split(" *, *", $v) as $k) {
$res[$k]=1; $res[$k]=1;
}
} }
} }
return array_keys($res); return array_keys($res);
......
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