Rev 267 | Rev 273 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// Encodage : UTF-8// +-------------------------------------------------------------------------------------------------------------------+/*** Importation d'un fichier ref-tax dans une bdnt** Description : classe permettant de versionner les référentiels selon le manuel technique* Utilisation : php script.php comparaison -r bdnff -a tout -f fichier.txt*//Auteur original :* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @copyright Tela-Botanica 1999-2010* @link http://www.tela-botanica.org/wikini/RTaxMethodo/wakka.php?wiki=MaNuel* @licence GPL v3 & CeCILL v2* @version $Id$*/// +-------------------------------------------------------------------------------------------------------------------+class Importation extends ScriptCommande {const SCRIPT_NOM = 'importation';const MANUEL_VERSION = '4.3';private $referentiel = null;/*public $parametres = array('-r' => array(true, true, 'referentiel de base'),'-f' => array(true, true, 'fichier à comparer'));*/private $noms_supprimes = null;private $noms_colonnes = array();private $rangs_bdnt_taxref = null;private $statuts_bdnt_taxref = null;private $correspondance_colonnes = array("CD_NOM" => "", "CD_SUP" => "", "CD_REF" => "","RANG" => "rang", "LB_NOM" => "nom_sci", "LB_AUTEUR" => array("auteur","annee"),"FR" => "presence","FR-FRA" => "presence_Ga", "FR-COR" => "presence_Co", "REU" => "presence","GUA" => "presence_Guadeloupe", "SMSB" => array("presence_Saint_Martin", "presence_Saint_Barthelemy"),"MAR" => "presence_Martinique","GF" => "presence", "MAY" => "presence_Mayotte", "TAAF" => "presence_Taaf","SPM" => "presence_Guadeloupe", "PF" => "presence_Polynesie", "NC" => "presence_Nouvelle_Caledonie","BIBLIO" => "biblio_origine", "BDNGM" => "num_nom" );private $sans_correspondance = array("FG_VALIDITE", "habitat", "WF", "CLI", "EPA","EU", "WLD", "ORACLE","DATE_CREA", "ORIGINE_CREA","NOM_COMPLET", "NOM_COMPLET_HTML","GENRE", "ESPECE", "SOUS_ESPECE", "ANNEE");/*public function executer() {$this->referentiel = $this->getParam('r');// Lancement du test demandé$fichier = $this->getParam('f');if (file_exists($fichier)) {$manuel_chemin = Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS;$manuel_config_nom = 'referentiel_v'.self::MANUEL_VERSION.'.ini';$this->manuel = parse_ini_file($manuel_chemin.$manuel_config_nom);$this->creerCorrespondanceRangBdntTaxref();$donnees = $this->traiterFichierTaxref($fichier);Debug::printr("Fin du traitement du fichier.");$this->connecterPDO();$this->creerTableTaxref();$this->ajouterColonneCDNOM();Debug::printr("Fin de la création de la table.");$this->ajouterDonneesTaxRef($donnees);Debug::printr("Fin de l'insertion des données.");$this->creerTableComparaison();Debug::printr("Fin de la création de la table comparaison.");}}*/public function executer() {// Récupération du dernier traitement demandé$this->traitementDao = new TraitementDao();$this->traitement = $this->traitementDao->getDernierTraitement('tout', self::SCRIPT_NOM);if (isset($this->traitement)) {$this->referentiel = $this->traitement['referentiel_code']; // Récupération du nom de projet$fichier = $this->traitement['script_parametres'];if (file_exists($fichier)) {Debug::printr('Debute:'.$this->traitementDao->debuterTraitement($this->traitement['id_traitement']));// Nettoyage des traitements obsolètes$traitements_obsoletes = $this->traitementDao->getTraitementsObsoletes($this->referentiel, self::SCRIPT_NOM);if (isset($traitements_obsoletes)) {Debug::printr('Supp. obsoletes:'.$this->traitementDao->supprimer($traitements_obsoletes));}Debug::printr("Début du traitement du fichier.");$manuel_chemin = Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS;$manuel_config_nom = 'referentiel_v'.self::MANUEL_VERSION.'.ini';$this->manuel = parse_ini_file($manuel_chemin.$manuel_config_nom);$this->creerCorrespondanceRangBdntTaxref();$donnees = $this->traiterFichierTaxref($fichier);Debug::printr("Fin du traitement du fichier.");$this->connecterPDO();$this->creerTableTaxref();$this->ajouterColonneCDNOM();Debug::printr("Fin de la création de la table.");$this->ajouterDonneesTaxRef($donnees);Debug::printr("Fin de l'insertion des données.");$this->creerTableComparaison();Debug::printr("Fin de la création de la table comparaison.");Debug::printr('Termine:'.$this->traitementDao->terminerTraitement($this->traitement['id_traitement']));} else {Debug::printr("Fichier introuvable".$fichier);Debug::printr('Termine:'.$this->traitementDao->terminerTraitement($this->traitement['id_traitement']));}} else {Debug::printr("Pas de traitement");}}private function creerTableTaxref() {$requete = "DROP TABLE IF EXISTS {$this->referentiel}_taxref; "."CREATE TABLE {$this->referentiel}_taxref AS SELECT * FROM {$this->referentiel};"."ALTER TABLE {$this->referentiel}_taxref ADD PRIMARY KEY (num_nom);";$resultat = $this->executerRequeter($requete);}private function ajouterColonneCDNOM() {$requete = "ALTER TABLE {$this->referentiel}_taxref ADD "."`num_taxref` INT( 15 ) NULL DEFAULT NULL COMMENT 'numéro correspondant dans la base taxref.';";$resultat = $this->executerRequeter($requete);}private function ajouterDonneesTaxRef($liste_noms) {$i = 0; $j = 0; $requete = "";foreach ($liste_noms as $nom) { $i++;$requete .= "UPDATE {$this->referentiel}_taxref SET ".implode(' , ', $nom)." WHERE {$nom['num_nom']} ;";//echo $requete;if ($i == 1000 || ($j*1000+$i) == count($liste_noms) ) { $j++;$resultat = $this->executerRequeter($requete.'commit;');if ($resultat == null) {$resultat = $this->executerRequeter($requete.'commit;');}$i = 0; $requete = "";}}}private function creerTableComparaison() {foreach ($this->noms_colonnes as $colonne) {if (isset($this->correspondance_colonnes[$colonne]) && $this->correspondance_colonnes[$colonne] != "") {$nom_champ = $this->correspondance_colonnes[$colonne];if (is_array($nom_champ)) {foreach ($nom_champ as $nom) {$champs_tax[] = "t.{$nom} AS tax_{$nom}";$champs_tax[] = "b.{$nom} AS {$nom}";$concat[] = "IF(t.{$nom} != b.{$nom}, '{$nom}, ', '')";}} else {$champs_tax[] = "t.{$nom_champ} AS tax_{$nom_champ}";$champs_tax[] = "b.{$nom_champ} AS {$nom_champ}";$concat[] = "IF(t.{$nom_champ} != b.{$nom_champ}, '{$nom_champ}, ', '')";}}}$requete = "CREATE TABLE {$this->referentiel}_comparaison_".date("Y_m_d_H_i_s")." AS"." SELECT CONCAT(".implode(', ', $concat).") AS difference, ".implode(', ', $champs_tax)." FROM {$this->referentiel} b, {$this->referentiel}_taxref t"." WHERE b.num_nom = t.num_nom AND (b.nom_sci != t.nom_sci or b.auteur != t.auteur or b.annee != t.annee);";echo $requete;$resultat = $this->executerRequeter($requete);}private function traiterFichierTaxref($fichier) {$donnees = array();if (($pointeur = fopen($fichier, "r")) !== FALSE) {$this->noms_colonnes = fgetcsv($pointeur, 1000, chr(9));while (($ligne = fgetcsv($pointeur, 1000, chr(9))) !== FALSE) {$nombreChamps = count($ligne);$taxref[$ligne[0]] = $ligne;for ($c=0; $c < $nombreChamps; $c++) {if (isset($this->correspondance_colonnes[$this->noms_colonnes[$c]])) {if (is_array($this->correspondance_colonnes[$this->noms_colonnes[$c]])) {if ($this->noms_colonnes[$c] == 'LB_AUTEUR') {//echo $ligne[$c];$valeur = explode(',', $ligne[$c]);if (count($valeur) > 1) {//print_r($matches);$nom['auteur'] = 'auteur="'.$valeur[0].'"';$nom['annee'] = 'annee="'.trim($valeur[1]).'"';} else {$nom['auteur'] = 'auteur="'.$ligne[$c].'"';$nom['annee'] = 'annee=""';}} else {foreach ($this->correspondance_colonnes[$this->noms_colonnes[$c]] as $a=>$nom_colonne) {$nom[$nom_colonne] = $nom_colonne.'="'.$ligne[$c].'"';}}} elseif ($this->correspondance_colonnes[$this->noms_colonnes[$c]] == "") {$nom[$this->noms_colonnes[$c]] = $ligne[$c];} else {if ($this->correspondance_colonnes[$this->noms_colonnes[$c]] == "rang") {$nom[$this->correspondance_colonnes[$this->noms_colonnes[$c]]] =$this->correspondance_colonnes[$this->noms_colonnes[$c]].'="'.$this->rangs_bdnt_taxref[$ligne[$c]].'"';} elseif ($this->correspondance_colonnes[$this->noms_colonnes[$c]] == "num_nom") {$num_nom = $ligne[$c];$nom[$this->correspondance_colonnes[$this->noms_colonnes[$c]]] =$this->correspondance_colonnes[$this->noms_colonnes[$c]].'="'.$ligne[$c].'"';} else {$nom[$this->correspondance_colonnes[$this->noms_colonnes[$c]]] =$this->correspondance_colonnes[$this->noms_colonnes[$c]].'="'.$ligne[$c].'"';;}}}}$nom['exclure_taxref'] = 'exclure_taxref="0"';$donnees[$num_nom] = $nom;$correspondance_taxref_bdnt[$nom['CD_NOM']] = $num_nom;}fclose($pointeur);$donnees = $this->changerNumerotation($donnees, $correspondance_taxref_bdnt, $taxref);}return $donnees;}private function changerNumerotation($donnees, $correspondance, $taxref) {$i=0;$j=0;$k=0;foreach ($donnees as $num_nom=>$infos) {if (isset($correspondance[$infos['CD_SUP']])) {$donnees[$num_nom]['num_tax_sup'] = "num_tax_sup=".$correspondance[$infos['CD_SUP']];$i++;} elseif ($infos['CD_SUP'] != '') {$donnees[$num_nom]['num_tax_sup'] = "num_tax_sup=''";$sup[$infos['CD_NOM']] = $taxref[$infos['CD_NOM']];}unset($donnees[$num_nom]['CD_SUP']);if (isset($correspondance[$infos['CD_REF']])) {$donnees[$num_nom]['num_nom_retenu'] = "num_nom_retenu=".$correspondance[$infos['CD_REF']];$j++;} elseif ($infos['CD_REF'] != '') {$k++;$donnees[$num_nom]['num_nom_retenu'] = "num_nom_retenu=''";$ref[$infos['CD_NOM']] = $taxref[$infos['CD_NOM']];} else {Debug::printr($infos['CD_NOM']."n'a pas de valeur pour CD_REF");}unset($donnees[$num_nom]['CD_REF']);$donnees[$num_nom]['CD_NOM'] = 'num_taxref='.$donnees[$num_nom]['CD_NOM'];}//$this->ecrireFichierCsv($ref, './retenu_absent.csv');//$this->ecrireFichierCsv($sup, './superieur_absent.csv');echo "$j correspondance pour nom retenu $i correspondance pour nom sup $k non pas de correspondance retenu";return $donnees;}private function ecrireFichierCsv(&$contenu, $fichier) {$retour = true;$fichier = fopen($fichier, "w");fputcsv($fichier, $this->noms_colonnes, chr('9'));foreach ($contenu as $ligne) {if (fputcsv($fichier, $ligne, chr('9')) == false) {$e = "Une erreur est survenu lors de l'écriture du fichier : $fichier";Debug::printr($e);$retour = false;}}$contenu = null;return $retour;}private function creerCorrespondanceRangBdntTaxref() {$rangs = explode(',', $this->manuel['rangs_bdnt_taxref']);foreach ($rangs as $rang) {list($id_bdnt, $code_taxref) = explode(':', trim($rang));$this->rangs_bdnt_taxref[$code_taxref] = $id_bdnt;}}private function connecterPDO() {Config::charger('./configurations/bdd.ini');try {$dsn = Config::get('bdd_type').':dbname='.Config::get('bdd_nom').';host='.Config::get('bdd_hote');$this->bdd = new PDO($dsn, Config::get('bdd_utilisateur'), Config::get('bdd_mot_de_passe'));} catch (PDOException $e) {print_r($e);echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();}// Passe en UTF-8 la connexion à la BDD$this->bdd->exec("SET NAMES 'utf8'");// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)$this->bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);}protected function executerRequeter($requete) {$infos = null;try {$infos = $this->bdd->query($requete);if ($infos === false) {echo $requete;}} catch (PDOException $e) {//print_r($this->bdd->errorInfo());echo sprintf($e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode()); //echo $requete;}return $infos;}}?>