Subversion Repositories eFlore/Applications.cel

Rev

Rev 1149 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1149 Rev 1160
Line 1... Line 1...
1
<?php
1
<?php
Line 2... Line 2...
2
 
2
 
3
class MigrationImages extends Cel {
3
class MigrationImages extends Cel {
4
 
4
	
5
	const bdd_cel_migration = 'cel';
5
	public static $bdd_cel_migration;
-
 
6
	public static $bdd_utilisateurs;
-
 
7
	
Line 6... Line 8...
6
	const bdd_utilisateurs = 'cel_old';
8
	const truncate = true; //Doit on vider les tables de destination ?
7
	
9
	
Line 8... Line 10...
8
	const separateur_champs_metadonnees = ';';
10
	const separateur_champs_metadonnees = ';';
Line 14... Line 16...
14
	* La clé est un md5 du message à afficher au démarrage de la boucle.
16
	* La clé est un md5 du message à afficher au démarrage de la boucle.
15
	* @var array
17
	* @var array
16
	*/
18
	*/
17
	private static $avancement = array();
19
	private static $avancement = array();
Line 18... Line 20...
18
	
20
	
Line 19... Line 21...
19
	const dry_run = true;
21
	const dry_run = false;
20
	
22
	
21
	private $tableau_utilisateurs = array();
23
	private $tableau_utilisateurs = array();
Line 111... Line 113...
111
	* @param string le message d'information.
113
	* @param string le message d'information.
112
	* @param int le nombre de départ à afficher.
114
	* @param int le nombre de départ à afficher.
113
	* @return void le message est affiché dans la console.
115
	* @return void le message est affiché dans la console.
114
	*/
116
	*/
115
	protected function afficherAvancement($message, $depart = 0) {
117
	protected function afficherAvancement($message, $depart = 0) {
116
	if (! isset(self::$avancement[$message])) {
118
		if (! isset(self::$avancement[$message])) {
117
	self::$avancement[$message] = $depart;
119
			self::$avancement[$message] = $depart;
118
	echo "$message : ";
120
			echo "$message : ";
119
		
121
				
120
	$actuel =& self::$avancement[$message];
122
			$actuel =& self::$avancement[$message];
121
	echo $actuel++;
123
			echo $actuel++;
122
	} else {
124
		} else {
123
	$actuel =& self::$avancement[$message];
125
			$actuel =& self::$avancement[$message];
124
			
126
				
125
		// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères)
127
			// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères)
126
		$passage = 0;
128
			$passage = 0;
127
		if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) {
129
			if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) {
128
		$passage = 1;
130
			$passage = 1;
129
	}
131
		}
130
			
132
				
131
		echo str_repeat(chr(8), (strlen((string) $actuel) - $passage));
133
			echo str_repeat(chr(8), (strlen((string) $actuel) - $passage));
132
		echo $actuel++;
134
			echo $actuel++;
133
	}
135
		}
134
	}
136
	}
Line 135... Line 137...
135
	
137
	
136
	/**
138
	/**
137
	 * Méthode appelée avec une requête de type GET.
139
	 * Méthode appelée avec une requête de type GET.
138
	 */
140
	 */
Line -... Line 141...
-
 
141
	public function getElement($params) {
-
 
142
		
-
 
143
		if(!isset($this->config['database_cel']['database_migration']) || $this->config['database_cel']['database_migration'] == '') {
-
 
144
			echo 'Attention la variable de configuration database_migration dans la section database_cel, contenant la base de données d\'arrivée, doit être remplie '."\n";
-
 
145
			exit;
-
 
146
		}
-
 
147
		
-
 
148
		if(!isset($this->config['database_ident']['database']) || $this->config['database_ident']['database'] == '') {
-
 
149
			echo 'Attention la variable de configuration database dans la section database_ident, contenant la base de données utilisateurs, doit être remplie '."\n";
-
 
150
			exit;
-
 
151
		}
-
 
152
		
-
 
153
		self::$bdd_cel_migration = $this->config['database_cel']['database_migration'];
139
	public function getElement($params) {
154
		self::$bdd_utilisateurs = $this->config['database_ident']['database'];
140
		
155
		
-
 
156
		$this->id_cle_metadonnees = array_merge($this->tableau_ids_tags_exif, $this->tableau_ids_tags_iptc);
-
 
157
 
-
 
158
		echo "--MIGRATION DES IMAGES --------------------------------------\n";
-
 
159
		//1. TEMPORAIRE : vider les tables de destinations
-
 
160
		if (self::truncate) {
-
 
161
			echo "-------------------------------------------------------------------\n\n";
-
 
162
			echo "  ETAPE 0. Vider les tables ... \n\n";
-
 
163
			echo "-------------------------------------------------------------------\n\n";
-
 
164
			$nouvellesTables = array('`cel_images`', '`cel_obs_images`');
-
 
165
			foreach ($nouvellesTables as $nomTable) {
-
 
166
				echo 'Vider la table '.$nomTable.'...';
-
 
167
				$requeteTruncate = 'TRUNCATE TABLE '.self::$bdd_cel_migration.'.'.$nomTable;
-
 
168
				$resultatTruncate = $this->executerRequete($requeteTruncate);
-
 
169
				echo "ok \n";
-
 
170
			}
-
 
171
				
-
 
172
			echo "\n---------------------------------------------------------------- OK\n\n";
-
 
173
		}
-
 
174
		
-
 
175
		echo "-------------------------------------------------------------------\n\n";
141
		$this->id_cle_metadonnees = array_merge($this->tableau_ids_tags_exif, $this->tableau_ids_tags_iptc);
176
		echo "  ETAPE 1. Paramétrage ... \n\n";
142
				
177
		echo "-------------------------------------------------------------------\n\n";
143
		$this->getUtilisateurs();
178
		$this->getUtilisateurs();
Line -... Line 179...
-
 
179
		$this->getMotsCles();
144
		$this->getMotsCles();
180
		$this->getObservations();
-
 
181
		
145
		$this->getObservations();
182
		echo "-------------------------------------------------------------------\n\n";
146
		
183
		echo "  ETAPE 2. Migration des images ... \n\n";
Line -... Line 184...
-
 
184
		echo "-------------------------------------------------------------------\n\n";
147
		echo '|| Migration des images ||'."\n";
185
		$this->migrerImages();
-
 
186
		echo "\n"."\n"."\n";
148
		//$this->migrerImages();
187
		
149
		echo "\n"."\n"."\n";
188
		echo "-------------------------------------------------------------------\n\n";
150
		
189
		echo "  ETAPE 3. migration des liaisons obs images ... \n\n";
Line 151... Line 190...
151
		echo '|| Migration des liaisons obs images ||'."\n";
190
		echo "-------------------------------------------------------------------\n\n";
-
 
191
		//$this->migrerLiaisonsObsImages();
-
 
192
		echo "\n"."\n"."\n";
Line 152... Line 193...
152
		$this->migrerLiaisonsObsImages();
193
	}
153
		echo "\n"."\n"."\n";
194
	
Line 154... Line 195...
154
	}
195
	private function getUtilisateurs() {
155
	
196
		echo "\n-------------------------------------------------------------------\n";
156
	private function getUtilisateurs() {
197
		echo "--SELECTION DES UTILISATEURS---------------------------------------\n\n";
Line -... Line 198...
-
 
198
		
-
 
199
		$requete_selection_utilisateurs = 'SELECT U_ID as id, U_MAIL as mail, U_NAME as nom, U_SURNAME as prenom, U_PASSWD as pass FROM '.self::$bdd_utilisateurs.'.annuaire_tela';
157
		
200
		$tableau_utilisateurs = $this->executerRequete($requete_selection_utilisateurs);
Line 158... Line 201...
158
		$requete_selection_utilisateurs = 'SELECT U_ID as id, U_MAIL as mail, U_NAME as nom, U_SURNAME as prenom FROM '.self::bdd_utilisateurs.'.annuaire_tela';
201
		
-
 
202
		foreach( $tableau_utilisateurs as &$utilisateur) {
-
 
203
			$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur;
Line 159... Line 204...
159
		$tableau_utilisateurs = $this->executerRequete($requete_selection_utilisateurs);
204
		}
160
		
205
		
Line 161... Line 206...
161
		foreach( $tableau_utilisateurs as &$utilisateur) {
206
		echo sizeof($this->tableau_utilisateurs)." utilisateurs sélectionnés";
162
			$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur;
207
		echo "\n-----------------------------------------------------------------OK\n";
163
		}
208
	}
-
 
209
	
-
 
210
	private function getMotsCles() {
-
 
211
		echo "\n-------------------------------------------------------------------\n";
-
 
212
		echo "--SELECTION DES MOTS-CLES -----------------------------------------\n\n";
164
		
213
		
Line 165... Line 214...
165
	}
214
		$requete_selection_mots_cles = 'SELECT cmc_id_proprietaire as id_utilisateur, cmc_id_mot_cle_utilisateur as id_mot_cle, cmc_mot_cle as mot_cle FROM cel_mots_cles_obs';
-
 
215
		$tableau_mots_cles = $this->executerRequete($requete_selection_mots_cles);
166
	
216
 
Line 167... Line 217...
167
	private function getMotsCles() {
217
		foreach( $tableau_mots_cles as &$mot_cle) {
168
		
218
			$this->tableau_mots_cles[$mot_cle['id_utilisateur']][$mot_cle['id_mot_cle']] = $mot_cle;
169
		$requete_selection_mots_cles = 'SELECT cmc_id_proprietaire as id_utilisateur, cmc_id_mot_cle_utilisateur as id_mot_cle, cmc_mot_cle as mot_cle FROM cel_mots_cles_images';
219
		}
Line 186... Line 236...
186
			$tableau_observations = $this->executerRequete($requete_selection_observations);
236
			$tableau_observations = $this->executerRequete($requete_selection_observations);
187
			foreach($tableau_observations as &$obs) {
237
			foreach($tableau_observations as &$obs) {
188
				$this->tableau_observations[$obs['identifiant']][$obs['ordre']] = $obs['id'];
238
				$this->tableau_observations[$obs['identifiant']][$obs['ordre']] = $obs['id'];
189
			}
239
			}
Line 190... Line 240...
190
			
240
			
191
			//$this->afficherAvancement('Selection des observations (par '.$pas.' )', $i);
-
 
192
			echo "\n obs : ".$i;
241
			$this->afficherAvancement('Selection des observations (par '.$pas.' )', $nbObs);
Line 193... Line -...
193
		}
-
 
194
		
242
		}
195
		
243
		
Line 196... Line 244...
196
		
244
		echo "\n\n";
197
	}
245
	}
198
		
246
		
Line 210... Line 258...
210
		
258
		
211
		$debut = 0;
259
		$debut = 0;
212
		$pas = 200; 
260
		$pas = 200; 
Line -... Line 261...
-
 
261
		$fin = 150000; 
-
 
262
		
-
 
263
		//Selectionner le nombre d'images
-
 
264
		$requeteNbImg = "SELECT COUNT(*) as nb FROM cel_images";
-
 
265
		$resultatNbImg = $this->executerRequete($requeteNbImg);
213
		$fin = 150000; 
266
		$fin = $resultatNbImg[0]['nb'];
214
		
267
		
215
		for ($i = $debut; $i <= $fin ; $i += $pas) {
268
		for ($i = $debut; $i <= $fin ; $i += $pas) {
Line 216... Line 269...
216
			$requete_selection_images = 'SELECT * FROM cel_images '.
269
			$requete_selection_images = 'SELECT * FROM cel_images '.
Line 217... Line 270...
217
											'ORDER BY ci_id_image ASC LIMIT '.$i.','.$pas;
270
											'ORDER BY ci_id_image ASC LIMIT '.$i.','.$pas;
218
											
271
											
219
			$images = $this->requeter($requete_selection_images);	
272
			$images = @$this->requeter($requete_selection_images);	
220
			
273
			
221
			$requete_insertion_images = 'INSERT INTO '.self::bdd_cel_migration.'.cel_images (';
274
			$requete_insertion_images = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_images (';
Line 242... Line 295...
242
				$migration_images = $this->executer($requete_insertion_images);
295
				$migration_images = $this->executer($requete_insertion_images);
Line 243... Line 296...
243
				
296
				
244
				if (!$migration_images) {
297
				if (!$migration_images) {
245
					echo 'la migration des images '.$i.' à '.($i+$nb_images_a_traiter).' a échoué '."\n";
298
					echo 'la migration des images '.$i.' à '.($i+$nb_images_a_traiter).' a échoué '."\n";
246
				} else {
299
				} else {
247
					echo 'migration des images '.$i.' à '.($i+$nb_images_a_traiter).' effectuée '."\n";
300
					$this->afficherAvancement('Migration des images (par '.$pas.' )', $fin);
248
				} 
301
				} 
Line 249... Line 302...
249
			}
302
			}
250
			
303
			
251
			if(count($images) < $pas) {
304
			if(count($images) < $pas) {
252
				echo 'Fin de la migration des images '."\n";
305
				echo "\n---------------------------------------------------------------- OK\n\n";
253
				return;
306
				return;
254
			}
307
			}
Line 255... Line 308...
255
		}
308
		}
256
	}
309
	}
257
	
310
	
258
	private function migrerLiaisonsObsImages() {
311
	private function migrerLiaisonsObsImages() {
Line -... Line 312...
-
 
312
		$debut = 0;
-
 
313
		$pas = 500; 
-
 
314
		$fin = 50000; 
-
 
315
		
-
 
316
		$liaisons_obs_inexistantes = 0;
-
 
317
		
-
 
318
		//Selectionner le nombre de liaisons
259
		$debut = 0;
319
		$requeteNbImgObs = "SELECT COUNT(*) as nb FROM cel_obs_images";
-
 
320
		$resultatNbImgObs = $this->executerRequete($requeteNbImgObs);
-
 
321
		$fin = $resultatNbImgObs[0]['nb'];
-
 
322
		
-
 
323
		for ($i = $debut; $i <= $fin ; $i += $pas) {
-
 
324
			
260
		$pas = 200; 
325
			if($i > $fin) {
261
		$fin = 50000; 
326
				$i = $fin;
Line 262... Line 327...
262
		
327
			}
263
		for ($i = $debut; $i <= $fin ; $i += $pas) {
328
			
264
			$requete_selection_liaisons = 'SELECT * FROM cel_obs_images LIMIT '.$i.','.$pas;
329
			$requete_selection_liaisons = 'SELECT * FROM cel_obs_images LIMIT '.$i.','.$pas;
Line 265... Line 330...
265
			$tableau_liaisons = $this->executerRequete($requete_selection_liaisons);
330
			$tableau_liaisons = $this->executerRequete($requete_selection_liaisons);
Line -... Line 331...
-
 
331
			
266
			
332
			$requete_migration_liaison = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_obs_images '.
-
 
333
											'(id_image, id_utilisateur, id_observation, date_liaison) '.
-
 
334
											'VALUES ';
-
 
335
											
Line 267... Line 336...
267
			$requete_migration_liaison = 'INSERT INTO '.self::bdd_cel_migration.'.cel_obs_images '.
336
			$sous_requete_insertion = '';
268
											'(ce_image, ce_utilisateur, ce_observation, date_liaison) '.
337
			
-
 
338
			if(is_array($tableau_liaisons)) {
-
 
339
				foreach($tableau_liaisons as &$liaison) {
-
 
340
					
269
											'VALUES ';
341
					$mail_utilisateur = $liaison['coi_ce_utilisateur'];
270
											
342
					$utilisateur = $mail_utilisateur;
271
			$sous_requete_insertion = '';
343
				
-
 
344
					if (isset($this->tableau_utilisateurs[$mail_utilisateur])) {
-
 
345
						$utilisateur =  $this->tableau_utilisateurs[$mail_utilisateur]['id'];
-
 
346
					}
-
 
347
					
-
 
348
					$id_obs = $liaison['coi_ce_observation'];
-
 
349
				
-
 
350
					if (isset($this->tableau_observations[$mail_utilisateur][$id_obs])) {
-
 
351
						$id_obs =  $this->tableau_observations[$mail_utilisateur][$id_obs];
-
 
352
						
-
 
353
						$sous_requete_insertion .= '('.$this->proteger($liaison['coi_ce_image']).','.
272
			
354
							$this->proteger($utilisateur).','.
Line 273... Line 355...
273
			foreach($tableau_liaisons as &$liaison) {
355
							$this->proteger($id_obs).','.
-
 
356
							$this->proteger($liaison['coi_date_liaison']).
274
				
357
						'),';
275
				$mail_utilisateur = $liaison['coi_ce_utilisateur'];
-
 
276
				$utilisateur = $mail_utilisateur;
358
					} else {
277
			
359
						// cas d'une observation inexistante, la liaison est ignorée
278
				if (isset($this->tableau_utilisateurs[$mail_utilisateur])) {
-
 
279
					$utilisateur =  $this->tableau_utilisateurs[$mail_utilisateur]['id'];
-
 
280
				}
360
						$liaisons_obs_inexistantes++;
281
				
361
					}
282
				$id_obs = $liaison['coi_ce_observation'];
-
 
283
			
362
				}
284
				if (isset($this->tableau_observations[$mail_utilisateur][$id_obs])) {
363
				
285
					$id_obs =  $this->tableau_observations[$mail_utilisateur][$id_obs];
364
				$sous_requete_insertion = rtrim($sous_requete_insertion,',');
286
					
365
				$requete_migration_liaison = $requete_migration_liaison.$sous_requete_insertion;
287
					$sous_requete_insertion .= '('.$this->proteger($liaison['coi_ce_image']).','.
-
 
288
						$this->proteger($utilisateur).','.
-
 
289
						$this->proteger($id_obs).','.
-
 
290
						$this->proteger($liaison['coi_date_liaison']).
-
 
291
					'),';
-
 
292
				} else {
-
 
293
					echo 'l\'obs '.$id_obs.' n\'existe pas pour l\'utilisateur '.$mail_utilisateur."\n";
-
 
294
				}
-
 
295
			}
-
 
296
			
-
 
297
			$sous_requete_insertion = rtrim($sous_requete_insertion,',');
-
 
298
			$requete_migration_liaison = $requete_migration_liaison.$sous_requete_insertion;
366
				
-
 
367
				$migration_liaison = $this->executerRequeteSimple($requete_migration_liaison);
-
 
368
				
-
 
369
				if (!$migration_liaison) {
-
 
370
					echo 'la migration des liaisons obs images de '.$i.' à '.($i+$pas).' a échoué ! '."\n<br />";
299
			
371
				} else {
Line 300... Line 372...
300
			$migration_liaison = $this->executerRequeteSimple($requete_migration_liaison);
372
					$this->afficherAvancement('Migration des liaisons obs images (par '.$pas.' )', $fin);
Line 301... Line 373...
301
			
373
				} 
Line 371... Line 443...
371
						}
443
						}
372
					}	
444
					}	
373
				} else {
445
				} else {
374
					// on met le mot clé dans sa propre case afin d'éviter
446
					// on met le mot clé dans sa propre case afin d'éviter
375
					// facilement les doublons provoqués par de mauvais formatages 
447
					// facilement les doublons provoqués par de mauvais formatages 
-
 
448
					if(isset($this->tableau_mots_cles[$utilisateur][$mot_cle])) {
376
					$tableau_mots_cles_formates[$mot_cle] = $this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle'];
449
						$tableau_mots_cles_formates[$mot_cle] = $this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle'];
-
 
450
					}
377
				}
451
				}
Line 378... Line 452...
378
 
452
 
379
			}
453
			}
Line 443... Line 517...
443
	
517
	
Line 444... Line 518...
444
	private function convertirTableauMetadonneesEnXml($tableau) {
518
	private function convertirTableauMetadonneesEnXml($tableau) {
Line 445... Line 519...
445
		
519
		
Line 446... Line 520...
446
		$xml = '';
520
		$xml = '';
447
		
521
		
448
		/*foreach($tableau as $cle => $valeur) {
522
		foreach($tableau as $cle => $valeur) {
449
 
523
 
450
			$cle = str_replace('ci_meta_exif_','',$cle);
524
			$cle = str_replace('ci_meta_exif_','',$cle);
451
			$cle = str_replace('ci_meta_iptc_','',$cle);
525
			$cle = str_replace('ci_meta_iptc_','',$cle);
-
 
526
			$cle = str_replace('ci_meta_','',$cle);
452
			$cle = str_replace('ci_meta_','',$cle);
527
			$cle = str_replace('_',' ',$cle);
453
			$cle = str_replace('_',' ',$cle);
528
			$cle = str_replace(' ','',ucwords($cle));
Line 454... Line 529...
454
			$cle = str_replace(' ','',ucwords($cle));
529
			$valeur = str_replace("\0",'',$valeur);
455
			$valeur = str_replace("\0",'',$valeur);
530
			$id = isset($this->id_cle_metadonnees[$cle]) ? $this->id_cle_metadonnees[$cle] : $cle;
Line 456... Line 531...
456
			$xml .= '<'.$cle.' id="'.$this->id_cle_metadonnees[$cle].'">'.$valeur.'</'.$cle.'>'."\n";
531
			$xml .= '<'.$cle.' id="'.$id.'">'.$valeur.'</'.$cle.'>'."\n";
Line 564... Line 639...
564
	}
639
	}
Line 565... Line 640...
565
	
640
	
Line 566... Line 641...
566
	private function traiterXmp($ligne_image) {
641
	private function traiterXmp($ligne_image) {
-
 
642
		
567
		
643
		$chemin = $this->obtenirCheminImageOriginale($ligne_image['ci_id_image']);
568
		$chemin = $this->obtenirCheminImageOriginale($ligne_image['ci_id_image']);
644
		// TODO décommenté car pour le moment ça n'est pas necessaire, à éxécuter à part
569
		//$res = $this->decoderMetadonneesExifTool($chemin);
645
		//$res = $this->decoderMetadonneesExifTool($chemin);
570
		$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
646
		$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
571
		$xml .= '<xmp>';
647
		$xml .= '<xmp>';