Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev 636 Rev 637
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 bdtxa -a chargerTous
5
 * /opt/lampp/bin/php cli.php bdtxa -a chargerTous
6
 *
6
 *
7
 * @category	php 5.2
7
 * @category	php 5.2
8
 * @package		eFlore/Scripts
8
 * @package		eFlore/Scripts
9
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
10
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
11
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
11
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
12
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
12
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
13
 * @version		$Id$
13
 * @version		$Id$
14
 */
14
 */
15
class Bdtxa extends EfloreScript {
15
class Bdtxa extends EfloreScript {
16
 
16
 
17
	private $table = null;
17
	private $table = null;
18
	private $pasInsertion = 1000;
18
	private $pasInsertion = 1000;
19
	private $departInsertion = 0;
19
	private $departInsertion = 0;
20
 
20
 
21
	protected $parametres_autorises = array(
21
	protected $parametres_autorises = array(
22
		'-t' => array(false, false, 'Permet de tester le script sur un jeu réduit de données (indiquer le nombre de lignes).'));
22
		'-t' => array(false, false, 'Permet de tester le script sur un jeu réduit de données (indiquer le nombre de lignes).'));
23
 
23
 
24
	public function executer() {
24
	public function executer() {
25
		try {
25
		try {
26
			$this->initialiserProjet('bdtxa');
26
			$this->initialiserProjet('bdtxa');
27
 
27
 
28
			// Lancement de l'action demandée
28
			// Lancement de l'action demandée
29
			$cmd = $this->getParametre('a');
29
			$cmd = $this->getParametre('a');
30
			switch ($cmd) {
30
			switch ($cmd) {
31
				case 'chargerTous' :
31
				case 'chargerTous' :
32
					$this->chargerStructureSql();
32
					$this->chargerStructureSql();
33
					$this->chargerBdtxa();
33
					$this->chargerBdtxa();
34
					$this->genererChpNomSciHtml();
34
					$this->genererChpNomSciHtml();
35
					$this->genererChpFamille();
35
					$this->genererChpFamille();
36
					$this->genererChpNomComplet();
36
					$this->genererChpNomComplet();
37
					break;
37
					break;
38
				case 'chargerStructureSql' :
38
				case 'chargerStructureSql' :
39
					$this->chargerStructureSql();
39
					$this->chargerStructureSql();
40
					break;
40
					break;
41
				case 'chargerBdtxa' :
41
				case 'chargerBdtxa' :
42
					$this->chargerBdtxa();
42
					$this->chargerBdtxa();
43
					break;
43
					break;
44
				case 'genererNomSciHtml' :
44
				case 'genererChpNomSciHtml' :
45
					$this->genererChpNomSciHtml();
45
					$this->genererChpNomSciHtml();
46
					break;
46
					break;
-
 
47
				case 'genererChpNomComplet' :
-
 
48
					$this->initialiserGenerationChamps();
-
 
49
					$this->genererChpNomComplet();
-
 
50
					break;
47
				case 'genererChpFamille' :
51
				case 'genererChpFamille' :
48
					$this->genererChpFamille();
52
					$this->genererChpFamille();
49
					break;
53
					break;
50
				case 'supprimerTous' :
54
				case 'supprimerTous' :
51
					$this->supprimerTous();
55
					$this->supprimerTous();
52
					break;
56
					break;
53
				default :
57
				default :
54
					throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
58
					throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
55
			}
59
			}
56
		} catch (Exception $e) {
60
		} catch (Exception $e) {
57
			$this->traiterErreur($e->getMessage());
61
			$this->traiterErreur($e->getMessage());
58
		}
62
		}
59
	}
63
	}
60
 
64
 
61
	private function chargerBdtxa() {
65
	private function chargerBdtxa() {
62
		$chemin = Config::get('chemins.bdtxa');
66
		$chemin = Config::get('chemins.bdtxa');
63
		$table = Config::get('tables.bdtxa');
67
		$table = Config::get('tables.bdtxa');
64
		$requete = "LOAD DATA INFILE '$chemin' ".
68
		$requete = "LOAD DATA INFILE '$chemin' ".
65
				"REPLACE INTO TABLE $table ".
69
				"REPLACE INTO TABLE $table ".
66
				'CHARACTER SET utf8 '.
70
				'CHARACTER SET utf8 '.
67
				'FIELDS '.
71
				'FIELDS '.
68
				"	TERMINATED BY '\t' ".
72
				"	TERMINATED BY '\t' ".
69
				"	ENCLOSED BY '' ".
73
				"	ENCLOSED BY '' ".
70
				"	ESCAPED BY '\\\' ".
74
				"	ESCAPED BY '\\\' ".
71
				'IGNORE 1 LINES';
75
				'IGNORE 1 LINES';
72
		$this->getBdd()->requeter($requete);
76
		$this->getBdd()->requeter($requete);
73
	}
77
	}
74
 
78
 
75
	private function genererChpNomSciHtml() {
79
	private function genererChpNomSciHtml() {
76
		$this->initialiserGenerationChamps();
80
		$this->initialiserGenerationChamps();
77
		$this->preparerTablePrChpNomSciHtml();
81
		$this->preparerTablePrChpNomSciHtml();
78
		$generateur = new GenerateurNomSciHtml();
82
		$generateur = new GenerateurNomSciHtml();
79
		$nbreTotal = $this->recupererNbTotalTuples();
83
		$nbreTotal = $this->recupererNbTotalTuples();
80
		$this->departInsertion = 0;
84
		$this->departInsertion = 0;
81
		while ($this->departInsertion < $nbreTotal) {
85
		while ($this->departInsertion < $nbreTotal) {
82
			$resultat = $this->recupererTuplesPrChpNomSciHtml();
86
			$resultat = $this->recupererTuplesPrChpNomSciHtml();
83
			$nomsSciEnHtml = $generateur->generer($resultat);
87
			$nomsSciEnHtml = $generateur->generer($resultat);
84
			$this->remplirChpNomSciHtm($nomsSciEnHtml);
88
			$this->remplirChpNomSciHtm($nomsSciEnHtml);
85
			$this->departInsertion += $this->pasInsertion;
89
			$this->departInsertion += $this->pasInsertion;
86
			$this->afficherAvancement("Insertion des noms scientifique au format HTML dans la base par paquet de {$this->pasInsertion} en cours");
90
			$this->afficherAvancement("Insertion des noms scientifique au format HTML dans la base par paquet de {$this->pasInsertion} en cours");
87
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
91
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
88
		}
92
		}
89
		echo "\n";
93
		echo "\n";
90
	}
94
	}
91
 
95
 
92
	private function initialiserGenerationChamps() {
96
	private function initialiserGenerationChamps() {
93
		$this->table = Config::get('tables.bdtxa');
97
		$this->table = Config::get('tables.bdtxa');
94
	}
98
	}
95
 
99
 
96
	private function preparerTablePrChpNomSciHtml() {
100
	private function preparerTablePrChpNomSciHtml() {
97
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' ";
101
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_sci_html' ";
98
		$resultat = $this->getBdd()->recuperer($requete);
102
		$resultat = $this->getBdd()->recuperer($requete);
99
		if ($resultat === false) {
103
		if ($resultat === false) {
100
			$requete = 	"ALTER TABLE {$this->table} ".
104
			$requete = 	"ALTER TABLE {$this->table} ".
101
					'ADD nom_sci_html VARCHAR( 500 ) '.
105
					'ADD nom_sci_html VARCHAR( 500 ) '.
102
					'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
106
					'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
103
			$this->getBdd()->requeter($requete);
107
			$this->getBdd()->requeter($requete);
104
		}
108
		}
105
	}
109
	}
106
 
110
 
107
	private function recupererNbTotalTuples(){
111
	private function recupererNbTotalTuples(){
108
		$requete = "SELECT count(*) AS nb FROM {$this->table} ";
112
		$requete = "SELECT count(*) AS nb FROM {$this->table} ";
109
		$resultat = $this->getBdd()->recuperer($requete);
113
		$resultat = $this->getBdd()->recuperer($requete);
110
		return $resultat['nb'];
114
		return $resultat['nb'];
111
	}
115
	}
112
 
116
 
113
	private function recupererTuplesPrChpNomSciHtml() {
117
	private function recupererTuplesPrChpNomSciHtml() {
114
		$requete = 'SELECT 	num_nom, rang, nom_supra_generique, genre, epithete_infra_generique, '.
118
		$requete = 'SELECT 	num_nom, rang, nom_supra_generique, genre, epithete_infra_generique, '.
115
				'	epithete_sp, type_epithete, epithete_infra_sp,cultivar_groupe, '.
119
				'	epithete_sp, type_epithete, epithete_infra_sp,cultivar_groupe, '.
116
				'	nom_commercial, cultivar '.
120
				'	nom_commercial, cultivar '.
117
				"FROM {$this->table} ".
121
				"FROM {$this->table} ".
118
				"LIMIT {$this->departInsertion},{$this->pasInsertion} ";
122
				"LIMIT {$this->departInsertion},{$this->pasInsertion} ";
119
		$resultat = $this->getBdd()->recupererTous($requete);
123
		$resultat = $this->getBdd()->recupererTous($requete);
120
		return $resultat;
124
		return $resultat;
121
	}
125
	}
122
 
126
 
123
	private function remplirChpNomSciHtm($nomsSciHtm) {
127
	private function remplirChpNomSciHtm($nomsSciHtm) {
124
		foreach ($nomsSciHtm as $id => $html) {
128
		foreach ($nomsSciHtm as $id => $html) {
125
			$html = $this->getBdd()->proteger($html);
129
			$html = $this->getBdd()->proteger($html);
126
			$requete = "UPDATE {$this->table} SET nom_sci_html = $html WHERE num_nom = $id ";
130
			$requete = "UPDATE {$this->table} SET nom_sci_html = $html WHERE num_nom = $id ";
127
			$resultat = $this->getBdd()->requeter($requete);
131
			$resultat = $this->getBdd()->requeter($requete);
128
			if ($resultat === false) {
132
			if ($resultat === false) {
129
				throw new Exception("Erreur d'insertion pour le tuple $id");
133
				throw new Exception("Erreur d'insertion pour le tuple $id");
130
			}
134
			}
131
		}
135
		}
132
	}
136
	}
133
	
137
	
134
	private function genererChpNomComplet() {
138
	private function genererChpNomComplet() {
135
		$this->preparerTablePrChpNomComplet();
139
		$this->preparerTablePrChpNomComplet();
136
		$this->remplirChpNomComplet();
140
		$this->remplirChpNomComplet();
137
	}
141
	}
138
	
142
	
139
	private function preparerTablePrChpNomComplet() {
143
	private function preparerTablePrChpNomComplet() {
140
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_complet' ";
144
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'nom_complet' ";
141
		$resultat = $this->getBdd()->recuperer($requete);
145
		$resultat = $this->getBdd()->recuperer($requete);
142
		if ($resultat === false) {
146
		if ($resultat === false) {
143
			$requete = 	"ALTER TABLE {$this->table} ".
147
			$requete = 	"ALTER TABLE {$this->table} ".
144
						'ADD nom_complet VARCHAR( 500 ) '.
148
						'ADD nom_complet VARCHAR( 500 ) '.
145
						'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
149
						'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
146
			$this->getBdd()->requeter($requete);
150
			$this->getBdd()->requeter($requete);
147
		}
151
		}
148
	}
152
	}
149
	
153
	
150
	private function remplirChpNomComplet() {
154
	private function remplirChpNomComplet() {
151
		$this->afficherAvancement("Attribution du champ nom complet au taxons");
155
		$this->afficherAvancement("Attribution du champ nom complet au taxons");
152
		$requete = "UPDATE {$this->table} SET nom_complet = CONCAT(nom_sci,' ',auteur)";
156
		$requete = "UPDATE {$this->table} SET nom_complet = CONCAT(nom_sci,' ',auteur)";
153
		$resultat = $this->getBdd()->requeter($requete);
157
		$resultat = $this->getBdd()->requeter($requete);
154
		if ($resultat === false) {
158
		if ($resultat === false) {
155
			throw new Exception("Erreur de génération du champ nom complet");
159
			throw new Exception("Erreur de génération du champ nom complet");
156
		}
160
		}
157
	}
161
	}
158
 
162
 
159
	private function genererChpFamille() {
163
	private function genererChpFamille() {
160
		$this->initialiserGenerationChamps();
164
		$this->initialiserGenerationChamps();
161
		$this->preparerTablePrChpFamille();
165
		$this->preparerTablePrChpFamille();
162
		$resultats = $this->recupererTuplesPrChpFamille();
166
		$resultats = $this->recupererTuplesPrChpFamille();
163
		$noms = array();
167
		$noms = array();
164
		$introuvables = array();
168
		$introuvables = array();
165
		$introuvablesSyno = array();
169
		$introuvablesSyno = array();
166
		foreach ($resultats as $id => $nom) {
170
		foreach ($resultats as $id => $nom) {
167
			$nn = $nom['num_nom'];
171
			$nn = $nom['num_nom'];
168
			$nnr = $nom['num_nom_retenu'];
172
			$nnr = $nom['num_nom_retenu'];
169
			$nts = $nom['num_tax_sup'];
173
			$nts = $nom['num_tax_sup'];
170
			$rg = $nom['rang'];
174
			$rg = $nom['rang'];
171
			if ($nnr != '') {
175
			if ($nnr != '') {
172
				if ($rg == '180') {
176
				if ($rg == '180') {
173
					$noms[$nn] = $nom['nom_sci'];
177
					$noms[$nn] = $nom['nom_sci'];
174
				} else {
178
				} else {
175
					if ($nn == $nnr) {// nom retenu
179
					if ($nn == $nnr) {// nom retenu
176
						if (isset($noms[$nts])) {
180
						if (isset($noms[$nts])) {
177
							$noms[$nn] = $noms[$nts];
181
							$noms[$nn] = $noms[$nts];
178
						} else {
182
						} else {
179
							$introuvables[] = $nn;
183
							$introuvables[] = $nn;
180
						}
184
						}
181
					} else {// nom synonyme
185
					} else {// nom synonyme
182
						if (isset($noms[$nnr])) {
186
						if (isset($noms[$nnr])) {
183
							$noms[$nn] = $noms[$nnr];
187
							$noms[$nn] = $noms[$nnr];
184
						} else {
188
						} else {
185
							$introuvablesSyno[] = $nom;
189
							$introuvablesSyno[] = $nom;
186
						}
190
						}
187
					}
191
					}
188
				}
192
				}
189
			}
193
			}
190
			unset($resultats[$id]);
194
			unset($resultats[$id]);
191
			$this->afficherAvancement("Attribution de leur famille aux noms en cours");
195
			$this->afficherAvancement("Attribution de leur famille aux noms en cours");
192
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
196
			if ($this->stopperLaBoucle($this->getParametre('t'))) break;
193
		}
197
		}
194
		echo "\n";
198
		echo "\n";
195
 
199
 
196
		foreach ($introuvablesSyno as $id => $nom) {
200
		foreach ($introuvablesSyno as $id => $nom) {
197
			$nn = $nom['num_nom'];
201
			$nn = $nom['num_nom'];
198
			$nnr = $nom['num_nom_retenu'];
202
			$nnr = $nom['num_nom_retenu'];
199
			if (isset($noms[$nnr])) {
203
			if (isset($noms[$nnr])) {
200
				$noms[$nn] = $noms[$nnr];
204
				$noms[$nn] = $noms[$nnr];
201
			} else {
205
			} else {
202
				$introuvables[] = $nn;
206
				$introuvables[] = $nn;
203
			}
207
			}
204
			unset($introuvablesSyno[$id]);
208
			unset($introuvablesSyno[$id]);
205
			$this->afficherAvancement("Attribution de leur famille aux synonymes en cours");
209
			$this->afficherAvancement("Attribution de leur famille aux synonymes en cours");
206
		}
210
		}
207
		echo "\n";
211
		echo "\n";
208
 
212
 
209
		if (count($introuvables) != 0) {
213
		if (count($introuvables) != 0) {
210
			$introuvablesNbre = count($introuvables);
214
			$introuvablesNbre = count($introuvables);
211
			echo "Famille introuvable pour $introuvablesNbre noms ! Voir le log.\n";
215
			echo "Famille introuvable pour $introuvablesNbre noms ! Voir le log.\n";
212
 
216
 
213
			$logContenu = implode(", \n", $introuvables);
217
			$logContenu = implode(", \n", $introuvables);
214
			$logFichier = realpath(dirname(__FILE__)).'/log/famille_introuvable.log';
218
			$logFichier = realpath(dirname(__FILE__)).'/log/famille_introuvable.log';
215
			echo $logFichier."\n";
219
			echo $logFichier."\n";
216
			file_put_contents($logFichier, $logContenu);
220
			file_put_contents($logFichier, $logContenu);
217
		}
221
		}
218
		$this->remplirChpFamille($noms);
222
		$this->remplirChpFamille($noms);
219
	}
223
	}
220
 
224
 
221
	private function preparerTablePrChpFamille() {
225
	private function preparerTablePrChpFamille() {
222
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'famille' ";
226
		$requete = "SHOW COLUMNS FROM {$this->table} LIKE 'famille' ";
223
		$resultat = $this->getBdd()->recuperer($requete);
227
		$resultat = $this->getBdd()->recuperer($requete);
224
		if ($resultat === false) {
228
		if ($resultat === false) {
225
			$requete = 	"ALTER TABLE {$this->table} ".
229
			$requete = 	"ALTER TABLE {$this->table} ".
226
				'ADD famille VARCHAR(255) '.
230
				'ADD famille VARCHAR(255) '.
227
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
231
				'CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ';
228
			$this->getBdd()->requeter($requete);
232
			$this->getBdd()->requeter($requete);
229
		}
233
		}
230
	}
234
	}
231
 
235
 
232
	private function recupererTuplesPrChpFamille() {
236
	private function recupererTuplesPrChpFamille() {
233
		$requete = 'SELECT num_nom, num_nom_retenu, num_tax_sup, rang, nom_sci '.
237
		$requete = 'SELECT num_nom, num_nom_retenu, num_tax_sup, rang, nom_sci '.
234
			"FROM {$this->table} ".
238
			"FROM {$this->table} ".
235
			"WHERE rang >= 180 ".
239
			"WHERE rang >= 180 ".
236
			"ORDER BY rang ASC, num_tax_sup ASC, num_nom_retenu DESC ";
240
			"ORDER BY rang ASC, num_tax_sup ASC, num_nom_retenu DESC ";
237
		$resultat = $this->getBdd()->recupererTous($requete);
241
		$resultat = $this->getBdd()->recupererTous($requete);
238
		return $resultat;
242
		return $resultat;
239
	}
243
	}
240
 
244
 
241
	private function remplirChpFamille($noms) {
245
	private function remplirChpFamille($noms) {
242
		foreach ($noms as $id => $famille) {
246
		foreach ($noms as $id => $famille) {
243
			$famille = $this->getBdd()->proteger($famille);
247
			$famille = $this->getBdd()->proteger($famille);
244
			$requete = "UPDATE {$this->table} SET famille = $famille WHERE num_nom = $id ";
248
			$requete = "UPDATE {$this->table} SET famille = $famille WHERE num_nom = $id ";
245
			$resultat = $this->getBdd()->requeter($requete);
249
			$resultat = $this->getBdd()->requeter($requete);
246
			if ($resultat === false) {
250
			if ($resultat === false) {
247
				throw new Exception("Erreur d'insertion pour le tuple $id");
251
				throw new Exception("Erreur d'insertion pour le tuple $id");
248
			}
252
			}
249
			$this->afficherAvancement("Insertion des noms de famille dans la base en cours");
253
			$this->afficherAvancement("Insertion des noms de famille dans la base en cours");
250
		}
254
		}
251
		echo "\n";
255
		echo "\n";
252
	}
256
	}
253
	private function genererDonneesTestMultiVersion() {
257
	private function genererDonneesTestMultiVersion() {
254
		$contenuSql = $this->recupererContenu(Config::get('chemins.structureSqlTest'));
258
		$contenuSql = $this->recupererContenu(Config::get('chemins.structureSqlTest'));
255
		$this->executerScripSql($contenuSql);
259
		$this->executerScripSql($contenuSql);
256
	
260
	
257
		$table = Config::get('tables.bdtxa');
261
		$table = Config::get('tables.bdtxa');
258
		$tableTest = Config::get('tables.bdtxaTest');
262
		$tableTest = Config::get('tables.bdtxaTest');
259
		$requete = "INSERT INTO $tableTest SELECT * FROM $table";
263
		$requete = "INSERT INTO $tableTest SELECT * FROM $table";
260
		$this->getBdd()->requeter($requete);
264
		$this->getBdd()->requeter($requete);
261
	}
265
	}
262
	
266
	
263
	private function supprimerDonneesTestMultiVersion() {
267
	private function supprimerDonneesTestMultiVersion() {
264
		$tableMeta = Config::get('tables.bdtxaMeta');
268
		$tableMeta = Config::get('tables.bdtxaMeta');
265
		$requete = "DELETE FROM $tableMeta WHERE guid = 'urn:lsid:tela-botanica.org:bdtfx:1.02'";
269
		$requete = "DELETE FROM $tableMeta WHERE guid = 'urn:lsid:tela-botanica.org:bdtfx:1.02'";
266
		$this->getBdd()->requeter($requete);
270
		$this->getBdd()->requeter($requete);
267
	
271
	
268
		$tableTest = Config::get('tables.bdtxaTest');
272
		$tableTest = Config::get('tables.bdtxaTest');
269
		$requete = "DROP TABLE IF EXISTS $tableTest";
273
		$requete = "DROP TABLE IF EXISTS $tableTest";
270
		$this->getBdd()->requeter($requete);
274
		$this->getBdd()->requeter($requete);
271
	}
275
	}
272
	private function supprimerTous() {
276
	private function supprimerTous() {
273
		$requete = "DROP TABLE IF EXISTS bdtxa_meta, bdtxa_v0_01";
277
		$requete = "DROP TABLE IF EXISTS bdtxa_meta, bdtxa_v0_01";
274
		$this->getBdd()->requeter($requete);
278
		$this->getBdd()->requeter($requete);
275
	}
279
	}
276
}
280
}
277
?>
281
?>