Subversion Repositories eFlore/Applications.cel

Rev

Rev 1161 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1149 gduche 1
<?php
2
 
3
class MigrationMotsCles extends Cel {
4
 
5
	const bdd_cel_migration = 'cel';
6
	const bdd_utilisateurs = 'cel_old';
7
 
8
	const dry_run = true;
9
 
10
	private $tableau_utilisateurs = array();
11
 
12
	/** Tableau associatif permettant de stocker l'avancement dans une boucle.
13
	* La clé est un md5 du message à afficher au démarrage de la boucle.
14
	* @var array
15
	*/
16
	private static $avancement = array();
17
 
18
	/**
19
	 * Méthode appelée avec une requête de type GET.
20
	 */
21
	public function getElement($params) {
22
 
23
		echo "-------------------------------------------------------------------\n\n";
24
		echo "  ETAPE 1. Paramétrage ... \n\n";
25
		echo "-------------------------------------------------------------------\n\n";
26
 
27
		$this->getUtilisateurs();
28
		echo "-------------------------------------------------------------------\n\n";
29
		echo "  ETAPE 2. Migration des mots clés ... \n\n";
30
		echo "-------------------------------------------------------------------\n\n";
31
 
32
		$this->migrerTableMotsClesObs();
33
		$this->migrerTableMotsClesImages();
34
		echo "\n"."\n".'|| Migration des tables de liaison des mots clés ||'."\n";
35
		$this->migrerLiaisonsMotsClesObs();
36
		$this->migrerLiaisonsMotsClesImages();
37
		echo "\n"."\n"."\n";
38
	}
39
 
40
	public function executerRequeteSimple($requete) {
41
		// Fonction de commodité pour afficher les requetes au lieu de les executer
42
		if(self::dry_run) {
43
			echo str_replace('),','),'."\n", $requete);
44
			return true;
45
		} else {
46
			return parent::executerRequeteSimple($requete);
47
		}
48
 
49
	}
50
 
51
 
52
	private function getUtilisateurs() {
53
		echo "\n-------------------------------------------------------------------\n";
54
		echo "--SELECTION DES UTILISATEURS---------------------------------------\n\n";
55
 
56
		$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';
57
		$tableau_utilisateurs = $this->executerRequete($requete_selection_utilisateurs);
58
 
59
		foreach( $tableau_utilisateurs as &$utilisateur) {
60
			$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur;
61
		}
62
 
63
		echo sizeof($this->tableau_utilisateurs)." utilisateurs sélectionnés";
64
		echo "\n-----------------------------------------------------------------OK\n";
65
	}
66
 
67
	private function migrerLiaisonsMotsClesObs() {
68
		$requete_selection_mots_cles = 'SELECT mots_cles, id FROM cel_inventory '.
69
										'WHERE mots_cles != "" AND mots_cles IS NOT NULL '.
70
										'ORDER BY identifiant';
71
 
72
		$mots_cles_obs = $this->executerRequete($requete_selection_mots_cles);
73
 
74
		$mots_cles_tableau = array();
75
 
76
		$requete_insertion_mots_cles = 'INSERT INTO '.self::bdd_cel_migration.'.cel_obs_mots_cles '.
77
										'(id_observation, id_mot_cle_utilisateur) '.
78
										'VALUES ';
79
 
80
		$sous_requete_insertion_valeurs = $sous_requete_insertion_mots_cles = $this->construireSousRequeteInsertionLiaisons($mots_cles_obs, 'mots_cles','id',';');
81
		$requete_insertion_mots_cles = $requete_insertion_mots_cles.$sous_requete_insertion_valeurs;
82
 
83
		$insertion = $this->executerRequeteSimple($requete_insertion_mots_cles);
84
 
85
		if(!$insertion) {
86
			echo 'la migration des mots cles obs a échoué ! '."\n";
87
		} else {
88
			echo 'migration des mots cles obs réussie '."\n";
89
		}
90
 
91
		echo "\n";
92
	}
93
 
94
	private function migrerLiaisonsMotsClesImages() {
95
 
96
		$requete_selection_mots_cles = 'SELECT ci_meta_mots_cles, ci_id_image FROM cel_images '.
97
										'WHERE ci_meta_mots_cles != "" AND ci_meta_mots_cles IS NOT NULL '.
98
										'ORDER BY ci_ce_utilisateur';
99
 
100
		$mots_cles_images = $this->executerRequete($requete_selection_mots_cles);
101
 
102
		$mots_cles_tableau = array();
103
 
104
		$requete_insertion_mots_cles = 'INSERT INTO '.self::bdd_cel_migration.'.cel_images_mots_cles '.
105
										'(id_image, id_mot_cle_utilisateur) '.
106
										'VALUES ';
107
		$sous_requete_insertion_mots_cles = $this->construireSousRequeteInsertionLiaisons($mots_cles_images, 'ci_meta_mots_cles','ci_id_image',',');
108
 
109
		$requete_insertion_mots_cles = $requete_insertion_mots_cles.$sous_requete_insertion_mots_cles;
110
 
111
		$insertion = $this->executerRequeteSimple($requete_insertion_mots_cles);
112
 
113
		if(!$insertion) {
114
			echo 'la migration des mots cles images a échoué ! '."\n";
115
		} else {
116
			echo 'migration des mots cles images réussie '."\n";
117
		}
118
	}
119
 
120
	private function migrerTableMotsClesObs() {
121
		$this->migrerTableMotsCles('obs');
122
	}
123
 
124
	private function migrerTableMotsClesImages() {
125
		$this->migrerTableMotsCles('images');
126
	}
127
 
128
 
129
	/**
130
	 * Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué.
131
	 * Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle.
132
	 *
133
	 * @param string le message d'information.
134
	 * @param int le nombre de départ à afficher.
135
	 * @return void le message est affiché dans la console.
136
	 */
137
	protected function afficherAvancement($message, $depart = 0) {
138
		if (! isset(self::$avancement[$message])) {
139
			self::$avancement[$message] = $depart;
140
			echo "$message : ";
141
 
142
			$actuel =& self::$avancement[$message];
143
			echo $actuel++;
144
		} else {
145
			$actuel =& self::$avancement[$message];
146
 
147
			// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères)
148
			$passage = 0;
149
			if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) {
150
				$passage = 1;
151
			}
152
 
153
			echo str_repeat(chr(8), (strlen((string) $actuel) - $passage));
154
			echo $actuel++;
155
		}
156
	}
157
 
158
	private function migrerTableMotsCles($image_ou_obs) {
159
		echo "--MIGRATION DES MOTS CLES $image_ou_obs ---------------------------------\n";
160
		$pas = 1;
161
 
162
		//limite des mots clés
163
		$requeteNbMotsCles = 'SELECT count(*) as nb FROM cel_mots_cles_'.$image_ou_obs;
164
		$resultatNbMotsCles = $this->executerRequete($requeteNbMotsCles);
165
		$nbMotsCles = (int) $resultatNbMotsCles[0]['nb'];
166
 
167
		$nbTotal = 0;
168
		for($i = 0; $i < $nbMotsCles; $i += $pas) {
169
			$requete_selection_arbres_mots_cles = 'SELECT * FROM cel_mots_cles_'.$image_ou_obs.' ORDER BY cmc_niveau '.
170
													'LIMIT '.$i.','.$pas;
171
			$arbres_mots_cles = $this->executerRequete($requete_selection_arbres_mots_cles);
172
 
173
			$requete_insertion_nouvel_arbre = 'INSERT INTO '.self::bdd_cel_migration.'.cel_mots_cles_'.$image_ou_obs.' '.
174
												'(id_mot_cle_utilisateur, ce_utilisateur, mot_cle, md5, bg, bd, niveau, ce_mot_cle_utilisateur_parent) '.
175
												'VALUES ';
176
			$sous_requete_insertion_nouvel_arbre = '';
177
 
178
			if(count($arbres_mots_cles) > 0) {
179
				foreach($arbres_mots_cles as $arbre_mot_cle) {
180
					$sous_requete_insertion_nouvel_arbre .= $this->construireSousRequeteInsertionArbresMotsCles('cmc_', $arbre_mot_cle);
181
				}
182
 
183
				$sous_requete_insertion_nouvel_arbre = rtrim($sous_requete_insertion_nouvel_arbre,',');
184
 
185
				$requete_insertion_nouvel_arbre = $requete_insertion_nouvel_arbre.$sous_requete_insertion_nouvel_arbre;
186
				//echo var_dump($requete_insertion_nouvel_arbre);
187
				$migration = $this->executerRequeteSimple($requete_insertion_nouvel_arbre);
188
				if(!$migration) {
189
					echo  'la migration des mots cles '.$image_ou_obs.' a échoué ! '."\n";
190
				} else {
191
					$nbTotal ++;
192
					$this->afficherAvancement('Migration des mots clés (par '.$pas.') :', $nbTotal);
193
				}
194
			} else {
195
				return;
196
			}
197
 
198
		}
199
	}
200
 
201
	private function construireSousRequeteInsertionArbresMotsCles($prefixe, $ligne) {
202
 
203
		$id_proprietaire_mot_cle = $ligne[$prefixe.'id_proprietaire'];
204
 
205
		if(isset($this->tableau_utilisateurs[$ligne[$prefixe.'id_proprietaire']])) {
206
			$id_proprietaire_mot_cle = $this->tableau_utilisateurs[$ligne[$prefixe.'id_proprietaire']]['id'];
207
		}
208
 
209
		$sous_requete_insertion_valeurs = '('.$this->proteger($ligne[$prefixe.'id_mot_cle_utilisateur']).','.
210
													$this->proteger($id_proprietaire_mot_cle).','.
211
													$this->proteger($ligne[$prefixe.'mot_cle']).','.
212
													$this->proteger($ligne[$prefixe.'id_mot_cle_general']).','.
213
													$this->proteger($ligne[$prefixe.'bg']).','.
214
													$this->proteger($ligne[$prefixe.'bd']).','.
215
													$this->proteger($ligne[$prefixe.'niveau']).','.
216
													$this->proteger($ligne[$prefixe.'id_parent']).
217
													'),';
218
		return $sous_requete_insertion_valeurs;
219
	}
220
 
221
	private function construireSousRequeteInsertionLiaisons($tableau_mots_cles, $champ_mot_cle, $champ_id, $separateur) {
222
		$sous_requete_insertion_valeurs = '';
223
 
224
		foreach($tableau_mots_cles as $mot_cle_element) {
225
			$mots_cles_tableau = $this->parserMotsCles($mot_cle_element[$champ_mot_cle],$separateur);
226
			foreach($mots_cles_tableau as $mot_cle_en_cours) {
227
				$sous_requete_insertion_valeurs .= '('.$mot_cle_element[$champ_id].','.$this->proteger($mot_cle_en_cours).'),';
228
			}
229
		}
230
 
231
		$sous_requete_insertion_valeurs = rtrim($sous_requete_insertion_valeurs,',');
232
		return $sous_requete_insertion_valeurs;
233
	}
234
 
235
	private function parserMotsCles($mot_cles, $separateur = ',') {
236
 
237
		$tableau_mots_cles = explode($separateur,$mot_cles);
238
		$tableau_mots_cles_formates = array();
239
 
240
		foreach($tableau_mots_cles as $mot_cle) {
241
 
242
			$mot_cle = str_replace($separateur.$separateur,'',$mot_cle);
243
			$mot_cle = str_replace('null','',$mot_cle);
244
 
245
			if($this->estUnIdentifiantMotCle($mot_cle)) {
246
 
247
				// certains mots clés mal formatés contiennent des virgules
248
				if(strpos($mot_cle,',') !== false) {
249
					$tab_mot_cle_mal_formate = explode(',',$mot_cle);
250
 
251
					foreach ( $tab_mot_cle_mal_formate as $mot_cle_mal_formate) {
252
						if($this->estUnIdentifiantMotCle($mot_cle_mal_formate)) {
253
							$tableau_mots_cles_formates[$mot_cle_mal_formate] = $mot_cle_mal_formate;
254
						}
255
					}
256
				} else {
257
					// on met le mot clé dans sa propre case afin d'éviter
258
					// facilement les doublons provoqués par de mauvais formatages
259
					$tableau_mots_cles_formates[$mot_cle] = $mot_cle;
260
				}
261
 
262
			}
263
		}
264
 
265
		return $tableau_mots_cles_formates;
266
	}
267
 
268
	private function estUnIdentifiantMotCle($chaine) {
269
		return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine) ;
270
	}
271
}