* @author Jean-Pascal MILCENT * @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); } } ?>