From 80529f321a58472afb68dbe369b32e72ef63d357 Mon Sep 17 00:00:00 2001 From: Matthieu Marcillaud <marcimat@rezo.net> Date: Fri, 11 Apr 2008 22:29:43 +0000 Subject: [PATCH] - pouvoir lire les vues aussi avec SQLite (2 et 3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Attention, il faut que les vues soient créées avec des champs nommés explicitement, sinon SQlite ne peut pas les relire avec : SELECT titre FROM vue Il faut donc, pour l'exemple de Fil, utiliser cette requete pour fonctionner avec sqlite : CREATE VIEW vue AS SELECT a.titre AS titre,a.id_article AS id_article,b.id_rubrique AS 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_v(vue)>#TITRE </BOUCLE_v> ---- Par ailleurs, un plantage est présent en sqlite3 si l'on fait un sql_query() de la requete précédente de creation de la vue; elle est bien executée, mais à cause d'un hack pour retrouver les bons comptes (sql_count) des requetes selects, il y a un clash juste derrière. A corriger donc une nouvelle fois : cette requete n'est pas un select ! --- ecrire/req/sqlite_generique.php | 71 ++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php index 41452de4f4..6b7a7cdb07 100644 --- a/ecrire/req/sqlite_generique.php +++ b/ecrire/req/sqlite_generique.php @@ -638,6 +638,7 @@ function spip_sqlite_replace_multi($table, $tab_couples, $desc=array(), $serveur // http://doc.spip.org/@spip_sqlite_select function spip_sqlite_select($select, $from, $where='', $groupby='', $orderby='', $limit='', $having='', $serveur='',$requeter=true) { + // version() n'est pas connu de sqlite $select = str_replace('version()', 'sqlite_version()',$select); @@ -712,7 +713,7 @@ function spip_sqlite_showbase($match, $serveur='',$requeter=true){ function spip_sqlite_showtable($nom_table, $serveur='',$requeter=true){ $query = - 'SELECT sql FROM' + 'SELECT sql, type FROM' . ' (SELECT * FROM sqlite_master UNION ALL' . ' SELECT * FROM sqlite_temp_master)' . " WHERE tbl_name LIKE '$nom_table'" @@ -723,38 +724,54 @@ function spip_sqlite_showtable($nom_table, $serveur='',$requeter=true){ if (!$a) return ""; if (!$requeter) return $a; if (!($a = spip_sqlite_fetch($a, null, $serveur))) return ""; - $a = array_shift($a); - if (!preg_match("/^[^(),]*\((([^()]*(\([^()]*\))?[^()]*)*)\)[^()]*$/", $a, $r)) - return ""; - else { - $dec = $r[1]; - if (preg_match("/^(.*?),([^,]*KEY.*)$/s", $dec, $r)) { - $namedkeys = $r[2]; + $vue = ($a['type'] == 'view'); // table | vue + + // c'est une table + // il faut parser le create + if (!$vue) { + if (!preg_match("/^[^(),]*\((([^()]*(\([^()]*\))?[^()]*)*)\)[^()]*$/", array_shift($a), $r)) + return ""; + else { $dec = $r[1]; - } - else - $namedkeys = ""; + if (preg_match("/^(.*?),([^,]*KEY.*)$/s", $dec, $r)) { + $namedkeys = $r[2]; + $dec = $r[1]; + } + else + $namedkeys = ""; - $fields = array(); - foreach (explode(",",$dec) as $v) { - preg_match("/^\s*([^\s]+)\s+(.*)/",$v,$r); - $fields[strtolower($r[1])] = $r[2]; - } - $keys = array(); + $fields = array(); + foreach (explode(",",$dec) as $v) { + preg_match("/^\s*([^\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; + 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; + } } } - /* - * me demande si les cles servent au compilateur de spip - * car vu que sqlite le gere pas, je sais pas ce que ca donne ... - */ - return array('field' => $fields, 'key' => $keys); + // c'est une vue, on liste les champs disponibles simplement + } else { + if ($res = sql_fetsel('*',$nom_table,'','','','1','',$serveur)){ // limit 1 + $fields = array(); + foreach($res as $c=>$v) $fields[$c]=''; + $keys = array(); + } else { + return ""; + } } + + /* + * me demande si les cles servent au compilateur de spip + * car vu que sqlite le gere pas, je sais pas ce que ca donne ... + */ + return array('field' => $fields, 'key' => $keys); + } -- GitLab