Completed
Push — master ( 579209...5b53e6 )
by cam
01:04
created
ecrire/src/Compilateur/Noeud/Champ.php 1 patch
Indentation   +98 added lines, -98 removed lines patch added patch discarded remove patch
@@ -7,102 +7,102 @@
 block discarded – undo
7 7
  */
8 8
 class Champ
9 9
 {
10
-	/** Type de noeud */
11
-	public string $type = 'champ';
12
-
13
-	/** Nom du champ demandé. Exemple 'ID_ARTICLE' */
14
-	public ?string $nom_champ;
15
-
16
-	/** Identifiant de la boucle parente si explicité */
17
-	public ?string $nom_boucle = '';
18
-
19
-	/**
20
-	 * Partie optionnelle avant
21
-	 *
22
-	 * @var null|string|array
23
-	 */
24
-	public $avant;
25
-
26
-	/**
27
-	 * Partie optionnelle après
28
-	 *
29
-	 * @var null|string|array
30
-	 */
31
-	public $apres;
32
-
33
-	/**
34
-	 * Étoiles : annuler des automatismes
35
-	 *
36
-	 * - '*' annule les filtres automatiques
37
-	 * - '**' annule en plus les protections de scripts
38
-	 */
39
-	public ?string $etoile;
40
-
41
-	/**
42
-	 * Arguments et filtres explicites sur la balise
43
-	 *
44
-	 * - $param[0] contient les arguments de la balise
45
-	 * - $param[1..n] contient les filtres à appliquer à la balise
46
-	 *
47
-	 * FIXME: type unique.
48
-	 * @var false|array
49
-	 *     - false: erreur de syntaxe
50
-	 */
51
-	public $param = [];
52
-
53
-	/** Source des filtres (compatibilité) (?) */
54
-	public array $fonctions = [];
55
-
56
-	/**
57
-	 * Identifiant de la boucle
58
-	 *
59
-	 * @var string
60
-	 */
61
-	public $id_boucle = '';
62
-
63
-	/**
64
-	 * AST du squelette, liste de toutes les boucles
65
-	 *
66
-	 * @var Boucle[]
67
-	 */
68
-	public array $boucles;
69
-
70
-	/** Alias de table d'application de la requête ou nom complet de la table SQL */
71
-	public ?string $type_requete;
72
-
73
-	/** Résultat de la compilation: toujours une expression PHP */
74
-	public string $code = '';
75
-
76
-	/**
77
-	 * Interdire les scripts
78
-	 *
79
-	 * false si on est sûr de cette balise
80
-	 *
81
-	 * @see interdire_scripts()
82
-	 */
83
-	public bool $interdire_scripts = true;
84
-
85
-	/**
86
-	 * Description du squelette
87
-	 *
88
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
89
-	 *
90
-	 * Peut contenir les index :
91
-	 *
92
-	 * - nom : Nom du fichier de cache
93
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
94
-	 * - sourcefile : Chemin du squelette
95
-	 * - squelette : Code du squelette
96
-	 * - id_mere : Identifiant de la boucle parente
97
-	 * - documents : Pour embed et img dans les textes
98
-	 * - session : Pour un cache sessionné par auteur
99
-	 * - niv : Niveau de tabulation
100
-	 */
101
-	public array $descr = [];
102
-
103
-	/** Numéro de ligne dans le code source du squelette*/
104
-	public int $ligne = 0;
105
-
106
-	/** Drapeau pour reperer les balises calculées par une fonction explicite */
107
-	public bool $balise_calculee = false;
10
+    /** Type de noeud */
11
+    public string $type = 'champ';
12
+
13
+    /** Nom du champ demandé. Exemple 'ID_ARTICLE' */
14
+    public ?string $nom_champ;
15
+
16
+    /** Identifiant de la boucle parente si explicité */
17
+    public ?string $nom_boucle = '';
18
+
19
+    /**
20
+     * Partie optionnelle avant
21
+     *
22
+     * @var null|string|array
23
+     */
24
+    public $avant;
25
+
26
+    /**
27
+     * Partie optionnelle après
28
+     *
29
+     * @var null|string|array
30
+     */
31
+    public $apres;
32
+
33
+    /**
34
+     * Étoiles : annuler des automatismes
35
+     *
36
+     * - '*' annule les filtres automatiques
37
+     * - '**' annule en plus les protections de scripts
38
+     */
39
+    public ?string $etoile;
40
+
41
+    /**
42
+     * Arguments et filtres explicites sur la balise
43
+     *
44
+     * - $param[0] contient les arguments de la balise
45
+     * - $param[1..n] contient les filtres à appliquer à la balise
46
+     *
47
+     * FIXME: type unique.
48
+     * @var false|array
49
+     *     - false: erreur de syntaxe
50
+     */
51
+    public $param = [];
52
+
53
+    /** Source des filtres (compatibilité) (?) */
54
+    public array $fonctions = [];
55
+
56
+    /**
57
+     * Identifiant de la boucle
58
+     *
59
+     * @var string
60
+     */
61
+    public $id_boucle = '';
62
+
63
+    /**
64
+     * AST du squelette, liste de toutes les boucles
65
+     *
66
+     * @var Boucle[]
67
+     */
68
+    public array $boucles;
69
+
70
+    /** Alias de table d'application de la requête ou nom complet de la table SQL */
71
+    public ?string $type_requete;
72
+
73
+    /** Résultat de la compilation: toujours une expression PHP */
74
+    public string $code = '';
75
+
76
+    /**
77
+     * Interdire les scripts
78
+     *
79
+     * false si on est sûr de cette balise
80
+     *
81
+     * @see interdire_scripts()
82
+     */
83
+    public bool $interdire_scripts = true;
84
+
85
+    /**
86
+     * Description du squelette
87
+     *
88
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
89
+     *
90
+     * Peut contenir les index :
91
+     *
92
+     * - nom : Nom du fichier de cache
93
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
94
+     * - sourcefile : Chemin du squelette
95
+     * - squelette : Code du squelette
96
+     * - id_mere : Identifiant de la boucle parente
97
+     * - documents : Pour embed et img dans les textes
98
+     * - session : Pour un cache sessionné par auteur
99
+     * - niv : Niveau de tabulation
100
+     */
101
+    public array $descr = [];
102
+
103
+    /** Numéro de ligne dans le code source du squelette*/
104
+    public int $ligne = 0;
105
+
106
+    /** Drapeau pour reperer les balises calculées par une fonction explicite */
107
+    public bool $balise_calculee = false;
108 108
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Polyglotte.php 1 patch
Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -9,16 +9,16 @@
 block discarded – undo
9 9
  **/
10 10
 class Polyglotte
11 11
 {
12
-	/** Type de noeud */
13
-	public string $type = 'polyglotte';
12
+    /** Type de noeud */
13
+    public string $type = 'polyglotte';
14 14
 
15
-	/**
16
-	 * Tableau des traductions possibles classées par langue
17
-	 *
18
-	 * Tableau code de langue => texte
19
-	 */
20
-	public array $traductions = [];
15
+    /**
16
+     * Tableau des traductions possibles classées par langue
17
+     *
18
+     * Tableau code de langue => texte
19
+     */
20
+    public array $traductions = [];
21 21
 
22
-	/** Numéro de ligne dans le code source du squelette */
23
-	public int $ligne = 0;
22
+    /** Numéro de ligne dans le code source du squelette */
23
+    public int $ligne = 0;
24 24
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Contexte.php 1 patch
Indentation   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -14,33 +14,33 @@
 block discarded – undo
14 14
  */
15 15
 class Contexte
16 16
 {
17
-	/**
18
-	 * Description du squelette
19
-	 *
20
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
21
-	 *
22
-	 * Peut contenir les index :
23
-	 *
24
-	 * - nom : Nom du fichier de cache
25
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
26
-	 * - sourcefile : Chemin du squelette
27
-	 * - squelette : Code du squelette
28
-	 * - id_mere : Identifiant de la boucle parente
29
-	 * - documents : Pour embed et img dans les textes
30
-	 * - session : Pour un cache sessionné par auteur
31
-	 * - niv : Niveau de tabulation
32
-	 */
33
-	public array $descr = [];
17
+    /**
18
+     * Description du squelette
19
+     *
20
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
21
+     *
22
+     * Peut contenir les index :
23
+     *
24
+     * - nom : Nom du fichier de cache
25
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
26
+     * - sourcefile : Chemin du squelette
27
+     * - squelette : Code du squelette
28
+     * - id_mere : Identifiant de la boucle parente
29
+     * - documents : Pour embed et img dans les textes
30
+     * - session : Pour un cache sessionné par auteur
31
+     * - niv : Niveau de tabulation
32
+     */
33
+    public array $descr = [];
34 34
 
35
-	/** Identifiant de la boucle */
36
-	public string $id_boucle = '';
35
+    /** Identifiant de la boucle */
36
+    public string $id_boucle = '';
37 37
 
38
-	/** Numéro de ligne dans le code source du squelette */
39
-	public int $ligne = 0;
38
+    /** Numéro de ligne dans le code source du squelette */
39
+    public int $ligne = 0;
40 40
 
41
-	/** Langue d'exécution */
42
-	public string $lang = '';
41
+    /** Langue d'exécution */
42
+    public string $lang = '';
43 43
 
44
-	/** Résultat de la compilation: toujours une expression PHP */
45
-	public string $code = '';
44
+    /** Résultat de la compilation: toujours une expression PHP */
45
+    public string $code = '';
46 46
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Noeud/Idiome.php 1 patch
Indentation   +81 added lines, -81 removed lines patch added patch discarded remove patch
@@ -7,85 +7,85 @@
 block discarded – undo
7 7
  **/
8 8
 class Idiome
9 9
 {
10
-	/** Type de noeud */
11
-	public string $type = 'idiome';
12
-
13
-	/** Clé de traduction demandée. Exemple 'item_oui' */
14
-	public string $nom_champ = '';
15
-
16
-	/** Module de langue où chercher la clé de traduction. Exemple 'medias' */
17
-	public string $module = '';
18
-
19
-	/** Arguments à passer à la chaîne */
20
-	public array $arg = [];
21
-
22
-	/**
23
-	 * Filtres à appliquer au résultat
24
-	 *
25
-	 *
26
-	 * * FIXME: type unique.
27
-	 * @var false|array
28
-	 *     - false: erreur de syntaxe
29
-	 */
30
-	public $param = [];
31
-
32
-	/** Source des filtres (compatibilité) (?) */
33
-	public array $fonctions = [];
34
-
35
-	/**
36
-	 * Inutilisé, propriété générique de l'AST
37
-	 *
38
-	 * @var string|array
39
-	 */
40
-	public $avant = '';
41
-
42
-	/**
43
-	 * Inutilisé, propriété générique de l'AST
44
-	 *
45
-	 * @var string|array
46
-	 */
47
-	public $apres = '';
48
-
49
-	/** Identifiant de la boucle */
50
-	public string $id_boucle = '';
51
-
52
-	/**
53
-	 * AST du squelette, liste de toutes les boucles
54
-	 *
55
-	 * @var Boucle[]
56
-	 */
57
-	public array $boucles;
58
-
59
-	/** Alias de table d'application de la requête ou nom complet de la table SQL */
60
-	public ?string $type_requete;
61
-
62
-	/** Résultat de la compilation: toujours une expression PHP */
63
-	public string $code = '';
64
-
65
-	/**
66
-	 * Interdire les scripts
67
-	 *
68
-	 * @see interdire_scripts()
69
-	 */
70
-	public bool $interdire_scripts = false;
71
-
72
-	/**
73
-	 * Description du squelette
74
-	 *
75
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
76
-	 *
77
-	 * Peut contenir les index :
78
-	 * - nom : Nom du fichier de cache
79
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
80
-	 * - sourcefile : Chemin du squelette
81
-	 * - squelette : Code du squelette
82
-	 * - id_mere : Identifiant de la boucle parente
83
-	 * - documents : Pour embed et img dans les textes
84
-	 * - session : Pour un cache sessionné par auteur
85
-	 * - niv : Niveau de tabulation
86
-	 */
87
-	public array $descr = [];
88
-
89
-	/** Numéro de ligne dans le code source du squelette */
90
-	public int $ligne = 0;
10
+    /** Type de noeud */
11
+    public string $type = 'idiome';
12
+
13
+    /** Clé de traduction demandée. Exemple 'item_oui' */
14
+    public string $nom_champ = '';
15
+
16
+    /** Module de langue où chercher la clé de traduction. Exemple 'medias' */
17
+    public string $module = '';
18
+
19
+    /** Arguments à passer à la chaîne */
20
+    public array $arg = [];
21
+
22
+    /**
23
+     * Filtres à appliquer au résultat
24
+     *
25
+     *
26
+     * * FIXME: type unique.
27
+     * @var false|array
28
+     *     - false: erreur de syntaxe
29
+     */
30
+    public $param = [];
31
+
32
+    /** Source des filtres (compatibilité) (?) */
33
+    public array $fonctions = [];
34
+
35
+    /**
36
+     * Inutilisé, propriété générique de l'AST
37
+     *
38
+     * @var string|array
39
+     */
40
+    public $avant = '';
41
+
42
+    /**
43
+     * Inutilisé, propriété générique de l'AST
44
+     *
45
+     * @var string|array
46
+     */
47
+    public $apres = '';
48
+
49
+    /** Identifiant de la boucle */
50
+    public string $id_boucle = '';
51
+
52
+    /**
53
+     * AST du squelette, liste de toutes les boucles
54
+     *
55
+     * @var Boucle[]
56
+     */
57
+    public array $boucles;
58
+
59
+    /** Alias de table d'application de la requête ou nom complet de la table SQL */
60
+    public ?string $type_requete;
61
+
62
+    /** Résultat de la compilation: toujours une expression PHP */
63
+    public string $code = '';
64
+
65
+    /**
66
+     * Interdire les scripts
67
+     *
68
+     * @see interdire_scripts()
69
+     */
70
+    public bool $interdire_scripts = false;
71
+
72
+    /**
73
+     * Description du squelette
74
+     *
75
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
76
+     *
77
+     * Peut contenir les index :
78
+     * - nom : Nom du fichier de cache
79
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
80
+     * - sourcefile : Chemin du squelette
81
+     * - squelette : Code du squelette
82
+     * - id_mere : Identifiant de la boucle parente
83
+     * - documents : Pour embed et img dans les textes
84
+     * - session : Pour un cache sessionné par auteur
85
+     * - niv : Niveau de tabulation
86
+     */
87
+    public array $descr = [];
88
+
89
+    /** Numéro de ligne dans le code source du squelette */
90
+    public int $ligne = 0;
91 91
 }
Please login to merge, or discard this patch.
ecrire/src/Admin/Bouton.php 1 patch
Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -7,57 +7,57 @@
 block discarded – undo
7 7
  * privée ou dans un de ses sous menus
8 8
  */
9 9
 class Bouton {
10
-	/** L'icone à mettre dans le bouton */
11
-	public string $icone;
12
-
13
-	/** Le nom de l'entrée d'i18n associé */
14
-	public string $libelle;
15
-
16
-	/** @var null|string L'URL de la page (null => ?exec=nom) */
17
-	public $url = null;
18
-
19
-	/** @var null|string|array Arguments supplementaires de l'URL */
20
-	public $urlArg = null;
21
-
22
-	/** @var null|string URL du javascript */
23
-	public $url2 = null;
24
-
25
-	/** @var null|string Pour ouvrir dans une fenetre a part */
26
-	public $target = null;
27
-
28
-	/** Sous-barre de boutons / onglets */
29
-	public array $sousmenu = [];
30
-
31
-	/** Position dans le menu */
32
-	public int $position = 0;
33
-
34
-	/** Entrée favorite (sa position dans les favoris) ? */
35
-	public int $favori = 0;
36
-
37
-
38
-	/**
39
-	 * Définit un bouton
40
-	 *
41
-	 * @param string $icone
42
-	 *    L'icone à mettre dans le bouton
43
-	 * @param string $libelle
44
-	 *    Le nom de l'entrée i18n associé
45
-	 * @param null|string $url
46
-	 *    L'URL de la page
47
-	 * @param null|string|array $urlArg
48
-	 *    Arguments supplémentaires de l'URL
49
-	 * @param null|string $url2
50
-	 *    URL du javascript
51
-	 * @param null|mixed $target
52
-	 *    Pour ouvrir une fenêtre à part
53
-	 */
54
-	public function __construct($icone, $libelle, $url = null, $urlArg = null, $url2 = null, $target = null) {
55
-		$this->icone = $icone;
56
-		$this->libelle = $libelle;
57
-		$this->url = $url;
58
-		$this->urlArg = $urlArg;
59
-		$this->url2 = $url2;
60
-		$this->target = $target;
61
-	}
10
+    /** L'icone à mettre dans le bouton */
11
+    public string $icone;
12
+
13
+    /** Le nom de l'entrée d'i18n associé */
14
+    public string $libelle;
15
+
16
+    /** @var null|string L'URL de la page (null => ?exec=nom) */
17
+    public $url = null;
18
+
19
+    /** @var null|string|array Arguments supplementaires de l'URL */
20
+    public $urlArg = null;
21
+
22
+    /** @var null|string URL du javascript */
23
+    public $url2 = null;
24
+
25
+    /** @var null|string Pour ouvrir dans une fenetre a part */
26
+    public $target = null;
27
+
28
+    /** Sous-barre de boutons / onglets */
29
+    public array $sousmenu = [];
30
+
31
+    /** Position dans le menu */
32
+    public int $position = 0;
33
+
34
+    /** Entrée favorite (sa position dans les favoris) ? */
35
+    public int $favori = 0;
36
+
37
+
38
+    /**
39
+     * Définit un bouton
40
+     *
41
+     * @param string $icone
42
+     *    L'icone à mettre dans le bouton
43
+     * @param string $libelle
44
+     *    Le nom de l'entrée i18n associé
45
+     * @param null|string $url
46
+     *    L'URL de la page
47
+     * @param null|string|array $urlArg
48
+     *    Arguments supplémentaires de l'URL
49
+     * @param null|string $url2
50
+     *    URL du javascript
51
+     * @param null|mixed $target
52
+     *    Pour ouvrir une fenêtre à part
53
+     */
54
+    public function __construct($icone, $libelle, $url = null, $urlArg = null, $url2 = null, $target = null) {
55
+        $this->icone = $icone;
56
+        $this->libelle = $libelle;
57
+        $this->url = $url;
58
+        $this->urlArg = $urlArg;
59
+        $this->url2 = $url2;
60
+        $this->target = $target;
61
+    }
62 62
 }
63 63
 
Please login to merge, or discard this patch.
ecrire/src/I18n/Description.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -3,16 +3,16 @@
 block discarded – undo
3 3
 namespace Spip\I18n;
4 4
 
5 5
 class Description {
6
-	/** @var string code de langue (hors module) */
7
-	public $code;
8
-	/** @var string nom du module de langue */
9
-	public $module;
10
-	/** @var string langue de la traduction */
11
-	public $langue;
12
-	/** @var string traduction */
13
-	public $texte;
14
-	/** @var string var mode particulier appliqué ? */
15
-	public $mode;
16
-	/** @var bool Corrections des textes appliqué ? */
17
-	public $corrections = false;
6
+    /** @var string code de langue (hors module) */
7
+    public $code;
8
+    /** @var string nom du module de langue */
9
+    public $module;
10
+    /** @var string langue de la traduction */
11
+    public $langue;
12
+    /** @var string traduction */
13
+    public $texte;
14
+    /** @var string var mode particulier appliqué ? */
15
+    public $mode;
16
+    /** @var bool Corrections des textes appliqué ? */
17
+    public $corrections = false;
18 18
 }
Please login to merge, or discard this patch.
ecrire/src/Compilateur/Iterateur/Factory.php 2 patches
Indentation   +53 added lines, -53 removed lines patch added patch discarded remove patch
@@ -12,60 +12,60 @@
 block discarded – undo
12 12
  */
13 13
 class Factory
14 14
 {
15
-	public static function create($iterateur, $command, $info = null) {
16
-		$iter = null;
17
-		// cas des SI {si expression} analises tres tot
18
-		// pour eviter le chargement de tout iterateur
19
-		if (isset($command['si'])) {
20
-			foreach ($command['si'] as $si) {
21
-				if (!$si) {
22
-					// $command pour boucle SQL peut generer des erreurs de compilation
23
-					// s'il est transmis alors qu'on est dans un iterateur vide
24
-					return new Decorator(new EmptyIterator(), [], $info);
25
-				}
26
-			}
27
-		}
15
+    public static function create($iterateur, $command, $info = null) {
16
+        $iter = null;
17
+        // cas des SI {si expression} analises tres tot
18
+        // pour eviter le chargement de tout iterateur
19
+        if (isset($command['si'])) {
20
+            foreach ($command['si'] as $si) {
21
+                if (!$si) {
22
+                    // $command pour boucle SQL peut generer des erreurs de compilation
23
+                    // s'il est transmis alors qu'on est dans un iterateur vide
24
+                    return new Decorator(new EmptyIterator(), [], $info);
25
+                }
26
+            }
27
+        }
28 28
 
29
-		// chercher un iterateur PHP existant (par exemple dans SPL)
30
-		// (il faudrait passer l'argument ->sql_serveur
31
-		// pour etre certain qu'on est sur un "php:")
32
-		if (class_exists($iterateur)) {
33
-			$a = $command['args'] ?? [];
29
+        // chercher un iterateur PHP existant (par exemple dans SPL)
30
+        // (il faudrait passer l'argument ->sql_serveur
31
+        // pour etre certain qu'on est sur un "php:")
32
+        if (class_exists($iterateur)) {
33
+            $a = $command['args'] ?? [];
34 34
 
35
-			// permettre de passer un Iterateur directement {args #ITERATEUR} :
36
-			// si on recoit deja un iterateur en argument, on l'utilise
37
-			if ((is_countable($a) ? count($a) : 0) == 1 and is_object($a[0]) and is_subclass_of($a[0], \Iterator::class)) {
38
-				$iter = $a[0];
39
-			} else {
40
-				// sinon, on cree un iterateur du type donne
41
-				// arguments de creation de l'iterateur...
42
-				try {
43
-					$iter = $iterateur(...$a);
44
-				} catch (Exception $e) {
45
-					spip_log("Erreur de chargement de l'iterateur {$iterateur}");
46
-					spip_log($e->getMessage());
47
-					$iter = new EmptyIterator();
48
-				}
49
-			}
50
-		} else {
51
-			// chercher la classe d'iterateur Iterateur/XXX
52
-			// definie dans le fichier src/Compilateur/Iterateur/xxx.php
53
-			// FIXME: déclarer quelque part les iterateurs supplémentaires
54
-			$class = __NAMESPACE__ . '\\' . ucfirst(strtolower($iterateur));
55
-			if (!class_exists($class)) {
56
-				// historique
57
-				// Chercher IterateurXXX
58
-				include_spip('iterateur/' . $iterateur);
59
-				$class = 'Iterateur' . $iterateur;
60
-				if (!class_exists($class)) {
61
-					exit("Iterateur {$iterateur} non trouvé");
62
-					// si l'iterateur n'existe pas, on se rabat sur le generique
63
-					// $iter = new EmptyIterator();
64
-				}
65
-			}
66
-			$iter = new $class($command, $info);
67
-		}
35
+            // permettre de passer un Iterateur directement {args #ITERATEUR} :
36
+            // si on recoit deja un iterateur en argument, on l'utilise
37
+            if ((is_countable($a) ? count($a) : 0) == 1 and is_object($a[0]) and is_subclass_of($a[0], \Iterator::class)) {
38
+                $iter = $a[0];
39
+            } else {
40
+                // sinon, on cree un iterateur du type donne
41
+                // arguments de creation de l'iterateur...
42
+                try {
43
+                    $iter = $iterateur(...$a);
44
+                } catch (Exception $e) {
45
+                    spip_log("Erreur de chargement de l'iterateur {$iterateur}");
46
+                    spip_log($e->getMessage());
47
+                    $iter = new EmptyIterator();
48
+                }
49
+            }
50
+        } else {
51
+            // chercher la classe d'iterateur Iterateur/XXX
52
+            // definie dans le fichier src/Compilateur/Iterateur/xxx.php
53
+            // FIXME: déclarer quelque part les iterateurs supplémentaires
54
+            $class = __NAMESPACE__ . '\\' . ucfirst(strtolower($iterateur));
55
+            if (!class_exists($class)) {
56
+                // historique
57
+                // Chercher IterateurXXX
58
+                include_spip('iterateur/' . $iterateur);
59
+                $class = 'Iterateur' . $iterateur;
60
+                if (!class_exists($class)) {
61
+                    exit("Iterateur {$iterateur} non trouvé");
62
+                    // si l'iterateur n'existe pas, on se rabat sur le generique
63
+                    // $iter = new EmptyIterator();
64
+                }
65
+            }
66
+            $iter = new $class($command, $info);
67
+        }
68 68
 
69
-		return new Decorator($iter, $command, $info);
70
-	}
69
+        return new Decorator($iter, $command, $info);
70
+    }
71 71
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -51,12 +51,12 @@
 block discarded – undo
51 51
 			// chercher la classe d'iterateur Iterateur/XXX
52 52
 			// definie dans le fichier src/Compilateur/Iterateur/xxx.php
53 53
 			// FIXME: déclarer quelque part les iterateurs supplémentaires
54
-			$class = __NAMESPACE__ . '\\' . ucfirst(strtolower($iterateur));
54
+			$class = __NAMESPACE__.'\\'.ucfirst(strtolower($iterateur));
55 55
 			if (!class_exists($class)) {
56 56
 				// historique
57 57
 				// Chercher IterateurXXX
58
-				include_spip('iterateur/' . $iterateur);
59
-				$class = 'Iterateur' . $iterateur;
58
+				include_spip('iterateur/'.$iterateur);
59
+				$class = 'Iterateur'.$iterateur;
60 60
 				if (!class_exists($class)) {
61 61
 					exit("Iterateur {$iterateur} non trouvé");
62 62
 					// si l'iterateur n'existe pas, on se rabat sur le generique
Please login to merge, or discard this patch.
ecrire/inc/presentation_mini.php 2 patches
Indentation   +136 added lines, -136 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Affichage
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -25,7 +25,7 @@  discard block
 block discarded – undo
25 25
  * @return string Code HTML
26 26
  */
27 27
 function debut_grand_cadre() {
28
- return "\n<div class = 'table_page'>\n";
28
+    return "\n<div class = 'table_page'>\n";
29 29
 }
30 30
 
31 31
 /**
@@ -34,7 +34,7 @@  discard block
 block discarded – undo
34 34
  * @return string Code HTML
35 35
  */
36 36
 function fin_grand_cadre() {
37
- return "\n</div>";
37
+    return "\n</div>";
38 38
 }
39 39
 
40 40
 // Debut de la colonne de gauche
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
  * @return string Code HTML
50 50
  */
51 51
 function debut_gauche() {
52
-	return "<div id = 'conteneur' class = ''>\n<div id = 'navigation' class = 'lat' role = 'contentinfo'>\n";
52
+    return "<div id = 'conteneur' class = ''>\n<div id = 'navigation' class = 'lat' role = 'contentinfo'>\n";
53 53
 }
54 54
 
55 55
 /**
@@ -58,7 +58,7 @@  discard block
 block discarded – undo
58 58
  * @return string Code HTML
59 59
  */
60 60
 function fin_gauche() {
61
- return "</div></div><br class = 'nettoyeur' />";
61
+    return "</div></div><br class = 'nettoyeur' />";
62 62
 }
63 63
 
64 64
 /**
@@ -67,13 +67,13 @@  discard block
 block discarded – undo
67 67
  * @return string Code HTML
68 68
  */
69 69
 function creer_colonne_droite() {
70
-	static $deja_colonne_droite;
71
-	if ($deja_colonne_droite) {
72
-		return '';
73
-	}
74
-	$deja_colonne_droite = true;
70
+    static $deja_colonne_droite;
71
+    if ($deja_colonne_droite) {
72
+        return '';
73
+    }
74
+    $deja_colonne_droite = true;
75 75
 
76
-	return "\n</div><div id='extra' class='lat' role='complementary'>";
76
+    return "\n</div><div id='extra' class='lat' role='complementary'>";
77 77
 }
78 78
 
79 79
 /**
@@ -82,10 +82,10 @@  discard block
 block discarded – undo
82 82
  * @return string Code HTML
83 83
  */
84 84
 function debut_droite() {
85
-	return liste_objets_bloques(_request('exec'))
86
-	. creer_colonne_droite()
87
-	. '</div>'
88
-	. "\n<div id='contenu'>";
85
+    return liste_objets_bloques(_request('exec'))
86
+    . creer_colonne_droite()
87
+    . '</div>'
88
+    . "\n<div id='contenu'>";
89 89
 }
90 90
 
91 91
 /**
@@ -107,32 +107,32 @@  discard block
 block discarded – undo
107 107
  *     Code HTML
108 108
  **/
109 109
 function liste_objets_bloques($exec, $contexte = [], $auteur = null): string {
110
-	$res = '';
111
-	include_spip('inc/config');
112
-	if (lire_config('articles_modif', 'non') !== 'non') {
113
-		include_spip('inc/drapeau_edition');
114
-		if (is_null($auteur)) {
115
-			$auteur = $GLOBALS['visiteur_session'];
116
-		}
117
-		if (
118
-			$en_cours = trouver_objet_exec($exec)
119
-			and $en_cours['edition']
120
-			and $type = $en_cours['type']
121
-			and ((isset($contexte[$en_cours['id_table_objet']]) and $id = $contexte[$en_cours['id_table_objet']])
122
-				or $id = _request($en_cours['id_table_objet']))
123
-		) {
124
-			// marquer le fait que l'objet est ouvert en edition par toto
125
-			// a telle date ; une alerte sera donnee aux autres redacteurs
126
-			signale_edition($id, $auteur, $type);
127
-		}
128
-
129
-		$objets_ouverts = liste_drapeau_edition($auteur['id_auteur']);
130
-		if (count($objets_ouverts)) {
131
-			$res .= recuperer_fond('prive/objets/liste/objets-en-edition', [], ['ajax' => true]);
132
-		}
133
-	}
134
-
135
-	return $res;
110
+    $res = '';
111
+    include_spip('inc/config');
112
+    if (lire_config('articles_modif', 'non') !== 'non') {
113
+        include_spip('inc/drapeau_edition');
114
+        if (is_null($auteur)) {
115
+            $auteur = $GLOBALS['visiteur_session'];
116
+        }
117
+        if (
118
+            $en_cours = trouver_objet_exec($exec)
119
+            and $en_cours['edition']
120
+            and $type = $en_cours['type']
121
+            and ((isset($contexte[$en_cours['id_table_objet']]) and $id = $contexte[$en_cours['id_table_objet']])
122
+                or $id = _request($en_cours['id_table_objet']))
123
+        ) {
124
+            // marquer le fait que l'objet est ouvert en edition par toto
125
+            // a telle date ; une alerte sera donnee aux autres redacteurs
126
+            signale_edition($id, $auteur, $type);
127
+        }
128
+
129
+        $objets_ouverts = liste_drapeau_edition($auteur['id_auteur']);
130
+        if (count($objets_ouverts)) {
131
+            $res .= recuperer_fond('prive/objets/liste/objets-en-edition', [], ['ajax' => true]);
132
+        }
133
+    }
134
+
135
+    return $res;
136 136
 }
137 137
 
138 138
 
@@ -146,20 +146,20 @@  discard block
 block discarded – undo
146 146
  * @return string Code HTML
147 147
  **/
148 148
 function fin_page() {
149
-	include_spip('inc/pipelines');
150
-	// avec &var_profile=1 on a le tableau de mesures SQL
151
-	$debug = ((_request('exec') !== 'valider_xml')
152
-		and ((_request('var_mode') == 'debug')
153
-			or (isset($GLOBALS['tableau_des_temps']) and $GLOBALS['tableau_des_temps'])
154
-			and isset($_COOKIE['spip_admin'])));
155
-	$t = '</div><div id="pied"><div class="largeur">'
156
-		. recuperer_fond('prive/squelettes/inclure/pied')
157
-		. '</div>'
158
-		. '</div></div>' // cf. div#page et div.largeur ouvertes dans conmmencer_page()
159
-		. ($debug ? erreur_squelette() : '')
160
-		. "</body></html>\n";
161
-
162
-	return f_queue($t);
149
+    include_spip('inc/pipelines');
150
+    // avec &var_profile=1 on a le tableau de mesures SQL
151
+    $debug = ((_request('exec') !== 'valider_xml')
152
+        and ((_request('var_mode') == 'debug')
153
+            or (isset($GLOBALS['tableau_des_temps']) and $GLOBALS['tableau_des_temps'])
154
+            and isset($_COOKIE['spip_admin'])));
155
+    $t = '</div><div id="pied"><div class="largeur">'
156
+        . recuperer_fond('prive/squelettes/inclure/pied')
157
+        . '</div>'
158
+        . '</div></div>' // cf. div#page et div.largeur ouvertes dans conmmencer_page()
159
+        . ($debug ? erreur_squelette() : '')
160
+        . "</body></html>\n";
161
+
162
+    return f_queue($t);
163 163
 }
164 164
 
165 165
 /**
@@ -174,22 +174,22 @@  discard block
 block discarded – undo
174 174
  * @return string Code HTML
175 175
  **/
176 176
 function html_tests_js() {
177
-	if (_SPIP_AJAX and !defined('_TESTER_NOSCRIPT')) {
178
-		// pour le pied de page (deja defini si on est validation XML)
179
-		define(
180
-			'_TESTER_NOSCRIPT',
181
-			"<noscript>\n<div style='display:none;'><img src='"
182
-			. generer_url_ecrire('test_ajax', 'js=-1')
183
-			. "' width='1' height='1' alt='' /></div></noscript>\n"
184
-		);
185
-	}
186
-
187
-	$rejouer = '';
188
-	if (defined('_SESSION_REJOUER')) {
189
-		$rejouer = (_SESSION_REJOUER === true) ? rejouer_session() : _SESSION_REJOUER;
190
-	}
191
-
192
-	return $rejouer . (defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : '');
177
+    if (_SPIP_AJAX and !defined('_TESTER_NOSCRIPT')) {
178
+        // pour le pied de page (deja defini si on est validation XML)
179
+        define(
180
+            '_TESTER_NOSCRIPT',
181
+            "<noscript>\n<div style='display:none;'><img src='"
182
+            . generer_url_ecrire('test_ajax', 'js=-1')
183
+            . "' width='1' height='1' alt='' /></div></noscript>\n"
184
+        );
185
+    }
186
+
187
+    $rejouer = '';
188
+    if (defined('_SESSION_REJOUER')) {
189
+        $rejouer = (_SESSION_REJOUER === true) ? rejouer_session() : _SESSION_REJOUER;
190
+    }
191
+
192
+    return $rejouer . (defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : '');
193 193
 }
194 194
 
195 195
 /**
@@ -199,25 +199,25 @@  discard block
 block discarded – undo
199 199
  **/
200 200
 function info_maj_spip() {
201 201
 
202
-	$maj = $GLOBALS['meta']['info_maj_spip'] ?? null;
203
-	if (!$maj) {
204
-		return '';
205
-	}
202
+    $maj = $GLOBALS['meta']['info_maj_spip'] ?? null;
203
+    if (!$maj) {
204
+        return '';
205
+    }
206 206
 
207
-	$maj = explode('|', $maj);
208
-	// c'est une ancienne notif, on a fait la maj depuis !
209
-	if ($GLOBALS['spip_version_branche'] !== reset($maj)) {
210
-		return '';
211
-	}
207
+    $maj = explode('|', $maj);
208
+    // c'est une ancienne notif, on a fait la maj depuis !
209
+    if ($GLOBALS['spip_version_branche'] !== reset($maj)) {
210
+        return '';
211
+    }
212 212
 
213
-	if (!autoriser('webmestre')) {
214
-		return '';
215
-	}
213
+    if (!autoriser('webmestre')) {
214
+        return '';
215
+    }
216 216
 
217
-	array_shift($maj);
218
-	$maj = implode('|', $maj);
217
+    array_shift($maj);
218
+    $maj = implode('|', $maj);
219 219
 
220
-	return "$maj<br />";
220
+    return "$maj<br />";
221 221
 }
222 222
 
223 223
 /**
@@ -228,43 +228,43 @@  discard block
 block discarded – undo
228 228
  **/
229 229
 function info_copyright() {
230 230
 
231
-	$version = $GLOBALS['spip_version_affichee'];
232
-
233
-	//
234
-	// Mention, le cas echeant, de la revision SVN courante
235
-	//
236
-	if ($vcs = version_vcs_courante(_DIR_RACINE, true)) {
237
-		if ($vcs['vcs'] === 'GIT') {
238
-			$url = 'https://git.spip.net/spip/spip/commit/' . $vcs['commit'];
239
-		} elseif ($vcs['vcs'] === 'SVN') {
240
-			$url = 'https://core.spip.net/projects/spip/repository/revisions/' . $vcs['commit'];
241
-		} else {
242
-			$url = '';
243
-		}
244
-		// affichage "GIT [master: abcdef]"
245
-		$commit = $vcs['commit_short'] ?? $vcs['commit'];
246
-		if ($url) {
247
-			$commit = "<a href=\"$url\" target=\"_blank\" rel=\"noopener noreferrer\">$commit</a>";
248
-		}
249
-		if ($vcs['branch']) {
250
-			$commit = $vcs['branch'] . ': ' . $commit;
251
-		}
252
-		$version .= " {$vcs['vcs']} [$commit]";
253
-	}
254
-
255
-	// et la version de l'ecran de securite
256
-	$secu = defined('_ECRAN_SECURITE')
257
-		? '<br />' . _T('ecran_securite', ['version' => _ECRAN_SECURITE])
258
-		: '';
259
-
260
-	return _T(
261
-		'info_copyright',
262
-		[
263
-			'spip' => "<b>SPIP $version</b> ",
264
-			'lien_gpl' => '<a href="https://www.gnu.org/licenses/gpl-3.0.html">' . _T('info_copyright_gpl') . '</a>'
265
-		]
266
-	)
267
-	. $secu;
231
+    $version = $GLOBALS['spip_version_affichee'];
232
+
233
+    //
234
+    // Mention, le cas echeant, de la revision SVN courante
235
+    //
236
+    if ($vcs = version_vcs_courante(_DIR_RACINE, true)) {
237
+        if ($vcs['vcs'] === 'GIT') {
238
+            $url = 'https://git.spip.net/spip/spip/commit/' . $vcs['commit'];
239
+        } elseif ($vcs['vcs'] === 'SVN') {
240
+            $url = 'https://core.spip.net/projects/spip/repository/revisions/' . $vcs['commit'];
241
+        } else {
242
+            $url = '';
243
+        }
244
+        // affichage "GIT [master: abcdef]"
245
+        $commit = $vcs['commit_short'] ?? $vcs['commit'];
246
+        if ($url) {
247
+            $commit = "<a href=\"$url\" target=\"_blank\" rel=\"noopener noreferrer\">$commit</a>";
248
+        }
249
+        if ($vcs['branch']) {
250
+            $commit = $vcs['branch'] . ': ' . $commit;
251
+        }
252
+        $version .= " {$vcs['vcs']} [$commit]";
253
+    }
254
+
255
+    // et la version de l'ecran de securite
256
+    $secu = defined('_ECRAN_SECURITE')
257
+        ? '<br />' . _T('ecran_securite', ['version' => _ECRAN_SECURITE])
258
+        : '';
259
+
260
+    return _T(
261
+        'info_copyright',
262
+        [
263
+            'spip' => "<b>SPIP $version</b> ",
264
+            'lien_gpl' => '<a href="https://www.gnu.org/licenses/gpl-3.0.html">' . _T('info_copyright_gpl') . '</a>'
265
+        ]
266
+    )
267
+    . $secu;
268 268
 }
269 269
 
270 270
 /**
@@ -279,17 +279,17 @@  discard block
 block discarded – undo
279 279
  * @return string             Code HTML
280 280
  **/
281 281
 function formulaire_recherche($page, $complement = '') {
282
-	$recherche = _request('recherche');
283
-	$recherche_aff = entites_html($recherche);
284
-	if (!strlen($recherche)) {
285
-		$recherche_aff = _T('info_rechercher');
286
-		$onfocus = " onfocus=\"this.value='';\"";
287
-	} else {
288
-		$onfocus = '';
289
-	}
290
-
291
-	$form = '<input type="text" size="10" value="' . $recherche_aff . '" name="recherche" class="recherche" accesskey="r"' . $onfocus . ' />';
292
-	$form .= "<input type='image' src='" . chemin_image('rechercher-20.png') . "' name='submit' class='submit' alt='" . _T('info_rechercher') . "' />";
293
-
294
-	return "<div class='spip_recherche'>" . generer_form_ecrire($page, $form . $complement, " method='get'") . '</div>';
282
+    $recherche = _request('recherche');
283
+    $recherche_aff = entites_html($recherche);
284
+    if (!strlen($recherche)) {
285
+        $recherche_aff = _T('info_rechercher');
286
+        $onfocus = " onfocus=\"this.value='';\"";
287
+    } else {
288
+        $onfocus = '';
289
+    }
290
+
291
+    $form = '<input type="text" size="10" value="' . $recherche_aff . '" name="recherche" class="recherche" accesskey="r"' . $onfocus . ' />';
292
+    $form .= "<input type='image' src='" . chemin_image('rechercher-20.png') . "' name='submit' class='submit' alt='" . _T('info_rechercher') . "' />";
293
+
294
+    return "<div class='spip_recherche'>" . generer_form_ecrire($page, $form . $complement, " method='get'") . '</div>';
295 295
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
 		$rejouer = (_SESSION_REJOUER === true) ? rejouer_session() : _SESSION_REJOUER;
190 190
 	}
191 191
 
192
-	return $rejouer . (defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : '');
192
+	return $rejouer.(defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : '');
193 193
 }
194 194
 
195 195
 /**
@@ -235,9 +235,9 @@  discard block
 block discarded – undo
235 235
 	//
236 236
 	if ($vcs = version_vcs_courante(_DIR_RACINE, true)) {
237 237
 		if ($vcs['vcs'] === 'GIT') {
238
-			$url = 'https://git.spip.net/spip/spip/commit/' . $vcs['commit'];
238
+			$url = 'https://git.spip.net/spip/spip/commit/'.$vcs['commit'];
239 239
 		} elseif ($vcs['vcs'] === 'SVN') {
240
-			$url = 'https://core.spip.net/projects/spip/repository/revisions/' . $vcs['commit'];
240
+			$url = 'https://core.spip.net/projects/spip/repository/revisions/'.$vcs['commit'];
241 241
 		} else {
242 242
 			$url = '';
243 243
 		}
@@ -247,21 +247,21 @@  discard block
 block discarded – undo
247 247
 			$commit = "<a href=\"$url\" target=\"_blank\" rel=\"noopener noreferrer\">$commit</a>";
248 248
 		}
249 249
 		if ($vcs['branch']) {
250
-			$commit = $vcs['branch'] . ': ' . $commit;
250
+			$commit = $vcs['branch'].': '.$commit;
251 251
 		}
252 252
 		$version .= " {$vcs['vcs']} [$commit]";
253 253
 	}
254 254
 
255 255
 	// et la version de l'ecran de securite
256 256
 	$secu = defined('_ECRAN_SECURITE')
257
-		? '<br />' . _T('ecran_securite', ['version' => _ECRAN_SECURITE])
257
+		? '<br />'._T('ecran_securite', ['version' => _ECRAN_SECURITE])
258 258
 		: '';
259 259
 
260 260
 	return _T(
261 261
 		'info_copyright',
262 262
 		[
263 263
 			'spip' => "<b>SPIP $version</b> ",
264
-			'lien_gpl' => '<a href="https://www.gnu.org/licenses/gpl-3.0.html">' . _T('info_copyright_gpl') . '</a>'
264
+			'lien_gpl' => '<a href="https://www.gnu.org/licenses/gpl-3.0.html">'._T('info_copyright_gpl').'</a>'
265 265
 		]
266 266
 	)
267 267
 	. $secu;
@@ -288,8 +288,8 @@  discard block
 block discarded – undo
288 288
 		$onfocus = '';
289 289
 	}
290 290
 
291
-	$form = '<input type="text" size="10" value="' . $recherche_aff . '" name="recherche" class="recherche" accesskey="r"' . $onfocus . ' />';
292
-	$form .= "<input type='image' src='" . chemin_image('rechercher-20.png') . "' name='submit' class='submit' alt='" . _T('info_rechercher') . "' />";
291
+	$form = '<input type="text" size="10" value="'.$recherche_aff.'" name="recherche" class="recherche" accesskey="r"'.$onfocus.' />';
292
+	$form .= "<input type='image' src='".chemin_image('rechercher-20.png')."' name='submit' class='submit' alt='"._T('info_rechercher')."' />";
293 293
 
294
-	return "<div class='spip_recherche'>" . generer_form_ecrire($page, $form . $complement, " method='get'") . '</div>';
294
+	return "<div class='spip_recherche'>".generer_form_ecrire($page, $form.$complement, " method='get'").'</div>';
295 295
 }
Please login to merge, or discard this patch.
ecrire/req/sqlite_generique.php 2 patches
Indentation   +1622 added lines, -1622 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
  */
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 // TODO: get/set_caracteres ?
@@ -44,91 +44,91 @@  discard block
 block discarded – undo
44 44
  */
45 45
 function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $sqlite_version = '')
46 46
 {
47
-	static $last_connect = [];
48
-
49
-	// si provient de selectdb
50
-	// un code pour etre sur que l'on vient de select_db()
51
-	if (strpos($db, $code = '@selectdb@') !== false) {
52
-		foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
53
-			$$a = $last_connect[$a];
54
-		}
55
-		$db = str_replace($code, '', $db);
56
-	}
57
-
58
-	/*
47
+    static $last_connect = [];
48
+
49
+    // si provient de selectdb
50
+    // un code pour etre sur que l'on vient de select_db()
51
+    if (strpos($db, $code = '@selectdb@') !== false) {
52
+        foreach (['addr', 'port', 'login', 'pass', 'prefixe'] as $a) {
53
+            $$a = $last_connect[$a];
54
+        }
55
+        $db = str_replace($code, '', $db);
56
+    }
57
+
58
+    /*
59 59
 	 * En sqlite, seule l'adresse du fichier est importante.
60 60
 	 * Ce sera $db le nom,
61 61
 	 * le path est $addr
62 62
 	 * (_DIR_DB si $addr est vide)
63 63
 	 */
64
-	_sqlite_init();
65
-
66
-	// determiner le dossier de la base : $addr ou _DIR_DB
67
-	$f = _DIR_DB;
68
-	if ($addr and str_contains($addr, '/')) {
69
-		$f = rtrim($addr, '/') . '/';
70
-	}
71
-
72
-	// un nom de base demande et impossible d'obtenir la base, on s'en va :
73
-	// il faut que la base existe ou que le repertoire parent soit writable
74
-	if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
75
-		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
76
-
77
-		return false;
78
-	}
79
-
80
-	// charger les modules sqlite au besoin
81
-	if (!_sqlite_charger_version($sqlite_version)) {
82
-		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
83
-
84
-		return false;
85
-	}
86
-
87
-	// chargement des constantes
88
-	// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
89
-	$define = 'spip_sqlite' . $sqlite_version . '_constantes';
90
-	$define();
91
-
92
-	$ok = false;
93
-	if (!$db) {
94
-		// si pas de db ->
95
-		// base temporaire tant qu'on ne connait pas son vrai nom
96
-		// pour tester la connexion
97
-		$db = '_sqlite' . $sqlite_version . '_install';
98
-		$tmp = _DIR_DB . $db . '.sqlite';
99
-		$ok = $link = new \PDO("sqlite:$tmp");
100
-	} else {
101
-		// Ouvrir (eventuellement creer la base)
102
-		$ok = $link = new \PDO("sqlite:$f");
103
-	}
104
-
105
-	if (!$ok) {
106
-		$e = _sqlite_last_error_from_link($link);
107
-		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
108
-
109
-		return false;
110
-	}
111
-
112
-	if ($link) {
113
-		$last_connect = [
114
-			'addr' => $addr,
115
-			'port' => $port,
116
-			'login' => $login,
117
-			'pass' => $pass,
118
-			'db' => $db,
119
-			'prefixe' => $prefixe,
120
-		];
121
-		// etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
122
-		include_spip('req/sqlite_fonctions');
123
-		_sqlite_init_functions($link);
124
-	}
125
-
126
-	return [
127
-		'db' => $db,
128
-		'prefixe' => $prefixe ? $prefixe : $db,
129
-		'link' => $link,
130
-		'total_requetes' => 0,
131
-	];
64
+    _sqlite_init();
65
+
66
+    // determiner le dossier de la base : $addr ou _DIR_DB
67
+    $f = _DIR_DB;
68
+    if ($addr and str_contains($addr, '/')) {
69
+        $f = rtrim($addr, '/') . '/';
70
+    }
71
+
72
+    // un nom de base demande et impossible d'obtenir la base, on s'en va :
73
+    // il faut que la base existe ou que le repertoire parent soit writable
74
+    if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
75
+        spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
76
+
77
+        return false;
78
+    }
79
+
80
+    // charger les modules sqlite au besoin
81
+    if (!_sqlite_charger_version($sqlite_version)) {
82
+        spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
83
+
84
+        return false;
85
+    }
86
+
87
+    // chargement des constantes
88
+    // il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
89
+    $define = 'spip_sqlite' . $sqlite_version . '_constantes';
90
+    $define();
91
+
92
+    $ok = false;
93
+    if (!$db) {
94
+        // si pas de db ->
95
+        // base temporaire tant qu'on ne connait pas son vrai nom
96
+        // pour tester la connexion
97
+        $db = '_sqlite' . $sqlite_version . '_install';
98
+        $tmp = _DIR_DB . $db . '.sqlite';
99
+        $ok = $link = new \PDO("sqlite:$tmp");
100
+    } else {
101
+        // Ouvrir (eventuellement creer la base)
102
+        $ok = $link = new \PDO("sqlite:$f");
103
+    }
104
+
105
+    if (!$ok) {
106
+        $e = _sqlite_last_error_from_link($link);
107
+        spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
108
+
109
+        return false;
110
+    }
111
+
112
+    if ($link) {
113
+        $last_connect = [
114
+            'addr' => $addr,
115
+            'port' => $port,
116
+            'login' => $login,
117
+            'pass' => $pass,
118
+            'db' => $db,
119
+            'prefixe' => $prefixe,
120
+        ];
121
+        // etre sur qu'on definit bien les fonctions a chaque nouvelle connexion
122
+        include_spip('req/sqlite_fonctions');
123
+        _sqlite_init_functions($link);
124
+    }
125
+
126
+    return [
127
+        'db' => $db,
128
+        'prefixe' => $prefixe ? $prefixe : $db,
129
+        'link' => $link,
130
+        'total_requetes' => 0,
131
+    ];
132 132
 }
133 133
 
134 134
 
@@ -148,14 +148,14 @@  discard block
 block discarded – undo
148 148
  */
149 149
 function spip_sqlite_query($query, $serveur = '', $requeter = true)
150 150
 {
151
-	#spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
152
-	#_sqlite_init(); // fait la premiere fois dans spip_sqlite
153
-	$query = Sqlite::traduire_requete($query, $serveur);
154
-	if (!$requeter) {
155
-		return $query;
156
-	}
157
-
158
-	return Sqlite::executer_requete($query, $serveur);
151
+    #spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG);
152
+    #_sqlite_init(); // fait la premiere fois dans spip_sqlite
153
+    $query = Sqlite::traduire_requete($query, $serveur);
154
+    if (!$requeter) {
155
+        return $query;
156
+    }
157
+
158
+    return Sqlite::executer_requete($query, $serveur);
159 159
 }
160 160
 
161 161
 
@@ -173,11 +173,11 @@  discard block
 block discarded – undo
173 173
 function spip_sqlite_alter($query, $serveur = '', $requeter = true)
174 174
 {
175 175
 
176
-	$query = spip_sqlite_query("ALTER $query", $serveur, false);
177
-	// traduire la requete pour recuperer les bons noms de table
178
-	$query = Sqlite::traduire_requete($query, $serveur);
176
+    $query = spip_sqlite_query("ALTER $query", $serveur, false);
177
+    // traduire la requete pour recuperer les bons noms de table
178
+    $query = Sqlite::traduire_requete($query, $serveur);
179 179
 
180
-	/*
180
+    /*
181 181
 		 * la il faut faire les transformations
182 182
 		 * si ALTER TABLE x (DROP|CHANGE) y
183 183
 		 *
@@ -186,251 +186,251 @@  discard block
 block discarded – undo
186 186
 		 * 3) faire chaque requete independemment
187 187
 		 */
188 188
 
189
-	// 1
190
-	if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
191
-		$debut = $regs[1];
192
-		$table = $regs[3];
193
-		$suite = $regs[4];
194
-	} else {
195
-		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
196
-
197
-		return false;
198
-	}
199
-
200
-	// 2
201
-	// il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
202
-	// tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
203
-	// ou revoir l'api de sql_alter en creant un
204
-	// sql_alter_table($table,array($actions));
205
-	$todo = explode(',', $suite);
206
-
207
-	// on remet les morceaux dechires ensembles... que c'est laid !
208
-	$todo2 = [];
209
-	$i = 0;
210
-	$ouverte = false;
211
-	while ($do = array_shift($todo)) {
212
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
213
-		$o = (str_contains($do, '('));
214
-		$f = (str_contains($do, ')'));
215
-		if ($o and !$f) {
216
-			$ouverte = true;
217
-		} elseif ($f) {
218
-			$ouverte = false;
219
-		}
220
-		if (!$ouverte) {
221
-			$i++;
222
-		}
223
-	}
224
-
225
-	// 3
226
-	$resultats = [];
227
-	foreach ($todo2 as $do) {
228
-		$do = trim($do);
229
-		if (
230
-			!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
231
-				. '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
232
-				. '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
233
-				. '|ADD COLUMN|ADD'
234
-				. ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
235
-		) {
236
-			spip_log(
237
-				"SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
238
-				'sqlite.' . _LOG_ERREUR
239
-			);
240
-
241
-			return false;
242
-		}
243
-
244
-		$cle = strtoupper($matches[1]);
245
-		$colonne_origine = $matches[2];
246
-		$colonne_destination = '';
247
-
248
-		$def = $matches[3];
249
-
250
-		// eluder une eventuelle clause before|after|first inutilisable
251
-		$defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
252
-		$defo = $defr; // garder la def d'origine pour certains cas
253
-		// remplacer les definitions venant de mysql
254
-		$defr = _sqlite_remplacements_definitions_table($defr);
255
-
256
-		// reinjecter dans le do
257
-		$do = str_replace($def, $defr, $do);
258
-		$def = $defr;
259
-
260
-		switch ($cle) {
261
-				// suppression d'un index
262
-			case 'DROP KEY':
263
-			case 'DROP INDEX':
264
-				$nom_index = $colonne_origine;
265
-				spip_sqlite_drop_index($nom_index, $table, $serveur);
266
-				break;
267
-
268
-				// suppression d'une pk
269
-			case 'DROP PRIMARY KEY':
270
-				if (
271
-					!_sqlite_modifier_table(
272
-						$table,
273
-						$colonne_origine,
274
-						['key' => ['PRIMARY KEY' => '']],
275
-						$serveur
276
-					)
277
-				) {
278
-					return false;
279
-				}
280
-				break;
281
-				// suppression d'une colonne
282
-			case 'DROP COLUMN':
283
-			case 'DROP':
284
-				if (
285
-					!_sqlite_modifier_table(
286
-						$table,
287
-						[$colonne_origine => ''],
288
-						[],
289
-						$serveur
290
-					)
291
-				) {
292
-					return false;
293
-				}
294
-				break;
295
-
296
-			case 'CHANGE COLUMN':
297
-			case 'CHANGE':
298
-				// recuperer le nom de la future colonne
299
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
300
-				// en tenant compte de la cle primaire (ce qui est mieux)
301
-				$def = trim($defo);
302
-				$colonne_destination = substr($def, 0, strpos($def, ' '));
303
-				$def = substr($def, strlen($colonne_destination) + 1);
304
-
305
-				if (
306
-					!_sqlite_modifier_table(
307
-						$table,
308
-						[$colonne_origine => $colonne_destination],
309
-						['field' => [$colonne_destination => $def]],
310
-						$serveur
311
-					)
312
-				) {
313
-					return false;
314
-				}
315
-				break;
316
-
317
-			case 'MODIFY':
318
-				// on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
319
-				// en tenant compte de la cle primaire (ce qui est mieux)
320
-				if (
321
-					!_sqlite_modifier_table(
322
-						$table,
323
-						$colonne_origine,
324
-						['field' => [$colonne_origine => $defo]],
325
-						$serveur
326
-					)
327
-				) {
328
-					return false;
329
-				}
330
-				break;
331
-
332
-				// pas geres en sqlite2
333
-			case 'RENAME':
334
-				$do = 'RENAME TO' . substr($do, 6);
335
-			case 'RENAME TO':
336
-				if (!Sqlite::executer_requete("$debut $do", $serveur)) {
337
-					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
338
-
339
-					return false;
340
-				}
341
-				break;
342
-
343
-				// ajout d'une pk
344
-			case 'ADD PRIMARY KEY':
345
-				$pk = trim(substr($do, 16));
346
-				$pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
347
-				if (
348
-					!_sqlite_modifier_table(
349
-						$table,
350
-						$colonne_origine,
351
-						['key' => ['PRIMARY KEY' => $pk]],
352
-						$serveur
353
-					)
354
-				) {
355
-					return false;
356
-				}
357
-				break;
358
-				// ajout d'un index
359
-			case 'ADD UNIQUE KEY':
360
-			case 'ADD UNIQUE':
361
-				$unique = true;
362
-			case 'ADD INDEX':
363
-			case 'ADD KEY':
364
-				if (!isset($unique)) {
365
-					$unique = false;
366
-				}
367
-				// peut etre "(colonne)" ou "nom_index (colonnes)"
368
-				// bug potentiel si qqn met "(colonne, colonne)"
369
-				//
370
-				// nom_index (colonnes)
371
-				if ($def) {
372
-					$colonnes = substr($def, 1, -1);
373
-					$nom_index = $colonne_origine;
374
-				} else {
375
-					// (colonne)
376
-					if ($colonne_origine[0] == '(') {
377
-						$colonnes = substr($colonne_origine, 1, -1);
378
-						if (str_contains(',', $colonnes)) {
379
-							spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
380
-								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
381
-							break;
382
-						} else {
383
-							$nom_index = $colonnes;
384
-						}
385
-					} // nom_index
386
-					else {
387
-						$nom_index = $colonnes = $colonne_origine;
388
-					}
389
-				}
390
-				spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
391
-				break;
392
-
393
-				// pas geres en sqlite2
394
-			case 'ADD COLUMN':
395
-				$do = 'ADD' . substr($do, 10);
396
-			case 'ADD':
397
-			default:
398
-				if (!preg_match(',primary\s+key,i', $do)) {
399
-					if (!Sqlite::executer_requete("$debut $do", $serveur)) {
400
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
401
-
402
-						return false;
403
-					}
404
-					break;
405
-				}
406
-				// ou si la colonne est aussi primary key
407
-				// cas du add id_truc int primary key
408
-				// ajout d'une colonne qui passe en primary key directe
409
-				else {
410
-					$def = trim(substr($do, 3));
411
-					$colonne_ajoutee = substr($def, 0, strpos($def, ' '));
412
-					$def = substr($def, strlen($colonne_ajoutee) + 1);
413
-					$opts = [];
414
-					if (preg_match(',primary\s+key,i', $def)) {
415
-						$opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
416
-						$def = preg_replace(',primary\s+key,i', '', $def);
417
-					}
418
-					$opts['field'] = [$colonne_ajoutee => $def];
419
-					if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
420
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
421
-
422
-						return false;
423
-					}
424
-				}
425
-				break;
426
-		}
427
-		// tout est bon, ouf !
428
-		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
429
-	}
430
-
431
-	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
432
-
433
-	return true;
189
+    // 1
190
+    if (preg_match('/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is', $query, $regs)) {
191
+        $debut = $regs[1];
192
+        $table = $regs[3];
193
+        $suite = $regs[4];
194
+    } else {
195
+        spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
196
+
197
+        return false;
198
+    }
199
+
200
+    // 2
201
+    // il faudrait une regexp pour eviter de spliter ADD PRIMARY KEY (colA, colB)
202
+    // tout en cassant "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... en deux
203
+    // ou revoir l'api de sql_alter en creant un
204
+    // sql_alter_table($table,array($actions));
205
+    $todo = explode(',', $suite);
206
+
207
+    // on remet les morceaux dechires ensembles... que c'est laid !
208
+    $todo2 = [];
209
+    $i = 0;
210
+    $ouverte = false;
211
+    while ($do = array_shift($todo)) {
212
+        $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
213
+        $o = (str_contains($do, '('));
214
+        $f = (str_contains($do, ')'));
215
+        if ($o and !$f) {
216
+            $ouverte = true;
217
+        } elseif ($f) {
218
+            $ouverte = false;
219
+        }
220
+        if (!$ouverte) {
221
+            $i++;
222
+        }
223
+    }
224
+
225
+    // 3
226
+    $resultats = [];
227
+    foreach ($todo2 as $do) {
228
+        $do = trim($do);
229
+        if (
230
+            !preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP'
231
+                . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME'
232
+                . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE'
233
+                . '|ADD COLUMN|ADD'
234
+                . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches)
235
+        ) {
236
+            spip_log(
237
+                "SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
238
+                'sqlite.' . _LOG_ERREUR
239
+            );
240
+
241
+            return false;
242
+        }
243
+
244
+        $cle = strtoupper($matches[1]);
245
+        $colonne_origine = $matches[2];
246
+        $colonne_destination = '';
247
+
248
+        $def = $matches[3];
249
+
250
+        // eluder une eventuelle clause before|after|first inutilisable
251
+        $defr = rtrim(preg_replace('/(BEFORE|AFTER|FIRST)(.*)$/is', '', $def));
252
+        $defo = $defr; // garder la def d'origine pour certains cas
253
+        // remplacer les definitions venant de mysql
254
+        $defr = _sqlite_remplacements_definitions_table($defr);
255
+
256
+        // reinjecter dans le do
257
+        $do = str_replace($def, $defr, $do);
258
+        $def = $defr;
259
+
260
+        switch ($cle) {
261
+                // suppression d'un index
262
+            case 'DROP KEY':
263
+            case 'DROP INDEX':
264
+                $nom_index = $colonne_origine;
265
+                spip_sqlite_drop_index($nom_index, $table, $serveur);
266
+                break;
267
+
268
+                // suppression d'une pk
269
+            case 'DROP PRIMARY KEY':
270
+                if (
271
+                    !_sqlite_modifier_table(
272
+                        $table,
273
+                        $colonne_origine,
274
+                        ['key' => ['PRIMARY KEY' => '']],
275
+                        $serveur
276
+                    )
277
+                ) {
278
+                    return false;
279
+                }
280
+                break;
281
+                // suppression d'une colonne
282
+            case 'DROP COLUMN':
283
+            case 'DROP':
284
+                if (
285
+                    !_sqlite_modifier_table(
286
+                        $table,
287
+                        [$colonne_origine => ''],
288
+                        [],
289
+                        $serveur
290
+                    )
291
+                ) {
292
+                    return false;
293
+                }
294
+                break;
295
+
296
+            case 'CHANGE COLUMN':
297
+            case 'CHANGE':
298
+                // recuperer le nom de la future colonne
299
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
300
+                // en tenant compte de la cle primaire (ce qui est mieux)
301
+                $def = trim($defo);
302
+                $colonne_destination = substr($def, 0, strpos($def, ' '));
303
+                $def = substr($def, strlen($colonne_destination) + 1);
304
+
305
+                if (
306
+                    !_sqlite_modifier_table(
307
+                        $table,
308
+                        [$colonne_origine => $colonne_destination],
309
+                        ['field' => [$colonne_destination => $def]],
310
+                        $serveur
311
+                    )
312
+                ) {
313
+                    return false;
314
+                }
315
+                break;
316
+
317
+            case 'MODIFY':
318
+                // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation
319
+                // en tenant compte de la cle primaire (ce qui est mieux)
320
+                if (
321
+                    !_sqlite_modifier_table(
322
+                        $table,
323
+                        $colonne_origine,
324
+                        ['field' => [$colonne_origine => $defo]],
325
+                        $serveur
326
+                    )
327
+                ) {
328
+                    return false;
329
+                }
330
+                break;
331
+
332
+                // pas geres en sqlite2
333
+            case 'RENAME':
334
+                $do = 'RENAME TO' . substr($do, 6);
335
+            case 'RENAME TO':
336
+                if (!Sqlite::executer_requete("$debut $do", $serveur)) {
337
+                    spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
338
+
339
+                    return false;
340
+                }
341
+                break;
342
+
343
+                // ajout d'une pk
344
+            case 'ADD PRIMARY KEY':
345
+                $pk = trim(substr($do, 16));
346
+                $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk;
347
+                if (
348
+                    !_sqlite_modifier_table(
349
+                        $table,
350
+                        $colonne_origine,
351
+                        ['key' => ['PRIMARY KEY' => $pk]],
352
+                        $serveur
353
+                    )
354
+                ) {
355
+                    return false;
356
+                }
357
+                break;
358
+                // ajout d'un index
359
+            case 'ADD UNIQUE KEY':
360
+            case 'ADD UNIQUE':
361
+                $unique = true;
362
+            case 'ADD INDEX':
363
+            case 'ADD KEY':
364
+                if (!isset($unique)) {
365
+                    $unique = false;
366
+                }
367
+                // peut etre "(colonne)" ou "nom_index (colonnes)"
368
+                // bug potentiel si qqn met "(colonne, colonne)"
369
+                //
370
+                // nom_index (colonnes)
371
+                if ($def) {
372
+                    $colonnes = substr($def, 1, -1);
373
+                    $nom_index = $colonne_origine;
374
+                } else {
375
+                    // (colonne)
376
+                    if ($colonne_origine[0] == '(') {
377
+                        $colonnes = substr($colonne_origine, 1, -1);
378
+                        if (str_contains(',', $colonnes)) {
379
+                            spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
380
+                                . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
381
+                            break;
382
+                        } else {
383
+                            $nom_index = $colonnes;
384
+                        }
385
+                    } // nom_index
386
+                    else {
387
+                        $nom_index = $colonnes = $colonne_origine;
388
+                    }
389
+                }
390
+                spip_sqlite_create_index($nom_index, $table, $colonnes, $unique, $serveur);
391
+                break;
392
+
393
+                // pas geres en sqlite2
394
+            case 'ADD COLUMN':
395
+                $do = 'ADD' . substr($do, 10);
396
+            case 'ADD':
397
+            default:
398
+                if (!preg_match(',primary\s+key,i', $do)) {
399
+                    if (!Sqlite::executer_requete("$debut $do", $serveur)) {
400
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
401
+
402
+                        return false;
403
+                    }
404
+                    break;
405
+                }
406
+                // ou si la colonne est aussi primary key
407
+                // cas du add id_truc int primary key
408
+                // ajout d'une colonne qui passe en primary key directe
409
+                else {
410
+                    $def = trim(substr($do, 3));
411
+                    $colonne_ajoutee = substr($def, 0, strpos($def, ' '));
412
+                    $def = substr($def, strlen($colonne_ajoutee) + 1);
413
+                    $opts = [];
414
+                    if (preg_match(',primary\s+key,i', $def)) {
415
+                        $opts['key'] = ['PRIMARY KEY' => $colonne_ajoutee];
416
+                        $def = preg_replace(',primary\s+key,i', '', $def);
417
+                    }
418
+                    $opts['field'] = [$colonne_ajoutee => $def];
419
+                    if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
420
+                        spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
421
+
422
+                        return false;
423
+                    }
424
+                }
425
+                break;
426
+        }
427
+        // tout est bon, ouf !
428
+        spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
429
+    }
430
+
431
+    spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
432
+
433
+    return true;
434 434
 }
435 435
 
436 436
 /**
@@ -452,38 +452,38 @@  discard block
 block discarded – undo
452 452
  *     - true si la requête réussie, false sinon.
453 453
  */
454 454
 function spip_sqlite_create(
455
-	$nom,
456
-	$champs,
457
-	$cles,
458
-	$autoinc = false,
459
-	$temporary = false,
460
-	$serveur = '',
461
-	$requeter = true
455
+    $nom,
456
+    $champs,
457
+    $cles,
458
+    $autoinc = false,
459
+    $temporary = false,
460
+    $serveur = '',
461
+    $requeter = true
462 462
 ) {
463
-	$query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
464
-	if (!$query) {
465
-		return false;
466
-	}
467
-	$res = spip_sqlite_query($query, $serveur, $requeter);
468
-
469
-	// SQLite ne cree pas les KEY sur les requetes CREATE TABLE
470
-	// il faut donc les faire creer ensuite
471
-	if (!$requeter) {
472
-		return $res;
473
-	}
474
-
475
-	$ok = $res ? true : false;
476
-	if ($ok) {
477
-		foreach ($cles as $k => $v) {
478
-			if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
479
-				$index = trim(substr($k, strlen($m[1])));
480
-				$unique = (strlen($m[1]) > 3);
481
-				$ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
482
-			}
483
-		}
484
-	}
485
-
486
-	return $ok ? true : false;
463
+    $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter);
464
+    if (!$query) {
465
+        return false;
466
+    }
467
+    $res = spip_sqlite_query($query, $serveur, $requeter);
468
+
469
+    // SQLite ne cree pas les KEY sur les requetes CREATE TABLE
470
+    // il faut donc les faire creer ensuite
471
+    if (!$requeter) {
472
+        return $res;
473
+    }
474
+
475
+    $ok = $res ? true : false;
476
+    if ($ok) {
477
+        foreach ($cles as $k => $v) {
478
+            if (preg_match(',^(UNIQUE KEY|KEY|UNIQUE)\s,i', $k, $m)) {
479
+                $index = trim(substr($k, strlen($m[1])));
480
+                $unique = (strlen($m[1]) > 3);
481
+                $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur);
482
+            }
483
+        }
484
+    }
485
+
486
+    return $ok ? true : false;
487 487
 }
488 488
 
489 489
 /**
@@ -497,21 +497,21 @@  discard block
 block discarded – undo
497 497
  **/
498 498
 function spip_sqlite_create_base($nom, $serveur = '', $option = true)
499 499
 {
500
-	$f = $nom . '.sqlite';
501
-	if (strpos($nom, '/') === false) {
502
-		$f = _DIR_DB . $f;
503
-	}
500
+    $f = $nom . '.sqlite';
501
+    if (strpos($nom, '/') === false) {
502
+        $f = _DIR_DB . $f;
503
+    }
504 504
 
505
-	$ok = new \PDO("sqlite:$f");
505
+    $ok = new \PDO("sqlite:$f");
506 506
 
507
-	if ($ok) {
508
-		unset($ok);
507
+    if ($ok) {
508
+        unset($ok);
509 509
 
510
-		return true;
511
-	}
512
-	unset($ok);
510
+        return true;
511
+    }
512
+    unset($ok);
513 513
 
514
-	return false;
514
+    return false;
515 515
 }
516 516
 
517 517
 
@@ -533,22 +533,22 @@  discard block
 block discarded – undo
533 533
  */
534 534
 function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true)
535 535
 {
536
-	if (!$query_select) {
537
-		return false;
538
-	}
539
-	// vue deja presente
540
-	if (sql_showtable($nom, false, $serveur)) {
541
-		spip_log(
542
-			"Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
543
-			'sqlite.' . _LOG_ERREUR
544
-		);
545
-
546
-		return false;
547
-	}
548
-
549
-	$query = "CREATE VIEW $nom AS " . $query_select;
550
-
551
-	return spip_sqlite_query($query, $serveur, $requeter);
536
+    if (!$query_select) {
537
+        return false;
538
+    }
539
+    // vue deja presente
540
+    if (sql_showtable($nom, false, $serveur)) {
541
+        spip_log(
542
+            "Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
543
+            'sqlite.' . _LOG_ERREUR
544
+        );
545
+
546
+        return false;
547
+    }
548
+
549
+    $query = "CREATE VIEW $nom AS " . $query_select;
550
+
551
+    return spip_sqlite_query($query, $serveur, $requeter);
552 552
 }
553 553
 
554 554
 /**
@@ -571,54 +571,54 @@  discard block
 block discarded – undo
571 571
  */
572 572
 function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true)
573 573
 {
574
-	if (!($nom or $table or $champs)) {
575
-		spip_log(
576
-			"Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
577
-			'sqlite.' . _LOG_ERREUR
578
-		);
579
-
580
-		return false;
581
-	}
582
-
583
-	// SQLite ne differentie pas noms des index en fonction des tables
584
-	// il faut donc creer des noms uniques d'index pour une base sqlite
585
-	$nom = $table . '_' . $nom;
586
-	// enlever d'eventuelles parentheses deja presentes sur champs
587
-	if (!is_array($champs)) {
588
-		if ($champs[0] == '(') {
589
-			$champs = substr($champs, 1, -1);
590
-		}
591
-		$champs = [$champs];
592
-		// supprimer l'info de longueur d'index mysql en fin de champ
593
-		$champs = preg_replace(',\(\d+\)$,', '', $champs);
594
-	}
595
-
596
-	$ifnotexists = '';
597
-	$version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
598
-	if (!function_exists('spip_version_compare')) {
599
-		include_spip('plugins/installer');
600
-	}
601
-
602
-	if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
603
-		$ifnotexists = ' IF NOT EXISTS';
604
-	} else {
605
-		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
606
-		$a = spip_sqlite_showtable($table, $serveur);
607
-		if (isset($a['key']['KEY ' . $nom])) {
608
-			return true;
609
-		}
610
-	}
611
-
612
-	$query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
613
-	$res = spip_sqlite_query($query, $serveur, $requeter);
614
-	if (!$requeter) {
615
-		return $res;
616
-	}
617
-	if ($res) {
618
-		return true;
619
-	} else {
620
-		return false;
621
-	}
574
+    if (!($nom or $table or $champs)) {
575
+        spip_log(
576
+            "Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
577
+            'sqlite.' . _LOG_ERREUR
578
+        );
579
+
580
+        return false;
581
+    }
582
+
583
+    // SQLite ne differentie pas noms des index en fonction des tables
584
+    // il faut donc creer des noms uniques d'index pour une base sqlite
585
+    $nom = $table . '_' . $nom;
586
+    // enlever d'eventuelles parentheses deja presentes sur champs
587
+    if (!is_array($champs)) {
588
+        if ($champs[0] == '(') {
589
+            $champs = substr($champs, 1, -1);
590
+        }
591
+        $champs = [$champs];
592
+        // supprimer l'info de longueur d'index mysql en fin de champ
593
+        $champs = preg_replace(',\(\d+\)$,', '', $champs);
594
+    }
595
+
596
+    $ifnotexists = '';
597
+    $version = spip_sqlite_fetch(spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur), '', $serveur);
598
+    if (!function_exists('spip_version_compare')) {
599
+        include_spip('plugins/installer');
600
+    }
601
+
602
+    if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
603
+        $ifnotexists = ' IF NOT EXISTS';
604
+    } else {
605
+        /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
606
+        $a = spip_sqlite_showtable($table, $serveur);
607
+        if (isset($a['key']['KEY ' . $nom])) {
608
+            return true;
609
+        }
610
+    }
611
+
612
+    $query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
613
+    $res = spip_sqlite_query($query, $serveur, $requeter);
614
+    if (!$requeter) {
615
+        return $res;
616
+    }
617
+    if ($res) {
618
+        return true;
619
+    } else {
620
+        return false;
621
+    }
622 622
 }
623 623
 
624 624
 /**
@@ -636,31 +636,31 @@  discard block
 block discarded – undo
636 636
  */
637 637
 function spip_sqlite_count($r, $serveur = '', $requeter = true)
638 638
 {
639
-	if (!$r) {
640
-		return 0;
641
-	}
642
-
643
-	// select ou autre (insert, update,...) ?
644
-	// (link,requete) a compter
645
-	if (is_array($r->spipSqliteRowCount)) {
646
-		list($link, $query) = $r->spipSqliteRowCount;
647
-		// amelioration possible a tester intensivement : pas de order by pour compter !
648
-		// $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
649
-		$query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
650
-		$l = $link->query($query);
651
-		$i = 0;
652
-		if ($l and $z = $l->fetch()) {
653
-			$i = $z['zzzzsqlitecount'];
654
-		}
655
-		$r->spipSqliteRowCount = $i;
656
-	}
657
-	if (isset($r->spipSqliteRowCount)) {
658
-		// Ce compte est faux s'il y a des limit dans la requete :(
659
-		// il retourne le nombre d'enregistrements sans le limit
660
-		return $r->spipSqliteRowCount;
661
-	} else {
662
-		return $r->rowCount();
663
-	}
639
+    if (!$r) {
640
+        return 0;
641
+    }
642
+
643
+    // select ou autre (insert, update,...) ?
644
+    // (link,requete) a compter
645
+    if (is_array($r->spipSqliteRowCount)) {
646
+        list($link, $query) = $r->spipSqliteRowCount;
647
+        // amelioration possible a tester intensivement : pas de order by pour compter !
648
+        // $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query);
649
+        $query = "SELECT count(*) as zzzzsqlitecount FROM ($query)";
650
+        $l = $link->query($query);
651
+        $i = 0;
652
+        if ($l and $z = $l->fetch()) {
653
+            $i = $z['zzzzsqlitecount'];
654
+        }
655
+        $r->spipSqliteRowCount = $i;
656
+    }
657
+    if (isset($r->spipSqliteRowCount)) {
658
+        // Ce compte est faux s'il y a des limit dans la requete :(
659
+        // il retourne le nombre d'enregistrements sans le limit
660
+        return $r->spipSqliteRowCount;
661
+    } else {
662
+        return $r->rowCount();
663
+    }
664 664
 }
665 665
 
666 666
 
@@ -679,30 +679,30 @@  discard block
 block discarded – undo
679 679
  *     - false si la requête a échouée
680 680
  **/
681 681
 function spip_sqlite_countsel(
682
-	$from = [],
683
-	$where = [],
684
-	$groupby = '',
685
-	$having = [],
686
-	$serveur = '',
687
-	$requeter = true
682
+    $from = [],
683
+    $where = [],
684
+    $groupby = '',
685
+    $having = [],
686
+    $serveur = '',
687
+    $requeter = true
688 688
 ) {
689
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
690
-	$r = spip_sqlite_select(
691
-		"COUNT($c)",
692
-		$from,
693
-		$where,
694
-		'',
695
-		'',
696
-		'',
697
-		$having,
698
-		$serveur,
699
-		$requeter
700
-	);
701
-	if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
702
-		list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
703
-	}
704
-
705
-	return $r;
689
+    $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
690
+    $r = spip_sqlite_select(
691
+        "COUNT($c)",
692
+        $from,
693
+        $where,
694
+        '',
695
+        '',
696
+        '',
697
+        $having,
698
+        $serveur,
699
+        $requeter
700
+    );
701
+    if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3
702
+        list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur);
703
+    }
704
+
705
+    return $r;
706 706
 }
707 707
 
708 708
 
@@ -720,24 +720,24 @@  discard block
 block discarded – undo
720 720
  **/
721 721
 function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true)
722 722
 {
723
-	$res = spip_sqlite_query(
724
-		_sqlite_calculer_expression('DELETE FROM', $table, ',')
725
-			. _sqlite_calculer_expression('WHERE', $where),
726
-		$serveur,
727
-		$requeter
728
-	);
729
-
730
-	// renvoyer la requete inerte si demandee
731
-	if (!$requeter) {
732
-		return $res;
733
-	}
734
-
735
-	if ($res) {
736
-		$link = _sqlite_link($serveur);
737
-		return $res->rowCount();
738
-	} else {
739
-		return false;
740
-	}
723
+    $res = spip_sqlite_query(
724
+        _sqlite_calculer_expression('DELETE FROM', $table, ',')
725
+            . _sqlite_calculer_expression('WHERE', $where),
726
+        $serveur,
727
+        $requeter
728
+    );
729
+
730
+    // renvoyer la requete inerte si demandee
731
+    if (!$requeter) {
732
+        return $res;
733
+    }
734
+
735
+    if ($res) {
736
+        $link = _sqlite_link($serveur);
737
+        return $res->rowCount();
738
+    } else {
739
+        return false;
740
+    }
741 741
 }
742 742
 
743 743
 
@@ -754,15 +754,15 @@  discard block
 block discarded – undo
754 754
  */
755 755
 function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true)
756 756
 {
757
-	if ($exist) {
758
-		$exist = ' IF EXISTS';
759
-	}
760
-
761
-	if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
762
-		return true;
763
-	} else {
764
-		return false;
765
-	}
757
+    if ($exist) {
758
+        $exist = ' IF EXISTS';
759
+    }
760
+
761
+    if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) {
762
+        return true;
763
+    } else {
764
+        return false;
765
+    }
766 766
 }
767 767
 
768 768
 
@@ -779,11 +779,11 @@  discard block
 block discarded – undo
779 779
  */
780 780
 function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true)
781 781
 {
782
-	if ($exist) {
783
-		$exist = ' IF EXISTS';
784
-	}
782
+    if ($exist) {
783
+        $exist = ' IF EXISTS';
784
+    }
785 785
 
786
-	return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
786
+    return spip_sqlite_query("DROP VIEW$exist $view", $serveur, $requeter);
787 787
 }
788 788
 
789 789
 /**
@@ -798,20 +798,20 @@  discard block
 block discarded – undo
798 798
  */
799 799
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true)
800 800
 {
801
-	if (!($nom or $table)) {
802
-		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
801
+    if (!($nom or $table)) {
802
+        spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
803 803
 
804
-		return false;
805
-	}
804
+        return false;
805
+    }
806 806
 
807
-	// SQLite ne differentie pas noms des index en fonction des tables
808
-	// il faut donc creer des noms uniques d'index pour une base sqlite
809
-	$index = $table . '_' . $nom;
810
-	$exist = ' IF EXISTS';
807
+    // SQLite ne differentie pas noms des index en fonction des tables
808
+    // il faut donc creer des noms uniques d'index pour une base sqlite
809
+    $index = $table . '_' . $nom;
810
+    $exist = ' IF EXISTS';
811 811
 
812
-	$query = "DROP INDEX$exist $index";
812
+    $query = "DROP INDEX$exist $index";
813 813
 
814
-	return spip_sqlite_query($query, $serveur, $requeter);
814
+    return spip_sqlite_query($query, $serveur, $requeter);
815 815
 }
816 816
 
817 817
 /**
@@ -828,29 +828,29 @@  discard block
 block discarded – undo
828 828
  **/
829 829
 function spip_sqlite_error($query = '', $serveur = '')
830 830
 {
831
-	$link = _sqlite_link($serveur);
832
-
833
-	if ($link) {
834
-		$errs = $link->errorInfo();
835
-		$s = _sqlite_last_error_from_link($link);
836
-	} else {
837
-		$s = ': aucune ressource sqlite (link)';
838
-	}
839
-	if ($s) {
840
-		$trace = debug_backtrace();
841
-		if ($trace[0]['function'] != 'spip_sqlite_error') {
842
-			spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
843
-		}
844
-	}
845
-
846
-	return $s;
831
+    $link = _sqlite_link($serveur);
832
+
833
+    if ($link) {
834
+        $errs = $link->errorInfo();
835
+        $s = _sqlite_last_error_from_link($link);
836
+    } else {
837
+        $s = ': aucune ressource sqlite (link)';
838
+    }
839
+    if ($s) {
840
+        $trace = debug_backtrace();
841
+        if ($trace[0]['function'] != 'spip_sqlite_error') {
842
+            spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
843
+        }
844
+    }
845
+
846
+    return $s;
847 847
 }
848 848
 
849 849
 function _sqlite_last_error_from_link($link)
850 850
 {
851
-	if ($link) {
852
-		$errs = $link->errorInfo();
853
-		/*
851
+    if ($link) {
852
+        $errs = $link->errorInfo();
853
+        /*
854 854
 			$errs[0]
855 855
 				numero SQLState ('HY000' souvent lors d'une erreur)
856 856
 				http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html
@@ -860,11 +860,11 @@  discard block
 block discarded – undo
860 860
 			$errs[2]
861 861
 				Le texte du message d'erreur
862 862
 		*/
863
-		if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
864
-			return "$errs[2]";
865
-		}
866
-	}
867
-	return '';
863
+        if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur
864
+            return "$errs[2]";
865
+        }
866
+    }
867
+    return '';
868 868
 }
869 869
 
870 870
 /**
@@ -882,23 +882,23 @@  discard block
 block discarded – undo
882 882
  **/
883 883
 function spip_sqlite_errno($serveur = '')
884 884
 {
885
-	$link = _sqlite_link($serveur);
886
-
887
-	if ($link) {
888
-		$t = $link->errorInfo();
889
-		$s = ltrim($t[0], '0'); // 00000 si pas d'erreur
890
-		if ($s) {
891
-			$s .= ' / ' . $t[1];
892
-		} // ajoute l'erreur du moteur SQLite
893
-	} else {
894
-		$s = ': aucune ressource sqlite (link)';
895
-	}
896
-
897
-	if ($s) {
898
-		spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
899
-	}
900
-
901
-	return $s ? $s : 0;
885
+    $link = _sqlite_link($serveur);
886
+
887
+    if ($link) {
888
+        $t = $link->errorInfo();
889
+        $s = ltrim($t[0], '0'); // 00000 si pas d'erreur
890
+        if ($s) {
891
+            $s .= ' / ' . $t[1];
892
+        } // ajoute l'erreur du moteur SQLite
893
+    } else {
894
+        $s = ': aucune ressource sqlite (link)';
895
+    }
896
+
897
+    if ($s) {
898
+        spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
899
+    }
900
+
901
+    return $s ? $s : 0;
902 902
 }
903 903
 
904 904
 
@@ -915,19 +915,19 @@  discard block
 block discarded – undo
915 915
  */
916 916
 function spip_sqlite_explain($query, $serveur = '', $requeter = true)
917 917
 {
918
-	if (strpos(ltrim($query), 'SELECT') !== 0) {
919
-		return [];
920
-	}
921
-
922
-	$query = Sqlite::traduire_requete($query, $serveur);
923
-	$query = 'EXPLAIN ' . $query;
924
-	if (!$requeter) {
925
-		return $query;
926
-	}
927
-	// on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
928
-	$r = Sqlite::executer_requete($query, $serveur, false);
929
-
930
-	return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
918
+    if (strpos(ltrim($query), 'SELECT') !== 0) {
919
+        return [];
920
+    }
921
+
922
+    $query = Sqlite::traduire_requete($query, $serveur);
923
+    $query = 'EXPLAIN ' . $query;
924
+    if (!$requeter) {
925
+        return $query;
926
+    }
927
+    // on ne trace pas ces requetes, sinon on obtient un tracage sans fin...
928
+    $r = Sqlite::executer_requete($query, $serveur, false);
929
+
930
+    return $r ? spip_sqlite_fetch($r, null, $serveur) : false; // hum ? etrange ca... a verifier
931 931
 }
932 932
 
933 933
 
@@ -948,35 +948,35 @@  discard block
 block discarded – undo
948 948
 function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true)
949 949
 {
950 950
 
951
-	$link = _sqlite_link($serveur);
952
-	$t = $t ? $t : SPIP_SQLITE3_ASSOC;
953
-
954
-	if (!$r) {
955
-		return false;
956
-	}
957
-
958
-	$retour = $r->fetch($t);
959
-
960
-	if (!$retour) {
961
-		if ($r->errorCode() === '00000') {
962
-			return null;
963
-		}
964
-		return false;
965
-	}
966
-
967
-	// Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
968
-	// suppression de 'table.' pour toutes les cles (c'est un peu violent !)
969
-	// c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
970
-	if (str_contains(implode('', array_keys($retour)), '.')) {
971
-		foreach ($retour as $cle => $val) {
972
-			if (($pos = strpos($cle, '.')) !== false) {
973
-				$retour[substr($cle, $pos + 1)] = &$retour[$cle];
974
-				unset($retour[$cle]);
975
-			}
976
-		}
977
-	}
978
-
979
-	return $retour;
951
+    $link = _sqlite_link($serveur);
952
+    $t = $t ? $t : SPIP_SQLITE3_ASSOC;
953
+
954
+    if (!$r) {
955
+        return false;
956
+    }
957
+
958
+    $retour = $r->fetch($t);
959
+
960
+    if (!$retour) {
961
+        if ($r->errorCode() === '00000') {
962
+            return null;
963
+        }
964
+        return false;
965
+    }
966
+
967
+    // Renvoie des 'table.titre' au lieu de 'titre' tout court ! pff !
968
+    // suppression de 'table.' pour toutes les cles (c'est un peu violent !)
969
+    // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non
970
+    if (str_contains(implode('', array_keys($retour)), '.')) {
971
+        foreach ($retour as $cle => $val) {
972
+            if (($pos = strpos($cle, '.')) !== false) {
973
+                $retour[substr($cle, $pos + 1)] = &$retour[$cle];
974
+                unset($retour[$cle]);
975
+            }
976
+        }
977
+    }
978
+
979
+    return $retour;
980 980
 }
981 981
 
982 982
 /**
@@ -990,8 +990,8 @@  discard block
 block discarded – undo
990 990
  **/
991 991
 function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true)
992 992
 {
993
-	// encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
994
-	return false;
993
+    // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind...
994
+    return false;
995 995
 }
996 996
 
997 997
 
@@ -1008,10 +1008,10 @@  discard block
 block discarded – undo
1008 1008
  */
1009 1009
 function spip_sqlite_free(&$r, $serveur = '', $requeter = true)
1010 1010
 {
1011
-	unset($r);
1011
+    unset($r);
1012 1012
 
1013
-	return true;
1014
-	//return sqlite_free_result($r);
1013
+    return true;
1014
+    //return sqlite_free_result($r);
1015 1015
 }
1016 1016
 
1017 1017
 
@@ -1027,8 +1027,8 @@  discard block
 block discarded – undo
1027 1027
  */
1028 1028
 function spip_sqlite_get_charset($charset = [], $serveur = '', $requeter = true)
1029 1029
 {
1030
-	//$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1031
-	//return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1030
+    //$c = !$charset ? '' : (" LIKE "._q($charset['charset']));
1031
+    //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur);
1032 1032
 }
1033 1033
 
1034 1034
 
@@ -1044,7 +1044,7 @@  discard block
 block discarded – undo
1044 1044
  **/
1045 1045
 function spip_sqlite_hex($v)
1046 1046
 {
1047
-	return hexdec($v);
1047
+    return hexdec($v);
1048 1048
 }
1049 1049
 
1050 1050
 
@@ -1067,7 +1067,7 @@  discard block
 block discarded – undo
1067 1067
  **/
1068 1068
 function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true)
1069 1069
 {
1070
-	return "($val $not IN ($valeurs))";
1070
+    return "($val $not IN ($valeurs))";
1071 1071
 }
1072 1072
 
1073 1073
 
@@ -1096,20 +1096,20 @@  discard block
 block discarded – undo
1096 1096
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true)
1097 1097
 {
1098 1098
 
1099
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1100
-	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1101
-		if (!$requeter) {
1102
-			return $r;
1103
-		}
1104
-		$nb = Sqlite::last_insert_id($serveur);
1105
-	} else {
1106
-		$nb = false;
1107
-	}
1099
+    $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1100
+    if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1101
+        if (!$requeter) {
1102
+            return $r;
1103
+        }
1104
+        $nb = Sqlite::last_insert_id($serveur);
1105
+    } else {
1106
+        $nb = false;
1107
+    }
1108 1108
 
1109
-	$err = spip_sqlite_error($query, $serveur);
1109
+    $err = spip_sqlite_error($query, $serveur);
1110 1110
 
1111
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1112
-	return isset($_GET['var_profile']) ? $r : $nb;
1111
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1112
+    return isset($_GET['var_profile']) ? $r : $nb;
1113 1113
 }
1114 1114
 
1115 1115
 
@@ -1135,28 +1135,28 @@  discard block
 block discarded – undo
1135 1135
  **/
1136 1136
 function spip_sqlite_insertq($table, $couples = [], $desc = [], $serveur = '', $requeter = true)
1137 1137
 {
1138
-	if (!$desc) {
1139
-		$desc = description_table($table, $serveur);
1140
-	}
1141
-	if (!$desc) {
1142
-		die("$table insertion sans description");
1143
-	}
1144
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1145
-
1146
-	foreach ($couples as $champ => $val) {
1147
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1148
-	}
1149
-
1150
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1151
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1152
-
1153
-	$cles = $valeurs = '';
1154
-	if (count($couples)) {
1155
-		$cles = '(' . join(',', array_keys($couples)) . ')';
1156
-		$valeurs = '(' . join(',', $couples) . ')';
1157
-	}
1158
-
1159
-	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1138
+    if (!$desc) {
1139
+        $desc = description_table($table, $serveur);
1140
+    }
1141
+    if (!$desc) {
1142
+        die("$table insertion sans description");
1143
+    }
1144
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1145
+
1146
+    foreach ($couples as $champ => $val) {
1147
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1148
+    }
1149
+
1150
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1151
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1152
+
1153
+    $cles = $valeurs = '';
1154
+    if (count($couples)) {
1155
+        $cles = '(' . join(',', array_keys($couples)) . ')';
1156
+        $valeurs = '(' . join(',', $couples) . ')';
1157
+    }
1158
+
1159
+    return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
1160 1160
 }
1161 1161
 
1162 1162
 
@@ -1181,70 +1181,70 @@  discard block
 block discarded – undo
1181 1181
  **/
1182 1182
 function spip_sqlite_insertq_multi($table, $tab_couples = [], $desc = [], $serveur = '', $requeter = true)
1183 1183
 {
1184
-	if (!$desc) {
1185
-		$desc = description_table($table, $serveur);
1186
-	}
1187
-	if (!$desc) {
1188
-		die("$table insertion sans description");
1189
-	}
1190
-	if (!isset($desc['field'])) {
1191
-		$desc['field'] = [];
1192
-	}
1193
-
1194
-	// recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1195
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1196
-
1197
-	// seul le nom de la table est a traduire ici :
1198
-	// le faire une seule fois au debut
1199
-	$query_start = "INSERT INTO $table ";
1200
-	$query_start = Sqlite::traduire_requete($query_start, $serveur);
1201
-
1202
-	// ouvrir une transaction
1203
-	if ($requeter) {
1204
-		Sqlite::demarrer_transaction($serveur);
1205
-	}
1206
-
1207
-	while ($couples = array_shift($tab_couples)) {
1208
-		foreach ($couples as $champ => $val) {
1209
-			$couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1210
-		}
1211
-
1212
-		// inserer les champs timestamp par defaut
1213
-		$couples = array_merge($maj, $couples);
1214
-
1215
-		$champs = $valeurs = '';
1216
-		if (count($couples)) {
1217
-			$champs = '(' . join(',', array_keys($couples)) . ')';
1218
-			$valeurs = '(' . join(',', $couples) . ')';
1219
-			$query = $query_start . "$champs VALUES $valeurs";
1220
-		} else {
1221
-			$query = $query_start . 'DEFAULT VALUES';
1222
-		}
1223
-
1224
-		if ($requeter) {
1225
-			$retour = Sqlite::executer_requete($query, $serveur);
1226
-		}
1227
-
1228
-		// sur le dernier couple uniquement
1229
-		if (!count($tab_couples)) {
1230
-			$nb = 0;
1231
-			if ($requeter) {
1232
-				$nb = Sqlite::last_insert_id($serveur);
1233
-			} else {
1234
-				return $query;
1235
-			}
1236
-		}
1237
-
1238
-		$err = spip_sqlite_error($query, $serveur);
1239
-	}
1240
-
1241
-	if ($requeter) {
1242
-		Sqlite::finir_transaction($serveur);
1243
-	}
1244
-
1245
-	// renvoie le dernier id d'autoincrement ajoute
1246
-	// cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1247
-	return isset($_GET['var_profile']) ? $retour : $nb;
1184
+    if (!$desc) {
1185
+        $desc = description_table($table, $serveur);
1186
+    }
1187
+    if (!$desc) {
1188
+        die("$table insertion sans description");
1189
+    }
1190
+    if (!isset($desc['field'])) {
1191
+        $desc['field'] = [];
1192
+    }
1193
+
1194
+    // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci
1195
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
1196
+
1197
+    // seul le nom de la table est a traduire ici :
1198
+    // le faire une seule fois au debut
1199
+    $query_start = "INSERT INTO $table ";
1200
+    $query_start = Sqlite::traduire_requete($query_start, $serveur);
1201
+
1202
+    // ouvrir une transaction
1203
+    if ($requeter) {
1204
+        Sqlite::demarrer_transaction($serveur);
1205
+    }
1206
+
1207
+    while ($couples = array_shift($tab_couples)) {
1208
+        foreach ($couples as $champ => $val) {
1209
+            $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]);
1210
+        }
1211
+
1212
+        // inserer les champs timestamp par defaut
1213
+        $couples = array_merge($maj, $couples);
1214
+
1215
+        $champs = $valeurs = '';
1216
+        if (count($couples)) {
1217
+            $champs = '(' . join(',', array_keys($couples)) . ')';
1218
+            $valeurs = '(' . join(',', $couples) . ')';
1219
+            $query = $query_start . "$champs VALUES $valeurs";
1220
+        } else {
1221
+            $query = $query_start . 'DEFAULT VALUES';
1222
+        }
1223
+
1224
+        if ($requeter) {
1225
+            $retour = Sqlite::executer_requete($query, $serveur);
1226
+        }
1227
+
1228
+        // sur le dernier couple uniquement
1229
+        if (!count($tab_couples)) {
1230
+            $nb = 0;
1231
+            if ($requeter) {
1232
+                $nb = Sqlite::last_insert_id($serveur);
1233
+            } else {
1234
+                return $query;
1235
+            }
1236
+        }
1237
+
1238
+        $err = spip_sqlite_error($query, $serveur);
1239
+    }
1240
+
1241
+    if ($requeter) {
1242
+        Sqlite::finir_transaction($serveur);
1243
+    }
1244
+
1245
+    // renvoie le dernier id d'autoincrement ajoute
1246
+    // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage
1247
+    return isset($_GET['var_profile']) ? $retour : $nb;
1248 1248
 }
1249 1249
 
1250 1250
 
@@ -1260,7 +1260,7 @@  discard block
 block discarded – undo
1260 1260
  **/
1261 1261
 function spip_sqlite_preferer_transaction($serveur = '', $requeter = true)
1262 1262
 {
1263
-	return true;
1263
+    return true;
1264 1264
 }
1265 1265
 
1266 1266
 /**
@@ -1278,12 +1278,12 @@  discard block
 block discarded – undo
1278 1278
  **/
1279 1279
 function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true)
1280 1280
 {
1281
-	if (!$requeter) {
1282
-		return 'BEGIN TRANSACTION';
1283
-	}
1284
-	Sqlite::demarrer_transaction($serveur);
1281
+    if (!$requeter) {
1282
+        return 'BEGIN TRANSACTION';
1283
+    }
1284
+    Sqlite::demarrer_transaction($serveur);
1285 1285
 
1286
-	return true;
1286
+    return true;
1287 1287
 }
1288 1288
 
1289 1289
 /**
@@ -1298,12 +1298,12 @@  discard block
 block discarded – undo
1298 1298
  **/
1299 1299
 function spip_sqlite_terminer_transaction($serveur = '', $requeter = true)
1300 1300
 {
1301
-	if (!$requeter) {
1302
-		return 'COMMIT';
1303
-	}
1304
-	Sqlite::finir_transaction($serveur);
1301
+    if (!$requeter) {
1302
+        return 'COMMIT';
1303
+    }
1304
+    Sqlite::finir_transaction($serveur);
1305 1305
 
1306
-	return true;
1306
+    return true;
1307 1307
 }
1308 1308
 
1309 1309
 
@@ -1319,27 +1319,27 @@  discard block
 block discarded – undo
1319 1319
  **/
1320 1320
 function spip_sqlite_listdbs($serveur = '', $requeter = true)
1321 1321
 {
1322
-	_sqlite_init();
1323
-
1324
-	if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1325
-		return [];
1326
-	}
1327
-
1328
-	include_spip('inc/flock');
1329
-	$bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1330
-	$bds = [];
1331
-
1332
-	foreach ($bases as $b) {
1333
-		// pas de bases commencant pas sqlite
1334
-		// (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1335
-		// les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1336
-		if (strpos($b, '_sqlite')) {
1337
-			continue;
1338
-		}
1339
-		$bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1340
-	}
1341
-
1342
-	return $bds;
1322
+    _sqlite_init();
1323
+
1324
+    if (!is_dir($d = substr(_DIR_DB, 0, -1))) {
1325
+        return [];
1326
+    }
1327
+
1328
+    include_spip('inc/flock');
1329
+    $bases = preg_files($d, $pattern = '(.*)\.sqlite$');
1330
+    $bds = [];
1331
+
1332
+    foreach ($bases as $b) {
1333
+        // pas de bases commencant pas sqlite
1334
+        // (on s'en sert pour l'installation pour simuler la presence d'un serveur)
1335
+        // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite
1336
+        if (strpos($b, '_sqlite')) {
1337
+            continue;
1338
+        }
1339
+        $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b);
1340
+    }
1341
+
1342
+    return $bds;
1343 1343
 }
1344 1344
 
1345 1345
 
@@ -1355,9 +1355,9 @@  discard block
 block discarded – undo
1355 1355
  */
1356 1356
 function spip_sqlite_multi($objet, $lang)
1357 1357
 {
1358
-	$r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1358
+    $r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1359 1359
 
1360
-	return $r;
1360
+    return $r;
1361 1361
 }
1362 1362
 
1363 1363
 
@@ -1375,15 +1375,15 @@  discard block
 block discarded – undo
1375 1375
  **/
1376 1376
 function spip_sqlite_optimize($table, $serveur = '', $requeter = true)
1377 1377
 {
1378
-	static $do = false;
1379
-	if ($requeter and $do) {
1380
-		return true;
1381
-	}
1382
-	if ($requeter) {
1383
-		$do = true;
1384
-	}
1385
-
1386
-	return spip_sqlite_query('VACUUM', $serveur, $requeter);
1378
+    static $do = false;
1379
+    if ($requeter and $do) {
1380
+        return true;
1381
+    }
1382
+    if ($requeter) {
1383
+        $do = true;
1384
+    }
1385
+
1386
+    return spip_sqlite_query('VACUUM', $serveur, $requeter);
1387 1387
 }
1388 1388
 
1389 1389
 
@@ -1401,15 +1401,15 @@  discard block
 block discarded – undo
1401 1401
  */
1402 1402
 function spip_sqlite_quote($v, $type = '')
1403 1403
 {
1404
-	if (!is_array($v)) {
1405
-		return _sqlite_calculer_cite($v, $type);
1406
-	}
1407
-	// si c'est un tableau, le parcourir en propageant le type
1408
-	foreach ($v as $k => $r) {
1409
-		$v[$k] = spip_sqlite_quote($r, $type);
1410
-	}
1411
-
1412
-	return join(',', $v);
1404
+    if (!is_array($v)) {
1405
+        return _sqlite_calculer_cite($v, $type);
1406
+    }
1407
+    // si c'est un tableau, le parcourir en propageant le type
1408
+    foreach ($v as $k => $r) {
1409
+        $v[$k] = spip_sqlite_quote($r, $type);
1410
+    }
1411
+
1412
+    return join(',', $v);
1413 1413
 }
1414 1414
 
1415 1415
 
@@ -1427,9 +1427,9 @@  discard block
 block discarded – undo
1427 1427
  **/
1428 1428
 function spip_sqlite_date_proche($champ, $interval, $unite)
1429 1429
 {
1430
-	$op = (($interval <= 0) ? '>' : '<');
1430
+    $op = (($interval <= 0) ? '>' : '<');
1431 1431
 
1432
-	return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1432
+    return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1433 1433
 }
1434 1434
 
1435 1435
 
@@ -1448,48 +1448,48 @@  discard block
 block discarded – undo
1448 1448
  */
1449 1449
 function spip_sqlite_repair($table, $serveur = '', $requeter = true)
1450 1450
 {
1451
-	if (
1452
-		$desc = spip_sqlite_showtable($table, $serveur)
1453
-		and isset($desc['field'])
1454
-		and is_array($desc['field'])
1455
-	) {
1456
-		foreach ($desc['field'] as $c => $d) {
1457
-			if (
1458
-				preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1459
-				and stripos($d, 'NOT NULL') !== false
1460
-				and stripos($d, 'DEFAULT') === false
1461
-				/* pas touche aux cles primaires */
1462
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1463
-			) {
1464
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1465
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1466
-			}
1467
-			if (
1468
-				preg_match(',^(INTEGER),i', $d)
1469
-				and stripos($d, 'NOT NULL') !== false
1470
-				and stripos($d, 'DEFAULT') === false
1471
-				/* pas touche aux cles primaires */
1472
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1473
-			) {
1474
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1475
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1476
-			}
1477
-			if (
1478
-				preg_match(',^(datetime),i', $d)
1479
-				and stripos($d, 'NOT NULL') !== false
1480
-				and stripos($d, 'DEFAULT') === false
1481
-				/* pas touche aux cles primaires */
1482
-				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1483
-			) {
1484
-				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1485
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1486
-			}
1487
-		}
1488
-
1489
-		return [' OK '];
1490
-	}
1491
-
1492
-	return [' ERROR '];
1451
+    if (
1452
+        $desc = spip_sqlite_showtable($table, $serveur)
1453
+        and isset($desc['field'])
1454
+        and is_array($desc['field'])
1455
+    ) {
1456
+        foreach ($desc['field'] as $c => $d) {
1457
+            if (
1458
+                preg_match(',^(tinytext|mediumtext|text|longtext|varchar|char),i', $d)
1459
+                and stripos($d, 'NOT NULL') !== false
1460
+                and stripos($d, 'DEFAULT') === false
1461
+                /* pas touche aux cles primaires */
1462
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1463
+            ) {
1464
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1465
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1466
+            }
1467
+            if (
1468
+                preg_match(',^(INTEGER),i', $d)
1469
+                and stripos($d, 'NOT NULL') !== false
1470
+                and stripos($d, 'DEFAULT') === false
1471
+                /* pas touche aux cles primaires */
1472
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1473
+            ) {
1474
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1475
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1476
+            }
1477
+            if (
1478
+                preg_match(',^(datetime),i', $d)
1479
+                and stripos($d, 'NOT NULL') !== false
1480
+                and stripos($d, 'DEFAULT') === false
1481
+                /* pas touche aux cles primaires */
1482
+                and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1483
+            ) {
1484
+                spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1485
+                spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1486
+            }
1487
+        }
1488
+
1489
+        return [' OK '];
1490
+    }
1491
+
1492
+    return [' ERROR '];
1493 1493
 }
1494 1494
 
1495 1495
 
@@ -1519,25 +1519,25 @@  discard block
 block discarded – undo
1519 1519
  **/
1520 1520
 function spip_sqlite_replace($table, $couples, $desc = [], $serveur = '', $requeter = true)
1521 1521
 {
1522
-	if (!$desc) {
1523
-		$desc = description_table($table, $serveur);
1524
-	}
1525
-	if (!$desc) {
1526
-		die("$table insertion sans description");
1527
-	}
1528
-	$fields = isset($desc['field']) ? $desc['field'] : [];
1529
-
1530
-	foreach ($couples as $champ => $val) {
1531
-		$couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1532
-	}
1533
-
1534
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1535
-	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1536
-
1537
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1538
-		',',
1539
-		$couples
1540
-	) . ')', $serveur);
1522
+    if (!$desc) {
1523
+        $desc = description_table($table, $serveur);
1524
+    }
1525
+    if (!$desc) {
1526
+        die("$table insertion sans description");
1527
+    }
1528
+    $fields = isset($desc['field']) ? $desc['field'] : [];
1529
+
1530
+    foreach ($couples as $champ => $val) {
1531
+        $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]);
1532
+    }
1533
+
1534
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1535
+    $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1536
+
1537
+    return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1538
+        ',',
1539
+        $couples
1540
+    ) . ')', $serveur);
1541 1541
 }
1542 1542
 
1543 1543
 
@@ -1568,13 +1568,13 @@  discard block
 block discarded – undo
1568 1568
 function spip_sqlite_replace_multi($table, $tab_couples, $desc = [], $serveur = '', $requeter = true)
1569 1569
 {
1570 1570
 
1571
-	// boucler pour trainter chaque requete independemment
1572
-	foreach ($tab_couples as $couples) {
1573
-		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1574
-	}
1571
+    // boucler pour trainter chaque requete independemment
1572
+    foreach ($tab_couples as $couples) {
1573
+        $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter);
1574
+    }
1575 1575
 
1576
-	// renvoie le dernier id
1577
-	return $retour;
1576
+    // renvoie le dernier id
1577
+    return $retour;
1578 1578
 }
1579 1579
 
1580 1580
 
@@ -1601,44 +1601,44 @@  discard block
 block discarded – undo
1601 1601
  *     - array  : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer.
1602 1602
  */
1603 1603
 function spip_sqlite_select(
1604
-	$select,
1605
-	$from,
1606
-	$where = '',
1607
-	$groupby = '',
1608
-	$orderby = '',
1609
-	$limit = '',
1610
-	$having = '',
1611
-	$serveur = '',
1612
-	$requeter = true
1604
+    $select,
1605
+    $from,
1606
+    $where = '',
1607
+    $groupby = '',
1608
+    $orderby = '',
1609
+    $limit = '',
1610
+    $having = '',
1611
+    $serveur = '',
1612
+    $requeter = true
1613 1613
 ) {
1614 1614
 
1615
-	// version() n'est pas connu de sqlite
1616
-	$select = str_replace('version()', 'sqlite_version()', $select);
1617
-
1618
-	// recomposer from
1619
-	$from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1620
-
1621
-	$query =
1622
-		_sqlite_calculer_expression('SELECT', $select, ', ')
1623
-		. _sqlite_calculer_expression('FROM', $from, ', ')
1624
-		. _sqlite_calculer_expression('WHERE', $where)
1625
-		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1626
-		. _sqlite_calculer_expression('HAVING', $having)
1627
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1628
-		. ($limit ? "\nLIMIT $limit" : '');
1629
-
1630
-	// dans un select, on doit renvoyer la requête en cas d'erreur
1631
-	$res = spip_sqlite_query($query, $serveur, $requeter);
1632
-	// texte de la requete demande ?
1633
-	if (!$requeter) {
1634
-		return $res;
1635
-	}
1636
-	// erreur survenue ?
1637
-	if ($res === false) {
1638
-		return Sqlite::traduire_requete($query, $serveur);
1639
-	}
1640
-
1641
-	return $res;
1615
+    // version() n'est pas connu de sqlite
1616
+    $select = str_replace('version()', 'sqlite_version()', $select);
1617
+
1618
+    // recomposer from
1619
+    $from = (!is_array($from) ? $from : _sqlite_calculer_select_as($from));
1620
+
1621
+    $query =
1622
+        _sqlite_calculer_expression('SELECT', $select, ', ')
1623
+        . _sqlite_calculer_expression('FROM', $from, ', ')
1624
+        . _sqlite_calculer_expression('WHERE', $where)
1625
+        . _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1626
+        . _sqlite_calculer_expression('HAVING', $having)
1627
+        . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1628
+        . ($limit ? "\nLIMIT $limit" : '');
1629
+
1630
+    // dans un select, on doit renvoyer la requête en cas d'erreur
1631
+    $res = spip_sqlite_query($query, $serveur, $requeter);
1632
+    // texte de la requete demande ?
1633
+    if (!$requeter) {
1634
+        return $res;
1635
+    }
1636
+    // erreur survenue ?
1637
+    if ($res === false) {
1638
+        return Sqlite::traduire_requete($query, $serveur);
1639
+    }
1640
+
1641
+    return $res;
1642 1642
 }
1643 1643
 
1644 1644
 
@@ -1658,32 +1658,32 @@  discard block
 block discarded – undo
1658 1658
  **/
1659 1659
 function spip_sqlite_selectdb($db, $serveur = '', $requeter = true)
1660 1660
 {
1661
-	_sqlite_init();
1662
-
1663
-	// interdire la creation d'une nouvelle base,
1664
-	// sauf si on est dans l'installation
1665
-	if (
1666
-		!is_file($f = _DIR_DB . $db . '.sqlite')
1667
-		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1668
-	) {
1669
-		spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1670
-
1671
-		return false;
1672
-	}
1673
-
1674
-	// se connecter a la base indiquee
1675
-	// avec les identifiants connus
1676
-	$index = $serveur ? $serveur : 0;
1677
-
1678
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1679
-		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1680
-			return $db;
1681
-		}
1682
-	} else {
1683
-		spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1684
-	}
1685
-
1686
-	return false;
1661
+    _sqlite_init();
1662
+
1663
+    // interdire la creation d'une nouvelle base,
1664
+    // sauf si on est dans l'installation
1665
+    if (
1666
+        !is_file($f = _DIR_DB . $db . '.sqlite')
1667
+        && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1668
+    ) {
1669
+        spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1670
+
1671
+        return false;
1672
+    }
1673
+
1674
+    // se connecter a la base indiquee
1675
+    // avec les identifiants connus
1676
+    $index = $serveur ? $serveur : 0;
1677
+
1678
+    if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1679
+        if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1680
+            return $db;
1681
+        }
1682
+    } else {
1683
+        spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1684
+    }
1685
+
1686
+    return false;
1687 1687
 }
1688 1688
 
1689 1689
 
@@ -1699,8 +1699,8 @@  discard block
 block discarded – undo
1699 1699
  */
1700 1700
 function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true)
1701 1701
 {
1702
-	# spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1703
-	# return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1702
+    # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR);
1703
+    # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas !
1704 1704
 }
1705 1705
 
1706 1706
 
@@ -1719,24 +1719,24 @@  discard block
 block discarded – undo
1719 1719
  **/
1720 1720
 function spip_sqlite_showbase($match, $serveur = '', $requeter = true)
1721 1721
 {
1722
-	// type est le type d'entrée : table / index / view
1723
-	// on ne retourne que les tables (?) et non les vues...
1724
-	# ESCAPE non supporte par les versions sqlite <3
1725
-	#	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1726
-	$match = preg_quote($match);
1727
-	$match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1728
-	$match = str_replace('\\\%', '[[POURCENT]]', $match);
1729
-	$match = str_replace('_', '.', $match);
1730
-	$match = str_replace('%', '.*', $match);
1731
-	$match = str_replace('[[TIRETBAS]]', '_', $match);
1732
-	$match = str_replace('[[POURCENT]]', '%', $match);
1733
-	$match = "^$match$";
1734
-
1735
-	return spip_sqlite_query(
1736
-		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1737
-		$serveur,
1738
-		$requeter
1739
-	);
1722
+    // type est le type d'entrée : table / index / view
1723
+    // on ne retourne que les tables (?) et non les vues...
1724
+    # ESCAPE non supporte par les versions sqlite <3
1725
+    #	return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name LIKE "._q($match)." ESCAPE '\'", $serveur, $requeter);
1726
+    $match = preg_quote($match);
1727
+    $match = str_replace('\\\_', '[[TIRETBAS]]', $match);
1728
+    $match = str_replace('\\\%', '[[POURCENT]]', $match);
1729
+    $match = str_replace('_', '.', $match);
1730
+    $match = str_replace('%', '.*', $match);
1731
+    $match = str_replace('[[TIRETBAS]]', '_', $match);
1732
+    $match = str_replace('[[POURCENT]]', '%', $match);
1733
+    $match = "^$match$";
1734
+
1735
+    return spip_sqlite_query(
1736
+        "SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1737
+        $serveur,
1738
+        $requeter
1739
+    );
1740 1740
 }
1741 1741
 
1742 1742
 /**
@@ -1755,19 +1755,19 @@  discard block
 block discarded – undo
1755 1755
  **/
1756 1756
 function spip_sqlite_table_exists(string $table, $serveur = '', $requeter = true)
1757 1757
 {
1758
-	$r = spip_sqlite_query(
1759
-		'SELECT name FROM sqlite_master WHERE'
1760
-			. ' type=\'table\''
1761
-			. ' AND name=' . spip_sqlite_quote($table, 'string')
1762
-			. ' AND name NOT LIKE \'sqlite_%\'',
1763
-		$serveur,
1764
-		$requeter
1765
-	);
1766
-	if (!$requeter) {
1767
-		return $r;
1768
-	}
1769
-	$res = spip_sqlite_fetch($r);
1770
-	return (bool) $res;
1758
+    $r = spip_sqlite_query(
1759
+        'SELECT name FROM sqlite_master WHERE'
1760
+            . ' type=\'table\''
1761
+            . ' AND name=' . spip_sqlite_quote($table, 'string')
1762
+            . ' AND name NOT LIKE \'sqlite_%\'',
1763
+        $serveur,
1764
+        $requeter
1765
+    );
1766
+    if (!$requeter) {
1767
+        return $r;
1768
+    }
1769
+    $res = spip_sqlite_fetch($r);
1770
+    return (bool) $res;
1771 1771
 }
1772 1772
 
1773 1773
 define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/');
@@ -1791,129 +1791,129 @@  discard block
 block discarded – undo
1791 1791
  */
1792 1792
 function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true)
1793 1793
 {
1794
-	$query =
1795
-		'SELECT sql, type FROM'
1796
-		. ' (SELECT * FROM sqlite_master UNION ALL'
1797
-		. ' SELECT * FROM sqlite_temp_master)'
1798
-		. " WHERE tbl_name LIKE '$nom_table'"
1799
-		. " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1800
-		. ' ORDER BY substr(type,2,1), name';
1801
-
1802
-	$a = spip_sqlite_query($query, $serveur, $requeter);
1803
-	if (!$a) {
1804
-		return '';
1805
-	}
1806
-	if (!$requeter) {
1807
-		return $a;
1808
-	}
1809
-	if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1810
-		return '';
1811
-	}
1812
-	$vue = ($a['type'] == 'view'); // table | vue
1813
-
1814
-	// c'est une table
1815
-	// il faut parser le create
1816
-	if (!$vue) {
1817
-		if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1818
-			return '';
1819
-		} else {
1820
-			$desc = $r[1];
1821
-			// extraction d'une KEY éventuelle en prenant garde de ne pas
1822
-			// relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1823
-			if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1824
-				$namedkeys = $r[2];
1825
-				$desc = $r[1];
1826
-			} else {
1827
-				$namedkeys = '';
1828
-			}
1829
-
1830
-			$fields = [];
1831
-			$keys = [];
1832
-
1833
-			// enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1834
-			// par exemple s'il contiennent une virgule.
1835
-			// /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1836
-			list($desc, $echaps) = query_echappe_textes($desc);
1837
-
1838
-			// separer toutes les descriptions de champs, separes par des virgules
1839
-			# /!\ explode peut exploser aussi DECIMAL(10,2) !
1840
-			$k_precedent = null;
1841
-			foreach (explode(',', $desc) as $v) {
1842
-				preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1843
-				// Les cles de champs peuvent etre entourees
1844
-				// de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1845
-				// http://www.sqlite.org/lang_keywords.html
1846
-				$k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1847
-				if ($char = strpbrk($k[0], '\'"[`')) {
1848
-					$k = trim($k, $char);
1849
-					if ($char == '[') {
1850
-						$k = rtrim($k, ']');
1851
-					}
1852
-				}
1853
-				$def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1854
-
1855
-				// rustine pour DECIMAL(10,2)
1856
-				// s'il y a une parenthèse fermante dans la clé
1857
-				// ou dans la définition sans qu'il n'y ait une ouverture avant
1858
-				if (str_contains($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1859
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1860
-					continue;
1861
-				}
1862
-
1863
-				// la primary key peut etre dans une des descriptions de champs
1864
-				// et non en fin de table, cas encore decouvert avec Sqlite Manager
1865
-				if (stripos($r[2], 'PRIMARY KEY') !== false) {
1866
-					$keys['PRIMARY KEY'] = $k;
1867
-				}
1868
-
1869
-				$fields[$k] = $def;
1870
-				$k_precedent = $k;
1871
-			}
1872
-			// key inclues dans la requete
1873
-			foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1874
-				if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1875
-					$k = str_replace('`', '', trim($r[1]));
1876
-					$t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1877
-					if ($k && !isset($keys[$k])) {
1878
-						$keys[$k] = $t;
1879
-					} else {
1880
-						$keys[] = $t;
1881
-					}
1882
-				}
1883
-			}
1884
-			// sinon ajouter les key index
1885
-			$query =
1886
-				'SELECT name,sql FROM'
1887
-				. ' (SELECT * FROM sqlite_master UNION ALL'
1888
-				. ' SELECT * FROM sqlite_temp_master)'
1889
-				. " WHERE tbl_name LIKE '$nom_table'"
1890
-				. " AND type='index' AND name NOT LIKE 'sqlite_%'"
1891
-				. 'ORDER BY substr(type,2,1), name';
1892
-			$a = spip_sqlite_query($query, $serveur, $requeter);
1893
-			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1894
-				$key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1895
-				$keytype = 'KEY';
1896
-				if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1897
-					$keytype = 'UNIQUE KEY';
1898
-				}
1899
-				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1900
-				$keys[$keytype . ' ' . $key] = $colonnes;
1901
-			}
1902
-		}
1903
-	} // c'est une vue, on liste les champs disponibles simplement
1904
-	else {
1905
-		if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1906
-			$fields = [];
1907
-			foreach ($res as $c => $v) {
1908
-				$fields[$c] = '';
1909
-			}
1910
-			$keys = [];
1911
-		} else {
1912
-			return '';
1913
-		}
1914
-	}
1915
-
1916
-	return ['field' => $fields, 'key' => $keys];
1794
+    $query =
1795
+        'SELECT sql, type FROM'
1796
+        . ' (SELECT * FROM sqlite_master UNION ALL'
1797
+        . ' SELECT * FROM sqlite_temp_master)'
1798
+        . " WHERE tbl_name LIKE '$nom_table'"
1799
+        . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'"
1800
+        . ' ORDER BY substr(type,2,1), name';
1801
+
1802
+    $a = spip_sqlite_query($query, $serveur, $requeter);
1803
+    if (!$a) {
1804
+        return '';
1805
+    }
1806
+    if (!$requeter) {
1807
+        return $a;
1808
+    }
1809
+    if (!($a = spip_sqlite_fetch($a, null, $serveur))) {
1810
+        return '';
1811
+    }
1812
+    $vue = ($a['type'] == 'view'); // table | vue
1813
+
1814
+    // c'est une table
1815
+    // il faut parser le create
1816
+    if (!$vue) {
1817
+        if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) {
1818
+            return '';
1819
+        } else {
1820
+            $desc = $r[1];
1821
+            // extraction d'une KEY éventuelle en prenant garde de ne pas
1822
+            // relever un champ dont le nom contient KEY (ex. ID_WHISKEY)
1823
+            if (preg_match('/^(.*?),([^,]*\sKEY[ (].*)$/s', $desc, $r)) {
1824
+                $namedkeys = $r[2];
1825
+                $desc = $r[1];
1826
+            } else {
1827
+                $namedkeys = '';
1828
+            }
1829
+
1830
+            $fields = [];
1831
+            $keys = [];
1832
+
1833
+            // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber
1834
+            // par exemple s'il contiennent une virgule.
1835
+            // /!\ cela peut aussi echapper le nom des champs si la table a eu des operations avec SQLite Manager !
1836
+            list($desc, $echaps) = query_echappe_textes($desc);
1837
+
1838
+            // separer toutes les descriptions de champs, separes par des virgules
1839
+            # /!\ explode peut exploser aussi DECIMAL(10,2) !
1840
+            $k_precedent = null;
1841
+            foreach (explode(',', $desc) as $v) {
1842
+                preg_match('/^\s*([^\s]+)\s+(.*)/', $v, $r);
1843
+                // Les cles de champs peuvent etre entourees
1844
+                // de guillements doubles " , simples ', graves ` ou de crochets [ ],  ou rien.
1845
+                // http://www.sqlite.org/lang_keywords.html
1846
+                $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]...
1847
+                if ($char = strpbrk($k[0], '\'"[`')) {
1848
+                    $k = trim($k, $char);
1849
+                    if ($char == '[') {
1850
+                        $k = rtrim($k, ']');
1851
+                    }
1852
+                }
1853
+                $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ
1854
+
1855
+                // rustine pour DECIMAL(10,2)
1856
+                // s'il y a une parenthèse fermante dans la clé
1857
+                // ou dans la définition sans qu'il n'y ait une ouverture avant
1858
+                if (str_contains($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1859
+                    $fields[$k_precedent] .= ',' . $k . ' ' . $def;
1860
+                    continue;
1861
+                }
1862
+
1863
+                // la primary key peut etre dans une des descriptions de champs
1864
+                // et non en fin de table, cas encore decouvert avec Sqlite Manager
1865
+                if (stripos($r[2], 'PRIMARY KEY') !== false) {
1866
+                    $keys['PRIMARY KEY'] = $k;
1867
+                }
1868
+
1869
+                $fields[$k] = $def;
1870
+                $k_precedent = $k;
1871
+            }
1872
+            // key inclues dans la requete
1873
+            foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) {
1874
+                if (preg_match('/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/', $v, $r)) {
1875
+                    $k = str_replace('`', '', trim($r[1]));
1876
+                    $t = trim(strtolower(str_replace('`', '', $r[2])), '"');
1877
+                    if ($k && !isset($keys[$k])) {
1878
+                        $keys[$k] = $t;
1879
+                    } else {
1880
+                        $keys[] = $t;
1881
+                    }
1882
+                }
1883
+            }
1884
+            // sinon ajouter les key index
1885
+            $query =
1886
+                'SELECT name,sql FROM'
1887
+                . ' (SELECT * FROM sqlite_master UNION ALL'
1888
+                . ' SELECT * FROM sqlite_temp_master)'
1889
+                . " WHERE tbl_name LIKE '$nom_table'"
1890
+                . " AND type='index' AND name NOT LIKE 'sqlite_%'"
1891
+                . 'ORDER BY substr(type,2,1), name';
1892
+            $a = spip_sqlite_query($query, $serveur, $requeter);
1893
+            while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1894
+                $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1895
+                $keytype = 'KEY';
1896
+                if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1897
+                    $keytype = 'UNIQUE KEY';
1898
+                }
1899
+                $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1900
+                $keys[$keytype . ' ' . $key] = $colonnes;
1901
+            }
1902
+        }
1903
+    } // c'est une vue, on liste les champs disponibles simplement
1904
+    else {
1905
+        if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1
1906
+            $fields = [];
1907
+            foreach ($res as $c => $v) {
1908
+                $fields[$c] = '';
1909
+            }
1910
+            $keys = [];
1911
+        } else {
1912
+            return '';
1913
+        }
1914
+    }
1915
+
1916
+    return ['field' => $fields, 'key' => $keys];
1917 1917
 }
1918 1918
 
1919 1919
 
@@ -1940,24 +1940,24 @@  discard block
 block discarded – undo
1940 1940
  */
1941 1941
 function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true)
1942 1942
 {
1943
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1944
-	$champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1945
-
1946
-	$set = [];
1947
-	foreach ($champs as $champ => $val) {
1948
-		$set[] = $champ . "=$val";
1949
-	}
1950
-	if (!empty($set)) {
1951
-		return spip_sqlite_query(
1952
-			_sqlite_calculer_expression('UPDATE', $table, ',')
1953
-				. _sqlite_calculer_expression('SET', $set, ',')
1954
-				. _sqlite_calculer_expression('WHERE', $where),
1955
-			$serveur,
1956
-			$requeter
1957
-		);
1958
-	}
1959
-
1960
-	return false;
1943
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1944
+    $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur);
1945
+
1946
+    $set = [];
1947
+    foreach ($champs as $champ => $val) {
1948
+        $set[] = $champ . "=$val";
1949
+    }
1950
+    if (!empty($set)) {
1951
+        return spip_sqlite_query(
1952
+            _sqlite_calculer_expression('UPDATE', $table, ',')
1953
+                . _sqlite_calculer_expression('SET', $set, ',')
1954
+                . _sqlite_calculer_expression('WHERE', $where),
1955
+            $serveur,
1956
+            $requeter
1957
+        );
1958
+    }
1959
+
1960
+    return false;
1961 1961
 }
1962 1962
 
1963 1963
 
@@ -1988,38 +1988,38 @@  discard block
 block discarded – undo
1988 1988
 function spip_sqlite_updateq($table, $champs, $where = '', $desc = [], $serveur = '', $requeter = true)
1989 1989
 {
1990 1990
 
1991
-	if (!$champs) {
1992
-		return;
1993
-	}
1994
-	if (!$desc) {
1995
-		$desc = description_table($table, $serveur);
1996
-	}
1997
-	if (!$desc) {
1998
-		die("$table insertion sans description");
1999
-	}
2000
-	$fields = $desc['field'];
2001
-
2002
-	$set = [];
2003
-	foreach ($champs as $champ => $val) {
2004
-		$set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
2005
-	}
2006
-
2007
-	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
2008
-	// attention ils sont deja quotes
2009
-	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
2010
-	foreach ($maj as $champ => $val) {
2011
-		if (!isset($set[$champ])) {
2012
-			$set[$champ] = $champ . '=' . $val;
2013
-		}
2014
-	}
2015
-
2016
-	return spip_sqlite_query(
2017
-		_sqlite_calculer_expression('UPDATE', $table, ',')
2018
-			. _sqlite_calculer_expression('SET', $set, ',')
2019
-			. _sqlite_calculer_expression('WHERE', $where),
2020
-		$serveur,
2021
-		$requeter
2022
-	);
1991
+    if (!$champs) {
1992
+        return;
1993
+    }
1994
+    if (!$desc) {
1995
+        $desc = description_table($table, $serveur);
1996
+    }
1997
+    if (!$desc) {
1998
+        die("$table insertion sans description");
1999
+    }
2000
+    $fields = $desc['field'];
2001
+
2002
+    $set = [];
2003
+    foreach ($champs as $champ => $val) {
2004
+        $set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
2005
+    }
2006
+
2007
+    // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
2008
+    // attention ils sont deja quotes
2009
+    $maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
2010
+    foreach ($maj as $champ => $val) {
2011
+        if (!isset($set[$champ])) {
2012
+            $set[$champ] = $champ . '=' . $val;
2013
+        }
2014
+    }
2015
+
2016
+    return spip_sqlite_query(
2017
+        _sqlite_calculer_expression('UPDATE', $table, ',')
2018
+            . _sqlite_calculer_expression('SET', $set, ',')
2019
+            . _sqlite_calculer_expression('WHERE', $where),
2020
+        $serveur,
2021
+        $requeter
2022
+    );
2023 2023
 }
2024 2024
 
2025 2025
 
@@ -2038,17 +2038,17 @@  discard block
 block discarded – undo
2038 2038
  */
2039 2039
 function _sqlite_init()
2040 2040
 {
2041
-	if (!defined('_DIR_DB')) {
2042
-		define('_DIR_DB', _DIR_ETC . 'bases/');
2043
-	}
2044
-	if (!defined('_SQLITE_CHMOD')) {
2045
-		define('_SQLITE_CHMOD', _SPIP_CHMOD);
2046
-	}
2047
-
2048
-	if (!is_dir($d = _DIR_DB)) {
2049
-		include_spip('inc/flock');
2050
-		sous_repertoire($d);
2051
-	}
2041
+    if (!defined('_DIR_DB')) {
2042
+        define('_DIR_DB', _DIR_ETC . 'bases/');
2043
+    }
2044
+    if (!defined('_SQLITE_CHMOD')) {
2045
+        define('_SQLITE_CHMOD', _SPIP_CHMOD);
2046
+    }
2047
+
2048
+    if (!is_dir($d = _DIR_DB)) {
2049
+        include_spip('inc/flock');
2050
+        sous_repertoire($d);
2051
+    }
2052 2052
 }
2053 2053
 
2054 2054
 
@@ -2063,20 +2063,20 @@  discard block
 block discarded – undo
2063 2063
  */
2064 2064
 function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true)
2065 2065
 {
2066
-	if ($link === '') {
2067
-		$link = _sqlite_link($serveur);
2068
-	}
2069
-	if (!$link) {
2070
-		return false;
2071
-	}
2066
+    if ($link === '') {
2067
+        $link = _sqlite_link($serveur);
2068
+    }
2069
+    if (!$link) {
2070
+        return false;
2071
+    }
2072 2072
 
2073
-	$v = 3;
2073
+    $v = 3;
2074 2074
 
2075
-	if (!$version) {
2076
-		return $v;
2077
-	}
2075
+    if (!$version) {
2076
+        return $v;
2077
+    }
2078 2078
 
2079
-	return ($version == $v);
2079
+    return ($version == $v);
2080 2080
 }
2081 2081
 
2082 2082
 
@@ -2088,9 +2088,9 @@  discard block
 block discarded – undo
2088 2088
  */
2089 2089
 function _sqlite_link($serveur = '')
2090 2090
 {
2091
-	$link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2091
+    $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link'];
2092 2092
 
2093
-	return $link;
2093
+    return $link;
2094 2094
 }
2095 2095
 
2096 2096
 
@@ -2106,54 +2106,54 @@  discard block
 block discarded – undo
2106 2106
  */
2107 2107
 function _sqlite_calculer_cite($v, $type)
2108 2108
 {
2109
-	if ($type) {
2110
-		if (
2111
-			is_null($v)
2112
-			and stripos($type, 'NOT NULL') === false
2113
-		) {
2114
-			// null php se traduit en NULL SQL
2115
-			return 'NULL';
2116
-		}
2117
-
2118
-		if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2119
-			return $v;
2120
-		}
2121
-		if (sql_test_int($type)) {
2122
-			if (is_numeric($v)) {
2123
-				return $v;
2124
-			} elseif ($v === null) {
2125
-				return 0;
2126
-			} elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) === 0) {
2127
-				return hexdec(substr($v, 2));
2128
-			} else {
2129
-				return intval($v);
2130
-			}
2131
-		}
2132
-	} else {
2133
-		// si on ne connait pas le type on le deduit de $v autant que possible
2134
-		if (is_bool($v)) {
2135
-			return strval(intval($v));
2136
-		} elseif (is_numeric($v)) {
2137
-			return strval($v);
2138
-		}
2139
-	}
2140
-
2141
-	// trouver un link sqlite pour faire l'echappement
2142
-	foreach ($GLOBALS['connexions'] as $s) {
2143
-		if (
2144
-			$l = $s['link']
2145
-			and is_object($l)
2146
-			and $l instanceof \PDO
2147
-			and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2148
-		) {
2149
-			return $l->quote($v ?? '');
2150
-		}
2151
-	}
2152
-
2153
-	// echapper les ' en ''
2154
-	spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2155
-
2156
-	return ("'" . str_replace("'", "''", $v) . "'");
2109
+    if ($type) {
2110
+        if (
2111
+            is_null($v)
2112
+            and stripos($type, 'NOT NULL') === false
2113
+        ) {
2114
+            // null php se traduit en NULL SQL
2115
+            return 'NULL';
2116
+        }
2117
+
2118
+        if (sql_test_date($type) and preg_match('/^\w+\(/', $v)) {
2119
+            return $v;
2120
+        }
2121
+        if (sql_test_int($type)) {
2122
+            if (is_numeric($v)) {
2123
+                return $v;
2124
+            } elseif ($v === null) {
2125
+                return 0;
2126
+            } elseif (ctype_xdigit(substr($v, 2)) and strncmp($v, '0x', 2) === 0) {
2127
+                return hexdec(substr($v, 2));
2128
+            } else {
2129
+                return intval($v);
2130
+            }
2131
+        }
2132
+    } else {
2133
+        // si on ne connait pas le type on le deduit de $v autant que possible
2134
+        if (is_bool($v)) {
2135
+            return strval(intval($v));
2136
+        } elseif (is_numeric($v)) {
2137
+            return strval($v);
2138
+        }
2139
+    }
2140
+
2141
+    // trouver un link sqlite pour faire l'echappement
2142
+    foreach ($GLOBALS['connexions'] as $s) {
2143
+        if (
2144
+            $l = $s['link']
2145
+            and is_object($l)
2146
+            and $l instanceof \PDO
2147
+            and $l->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'sqlite'
2148
+        ) {
2149
+            return $l->quote($v ?? '');
2150
+        }
2151
+    }
2152
+
2153
+    // echapper les ' en ''
2154
+    spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2155
+
2156
+    return ("'" . str_replace("'", "''", $v) . "'");
2157 2157
 }
2158 2158
 
2159 2159
 
@@ -2170,21 +2170,21 @@  discard block
 block discarded – undo
2170 2170
  */
2171 2171
 function _sqlite_calculer_expression($expression, $v, $join = 'AND')
2172 2172
 {
2173
-	if (empty($v)) {
2174
-		return '';
2175
-	}
2176
-
2177
-	$exp = "\n$expression ";
2178
-
2179
-	if (!is_array($v)) {
2180
-		return $exp . $v;
2181
-	} else {
2182
-		if (strtoupper($join) === 'AND') {
2183
-			return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2184
-		} else {
2185
-			return $exp . join($join, $v);
2186
-		}
2187
-	}
2173
+    if (empty($v)) {
2174
+        return '';
2175
+    }
2176
+
2177
+    $exp = "\n$expression ";
2178
+
2179
+    if (!is_array($v)) {
2180
+        return $exp . $v;
2181
+    } else {
2182
+        if (strtoupper($join) === 'AND') {
2183
+            return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2184
+        } else {
2185
+            return $exp . join($join, $v);
2186
+        }
2187
+    }
2188 2188
 }
2189 2189
 
2190 2190
 
@@ -2201,7 +2201,7 @@  discard block
 block discarded – undo
2201 2201
  */
2202 2202
 function _sqlite_calculer_order($orderby)
2203 2203
 {
2204
-	return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2204
+    return (is_array($orderby)) ? join(', ', $orderby) : $orderby;
2205 2205
 }
2206 2206
 
2207 2207
 
@@ -2213,26 +2213,26 @@  discard block
 block discarded – undo
2213 2213
  */
2214 2214
 function _sqlite_calculer_select_as($args)
2215 2215
 {
2216
-	$res = '';
2217
-	foreach ($args as $k => $v) {
2218
-		if (substr($k, -1) == '@') {
2219
-			// c'est une jointure qui se refere au from precedent
2220
-			// pas de virgule
2221
-			$res .= '  ' . $v;
2222
-		} else {
2223
-			if (!is_numeric($k)) {
2224
-				$p = strpos($v, ' ');
2225
-				if ($p) {
2226
-					$v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2227
-				} else {
2228
-					$v .= " AS '$k'";
2229
-				}
2230
-			}
2231
-			$res .= ', ' . $v;
2232
-		}
2233
-	}
2234
-
2235
-	return substr($res, 2);
2216
+    $res = '';
2217
+    foreach ($args as $k => $v) {
2218
+        if (substr($k, -1) == '@') {
2219
+            // c'est une jointure qui se refere au from precedent
2220
+            // pas de virgule
2221
+            $res .= '  ' . $v;
2222
+        } else {
2223
+            if (!is_numeric($k)) {
2224
+                $p = strpos($v, ' ');
2225
+                if ($p) {
2226
+                    $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2227
+                } else {
2228
+                    $v .= " AS '$k'";
2229
+                }
2230
+            }
2231
+            $res .= ', ' . $v;
2232
+        }
2233
+    }
2234
+
2235
+    return substr($res, 2);
2236 2236
 }
2237 2237
 
2238 2238
 
@@ -2256,26 +2256,26 @@  discard block
 block discarded – undo
2256 2256
  */
2257 2257
 function _sqlite_calculer_where($v)
2258 2258
 {
2259
-	if (!is_array($v)) {
2260
-		return $v;
2261
-	}
2262
-
2263
-	$op = array_shift($v);
2264
-	if (!($n = count($v))) {
2265
-		return $op;
2266
-	} else {
2267
-		$arg = _sqlite_calculer_where(array_shift($v));
2268
-		if ($n == 1) {
2269
-			return "$op($arg)";
2270
-		} else {
2271
-			$arg2 = _sqlite_calculer_where(array_shift($v));
2272
-			if ($n == 2) {
2273
-				return "($arg $op $arg2)";
2274
-			} else {
2275
-				return "($arg $op ($arg2) : $v[0])";
2276
-			}
2277
-		}
2278
-	}
2259
+    if (!is_array($v)) {
2260
+        return $v;
2261
+    }
2262
+
2263
+    $op = array_shift($v);
2264
+    if (!($n = count($v))) {
2265
+        return $op;
2266
+    } else {
2267
+        $arg = _sqlite_calculer_where(array_shift($v));
2268
+        if ($n == 1) {
2269
+            return "$op($arg)";
2270
+        } else {
2271
+            $arg2 = _sqlite_calculer_where(array_shift($v));
2272
+            if ($n == 2) {
2273
+                return "($arg $op $arg2)";
2274
+            } else {
2275
+                return "($arg $op ($arg2) : $v[0])";
2276
+            }
2277
+        }
2278
+    }
2279 2279
 }
2280 2280
 
2281 2281
 
@@ -2291,19 +2291,19 @@  discard block
 block discarded – undo
2291 2291
  */
2292 2292
 function _sqlite_charger_version($version = '')
2293 2293
 {
2294
-	$versions = [];
2295
-
2296
-	// version 3
2297
-	if (!$version || $version == 3) {
2298
-		if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2299
-			$versions[] = 3;
2300
-		}
2301
-	}
2302
-	if ($version) {
2303
-		return in_array($version, $versions);
2304
-	}
2305
-
2306
-	return $versions;
2294
+    $versions = [];
2295
+
2296
+    // version 3
2297
+    if (!$version || $version == 3) {
2298
+        if (extension_loaded('pdo') && extension_loaded('pdo_sqlite')) {
2299
+            $versions[] = 3;
2300
+        }
2301
+    }
2302
+    if ($version) {
2303
+        return in_array($version, $versions);
2304
+    }
2305
+
2306
+    return $versions;
2307 2307
 }
2308 2308
 
2309 2309
 
@@ -2342,147 +2342,147 @@  discard block
 block discarded – undo
2342 2342
 function _sqlite_modifier_table($table, $colonne, $opt = [], $serveur = '')
2343 2343
 {
2344 2344
 
2345
-	if (is_array($table)) {
2346
-		$table_destination = reset($table);
2347
-		$table_origine = key($table);
2348
-	} else {
2349
-		$table_origine = $table_destination = $table;
2350
-	}
2351
-	// ne prend actuellement qu'un changement
2352
-	// mais pourra etre adapte pour changer plus qu'une colonne a la fois
2353
-	if (is_array($colonne)) {
2354
-		$colonne_destination = reset($colonne);
2355
-		$colonne_origine = key($colonne);
2356
-	} else {
2357
-		$colonne_origine = $colonne_destination = $colonne;
2358
-	}
2359
-	if (!isset($opt['field'])) {
2360
-		$opt['field'] = [];
2361
-	}
2362
-	if (!isset($opt['key'])) {
2363
-		$opt['key'] = [];
2364
-	}
2365
-
2366
-	// si les noms de tables sont differents, pas besoin de table temporaire
2367
-	// on prendra directement le nom de la future table
2368
-	$meme_table = ($table_origine == $table_destination);
2369
-
2370
-	$def_origine = sql_showtable($table_origine, false, $serveur);
2371
-	if (!$def_origine or !isset($def_origine['field'])) {
2372
-		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2373
-
2374
-		return false;
2375
-	}
2376
-
2377
-
2378
-	$table_tmp = $table_origine . '_tmp';
2379
-
2380
-	// 1) creer une table temporaire avec les modifications
2381
-	// - DROP : suppression de la colonne
2382
-	// - CHANGE : modification de la colonne
2383
-	// (foreach pour conserver l'ordre des champs)
2384
-
2385
-	// field
2386
-	$fields = [];
2387
-	// pour le INSERT INTO plus loin
2388
-	// stocker la correspondance nouvelles->anciennes colonnes
2389
-	$fields_correspondances = [];
2390
-	foreach ($def_origine['field'] as $c => $d) {
2391
-		if ($colonne_origine && ($c == $colonne_origine)) {
2392
-			// si pas DROP
2393
-			if ($colonne_destination) {
2394
-				$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2395
-				$fields_correspondances[$colonne_destination] = $c;
2396
-			}
2397
-		} else {
2398
-			$fields[$c] = $d;
2399
-			$fields_correspondances[$c] = $c;
2400
-		}
2401
-	}
2402
-	// cas de ADD sqlite2 (ajout du champ en fin de table):
2403
-	if (!$colonne_origine && $colonne_destination) {
2404
-		$fields[$colonne_destination] = $opt['field'][$colonne_destination];
2405
-	}
2406
-
2407
-	// key...
2408
-	$keys = [];
2409
-	foreach ($def_origine['key'] as $c => $d) {
2410
-		$c = str_replace($colonne_origine, $colonne_destination, $c);
2411
-		$d = str_replace($colonne_origine, $colonne_destination, $d);
2412
-		// seulement si on ne supprime pas la colonne !
2413
-		if ($d) {
2414
-			$keys[$c] = $d;
2415
-		}
2416
-	}
2417
-
2418
-	// autres keys, on merge
2419
-	$keys = array_merge($keys, $opt['key']);
2420
-	$queries = [];
2421
-
2422
-	// copier dans destination (si differente de origine), sinon tmp
2423
-	$table_copie = ($meme_table) ? $table_tmp : $table_destination;
2424
-	$autoinc = (isset($keys['PRIMARY KEY'])
2425
-		and $keys['PRIMARY KEY']
2426
-		and stripos($keys['PRIMARY KEY'], ',') === false
2427
-		and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2428
-
2429
-	if (
2430
-		$q = _sqlite_requete_create(
2431
-			$table_copie,
2432
-			$fields,
2433
-			$keys,
2434
-			$autoinc,
2435
-			$temporary = false,
2436
-			$ifnotexists = true,
2437
-			$serveur
2438
-		)
2439
-	) {
2440
-		$queries[] = $q;
2441
-	}
2442
-
2443
-
2444
-	// 2) y copier les champs qui vont bien
2445
-	$champs_dest = join(', ', array_keys($fields_correspondances));
2446
-	$champs_ori = join(', ', $fields_correspondances);
2447
-	$queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2448
-
2449
-	// 3) supprimer la table d'origine
2450
-	$queries[] = "DROP TABLE $table_origine";
2451
-
2452
-	// 4) renommer la table temporaire
2453
-	// avec le nom de la table destination
2454
-	// si necessaire
2455
-	if ($meme_table) {
2456
-		$queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2457
-	}
2458
-
2459
-	// 5) remettre les index !
2460
-	foreach ($keys as $k => $v) {
2461
-		if ($k == 'PRIMARY KEY') {
2462
-		} else {
2463
-			// enlever KEY
2464
-			$k = substr($k, 4);
2465
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2466
-		}
2467
-	}
2468
-
2469
-
2470
-	if (count($queries)) {
2471
-		Sqlite::demarrer_transaction($serveur);
2472
-		// il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2473
-		foreach ($queries as $q) {
2474
-			if (!Sqlite::executer_requete($q, $serveur)) {
2475
-				spip_log('SQLite : ALTER TABLE table :'
2476
-					. " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2477
-				Sqlite::annuler_transaction($serveur);
2478
-
2479
-				return false;
2480
-			}
2481
-		}
2482
-		Sqlite::finir_transaction($serveur);
2483
-	}
2484
-
2485
-	return true;
2345
+    if (is_array($table)) {
2346
+        $table_destination = reset($table);
2347
+        $table_origine = key($table);
2348
+    } else {
2349
+        $table_origine = $table_destination = $table;
2350
+    }
2351
+    // ne prend actuellement qu'un changement
2352
+    // mais pourra etre adapte pour changer plus qu'une colonne a la fois
2353
+    if (is_array($colonne)) {
2354
+        $colonne_destination = reset($colonne);
2355
+        $colonne_origine = key($colonne);
2356
+    } else {
2357
+        $colonne_origine = $colonne_destination = $colonne;
2358
+    }
2359
+    if (!isset($opt['field'])) {
2360
+        $opt['field'] = [];
2361
+    }
2362
+    if (!isset($opt['key'])) {
2363
+        $opt['key'] = [];
2364
+    }
2365
+
2366
+    // si les noms de tables sont differents, pas besoin de table temporaire
2367
+    // on prendra directement le nom de la future table
2368
+    $meme_table = ($table_origine == $table_destination);
2369
+
2370
+    $def_origine = sql_showtable($table_origine, false, $serveur);
2371
+    if (!$def_origine or !isset($def_origine['field'])) {
2372
+        spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2373
+
2374
+        return false;
2375
+    }
2376
+
2377
+
2378
+    $table_tmp = $table_origine . '_tmp';
2379
+
2380
+    // 1) creer une table temporaire avec les modifications
2381
+    // - DROP : suppression de la colonne
2382
+    // - CHANGE : modification de la colonne
2383
+    // (foreach pour conserver l'ordre des champs)
2384
+
2385
+    // field
2386
+    $fields = [];
2387
+    // pour le INSERT INTO plus loin
2388
+    // stocker la correspondance nouvelles->anciennes colonnes
2389
+    $fields_correspondances = [];
2390
+    foreach ($def_origine['field'] as $c => $d) {
2391
+        if ($colonne_origine && ($c == $colonne_origine)) {
2392
+            // si pas DROP
2393
+            if ($colonne_destination) {
2394
+                $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2395
+                $fields_correspondances[$colonne_destination] = $c;
2396
+            }
2397
+        } else {
2398
+            $fields[$c] = $d;
2399
+            $fields_correspondances[$c] = $c;
2400
+        }
2401
+    }
2402
+    // cas de ADD sqlite2 (ajout du champ en fin de table):
2403
+    if (!$colonne_origine && $colonne_destination) {
2404
+        $fields[$colonne_destination] = $opt['field'][$colonne_destination];
2405
+    }
2406
+
2407
+    // key...
2408
+    $keys = [];
2409
+    foreach ($def_origine['key'] as $c => $d) {
2410
+        $c = str_replace($colonne_origine, $colonne_destination, $c);
2411
+        $d = str_replace($colonne_origine, $colonne_destination, $d);
2412
+        // seulement si on ne supprime pas la colonne !
2413
+        if ($d) {
2414
+            $keys[$c] = $d;
2415
+        }
2416
+    }
2417
+
2418
+    // autres keys, on merge
2419
+    $keys = array_merge($keys, $opt['key']);
2420
+    $queries = [];
2421
+
2422
+    // copier dans destination (si differente de origine), sinon tmp
2423
+    $table_copie = ($meme_table) ? $table_tmp : $table_destination;
2424
+    $autoinc = (isset($keys['PRIMARY KEY'])
2425
+        and $keys['PRIMARY KEY']
2426
+        and stripos($keys['PRIMARY KEY'], ',') === false
2427
+        and stripos($fields[$keys['PRIMARY KEY']], 'default') === false);
2428
+
2429
+    if (
2430
+        $q = _sqlite_requete_create(
2431
+            $table_copie,
2432
+            $fields,
2433
+            $keys,
2434
+            $autoinc,
2435
+            $temporary = false,
2436
+            $ifnotexists = true,
2437
+            $serveur
2438
+        )
2439
+    ) {
2440
+        $queries[] = $q;
2441
+    }
2442
+
2443
+
2444
+    // 2) y copier les champs qui vont bien
2445
+    $champs_dest = join(', ', array_keys($fields_correspondances));
2446
+    $champs_ori = join(', ', $fields_correspondances);
2447
+    $queries[] = "INSERT INTO $table_copie ($champs_dest) SELECT $champs_ori FROM $table_origine";
2448
+
2449
+    // 3) supprimer la table d'origine
2450
+    $queries[] = "DROP TABLE $table_origine";
2451
+
2452
+    // 4) renommer la table temporaire
2453
+    // avec le nom de la table destination
2454
+    // si necessaire
2455
+    if ($meme_table) {
2456
+        $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination";
2457
+    }
2458
+
2459
+    // 5) remettre les index !
2460
+    foreach ($keys as $k => $v) {
2461
+        if ($k == 'PRIMARY KEY') {
2462
+        } else {
2463
+            // enlever KEY
2464
+            $k = substr($k, 4);
2465
+            $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2466
+        }
2467
+    }
2468
+
2469
+
2470
+    if (count($queries)) {
2471
+        Sqlite::demarrer_transaction($serveur);
2472
+        // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas
2473
+        foreach ($queries as $q) {
2474
+            if (!Sqlite::executer_requete($q, $serveur)) {
2475
+                spip_log('SQLite : ALTER TABLE table :'
2476
+                    . " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2477
+                Sqlite::annuler_transaction($serveur);
2478
+
2479
+                return false;
2480
+            }
2481
+        }
2482
+        Sqlite::finir_transaction($serveur);
2483
+    }
2484
+
2485
+    return true;
2486 2486
 }
2487 2487
 
2488 2488
 
@@ -2493,61 +2493,61 @@  discard block
 block discarded – undo
2493 2493
  */
2494 2494
 function _sqlite_ref_fonctions()
2495 2495
 {
2496
-	$fonctions = [
2497
-		'alter' => 'spip_sqlite_alter',
2498
-		'count' => 'spip_sqlite_count',
2499
-		'countsel' => 'spip_sqlite_countsel',
2500
-		'create' => 'spip_sqlite_create',
2501
-		'create_base' => 'spip_sqlite_create_base',
2502
-		'create_view' => 'spip_sqlite_create_view',
2503
-		'date_proche' => 'spip_sqlite_date_proche',
2504
-		'delete' => 'spip_sqlite_delete',
2505
-		'drop_table' => 'spip_sqlite_drop_table',
2506
-		'drop_view' => 'spip_sqlite_drop_view',
2507
-		'errno' => 'spip_sqlite_errno',
2508
-		'error' => 'spip_sqlite_error',
2509
-		'explain' => 'spip_sqlite_explain',
2510
-		'fetch' => 'spip_sqlite_fetch',
2511
-		'seek' => 'spip_sqlite_seek',
2512
-		'free' => 'spip_sqlite_free',
2513
-		'hex' => 'spip_sqlite_hex',
2514
-		'in' => 'spip_sqlite_in',
2515
-		'insert' => 'spip_sqlite_insert',
2516
-		'insertq' => 'spip_sqlite_insertq',
2517
-		'insertq_multi' => 'spip_sqlite_insertq_multi',
2518
-		'listdbs' => 'spip_sqlite_listdbs',
2519
-		'multi' => 'spip_sqlite_multi',
2520
-		'optimize' => 'spip_sqlite_optimize',
2521
-		'query' => 'spip_sqlite_query',
2522
-		'quote' => 'spip_sqlite_quote',
2523
-		'repair' => 'spip_sqlite_repair',
2524
-		'replace' => 'spip_sqlite_replace',
2525
-		'replace_multi' => 'spip_sqlite_replace_multi',
2526
-		'select' => 'spip_sqlite_select',
2527
-		'selectdb' => 'spip_sqlite_selectdb',
2528
-		'set_charset' => 'spip_sqlite_set_charset',
2529
-		'get_charset' => 'spip_sqlite_get_charset',
2530
-		'showbase' => 'spip_sqlite_showbase',
2531
-		'showtable' => 'spip_sqlite_showtable',
2532
-		'table_exists' => 'spip_sqlite_table_exists',
2533
-		'update' => 'spip_sqlite_update',
2534
-		'updateq' => 'spip_sqlite_updateq',
2535
-		'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2536
-		'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2537
-		'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2538
-	];
2539
-
2540
-	// association de chaque nom http d'un charset aux couples sqlite
2541
-	// SQLite supporte utf-8 et utf-16 uniquement.
2542
-	$charsets = [
2543
-		'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2544
-		//'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2545
-		//'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2546
-	];
2547
-
2548
-	$fonctions['charsets'] = $charsets;
2549
-
2550
-	return $fonctions;
2496
+    $fonctions = [
2497
+        'alter' => 'spip_sqlite_alter',
2498
+        'count' => 'spip_sqlite_count',
2499
+        'countsel' => 'spip_sqlite_countsel',
2500
+        'create' => 'spip_sqlite_create',
2501
+        'create_base' => 'spip_sqlite_create_base',
2502
+        'create_view' => 'spip_sqlite_create_view',
2503
+        'date_proche' => 'spip_sqlite_date_proche',
2504
+        'delete' => 'spip_sqlite_delete',
2505
+        'drop_table' => 'spip_sqlite_drop_table',
2506
+        'drop_view' => 'spip_sqlite_drop_view',
2507
+        'errno' => 'spip_sqlite_errno',
2508
+        'error' => 'spip_sqlite_error',
2509
+        'explain' => 'spip_sqlite_explain',
2510
+        'fetch' => 'spip_sqlite_fetch',
2511
+        'seek' => 'spip_sqlite_seek',
2512
+        'free' => 'spip_sqlite_free',
2513
+        'hex' => 'spip_sqlite_hex',
2514
+        'in' => 'spip_sqlite_in',
2515
+        'insert' => 'spip_sqlite_insert',
2516
+        'insertq' => 'spip_sqlite_insertq',
2517
+        'insertq_multi' => 'spip_sqlite_insertq_multi',
2518
+        'listdbs' => 'spip_sqlite_listdbs',
2519
+        'multi' => 'spip_sqlite_multi',
2520
+        'optimize' => 'spip_sqlite_optimize',
2521
+        'query' => 'spip_sqlite_query',
2522
+        'quote' => 'spip_sqlite_quote',
2523
+        'repair' => 'spip_sqlite_repair',
2524
+        'replace' => 'spip_sqlite_replace',
2525
+        'replace_multi' => 'spip_sqlite_replace_multi',
2526
+        'select' => 'spip_sqlite_select',
2527
+        'selectdb' => 'spip_sqlite_selectdb',
2528
+        'set_charset' => 'spip_sqlite_set_charset',
2529
+        'get_charset' => 'spip_sqlite_get_charset',
2530
+        'showbase' => 'spip_sqlite_showbase',
2531
+        'showtable' => 'spip_sqlite_showtable',
2532
+        'table_exists' => 'spip_sqlite_table_exists',
2533
+        'update' => 'spip_sqlite_update',
2534
+        'updateq' => 'spip_sqlite_updateq',
2535
+        'preferer_transaction' => 'spip_sqlite_preferer_transaction',
2536
+        'demarrer_transaction' => 'spip_sqlite_demarrer_transaction',
2537
+        'terminer_transaction' => 'spip_sqlite_terminer_transaction',
2538
+    ];
2539
+
2540
+    // association de chaque nom http d'un charset aux couples sqlite
2541
+    // SQLite supporte utf-8 et utf-16 uniquement.
2542
+    $charsets = [
2543
+        'utf-8' => ['charset' => 'utf8', 'collation' => 'utf8_general_ci'],
2544
+        //'utf-16be'=>array('charset'=>'utf16be','collation'=>'UTF-16BE'),// aucune idee de quoi il faut remplir dans es champs la
2545
+        //'utf-16le'=>array('charset'=>'utf16le','collation'=>'UTF-16LE')
2546
+    ];
2547
+
2548
+    $fonctions['charsets'] = $charsets;
2549
+
2550
+    return $fonctions;
2551 2551
 }
2552 2552
 
2553 2553
 
@@ -2560,56 +2560,56 @@  discard block
 block discarded – undo
2560 2560
  */
2561 2561
 function _sqlite_remplacements_definitions_table($query, $autoinc = false)
2562 2562
 {
2563
-	// quelques remplacements
2564
-	$num = '(\s*\([0-9]*\))?';
2565
-	$enum = '(\s*\([^\)]*\))?';
2566
-
2567
-	$remplace = [
2568
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2569
-		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2570
-		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2571
-		'/auto_increment/is' => '',
2572
-		'/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2573
-		'/(timestamp .* )ON .*$/is' => '\\1',
2574
-		'/character set \w+/is' => '',
2575
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2576
-		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2577
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2578
-		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2579
-		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2580
-	];
2581
-
2582
-	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2583
-	$remplace_autocinc = [
2584
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2585
-	];
2586
-	// pour les int non autoincrement, il faut un DEFAULT
2587
-	$remplace_nonautocinc = [
2588
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2589
-	];
2590
-
2591
-	if (is_string($query)) {
2592
-		$query = preg_replace(array_keys($remplace), $remplace, $query);
2593
-		if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2594
-			$query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2595
-		} else {
2596
-			$query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2597
-			$query = _sqlite_collate_ci($query);
2598
-		}
2599
-	} elseif (is_array($query)) {
2600
-		foreach ($query as $k => $q) {
2601
-			$ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2602
-			$query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2603
-			if ($ai) {
2604
-				$query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2605
-			} else {
2606
-				$query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2607
-				$query[$k] = _sqlite_collate_ci($query[$k]);
2608
-			}
2609
-		}
2610
-	}
2611
-
2612
-	return $query;
2563
+    // quelques remplacements
2564
+    $num = '(\s*\([0-9]*\))?';
2565
+    $enum = '(\s*\([^\)]*\))?';
2566
+
2567
+    $remplace = [
2568
+        '/enum' . $enum . '/is' => 'VARCHAR(255)',
2569
+        '/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2570
+        '/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2571
+        '/auto_increment/is' => '',
2572
+        '/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2573
+        '/(timestamp .* )ON .*$/is' => '\\1',
2574
+        '/character set \w+/is' => '',
2575
+        '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2576
+        '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2577
+        '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2578
+        '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2579
+        '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2580
+    ];
2581
+
2582
+    // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2583
+    $remplace_autocinc = [
2584
+        '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2585
+    ];
2586
+    // pour les int non autoincrement, il faut un DEFAULT
2587
+    $remplace_nonautocinc = [
2588
+        '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2589
+    ];
2590
+
2591
+    if (is_string($query)) {
2592
+        $query = preg_replace(array_keys($remplace), $remplace, $query);
2593
+        if ($autoinc or preg_match(',AUTO_INCREMENT,is', $query)) {
2594
+            $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query);
2595
+        } else {
2596
+            $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query);
2597
+            $query = _sqlite_collate_ci($query);
2598
+        }
2599
+    } elseif (is_array($query)) {
2600
+        foreach ($query as $k => $q) {
2601
+            $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q));
2602
+            $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]);
2603
+            if ($ai) {
2604
+                $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]);
2605
+            } else {
2606
+                $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]);
2607
+                $query[$k] = _sqlite_collate_ci($query[$k]);
2608
+            }
2609
+        }
2610
+    }
2611
+
2612
+    return $query;
2613 2613
 }
2614 2614
 
2615 2615
 /**
@@ -2621,17 +2621,17 @@  discard block
 block discarded – undo
2621 2621
  */
2622 2622
 function _sqlite_collate_ci($champ)
2623 2623
 {
2624
-	if (stripos($champ, 'COLLATE') !== false) {
2625
-		return $champ;
2626
-	}
2627
-	if (stripos($champ, 'BINARY') !== false) {
2628
-		return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2629
-	}
2630
-	if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2631
-		return $champ . ' COLLATE NOCASE';
2632
-	}
2633
-
2634
-	return $champ;
2624
+    if (stripos($champ, 'COLLATE') !== false) {
2625
+        return $champ;
2626
+    }
2627
+    if (stripos($champ, 'BINARY') !== false) {
2628
+        return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2629
+    }
2630
+    if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2631
+        return $champ . ' COLLATE NOCASE';
2632
+    }
2633
+
2634
+    return $champ;
2635 2635
 }
2636 2636
 
2637 2637
 
@@ -2650,84 +2650,84 @@  discard block
 block discarded – undo
2650 2650
  * @return bool|string
2651 2651
  */
2652 2652
 function _sqlite_requete_create(
2653
-	$nom,
2654
-	$champs,
2655
-	$cles,
2656
-	$autoinc = false,
2657
-	$temporary = false,
2658
-	$_ifnotexists = true,
2659
-	$serveur = '',
2660
-	$requeter = true
2653
+    $nom,
2654
+    $champs,
2655
+    $cles,
2656
+    $autoinc = false,
2657
+    $temporary = false,
2658
+    $_ifnotexists = true,
2659
+    $serveur = '',
2660
+    $requeter = true
2661 2661
 ) {
2662
-	$query = $keys = $s = $p = '';
2663
-
2664
-	// certains plugins declarent les tables  (permet leur inclusion dans le dump)
2665
-	// sans les renseigner (laisse le compilo recuperer la description)
2666
-	if (!is_array($champs) || !is_array($cles)) {
2667
-		return;
2668
-	}
2669
-
2670
-	// sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2671
-	// il faut passer par des create index
2672
-	// Il gere par contre primary key !
2673
-	// Soit la PK est definie dans les cles, soit dans un champs
2674
-	// soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2675
-	$pk = 'PRIMARY KEY';
2676
-	// le champ de cle primaire
2677
-	$champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2678
-
2679
-	foreach ($champs as $k => $v) {
2680
-		if (false !== stripos($v, $pk)) {
2681
-			$champ_pk = $k;
2682
-			// on n'en a plus besoin dans field, vu que defini dans key
2683
-			$champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2684
-			break;
2685
-		}
2686
-	}
2687
-
2688
-	if ($champ_pk) {
2689
-		$keys = "\n\t\t$pk ($champ_pk)";
2690
-	}
2691
-	// Pas de DEFAULT 0 sur les cles primaires en auto-increment
2692
-	if (
2693
-		isset($champs[$champ_pk])
2694
-		and stripos($champs[$champ_pk], 'default 0') !== false
2695
-	) {
2696
-		$champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2697
-	}
2698
-
2699
-	$champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2700
-	foreach ($champs as $k => $v) {
2701
-		$query .= "$s\n\t\t$k $v";
2702
-		$s = ',';
2703
-	}
2704
-
2705
-	$ifnotexists = '';
2706
-	if ($_ifnotexists) {
2707
-		$version = spip_sqlite_fetch(
2708
-			spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2709
-			'',
2710
-			$serveur
2711
-		);
2712
-		if (!function_exists('spip_version_compare')) {
2713
-			include_spip('plugins/installer');
2714
-		}
2715
-
2716
-		if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2717
-			$ifnotexists = ' IF NOT EXISTS';
2718
-		} else {
2719
-			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2720
-			$a = spip_sqlite_showtable($nom, $serveur);
2721
-			if (isset($a['key']['KEY ' . $nom])) {
2722
-				return true;
2723
-			}
2724
-		}
2725
-	}
2726
-
2727
-	$temporary = $temporary ? ' TEMPORARY' : '';
2728
-	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2729
-
2730
-	return $q;
2662
+    $query = $keys = $s = $p = '';
2663
+
2664
+    // certains plugins declarent les tables  (permet leur inclusion dans le dump)
2665
+    // sans les renseigner (laisse le compilo recuperer la description)
2666
+    if (!is_array($champs) || !is_array($cles)) {
2667
+        return;
2668
+    }
2669
+
2670
+    // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE
2671
+    // il faut passer par des create index
2672
+    // Il gere par contre primary key !
2673
+    // Soit la PK est definie dans les cles, soit dans un champs
2674
+    // soit faussement dans les 2 (et dans ce cas, il faut l’enlever à un des 2 endroits !)
2675
+    $pk = 'PRIMARY KEY';
2676
+    // le champ de cle primaire
2677
+    $champ_pk = !empty($cles[$pk]) ? $cles[$pk] : '';
2678
+
2679
+    foreach ($champs as $k => $v) {
2680
+        if (false !== stripos($v, $pk)) {
2681
+            $champ_pk = $k;
2682
+            // on n'en a plus besoin dans field, vu que defini dans key
2683
+            $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]);
2684
+            break;
2685
+        }
2686
+    }
2687
+
2688
+    if ($champ_pk) {
2689
+        $keys = "\n\t\t$pk ($champ_pk)";
2690
+    }
2691
+    // Pas de DEFAULT 0 sur les cles primaires en auto-increment
2692
+    if (
2693
+        isset($champs[$champ_pk])
2694
+        and stripos($champs[$champ_pk], 'default 0') !== false
2695
+    ) {
2696
+        $champs[$champ_pk] = trim(str_ireplace('default 0', '', $champs[$champ_pk]));
2697
+    }
2698
+
2699
+    $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $champ_pk : false);
2700
+    foreach ($champs as $k => $v) {
2701
+        $query .= "$s\n\t\t$k $v";
2702
+        $s = ',';
2703
+    }
2704
+
2705
+    $ifnotexists = '';
2706
+    if ($_ifnotexists) {
2707
+        $version = spip_sqlite_fetch(
2708
+            spip_sqlite_query('select sqlite_version() AS sqlite_version', $serveur),
2709
+            '',
2710
+            $serveur
2711
+        );
2712
+        if (!function_exists('spip_version_compare')) {
2713
+            include_spip('plugins/installer');
2714
+        }
2715
+
2716
+        if ($version and spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) {
2717
+            $ifnotexists = ' IF NOT EXISTS';
2718
+        } else {
2719
+            /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2720
+            $a = spip_sqlite_showtable($nom, $serveur);
2721
+            if (isset($a['key']['KEY ' . $nom])) {
2722
+                return true;
2723
+            }
2724
+        }
2725
+    }
2726
+
2727
+    $temporary = $temporary ? ' TEMPORARY' : '';
2728
+    $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2729
+
2730
+    return $q;
2731 2731
 }
2732 2732
 
2733 2733
 
@@ -2747,40 +2747,40 @@  discard block
 block discarded – undo
2747 2747
  */
2748 2748
 function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '')
2749 2749
 {
2750
-	static $tables = [];
2751
-
2752
-	if (!isset($tables[$table])) {
2753
-		if (!$desc) {
2754
-			$trouver_table = charger_fonction('trouver_table', 'base');
2755
-			$desc = $trouver_table($table, $serveur);
2756
-			// si pas de description, on ne fait rien, ou on die() ?
2757
-			if (!$desc) {
2758
-				return $couples;
2759
-			}
2760
-		}
2761
-
2762
-		// recherche des champs avec simplement 'TIMESTAMP'
2763
-		// cependant, il faudra peut etre etendre
2764
-		// avec la gestion de DEFAULT et ON UPDATE
2765
-		// mais ceux-ci ne sont pas utilises dans le core
2766
-		$tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2767
-
2768
-		$now = _sqlite_func_now(true);
2769
-		foreach ($desc['field'] as $k => $v) {
2770
-			if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2771
-				$tables[$table]['desc'][$k] = $v;
2772
-				$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2773
-			}
2774
-		}
2775
-	} else {
2776
-		$now = _sqlite_func_now(true);
2777
-		foreach (array_keys($tables[$table]['desc']) as $k) {
2778
-			$tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2779
-		}
2780
-	}
2781
-
2782
-	// ajout des champs type 'timestamp' absents
2783
-	return array_merge($tables[$table]['valeur'], $couples);
2750
+    static $tables = [];
2751
+
2752
+    if (!isset($tables[$table])) {
2753
+        if (!$desc) {
2754
+            $trouver_table = charger_fonction('trouver_table', 'base');
2755
+            $desc = $trouver_table($table, $serveur);
2756
+            // si pas de description, on ne fait rien, ou on die() ?
2757
+            if (!$desc) {
2758
+                return $couples;
2759
+            }
2760
+        }
2761
+
2762
+        // recherche des champs avec simplement 'TIMESTAMP'
2763
+        // cependant, il faudra peut etre etendre
2764
+        // avec la gestion de DEFAULT et ON UPDATE
2765
+        // mais ceux-ci ne sont pas utilises dans le core
2766
+        $tables[$table] = ['valeur' => [], 'cite' => [], 'desc' => []];
2767
+
2768
+        $now = _sqlite_func_now(true);
2769
+        foreach ($desc['field'] as $k => $v) {
2770
+            if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) {
2771
+                $tables[$table]['desc'][$k] = $v;
2772
+                $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2773
+            }
2774
+        }
2775
+    } else {
2776
+        $now = _sqlite_func_now(true);
2777
+        foreach (array_keys($tables[$table]['desc']) as $k) {
2778
+            $tables[$table]['valeur'][$k] = _sqlite_calculer_cite($now, $tables[$table]['desc'][$k]);
2779
+        }
2780
+    }
2781
+
2782
+    // ajout des champs type 'timestamp' absents
2783
+    return array_merge($tables[$table]['valeur'], $couples);
2784 2784
 }
2785 2785
 
2786 2786
 
@@ -2792,5 +2792,5 @@  discard block
 block discarded – undo
2792 2792
  */
2793 2793
 function spip_versions_sqlite()
2794 2794
 {
2795
-	return _sqlite_charger_version();
2795
+    return _sqlite_charger_version();
2796 2796
 }
Please login to merge, or discard this patch.
Spacing   +83 added lines, -83 removed lines patch added patch discarded remove patch
@@ -66,27 +66,27 @@  discard block
 block discarded – undo
66 66
 	// determiner le dossier de la base : $addr ou _DIR_DB
67 67
 	$f = _DIR_DB;
68 68
 	if ($addr and str_contains($addr, '/')) {
69
-		$f = rtrim($addr, '/') . '/';
69
+		$f = rtrim($addr, '/').'/';
70 70
 	}
71 71
 
72 72
 	// un nom de base demande et impossible d'obtenir la base, on s'en va :
73 73
 	// il faut que la base existe ou que le repertoire parent soit writable
74
-	if ($db and !is_file($f .= $db . '.sqlite') and !is_writable(dirname($f))) {
75
-		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS);
74
+	if ($db and !is_file($f .= $db.'.sqlite') and !is_writable(dirname($f))) {
75
+		spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.'._LOG_HS);
76 76
 
77 77
 		return false;
78 78
 	}
79 79
 
80 80
 	// charger les modules sqlite au besoin
81 81
 	if (!_sqlite_charger_version($sqlite_version)) {
82
-		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS);
82
+		spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.'._LOG_HS);
83 83
 
84 84
 		return false;
85 85
 	}
86 86
 
87 87
 	// chargement des constantes
88 88
 	// il ne faut pas definir les constantes avant d'avoir charge les modules sqlite
89
-	$define = 'spip_sqlite' . $sqlite_version . '_constantes';
89
+	$define = 'spip_sqlite'.$sqlite_version.'_constantes';
90 90
 	$define();
91 91
 
92 92
 	$ok = false;
@@ -94,8 +94,8 @@  discard block
 block discarded – undo
94 94
 		// si pas de db ->
95 95
 		// base temporaire tant qu'on ne connait pas son vrai nom
96 96
 		// pour tester la connexion
97
-		$db = '_sqlite' . $sqlite_version . '_install';
98
-		$tmp = _DIR_DB . $db . '.sqlite';
97
+		$db = '_sqlite'.$sqlite_version.'_install';
98
+		$tmp = _DIR_DB.$db.'.sqlite';
99 99
 		$ok = $link = new \PDO("sqlite:$tmp");
100 100
 	} else {
101 101
 		// Ouvrir (eventuellement creer la base)
@@ -104,7 +104,7 @@  discard block
 block discarded – undo
104 104
 
105 105
 	if (!$ok) {
106 106
 		$e = _sqlite_last_error_from_link($link);
107
-		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS);
107
+		spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.'._LOG_HS);
108 108
 
109 109
 		return false;
110 110
 	}
@@ -192,7 +192,7 @@  discard block
 block discarded – undo
192 192
 		$table = $regs[3];
193 193
 		$suite = $regs[4];
194 194
 	} else {
195
-		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR);
195
+		spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.'._LOG_ERREUR);
196 196
 
197 197
 		return false;
198 198
 	}
@@ -209,7 +209,7 @@  discard block
 block discarded – undo
209 209
 	$i = 0;
210 210
 	$ouverte = false;
211 211
 	while ($do = array_shift($todo)) {
212
-		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . ',' . $do : $do;
212
+		$todo2[$i] = isset($todo2[$i]) ? $todo2[$i].','.$do : $do;
213 213
 		$o = (str_contains($do, '('));
214 214
 		$f = (str_contains($do, ')'));
215 215
 		if ($o and !$f) {
@@ -235,7 +235,7 @@  discard block
 block discarded – undo
235 235
 		) {
236 236
 			spip_log(
237 237
 				"SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)",
238
-				'sqlite.' . _LOG_ERREUR
238
+				'sqlite.'._LOG_ERREUR
239 239
 			);
240 240
 
241 241
 			return false;
@@ -331,10 +331,10 @@  discard block
 block discarded – undo
331 331
 
332 332
 				// pas geres en sqlite2
333 333
 			case 'RENAME':
334
-				$do = 'RENAME TO' . substr($do, 6);
334
+				$do = 'RENAME TO'.substr($do, 6);
335 335
 			case 'RENAME TO':
336 336
 				if (!Sqlite::executer_requete("$debut $do", $serveur)) {
337
-					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR);
337
+					spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.'._LOG_ERREUR);
338 338
 
339 339
 					return false;
340 340
 				}
@@ -377,7 +377,7 @@  discard block
 block discarded – undo
377 377
 						$colonnes = substr($colonne_origine, 1, -1);
378 378
 						if (str_contains(',', $colonnes)) {
379 379
 							spip_log('SQLite : Erreur, impossible de creer un index sur plusieurs colonnes'
380
-								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.' . _LOG_ERREUR);
380
+								. " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite.'._LOG_ERREUR);
381 381
 							break;
382 382
 						} else {
383 383
 							$nom_index = $colonnes;
@@ -392,12 +392,12 @@  discard block
 block discarded – undo
392 392
 
393 393
 				// pas geres en sqlite2
394 394
 			case 'ADD COLUMN':
395
-				$do = 'ADD' . substr($do, 10);
395
+				$do = 'ADD'.substr($do, 10);
396 396
 			case 'ADD':
397 397
 			default:
398 398
 				if (!preg_match(',primary\s+key,i', $do)) {
399 399
 					if (!Sqlite::executer_requete("$debut $do", $serveur)) {
400
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
400
+						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.'._LOG_ERREUR);
401 401
 
402 402
 						return false;
403 403
 					}
@@ -417,7 +417,7 @@  discard block
 block discarded – undo
417 417
 					}
418 418
 					$opts['field'] = [$colonne_ajoutee => $def];
419 419
 					if (!_sqlite_modifier_table($table, [$colonne_ajoutee], $opts, $serveur)) {
420
-						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR);
420
+						spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.'._LOG_ERREUR);
421 421
 
422 422
 						return false;
423 423
 					}
@@ -425,10 +425,10 @@  discard block
 block discarded – undo
425 425
 				break;
426 426
 		}
427 427
 		// tout est bon, ouf !
428
-		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO);
428
+		spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.'._LOG_INFO);
429 429
 	}
430 430
 
431
-	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO);
431
+	spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.'._LOG_INFO);
432 432
 
433 433
 	return true;
434 434
 }
@@ -497,9 +497,9 @@  discard block
 block discarded – undo
497 497
  **/
498 498
 function spip_sqlite_create_base($nom, $serveur = '', $option = true)
499 499
 {
500
-	$f = $nom . '.sqlite';
500
+	$f = $nom.'.sqlite';
501 501
 	if (strpos($nom, '/') === false) {
502
-		$f = _DIR_DB . $f;
502
+		$f = _DIR_DB.$f;
503 503
 	}
504 504
 
505 505
 	$ok = new \PDO("sqlite:$f");
@@ -540,13 +540,13 @@  discard block
 block discarded – undo
540 540
 	if (sql_showtable($nom, false, $serveur)) {
541 541
 		spip_log(
542 542
 			"Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",
543
-			'sqlite.' . _LOG_ERREUR
543
+			'sqlite.'._LOG_ERREUR
544 544
 		);
545 545
 
546 546
 		return false;
547 547
 	}
548 548
 
549
-	$query = "CREATE VIEW $nom AS " . $query_select;
549
+	$query = "CREATE VIEW $nom AS ".$query_select;
550 550
 
551 551
 	return spip_sqlite_query($query, $serveur, $requeter);
552 552
 }
@@ -573,8 +573,8 @@  discard block
 block discarded – undo
573 573
 {
574 574
 	if (!($nom or $table or $champs)) {
575 575
 		spip_log(
576
-			"Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . '))',
577
-			'sqlite.' . _LOG_ERREUR
576
+			"Champ manquant pour creer un index sqlite ($nom, $table, (".join(',', $champs).'))',
577
+			'sqlite.'._LOG_ERREUR
578 578
 		);
579 579
 
580 580
 		return false;
@@ -582,7 +582,7 @@  discard block
 block discarded – undo
582 582
 
583 583
 	// SQLite ne differentie pas noms des index en fonction des tables
584 584
 	// il faut donc creer des noms uniques d'index pour une base sqlite
585
-	$nom = $table . '_' . $nom;
585
+	$nom = $table.'_'.$nom;
586 586
 	// enlever d'eventuelles parentheses deja presentes sur champs
587 587
 	if (!is_array($champs)) {
588 588
 		if ($champs[0] == '(') {
@@ -604,12 +604,12 @@  discard block
 block discarded – undo
604 604
 	} else {
605 605
 		/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
606 606
 		$a = spip_sqlite_showtable($table, $serveur);
607
-		if (isset($a['key']['KEY ' . $nom])) {
607
+		if (isset($a['key']['KEY '.$nom])) {
608 608
 			return true;
609 609
 		}
610 610
 	}
611 611
 
612
-	$query = 'CREATE ' . ($unique ? 'UNIQUE ' : '') . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ')';
612
+	$query = 'CREATE '.($unique ? 'UNIQUE ' : '')."INDEX$ifnotexists $nom ON $table (".join(',', $champs).')';
613 613
 	$res = spip_sqlite_query($query, $serveur, $requeter);
614 614
 	if (!$requeter) {
615 615
 		return $res;
@@ -686,7 +686,7 @@  discard block
 block discarded – undo
686 686
 	$serveur = '',
687 687
 	$requeter = true
688 688
 ) {
689
-	$c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby)));
689
+	$c = !$groupby ? '*' : ('DISTINCT '.(is_string($groupby) ? $groupby : join(',', $groupby)));
690 690
 	$r = spip_sqlite_select(
691 691
 		"COUNT($c)",
692 692
 		$from,
@@ -799,14 +799,14 @@  discard block
 block discarded – undo
799 799
 function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true)
800 800
 {
801 801
 	if (!($nom or $table)) {
802
-		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR);
802
+		spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.'._LOG_ERREUR);
803 803
 
804 804
 		return false;
805 805
 	}
806 806
 
807 807
 	// SQLite ne differentie pas noms des index en fonction des tables
808 808
 	// il faut donc creer des noms uniques d'index pour une base sqlite
809
-	$index = $table . '_' . $nom;
809
+	$index = $table.'_'.$nom;
810 810
 	$exist = ' IF EXISTS';
811 811
 
812 812
 	$query = "DROP INDEX$exist $index";
@@ -839,7 +839,7 @@  discard block
 block discarded – undo
839 839
 	if ($s) {
840 840
 		$trace = debug_backtrace();
841 841
 		if ($trace[0]['function'] != 'spip_sqlite_error') {
842
-			spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR);
842
+			spip_log("$s - $query - ".sql_error_backtrace(), 'sqlite.'._LOG_ERREUR);
843 843
 		}
844 844
 	}
845 845
 
@@ -888,14 +888,14 @@  discard block
 block discarded – undo
888 888
 		$t = $link->errorInfo();
889 889
 		$s = ltrim($t[0], '0'); // 00000 si pas d'erreur
890 890
 		if ($s) {
891
-			$s .= ' / ' . $t[1];
891
+			$s .= ' / '.$t[1];
892 892
 		} // ajoute l'erreur du moteur SQLite
893 893
 	} else {
894 894
 		$s = ': aucune ressource sqlite (link)';
895 895
 	}
896 896
 
897 897
 	if ($s) {
898
-		spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR);
898
+		spip_log("Erreur sqlite $s", 'sqlite.'._LOG_ERREUR);
899 899
 	}
900 900
 
901 901
 	return $s ? $s : 0;
@@ -920,7 +920,7 @@  discard block
 block discarded – undo
920 920
 	}
921 921
 
922 922
 	$query = Sqlite::traduire_requete($query, $serveur);
923
-	$query = 'EXPLAIN ' . $query;
923
+	$query = 'EXPLAIN '.$query;
924 924
 	if (!$requeter) {
925 925
 		return $query;
926 926
 	}
@@ -1096,7 +1096,7 @@  discard block
 block discarded – undo
1096 1096
 function spip_sqlite_insert($table, $champs, $valeurs, $desc = [], $serveur = '', $requeter = true)
1097 1097
 {
1098 1098
 
1099
-	$query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1099
+	$query = "INSERT INTO $table ".($champs ? "$champs VALUES $valeurs" : 'DEFAULT VALUES');
1100 1100
 	if ($r = spip_sqlite_query($query, $serveur, $requeter)) {
1101 1101
 		if (!$requeter) {
1102 1102
 			return $r;
@@ -1152,8 +1152,8 @@  discard block
 block discarded – undo
1152 1152
 
1153 1153
 	$cles = $valeurs = '';
1154 1154
 	if (count($couples)) {
1155
-		$cles = '(' . join(',', array_keys($couples)) . ')';
1156
-		$valeurs = '(' . join(',', $couples) . ')';
1155
+		$cles = '('.join(',', array_keys($couples)).')';
1156
+		$valeurs = '('.join(',', $couples).')';
1157 1157
 	}
1158 1158
 
1159 1159
 	return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
@@ -1214,11 +1214,11 @@  discard block
 block discarded – undo
1214 1214
 
1215 1215
 		$champs = $valeurs = '';
1216 1216
 		if (count($couples)) {
1217
-			$champs = '(' . join(',', array_keys($couples)) . ')';
1218
-			$valeurs = '(' . join(',', $couples) . ')';
1219
-			$query = $query_start . "$champs VALUES $valeurs";
1217
+			$champs = '('.join(',', array_keys($couples)).')';
1218
+			$valeurs = '('.join(',', $couples).')';
1219
+			$query = $query_start."$champs VALUES $valeurs";
1220 1220
 		} else {
1221
-			$query = $query_start . 'DEFAULT VALUES';
1221
+			$query = $query_start.'DEFAULT VALUES';
1222 1222
 		}
1223 1223
 
1224 1224
 		if ($requeter) {
@@ -1355,7 +1355,7 @@  discard block
 block discarded – undo
1355 1355
  */
1356 1356
 function spip_sqlite_multi($objet, $lang)
1357 1357
 {
1358
-	$r = 'EXTRAIRE_MULTI(' . $objet . ", '" . $lang . "') AS multi";
1358
+	$r = 'EXTRAIRE_MULTI('.$objet.", '".$lang."') AS multi";
1359 1359
 
1360 1360
 	return $r;
1361 1361
 }
@@ -1429,7 +1429,7 @@  discard block
 block discarded – undo
1429 1429
 {
1430 1430
 	$op = (($interval <= 0) ? '>' : '<');
1431 1431
 
1432
-	return "($champ $op datetime('" . date('Y-m-d H:i:s') . "', '$interval $unite'))";
1432
+	return "($champ $op datetime('".date('Y-m-d H:i:s')."', '$interval $unite'))";
1433 1433
 }
1434 1434
 
1435 1435
 
@@ -1462,7 +1462,7 @@  discard block
 block discarded – undo
1462 1462
 				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1463 1463
 			) {
1464 1464
 				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur);
1465
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1465
+				spip_log("ALTER $q", 'repair'._LOG_INFO_IMPORTANTE);
1466 1466
 			}
1467 1467
 			if (
1468 1468
 				preg_match(',^(INTEGER),i', $d)
@@ -1472,7 +1472,7 @@  discard block
 block discarded – undo
1472 1472
 				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1473 1473
 			) {
1474 1474
 				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur);
1475
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1475
+				spip_log("ALTER $q", 'repair'._LOG_INFO_IMPORTANTE);
1476 1476
 			}
1477 1477
 			if (
1478 1478
 				preg_match(',^(datetime),i', $d)
@@ -1482,7 +1482,7 @@  discard block
 block discarded – undo
1482 1482
 				and (!isset($desc['key']['PRIMARY KEY']) or $desc['key']['PRIMARY KEY'] !== $c)
1483 1483
 			) {
1484 1484
 				spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur);
1485
-				spip_log("ALTER $q", 'repair' . _LOG_INFO_IMPORTANTE);
1485
+				spip_log("ALTER $q", 'repair'._LOG_INFO_IMPORTANTE);
1486 1486
 			}
1487 1487
 		}
1488 1488
 
@@ -1534,10 +1534,10 @@  discard block
 block discarded – undo
1534 1534
 	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
1535 1535
 	$couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur);
1536 1536
 
1537
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(
1537
+	return spip_sqlite_query("REPLACE INTO $table (".join(',', array_keys($couples)).') VALUES ('.join(
1538 1538
 		',',
1539 1539
 		$couples
1540
-	) . ')', $serveur);
1540
+	).')', $serveur);
1541 1541
 }
1542 1542
 
1543 1543
 
@@ -1624,7 +1624,7 @@  discard block
 block discarded – undo
1624 1624
 		. _sqlite_calculer_expression('WHERE', $where)
1625 1625
 		. _sqlite_calculer_expression('GROUP BY', $groupby, ',')
1626 1626
 		. _sqlite_calculer_expression('HAVING', $having)
1627
-		. ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '')
1627
+		. ($orderby ? ("\nORDER BY "._sqlite_calculer_order($orderby)) : '')
1628 1628
 		. ($limit ? "\nLIMIT $limit" : '');
1629 1629
 
1630 1630
 	// dans un select, on doit renvoyer la requête en cas d'erreur
@@ -1663,10 +1663,10 @@  discard block
 block discarded – undo
1663 1663
 	// interdire la creation d'une nouvelle base,
1664 1664
 	// sauf si on est dans l'installation
1665 1665
 	if (
1666
-		!is_file($f = _DIR_DB . $db . '.sqlite')
1666
+		!is_file($f = _DIR_DB.$db.'.sqlite')
1667 1667
 		&& (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)
1668 1668
 	) {
1669
-		spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS);
1669
+		spip_log("Il est interdit de creer la base $db", 'sqlite.'._LOG_HS);
1670 1670
 
1671 1671
 		return false;
1672 1672
 	}
@@ -1675,12 +1675,12 @@  discard block
 block discarded – undo
1675 1675
 	// avec les identifiants connus
1676 1676
 	$index = $serveur ? $serveur : 0;
1677 1677
 
1678
-	if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) {
1678
+	if ($link = spip_connect_db('', '', '', '', '@selectdb@'.$db, $serveur, '', '')) {
1679 1679
 		if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) {
1680 1680
 			return $db;
1681 1681
 		}
1682 1682
 	} else {
1683
-		spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS);
1683
+		spip_log("Impossible de selectionner la base $db", 'sqlite.'._LOG_HS);
1684 1684
 	}
1685 1685
 
1686 1686
 	return false;
@@ -1733,7 +1733,7 @@  discard block
 block discarded – undo
1733 1733
 	$match = "^$match$";
1734 1734
 
1735 1735
 	return spip_sqlite_query(
1736
-		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match),
1736
+		"SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP "._q($match),
1737 1737
 		$serveur,
1738 1738
 		$requeter
1739 1739
 	);
@@ -1758,7 +1758,7 @@  discard block
 block discarded – undo
1758 1758
 	$r = spip_sqlite_query(
1759 1759
 		'SELECT name FROM sqlite_master WHERE'
1760 1760
 			. ' type=\'table\''
1761
-			. ' AND name=' . spip_sqlite_quote($table, 'string')
1761
+			. ' AND name='.spip_sqlite_quote($table, 'string')
1762 1762
 			. ' AND name NOT LIKE \'sqlite_%\'',
1763 1763
 		$serveur,
1764 1764
 		$requeter
@@ -1856,7 +1856,7 @@  discard block
 block discarded – undo
1856 1856
 				// s'il y a une parenthèse fermante dans la clé
1857 1857
 				// ou dans la définition sans qu'il n'y ait une ouverture avant
1858 1858
 				if (str_contains($k, ')') or preg_match('/^[^\(]*\)/', $def)) {
1859
-					$fields[$k_precedent] .= ',' . $k . ' ' . $def;
1859
+					$fields[$k_precedent] .= ','.$k.' '.$def;
1860 1860
 					continue;
1861 1861
 				}
1862 1862
 
@@ -1891,13 +1891,13 @@  discard block
 block discarded – undo
1891 1891
 				. 'ORDER BY substr(type,2,1), name';
1892 1892
 			$a = spip_sqlite_query($query, $serveur, $requeter);
1893 1893
 			while ($r = spip_sqlite_fetch($a, null, $serveur)) {
1894
-				$key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1894
+				$key = str_replace($nom_table.'_', '', $r['name']); // enlever le nom de la table ajoute a l'index
1895 1895
 				$keytype = 'KEY';
1896 1896
 				if (strpos($r['sql'], 'UNIQUE INDEX') !== false) {
1897 1897
 					$keytype = 'UNIQUE KEY';
1898 1898
 				}
1899 1899
 				$colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']);
1900
-				$keys[$keytype . ' ' . $key] = $colonnes;
1900
+				$keys[$keytype.' '.$key] = $colonnes;
1901 1901
 			}
1902 1902
 		}
1903 1903
 	} // c'est une vue, on liste les champs disponibles simplement
@@ -1945,7 +1945,7 @@  discard block
 block discarded – undo
1945 1945
 
1946 1946
 	$set = [];
1947 1947
 	foreach ($champs as $champ => $val) {
1948
-		$set[] = $champ . "=$val";
1948
+		$set[] = $champ."=$val";
1949 1949
 	}
1950 1950
 	if (!empty($set)) {
1951 1951
 		return spip_sqlite_query(
@@ -2001,7 +2001,7 @@  discard block
 block discarded – undo
2001 2001
 
2002 2002
 	$set = [];
2003 2003
 	foreach ($champs as $champ => $val) {
2004
-		$set[$champ] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
2004
+		$set[$champ] = $champ.'='._sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : '');
2005 2005
 	}
2006 2006
 
2007 2007
 	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
@@ -2009,7 +2009,7 @@  discard block
 block discarded – undo
2009 2009
 	$maj = _sqlite_ajouter_champs_timestamp($table, [], $desc, $serveur);
2010 2010
 	foreach ($maj as $champ => $val) {
2011 2011
 		if (!isset($set[$champ])) {
2012
-			$set[$champ] = $champ . '=' . $val;
2012
+			$set[$champ] = $champ.'='.$val;
2013 2013
 		}
2014 2014
 	}
2015 2015
 
@@ -2039,7 +2039,7 @@  discard block
 block discarded – undo
2039 2039
 function _sqlite_init()
2040 2040
 {
2041 2041
 	if (!defined('_DIR_DB')) {
2042
-		define('_DIR_DB', _DIR_ETC . 'bases/');
2042
+		define('_DIR_DB', _DIR_ETC.'bases/');
2043 2043
 	}
2044 2044
 	if (!defined('_SQLITE_CHMOD')) {
2045 2045
 		define('_SQLITE_CHMOD', _SPIP_CHMOD);
@@ -2151,9 +2151,9 @@  discard block
 block discarded – undo
2151 2151
 	}
2152 2152
 
2153 2153
 	// echapper les ' en ''
2154
-	spip_log('Pas de methode ->quote pour echapper', 'sqlite.' . _LOG_INFO_IMPORTANTE);
2154
+	spip_log('Pas de methode ->quote pour echapper', 'sqlite.'._LOG_INFO_IMPORTANTE);
2155 2155
 
2156
-	return ("'" . str_replace("'", "''", $v) . "'");
2156
+	return ("'".str_replace("'", "''", $v)."'");
2157 2157
 }
2158 2158
 
2159 2159
 
@@ -2177,12 +2177,12 @@  discard block
 block discarded – undo
2177 2177
 	$exp = "\n$expression ";
2178 2178
 
2179 2179
 	if (!is_array($v)) {
2180
-		return $exp . $v;
2180
+		return $exp.$v;
2181 2181
 	} else {
2182 2182
 		if (strtoupper($join) === 'AND') {
2183
-			return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2183
+			return $exp.join("\n\t$join ", array_map('_sqlite_calculer_where', $v));
2184 2184
 		} else {
2185
-			return $exp . join($join, $v);
2185
+			return $exp.join($join, $v);
2186 2186
 		}
2187 2187
 	}
2188 2188
 }
@@ -2218,17 +2218,17 @@  discard block
 block discarded – undo
2218 2218
 		if (substr($k, -1) == '@') {
2219 2219
 			// c'est une jointure qui se refere au from precedent
2220 2220
 			// pas de virgule
2221
-			$res .= '  ' . $v;
2221
+			$res .= '  '.$v;
2222 2222
 		} else {
2223 2223
 			if (!is_numeric($k)) {
2224 2224
 				$p = strpos($v, ' ');
2225 2225
 				if ($p) {
2226
-					$v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p);
2226
+					$v = substr($v, 0, $p)." AS '$k'".substr($v, $p);
2227 2227
 				} else {
2228 2228
 					$v .= " AS '$k'";
2229 2229
 				}
2230 2230
 			}
2231
-			$res .= ', ' . $v;
2231
+			$res .= ', '.$v;
2232 2232
 		}
2233 2233
 	}
2234 2234
 
@@ -2369,13 +2369,13 @@  discard block
 block discarded – undo
2369 2369
 
2370 2370
 	$def_origine = sql_showtable($table_origine, false, $serveur);
2371 2371
 	if (!$def_origine or !isset($def_origine['field'])) {
2372
-		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR);
2372
+		spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite'._LOG_ERREUR);
2373 2373
 
2374 2374
 		return false;
2375 2375
 	}
2376 2376
 
2377 2377
 
2378
-	$table_tmp = $table_origine . '_tmp';
2378
+	$table_tmp = $table_origine.'_tmp';
2379 2379
 
2380 2380
 	// 1) creer une table temporaire avec les modifications
2381 2381
 	// - DROP : suppression de la colonne
@@ -2462,7 +2462,7 @@  discard block
 block discarded – undo
2462 2462
 		} else {
2463 2463
 			// enlever KEY
2464 2464
 			$k = substr($k, 4);
2465
-			$queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)";
2465
+			$queries[] = "CREATE INDEX $table_destination"."_$k ON $table_destination ($v)";
2466 2466
 		}
2467 2467
 	}
2468 2468
 
@@ -2473,7 +2473,7 @@  discard block
 block discarded – undo
2473 2473
 		foreach ($queries as $q) {
2474 2474
 			if (!Sqlite::executer_requete($q, $serveur)) {
2475 2475
 				spip_log('SQLite : ALTER TABLE table :'
2476
-					. " Erreur a l'execution de la requete : $q", 'sqlite.' . _LOG_ERREUR);
2476
+					. " Erreur a l'execution de la requete : $q", 'sqlite.'._LOG_ERREUR);
2477 2477
 				Sqlite::annuler_transaction($serveur);
2478 2478
 
2479 2479
 				return false;
@@ -2565,27 +2565,27 @@  discard block
 block discarded – undo
2565 2565
 	$enum = '(\s*\([^\)]*\))?';
2566 2566
 
2567 2567
 	$remplace = [
2568
-		'/enum' . $enum . '/is' => 'VARCHAR(255)',
2568
+		'/enum'.$enum.'/is' => 'VARCHAR(255)',
2569 2569
 		'/COLLATE \w+_bin/is' => 'COLLATE BINARY',
2570 2570
 		'/COLLATE \w+_ci/is' => 'COLLATE NOCASE',
2571 2571
 		'/auto_increment/is' => '',
2572 2572
 		'/current_timestamp\(\)/is' => 'CURRENT_TIMESTAMP', // Fix export depuis mariaDB #4374
2573 2573
 		'/(timestamp .* )ON .*$/is' => '\\1',
2574 2574
 		'/character set \w+/is' => '',
2575
-		'/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED',
2575
+		'/((big|small|medium|tiny)?int(eger)?)'.$num.'\s*unsigned/is' => '\\1 UNSIGNED',
2576 2576
 		'/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2577
-		'/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2577
+		'/((char|varchar)'.$num.'\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
2578 2578
 		'/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
2579 2579
 		'/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
2580 2580
 	];
2581 2581
 
2582 2582
 	// pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY
2583 2583
 	$remplace_autocinc = [
2584
-		'/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER'
2584
+		'/(big|small|medium|tiny)?int(eger)?'.$num.'/is' => 'INTEGER'
2585 2585
 	];
2586 2586
 	// pour les int non autoincrement, il faut un DEFAULT
2587 2587
 	$remplace_nonautocinc = [
2588
-		'/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2588
+		'/((big|small|medium|tiny)?int(eger)?'.$num.'\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0",
2589 2589
 	];
2590 2590
 
2591 2591
 	if (is_string($query)) {
@@ -2628,7 +2628,7 @@  discard block
 block discarded – undo
2628 2628
 		return str_ireplace('BINARY', 'COLLATE BINARY', $champ);
2629 2629
 	}
2630 2630
 	if (preg_match(',^(char|varchar|(long|small|medium|tiny)?text),i', $champ)) {
2631
-		return $champ . ' COLLATE NOCASE';
2631
+		return $champ.' COLLATE NOCASE';
2632 2632
 	}
2633 2633
 
2634 2634
 	return $champ;
@@ -2718,14 +2718,14 @@  discard block
 block discarded – undo
2718 2718
 		} else {
2719 2719
 			/* simuler le IF EXISTS - version 2 et sqlite < 3.3a */
2720 2720
 			$a = spip_sqlite_showtable($nom, $serveur);
2721
-			if (isset($a['key']['KEY ' . $nom])) {
2721
+			if (isset($a['key']['KEY '.$nom])) {
2722 2722
 				return true;
2723 2723
 			}
2724 2724
 		}
2725 2725
 	}
2726 2726
 
2727 2727
 	$temporary = $temporary ? ' TEMPORARY' : '';
2728
-	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n";
2728
+	$q = "CREATE$temporary TABLE$ifnotexists $nom ($query".($keys ? ",$keys" : '').")\n";
2729 2729
 
2730 2730
 	return $q;
2731 2731
 }
Please login to merge, or discard this patch.