3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
13 if (!defined('_ECRIRE_INC_VERSION')) return;
15 include_spip('inc/acces');
16 include_spip('base/objets');
17 include_spip('base/typedoc');
18 include_spip('base/abstract_sql');
21 * Determiner le flag autoinc pour une table
22 * en fonction de si c'est une table principale
24 * @param string $table
28 function base_determine_autoinc($table,$desc=array()){
29 if ($t=lister_tables_principales() AND isset($t[$table]))
31 elseif ($t=lister_tables_auxiliaires() AND isset($t[$table]))
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);
44 * ou ajouter les champs manquants si elle existe deja
46 * http://doc.spip.org/@creer_ou_upgrader_table
48 * @param string $table
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
57 function creer_ou_upgrader_table($table,$desc,$autoinc,$upgrade=false,$serveur='') {
58 $sql_desc = $upgrade ?
sql_showtable($table,true,$serveur) : false;
60 if ($autoinc==='auto')
61 $autoinc = base_determine_autoinc($table,$desc);
62 sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur);
65 // ajouter les champs manquants
66 // on ne supprime jamais les champs, car c'est dangereux
67 // c'est toujours a faire manuellement
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);
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);
86 * Creer ou mettre a jour un ensemble de tables
87 * en fonction du flag $up
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
101 function alterer_base($tables_inc, $tables_noinc, $up=false, $serveur='')
108 if (!is_array($up)) $up = array($up);
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);
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);
120 * Creer une base de donnee
121 * a partir des tables principales et auxiliaires
123 * http://doc.spip.org/@creer_base
125 * @param string $serveur
128 function creer_base($serveur='') {
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.
134 alterer_base(lister_tables_principales(),
135 lister_tables_auxiliaires(),
141 * Mettre a jour une liste de tables,
142 * fonction facilitatrice utilisee pour les maj de base
145 * @param array $upgrade_tables
146 * @param string $serveur
149 function maj_tables($upgrade_tables=array(),$serveur=''){
150 alterer_base(lister_tables_principales(),
151 lister_tables_auxiliaires(),