Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 369 | Rev 699 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 369 Rev 661
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
					break;
38
					break;
39
				case 'chargerStructureSql' :
39
				case 'chargerStructureSql' :
40
					$this->chargerStructureSql();
40
					$this->chargerStructureSql();
41
					break;
41
					break;
42
				case 'chargerBdtfx' :
42
				case 'chargerBdtfx' :
43
					$this->chargerBdtfx();
43
					$this->chargerBdtfx();
44
					break;
44
					break;
45
				case 'genererNomSciHtml' :
45
				case 'genererNomSciHtml' :
46
					$this->genererChpNomSciHtml();
46
					$this->genererChpNomSciHtml();
47
					break;
47
					break;
48
				case 'genererChpFamille' :
48
				case 'genererChpFamille' :
49
					$this->genererChpFamille();
49
					$this->genererChpFamille();
50
					break;
50
					break;
51
				case 'genererDonneesTestMultiVersion' :
51
				case 'genererDonneesTestMultiVersion' :
52
					$this->genererDonneesTestMultiVersion();
52
					$this->genererDonneesTestMultiVersion();
53
					break;
53
					break;
54
				case 'supprimerDonneesTestMultiVersion' :
54
				case 'supprimerDonneesTestMultiVersion' :
55
					$this->supprimerDonneesTestMultiVersion();
55
					$this->supprimerDonneesTestMultiVersion();
56
					break;
56
					break;
57
				case 'supprimerTous' :
57
				case 'supprimerTous' :
58
					$this->supprimerTous();
58
					$this->supprimerTous();
59
					break;
59
					break;
60
				default :
60
				default :
61
					throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
61
					throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
62
			}
62
			}
63
		} catch (Exception $e) {
63
		} catch (Exception $e) {
64
			$this->traiterErreur($e->getMessage());
64
			$this->traiterErreur($e->getMessage());
65
		}
65
		}
66
	}
66
	}
67
 
67
 
68
	private function chargerBdtfx() {
68
	private function chargerBdtfx() {
69
		$chemin = Config::get('chemins.bdtfx');
69
		$chemin = Config::get('chemins.bdtfx');
70
		$table = Config::get('tables.bdtfx');
70
		$table = Config::get('tables.bdtfx');
71
		$requete = "LOAD DATA INFILE '$chemin' ".
71
		$requete = "LOAD DATA INFILE '$chemin' ".
72
				"REPLACE INTO TABLE $table ".
72
				"REPLACE INTO TABLE $table ".
73
				'CHARACTER SET utf8 '.
73
				'CHARACTER SET utf8 '.
74
				'FIELDS '.
74
				'FIELDS '.
75
				"	TERMINATED BY '\t' ".
75
				"	TERMINATED BY '\t' ".
76
				"	ENCLOSED BY '' ".
76
				"	ENCLOSED BY '' ".
77
				"	ESCAPED BY '\\\' ".
77
				"	ESCAPED BY '\\\' ".
78
				'IGNORE 1 LINES';
78
				'IGNORE 1 LINES';
79
		$this->getBdd()->requeter($requete);
79
		$this->getBdd()->requeter($requete);
80
	}
80
	}
81
 
81
 
82
	private function genererChpNomSciHtml() {
82
	private function genererChpNomSciHtml() {
83
		$this->initialiserGenerationChamps();
83
		$this->initialiserGenerationChamps();
84
		$this->preparerTablePrChpNomSciHtml();
84
		$this->preparerTablePrChpNomSciHtml();
85
		$generateur = new GenerateurNomSciHtml();
85
		$generateur = new GenerateurNomSciHtml();
86
		$nbreTotal = $this->recupererNbTotalTuples();
86
		$nbreTotal = $this->recupererNbTotalTuples();
-
 
87
		$erreurs = array();
87
		$this->departInsertion = 0;
88
		$this->departInsertion = 0;
88
		while ($this->departInsertion < $nbreTotal) {
89
		while ($this->departInsertion < $nbreTotal) {
89
			$resultat = $this->recupererTuplesPrChpNomSciHtml();
90
			$resultat = $this->recupererTuplesPrChpNomSciHtml();
-
 
91
 
-
 
92
			try {
90
			$nomsSciEnHtml = $generateur->generer($resultat);
93
				$nomsSciEnHtml = $generateur->generer($resultat);
-
 
94
			} catch (Exception $e) {
-
 
95
				$erreurs[] = $e->getMessage();
-
 
96
			}
-
 
97
 
91
			$this->remplirChpNomSciHtm($nomsSciEnHtml);
98
			$this->remplirChpNomSciHtm($nomsSciEnHtml);
92
			$this->departInsertion += $this->pasInsertion;
99
			$this->departInsertion += $this->pasInsertion;
93
			$this->afficherAvancement("Insertion des noms scientifique au format HTML dans la base par paquet de {$this->pasInsertion} en cours");
100
			$this->afficherAvancement("Insertion des noms scientifique au format HTML dans la base par paquet de {$this->pasInsertion} en cours");
94
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
101
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
95
		}
102
		}
96
		echo "\n";
103
		echo "\n";
-
 
104
 
-
 
105
		$this->creerFichierLog('Erreurs lors de la génération HTML des noms scientifiques', $erreurs, 'erreurs_noms_sci_html');
97
	}
106
	}
98
 
107
 
99
	private function initialiserGenerationChamps() {
108
	private function initialiserGenerationChamps() {
100
		$this->table = Config::get('tables.bdtfx');
109
		$this->table = Config::get('tables.bdtfx');
101
	}
110
	}
102
 
111
 
103
	private function preparerTablePrChpNomSciHtml() {
112
	private function preparerTablePrChpNomSciHtml() {
104
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' ";
113
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' ";
105
		$resultat = $this->getBdd()->recuperer($requete);
114
		$resultat = $this->getBdd()->recuperer($requete);
106
		if ($resultat === false) {
115
		if ($resultat === false) {
107
			$requete = 	"ALTER TABLE {$this->table} ".
116
			$requete = 	"ALTER TABLE {$this->table} ".
108
				'ADD nom_sci_html VARCHAR( 500 ) '.
117
				'ADD nom_sci_html VARCHAR( 500 ) '.
109
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
118
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
110
			$this->getBdd()->requeter($requete);
119
			$this->getBdd()->requeter($requete);
111
		}
120
		}
112
	}
121
	}
113
 
122
 
114
	private function recupererNbTotalTuples(){
123
	private function recupererNbTotalTuples(){
115
		$requete = "SELECT count(*) AS nb FROM {$this->table} ";
124
		$requete = "SELECT count(*) AS nb FROM {$this->table} ";
116
		$resultat = $this->getBdd()->recuperer($requete);
125
		$resultat = $this->getBdd()->recuperer($requete);
117
		return $resultat['nb'];
126
		return $resultat['nb'];
118
	}
127
	}
119
 
128
 
120
	private function recupererTuplesPrChpNomSciHtml() {
129
	private function recupererTuplesPrChpNomSciHtml() {
121
		$requete = 'SELECT 	num_nom, rang, nom_supra_generique, genre, epithete_infra_generique, '.
130
		$requete = 'SELECT 	num_nom, rang, nom_supra_generique, genre, epithete_infra_generique, '.
122
			'	epithete_sp, type_epithete, epithete_infra_sp,cultivar_groupe, '.
131
			'	epithete_sp, type_epithete, epithete_infra_sp,cultivar_groupe, '.
123
			'	nom_commercial, cultivar '.
132
			'	nom_commercial, cultivar '.
124
			"FROM {$this->table} ".
133
			"FROM {$this->table} ".
125
			"LIMIT {$this->departInsertion},{$this->pasInsertion} ";
134
			"LIMIT {$this->departInsertion},{$this->pasInsertion} ";
126
		$resultat = $this->getBdd()->recupererTous($requete);
135
		$resultat = $this->getBdd()->recupererTous($requete);
127
		return $resultat;
136
		return $resultat;
128
	}
137
	}
129
 
138
 
130
	private function remplirChpNomSciHtm($nomsSciHtm) {
139
	private function remplirChpNomSciHtm($nomsSciHtm) {
131
		foreach ($nomsSciHtm as $id => $html) {
140
		foreach ($nomsSciHtm as $id => $html) {
132
			$html = $this->getBdd()->proteger($html);
141
			$html = $this->getBdd()->proteger($html);
133
			$requete = "UPDATE {$this->table} SET nom_sci_html = $html WHERE num_nom = $id ";
142
			$requete = "UPDATE {$this->table} SET nom_sci_html = $html WHERE num_nom = $id ";
134
			$resultat = $this->getBdd()->requeter($requete);
143
			$resultat = $this->getBdd()->requeter($requete);
135
			if ($resultat === false) {
144
			if ($resultat === false) {
136
				throw new Exception("Erreur d'insertion pour le tuple $id");
145
				throw new Exception("Erreur d'insertion pour le tuple $id");
137
			}
146
			}
138
		}
147
		}
139
	}
148
	}
140
 
149
 
141
	private function genererChpFamille() {
150
	private function genererChpFamille() {
142
		$this->initialiserGenerationChamps();
151
		$this->initialiserGenerationChamps();
143
		$this->preparerTablePrChpFamille();
152
		$this->preparerTablePrChpFamille();
144
		$resultats = $this->recupererTuplesPrChpFamille();
153
		$resultats = $this->recupererTuplesPrChpFamille();
145
		$noms = array();
154
		$noms = array();
146
		$introuvables = array();
155
		$introuvables = array();
147
		$introuvablesSyno = array();
156
		$introuvablesSyno = array();
148
		foreach ($resultats as $id => $nom) {
157
		foreach ($resultats as $id => $nom) {
149
			$nn = $nom['num_nom'];
158
			$nn = $nom['num_nom'];
150
			$nnr = $nom['num_nom_retenu'];
159
			$nnr = $nom['num_nom_retenu'];
151
			$nts = $nom['num_tax_sup'];
160
			$nts = $nom['num_tax_sup'];
152
			$rg = $nom['rang'];
161
			$rg = $nom['rang'];
153
			if ($nnr != '') {
162
			if ($nnr != '') {
154
				if ($rg == '180') {
163
				if ($rg == '180') {
155
					$noms[$nn] = $nom['nom_sci'];
164
					$noms[$nn] = $nom['nom_sci'];
156
				} else {
165
				} else {
157
					if ($nn == $nnr) {// nom retenu
166
					if ($nn == $nnr) {// nom retenu
158
						if (isset($noms[$nts])) {
167
						if (isset($noms[$nts])) {
159
							$noms[$nn] = $noms[$nts];
168
							$noms[$nn] = $noms[$nts];
160
						} else {
169
						} else {
161
							$introuvables[] = $nn;
170
							$introuvables[] = $nn;
162
						}
171
						}
163
					} else {// nom synonyme
172
					} else {// nom synonyme
164
						if (isset($noms[$nnr])) {
173
						if (isset($noms[$nnr])) {
165
							$noms[$nn] = $noms[$nnr];
174
							$noms[$nn] = $noms[$nnr];
166
						} else {
175
						} else {
167
							$introuvablesSyno[] = $nom;
176
							$introuvablesSyno[] = $nom;
168
						}
177
						}
169
					}
178
					}
170
				}
179
				}
171
			}
180
			}
172
			unset($resultats[$id]);
181
			unset($resultats[$id]);
173
			$this->afficherAvancement("Attribution de leur famille aux noms en cours");
182
			$this->afficherAvancement("Attribution de leur famille aux noms en cours");
174
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
183
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
175
		}
184
		}
176
		echo "\n";
185
		echo "\n";
177
 
186
 
178
		foreach ($introuvablesSyno as $id => $nom) {
187
		foreach ($introuvablesSyno as $id => $nom) {
179
			$nn = $nom['num_nom'];
188
			$nn = $nom['num_nom'];
180
			$nnr = $nom['num_nom_retenu'];
189
			$nnr = $nom['num_nom_retenu'];
181
			if (isset($noms[$nnr])) {
190
			if (isset($noms[$nnr])) {
182
				$noms[$nn] = $noms[$nnr];
191
				$noms[$nn] = $noms[$nnr];
183
			} else {
192
			} else {
184
				$introuvables[] = $nn;
193
				$introuvables[] = $nn;
185
			}
194
			}
186
			unset($introuvablesSyno[$id]);
195
			unset($introuvablesSyno[$id]);
187
			$this->afficherAvancement("Attribution de leur famille aux synonymes en cours");
196
			$this->afficherAvancement("Attribution de leur famille aux synonymes en cours");
188
		}
197
		}
189
		echo "\n";
198
		echo "\n";
190
 
-
 
191
		if (count($introuvables) != 0) {
199
 
192
			$introuvablesNbre = count($introuvables);
200
		$msg = 'Plusieurs familles sont introuvables';
193
			echo "Famille introuvable pour $introuvablesNbre noms ! Voir le log.\n";
-
 
194
 
-
 
195
			$logContenu = implode(", \n", $introuvables);
-
 
196
			$logFichier = realpath(dirname(__FILE__)).'/log/famille_introuvable.log';
-
 
197
			echo $logFichier."\n";
-
 
198
			file_put_contents($logFichier, $logContenu);
201
		$this->creerFichierLog($msg, $introuvables, 'famille_introuvable');
199
		}
202
 
200
		$this->remplirChpFamille($noms);
203
		$this->remplirChpFamille($noms);
201
	}
204
	}
202
 
205
 
203
	private function preparerTablePrChpFamille() {
206
	private function preparerTablePrChpFamille() {
204
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'famille' ";
207
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'famille' ";
205
		$resultat = $this->getBdd()->recuperer($requete);
208
		$resultat = $this->getBdd()->recuperer($requete);
206
		if ($resultat === false) {
209
		if ($resultat === false) {
207
			$requete = 	"ALTER TABLE {$this->table} ".
210
			$requete = 	"ALTER TABLE {$this->table} ".
208
				'ADD famille VARCHAR(255) '.
211
				'ADD famille VARCHAR(255) '.
209
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
212
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
210
			$this->getBdd()->requeter($requete);
213
			$this->getBdd()->requeter($requete);
211
		}
214
		}
212
	}
215
	}
213
 
216
 
214
	private function recupererTuplesPrChpFamille() {
217
	private function recupererTuplesPrChpFamille() {
215
		$requete = 'SELECT num_nom, num_nom_retenu, num_tax_sup, rang, nom_sci '.
218
		$requete = 'SELECT num_nom, num_nom_retenu, num_tax_sup, rang, nom_sci '.
216
				"FROM {$this->table} ".
219
				"FROM {$this->table} ".
217
				"WHERE rang >= 180 ".
220
				"WHERE rang >= 180 ".
218
				"ORDER BY rang ASC, num_tax_sup ASC, num_nom_retenu DESC ";
221
				"ORDER BY rang ASC, num_tax_sup ASC, num_nom_retenu DESC ";
219
		$resultat = $this->getBdd()->recupererTous($requete);
222
		$resultat = $this->getBdd()->recupererTous($requete);
220
		return $resultat;
223
		return $resultat;
221
	}
224
	}
222
 
225
 
223
	private function remplirChpFamille($noms) {
226
	private function remplirChpFamille($noms) {
224
		foreach ($noms as $id => $famille) {
227
		foreach ($noms as $id => $famille) {
225
			$famille = $this->getBdd()->proteger($famille);
228
			$famille = $this->getBdd()->proteger($famille);
226
			$requete = "UPDATE {$this->table} SET famille = $famille WHERE num_nom = $id ";
229
			$requete = "UPDATE {$this->table} SET famille = $famille WHERE num_nom = $id ";
227
			$resultat = $this->getBdd()->requeter($requete);
230
			$resultat = $this->getBdd()->requeter($requete);
228
			if ($resultat === false) {
231
			if ($resultat === false) {
229
				throw new Exception("Erreur d'insertion pour le tuple $id");
232
				throw new Exception("Erreur d'insertion pour le tuple $id");
230
			}
233
			}
231
			$this->afficherAvancement("Insertion des noms de famille dans la base en cours");
234
			$this->afficherAvancement("Insertion des noms de famille dans la base en cours");
232
		}
235
		}
233
		echo "\n";
236
		echo "\n";
234
	}
237
	}
235
 
238
 
236
	private function genererDonneesTestMultiVersion() {
239
	private function genererDonneesTestMultiVersion() {
237
		$contenuSql = $this->recupererContenu(Config::get('chemins.structureSqlTest'));
240
		$contenuSql = $this->recupererContenu(Config::get('chemins.structureSqlTest'));
238
		$this->executerScripSql($contenuSql);
241
		$this->executerScripSql($contenuSql);
239
 
242
 
240
		$table = Config::get('tables.bdtfx');
243
		$table = Config::get('tables.bdtfx');
241
		$tableTest = Config::get('tables.bdtfxTest');
244
		$tableTest = Config::get('tables.bdtfxTest');
242
		$requete = "INSERT INTO $tableTest SELECT * FROM $table";
245
		$requete = "INSERT INTO $tableTest SELECT * FROM $table";
243
		$this->getBdd()->requeter($requete);
246
		$this->getBdd()->requeter($requete);
244
	}
247
	}
245
 
248
 
246
	private function supprimerDonneesTestMultiVersion() {
249
	private function supprimerDonneesTestMultiVersion() {
247
		$tableMeta = Config::get('tables.bdtfxMeta');
250
		$tableMeta = Config::get('tables.bdtfxMeta');
248
		$requete = "DELETE FROM $tableMeta WHERE guid = 'urn:lsid:tela-botanica.org:bdtfx:1.02'";
251
		$requete = "DELETE FROM $tableMeta WHERE guid = 'urn:lsid:tela-botanica.org:bdtfx:1.02'";
249
		$this->getBdd()->requeter($requete);
252
		$this->getBdd()->requeter($requete);
250
 
253
 
251
		$tableTest = Config::get('tables.bdtfxTest');
254
		$tableTest = Config::get('tables.bdtfxTest');
252
		$requete = "DROP TABLE IF EXISTS $tableTest";
255
		$requete = "DROP TABLE IF EXISTS $tableTest";
253
		$this->getBdd()->requeter($requete);
256
		$this->getBdd()->requeter($requete);
254
	}
257
	}
255
 
258
 
256
	private function supprimerTous() {
259
	private function supprimerTous() {
257
		$requete = "DROP TABLE IF EXISTS bdtfx_meta, bdtfx_v1_01, bdtfx_v1_02";
260
		$requete = "DROP TABLE IF EXISTS bdtfx_meta, bdtfx_v1_01, bdtfx_v1_02";
258
		$this->getBdd()->requeter($requete);
261
		$this->getBdd()->requeter($requete);
259
	}
262
	}
-
 
263
 
-
 
264
	private function creerFichierLog($message, $lignes, $nomFichier) {
-
 
265
		$lignesNbre = count($lignes);
-
 
266
		if ($lignesNbre != 0) {
-
 
267
			echo "$message. Voir le log de $lignesNbre lignes :\n";
-
 
268
 
-
 
269
			$logContenu = implode(", \n", $lignes);
-
 
270
			$logFichier = realpath(dirname(__FILE__))."/log/$nomFichier.log";
-
 
271
			echo $logFichier."\n";
-
 
272
					file_put_contents($logFichier, $logContenu);
-
 
273
		}
-
 
274
	}
260
}
275
}
261
?>
276
?>