source: spip-zone/_plugins_/contacts_et_organisations/trunk/contacts_administrations.php @ 83082

Last change on this file since 83082 was 83082, checked in by marcimat@…, 7 years ago

Report de 83081 : ajouter des index sur les champs objet et id_objet des tables de liaisons pour accélerer des jointures SQL

  • Property svn:executable set to *
File size: 12.6 KB
Line 
1<?php
2/**
3 * Fichier gérant l'installation et désinstallation du plugin
4 *
5 * @plugin Contacts & Organisations pour Spip 3.0
6 * @license GPL (c) 2009 - 2013
7 * @author Cyril Marion, Matthieu Marcillaud, Rastapopoulos
8 *
9 * @package SPIP\Contacts\Installation
10**/
11
12// sécurité
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15include_spip('inc/meta');
16include_spip('base/create');
17
18/**
19 * Installation/maj des tables contacts, organisations et leurs liaisons
20 *
21 * @param string $nom_meta_base_version
22 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
23 * @param string $version_cible
24 *     Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
25 * @return void
26 */
27function contacts_upgrade($nom_meta_base_version, $version_cible){
28        $maj = array();
29       
30        $maj['create'] = array(
31                array('creer_base'),
32        );
33       
34        $maj['1.1.0'] = array(
35                array('sql_alter', 'TABLE spip_contacts CHANGE prenom prenom tinytext NOT NULL DEFAULT ""'),
36        );
37       
38        $maj['1.1.1'] = array(
39                array('maj_tables', 'spip_contacts'),
40        );
41       
42        // Dupliquer pour les jointures automatiques
43        $maj['1.1.2'] = array(
44                array('maj_tables', array('spip_contacts', 'spip_comptes')),
45                array('sql_alter', 'TABLE spip_contacts ADD INDEX (id_contact)'),
46                array('sql_alter', 'TABLE spip_comptes ADD INDEX (id_compte)'),
47                array('sql_alter', 'TABLE spip_comptes_contacts ADD INDEX (id_contact)'),
48                array('sql_update', 'spip_contacts', array('id_contact'=>'id_auteur')),
49                array('sql_update', 'spip_comptes', array('id_compte'=>'id_auteur')),
50        );
51       
52        // On passe de compte à organisation
53        $maj['1.2.0'] = array(
54                array('sql_alter', 'TABLE spip_comptes DROP INDEX id_compte'),
55                array('sql_alter', 'TABLE spip_comptes_contacts DROP INDEX id_compte'),
56               
57                array('sql_alter', 'TABLE spip_comptes RENAME spip_organisations'),
58                array('sql_alter', 'TABLE spip_comptes_contacts RENAME spip_organisations_contacts'),
59
60                array('sql_alter', 'TABLE spip_organisations CHANGE id_compte id_organisation bigint(21) NOT NULL'),
61                array('sql_alter', 'TABLE spip_organisations_contacts CHANGE id_compte id_organisation bigint(21) NOT NULL'),
62
63                array('sql_alter', 'TABLE spip_organisations ADD INDEX (id_organisation)'),
64                array('sql_alter', 'TABLE spip_organisations_contacts ADD INDEX (id_organisation)'),           
65        );
66       
67        // On modifie quelques champs de la table organisations
68        $maj['1.2.1'] = array(
69                // renomme le champ 'type' en 'statut_juridique'
70                array('sql_alter', "TABLE spip_organisations CHANGE type statut_juridique TINYTEXT NOT NULL DEFAULT ''"),
71                // renomme le champ 'siret' en 'identification'
72                array('sql_alter', "TABLE spip_organisations CHANGE siret identification TINYTEXT NOT NULL DEFAULT ''"),
73                // ajoute le champ 'activite'
74                array('sql_alter', "TABLE spip_organisations ADD activite TINYTEXT NOT NULL DEFAULT '' AFTER identification"),
75        );
76       
77        // Les clés primaires des tables contacts et organisations
78        // passent sur le id_contact et id_organisation au lieu du id_auteur
79        // afin de gérer éventuellement des contacts/organisations autonomes.
80        $maj['1.3.0'] = array(
81                array('sql_alter', 'TABLE spip_organisations DROP INDEX id_organisation'),
82                array('sql_alter', 'TABLE spip_organisations DROP PRIMARY KEY'),
83                array('sql_alter', 'TABLE spip_organisations CHANGE id_auteur id_auteur bigint(21) NOT NULL'), 
84                array('sql_alter', 'TABLE spip_organisations CHANGE id_organisation id_organisation bigint(21) NOT NULL auto_increment PRIMARY KEY'),
85                array('sql_alter', 'TABLE spip_organisations ADD INDEX (id_auteur)'),
86               
87                array('sql_alter', 'TABLE spip_contacts DROP INDEX id_contact'),
88                array('sql_alter', 'TABLE spip_contacts DROP PRIMARY KEY'),
89                array('sql_alter', 'TABLE spip_contacts CHANGE id_auteur id_auteur bigint(21) NOT NULL'), 
90                array('sql_alter', 'TABLE spip_contacts CHANGE id_contact id_contact bigint(21) NOT NULL auto_increment PRIMARY KEY'),
91                array('sql_alter', 'TABLE spip_contacts ADD INDEX (id_auteur)'),
92        );
93       
94        $maj['1.3.1'] = array(
95                array('sql_alter', "TABLE spip_contacts CHANGE descriptif descriptif TEXT DEFAULT '' NOT NULL"),
96                array('sql_alter', "TABLE spip_organisations CHANGE descriptif descriptif TEXT DEFAULT '' NOT NULL"),
97        );
98       
99        $maj['1.3.3'] = array(
100                array('sql_alter', "TABLE spip_contacts CHANGE descriptif descriptif TEXT DEFAULT '' NOT NULL"),
101        );
102       
103        // le champ id_auteur sur spip_organisations peut ne pas etre unique si une organisation
104        // n'est pas liee a un auteur (id_auteur=0). Plus tard, il faudra certainement mettre une
105        // table de relation spip_organisations_liens pour cela.
106        $maj['1.3.4'] = array(
107                // pas de UNIQUE sur l'index auteur
108                array('sql_alter', "TABLE spip_organisations DROP INDEX id_auteur"),
109                array('sql_alter', "TABLE spip_organisations CHANGE id_auteur id_auteur bigint(21) DEFAULT 0 NOT NULL"),
110                array('sql_alter', "TABLE spip_organisations ADD INDEX (id_auteur)"),
111        );
112       
113        // Le champ id_parent sur spip_organisations pour définir des hiérarchies d'organisations.
114        $maj['1.3.5'] = array(
115                array('sql_alter', "TABLE spip_organisations ADD COLUMN id_parent bigint(21) DEFAULT 0 NOT NULL"),
116        );
117       
118        // Le champ type_liaison sur spip_organisations_contacts pour définir des types de liaisons donc.
119        $maj['1.3.6'] = array(
120                array('sql_alter', "TABLE spip_organisations_contacts ADD COLUMN type_liaison tinytext NOT NULL DEFAULT ''"),
121        );
122       
123        // On crée la table spip_organisations_liens
124        $maj['1.3.7'] = array(
125                array('maj_tables', 'spip_organisations_liens'),
126        );
127       
128        // Coquille sur la clé de spip_organisations_liens
129        $maj['1.4.1'] = array(
130                array('sql_alter', 'TABLE spip_organisations DROP INDEX id_contact'),
131                array('sql_alter', 'TABLE spip_organisations ADD INDEX (id_organisation)'),
132        );
133       
134        // Rajout d'un type_liaison dans les liens
135        $maj['1.4.2'] = array(
136                array('maj_tables', array('spip_contacts_liens', 'spip_organisations_liens')),
137                array('sql_alter', 'TABLE `spip_organisations_liens` DROP PRIMARY KEY'),
138                array('sql_alter', 'TABLE `spip_organisations_liens` ADD PRIMARY KEY ( `id_organisation` , `id_objet` , `objet`, `type_liaison`(25)) '),
139                array('sql_alter', 'TABLE `spip_contacts_liens` DROP PRIMARY KEY'),
140                array('sql_alter', 'TABLE `spip_contacts_liens` ADD PRIMARY KEY ( `id_contact` , `id_objet` , `objet`, `type_liaison`(25)) '),
141        );
142       
143        /*
144        Il s'agissait de supprimer spip_organisations_contacts
145        pour le mettre dans spip_organisations_liens...
146        ce qui s'est avéré très bugué en spip 2.1...
147        La version 1.6.0 fait l'inverse de 1.5.0 du coup, pour remettre dans l'ordre
148        */
149        $maj['1.6.0'] = array(
150                array('contacts_maj_1_6_0'),
151        );
152       
153        $maj['1.7.1'] = array(
154                array('contacts_migrer_liens_auteurs'),
155        );
156
157        // type_liaison en VARCHAR pour que sqlite ET mysql soient contents
158        $maj['1.7.2'] = array(
159                array('sql_alter', 'TABLE spip_organisations_liens DROP PRIMARY KEY'),
160                array('sql_alter', "TABLE spip_organisations_liens CHANGE type_liaison type_liaison VARCHAR(25) NOT NULL DEFAULT ''"),
161                array('sql_alter', 'TABLE spip_organisations_liens ADD PRIMARY KEY ( id_organisation, id_objet, objet, type_liaison)'),
162
163                array('sql_alter', 'TABLE spip_contacts_liens DROP PRIMARY KEY'),
164                array('sql_alter', "TABLE spip_contacts_liens CHANGE type_liaison type_liaison VARCHAR(25) NOT NULL DEFAULT ''"),
165                array('sql_alter', 'TABLE spip_contacts_liens ADD PRIMARY KEY ( id_contact, id_objet, objet, type_liaison)'),
166        );
167       
168        // Pour ceux qui ont déjà le plugin installé, on active déjà la gestion de l'arborescence pour garder la compat
169        $maj['1.8.0'] = array(
170                array('include_spip', 'inc/config'),
171                array('ecrire_config', 'contacts_et_organisations/utiliser_organisations_arborescentes', 'on'),
172        );
173       
174        // Ajout de la gestion d'annuaires différents
175        $maj['1.9.0'] = array(
176                array('maj_tables', array('spip_annuaires', 'spip_organisations', 'spip_contacts')),
177        );
178       
179        // Ajout de la possibilité de lier les fiches à n'importe quels objets, pas juste les rubriques
180        // Il faut donc migrer l'option lier_organisations_rubriques vers une autre plus générique
181        $maj['1.10.0'] = array(
182                array('contacts_maj_1_10_0'),
183        );
184
185        // Index sur les id_objet et objet des tables de liaisons
186        $maj['1.10.1'] = array(
187                array('sql_alter', 'TABLE spip_contacts_liens ADD INDEX (id_objet)'),
188                array('sql_alter', 'TABLE spip_contacts_liens ADD INDEX (objet)'),
189                array('sql_alter', 'TABLE spip_organisations_liens ADD INDEX (id_objet)'),
190                array('sql_alter', 'TABLE spip_organisations_liens ADD INDEX (objet)'),
191        );
192
193        include_spip('base/upgrade');
194        maj_plugin($nom_meta_base_version, $version_cible, $maj);
195}
196
197
198/**
199 * Désinstallation/suppression des tables contacts, organisations et leurs liaisons
200 *
201 * @param string $nom_meta_base_version
202 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
203 * @return void
204 */
205function contacts_vider_tables($nom_meta_base_version) {
206        sql_drop_table('spip_annuaires');
207        sql_drop_table("spip_organisations");
208        sql_drop_table("spip_contacts");
209        sql_drop_table("spip_contacts_liens");
210        sql_drop_table("spip_organisations_contacts");
211        sql_drop_table("spip_organisations_liens");
212
213        # Nettoyer les versionnages, forums et urls
214        $in = sql_in("objet", array('organisations', 'contacts', 'annuaires'));
215        sql_delete("spip_versions", $in);
216        sql_delete("spip_versions_fragments", $in);
217        sql_delete("spip_forum", $in);
218        sql_delete("spip_urls", sql_in("type", array('organisation', 'contact', 'annuaire')));
219
220        effacer_meta($nom_meta_base_version);
221}
222
223
224/**
225 * Mise à jour 1.6.0 de la structure de base de données du plugin
226 *
227 * L'inverse de la defunte 1.5.0 : remet la table spip_organisations_contacts
228 * pour les liens entre contacts et organisations. Utiliser
229 * spip_organisations_liens pour ça créait des bugs et des confusions.
230**/
231function contacts_maj_1_6_0(){
232        // remettre spip_organisations_contacts si besoin
233        creer_base();
234       
235        // repeupler
236        $contacts = sql_allfetsel(
237                array('id_objet AS id_contact', 'id_organisation', 'type_liaison'),
238                'spip_organisations_liens',
239                array('objet='.sql_quote('contact'), 'id_objet > 0')
240        );
241        if ($contacts) {
242                $inserts = array();
243                foreach ($contacts as $r) {
244                        $inserts[] = array(
245                                'id_organisation' => $r['id_organisation'],
246                                'id_contact' => $r['id_contact'],
247                'type_liaison' => $r['type_liaison'],
248                        );
249                }
250                if ($inserts) {
251                        sql_insertq_multi('spip_organisations_contacts', $inserts);
252                }
253        }
254
255        // enlever les contacts de spip_organisations_liens
256        sql_delete('spip_organisations_liens', 'objet='.sql_quote('contact'));
257}
258
259
260/**
261 * Mise à jour 1.7.1 de la structure de base de données du plugin
262 *
263 * Remet la colonne id_auteur sur les tables contacts et organisations.
264**/
265function contacts_migrer_liens_auteurs() {
266        // remettre id_auteur sur spip_contacts et spip_organisations
267        include_spip('base/create');
268        maj_tables(array('spip_contacts', 'spip_organisations'));
269        sql_alter('TABLE spip_contacts ADD INDEX (id_auteur)');
270        sql_alter('TABLE spip_organisations ADD INDEX (id_auteur)');
271
272        // pour chaque table, remettre les petits auteurs dans les tables
273        foreach (array('spip_contacts', 'spip_organisations') as $table) {
274                $_id = id_table_objet($table);
275                $auteurs = sql_allfetsel(
276                        array($_id, 'id_objet AS id_auteur'),
277                        $table . '_liens',
278                        array('objet='.sql_quote('auteur'), 'id_objet > 0'));
279                if ($auteurs) {
280                        // on supprime 1 par 1 en cas de timeout
281                        foreach ($auteurs as $r) {
282                                sql_updateq($table, array('id_auteur' => $r['id_auteur']), $_id . '=' . $r[$_id]);
283                                sql_delete($table . '_liens',
284                                        array('objet='.sql_quote('auteur'), 'id_objet=' . $r['id_auteur'], $_id . '=' . $r[$_id]));
285                        }
286                        $auteurs = sql_allfetsel(
287                                array($_id, 'id_objet AS id_auteur'),
288                                $table . '_liens',
289                                array('objet='.sql_quote('auteur'), 'id_objet > 0'));
290                        if (!$auteurs) {
291                                // enlever eventuellement des id_auteur = 0 ?
292                                sql_delete($table . '_liens', 'objet='.sql_quote('auteur'));
293                        } 
294                }
295        }
296}
297
298/**
299 * Mise à jour de la base 1.10.0
300 *
301 * Déplace l'option lier_organisations_rubriques vers lier_organisations_objets plus générique
302 *
303 * @return void
304 */
305function contacts_maj_1_10_0() {
306        include_spip('inc/config');
307        $lier_organisations_rubriques = lire_config('contacts_et_organisations/lier_organisations_rubriques');
308       
309        // On supprime l'ancienne option
310        effacer_config('contacts_et_organisations/lier_organisations_rubriques');
311       
312        // Si l'option était activée, on la réactive autre part
313        if ($lier_organisations_rubriques){
314                ecrire_config('contacts_et_organisations/lier_organisations_objets', array('spip_rubriques'));
315        }
316}
317
318?>
Note: See TracBrowser for help on using the repository browser.