source: spip-zone/_plugins_/isocode/trunk/inc/isocode.php @ 125432

Last change on this file since 125432 was 125432, checked in by Eric Lupinacci, 4 months ago

Création d'un nouveau type de service infrasubdivision pour permettre de gérer la nomenclature des infra subdivisions des pays.
Ajout des infra subdivisions de la france : communes et arrondisssements (pas de cantons pour l'instant).

  • Property svn:eol-style set to native
File size: 11.7 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'ensemble des fonctions implémentant l'API du plugin.
4 *
5 * @package SPIP\ISOCODE\API
6 */
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9}
10
11
12/**
13 * Charge en base de données une liste de tables de codes ISO donnée.
14 * Si la liste est vide, la fonction charge toutes les tables disponibles.
15 *
16 * @api
17 * @filtre
18 *
19 * @uses consigner_chargement()
20 * @uses lire_source()
21 * @uses isocode_decharger_tables()
22 *
23 * @param string $type    Type de service. Prend les valeurs `nomenclature`, `infrasubdivision` ou `geometrie`.
24 * @param string $table
25 * @param string $service
26 *
27 * @return array
28 *      Tableau associatif résultat de l'action de vidage:
29 *      - index `ok`         : `true` si le vidage a réussi, `false` sinon.
30 *      - index `elements_ok`  : liste des tables vidées avec succès ou tableau vide sinon.
31 *      - index `elements_nok` : liste des tables en erreur ou tableau vide sinon.
32 *      - index `elements_sha` : liste des tables inchangées (SHA identique) ou tableau vide sinon.
33 */
34function isocode_charger($type, $service, $table) {
35
36        $retour = array(
37                'erreur'  => '',
38                'type'    => $type,
39                'service' => $service,
40                'table'   => $table,
41        );
42
43        // Lecture des données contenues soit dans un fichier, soit dans une page web, soit dans le retour d'une API REST
44        // et renvoie une liste d'éléments prêts à être enregistrés dans la table concernée.
45        // Si la table est déjà chargée et que le fichier ou la page source n'a pas changé, la fonction de
46        // lecture ne renvoie aucun élément pour éviter des traitements inutiles mais renvoie un indicateur
47        // sur le SHA.
48        $erreur = true;
49
50        spip_timer('lire');
51        include_spip('inc/isocode_utils');
52        list($enregistrements, $sha, $source_identique) = lire_source($type, $service, $table);
53        $duree_lire = spip_timer('lire');
54        if ($enregistrements) {
55                spip_timer('ecrire');
56                // Suppression des éléments éventuels déjà chargés. On ne gère pas d'erreur
57                // sur ce traitement car elle sera forcément détectée lors de l'insertion qui suit.
58                isocode_decharger($type, $service, $table);
59
60                // Insertion dans la base de données des éléments extraits
61                if (inserer_enregistrements($type, $enregistrements, $table)) {
62                        // On stocke les informations de chargement de la table dans une meta.
63                        $meta = array(
64                                'sha'     => $sha,
65                                'nbr'     => count($enregistrements),
66                                'maj'     => date('Y-m-d H:i:s')
67                        );
68                        consigner_chargement($meta, $type, $service, $table);
69                        $erreur = false;
70                }
71                $duree_ecrire = spip_timer('ecrire');
72                spip_log("La table <${table}> a été chargée via le service <${service}> (lecture source: ${duree_lire} - insertion BD: ${duree_ecrire})", 'isocode' . _LOG_DEBUG);
73        }
74
75        // Si la table est en erreur, on passe l'indicateur global à erreur et on stocke la table en nok
76        // ou en sha identique suivant la cas.
77        // Si le traitement est ok on stocke juste la table.
78        if ($erreur) {
79                if ($source_identique) {
80                        $retour['erreur'] = 'sha';
81                } else {
82                        $retour['erreur'] = 'nok';
83                }
84        }
85
86        return $retour;
87}
88
89
90/**
91 * Supprime en base de données, le contenu des tables de codes ISO choisies.
92 * Si la liste des tables est vide la fonction considère que toutes les tables doivent être vidées.
93 * La meta concernant les informations de chargement de chaque table est aussi effacée.
94 *
95 * @api
96 * @filtre
97 *
98 * @uses isocode_lister_tables()
99 *
100 * @param string $type
101 * @param string $service
102 * @param string $table
103 *      Liste des tables à vider. Si le tableau est vide l'ensemble des tables
104 *      seront vidées.
105 *      Les tables doivent être libellées sans le préfixe `spip_`.
106 *
107 * @return array
108 *      Tableau associatif résultat de l'action de vidage:
109 *      - index `ok`         : `true` si le vidage a réussi, `false` sinon.
110 *      - index `elements_ok`  : liste des tables vidées avec succès ou tableau vide sinon.
111 *      - index `elements_nok` : liste des tables en erreur ou tableau vide sinon.
112 */
113function isocode_decharger($type, $service, $table) {
114
115        $retour = array(
116                'erreur'  => '',
117                'type'    => $type,
118                'service' => $service,
119                'table'   => $table,
120        );
121
122        $where = ($type === 'nomenclature')
123                ? array()
124                : array('service=' . sql_quote($service));
125        $sql_ok = sql_delete("spip_${table}", $where);
126        if ($sql_ok !== false) {
127                // Supprimer la meta propre à la table.
128                include_spip('inc/isocode_utils');
129                deconsigner_chargement($type, $service, $table);
130        } else {
131                $retour['erreur'] = 'nok';
132        }
133
134        return $retour;
135}
136
137
138/**
139 * Retourne la liste des services disponibles pour le chargement des tables de codes ISO.
140 * La fonction lit les sous-répertoires du répertoire `services/` du plugin et vérifie qu'un fichier
141 * d'API existe.
142 *
143 * @api
144 * @filtre
145 *
146 * @return array
147 *      La liste des services disponibles ou tableau vide aucun service n'est détecté.
148 */
149function isocode_lister_types_service() {
150
151        static $types = array();
152
153        if (!$types) {
154                if ($dossiers = glob(_DIR_PLUGIN_ISOCODE . 'services/*', GLOB_ONLYDIR)) {
155                        foreach ($dossiers as $_dossier) {
156                                $types[] = strtolower(basename($_dossier));
157                        }
158                }
159        }
160        return $types;
161}
162
163
164/**
165 * Retourne la liste des services disponibles pour le chargement des tables de codes ISO.
166 * La fonction lit les sous-répertoires du répertoire `services/` du plugin et vérifie qu'un fichier
167 * d'API existe.
168 *
169 * @api
170 * @filtre
171 *
172 * @return array
173 *      La liste des services disponibles ou tableau vide aucun service n'est détecté.
174 */
175function isocode_lister_services($type) {
176
177        static $services = array();
178
179        if (
180                $type
181                and !isset($services[$type])
182        ) {
183                if ($type === 'nomenclature') {
184                        if ($dossiers = glob(_DIR_PLUGIN_ISOCODE . "services/${type}/*", GLOB_ONLYDIR)) {
185                                foreach ($dossiers as $_dossier) {
186                                        $service = strtolower(basename($_dossier));
187                                        if (file_exists($f = _DIR_PLUGIN_ISOCODE . "services/${type}/${service}/${service}_api.php")) {
188                                                $services[$type][] = $service;
189                                        }
190                                }
191                        }
192                } else {
193                        // Contours géométriques : les services sont décrits dans la configuration incluse dans le fichier
194                        // geometrie_api.php
195                        include_spip("services/${type}/${type}_api");
196                        $services[$type] = array_keys($GLOBALS['isocode'][$type]);
197                }
198        }
199
200        return isset($services[$type]) ? $services[$type] : array();
201}
202
203
204/**
205 * Détermine le service associé au chargement de la table de codes ISO choisie.
206 * Si la table est vide ou invalide, la fonction renvoie une chaîne vide.
207 *
208 * @api
209 * @filtre
210 *
211 * @uses isocode_lister_services()
212 *
213 * @param $table
214 *      Nom d'une table sans le préfixe `spip_`.
215 *
216 * @return string|array
217 *      Le ou les services associés à la table fournie suivant le type de service.
218 *      - nomenclature : service unique permettant le chargement de la table ou chaîne vide.
219 *      - geometrie    : tableau des services permettant le chargement de la table ou tableau vide.
220 */
221function isocode_trouver_service($type, $table) {
222
223        static $tables = array();
224        static $services = array();
225        $services_trouves = ($type === 'nomenclature') ? '' : array();
226
227        if ($type) {
228                if (!isset($services[$type])) {
229                        $services[$type] = isocode_lister_services($type);
230                }
231                if (!isset($tables[$type])) {
232                        $tables[$type] = isocode_lister_tables($type);
233                }
234
235                if (in_array($table, $tables[$type])) {
236                        if ($type === 'nomenclature') {
237                                foreach ($services[$type] as $_service) {
238                                        include_spip("services/${type}/${_service}/${_service}_api");
239                                        if (isset($GLOBALS['isocode'][$_service][$table])) {
240                                                $services_trouves = $_service;
241                                                break;
242                                        }
243                                }
244                        } else {
245                                // Détermination du ou des services pour le type géométrie
246                                include_spip("services/${type}/${type}_api");
247                                foreach ($services[$type] as $_service) {
248                                        if ($GLOBALS['isocode'][$type][$_service]['table'] === $table) {
249                                                $services_trouves[] = $_service;
250                                        }
251                                }
252                        }
253                }
254        }
255
256        return $services_trouves;
257}
258
259
260/**
261 * Retourne la liste de toutes les tables gérées par le plugin ou de celles associées à un ou plusieurs
262 * services donnés.
263 *
264 * @api
265 * @filtre
266 *
267 * @uses isocode_lister_services()
268 * @uses service_est_disponible()
269 *
270 * @param array $services
271 *      Liste des services pour lesquels la liste des tables associées est demandée.
272 *      Si la liste est vide la fonction renvoie les tables de tous les services disponibles.
273 *
274 * @return array
275 *      Liste des tables sans le préfixe `spip_`.
276 */
277function isocode_lister_tables($type, $avec_groupes = false) {
278
279        $tables = array();
280
281        // On vérifie l'argument type de service qui est vide si tous les types sont requis.
282        if ($type) {
283                $services = isocode_lister_services($type);
284                if ($type === 'nomenclature') {
285                        // On collecte pour chaque service, la liste des tables qu'il supporte.
286                        foreach ($services as $_service) {
287                                include_spip("services/${type}/${_service}/${_service}_api");
288                                if (!$avec_groupes) {
289                                        $tables = array_merge($tables, array_keys($GLOBALS['isocode'][$_service]));
290                                } else {
291                                        foreach ($GLOBALS['isocode'][$_service] as $_table => $_config) {
292                                                $groupe = $_config['groupe'];
293                                                $tables[$groupe][] = $_table;
294                                        }
295                                }
296                        }
297                } else {
298                        // Un service ne concerne qu'une seule table
299                        include_spip("services/${type}/${type}_api");
300                        foreach ($services as $_service) {
301                                $tables[] = $GLOBALS['isocode'][$type][$_service]['table'];
302                        }
303                        $tables = array_unique($tables);
304                }
305        }
306
307        return $tables;
308}
309
310
311/**
312 * Détermine le service associé au chargement de la table de codes ISO choisie.
313 * Si la table est vide ou invalide, la fonction renvoie une chaîne vide.
314 *
315 * @api
316 * @filtre
317 *
318 * @uses isocode_lister_services()
319 *
320 * @param $table
321 *      Nom d'une table sans le préfixe `spip_`.
322 *
323 * @return string|array
324 *      Le ou les tables associées au service fourni suivant le type de service.
325 *      - nomenclature : tableau des tables pouvant être chargées par le service ou tableau vide.
326 *      - geometrie    : table unique pouvant être chargée par le service ou chaine vide.
327 */
328function isocode_trouver_table($type, $service) {
329
330        static $services = array();
331        $tables_trouvees = ($type === 'nomenclature') ? array() : '';
332
333        if ($type) {
334                if (!isset($services[$type])) {
335                        $services[$type] = isocode_lister_services($type);
336                }
337
338                if (in_array($service, $services[$type])) {
339                        if ($type === 'nomenclature') {
340                                include_spip("services/${type}/${service}/${service}_api");
341                                $tables_trouvees = array_keys($GLOBALS['isocode'][$service]);
342                        } else {
343                                include_spip("services/${type}/${type}_api");
344                                $tables_trouvees = $GLOBALS['isocode'][$type][$service]['table'];
345                        }
346                }
347        }
348
349        return $tables_trouvees;
350}
351
352
353/**
354 * Renvoie la configuration d'un service.
355 *
356 * @api
357 * @filtre
358 *
359 * @param string $type
360 * @param string $service
361 * @param string $table   Nom de la table sans le préfixe `spip_`.
362 *
363 * @return bool
364 *      `true` si la table est chargée, `false` sinon.
365 */
366function isocode_crediter($type, $service, $table = '') {
367
368        // Récupérer la configuration propre au service / table.
369        include_spip('inc/isocode_utils');
370        $credits = configuration_lire($type, $service, $table, 'credits');
371
372        return $credits;
373}
374
375
376/**
377 * Indique si une table est déjà chargée ou pas en base de données.
378 * La fonction scrute la table `spip_${table}` et non la meta propre à la table.
379 *
380 * @api
381 * @filtre
382 *
383 * @param string $table
384 *      Nom de la table sans le préfixe `spip_`.
385 * @param array  $meta_table
386 *      Meta propre à la table, créée lors du chargement de celle-ci et retournée si la table
387 *      est déjà chargée.
388 *
389 * @return bool
390 *      `true` si la table est chargée, `false` sinon.
391 */
392function isocode_lire_consignation($type, $service, $table) {
393
394        // Récupérer la meta propre au règne afin de la retourner.
395        include_spip('inc/config');
396        $meta = ($type === 'nomenclature')
397                ? lire_config("isocode/${type}/${table}")
398                : lire_config("isocode/${type}/${service}");
399
400        return $meta;
401}
Note: See TracBrowser for help on using the repository browser.