source: spip-zone/_plugins_/trad-lang/trunk/tradlang_administrations.php @ 119820

Last change on this file since 119820 was 119820, checked in by Cerdic, 15 months ago

Refonte des index sur spip_tradlangs :

  • la declaration etait erronnee car les index pas nommes et une meme cle dans le tableau, donc index pas crees
  • on veut un index unique sur id_tradlang_module,id,lang et plus id,module,lang puisqu'on peut avoir plusieurs fois le meme module
  • index optimise pour les bilans
File size: 13.4 KB
Line 
1<?php
2/**
3 * Plugin Tradlang
4 * Licence GPL (c) 2009-2013
5 */
6
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9}
10
11include_spip('inc/meta');
12
13/**
14 * Fonction d'installation, mise à jour de la base
15 *
16 * @param unknown_type $nom_meta_base_version
17 * @param unknown_type $version_cible
18 */
19function tradlang_upgrade($nom_meta_base_version, $version_cible) {
20        $current_version = 0.0;
21        $maj = array();
22        $maj['create'] = array(
23                array('creer_base'),
24                array('maj_tables',array('spip_auteurs')),
25                array('tradlang_import_ancien_tradlang',true),
26                array('tradlang_maj_modules',true)
27        );
28        $maj['0.3.1'] = array(
29                array('sql_alter',"TABLE spip_tradlang CHANGE status status VARCHAR(16) NOT NULL DEFAULT 'OK'")
30        );
31        $maj['0.3.2'] = array(
32                array('sql_alter','TABLE spip_tradlang_modules CHANGE nom_mod nom_mod VARCHAR(32) NOT NULL'),
33                array('sql_alter','TABLE spip_tradlang_modules CHANGE lang_prefix lang_prefix VARCHAR(32) NOT NULL')
34        );
35        $maj['0.3.3'] = array(
36                array('sql_alter',"TABLE spip_tradlang CHANGE status statut VARCHAR(16) NOT NULL default 'OK'"),
37        );
38        $maj['0.3.4'] = array(
39                array('sql_alter',"TABLE spip_tradlang ADD id_tradlang_module bigint(21) DEFAULT '0' NOT NULL"),
40                array('tradlang_maj_id_tradlang_modules',true)
41        );
42        $maj['0.3.5'] = array(
43                array('maj_tables',array('spip_tradlang')),
44                array('tradlang_maj_tradlang_titre',true)
45        );
46        $maj['0.3.6'] = array(
47                array('maj_tables',array('spip_tradlang'))
48        );
49        $maj['0.3.7'] = array(
50                array('tradlang_maj_traducteurs','true')
51        );
52        $maj['0.3.8'] = array(
53                array('maj_tables',array('spip_tradlang_modules'))
54        );
55        $maj['0.3.9'] = array(
56                array('sql_alter','TABLE spip_tradlang_modules DROP INDEX nom_mod'),
57                array('sql_alter','TABLE spip_tradlang_modules CHANGE nom_mod nom_mod text DEFAULT "" NOT NULL'),
58                array('sql_alter','TABLE spip_tradlang_modules ADD INDEX `nom_mod` ( `nom_mod` ( 255 ) )')
59        );
60        $maj['0.4.0'] = array(
61                array('maj_tables', array('spip_auteurs'))
62        );
63        $maj['0.4.1'] = array(
64                array('sql_alter', 'TABLE spip_tradlang DROP maj'),
65                array('sql_alter', 'TABLE spip_tradlang CHANGE ts maj timestamp(14) NOT NULL'),
66        );
67        $maj['0.4.2'] = array(
68                array('sql_alter', 'TABLE spip_tradlang RENAME spip_tradlangs')
69        );
70        $maj['0.4.3'] = array(
71                array('maj_tables', array('spip_auteurs'))
72        );
73        $maj['0.4.4'] = array(
74                array('maj_tables', array('spip_tradlang_modules'))
75        );
76        $maj['0.4.5'] = array(
77                array('sql_alter', 'TABLE spip_tradlangs ADD INDEX id_tradlang_module (id_tradlang_module)'),
78        );
79        $maj['0.4.6'] = array(
80                array('sql_alter', 'TABLE spip_tradlangs ADD INDEX statut (statut)'),
81        );
82        $maj['0.5.0'] = array(
83                array('creer_base'),
84                array('tradlang_maj_bilans')
85        );
86        $maj['0.5.1'] = array(
87                array('tradlang_maj_attic')
88        );
89        $maj['0.5.2'] = array(
90                array('maj_tables',array('spip_tradlang_modules'))
91        );
92
93        // changement de cle unique sur spip_tradlang_modules
94        $maj['1.0.0'] = array(
95                array('sql_alter','TABLE spip_tradlang_modules DROP INDEX module'),
96                // ajouter le champ dir_module
97                array('sql_alter','TABLE spip_tradlang_modules ADD dir_module varchar(255) NOT NULL DEFAULT \'\''),
98                // on preremplit avec module pour avoir l'unicite
99                array('sql_update','spip_tradlang_modules',array('dir_module' => 'module'), "dir_module=''"),
100                // ajout de l'index unique sur dir_module
101                array('sql_alter','TABLE spip_tradlang_modules ADD UNIQUE INDEX dir_module (dir_module)'),
102                // et on remet un index module simple
103                array('sql_alter','TABLE spip_tradlang_modules ADD INDEX module (module)'),
104        );
105
106        $maj['1.1.0'] = array(
107                // supprimer tous les indexs
108                array('sql_alter','TABLE spip_tradlangs DROP INDEX id'),
109                array('sql_alter','TABLE spip_tradlangs DROP INDEX module'),
110                array('sql_alter','TABLE spip_tradlangs DROP INDEX id_tradlang_module'),
111                array('sql_alter','TABLE spip_tradlangs DROP INDEX statut'),
112                array('sql_alter','TABLE spip_tradlangs DROP INDEX langstatut'),
113                array('sql_alter','TABLE spip_tradlangs DROP INDEX modlangstatut'),
114                array('sql_alter','TABLE spip_tradlangs DROP INDEX idmodlangstatut'),
115                array('sql_alter','TABLE spip_tradlangs DROP INDEX idmodlang'),
116
117                array('sql_alter','TABLE spip_tradlangs ADD UNIQUE INDEX id_tradlang_module_id_lang (id_tradlang_module,id,lang)'),
118                array('sql_alter','TABLE spip_tradlangs ADD INDEX id_tradlang_module (id_tradlang_module)'),
119                array('sql_alter','TABLE spip_tradlangs ADD INDEX id (id)'),
120                array('sql_alter','TABLE spip_tradlangs ADD INDEX lang (lang)'),
121                array('sql_alter','TABLE spip_tradlangs ADD INDEX module (module)'),
122                array('sql_alter','TABLE spip_tradlangs ADD INDEX statut (statut)'),
123                array('sql_alter','TABLE spip_tradlangs ADD INDEX module_lang (module,lang)'),
124        );
125        $maj['1.1.1'] = array(
126                array('sql_alter','TABLE spip_tradlangs ADD INDEX id_tradlang_module_lang_statut (id_tradlang_module,lang,statut)'),
127        );
128
129        include_spip('base/upgrade');
130        maj_plugin($nom_meta_base_version, $version_cible, $maj);
131}
132
133/**
134 * Fonction d'import de l'ancien tradlang
135 * Ne devrait être utile que sur spip.net mais sais t on jamais
136 */
137function tradlang_import_ancien_tradlang($affiche = false) {
138        /**
139         * On insère les modules
140         */
141        $modules = sql_select('*', 'trad_lang', '', array('module'));
142        while ($module=sql_fetch($modules)) {
143                $id_module = sql_insertq('spip_tradlang_modules', array('module' => $module['module'], 'nom_mod' => $module['module']));
144                /**
145                 * On insére les anciens tradlang
146                 */
147                //$docs = array_map('reset',sql_allfetsel('id_document','spip_documents',"statut='0'",'','',"0,100"));
148                $strings = sql_allfetsel('id,module,lang,str,comm,status,traducteur,ts,md5,orig,date_modif', 'trad_lang', 'module = ' . sql_quote($module['module']). ' AND orig!="2"', '', '', '0,100');
149                $count = 0;
150                while (count($strings)) {
151                        foreach ($strings as $id => $string) {
152                                $string['titre'] = $string['id'].' : '.$string['module'].' - '.$string['lang'];
153                                if (!$string['md5']) {
154                                        $string['md5'] = md5($string['str']);
155                                }
156                                $string['langue_choisie'] = 'non';
157                                $string['id_tradlang_module'] = $id_module;
158                                $string['statut'] = $string['status'] ? $string['status'] : 'OK';
159                                $string['maj'] = $string['ts'];
160                                unset($string['ts']);
161                                unset($string['status']);
162                                sql_insertq('spip_tradlangs', $string);
163                                sql_updateq('trad_lang', array('orig' => 2), 'str=' . sql_quote($string['str']) . ' AND lang= ' . sql_quote($string['lang']));
164                        }
165                        if ($affiche) {
166                                echo ' .';
167                        }
168                        $count = $count+count($strings);
169                        spip_log($count, 'tradlang');
170                        $strings = sql_allfetsel('id,module,lang,str,comm,status,traducteur,ts,md5,orig,date_modif', 'trad_lang', 'module = ' . sql_quote($module['module']). ' AND orig!="2"', '', '', '0,100');
171                }
172        }
173}
174function tradlang_maj_id_tradlang_modules($affiche = false) {
175        $strings = array_map('reset', sql_allfetsel('id_tradlang', 'spip_tradlangs', 'id_tradlang_module=0', '', '', '0,100'));
176        while (count($strings)) {
177                foreach ($strings as $id_tradlang) {
178                        $module = sql_getfetsel('module', 'spip_tradlangs', 'id_tradlang = ' . intval($id_tradlang));
179                        $id_tradlang_module = sql_getfetsel('id_tradlang_module', 'spip_tradlang_modules', 'module = ' . sql_quote($module));
180                        sql_updateq('spip_tradlangs', array('id_tradlang_module' => $id_tradlang_module), 'id_tradlang = ' . intval($id_tradlang));
181                }
182                if ($affiche) {
183                        echo ' .';
184                }
185                $strings = array_map('reset', sql_allfetsel('id_tradlang', 'spip_tradlangs', 'id_tradlang_module=0', '', '', '0,100'));
186        }
187}
188
189function tradlang_maj_tradlang_titre($affiche = false) {
190        $strings = array_map('reset', sql_allfetsel('id_tradlang', 'spip_tradlangs', 'titre=""', '', '', '0,500'));
191        while (count($strings)) {
192                foreach ($strings as $id_tradlang) {
193                        $tradlang = sql_fetsel('*', 'spip_tradlangs', 'id_tradlang = ' . intval($id_tradlang));
194                        $titre = $tradlang['id'].' : '.$tradlang['module'].' - '.$tradlang['lang'];
195                        sql_updateq('spip_tradlangs', array('titre' => $titre), 'id_tradlang='.intval($id_tradlang));
196                }
197                if ($affiche) {
198                        echo ' .';
199                }
200                $strings = array_map('reset', sql_allfetsel('id_tradlang', 'spip_tradlangs', 'titre=""', '', '', '0,500'));
201        }
202}
203
204function tradlang_maj_modules($affiche = false) {
205        $tradlang_verifier_langue_base = charger_fonction('tradlang_verifier_langue_base', 'inc');
206        /**
207         * On update les modules
208         */
209        $modules = sql_select('*', 'spip_tradlang_modules', 'module NOT LIKE "attic%" AND module !=' . sql_quote('attic'));
210
211        while ($module = sql_fetch($modules)) {
212                spip_log($module['module'], 'tradlang');
213                if ($affiche) {
214                        echo ' .';
215                }
216                $langues = sql_select('lang', 'spip_tradlangs', 'id_tradlang_module = ' . intval($module['id_tradlang_module']).' AND lang!='.sql_quote($module['lang_mere']), array('lang'));
217                while ($lang = sql_fetch($langues)) {
218                        $modifs = $tradlang_verifier_langue_base($module['module'],$lang['lang']);
219                }
220        }
221}
222
223/**
224 * On remet les traducteurs des locutions
225 */
226function tradlang_maj_traducteurs($affiche = false) {
227        $chaines_traducteurs = sql_select('*', 'trad_lang', 'status = "" AND traducteur != ""');
228        while ($traduction = sql_fetch($chaines_traducteurs)) {
229                sql_updateq('spip_tradlangs', array('traducteur' => $traduction['traducteur']), 'module = '.sql_quote($traduction['module']).' AND id = ' . sql_quote($traduction['id']) . ' AND lang = ' . sql_quote($traduction['lang']));
230        }
231
232        $chaines_traducteurs_modif = sql_select('*', 'trad_lang', 'status = "MODIF" AND traducteur != ""');
233        while ($traduction = sql_fetch($chaines_traducteurs_modif)) {
234                sql_updateq('spip_tradlangs', array('traducteur' => $traduction['traducteur']), 'module = '.sql_quote($traduction['module']).' AND id='.sql_quote($traduction['id']).' AND lang='.sql_quote($traduction['lang']));
235        }
236}
237
238/**
239 * On crée les bilans de chaque langue de chaque module
240 */
241function tradlang_maj_bilans($affiche = false) {
242        $modules = sql_select('id_tradlang_module, module, lang_mere', 'spip_tradlang_modules');
243
244        /**
245         * On passe d'abord les modules un par un
246         * On récupère $total qui est le total des chaines de la langue mère
247         */
248        while ($module = sql_fetch($modules)) {
249                /**
250                 * Si on n'est pas dans un module type attic
251                 */
252                if (substr($module['module'], 0, 5) != 'attic') {
253                        $total = sql_countsel('spip_tradlangs', 'module = ' . sql_quote($module['module']) . ' AND lang = ' . sql_quote($module['lang_mere']));
254                        $langues_base = sql_select('lang', 'spip_tradlangs', 'module = ' . sql_quote($module['module']), 'lang');
255                        /**
256                         * On passe ensuite chaque langue de ce module en revue
257                         * On insère une entrée pour chaque langue de chaque module
258                         */
259                        while ($langue = sql_fetch($langues_base)) {
260                                $lang = $langue['lang'];
261                                $chaines_ok = sql_countsel('spip_tradlangs', 'module=' . sql_quote($module['module']).' AND lang='.sql_quote($lang).' AND statut="OK"');
262                                $chaines_relire = sql_countsel('spip_tradlangs', 'module='.sql_quote($module['module']).' AND lang='.sql_quote($lang).' AND statut="RELIRE"');
263                                $chaines_modif = sql_countsel('spip_tradlangs', 'module='.sql_quote($module['module']).' AND lang='.sql_quote($lang).' AND statut="MODIF"');
264                                $chaines_new = sql_countsel('spip_tradlangs', 'module='.sql_quote($module['module']).' AND lang='.sql_quote($lang).' AND statut="NEW"');
265                                $infos_bilan = array(
266                                                                        'id_tradlang_module' => $module['id_tradlang_module'],
267                                                                        'module' => $module['module'],
268                                                                        'lang' => $lang,
269                                                                        'chaines_total' => $total,
270                                                                        'chaines_ok' => $chaines_ok,
271                                                                        'chaines_relire' => $chaines_relire,
272                                                                        'chaines_modif' => $chaines_modif,
273                                                                        'chaines_new' => $chaines_new
274                                                                );
275                                sql_insertq('spip_tradlangs_bilans', $infos_bilan);
276                        }
277                }
278        }
279}
280
281function tradlang_maj_attic($affiche = false) {
282        /**
283         * Dans un premier temps, on supprimer les attics qui ont un statut NEW,
284         * il ne serviront jamaiscar même récupérés, ils ne sont pas traduit
285         */
286        sql_delete('spip_tradlangs', 'module LIKE "attic%" AND statut="NEW"');
287        $select_attic_id_module = sql_select('*', 'spip_tradlangs', 'module LIKE "attic%"', 'id_tradlang_module');
288        while ($id_module = sql_fetch($select_attic_id_module)) {
289                $module = sql_getfetsel('module', 'spip_tradlang_modules', 'id_tradlang_module = ' . intval($id_module['id_tradlang_module']));
290                if ($module) {
291                        $attics_module = sql_select('id_tradlang,id,module,lang', 'spip_tradlangs', 'id_tradlang_module = ' . intval($id_module['id_tradlang_module']) . ' AND module LIKE "attic%"');
292                        while ($id_tradlang = sql_fetch($attics_module)) {
293                                if (!sql_getfetsel('id_tradlang', 'spip_tradlangs', 'id = ' . sql_quote($id_tradlang['id']).' AND module = ' . sql_quote($id_tradlang['module']).' AND lang = ' . sql_quote($id_tradlang['lang']))) {
294                                        sql_updateq('spip_tradlangs', array('statut' => 'attic', 'module' => $module), 'id_tradlang = ' . intval($id_tradlang['id_tradlang']));
295                                } else {
296                                        sql_delete('spip_tradlangs', 'id_tradlang = ' . intval($id_tradlang['id_tradlang']));
297                                }
298                        }
299                }
300        }
301        sql_delete('spip_tradlang_modules', 'module LIKE "attic%"');
302}
303/**
304 * Fonction de desinstallation
305 * On supprime :
306 * -* la table spip_tradlangs
307 * -* la table spip_tradlang_modules
308 * -* la table spip_tradlangs_bilans
309 * -* les éléments de spip_versions concernant l'obet tradlang
310 * -* les éléments de spip_versions_fragments concernant l'obet tradlang
311 * @param unknown_type $nom_meta_base_version
312 */
313function tradlang_vider_tables($nom_meta_base_version) {
314        sql_drop_table('spip_tradlangs');
315        sql_drop_table('spip_tradlang_modules');
316        sql_drop_table('spip_tradlangs_bilans');
317        sql_delete('spip_versions', 'objet = ' . sql_quote('tradlang'));
318        sql_delete('spip_versions_fragments', 'objet = ' . sql_quote('tradlang'));
319        effacer_meta($nom_meta_base_version);
320}
Note: See TracBrowser for help on using the repository browser.