From 4f7d202362ad57974360d3c535c2d06803ca83db Mon Sep 17 00:00:00 2001 From: Fil <fil@rezo.net> Date: Fri, 11 Apr 2008 20:30:42 +0000 Subject: [PATCH] gerer les boucles sur les vues MySQL (mortimer) exemple : create view v AS SELECT a.titre,a.id_article,b.id_rubrique,b.titre AS titre_rub FROM spip_articles AS a LEFT JOIN spip_rubriques AS b ON (a.id_rubrique=b.id_rubrique); <BOUCLE_n(V)> <div>#TITRE/#TITRE_RUB</div> </BOUCLE_n> --- ecrire/req/mysql.php | 64 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php index 5c7bf8295c..25fbf33995 100644 --- a/ecrire/req/mysql.php +++ b/ecrire/req/mysql.php @@ -377,6 +377,9 @@ function spip_mysql_repair($table, $serveur='',$requeter=true) return spip_mysql_query("REPAIR TABLE $table", $serveur, $requeter); } +// Recupere la definition d'une table ou d'une vue MySQL +// colonnes, indexes, etc. +// au meme format que la definition des tables de SPIP // http://doc.spip.org/@spip_mysql_showtable function spip_mysql_showtable($nom_table, $serveur='',$requeter=true) { @@ -384,34 +387,67 @@ function spip_mysql_showtable($nom_table, $serveur='',$requeter=true) if (!$a) return ""; if (!$requeter) return $a; if (!mysql_fetch_array($a)) return ""; - list(,$a) = mysql_fetch_array(spip_mysql_query("SHOW CREATE TABLE $nom_table", $serveur),MYSQL_NUM); - if (!preg_match("/^[^(),]*\((([^()]*\([^()]*\)[^()]*)*)\)[^()]*$/", $a, $r)) - return ""; - else { + + $mysqlres = spip_mysql_query("SHOW CREATE TABLE $nom_table", $serveur); + if($mysqlres) { + list(,$a) = mysql_fetch_array($mysqlres ,MYSQL_NUM); + if (preg_match("/^[^(),]*\((([^()]*\([^()]*\)[^()]*)*)\)[^()]*$/", $a, $r)) { $dec = $r[1]; if (preg_match("/^(.*?),([^,]*KEY.*)$/s", $dec, $r)) { - $namedkeys = $r[2]; - $dec = $r[1]; + $namedkeys = $r[2]; + $dec = $r[1]; } else - $namedkeys = ""; + $namedkeys = ""; $fields = array(); foreach(preg_split("/,\s*`/",$dec) as $v) { - preg_match("/^\s*`?([^`]*)`\s*(.*)/",$v,$r); - $fields[strtolower($r[1])] = $r[2]; + preg_match("/^\s*`?([^`]*)`\s*(.*)/",$v,$r); + $fields[strtolower($r[1])] = $r[2]; } $keys = array(); foreach(preg_split('/\)\s*,?/',$namedkeys) as $v) { - if (preg_match("/^\s*([^(]*)\((.*)$/",$v,$r)) { - $k = str_replace("`", '', trim($r[1])); - $t = strtolower(str_replace("`", '', $r[2])); - if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t; - } + if (preg_match("/^\s*([^(]*)\((.*)$/",$v,$r)) { + $k = str_replace("`", '', trim($r[1])); + $t = strtolower(str_replace("`", '', $r[2])); + if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t; + } } + spip_mysql_free($mysqlres); return array('field' => $fields, 'key' => $keys); + } + } + $res = spip_mysql_query("SHOW COLUMNS FROM $nom_table", $serveur, $requeter); + if($res) { + $nfields = array(); + $nkeys = array(); + while($val = spip_mysql_fetch($res)) { + $nfields[$val["Field"]] = $val['Type']; + if($val['Null']=='NO') { + $nfields[$val["Field"]] .= ' NOT NULL'; + } + if($val['Default'] === '0' || $val['Default']) { + if(preg_match('/[A-Z_]/',$val['Default'])) { + $nfields[$val["Field"]] .= ' DEFAULT '.$val['Default']; + } else { + $nfields[$val["Field"]] .= " DEFAULT '".$val['Default']."'"; + } + } + if($val['Extra']) + $nfields[$val["Field"]] .= ' '.$val['Extra']; + if($val['Key'] == 'PRI') { + $nkeys['PRIMARY'] = $val["Field"]; + } else if($val['Key'] == 'MUL') { + $nkeys['KEY '.$val["Field"]] = $val["Field"]; + } else if($val['Key'] == 'UNI') { + $nkeys['UNIQUE KEY '.$val["Field"]] = $val["Field"]; + } + } + spip_mysql_free($res); + return array('field' => $nfields, 'key' => $nkeys); } + return ""; } // -- GitLab