* @author Jean-Pascal MILCENT * @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 Fournier extends EfloreScript { private $table = null; private $tableMeta = null; private $pasInsertion = 1000; private $departInsertion = 0; protected $parametres_autorises = array( '-t' => array(false, false, 'Permet de tester le script sur un jeux réduit de données (indiquer le nombre de lignes).')); public function executer() { try { $this->initialiserProjet('fournier'); $this->initialiserTables(); // Lancement de l'action demandée $cmd = $this->getParametre('a'); switch ($cmd) { case 'chargerTous' : $this->chargerStructureSql(); $this->chargerFournier(); $this->genererNomSciHtml(); break; case 'chargerStructureSql' : $this->chargerStructureSql(); break; case 'chargerFournier' : $this->chargerFournier(); break; case 'genererNomSciHtml' : $this->genererNomSciHtml(); break; case 'supprimerTous' : $this->supprimerTous(); break; default : throw new Exception("Erreur : la commande '$cmd' n'existe pas!"); } } catch (Exception $e) { $this->traiterErreur($e->getMessage()); } } private function chargerFournier() { $chemin = Config::get('chemins.fournier'); $table = Config::get('tables.fournier'); $requete = "LOAD DATA INFILE '$chemin' ". "REPLACE INTO TABLE $table ". 'CHARACTER SET utf8 '. 'FIELDS '. " TERMINATED BY ',' ". " ENCLOSED BY '\"' ". " ESCAPED BY '\\\' ". 'IGNORE 1 LINES'; $this->getBdd()->requeter($requete); } private function genererNomSciHtml() { $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($this->getParametre('t'))) break; } echo "\n"; } private function initialiserTables() { $this->table = Config::get('tables.fournier'); $this->tableMeta = Config::get('tables.fournierMeta'); } private function preparerTable() { $requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' "; $resultat = $this->getBdd()->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->getBdd()->requeter($requete); } } private function recupererNbTotalTuples(){ $requete = "SELECT count(*) AS nb FROM {$this->table} "; $resultat = $this->getBdd()->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->getBdd()->recupererTous($requete); return $resultat; } private function lancerRequeteModification($nomsSciHtm) { foreach ($nomsSciHtm as $id => $html) { $html = $this->getBdd()->proteger($html); $requete = "UPDATE {$this->table} ". "SET nom_sci_html = $html ". "WHERE num_nom = $id "; $resultat = $this->getBdd()->requeter($requete); if ($resultat === false) { throw new Exception("Erreur d'insertion pour le tuple $id"); } } } private function supprimerTous() { $requete = "DROP TABLE IF EXISTS {$this->tableMeta}, {$this->table}"; $this->getBdd()->requeter($requete); } } ?>