[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / base / create.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 include_spip('inc/acces');
16 include_spip('base/objets');
17 include_spip('base/typedoc');
18 include_spip('base/abstract_sql');
19
20 /**
21 * Determiner le flag autoinc pour une table
22 * en fonction de si c'est une table principale
23 *
24 * @param string $table
25 * @param array $desc
26 * @return bool
27 */
28 function base_determine_autoinc($table,$desc=array()){
29 if ($t=lister_tables_principales() AND isset($t[$table]))
30 $autoinc = true;
31 elseif ($t=lister_tables_auxiliaires() AND isset($t[$table]))
32 $autoinc = false;
33 else {
34 // essayer de faire au mieux !
35 $autoinc = (isset($desc['key']['PRIMARY KEY'])
36 AND strpos($desc['key']['PRIMARY KEY'],',')===false
37 AND strpos($desc['field'][$desc['key']['PRIMARY KEY']],'default')===false);
38 }
39 return $autoinc;
40 }
41
42 /**
43 * Creer une table,
44 * ou ajouter les champs manquants si elle existe deja
45 *
46 * http://doc.spip.org/@creer_ou_upgrader_table
47 *
48 * @param string $table
49 * @param array $desc
50 * @param bool|string $autoinc
51 * 'auto' pour detecter automatiquement si le champ doit etre autoinc ou non
52 * en fonction de la table
53 * @param bool $upgrade
54 * @param string $serveur
55 * @return void
56 */
57 function creer_ou_upgrader_table($table,$desc,$autoinc,$upgrade=false,$serveur='') {
58 #spip_log("creer_ou_upgrader_table table=$table autoinc=$autoinc upgrade=$upgrade","dbinstall"._LOG_INFO_IMPORTANTE);
59 $sql_desc = $upgrade ? sql_showtable($table,true,$serveur) : false;
60 #if (!$sql_desc) $sql_desc = false;
61 #spip_log("table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
62 if (!$sql_desc) {
63 if ($autoinc==='auto')
64 $autoinc = base_determine_autoinc($table,$desc);
65 #spip_log("sql_create $table autoinc=$autoinc","dbinstall"._LOG_INFO_IMPORTANTE);
66 sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
67 // verifier la bonne installation de la table (php-fpm es-tu la ?)
68 $sql_desc = sql_showtable($table,true,$serveur);
69 #if (!$sql_desc) $sql_desc = false;
70 #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
71 if (!$sql_desc){
72 // on retente avec un sleep ?
73 sleep(1);
74 sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
75 $sql_desc = sql_showtable($table,true,$serveur);
76 #if (!$sql_desc) $sql_desc = false;
77 #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE);
78 if (!$sql_desc){
79 spip_log("Echec creation table $table","maj"._LOG_CRITIQUE);
80 }
81 }
82 }
83 else {
84 #spip_log("sql_alter $table ... (on s'en fiche)","dbinstall"._LOG_INFO_IMPORTANTE);
85 // ajouter les champs manquants
86 // on ne supprime jamais les champs, car c'est dangereux
87 // c'est toujours a faire manuellement
88 $last = '';
89 foreach($desc['field'] as $field=>$type){
90 if (!isset($sql_desc['field'][$field]))
91 sql_alter("TABLE $table ADD $field $type".($last?" AFTER $last":""),$serveur);
92 $last = $field;
93 }
94 foreach($desc['key'] as $key=>$type){
95 // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
96 // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
97 if (!isset($sql_desc['key'][$key]) AND !isset($sql_desc['key']["$key $type"]))
98 sql_alter("TABLE $table ADD $key ($type)",$serveur);
99 $last = $field;
100 }
101
102 }
103 }
104
105 /**
106 * Creer ou mettre a jour un ensemble de tables
107 * en fonction du flag $up
108 *
109 * @param array $tables_inc
110 * tables avec autoincrement sur la cle primaire
111 * @param $tables_noinc
112 * tables sans autoincrement sur la cle primaire
113 * @param bool|array $up
114 * upgrader (true) ou creer (false)
115 * si un tableau de table est fournie, seules l'intersection de ces tables
116 * et des $tables_inc / $tables_noinc seront traitees
117 * @param string $serveur
118 * serveur sql
119 * @return void
120 */
121 function alterer_base($tables_inc, $tables_noinc, $up=false, $serveur='')
122 {
123 if ($up === false) {
124 $old = false;
125 $up = array();
126 } else {
127 $old = true;
128 if (!is_array($up)) $up = array($up);
129 }
130 foreach($tables_inc as $k => $v)
131 if (!$old OR in_array($k, $up))
132 creer_ou_upgrader_table($k,$v,true,$old,$serveur);
133
134 foreach($tables_noinc as $k => $v)
135 if (!$old OR in_array($k, $up))
136 creer_ou_upgrader_table($k,$v,false,$old,$serveur);
137 }
138
139 /**
140 * Creer une base de donnee
141 * a partir des tables principales et auxiliaires
142 *
143 * http://doc.spip.org/@creer_base
144 *
145 * @param string $serveur
146 * @return void
147 */
148 function creer_base($serveur='') {
149
150 // Note: les mises a jour reexecutent ce code pour s'assurer
151 // de la conformite de la base
152 // pas de panique sur "already exists" et "duplicate entry" donc.
153
154 alterer_base(lister_tables_principales(),
155 lister_tables_auxiliaires(),
156 false,
157 $serveur);
158 }
159
160 /**
161 * Mettre a jour une liste de tables,
162 * fonction facilitatrice utilisee pour les maj de base
163 * dans les plugins
164 *
165 * @param array $upgrade_tables
166 * @param string $serveur
167 * @return void
168 */
169 function maj_tables($upgrade_tables=array(),$serveur=''){
170 alterer_base(lister_tables_principales(),
171 lister_tables_auxiliaires(),
172 $upgrade_tables,
173 $serveur);
174 }
175
176 ?>