Rev 1433 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Réalise la migration des obs du référentiel bdnff vers le référentie bdtfx** @category php 5.2* @package Cel/Scripts* @author Aurelien PERONNET <aurelien@tela-botanica.org>* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @copyright Copyright (c) 2012, 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 MigrationReferentiel {private $bdd = null;private $script = null;private $table_eflore = 'tb_eflore.bdtfx_v1_01';private $table_cel = 'tb_cel.cel_obs';private $correspondance_nn_sel_nn_ret = null;private $infos_noms = array();private $obs_sans_nn = array();private $obs_a_modifier = array();private $modif_douteuses = array();private $modif_familles = 0;private $chemin_log = '/home/telabotap/www/tmp/migration_noms_log.csv';private $fp = null;public function __construct(Conteneur $conteneur) {$this->bdd = $conteneur->getBdd();$this->script = $conteneur->getScript();$this->initialiserLog();}public function executer($arguments) {if (isset($arguments[0]) == false) {throw new Exception("Veuillez indiquer l'action à réaliser en paramètre.", E_USER_ERROR);}$action = $arguments[0];switch ($action) {case 'migration_referentiel' :$this->migrerReferentiel();break;}fclose($this->fp);}private function migrerReferentiel() {echo "-------------------------------------------------------------------\n";echo " ETAPE 1. Paramétrage ... \n";echo "-------------------------------------------------------------------\n";$this->chargerInfosNoms();echo "-------------------------------------------------------------------\n";echo " ETAPE 2. Chargement des observations ... \n";echo "-------------------------------------------------------------------\n";$requete_selection_obs = 'SELECT id_observation, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, '.'famille, nom_referentiel FROM '.$this->table_cel;$liste_obs = $this->bdd->requeter($requete_selection_obs);echo sizeof($liste_obs)." observations sélectionnées \n";foreach ($liste_obs as $obs) {if($this->doitChangerNomRetenu($obs)) {$nouveau_nom = $this->getInfosNouveauNumNomRetenu($obs);$this->obs_a_modifier[] = array('id' => $obs['id_observation'],'nouveau_nom_sci_retenu' => $nouveau_nom['nom_complet'],'nouveau_nn_retenu' => $nouveau_nom['num_nom'],'nouveau_num_tax' => $nouveau_nom['num_taxonomique'],'nouvelle_famille' => $nouveau_nom['famille']);$this->logger($obs, $nouveau_nom);}}echo "-------------------------------------------------------------------\n";echo " ETAPE 3. modification des observations ... \n";echo "-------------------------------------------------------------------\n";echo sizeof($this->obs_a_modifier)." obs doivent voir changer leur nom retenu \n";echo $this->modif_familles." obs doivent voir changer leur famille \n";echo sizeof($this->obs_sans_nn)." observations n'ont pas de num nom \n";echo sizeof($this->modif_douteuses)." modifications sont douteuses et ne seront pas effectuées \n";echo "\n";$this->executerRequeteMiseAJour();echo "\n";echo "-------------------------------------------------------------------\n";echo " Migration des noms terminée ... \n";echo "-------------------------------------------------------------------\n";}private function chargerInfosNoms() {$requete = 'SELECT num_nom, num_nom_retenu, nom_complet, num_taxonomique, famille FROM '.$this->table_eflore;$nums = $this->bdd->requeter($requete);foreach ($nums as $num) {$this->correspondance_nn_sel_nn_ret[$num['num_nom']] = $num['num_nom_retenu'];$this->infos_noms[$num['num_nom']] = $num;}echo sizeof($this->correspondance_nn_sel_nn_ret)." noms sélectionnés\n";}private function doitChangerNomRetenu($obs) {$changement = false;$nn_retenu_obs = $obs['nom_ret_nn'];$nn_saisi_obs = $obs['nom_sel_nn'];$famille_saisie_obs = $obs['famille'];$sans_nn_retenu = false;if($nn_saisi_obs != '') {if(!isset($this->correspondance_nn_sel_nn_ret[$nn_saisi_obs]) || $this->correspondance_nn_sel_nn_ret[$nn_saisi_obs] == 0) {$this->obs_sans_nn[] = $obs['id_observation'];$sans_nn_retenu = true;} else {if($nn_retenu_obs != $this->correspondance_nn_sel_nn_ret[$nn_saisi_obs] && str_word_count($obs['nom_ret']) >= 1) {$changement = true;}}if(!$sans_nn_retenu && $famille_saisie_obs != $this->infos_noms[$nn_saisi_obs]['famille']) {$changement = true;$this->modif_familles++;}}if($changement && str_word_count($obs['nom_ret']) == 1) {$this->modif_douteuses[] = $obs;$changement = false;}return $changement;}private function getInfosNouveauNumNomRetenu($obs) {$nouveau_nn_ret = $this->correspondance_nn_sel_nn_ret[$obs['nom_sel_nn']];return $this->infos_noms[$nouveau_nn_ret];}private function executerRequeteMiseAJour() {$total = 0;foreach($this->obs_a_modifier as $valeurs) {$requete = $this->assemblerRequeteMiseAJour($valeurs);$migration_noms = $this->bdd->executer($requete);if ($migration_noms) {$total++;$this->script->afficherAvancement('Migration des noms (par 1)', $total);} else {echo $requete."\n";exit('Erreur lors de la migration des noms de l\'observation '.$valeurs['id']."\n");}}}private function proteger($valeur) {return $this->bdd->proteger($valeur);}private function assemblerRequeteMiseAJour($tableau) {$requete = 'UPDATE '.$this->table_cel.' '.'SET nom_ret = '.$this->proteger($tableau['nouveau_nom_sci_retenu']).', '.'nom_ret_nn = '.$this->proteger($tableau['nouveau_nn_retenu']).', '.'nt = '.$this->proteger($tableau['nouveau_num_tax']).', '.'famille = '.$this->proteger($tableau['nouvelle_famille']).', '.'nom_referentiel = "bdtfx:v1.01" '.'WHERE id_observation = '.$this->proteger($tableau['id']);return $requete;}private function initialiserLog() {$this->fp = fopen($this->chemin_log, 'w');$colonnes = 'nom sélectionné, nn nom sélectionné, ancien nom retenu, nn ancien nom retenu, '.'nouveau nom sélectionné, nn nouveau nom sélectionné'."\n";fwrite($this->fp, $colonnes);}private function logger($obs, $nouveau_nom) {$chaine = '"'.$obs['nom_sel'].'"'.','.'"'.$obs['nom_sel_nn'].'"'.','.'"'.$obs['nom_ret'].'"'.','.'"'.$obs['nom_ret_nn'].'"'.','.'"'.$nouveau_nom['nom_complet'].'"'.','.'"'.$nouveau_nom['num_nom'].'"'."\n";fwrite($this->fp, $chaine);}}?>