Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 46 | Rev 68 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * declare(encoding='UTF-8');
 * Exemple de lancement du script : :
 * /opt/lampp/bin/php cli.php bdtfx -a nomSciHtml -t bdtfx_v1_01
 *  Classe permettant de créer le nom scientifique au format HTML.
 * @category    php 5.2
 * @package             bdtfx
 * @author              Jennifer DHÉ <jennifer@tela-botanica.org>
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @copyright   Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
 * @license             http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
 * @license             http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
 * @version             $Id$
 */
class Bdtfx extends Script {

        protected $bdd = null;
        protected $table = null;
        private $projetNom = 'bdtfx';

        protected $pasInsertion = 1000;
        protected $departInsertion = 0;

        protected $parametres_autorises = array(
                '-t' => array(false, true, 'Permet de tester le script sur un jeux réduit de données (indiquer le nombre de lignes).'));

        public function executer() {
                try {
                        $this->initialiser();

                        // Lancement de l'action demandée
                        $cmd = $this->getParametre('a');
                        switch ($cmd) {
                                case 'chargerTous' :
                                        $this->chargerStructureSql();
                                        $this->chargerBdtfx();
                                        $this->genererNomSciHtml();
                                        break;
                                case 'chargerStructureSql' :
                                        $this->chargerStructureSql();
                                        break;
                                case 'chargerBdtfx' :
                                        $this->chargerBdtfx();
                                        break;
                                case 'genererNomSciHtml' :
                                        $this->genererNomSciHtml();
                                        break;
                                default :
                                        throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
                        }
                } catch (Exception $e) {
                        $this->traiterErreur($e->getMessage());
                }
        }

        private function initialiser() {
                $this->chargerConfigDuProjet();
                $this->bdd = new Bdd();
        }

        private function chargerConfigDuProjet() {
                $fichierIni = dirname(__FILE__).DS.$this->projetNom.'.ini';
                if (file_exists($fichierIni)) {
                        Config::charger($fichierIni);
                } else {
                        $m = "Veuillez configurer le projet en créant le fichier '{$this->projetNom}.ini' ".
                                "dans le dossier du module de script du projet à partir du fichier '{$this->projetNom}.defaut.ini'.";
                        throw new Exception($m);
                }
        }

        private function chargerStructureSql() {
                $chemin = Config::get('chemins.structureSql');
                $requetes = Outils::extraireRequetes($chemin);
                foreach ($requetes as $requete) {
                        $this->bdd->requeter($requete);
                }
        }

        private function chargerBdtfx() {
                $chemin = Config::get('chemins.bdtfx');
                $table = Config::get('tables.bdtfx');
                $requete = "LOAD DATA INFILE '$chemin' ".
                                "REPLACE INTO TABLE $table ".
                                'CHARACTER SET utf8 '.
                                'FIELDS '.
                                "       TERMINATED BY '\t' ".
                                "       ENCLOSED BY '' ".
                                "       ESCAPED BY '\\\' ".
                                'IGNORE 1 LINES';
                $this->bdd->requeter($requete);
        }

        private function genererNomSciHtml() {
                $this->initialiserGenerationNomsSciHtml();
                $this->preparerTable();
                $generateur = new GenerateurNomSciHtml();
                $nbreTotal = $this->recupererNbTotalTuples();
                while ($this->departInsertion < $nbreTotal) {
                        $resultat = $this->recupererTuples();
                        $nomsSciEnHtml = $generateur->generer($resultat);
                        $this->lancerRequeteModification($nomsSciEnHtml);
                        $this->departInsertion += $this->pasInsertion;
                        $this->afficherAvancement("Insertion des noms scientifique au format HTML dans la base par paquet de {$this->pasInsertion} en cours");
                        if ($this->stopperLaBoucle()) {
                                break;
                        }
                }
                echo "\n";
        }

        private function initialiserGenerationNomsSciHtml() {
                $this->table = Config::get('tables.bdtfx');
        }

        private function preparerTable() {
                $requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' ";
                $resultat = $this->bdd->recuperer($requete);
                if ($resultat === false) {
                        $requete =      "ALTER TABLE {$this->table} ".
                                                        'ADD nom_sci_html VARCHAR( 500 ) '.
                                                        'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
                        $this->bdd->requeter($requete);
                }
        }

        private function recupererNbTotalTuples(){
                $requete = "SELECT count(*) AS nb FROM {$this->table} ";
                $resultat = $this->bdd->recuperer($requete);
                return $resultat['nb'];
        }

        private function recupererTuples() {
                $requete = 'SELECT      num_nom, rang, nom_supra_generique, genre, epithete_infra_generique, '.
                                        '       epithete_sp, type_epithete, epithete_infra_sp,cultivar_groupe, '.
                                        '       nom_commercial, cultivar '.
                                        "FROM {$this->table} ".
                                        "LIMIT {$this->departInsertion},{$this->pasInsertion} ";
                $resultat = $this->bdd->recupererTous($requete);
                return $resultat;
        }

        private function lancerRequeteModification($nomsSciHtm) {
                foreach ($nomsSciHtm as $id => $html) {
                        $html = $this->bdd->proteger($html);
                        $requete = "UPDATE {$this->table} ".
                                "SET nom_sci_html = $html ".
                                "WHERE num_nom = $id ";
                        $resultat = $this->bdd->requeter($requete);
                        if ($resultat === false) {
                                throw new Exception("Erreur d'insertion pour le tuple $id");
                        }
                }
        }

        private function stopperLaBoucle() {
                $stop = false;
                static $ligneActuelle = 1;
                if ($nbreLignesATester = $this->getParametre('t')) {
                        if ($nbreLignesATester == $ligneActuelle++) {
                                $stop = true;
                        }
                }
                return $stop;
        }
}
?>