[SPIP] v3.2.7-->v3.2.9
[lhc/web/www.git] / www / ecrire / base / create.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Création ou mise à jour des tables
15 *
16 * @package SPIP\Core\Installation
17 **/
18 if (!defined('_ECRIRE_INC_VERSION')) {
19 return;
20 }
21
22 include_spip('inc/acces');
23 include_spip('base/objets');
24 include_spip('base/typedoc');
25 include_spip('base/abstract_sql');
26
27 /**
28 * Determiner le flag autoinc pour une table
29 * en fonction de si c'est une table principale
30 *
31 * @param string $table
32 * @param array $desc
33 * @return bool
34 */
35 function base_determine_autoinc($table, $desc = array()) {
36 if ($t = lister_tables_principales() and isset($t[$table])) {
37 $autoinc = true;
38 } elseif ($t = lister_tables_auxiliaires() and isset($t[$table])) {
39 $autoinc = false;
40 } else {
41 // essayer de faire au mieux !
42 $autoinc = (isset($desc['key']['PRIMARY KEY'])
43 and strpos($desc['key']['PRIMARY KEY'], ',') === false
44 and strpos($desc['field'][$desc['key']['PRIMARY KEY']], 'default') === false);
45 }
46
47 return $autoinc;
48 }
49
50 /**
51 * Créer une table,
52 * ou ajouter les champs manquants si elle existe déjà
53 *
54 * @param string $table
55 * @param array $desc
56 * @param bool|string $autoinc
57 * 'auto' pour detecter automatiquement si le champ doit etre autoinc ou non
58 * en fonction de la table
59 * @param bool $upgrade
60 * @param string $serveur
61 * @return void
62 */
63 function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $serveur = '') {
64 #spip_log("creer_ou_upgrader_table table=$table autoinc=$autoinc upgrade=$upgrade","dbinstall"._LOG_INFO_IMPORTANTE);
65 $sql_desc = $upgrade ? sql_showtable($table, true, $serveur) : false;
66 #if (!$sql_desc) $sql_desc = false;
67 #spip_log("table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
68 if (!$sql_desc) {
69 if ($autoinc === 'auto') {
70 $autoinc = base_determine_autoinc($table, $desc);
71 }
72 #spip_log("sql_create $table autoinc=$autoinc","dbinstall"._LOG_INFO_IMPORTANTE);
73 if (isset($desc['field']) and isset($desc['key'])) {
74 sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
75 }
76 // verifier la bonne installation de la table (php-fpm es-tu la ?)
77 $sql_desc = sql_showtable($table, true, $serveur);
78 #if (!$sql_desc) $sql_desc = false;
79 #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
80 if (!$sql_desc) {
81 // on retente avec un sleep ?
82 sleep(1);
83 sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
84 $sql_desc = sql_showtable($table, true, $serveur);
85 #if (!$sql_desc) $sql_desc = false;
86 #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
87 if (!$sql_desc) {
88 spip_log("Echec creation table $table", "maj" . _LOG_CRITIQUE);
89 }
90 }
91 } else {
92 #spip_log("sql_alter $table ... (on s'en fiche)","dbinstall"._LOG_INFO_IMPORTANTE);
93 // ajouter les champs manquants
94 // on ne supprime jamais les champs, car c'est dangereux
95 // c'est toujours a faire manuellement
96 $last = '';
97 if (isset($desc['field'])) {
98 foreach ($desc['field'] as $field => $type) {
99 if (!isset($sql_desc['field'][$field])) {
100 sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ""), $serveur);
101 }
102 $last = $field;
103 }
104 }
105 if (isset($desc['key'])) {
106 foreach ($desc['key'] as $key => $type) {
107 // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
108 // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
109 if (!isset($sql_desc['key'][$key]) and !isset($sql_desc['key']["$key $type"])) {
110 sql_alter("TABLE $table ADD $key ($type)", $serveur);
111 }
112 $last = $field;
113 }
114 }
115
116 }
117 }
118
119 /**
120 * Creer ou mettre à jour un ensemble de tables
121 * en fonction du flag `$up`
122 *
123 * @uses creer_ou_upgrader_table()
124 *
125 * @param array $tables_inc
126 * tables avec autoincrement sur la cle primaire
127 * @param $tables_noinc
128 * tables sans autoincrement sur la cle primaire
129 * @param bool|array $up
130 * upgrader (true) ou creer (false)
131 * si un tableau de table est fournie, seules l'intersection de ces tables
132 * et des $tables_inc / $tables_noinc seront traitees
133 * @param string $serveur
134 * serveur sql
135 * @return void
136 */
137 function alterer_base($tables_inc, $tables_noinc, $up = false, $serveur = '') {
138 if ($up === false) {
139 $old = false;
140 $up = array();
141 } else {
142 $old = true;
143 if (!is_array($up)) {
144 $up = array($up);
145 }
146 }
147 foreach ($tables_inc as $k => $v) {
148 if (!$old or in_array($k, $up)) {
149 creer_ou_upgrader_table($k, $v, true, $old, $serveur);
150 }
151 }
152
153 foreach ($tables_noinc as $k => $v) {
154 if (!$old or in_array($k, $up)) {
155 creer_ou_upgrader_table($k, $v, false, $old, $serveur);
156 }
157 }
158 }
159
160 /**
161 * Créer une base de données
162 * à partir des tables principales et auxiliaires
163 *
164 * Lorsque de nouvelles tables ont été déclarées, cette fonction crée les tables manquantes.
165 * mais ne crée pas des champs manquant d'une table déjà présente.
166 * Pour cela, c’est `maj_tables()` qu’il faut appeler.
167 *
168 * @api
169 * @see maj_tables()
170 * @uses alterer_base()
171 *
172 * @param string $serveur
173 * @return void
174 */
175 function creer_base($serveur = '') {
176
177 // Note: les mises a jour reexecutent ce code pour s'assurer
178 // de la conformite de la base
179 // pas de panique sur "already exists" et "duplicate entry" donc.
180
181 alterer_base(
182 lister_tables_principales(),
183 lister_tables_auxiliaires(),
184 false,
185 $serveur
186 );
187 }
188
189 /**
190 * Mettre à jour une liste de tables
191 *
192 * Fonction facilitatrice utilisée pour les maj de base
193 * dans les plugins.
194 *
195 * Elle permet de créer les champs manquants d'une table déjà présente.
196 *
197 * @api
198 * @see creer_base()
199 * @uses alterer_base()
200 *
201 * @param array $upgrade_tables
202 * @param string $serveur
203 * @return void
204 */
205 function maj_tables($upgrade_tables = array(), $serveur = '') {
206 alterer_base(
207 lister_tables_principales(),
208 lister_tables_auxiliaires(),
209 $upgrade_tables,
210 $serveur
211 );
212 }