[SPIP] ~maj 3.0.10 --> 3.0.14
[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-2014 *
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 $sql_desc = $upgrade ? sql_showtable($table,true,$serveur) : false;
59 if (!$sql_desc) {
60 if ($autoinc==='auto')
61 $autoinc = base_determine_autoinc($table,$desc);
62 sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
63 }
64 else {
65 // ajouter les champs manquants
66 // on ne supprime jamais les champs, car c'est dangereux
67 // c'est toujours a faire manuellement
68 $last = '';
69 foreach($desc['field'] as $field=>$type){
70 if (!isset($sql_desc['field'][$field]))
71 sql_alter("TABLE $table ADD $field $type".($last?" AFTER $last":""),$serveur);
72 $last = $field;
73 }
74 foreach($desc['key'] as $key=>$type){
75 // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees
76 // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY"
77 if (!isset($sql_desc['key'][$key]) AND !isset($sql_desc['key']["$key $type"]))
78 sql_alter("TABLE $table ADD $key ($type)",$serveur);
79 $last = $field;
80 }
81
82 }
83 }
84
85 /**
86 * Creer ou mettre a jour un ensemble de tables
87 * en fonction du flag $up
88 *
89 * @param array $tables_inc
90 * tables avec autoincrement sur la cle primaire
91 * @param $tables_noinc
92 * tables sans autoincrement sur la cle primaire
93 * @param bool|array $up
94 * upgrader (true) ou creer (false)
95 * si un tableau de table est fournie, seules l'intersection de ces tables
96 * et des $tables_inc / $tables_noinc seront traitees
97 * @param string $serveur
98 * serveur sql
99 * @return void
100 */
101 function alterer_base($tables_inc, $tables_noinc, $up=false, $serveur='')
102 {
103 if ($up === false) {
104 $old = false;
105 $up = array();
106 } else {
107 $old = true;
108 if (!is_array($up)) $up = array($up);
109 }
110 foreach($tables_inc as $k => $v)
111 if (!$old OR in_array($k, $up))
112 creer_ou_upgrader_table($k,$v,true,$old,$serveur);
113
114 foreach($tables_noinc as $k => $v)
115 if (!$old OR in_array($k, $up))
116 creer_ou_upgrader_table($k,$v,false,$old,$serveur);
117 }
118
119 /**
120 * Creer une base de donnee
121 * a partir des tables principales et auxiliaires
122 *
123 * http://doc.spip.org/@creer_base
124 *
125 * @param string $serveur
126 * @return void
127 */
128 function creer_base($serveur='') {
129
130 // Note: les mises a jour reexecutent ce code pour s'assurer
131 // de la conformite de la base
132 // pas de panique sur "already exists" et "duplicate entry" donc.
133
134 alterer_base(lister_tables_principales(),
135 lister_tables_auxiliaires(),
136 false,
137 $serveur);
138 }
139
140 /**
141 * Mettre a jour une liste de tables,
142 * fonction facilitatrice utilisee pour les maj de base
143 * dans les plugins
144 *
145 * @param array $upgrade_tables
146 * @param string $serveur
147 * @return void
148 */
149 function maj_tables($upgrade_tables=array(),$serveur=''){
150 alterer_base(lister_tables_principales(),
151 lister_tables_auxiliaires(),
152 $upgrade_tables,
153 $serveur);
154 }
155
156 ?>