Blame | Last modification | View Log | RSS feed
<?php//declare(encoding='UTF-8');/*** Exemple de lancement du script : :* /opt/lampp/bin/php cli.php florical -a chargerTous** @category php 5.2* @package eFlore/Scripts* @author Delphine Cauquil <delphine@tela-botanica.org>* @author Aurélien PERONNET <aurelien@tela-botanica.org>* @copyright Copyright (c) 2014, 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 Florical extends EfloreScript {private $table = null;private $pasInsertion = 1000;private $departInsertion = 0;protected $parametres_autorises = array('-t' => array(false, false, 'Permet de tester le script sur un jeu réduit de données (indiquer le nombre de lignes).'));public function executer() {try {$this->initialiserProjet('florical');// Lancement de l'action demandée$cmd = $this->getParametre('a');switch ($cmd) {case 'chargerTous' :$this->chargerStructureSql();$this->chargerflorical();$this->genererChpNomSciHtml();$this->genererChpFamille();//$this->genererChpHierarchie();break;case 'chargerStructureSql' :$this->chargerStructureSql();break;case 'chargerflorical' :$this->chargerflorical();break;case 'genererNomSciHtml' :$this->genererChpNomSciHtml();break;case 'genererChpFamille' :$this->genererChpFamille();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 chargerflorical() {$chemin = Config::get('chemins.florical');$table = Config::get('tables.florical');$requete = "LOAD DATA INFILE '$chemin' "."REPLACE INTO TABLE $table ".'CHARACTER SET utf8 '.'FIELDS '." TERMINATED BY '\t' "." ENCLOSED BY '' "." ESCAPED BY '\\\' ".'IGNORE 1 LINES';$this->getBdd()->requeter($requete);}private function genererChpNomSciHtml() {$this->initialiserGenerationChamps();$this->preparerTablePrChpNomSciHtml();$requete = "UPDATE {$this->table} SET nom_sci_html = CONCAT('<span class=\"sci\">',nom_sci,'</span>')";$resultat = $this->getBdd()->requeter($requete);if ($resultat === false) {throw new Exception("Erreur d'insertion pour le tuple ");}}private function initialiserGenerationChamps() {$this->table = Config::get('tables.florical');}private function preparerTablePrChpNomSciHtml() {$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 recupererTuplesPrChpNomSciHtml() {$requete = 'SELECT num_nom, rang, nom_sci, 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 traiterResultatsFamille(&$resultats, &$noms, &$introuvables, &$introuvablesSyno) {foreach ($resultats as $id => $nom) {$nn = $nom['num_nom'];$nnr = $nom['num_nom_retenu'];$nts = $nom['num_tax_sup'];$rg = $nom['rang'];if ($nnr != '') {if ($rg == '180') {$noms[$nn] = $nom['nom_sci'];} else {if ($nn == $nnr) {// nom retenuif (isset($noms[$nts])) {// signifie que recupererTuplesPrChpFamille() devrait// récupérer ce record *avant*$noms[$nn] = $noms[$nts];} else {$introuvables[] = $nn;}} else {// nom synonymeif (isset($noms[$nnr])) {// signifie que recupererTuplesPrChpFamille() devrait// récupérer ce record *avant*$noms[$nn] = $noms[$nnr];} else {$introuvablesSyno[] = $nom;}}}}unset($resultats[$id]);$this->afficherAvancement("Attribution de leur famille aux noms en cours");if ($this->stopperLaBoucle($this->getParametre('t'))) break;}}private function genererChpFamille() {$this->initialiserGenerationChamps();$this->preparerTablePrChpFamille();$resultats = $this->recupererTuplesPrChpFamille();$noms = array();$introuvables = array();$introuvablesSyno = array();$i = 1;while(true) {printf("passe n°%d:\n", $i);$this->traiterResultatsFamille($resultats, $noms, $introuvables, $introuvablesSyno);echo "\n\n";// printf("noms: %d, introuvables: %d, introuvablesSyno: %d\n", count($noms), count($introuvables), count($introuvablesSyno));// XXX, au 22/07/2013, 3 passes sont suffisantes// TODO: MySQL procédure stockée !if($i++ == 3) break;$resultats = array_merge($resultats, $introuvables, $introuvablesSyno);$introuvables = $introuvablesSyno = array();}foreach ($introuvablesSyno as $id => $nom) {$nn = $nom['num_nom'];$nnr = $nom['num_nom_retenu'];if (isset($noms[$nnr])) {$noms[$nn] = $noms[$nnr];} else {$introuvables[] = $nn;}unset($introuvablesSyno[$id]);$this->afficherAvancement("Attribution de leur famille aux synonymes en cours");}echo "\n";$msg = 'Plusieurs familles sont introuvables';$this->creerFichierLog($msg, $introuvables, 'famille_introuvable');$this->remplirChpFamille($noms);}private function preparerTablePrChpFamille() {$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'famille' ";$resultat = $this->getBdd()->recuperer($requete);if ($resultat === false) {$requete = "ALTER TABLE {$this->table} ".'ADD famille VARCHAR(255) '.'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';$this->getBdd()->requeter($requete);}}private function recupererTuplesPrChpFamille() {$requete = 'SELECT num_nom, num_nom_retenu, num_tax_sup, rang, nom_sci '."FROM {$this->table} "."WHERE rang >= 180 "."ORDER BY rang ASC, num_tax_sup ASC, num_nom_retenu DESC ";$resultat = $this->getBdd()->recupererTous($requete);return $resultat;}private function remplirChpFamille($noms) {foreach ($noms as $id => $famille) {$famille = $this->getBdd()->proteger($famille);$requete = "UPDATE {$this->table} SET famille = $famille WHERE num_nom = $id ";$resultat = $this->getBdd()->requeter($requete);if ($resultat === false) {throw new Exception("Erreur d'insertion pour le tuple $id");}$this->afficherAvancement("Insertion des noms de famille dans la base en cours");}echo "\n";}private function genererChpHierarchie() {$this->initialiserGenerationChamps();$this->preparerTablePrChpHierarchie();$table = Config::get('tables.florical');$requete = "UPDATE $table SET hierarchie = NULL ";$mise_a_jour = $this->getBdd()->requeter($requete);$requete_hierarchie = "SELECT num_nom, num_nom_retenu, num_tax_sup FROM ".$table." ORDER BY rang DESC";$resultat = $this->getBdd()->recupererTous($requete_hierarchie);$num_nom_a_num_sup = array();foreach($resultat as &$taxon) {$num_nom_a_num_sup[$taxon['num_nom']] = $taxon['num_tax_sup'];}$chemin_taxo = "";foreach($resultat as &$taxon) {$chemin_taxo = $this->traiterHierarchieNumTaxSup($taxon['num_nom_retenu'], $num_nom_a_num_sup).'-';$requete = "UPDATE $table SET hierarchie = ".$this->getBdd()->proteger($chemin_taxo)." WHERE num_nom = ".$taxon['num_nom']." ";$mise_a_jour = $this->getBdd()->requeter($requete);$this->afficherAvancement("Insertion de la hierarchie taxonomique en cours");}echo "\n";}private function traiterHierarchieNumTaxSup($num_nom_retenu, &$num_nom_a_num_sup) {$chaine_hierarchie = "";if(isset($num_nom_a_num_sup[$num_nom_retenu])) {$num_tax_sup = $num_nom_a_num_sup[$num_nom_retenu];$chaine_hierarchie = '-'.$num_tax_sup;if($num_tax_sup != 0 && $num_tax_sup != '') {$chaine_hierarchie = $this->traiterHierarchieNumTaxSup($num_tax_sup, $num_nom_a_num_sup).$chaine_hierarchie;}}return $chaine_hierarchie;}private function preparerTablePrChpHierarchie() {$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'hierarchie' ";$resultat = $this->getBdd()->recuperer($requete);if ($resultat === false) {$requete = "ALTER TABLE {$this->table} ".'ADD hierarchie VARCHAR(1000) '.'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';$this->getBdd()->requeter($requete);}}private function genererDonneesTestMultiVersion() {$contenuSql = $this->recupererContenu(Config::get('chemins.structureSqlTest'));$this->executerScripSql($contenuSql);$table = Config::get('tables.florical');$tableTest = Config::get('tables.floricalTest');$requete = "INSERT INTO $tableTest SELECT * FROM $table";$this->getBdd()->requeter($requete);}private function supprimerDonneesTestMultiVersion() {$tableMeta = Config::get('tables.floricalMeta');$requete = "DELETE FROM $tableMeta WHERE guid = 'urn:lsid:tela-botanica.org:florical:1.02'";$this->getBdd()->requeter($requete);$tableTest = Config::get('tables.floricalTest');$requete = "DROP TABLE IF EXISTS $tableTest";$this->getBdd()->requeter($requete);}private function supprimerTous() {$requete = "DROP TABLE IF EXISTS florical_meta, florical_v1_00";$this->getBdd()->requeter($requete);}private function creerFichierLog($message, $lignes, $nomFichier) {$lignesNbre = count($lignes);if ($lignesNbre != 0) {echo "$message. Voir le log de $lignesNbre lignes :\n";$logContenu = implode(", \n", $lignes);$logFichier = realpath(dirname(__FILE__))."/log/$nomFichier.log";echo $logFichier."\n";file_put_contents($logFichier, $logContenu);}}}?>