source: spip-zone/_plugins_/contacts_et_organisations/branches/v1/base/contacts_upgrade.php @ 52034

Last change on this file since 52034 was 52034, checked in by toutati@…, 10 years ago

On assure la compatibilite (c'est note en commentaire compatibilite) avec d'autres plugins,
en mettant systématiquement à jour les tables de liens et les tables sur le champ id_auteur

nettoyage pour afficher les accents

passage du plugin en 1.13

  • Property svn:executable set to *
File size: 12.8 KB
Line 
1<?php
2/**
3 * Plugin Comptes & Contacts pour Spip 2.0
4 * Licence GPL (c) 2009 - 2010 - Ateliers CYM
5 */
6
7include_spip('inc/meta');
8include_spip('base/create');
9
10function contacts_upgrade($nom_meta_base_version, $version_cible){
11 
12        $current_version = "0.0";
13        if (isset($GLOBALS['meta'][$nom_meta_base_version]))
14                $current_version = $GLOBALS['meta'][$nom_meta_base_version];
15       
16        if ($current_version=="0.0") {
17                creer_base();
18                spip_log('Tables C&O correctement creees','contacts');
19                ecrire_meta($nom_meta_base_version, $current_version=$version_cible);
20        }
21        if (version_compare($current_version,"1.1.0","<")){
22                sql_alter("TABLE spip_contacts CHANGE prenom prenom tinytext NOT NULL DEFAULT ''");
23                ecrire_meta($nom_meta_base_version, $current_version="1.1.0");
24        }
25        if (version_compare($current_version,"1.1.1","<")){
26                maj_tables('spip_contacts');
27                ecrire_meta($nom_meta_base_version, $current_version="1.1.1");
28        }
29        if (version_compare($current_version,"1.1.2","<")){
30                // dupliquer id_ pour les jointures automatiques.
31                maj_tables(array('spip_contacts', 'spip_comptes'));
32                sql_alter('TABLE spip_contacts ADD INDEX (id_contact)');
33                sql_alter('TABLE spip_comptes ADD INDEX (id_compte)');
34                sql_alter('TABLE spip_comptes_contacts ADD INDEX (id_contact)');
35                sql_update('spip_contacts', array('id_contact'=>'id_auteur'));
36                sql_update('spip_comptes', array('id_compte'=>'id_auteur'));
37                ecrire_meta($nom_meta_base_version, $current_version="1.1.2");
38        }
39        if (version_compare($current_version,"1.2.0","<")){
40                // on passe de compte a organisation...
41                sql_alter('TABLE spip_comptes DROP INDEX id_compte');
42                sql_alter('TABLE spip_comptes_contacts DROP INDEX id_compte');
43               
44                sql_alter('TABLE spip_comptes RENAME spip_organisations');
45                sql_alter('TABLE spip_comptes_contacts RENAME spip_organisations_contacts');
46
47                sql_alter('TABLE spip_organisations CHANGE id_compte id_organisation bigint(21) NOT NULL');
48                sql_alter('TABLE spip_organisations_contacts CHANGE id_compte id_organisation bigint(21) NOT NULL');
49
50                sql_alter('TABLE spip_organisations ADD INDEX (id_organisation)');
51                sql_alter('TABLE spip_organisations_contacts ADD INDEX (id_organisation)');             
52                ecrire_meta($nom_meta_base_version, $current_version="1.2.0");
53        }
54        if (version_compare($current_version,"1.2.1","<")){
55                // on modifie quelques champs de la table organisations
56                sql_alter("TABLE spip_organisations CHANGE type statut_juridique TINYTEXT NOT NULL DEFAULT ''"); // renomme le champ 'type' en 'statut_juridique'
57                sql_alter("TABLE spip_organisations CHANGE siret identification TINYTEXT NOT NULL DEFAULT ''"); // renomme le champ 'siret' en 'identification'
58                sql_alter("TABLE spip_organisations ADD activite TINYTEXT NOT NULL DEFAULT '' AFTER identification"); // ajoute le champ 'activite'
59                spip_log('Tables correctement passsees en version 1.2.1','contacts');
60                ecrire_meta($nom_meta_base_version, $current_version="1.2.1");
61        }
62        if (version_compare($current_version,"1.3.0","<")){
63                // les cles primaires des tables contacts et organisations
64                // passent sur le id_contact et id_organisation au lieu du id_auteur
65                // afin de gerer eventuellement des contacts/organisations autonomes.
66                sql_alter('TABLE spip_organisations DROP INDEX id_organisation');
67                sql_alter('TABLE spip_organisations DROP PRIMARY KEY');
68                sql_alter('TABLE spip_organisations CHANGE id_auteur id_auteur bigint(21) NOT NULL'); 
69                sql_alter('TABLE spip_organisations CHANGE id_organisation id_organisation bigint(21) NOT NULL auto_increment PRIMARY KEY'); 
70                sql_alter('TABLE spip_organisations ADD INDEX (id_auteur)');
71               
72                sql_alter('TABLE spip_contacts DROP INDEX id_contact');
73                sql_alter('TABLE spip_contacts DROP PRIMARY KEY');
74                sql_alter('TABLE spip_contacts CHANGE id_auteur id_auteur bigint(21) NOT NULL'); 
75                sql_alter('TABLE spip_contacts CHANGE id_contact id_contact bigint(21) NOT NULL auto_increment PRIMARY KEY');
76                sql_alter('TABLE spip_contacts ADD INDEX (id_auteur)');
77               
78                spip_log('Tables correctement passsees en version 1.3.0','contacts');
79                ecrire_meta($nom_meta_base_version, $current_version="1.3.0");
80        }
81
82        if (version_compare($current_version,"1.3.1","<")){
83                if (!sql_alter("TABLE spip_contacts CHANGE descriptif descriptif TEXT DEFAULT '' NOT NULL")) {
84                        spip_log('Probleme lors de la modif de la table spip_contacts','contacts');
85                } else {
86                        spip_log('Table spip_contacts correctement passsee en version 1.3.1','contacts');
87                }
88                if (!sql_alter("TABLE spip_organisations CHANGE descriptif descriptif TEXT DEFAULT '' NOT NULL")) {
89                        spip_log('Probleme lors de la modif de la table spip_organisations','contacts');
90                } else {
91                        spip_log('Table spip_organisations correctement passsee en version 1.3.1','contacts');
92                }
93
94                ecrire_meta($nom_meta_base_version, $current_version="1.3.1");
95        }
96
97/*
98        // on utilise la table spip_contacts_liens
99        // pour stocker le id_auteur de spip_contacts
100    if (version_compare($current_version,"1.3.2","<")){
101                maj_tables('spip_contacts_liens');
102                $auteurs = sql_allfetsel(array('id_auteur', 'id_contacts'), 'spip_contacts', 'id_auteur > 0');
103                if ($auteurs) {
104                        $inserts = array();
105                        foreach ($auteurs as $r) {
106                                // possibilité d'erreur sql si la ligne est déjà là.
107                                // rien de dramatique
108                                $inserts = array(
109                                        'id_contact' => $r['id_contact'],
110                                        'id_objet' => $r['id_auteur'],
111                                        'objet' => 'auteur',
112                                );
113                        }
114                        if ($inserts) {
115                                sql_insertq_multi('spip_contacts_liens', $inserts);
116                        }
117                }
118                sql_alter('TABLE spip_contacts DROP INDEX id_auteur');
119                sql_alter('TABLE spip_contacts DROP COLUMN id_auteur');
120                ecrire_meta($nom_meta_base_version, $current_version="1.3.2");
121        }
122*/     
123
124        // le champ descriptif ne changeait pas sur les nouvelles installations (c'etait encore declare tinytext
125    if (version_compare($current_version,"1.3.3","<")){
126                sql_alter("TABLE spip_contacts CHANGE descriptif descriptif TEXT DEFAULT '' NOT NULL");
127                ecrire_meta($nom_meta_base_version, $current_version="1.3.3");
128        }
129       
130        // le champ id_auteur sur spip_organisations peut ne pas etre unique si une organisation
131        // n'est pas liee a un auteur (id_auteur=0). Plus tard, il faudra certainement mettre une
132        // table de relation spip_organisations_liens pour cela.
133    if (version_compare($current_version,"1.3.4","<")){
134                // pas de UNIQUE sur l'index auteur
135                sql_alter("TABLE spip_organisations DROP INDEX id_auteur");
136                sql_alter("TABLE spip_organisations CHANGE id_auteur id_auteur bigint(21) DEFAULT 0 NOT NULL");
137                sql_alter("TABLE spip_organisations ADD INDEX (id_auteur)");
138                ecrire_meta($nom_meta_base_version, $current_version="1.3.4");
139        }
140       
141        // le champ id_parent sur spip_organisations pour definir des hierarchies d'organisations.
142    if (version_compare($current_version,"1.3.5","<")){
143                sql_alter("TABLE spip_organisations ADD COLUMN id_parent bigint(21) DEFAULT 0 NOT NULL");
144                ecrire_meta($nom_meta_base_version, $current_version="1.3.5");
145        }
146       
147        // le champ type_liaison sur spip_organisations_contacts pour definir des types de liaisons donc.
148    if (version_compare($current_version,"1.3.6","<")){
149                sql_alter("TABLE spip_organisations_contacts ADD COLUMN type_liaison tinytext NOT NULL DEFAULT ''");
150                ecrire_meta($nom_meta_base_version, $current_version="1.3.6");
151        }
152
153        // on cree la table spip_organisations_liens
154    if (version_compare($current_version,"1.3.7","<")){
155                maj_tables('spip_organisations_liens');
156                ecrire_meta($nom_meta_base_version, $current_version="1.3.7");
157        }
158
159/*     
160        // on utilise la table spip_organisations_liens
161        // pour stocker le id_auteur de spip_organisations
162    if (version_compare($current_version,"1.4.0","<")){
163                $auteurs = sql_allfetsel(array('id_auteur', 'id_organisation'), 'spip_organisations', 'id_auteur > 0');
164                if ($auteurs) {
165                        $inserts = array();
166                        foreach ($auteurs as $r) {
167                                // possibilité d'erreur sql si la ligne est déjà là.
168                                // rien de dramatique
169                                $inserts = array(
170                                        'id_organisation' => $r['id_organisation'],
171                                        'id_objet' => $r['id_auteur'],
172                                        'objet' => 'auteur',
173                                );
174                        }
175                        if ($inserts) {
176                                sql_insertq_multi('spip_organisations_liens', $inserts);
177                        }
178                }
179                sql_alter('TABLE spip_organisations DROP INDEX id_auteur');
180                sql_alter('TABLE spip_organisations DROP COLUMN id_auteur');
181                ecrire_meta($nom_meta_base_version, $current_version="1.4.0");
182        }
183*/
184
185        // coquille sur la cle de spip_organisations_liens
186        if (version_compare($current_version,"1.4.1","<")){
187                sql_alter('TABLE spip_organisations DROP INDEX id_contact');
188                sql_alter('TABLE spip_organisations ADD INDEX (id_organisation)');
189
190                ecrire_meta($nom_meta_base_version, $current_version="1.4.1");
191        }
192
193        // rajout d'un type_liaison dans les liens
194        if (version_compare($current_version,"1.4.2","<")){
195                maj_tables(array('spip_contacts_liens', 'spip_organisations_liens'));
196        sql_alter('TABLE `spip_organisations_liens` DROP PRIMARY KEY');
197        sql_alter('TABLE `spip_organisations_liens` ADD PRIMARY KEY ( `id_organisation` , `id_objet` , `objet`, `type_liaison`(25)) ');
198        sql_alter('TABLE `spip_contacts_liens` DROP PRIMARY KEY');
199        sql_alter('TABLE `spip_contacts_liens` ADD PRIMARY KEY ( `id_contact` , `id_objet` , `objet`, `type_liaison`(25)) ');
200
201                ecrire_meta($nom_meta_base_version, $current_version="1.4.2");
202        }
203
204        /*
205        Il s'agissait de supprimer spip_organisations_contacts
206        pour le mettre dans spip_organisations_liens...
207        ce qui s'est avere tres bugge un spip 2.1...
208        la version 1.6.0 fait l'inverse de 1.5.0 du coup, pour remettre dans l'ordre
209
210        if (version_compare($current_version,"1.5.0","<")){
211                $contacts = sql_allfetsel(array('id_contact', 'id_organisation','type_liaison'), 'spip_organisations_contacts', 'id_contact > 0');
212                if ($contacts) {
213                        $inserts = array();
214                        foreach ($contacts as $r) {
215                                // possibilité d'erreur sql si la ligne est déjà là.
216                                // rien de dramatique
217                                $inserts[] = array(
218                                        'id_organisation' => $r['id_organisation'],
219                                        'id_objet' => $r['id_contact'],
220                                        'objet' => 'contact',
221                    'type_liaison' => $r['type_liaison'],
222                                );
223                        }
224                        if ($inserts) {
225                                sql_insertq_multi('spip_organisations_liens', $inserts);
226                        }
227                }
228                sql_drop_table('spip_organisations_contacts');
229
230                ecrire_meta($nom_meta_base_version, $current_version="1.5.0");
231        }
232        */
233
234        if (version_compare($current_version,"1.6.0","<")) {
235                include_spip('base/create');
236                // remettre spip_organisations_contacts si besoin
237                creer_base();
238                // repeupler
239                $contacts = sql_allfetsel(
240                        array('id_objet AS id_contact', 'id_organisation', 'type_liaison'),
241                        'spip_organisations_liens',
242                        array('objet='.sql_quote('contact'), 'id_objet > 0'));
243                if ($contacts) {
244                        $inserts = array();
245                        foreach ($contacts as $r) {
246                                $inserts[] = array(
247                                        'id_organisation' => $r['id_organisation'],
248                                        'id_contact' => $r['id_contact'],
249                    'type_liaison' => $r['type_liaison'],
250                                );
251                        }
252                        if ($inserts) {
253                                sql_insertq_multi('spip_organisations_contacts', $inserts);
254                        }
255                }
256
257                // enlever les contacts de spip_organisations_liens
258                sql_delete('spip_organisations_liens', 'objet='.sql_quote('contact'));
259
260                ecrire_meta($nom_meta_base_version, $current_version="1.6.0");
261        }
262
263
264        if (version_compare($current_version,"1.7.0","<")) {
265                contacts_migrer_liens_auteurs();
266                ecrire_meta($nom_meta_base_version, $current_version="1.7.0");
267        }
268}
269
270
271function contacts_vider_tables($nom_meta_base_version) {
272        sql_drop_table("spip_organisations");
273        sql_drop_table("spip_contacts");
274        sql_drop_table("spip_contacts_liens");
275        sql_drop_table("spip_organisations_contacts"); 
276       
277        effacer_meta($nom_meta_base_version);
278}
279
280
281
282function contacts_migrer_liens_auteurs() {
283        // remettre id_auteur sur spip_contacts et spip_organisations
284        include_spip('base/create');
285        maj_tables(array('spip_contacts', 'spip_organisations'));
286        sql_alter('TABLE spip_contacts ADD INDEX (id_auteur)');
287        sql_alter('TABLE spip_organisations ADD INDEX (id_auteur)');
288
289        // pour chaque table, remettre les petits auteurs dans les tables
290        foreach (array('spip_contacts', 'spip_organisations') as $table) {
291                $_id = id_table_objet($table);
292                $auteurs = sql_allfetsel(
293                        array($_id, 'id_objet AS id_auteur'),
294                        $table . '_liens',
295                        array('objet='.sql_quote('auteur'), 'id_objet > 0'));
296                if ($auteurs) {
297                        // on supprime 1 par 1 en cas de timeout
298                        foreach ($auteurs as $r) {
299                                sql_updateq($table, array('id_auteur' => $r['id_auteur']), $_id . '=' . $r[$_id]);
300                                sql_delete($table . '_liens',
301                                        array('objet='.sql_quote('auteur'), 'id_objet=' . $r['id_auteur'], $_id . '=' . $r[$_id]));
302                        }
303                        $auteurs = sql_allfetsel(
304                                array($_id, 'id_objet AS id_auteur'),
305                                $table . '_liens',
306                                array('objet='.sql_quote('auteur'), 'id_objet > 0'));
307                        if (!$auteurs) {
308                                // enlever eventuellement des id_auteur = 0 ?
309                                sql_delete($table . '_liens', 'objet='.sql_quote('auteur'));
310                        } 
311                }
312        }
313}
314
315?>
Note: See TracBrowser for help on using the repository browser.