[SPIP] ~v3.0.17-->v3.0.19
[ptitvelo/web/www.git] / www / ecrire / req / sqlite_generique.php
index f596141..cc5196b 100644 (file)
@@ -3,7 +3,7 @@
 /* *************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2012                                                *
+ *  Copyright (c) 2001-2014                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -512,12 +512,15 @@ function spip_sqlite_create_index($nom, $table, $champs, $unique='', $serveur =
        }
 
        $ifnotexists = "";
-       if (_sqlite_is_version(2, '', $serveur)){
-               /* simuler le IF EXISTS - version 2 */
+       $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version",$serveur),'',$serveur);
+       if (!function_exists('spip_version_compare')) include_spip('plugins/installer');
+
+       if ($version AND spip_version_compare($version['sqlite_version'],'3.3.0','>=')) {
+               $ifnotexists = ' IF NOT EXISTS';
+       } else {
+               /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
                $a = spip_sqlite_showtable($table, $serveur);
                if (isset($a['key']['KEY '.$nom])) return true;
-       } else {
-               $ifnotexists = ' IF NOT EXISTS';
        }
 
        $query = "CREATE ".($unique?"UNIQUE ":"")."INDEX$ifnotexists $nom ON $table (".join(',', $champs).")";
@@ -1206,7 +1209,7 @@ function spip_sqlite_showbase($match, $serveur = '', $requeter = true){
        return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP "._q($match), $serveur, $requeter);
 }
 
-
+define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
 // http://doc.spip.org/@spip_sqlite_showtable
 function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){
        $query =
@@ -1226,13 +1229,13 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){
        // c'est une table
        // il faut parser le create
        if (!$vue){
-               if (!preg_match("/^[^(),]*\((([^()]*(\([^()]*\))?[^()]*)*)\)[^()]*$/", array_shift($a), $r))
+               if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)){
                        return "";
-               else {
+               else {
                        $desc = $r[1];
                        // extraction d'une KEY éventuelle en prenant garde de ne pas
                        // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
-                       if (preg_match("/^(.*?),([^,]*KEY[ (].*)$/s", $desc, $r)){
+                       if (preg_match("/^(.*?),([^,]*\sKEY[ (].*)$/s", $desc, $r)){
                                $namedkeys = $r[2];
                                $desc = $r[1];
                        }
@@ -1279,8 +1282,8 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){
                                }
                        }
                        // key inclues dans la requete
-                       foreach (preg_split('/\)\s*,?/', $namedkeys) as $v){
-                               if (preg_match("/^\s*([^(]*)\((.*)$/", $v, $r)){
+                       foreach(preg_split('/\)\s*(,|$)/',$namedkeys) as $v) {
+                               if (preg_match("/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/",$v,$r)) {
                                        $k = str_replace("`", '', trim($r[1]));
                                        $t = trim(strtolower(str_replace("`", '', $r[2])), '"');
                                        if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t;
@@ -1301,8 +1304,9 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){
                                $keys['KEY '.$key] = $colonnes;
                        }
                }
-               // c'est une vue, on liste les champs disponibles simplement
-       } else {
+       }
+       // 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] = '';
@@ -1957,15 +1961,18 @@ function _sqlite_requete_create($nom, $champs, $cles, $autoinc = false, $tempora
 
        $ifnotexists = "";
        if ($_ifnotexists){
-               // simuler le IF NOT EXISTS - version 2 
-               if (_sqlite_is_version(2, '', $serveur)){
-                       $a = spip_sqlite_showtable($nom, $serveur);
-                       if ($a) return false;
-               }
-                       // sinon l'ajouter en version 3
-               else {
+
+               $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version",$serveur),'',$serveur);
+               if (!function_exists('spip_version_compare')) include_spip('plugins/installer');
+
+               if ($version AND spip_version_compare($version['sqlite_version'],'3.3.0','>=')) {
                        $ifnotexists = ' IF NOT EXISTS';
+               } else {
+                       /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
+                       $a = spip_sqlite_showtable($table, $serveur);
+                       if (isset($a['key']['KEY '.$nom])) return true;
                }
+
        }
 
        $temporary = $temporary ? ' TEMPORARY' : '';
@@ -2273,6 +2280,11 @@ class sqlite_traducteur {
                        $this->query = str_replace('LEFT(','_LEFT(',$this->query);
                }
 
+               if (strpos($this->query, 'TIMESTAMPDIFF(')!==false){
+                       $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims',"TIMESTAMPDIFF('\\1',",$this->query);
+               }
+
+
                // Correction Using
                // USING (non reconnu en sqlite2)
                // problematique car la jointure ne se fait pas du coup.