Changeset 100375 in spip-zone


Ignore:
Timestamp:
Nov 5, 2016, 7:58:32 PM (3 years ago)
Author:
eric@…
Message:

Mise au point des commentaires.

Location:
_plugins_/isocode/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/isocode/trunk/inc/isocode_sourcer.php

    r100373 r100375  
    1212 * - enregistrement  : un tableau de couples (champ, valeur) pour un sous-ensemble des champs d'une table.
    1313 * - enregistrements : la liste des enregistrements à insérer dans la table concernée.
    14  * - titre ou nom    : le libellé de la donnée dans la source (par ex, le titre d'une colonne dans un fichier CSV).
     14 * - titre           : le libellé de la donnée dans la source (par ex, le titre d'une colonne dans un fichier CSV).
    1515 *
    1616 * @package SPIP\ISOCODE\SOURCE
     
    2525 * prêt à être inséré dans une table de la base de données.
    2626 * La fonction utilise le service et le nom de table pour récupérer la configuration permettant l'analyse
    27  * du fichier et sa traduction en élements de la table (délimiteur ou regexp, nom des colonnes...).
     27 * du fichier et sa traduction en éléments de la table (délimiteur ou regexp, nom des colonnes...).
    2828 * Il est possible, pour chaque élément ou pour l'ensemble d'appliquer une fonction spécifique à la table
    2929 * qui complète l'élément.
     
    144144                // On stocke la clé sous forme de liste pour les tests d'appartenance.
    145145                $cle_primaire = explode(',', $id_table);
    146                 // On trie la liste et on recompose la clé sous forme de chaine pour la gestion des doublons.
    147 //              sort($cle_primaire);
    148146        }
    149147
  • _plugins_/isocode/trunk/isocode_fonctions.php

    r100373 r100375  
    4141                'tables_nok' => array(),
    4242                'tables_sha' => array()
     43        );
     44
     45        // Suivant le tableau fourni en argument, on détermine la liste exacte des tables à charger.
     46        // Le cas où le service existe mais que la liste de tables associées est vide est traité dans
     47        // la boucle des services ci-après.
     48        if (!$tables) {
     49                // Le tableau est vide : il faut charger toutes les tables de tous les services supportés.
     50                $tables = isocode_lister_tables();
     51        } elseif (is_string($tables)) {
     52                // L'argument n'est pas un tableau mais une chaîne, on considère que l'appelant a demandé
     53                // le chargement d'une table identifiée par cette chaîne.
     54                $tables = array($tables);
     55        } elseif (!is_array($tables)) {
     56                // L'argument n'est pas compréhensible, on met la liste à vide pour sortir sans traitement
     57                // et on enregistre l'erreur.
     58                $retour['ok'] = false;
     59                $retour['tables_nok'][] = $tables;
     60                $tables = array();
     61        }
     62
     63        // On charge chacune des tables spécifiées en identifiant au préalable le service concerné.
     64        // -- Pour éviter d'avoir une mise à jour bancale, il faudrait inclure les requêtes SQL dans
     65        // une transaction ce qui n'est pas possible avec spip aujourd'hui.
     66        // De fait, on ne peut pas assurer que si une erreur se produit le résultat soit cohérent et
     67        // on renvoie juste l'erreur --
     68        if ($tables) {
     69                include_spip('inc/config');
     70                foreach ($tables as $_table) {
     71                        $erreur_table = true;
     72                        $source_identique = false;
     73
     74                        // On détermine le service qui supporte le chargement de la table
     75                        $service = isocode_trouver_service($_table);
     76                        if ($service) {
     77                                // Lecture des données contenues soit dans un fichier soit dans une page web et renvoie d'une liste
     78                                // d'éléments prêts à être enregistrés dans la table concernée.
     79                                // Si la table est déjà chargée et que le fichier ou la page source n'a pas changé, la fonction de
     80                                // lecture ne renvoie aucun élément pour éviter des traitements inutiles mais renvoie un indicateur
     81                                // sur le SHA.
     82                                spip_timer('lire');
     83                                include_spip('inc/isocode_sourcer');
     84                                list($enregistrements, $sha, $source_identique) = lire_source($service, $_table);
     85                                $duree_lire = spip_timer('lire');
     86                                if ($enregistrements) {
     87                                        spip_timer('ecrire');
     88                                        // Suppression des éléments éventuels déjà chargés. On ne gère pas d'erreur
     89                                        // sur ce traitement car elle sera forcément détectée lors de l'insertion qui suit.
     90                                        isocode_decharger_tables($_table);
     91
     92                                        // Insertion dans la base de données des éléments extraits
     93                                        $sql_ok = sql_insertq_multi("spip_${_table}", $enregistrements);
     94                                        if ($sql_ok !== false) {
     95                                                // On stocke les informations de chargement de la table dans une meta.
     96                                                $meta = array(
     97                                                        'service' => $service,
     98                                                        'sha'     => $sha,
     99                                                        'nbr'     => count($enregistrements),
     100                                                        'maj'     => date('Y-m-d H:i:s')
     101                                                );
     102                                                ecrire_config("isocode/tables/${_table}", $meta);
     103                                                $erreur_table = false;
     104                                        }
     105                                        $duree_ecrire = spip_timer('ecrire');
     106                                        spip_log("La table <${_table}> a été chargée (lecture source: ${duree_lire} - insertion BD: ${duree_ecrire})", 'isocode' . _LOG_DEBUG);
     107                                }
     108                        }
     109
     110                        // Si la table est en erreur, on passe l'indicateur global à erreur et on stocke la table en nok
     111                        // ou en sha identique suivant la cas.
     112                        // Si le traitement est ok on stocke juste la table.
     113                        if ($erreur_table) {
     114                                $retour['ok'] = false;
     115                                if ($source_identique) {
     116                                        $retour['tables_sha'][] = $_table;
     117                                } else {
     118                                        $retour['tables_nok'][] = $_table;
     119                                }
     120                        } else {
     121                                $retour['tables_ok'][] = $_table;
     122                        }
     123                }
     124        }
     125
     126        return $retour;
     127}
     128
     129
     130/**
     131 * Supprime en base de données, le contenu des tables de codes ISO choisies.
     132 * Si la liste des tables est vide la fonction considère que toutes les tables doivent être vidées.
     133 * La meta concernant les informations de chargement de chaque table est aussi effacée.
     134 *
     135 * @api
     136 * @filtre
     137 *
     138 * @uses isocode_lister_tables()
     139 *
     140 * @param array $tables
     141 *      Liste des tables à vider. Si le tableau est vide l'ensemble des tables
     142 *      seront vidées.
     143 *      Les tables doivent être libellées sans le préfixe `spip_`.
     144 *
     145 * @return array
     146 *      Tableau associatif résultat de l'action de vidage:
     147 *      - index `ok`         : `true` si le vidage a réussi, `false` sinon.
     148 *      - index `tables_ok`  : liste des tables vidées avec succès ou tableau vide sinon.
     149 *      - index `tables_nok` : liste des tables en erreur ou tableau vide sinon.
     150 */
     151function isocode_decharger_tables($tables = array()) {
     152
     153        $retour = array(
     154                'ok'         => true,
     155                'tables_ok'  => array(),
     156                'tables_nok' => array()
    43157        );
    44158
     
    61175        }
    62176
    63         // On charge chacune des tables spécifiées en identifiant au préalable le service concerné.
    64         // -- Pour éviter d'avoir une mise à jour bancale, il faudrait inclure les requêtes SQL dans
    65         // une transaction ce qui n'est pas possible avec spip aujourd'hui.
    66         // De fait, on ne peut pas assurer que si une erreur se produit le résultat soit cohérent et
    67         // on renvoie juste l'erreur --
    68         if ($tables) {
    69                 include_spip('inc/config');
    70                 foreach ($tables as $_table) {
    71                         $erreur_table = true;
    72                         $source_identique = false;
    73 
    74                         // On détermine le service qui supporte le chargement de la table
    75                         $service = isocode_trouver_service($_table);
    76                         if ($service) {
    77                                 // Lecture des données contenues soit dans un fichier soit dans une page web et renvoie d'une liste
    78                                 // d'éléments prêts à être enregistrés dans la table concernée.
    79                                 // Si la table est déjà chargée et que le fichier ou la page source n'a pas changé, la fonction de
    80                                 // lecture ne renvoie aucun élément pour éviter des traitements inutiles mais renvoie un indicateur
    81                                 // sur le SHA.
    82                                 spip_timer('lire');
    83                                 include_spip('inc/isocode_sourcer');
    84                                 list($enregistrements, $sha, $source_identique) = lire_source($service, $_table);
    85                                 $t_lire = spip_timer('lire');
    86                                 if ($enregistrements) {
    87                                         spip_timer('ecrire');
    88                                         // Suppression des éléments éventuels déjà chargés. On ne gère pas d'erreur
    89                                         // sur ce traitement car elle sera forcément détectée lors de l'insertion qui suit.
    90                                         isocode_decharger_tables($_table);
    91 
    92                                         // Insertion dans la base de données des éléments extraits
    93                                         $sql_ok = sql_insertq_multi("spip_${_table}", $enregistrements);
    94                                         if ($sql_ok !== false) {
    95                                                 // On stocke les informations de chargement de la table dans une meta.
    96                                                 $meta = array(
    97                                                         'service' => $service,
    98                                                         'sha'     => $sha,
    99                                                         'nbr'     => count($enregistrements),
    100                                                         'maj'     => date('Y-m-d H:i:s')
    101                                                 );
    102                                                 ecrire_config("isocode/tables/${_table}", $meta);
    103                                                 $erreur_table = false;
    104                                         }
    105                                         $t_ecrire = spip_timer('ecrire');
    106                                         spip_log("La table <${_table}> a été chargée (lecture: ${t_lire} - ecriture: ${t_ecrire})", 'isocode' . _LOG_DEBUG);
    107                                 }
    108                         }
    109 
    110                         // Si la table est en erreur, on passe l'indicateur global à erreur et on stocke la table en nok
    111                         // ou en sha identique suivant la cas.
    112                         // Si le traitement est ok on stocke juste la table.
    113                         if ($erreur_table) {
    114                                 $retour['ok'] = false;
    115                                 if ($source_identique) {
    116                                         $retour['tables_sha'][] = $_table;
    117                                 } else {
    118                                         $retour['tables_nok'][] = $_table;
    119                                 }
    120                         } else {
    121                                 $retour['tables_ok'][] = $_table;
    122                         }
    123                 }
    124         }
    125 
    126         return $retour;
    127 }
    128 
    129 
    130 /**
    131  * Supprime en base de données, le contenu des tables de codes ISO choisies.
    132  * Si la liste des tables est vide la fonction considère que toutes les tables doivent être vidées.
    133  * La meta concernant les informations de chargement de chaque table est aussi effacée.
    134  *
    135  * @api
    136  * @filtre
    137  *
    138  * @uses isocode_lister_tables()
    139  *
    140  * @param array $tables
    141  *      Liste des tables à vider. Si le tableau est vide l'ensemble des tables
    142  *      seront vidées.
    143  *      Les tables doivent être libellées sans le préfixe `spip_`.
    144  *
    145  * @return array
    146  *      Tableau associatif résultat de l'action de vidage:
    147  *      - index `ok`         : `true` si le vidage a réussi, `false` sinon.
    148  *      - index `tables_ok`  : liste des tables vidées avec succès ou tableau vide sinon.
    149  *      - index `tables_nok` : liste des tables en erreur ou tableau vide sinon.
    150  */
    151 function isocode_decharger_tables($tables = array()) {
    152 
    153         $retour = array(
    154                 'ok'         => true,
    155                 'tables_ok'  => array(),
    156                 'tables_nok' => array()
    157         );
    158 
    159         // Suivant le tableau fourni en argument, on détermine la liste exacte des tables à charger.
    160         // Le cas où le service existe mais que la liste de tables associées est vide est traité dans
    161         // la boucle des services ci-après.
    162         if (!$tables) {
    163                 // Le tableau est vide : il faut charger toutes les tables de tous les services supportés.
    164                 $tables = isocode_lister_tables();
    165         } elseif (is_string($tables)) {
    166                 // L'argument n'est pas un tableau mais une chaine, on considère que l'appelant a demandé
    167                 // le chargement d'une table identifiée par cette chaine.
    168                 $tables = array($tables);
    169         } elseif (!is_array($tables)) {
    170                 // L'argument n'est pas compréhensible, on met la liste à vide pour sortir sans traitement
    171                 // et on enregistre l'erreur.
    172                 $retour['ok'] = false;
    173                 $retour['tables_nok'][] = $tables;
    174                 $tables = array();
    175         }
    176 
    177177        // On boucle sur la liste des tables et on vide chaque table référencée.
    178178        if ($tables) {
     
    198198/**
    199199 * Détermine le service associé au chargement de la table de codes ISO choisie.
    200  * Si la table est vide ou invalide, la fonction renvoie une chaine vide.
     200 * Si la table est vide ou invalide, la fonction renvoie une chaîne vide.
    201201 *
    202202 * @api
     
    209209 *
    210210 * @return string
    211  *      Nom du service permettant le chargement de la table ou chaine vide si aucun service n'est trouvé.
     211 *      Nom du service permettant le chargement de la table ou chaîne vide si aucun service n'est trouvé.
    212212 */
    213213function isocode_trouver_service($table) {
  • _plugins_/isocode/trunk/services/iso/iso_api.php

    r100371 r100375  
    22/**
    33 * Ce fichier contient l'ensemble des constantes et fonctions implémentant le service ISO.
     4 * Etant donné que la lecture des sources est réalisée par une fonction générique `lire_source` ce
     5 * fichier ne contient que les fonctions spécifiques permettant de compléter les champs de base fournis
     6 * par la source.
    47 *
    58 * @package SPIP\ISOCODE\SERVICES\ISO
     
    205208                if ($lignes) {
    206209                        foreach ($lignes as $_ligne) {
    207                                 // Chaque ligne de la table est composée de deux colonnes, le première le libellé
     210                                // Chaque ligne de la table est composée de deux colonnes, la première le libellé
    208211                                // et la deuxième la valeur.
    209212                                $colonnes = extraire_balises($_ligne, 'td');
     
    283286                if (isset($hierarchies[$code])) {
    284287                        $enregistrements[$_cle][$config_champs_loc['Hierarchy']] = $hierarchies[$code];
    285                         // Calcul du parent : si la hierarchie ne contient qu'un code c'est qu'il n'y a pas de parent.
     288                        // Calcul du parent : si la hiérarchie ne contient qu'un code c'est qu'il n'y a pas de parent.
    286289                        // Sinon, le parent est le premier code qui précède le code du record.
    287290                        $parents = explode(',', $hierarchies[$code]);
Note: See TracChangeset for help on using the changeset viewer.