Subversion Repositories eFlore/Applications.cel

Rev

Rev 2106 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2094 mathias 1
<?php
2
class Maintenance extends Script {
3
 
4
	protected $bdd;
5
 
6
	public function __construct($script_nom, $parametres_cli) {
7
		parent::__construct($script_nom, $parametres_cli);
8
		$this->bdd = new Bdd();
9
	}
10
 
11
	public function executer() {
12
		$cmd = $this->getParametre('a');
13
		try {
14
			switch ($cmd) {
15
				case 'regenererMotsClesTexteObs' :
16
					$this->regenererMotsClesTexteObs();
17
					break;
18
				case 'regenererMotsClesTexteImages' :
19
					$this->regenererMotsClesTexteImages();
20
					break;
2104 mathias 21
				case 'regenererMotsClesTexteObsTout' :
22
					$this->regenererMotsClesTexteObs(true);
23
					break;
24
				case 'regenererMotsClesTexteImagesTout' :
25
					$this->regenererMotsClesTexteImages(true);
26
					break;
2095 mathias 27
				case 'viderMotsClesTexteImagesSansMotsCles' :
28
					$this->viderMotsClesTexteImagesSansMotsCles();
29
					break;
30
				case 'viderMotsClesTexteObsSansMotsCles' :
31
					$this->viderMotsClesTexteObsSansMotsCles();
32
					break;
2104 mathias 33
				case 'reparerLiaisonsOublieesObs' :
34
					$this->reparerLiaisonsOublieesObs();
35
					break;
36
				case 'reparerLiaisonsOublieesImages' :
37
					$this->reparerLiaisonsOublieesImages();
38
					break;
2105 mathias 39
				case 'regenererChampsTailleImage' :
40
					$this->regenererChampsTailleImage();
41
					break;
2094 mathias 42
				default :
43
					$msg = "Erreur : la commande '$cmd' n'existe pas!\n".
44
						"Commandes existantes : regenererMotsClesTexteImages, regenererMotsClesTexteObs";
45
					throw new Exception($msg);
46
			}
47
		} catch (Exception $e) {
48
			$this->traiterErreur($e->getMessage());
49
		}
50
	}
51
 
52
	// Régénère le champ "mots_cles_texte" pour toutes les images ayant des mots clés mais ayant ce champ
53
	// vide, suite à une erreur
2104 mathias 54
	protected function regenererMotsClesTexteImages($tout = false) {
55
		$req = "SELECT id_image FROM cel_images WHERE ".
56
				"id_image IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
57
		if(!$tout) {
58
			$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
59
		}
2094 mathias 60
		$res = $this->bdd->recupererTous($req);
61
		echo count($res) . " images trouvées\n";
62
		foreach ($res as $image) {
63
			$req = "UPDATE cel_images SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_images cm "
64
				. "INNER JOIN cel_mots_cles_images_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_image'] . "') "
65
				. "WHERE id_image = '" . $image['id_image'] . "'";
66
			$this->bdd->requeter($req);
67
		}
68
	}
69
 
70
	// Régénère le champ "mots_cles_texte" pour toutes les observations ayant des mots clés mais ayant ce champ
71
	// vide, suite à une erreur
2104 mathias 72
	protected function regenererMotsClesTexteObs($tout = false) {
73
		$req = "SELECT id_observation FROM cel_obs WHERE ".
74
				"id_observation IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
75
		if(!$tout) {
76
			$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
77
		}
2094 mathias 78
		$res = $this->bdd->recupererTous($req);
79
		echo count($res) . " observations trouvées\n";
80
		foreach ($res as $image) {
81
			$req = "UPDATE cel_obs SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_obs cm "
82
			. "INNER JOIN cel_mots_cles_obs_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_observation'] . "') "
83
				. "WHERE id_observation = '" . $image['id_observation'] . "'";
84
			$this->bdd->requeter($req);
85
		}
86
	}
2095 mathias 87
 
88
	// Vide le champ "mots_cles_texte" pour toutes les images n'ayant aucun mot clé
89
	protected function viderMotsClesTexteImagesSansMotsCles() {
90
		$req = "UPDATE cel_images SET mots_cles_texte = NULL WHERE id_image NOT IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
91
		$res = $this->bdd->requeter($req);
92
		echo "$res images mises à jour\n";
93
	}
94
 
95
	// Vide le champ "mots_cles_texte" pour toutes les obs n'ayant aucun mot clé
96
	protected function viderMotsClesTexteObsSansMotsCles() {
97
		$req = "UPDATE cel_obs SET mots_cles_texte = NULL WHERE id_observation NOT IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
98
		$res = $this->bdd->requeter($req);
99
		echo "$res observations mises à jour\n";
100
	}
2104 mathias 101
 
2105 mathias 102
	protected function regenererChampsTailleImage() {
103
		$req = "SELECT id_image FROM cel_images WHERE hauteur = 0 OR largeur = 0";
104
		$res = $this->bdd->recupererTous($req);
105
 
106
		echo count($res)." images concernees \n";
107
		echo "Début du traitement \n";
108
		$images_maj = 0;
109
		$image_meta_ratees = 0;
110
		$images_inexistantes = 0;
111
 
112
		foreach($res as $image) {
113
			$chemin = $this->getCheminImage($image['id_image']);
114
			if(file_exists($chemin)) {
115
				list($largeur, $hauteur) = @getimagesize($chemin);
116
				if(is_numeric($largeur) && is_numeric($hauteur)) {
117
					$req_maj = "UPDATE cel_images SET hauteur = '".$hauteur."', largeur = '".$largeur."' ".
118
					           "WHERE id_image = '".$image['id_image']."'";
119
					$maj_taille_image = $this->bdd->requeter($req_maj);
120
					if($maj_taille_image) {
121
						$images_maj++;
122
					}
123
				} else {
124
					$image_meta_ratees++;
125
				}
126
			} else {
127
				$images_inexistantes++;
128
			}
129
			$this->afficherAvancement("\tImages traitées : ", 1);
130
		}
131
		echo "\n";
132
		echo "Fin de la régénération des tailles des images à partir des metadonnées \n";
133
		echo $images_maj." images ont vu leur infos de taille régénérées \n";
134
		echo $image_meta_ratees." images ont raté l'extraction de metadonnées \n";
135
		echo $images_inexistantes." images n'existent pas en tant que fichier \n";
136
	}
137
 
138
	private function getCheminImage($id) {
139
		$chemin_base = Config::get('dossierImages');
140
 
141
		$id = sprintf('%09s', $id);
142
		$id = wordwrap($id, 3 , '_', true);
143
 
144
		list($dossierNiveau1, $dossierNiveau2) = explode('_', $id);
145
 
2107 aurelien 146
		$chemin = $chemin_base.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/O/'.$id.'_O.jpg';
2105 mathias 147
 
148
		return $chemin;
149
	}
150
 
2104 mathias 151
	protected function reparerLiaisonsOublieesObs() {
152
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
153
		// dans la table de liaison il est souvent vide
154
		$requete_liaisons = "SELECT com.id_observation, com.id_mot_cle_obs, co.ce_utilisateur ".
155
					"FROM `cel_obs_mots_cles` com INNER JOIN cel_obs co ON co.id_observation = com.id_observation ";
156
 
157
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
158
		$nb_liaisons_originales = count($liaisons);
159
 
160
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
161
		$requete_mots_cles = "SELECT id_mot_cle_obs, id_utilisateur, mot_cle FROM cel_mots_cles_obs ";
162
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
163
 
164
		$anciens_mots_cles_fmt = array();
165
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
166
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
167
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
168
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
169
			}
170
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_obs']] = $ancien_mot_cle;
171
		}
172
 
173
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
174
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_obs";
175
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
176
 
177
		$nouveau_mots_cles_fmt = array();
178
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
179
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
180
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
181
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
182
			}
183
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle;
184
		}
185
 
186
		$anciens_mot_cles_pas_trouves = 0;
187
		$nouveaux_mot_cles_pas_trouves = 0;
188
		$utilisateurs_pas_trouves = 0;
189
		$valeurs_a_inserer = array();
190
 
191
		$ids_obs = array();
192
 
193
		foreach($liaisons as &$liaison) {
194
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
195
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_obs'];
196
 
197
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
198
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
199
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
200
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
201
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
202
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
203
 
204
							$valeurs_a_inserer[] = array(
205
													'id_element_lie' => $liaison['id_observation'],
206
													'id_mot_cle' => $nouvel_id_mot_cle,
207
													'ancienne_liaison' => $liaison
208
							);
209
							$ids_obs[] = $liaison['id_observation'];
210
						} else {
211
							$nouveaux_mot_cles_pas_trouves++;
212
						}
213
					} else {
214
 
215
					}
216
 
217
				} else {
218
					$anciens_mot_cles_pas_trouves++;
219
				}
220
			} else {
221
				$utilisateurs_pas_trouves++;
222
			}
223
		}
224
 
225
		echo "Anciennes liaisons ".$nb_liaisons_originales." \n";
226
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
227
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
228
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
229
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
230
 
231
		$tranches = array_chunk($valeurs_a_inserer, 800);
232
 
233
		foreach($tranches as $tranche) {
234
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_obs_liaison (id_element_lie, id_mot_cle) ".
235
					                      "VALUES ";
236
			foreach($tranche as $l) {
237
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
238
			}
239
			$requete_insertion = rtrim($requete_insertion, ',');
240
			$insertion = $this->bdd->requeter($requete_insertion);
241
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
242
		}
243
		echo "\n";
244
	}
245
 
246
	private function reparerLiaisonsOublieesImages() {
247
		// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
248
		// dans la table de liaison il est souvent vide
249
		$requete_liaisons = "SELECT cim.id_image, cim.id_mot_cle_image, ci.ce_utilisateur ".
250
							"FROM cel_images_mots_cles cim INNER JOIN cel_images ci ON ci.id_image = cim.id_image ";
251
 
252
		$liaisons = $this->bdd->recupererTous($requete_liaisons);
253
 
254
		// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
255
		$requete_mots_cles = "SELECT id_mot_cle_image, id_utilisateur, mot_cle FROM cel_mots_cles_images ";
256
		$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
257
 
258
		$anciens_mots_cles_fmt = array();
259
		foreach($anciens_mots_cles as &$ancien_mot_cle) {
260
			$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
261
			if(!isset($anciens_mots_cles_fmt[$id_utilisateur_ancien])) {
262
				$anciens_mots_cles_fmt[$id_utilisateur_ancien] = array();
263
			}
264
			$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_image']] = $ancien_mot_cle;
265
		}
266
 
267
		// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
268
		$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_images";
269
		$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
270
 
271
		$nouveau_mots_cles_fmt = array();
272
		foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
273
			$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
274
			if(!isset($nouveau_mots_cles_fmt[$id_utilisateur_nouveau])) {
275
				$nouveau_mots_cles_fmt[$id_utilisateur_nouveau] = array();
276
			}
277
			$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle;
278
		}
279
 
280
		$anciens_mot_cles_pas_trouves = 0;
281
		$nouveaux_mot_cles_pas_trouves = 0;
282
		$utilisateurs_pas_trouves = 0;
283
		$valeurs_a_inserer = array();
284
 
285
		foreach($liaisons as &$liaison) {
286
			$id_utilisateur_liaison = $liaison['ce_utilisateur'];
287
			$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_image'];
288
 
289
			if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
290
				if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
291
					$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
292
					if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
293
						if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
294
							$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
295
 
296
							$valeurs_a_inserer[] = array(
297
															'id_element_lie' => $liaison['id_image'],
298
															'id_mot_cle' => $nouvel_id_mot_cle,
299
															'ancienne_liaison' => $liaison
300
							);
301
							$ids_imgs[] = $liaison['id_image'];
302
						} else {
303
							$nouveaux_mot_cles_pas_trouves++;
304
						}
305
					} else {
306
 
307
					}
308
 
309
				} else {
310
					$anciens_mot_cles_pas_trouves++;
311
				}
312
			} else {
313
				$utilisateurs_pas_trouves++;
314
			}
315
		}
316
 
317
		echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
318
		echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
319
		echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
320
		echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
321
 
322
		$tranches = array_chunk($valeurs_a_inserer, 800);
323
 
324
		foreach($tranches as $tranche) {
325
			$requete_insertion = "INSERT IGNORE INTO cel_mots_cles_images_liaison (id_element_lie, id_mot_cle) ".
326
					                      "VALUES ";
327
			foreach($tranche as $l) {
328
				$requete_insertion .= "('".$l['id_element_lie']."', '".$l['id_mot_cle']."'),";
329
			}
330
			$requete_insertion = rtrim($requete_insertion, ',');
331
			$insertion = $this->bdd->requeter($requete_insertion);
332
			$this->afficherAvancement("Liaisons insérées (par paquet de 800) ", 1);
333
		}
334
		echo "\n";
335
	}
2094 mathias 336
}
337
?>