Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1259 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1259 Rev 1280
1
<?php
1
<?php
2
//declare(encoding='UTF-8');
2
//declare(encoding='UTF-8');
3
/**
3
/**
4
 * Exemple de lancement du script : :
4
 * Exemple de lancement du script : :
5
 * /opt/lampp/bin/php cli.php bdtfx -a chargerTous
5
 * /opt/lampp/bin/php cli.php bdtfx -a chargerTous
6
 *
6
 *
7
 * @category	php 5.2
7
 * @category	php 5.2
8
 * @package		eFlore/Scripts
8
 * @package		eFlore/Scripts
9
 * @author		Jennifer DHÉ <jennifer@tela-botanica.org>
9
 * @author		Jennifer DHÉ <jennifer@tela-botanica.org>
10
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
 * @copyright	Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
11
 * @copyright	Copyright (c) 2011, Tela Botanica (accueil@tela-botanica.org)
12
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
12
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
13
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
13
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
14
 * @version		$Id$
14
 * @version		$Id$
15
 */
15
 */
16
class Bdtfx extends EfloreScript {
16
class Bdtfx extends EfloreScript {
17
 
17
 
18
	private $table = null;
18
	private $table = null;
19
	private $pasInsertion = 1000;
19
	private $pasInsertion = 1000;
20
	private $departInsertion = 0;
20
	private $departInsertion = 0;
21
 
21
 
22
	protected $parametres_autorises = array(
22
	protected $parametres_autorises = array(
23
		'-t' => array(false, false, 'Permet de tester le script sur un jeu réduit de données (indiquer le nombre de lignes).'));
23
		'-t' => array(false, false, 'Permet de tester le script sur un jeu réduit de données (indiquer le nombre de lignes).'));
24
 
24
 
25
	public function executer() {
25
	public function executer() {
26
		try {
26
		try {
27
			$this->initialiserProjet('bdtfx');
27
			$this->initialiserProjet('bdtfx');
28
 
28
 
29
			// Lancement de l'action demandée
29
			// Lancement de l'action demandée
30
			$cmd = $this->getParametre('a');
30
			$cmd = $this->getParametre('a');
31
			switch ($cmd) {
31
			switch ($cmd) {
32
				case 'chargerTous' :
32
				case 'chargerTous' :
33
					$this->chargerStructureSql();
33
					$this->chargerStructureSql();
34
					$this->chargerBdtfx();
34
					$this->chargerBdtfx();
35
					$this->genererChpNomSciHtml();
35
					$this->genererChpNomSciHtml();
36
					$this->genererChpFamille();
36
					$this->genererChpFamille();
37
					$this->genererDonneesTestMultiVersion();
37
					//$this->genererDonneesTestMultiVersion();
38
					$this->genererChpHierarchie();
38
					$this->genererChpHierarchie();
39
					$this->genererBDTFXReduit();
39
					$this->genererBDTFXReduit();
40
					break;
40
					break;
41
				case 'chargerStructureSql' :
41
				case 'chargerStructureSql' :
42
					$this->chargerStructureSql();
42
					$this->chargerStructureSql();
43
					break;
43
					break;
44
				case 'chargerBdtfx' :
44
				case 'chargerBdtfx' :
45
					$this->chargerBdtfx();
45
					$this->chargerBdtfx();
46
					break;
46
					break;
47
				case 'genererNomSciHtml' :
47
				case 'genererNomSciHtml' :
48
					$this->genererChpNomSciHtml();
48
					$this->genererChpNomSciHtml();
49
					break;
49
					break;
50
				case 'genererChpFamille' :
50
				case 'genererChpFamille' :
51
					$this->genererChpFamille();
51
					$this->genererChpFamille();
52
					break;
52
					break;
53
				case 'genererChpHierarchie' :
53
				case 'genererChpHierarchie' :
54
					$this->genererChpHierarchie();
54
					$this->genererChpHierarchie();
55
					break;
55
					break;
56
				case 'genererDonneesTestMultiVersion' :
56
				case 'genererDonneesTestMultiVersion' :
57
					$this->genererDonneesTestMultiVersion();
57
					$this->genererDonneesTestMultiVersion();
58
					break;
58
					break;
59
				case 'genererBDTFXR' :
59
				case 'genererBDTFXR' :
60
					$this->genererBDTFXReduit();
60
					$this->genererBDTFXReduit();
61
					break;
61
					break;
62
				case 'supprimerDonneesTestMultiVersion' :
62
				case 'supprimerDonneesTestMultiVersion' :
63
					$this->supprimerDonneesTestMultiVersion();
63
					$this->supprimerDonneesTestMultiVersion();
64
					break;
64
					break;
65
				case 'supprimerTous' :
65
				case 'supprimerTous' :
66
					$this->supprimerTous();
66
					$this->supprimerTous();
67
					break;
67
					break;
68
				default :
68
				default :
69
					throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
69
					throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
70
			}
70
			}
71
		} catch (Exception $e) {
71
		} catch (Exception $e) {
72
			$this->traiterErreur($e->getMessage());
72
			$this->traiterErreur($e->getMessage());
73
		}
73
		}
74
	}
74
	}
75
 
75
 
76
	private function chargerBdtfx() {
76
	private function chargerBdtfx() {
77
		$chemin = Config::get('chemins.bdtfx');
77
		$chemin = Config::get('chemins.bdtfx');
78
		$table = Config::get('tables.bdtfx');
78
		$table = Config::get('tables.bdtfx');
79
		$requete = "LOAD DATA INFILE '$chemin' ".
79
		$requete = "LOAD DATA LOCAL INFILE '$chemin' ".
80
				"REPLACE INTO TABLE $table ".
80
				"REPLACE INTO TABLE $table ".
81
				'CHARACTER SET utf8 '.
81
				'CHARACTER SET utf8 '.
82
				'FIELDS '.
82
				'FIELDS '.
83
				"	TERMINATED BY '\t' ".
83
				"	TERMINATED BY '\t' ".
84
				"	ENCLOSED BY '' ".
84
				"	ENCLOSED BY '' ".
85
				"	ESCAPED BY '\\\' ".
85
				"	ESCAPED BY '\\\' ".
86
				'IGNORE 1 LINES';
86
				'IGNORE 1 LINES';
87
		$this->getBdd()->requeter($requete);
87
		$this->getBdd()->requeter($requete);
88
	}
88
	}
89
 
89
 
90
	private function genererChpNomSciHtml() {
90
	private function genererChpNomSciHtml() {
91
		$this->initialiserGenerationChamps();
91
		$this->initialiserGenerationChamps();
92
		$this->preparerTablePrChpNomSciHtml();
92
		$this->preparerTablePrChpNomSciHtml();
93
		$generateur = new GenerateurNomSciHtml();
93
		$generateur = new GenerateurNomSciHtml();
94
		$nbreTotal = $this->recupererNbTotalTuples();
94
		$nbreTotal = $this->recupererNbTotalTuples();
95
		$erreurs = array();
95
		$erreurs = array();
96
		$this->departInsertion = 0;
96
		$this->departInsertion = 0;
97
		while ($this->departInsertion < $nbreTotal) {
97
		while ($this->departInsertion < $nbreTotal) {
98
			$resultat = $this->recupererTuplesPrChpNomSciHtml();
98
			$resultat = $this->recupererTuplesPrChpNomSciHtml();
99
 
99
 
100
			try {
100
			try {
101
				$nomsSciEnHtml = $generateur->generer($resultat);
101
				$nomsSciEnHtml = $generateur->generer($resultat);
102
			} catch (Exception $e) {
102
			} catch (Exception $e) {
103
				$erreurs[] = $e->getMessage();
103
				$erreurs[] = $e->getMessage();
104
			}
104
			}
105
 
105
 
106
			$this->remplirChpNomSciHtm($nomsSciEnHtml);
106
			$this->remplirChpNomSciHtm($nomsSciEnHtml);
107
			$this->departInsertion += $this->pasInsertion;
107
			$this->departInsertion += $this->pasInsertion;
108
			$this->afficherAvancement("Insertion des noms scientifique au format HTML dans la base par paquet de {$this->pasInsertion} en cours");
108
			$this->afficherAvancement("Insertion des noms scientifique au format HTML dans la base par paquet de {$this->pasInsertion} en cours");
109
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
109
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
110
		}
110
		}
111
		echo "\n";
111
		echo "\n";
112
 
112
 
113
		$this->creerFichierLog('Erreurs lors de la génération HTML des noms scientifiques', $erreurs, 'erreurs_noms_sci_html');
113
		$this->creerFichierLog('Erreurs lors de la génération HTML des noms scientifiques', $erreurs, 'erreurs_noms_sci_html');
114
	}
114
	}
115
 
115
 
116
	private function initialiserGenerationChamps() {
116
	private function initialiserGenerationChamps() {
117
		$this->table = Config::get('tables.bdtfx');
117
		$this->table = Config::get('tables.bdtfx');
118
	}
118
	}
119
 
119
 
120
	private function preparerTablePrChpNomSciHtml() {
120
	private function preparerTablePrChpNomSciHtml() {
121
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' ";
121
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' ";
122
		$resultat = $this->getBdd()->recuperer($requete);
122
		$resultat = $this->getBdd()->recuperer($requete);
123
		if ($resultat === false) {
123
		if ($resultat === false) {
124
			$requete = 	"ALTER TABLE {$this->table} ".
124
			$requete = 	"ALTER TABLE {$this->table} ".
125
				'ADD nom_sci_html VARCHAR( 500 ) '.
125
				'ADD nom_sci_html VARCHAR( 500 ) '.
126
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
126
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
127
			$this->getBdd()->requeter($requete);
127
			$this->getBdd()->requeter($requete);
128
		}
128
		}
129
	}
129
	}
130
 
130
 
131
	private function recupererNbTotalTuples(){
131
	private function recupererNbTotalTuples(){
132
		$requete = "SELECT count(*) AS nb FROM {$this->table} ";
132
		$requete = "SELECT count(*) AS nb FROM {$this->table} ";
133
		$resultat = $this->getBdd()->recuperer($requete);
133
		$resultat = $this->getBdd()->recuperer($requete);
134
		return $resultat['nb'];
134
		return $resultat['nb'];
135
	}
135
	}
136
 
136
 
137
	private function recupererTuplesPrChpNomSciHtml() {
137
	private function recupererTuplesPrChpNomSciHtml() {
138
		$requete = 'SELECT 	num_nom, rang, nom_sci, nom_supra_generique, genre, epithete_infra_generique, '.
138
		$requete = 'SELECT 	num_nom, rang, nom_sci, nom_supra_generique, genre, epithete_infra_generique, '.
139
			'	epithete_sp, type_epithete, epithete_infra_sp,cultivar_groupe, '.
139
			'	epithete_sp, type_epithete, epithete_infra_sp,cultivar_groupe, '.
140
			'	nom_commercial, cultivar '.
140
			'	nom_commercial, cultivar '.
141
			"FROM {$this->table} ".
141
			"FROM {$this->table} ".
142
			"LIMIT {$this->departInsertion},{$this->pasInsertion} ";
142
			"LIMIT {$this->departInsertion},{$this->pasInsertion} ";
143
		$resultat = $this->getBdd()->recupererTous($requete);
143
		$resultat = $this->getBdd()->recupererTous($requete);
144
		return $resultat;
144
		return $resultat;
145
	}
145
	}
146
 
146
 
147
	private function remplirChpNomSciHtm($nomsSciHtm) {
147
	private function remplirChpNomSciHtm($nomsSciHtm) {
148
		foreach ($nomsSciHtm as $id => $html) {
148
		foreach ($nomsSciHtm as $id => $html) {
149
			$html = $this->getBdd()->proteger($html);
149
			$html = $this->getBdd()->proteger($html);
150
			$requete = "UPDATE {$this->table} SET nom_sci_html = $html WHERE num_nom = $id ";
150
			$requete = "UPDATE {$this->table} SET nom_sci_html = $html WHERE num_nom = $id ";
151
			$resultat = $this->getBdd()->requeter($requete);
151
			$resultat = $this->getBdd()->requeter($requete);
152
			if ($resultat === false) {
152
			if ($resultat === false) {
153
				throw new Exception("Erreur d'insertion pour le tuple $id");
153
				throw new Exception("Erreur d'insertion pour le tuple $id");
154
			}
154
			}
155
		}
155
		}
156
	}
156
	}
157
 
157
 
158
	private function traiterResultatsFamille(&$resultats, &$noms, &$introuvables, &$introuvablesSyno) {
158
	private function traiterResultatsFamille(&$resultats, &$noms, &$introuvables, &$introuvablesSyno) {
159
		foreach ($resultats as $id => $nom) {
159
		foreach ($resultats as $id => $nom) {
160
			$nn = $nom['num_nom'];
160
			$nn = $nom['num_nom'];
161
			$nnr = $nom['num_nom_retenu'];
161
			$nnr = $nom['num_nom_retenu'];
162
			$nts = $nom['num_tax_sup'];
162
			$nts = $nom['num_tax_sup'];
163
			$rg = $nom['rang'];
163
			$rg = $nom['rang'];
164
			if ($nnr != '') {
164
			if ($nnr != '') {
165
				if ($rg == '180') {
165
				if ($rg == '180') {
166
					$noms[$nn] = $nom['nom_sci'];
166
					$noms[$nn] = $nom['nom_sci'];
167
				} else {
167
				} else {
168
					if ($nn == $nnr) {// nom retenu
168
					if ($nn == $nnr) {// nom retenu
169
						if (isset($noms[$nts])) {
169
						if (isset($noms[$nts])) {
170
							// signifie que recupererTuplesPrChpFamille() devrait
170
							// signifie que recupererTuplesPrChpFamille() devrait
171
							// récupérer ce record *avant*
171
							// récupérer ce record *avant*
172
							$noms[$nn] = $noms[$nts];
172
							$noms[$nn] = $noms[$nts];
173
						} else {
173
						} else {
174
							$introuvables[] = $nn;
174
							$introuvables[] = $nn;
175
						}
175
						}
176
					} else {// nom synonyme
176
					} else {// nom synonyme
177
						if (isset($noms[$nnr])) {
177
						if (isset($noms[$nnr])) {
178
							// signifie que recupererTuplesPrChpFamille() devrait
178
							// signifie que recupererTuplesPrChpFamille() devrait
179
							// récupérer ce record *avant*
179
							// récupérer ce record *avant*
180
							$noms[$nn] = $noms[$nnr];
180
							$noms[$nn] = $noms[$nnr];
181
						} else {
181
						} else {
182
							$introuvablesSyno[] = $nom;
182
							$introuvablesSyno[] = $nom;
183
						}
183
						}
184
					}
184
					}
185
				}
185
				}
186
			}
186
			}
187
			unset($resultats[$id]);
187
			unset($resultats[$id]);
188
			$this->afficherAvancement("Attribution de leur famille aux noms en cours");
188
			$this->afficherAvancement("Attribution de leur famille aux noms en cours");
189
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
189
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
190
		}
190
		}
191
	}
191
	}
192
 
192
 
193
	private function genererChpFamille() {
193
	private function genererChpFamille() {
194
		$this->initialiserGenerationChamps();
194
		$this->initialiserGenerationChamps();
195
		$this->preparerTablePrChpFamille();
195
		$this->preparerTablePrChpFamille();
196
		$resultats = $this->recupererTuplesPrChpFamille();
196
		$resultats = $this->recupererTuplesPrChpFamille();
197
		$noms = array();
197
		$noms = array();
198
		$introuvables = array();
198
		$introuvables = array();
199
		$introuvablesSyno = array();
199
		$introuvablesSyno = array();
200
		$i = 1;
200
		$i = 1;
201
 
201
 
202
		while(true) {
202
		while(true) {
203
			printf("passe n°%d:\n", $i);
203
			printf("passe n°%d:\n", $i);
204
			$this->traiterResultatsFamille($resultats, $noms, $introuvables, $introuvablesSyno);
204
			$this->traiterResultatsFamille($resultats, $noms, $introuvables, $introuvablesSyno);
205
			echo "\n\n";
205
			echo "\n\n";
206
			// printf("noms: %d, introuvables: %d, introuvablesSyno: %d\n", count($noms), count($introuvables), count($introuvablesSyno));
206
			// printf("noms: %d, introuvables: %d, introuvablesSyno: %d\n", count($noms), count($introuvables), count($introuvablesSyno));
207
			// XXX, au 22/07/2013, 3 passes sont suffisantes
207
			// XXX, au 22/07/2013, 3 passes sont suffisantes
208
			// TODO: MySQL procédure stockée !
208
			// TODO: MySQL procédure stockée !
209
			if($i++ == 3) break;
209
			if($i++ == 3) break;
210
			$resultats = array_merge($resultats, $introuvables, $introuvablesSyno);
210
			$resultats = array_merge($resultats, $introuvables, $introuvablesSyno);
211
			$introuvables = $introuvablesSyno = array();
211
			$introuvables = $introuvablesSyno = array();
212
		}
212
		}
213
 
213
 
214
		foreach ($introuvablesSyno as $id => $nom) {
214
		foreach ($introuvablesSyno as $id => $nom) {
215
			$nn = $nom['num_nom'];
215
			$nn = $nom['num_nom'];
216
			$nnr = $nom['num_nom_retenu'];
216
			$nnr = $nom['num_nom_retenu'];
217
			if (isset($noms[$nnr])) {
217
			if (isset($noms[$nnr])) {
218
				$noms[$nn] = $noms[$nnr];
218
				$noms[$nn] = $noms[$nnr];
219
			} else {
219
			} else {
220
				$introuvables[] = $nn;
220
				$introuvables[] = $nn;
221
			}
221
			}
222
			unset($introuvablesSyno[$id]);
222
			unset($introuvablesSyno[$id]);
223
			$this->afficherAvancement("Attribution de leur famille aux synonymes en cours");
223
			$this->afficherAvancement("Attribution de leur famille aux synonymes en cours");
224
		}
224
		}
225
		echo "\n";
225
		echo "\n";
226
 
226
 
227
		$msg = 'Plusieurs familles sont introuvables';
227
		$msg = 'Plusieurs familles sont introuvables';
228
		$this->creerFichierLog($msg, $introuvables, 'famille_introuvable');
228
		$this->creerFichierLog($msg, $introuvables, 'famille_introuvable');
229
 
229
 
230
		$this->remplirChpFamille($noms);
230
		$this->remplirChpFamille($noms);
231
	}
231
	}
232
	
232
	
233
	private function preparerTablePrChpFamille() {
233
	private function preparerTablePrChpFamille() {
234
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'famille' ";
234
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'famille' ";
235
		$resultat = $this->getBdd()->recuperer($requete);
235
		$resultat = $this->getBdd()->recuperer($requete);
236
		if ($resultat === false) {
236
		if ($resultat === false) {
237
			$requete = 	"ALTER TABLE {$this->table} ".
237
			$requete = 	"ALTER TABLE {$this->table} ".
238
				'ADD famille VARCHAR(255) '.
238
				'ADD famille VARCHAR(255) '.
239
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
239
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
240
			$this->getBdd()->requeter($requete);
240
			$this->getBdd()->requeter($requete);
241
		}
241
		}
242
	}
242
	}
243
 
243
 
244
	private function recupererTuplesPrChpFamille() {
244
	private function recupererTuplesPrChpFamille() {
245
		$requete = 'SELECT num_nom, num_nom_retenu, num_tax_sup, rang, nom_sci '.
245
		$requete = 'SELECT num_nom, num_nom_retenu, num_tax_sup, rang, nom_sci '.
246
				"FROM {$this->table} ".
246
				"FROM {$this->table} ".
247
				"WHERE rang >= 180 ".
247
				"WHERE rang >= 180 ".
248
				"ORDER BY rang ASC, num_tax_sup ASC, num_nom_retenu DESC ";
248
				"ORDER BY rang ASC, num_tax_sup ASC, num_nom_retenu DESC ";
249
		$resultat = $this->getBdd()->recupererTous($requete);
249
		$resultat = $this->getBdd()->recupererTous($requete);
250
		return $resultat;
250
		return $resultat;
251
	}
251
	}
252
 
252
 
253
	private function remplirChpFamille($noms) {
253
	private function remplirChpFamille($noms) {
254
		foreach ($noms as $id => $famille) {
254
		foreach ($noms as $id => $famille) {
255
			$famille = $this->getBdd()->proteger($famille);
255
			$famille = $this->getBdd()->proteger($famille);
256
			$requete = "UPDATE {$this->table} SET famille = $famille WHERE num_nom = $id ";
256
			$requete = "UPDATE {$this->table} SET famille = $famille WHERE num_nom = $id ";
257
			$resultat = $this->getBdd()->requeter($requete);
257
			$resultat = $this->getBdd()->requeter($requete);
258
			if ($resultat === false) {
258
			if ($resultat === false) {
259
				throw new Exception("Erreur d'insertion pour le tuple $id");
259
				throw new Exception("Erreur d'insertion pour le tuple $id");
260
			}
260
			}
261
			$this->afficherAvancement("Insertion des noms de famille dans la base en cours");
261
			$this->afficherAvancement("Insertion des noms de famille dans la base en cours");
262
		}
262
		}
263
		echo "\n";
263
		echo "\n";
264
	}
264
	}
265
	
265
	
266
	private function genererChpHierarchie() {
266
	private function genererChpHierarchie() {
267
		$this->initialiserGenerationChamps();
267
		$this->initialiserGenerationChamps();
268
		$this->preparerTablePrChpHierarchie();
268
		$this->preparerTablePrChpHierarchie();
269
		$table = Config::get('tables.bdtfx');
269
		$table = Config::get('tables.bdtfx');
270
		
270
		
271
		$requete = "UPDATE $table SET hierarchie = NULL ";
271
		$requete = "UPDATE $table SET hierarchie = NULL ";
272
		$mise_a_jour = $this->getBdd()->requeter($requete);
272
		$mise_a_jour = $this->getBdd()->requeter($requete);
273
		
273
		
274
		$requete_hierarchie = "SELECT num_nom, num_nom_retenu, num_tax_sup FROM ".$table." ORDER BY rang DESC";
274
		$requete_hierarchie = "SELECT num_nom, num_nom_retenu, num_tax_sup FROM ".$table." ORDER BY rang DESC";
275
		
275
		
276
		$resultat = $this->getBdd()->recupererTous($requete_hierarchie);
276
		$resultat = $this->getBdd()->recupererTous($requete_hierarchie);
277
		$num_nom_a_num_sup = array();
277
		$num_nom_a_num_sup = array();
278
		foreach($resultat as &$taxon) {
278
		foreach($resultat as &$taxon) {
279
			$num_nom_a_num_sup[$taxon['num_nom']] = $taxon['num_tax_sup'];
279
			$num_nom_a_num_sup[$taxon['num_nom']] = $taxon['num_tax_sup'];
280
		}
280
		}
281
		$chemin_taxo = "";
281
		$chemin_taxo = "";
282
		foreach($resultat as &$taxon) {
282
		foreach($resultat as &$taxon) {
283
			$chemin_taxo = $this->traiterHierarchieNumTaxSup($taxon['num_nom_retenu'], $num_nom_a_num_sup).'-';
283
			$chemin_taxo = $this->traiterHierarchieNumTaxSup($taxon['num_nom_retenu'], $num_nom_a_num_sup).'-';
284
			$requete = "UPDATE $table SET hierarchie = ".$this->getBdd()->proteger($chemin_taxo)." WHERE num_nom = ".$taxon['num_nom']." ";
284
			$requete = "UPDATE $table SET hierarchie = ".$this->getBdd()->proteger($chemin_taxo)." WHERE num_nom = ".$taxon['num_nom']." ";
285
			$mise_a_jour = $this->getBdd()->requeter($requete);
285
			$mise_a_jour = $this->getBdd()->requeter($requete);
286
			$this->afficherAvancement("Insertion de la hierarchie taxonomique en cours");
286
			$this->afficherAvancement("Insertion de la hierarchie taxonomique en cours");
287
		}
287
		}
288
		echo "\n";
288
		echo "\n";
289
	}
289
	}
290
	
290
	
291
	private function traiterHierarchieNumTaxSup($num_nom_retenu, &$num_nom_a_num_sup) {
291
	private function traiterHierarchieNumTaxSup($num_nom_retenu, &$num_nom_a_num_sup) {
292
		$chaine_hierarchie = "";
292
		$chaine_hierarchie = "";
293
		if(isset($num_nom_a_num_sup[$num_nom_retenu])) {
293
		if(isset($num_nom_a_num_sup[$num_nom_retenu])) {
294
			$num_tax_sup = $num_nom_a_num_sup[$num_nom_retenu];
294
			$num_tax_sup = $num_nom_a_num_sup[$num_nom_retenu];
295
			$chaine_hierarchie = '-'.$num_tax_sup;
295
			$chaine_hierarchie = '-'.$num_tax_sup;
296
			if($num_tax_sup != 0 && $num_tax_sup != '') {
296
			if($num_tax_sup != 0 && $num_tax_sup != '') {
297
				$chaine_hierarchie = $this->traiterHierarchieNumTaxSup($num_tax_sup, $num_nom_a_num_sup).$chaine_hierarchie;
297
				$chaine_hierarchie = $this->traiterHierarchieNumTaxSup($num_tax_sup, $num_nom_a_num_sup).$chaine_hierarchie;
298
			}
298
			}
299
		}
299
		}
300
		return $chaine_hierarchie;
300
		return $chaine_hierarchie;
301
	}
301
	}
302
	
302
	
303
	private function preparerTablePrChpHierarchie() {
303
	private function preparerTablePrChpHierarchie() {
304
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'hierarchie' ";
304
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'hierarchie' ";
305
		$resultat = $this->getBdd()->recuperer($requete);
305
		$resultat = $this->getBdd()->recuperer($requete);
306
		if ($resultat === false) {
306
		if ($resultat === false) {
307
			$requete = 	"ALTER TABLE {$this->table} ".
307
			$requete = 	"ALTER TABLE {$this->table} ".
308
					'ADD hierarchie VARCHAR(1000) '.
308
					'ADD hierarchie VARCHAR(1000) '.
309
					'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
309
					'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
310
			$this->getBdd()->requeter($requete);
310
			$this->getBdd()->requeter($requete);
311
		}
311
		}
312
	}
312
	}
313
 
313
 
314
	private function genererDonneesTestMultiVersion() {
314
	private function genererDonneesTestMultiVersion() {
315
		$contenuSql = $this->recupererContenu(Config::get('chemins.structureSqlTest'));
315
		$contenuSql = $this->recupererContenu(Config::get('chemins.structureSqlTest'));
316
		$this->executerScripSql($contenuSql);
316
		$this->executerScripSql($contenuSql);
317
 
317
 
318
		$table = Config::get('tables.bdtfx');
318
		$table = Config::get('tables.bdtfx');
319
		$tableTest = Config::get('tables.bdtfxTest');
319
		$tableTest = Config::get('tables.bdtfxTest');
320
		$requete = "INSERT INTO $tableTest SELECT * FROM $table";
320
		$requete = "INSERT INTO $tableTest SELECT * FROM $table";
321
		$this->getBdd()->requeter($requete);
321
		$this->getBdd()->requeter($requete);
322
	}
322
	}
323
 
323
 
324
	private function supprimerDonneesTestMultiVersion() {
324
	private function supprimerDonneesTestMultiVersion() {
325
		$tableMeta = Config::get('tables.bdtfxMeta');
325
		$tableMeta = Config::get('tables.bdtfxMeta');
326
		$requete = "DELETE FROM $tableMeta WHERE guid = 'urn:lsid:tela-botanica.org:bdtfx:1.02'";
326
		$requete = "DELETE FROM $tableMeta WHERE guid = 'urn:lsid:tela-botanica.org:bdtfx:1.02'";
327
		$this->getBdd()->requeter($requete);
327
		$this->getBdd()->requeter($requete);
328
 
328
 
329
		$tableTest = Config::get('tables.bdtfxTest');
329
		$tableTest = Config::get('tables.bdtfxTest');
330
		$requete = "DROP TABLE IF EXISTS $tableTest";
330
		$requete = "DROP TABLE IF EXISTS $tableTest";
331
		$this->getBdd()->requeter($requete);
331
		$this->getBdd()->requeter($requete);
332
	}
332
	}
333
	
333
	
334
	private function genererBDTFXReduit() {
334
	private function genererBDTFXReduit() {
335
		$table = Config::get('tables.bdtfx');
335
		$table = Config::get('tables.bdtfx');
336
		$version = Config::get('version');
336
		$version = Config::get('version');
337
	
337
	
338
		$requete = "create table bdtfxr_v".$version." as (SELECT *
338
		$requete = "create table bdtfxr_v".$version." as (SELECT *
339
						FROM ".$table."
339
						FROM ".$table."
340
						WHERE 
340
						WHERE 
341
							(`presence` = 'P' AND num_nom = num_nom_retenu)
341
							(`presence` = 'P' AND num_nom = num_nom_retenu)
342
						OR 
342
						OR 
343
							(`flore_bonnier_num` != '' OR `flore_cnrs_num` != '' OR `flore_coste_num` != ''
343
							(`flore_bonnier_num` != '' OR `flore_cnrs_num` != '' OR `flore_coste_num` != ''
344
								OR `flore_fournier_num` != '' OR `flore_fg_num` != ''))"; 
344
								OR `flore_fournier_num` != '' OR `flore_fg_num` != ''))"; 
345
		$table = $this->getBdd()->requeter($requete);
345
		$table = $this->getBdd()->requeter($requete);
346
		
346
		
347
		$requete_meta = "INSERT INTO `bdtfxr_meta`(`guid`, `langue_meta`, `code`, `version`, `titre`, `description`, `mots_cles`, `citation`, `url_tech`, `url_projet`, `source`, `createurs`, `editeur`, `contributeurs`, `droits`, `url_droits`, `langue`, `date_creation`, `date_validite`, `couverture_spatiale`, `couverture_temporelle`, `web_services`) ".
347
		$requete_meta = "INSERT INTO `bdtfxr_meta`(`guid`, `langue_meta`, `code`, `version`, `titre`, `description`, `mots_cles`, `citation`, `url_tech`, `url_projet`, `source`, `createurs`, `editeur`, `contributeurs`, `droits`, `url_droits`, `langue`, `date_creation`, `date_validite`, `couverture_spatiale`, `couverture_temporelle`, `web_services`) ".
348
				" SELECT * FROM `bdtfx_meta` WHERE `version` = '".str_replace('_', '.', $version)."'";
348
				" SELECT * FROM `bdtfx_meta` WHERE `version` = '".str_replace('_', '.', $version)."'";
349
		$meta = $this->getBdd()->requeter($requete_meta);
349
		$meta = $this->getBdd()->requeter($requete_meta);
350
	}
350
	}
351
 
351
 
352
	private function supprimerTous() {
352
	private function supprimerTous() {
353
		$requete = "DROP TABLE IF EXISTS bdtfx_meta, bdtfx_v1_01, bdtfx_v1_02";
353
		$requete = "DROP TABLE IF EXISTS bdtfx_meta, bdtfx_v1_01, bdtfx_v1_02";
354
		$this->getBdd()->requeter($requete);
354
		$this->getBdd()->requeter($requete);
355
	}
355
	}
356
 
356
 
357
	private function creerFichierLog($message, $lignes, $nomFichier) {
357
	private function creerFichierLog($message, $lignes, $nomFichier) {
358
		$lignesNbre = count($lignes);
358
		$lignesNbre = count($lignes);
359
		if ($lignesNbre != 0) {
359
		if ($lignesNbre != 0) {
360
			echo "$message. Voir le log de $lignesNbre lignes :\n";
360
			echo "$message. Voir le log de $lignesNbre lignes :\n";
361
 
361
 
362
			$logContenu = implode(", \n", $lignes);
362
			$logContenu = implode(", \n", $lignes);
363
			$logFichier = realpath(dirname(__FILE__))."/log/$nomFichier.log";
363
			$logFichier = realpath(dirname(__FILE__))."/log/$nomFichier.log";
364
			echo $logFichier."\n";
364
			echo $logFichier."\n";
365
					file_put_contents($logFichier, $logContenu);
365
					file_put_contents($logFichier, $logContenu);
366
		}
366
		}
367
	}
367
	}
368
}
368
}
369
?>
369
?>