[SPIP] v3.2.7-->v3.2.9
[lhc/web/www.git] / www / ecrire / req / sqlite_generique.php
index 7840615..64f5016 100644 (file)
@@ -3,7 +3,7 @@
 /* *************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2017                                                *
+ *  Copyright (c) 2001-2019                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -284,7 +284,7 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true) {
                                if (!_sqlite_modifier_table(
                                        $table,
                                        array($colonne_origine => ""),
-                                       '',
+                                       array(),
                                        $serveur)
                                ) {
                                        return false;
@@ -336,7 +336,7 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true) {
                                        // artillerie lourde pour sqlite2 !
                                } else {
                                        $table_dest = trim(substr($do, 9));
-                                       if (!_sqlite_modifier_table(array($table => $table_dest), '', '', $serveur)) {
+                                       if (!_sqlite_modifier_table(array($table => $table_dest), '', array(), $serveur)) {
                                                spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
 
                                                return false;
@@ -1826,8 +1826,10 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true) {
                                }
                                $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
 
-                               # rustine pour DECIMAL(10,2)
-                               if (false !== strpos($k, ')')) {
+                               // rustine pour DECIMAL(10,2)
+                               // s'il y a une parenthèse fermante dans la clé
+                               // ou dans la définition sans qu'il n'y ait une ouverture avant
+                               if (false !== strpos($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
                                        $fields[$k_precedent] .= ',' . $k . ' ' . $def;
                                        continue;
                                }
@@ -2631,17 +2633,20 @@ function _sqlite_requete_create(
        // il faut passer par des create index
        // Il gere par contre primary key !
        // Soit la PK est definie dans les cles, soit dans un champs
-       $c = ""; // le champ de cle primaire
-       if (!isset($cles[$pk = "PRIMARY KEY"]) or !$c = $cles[$pk]) {
-               foreach ($champs as $k => $v) {
-                       if (false !== stripos($v, $pk)) {
-                               $c = $k;
-                               // on n'en a plus besoin dans field, vu que defini dans key
-                               $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
-                               break;
-                       }
+       // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
+       $pk = "PRIMARY KEY";
+       // le champ de cle primaire
+       $c = !empty($cles[$pk]) ? $cles[$pk] : '';
+
+       foreach ($champs as $k => $v) {
+               if (false !== stripos($v, $pk)) {
+                       $c = $k;
+                       // on n'en a plus besoin dans field, vu que defini dans key
+                       $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
+                       break;
                }
        }
+
        if ($c) {
                $keys = "\n\t\t$pk ($c)";
        }
@@ -2671,7 +2676,7 @@ function _sqlite_requete_create(
                        $ifnotexists = ' IF NOT EXISTS';
                } else {
                        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
-                       $a = spip_sqlite_showtable($table, $serveur);
+                       $a = spip_sqlite_showtable($nom, $serveur);
                        if (isset($a['key']['KEY ' . $nom])) {
                                return true;
                        }
@@ -2720,9 +2725,10 @@ function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur
                // mais ceux-ci ne sont pas utilises dans le core
                $tables[$table] = array();
 
+               $now = _sqlite_func_now();
                foreach ($desc['field'] as $k => $v) {
                        if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
-                               $tables[$table][$k] = "datetime('now')";
+                               $tables[$table][$k] = _sqlite_calculer_cite($now, $v);
                        }
                }
        }