Subversion Repositories eFlore/Applications.cel

Rev

Rev 2415 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2415 Rev 2418
Line 1... Line 1...
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Mise à jour de la base de données afin de l'optimiser :
4
 * Mise à jour de la base de données afin de l'optimiser :
5
 * - suppression de la table cel_obs_images
-
 
6
 * - remplacement du champ "eflore_publiable" de la table "cel_images" par un champ "transmission" (correspondant au champ tansmission des obs)
5
 * - remplacement du champ "eflore_publiable" de la table "cel_images" par un champ "transmission" (correspondant au champ tansmission des obs)
7
 * - ajout du champ "date_liaison" dans la table "cel_images"
6
 * - ajout du champ "date_liaison" dans la table "cel_images"
-
 
7
 * - ajout du champ "ce_observation" dans la table "cel_images"
-
 
8
 * - migration des données de la table cel_obs_images dans cel_images
-
 
9
 * - création d'un index sur cel_images.ce_observation
-
 
10
 * - suppression de la table cel_obs_images
8
 *
11
 *
9
 * Utilisation :
12
 * Utilisation :
10
 * - mise à jour de la bdd : <code>/opt/lamp/bin/php cli.php migration_optimisation -a migrer</code>
13
 * - mise à jour de la bdd : <code>/opt/lamp/bin/php cli.php migration_optimisation -a migrer</code>
11
 *
14
 *
12
 * @category   CEL
15
 * @category   CEL
Line 17... Line 20...
17
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
20
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
18
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
21
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
19
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
22
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
20
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
23
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
21
 */
24
 */
22
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
-
 
23
 
-
 
24
class MigrationOptimisation extends Script {
25
class MigrationOptimisation extends Script {
Line 25... Line 26...
25
 
26
 
26
	public function executer() {
27
	public function executer() {
27
		$cmd = $this->getParametre('a');
28
		$cmd = $this->getParametre('a');
Line 28... Line 29...
28
		$this->mode_verbeux = $this->getParametre('v');
29
		$this->mode_verbeux = $this->getParametre('v');
29
 
-
 
30
		switch($cmd) {
-
 
31
			case 'celObsImages':
-
 
32
				$this->migrerCelObsImages();
-
 
33
			break;
30
 
34
 
31
		switch($cmd) {
35
			case 'images':
-
 
36
				$this->mode = $cmd;
32
			case 'maj':
37
				$this->migrerMotsClesImages();
-
 
38
			break;
33
				$this->migrerBdd();
39
 
-
 
40
			default:
-
 
41
				echo 'Méthode inconnue, les méthodes possibles sont obs et images'."\n";
-
 
42
		}
-
 
43
	}
-
 
44
 
-
 
45
	private function migrerCelObsImages() {
-
 
46
		$this->dao = new Dao('obs');
-
 
47
		$this->convertirNestedSetVersPathEnum();
-
 
48
	}
-
 
49
 
-
 
50
	private function migrerMotsClesImages() {
-
 
51
		$this->dao = new Dao('images');
-
 
52
		$this->convertirNestedSetVersPathEnum();
-
 
53
	}
-
 
54
 
-
 
55
	private function convertirNestedSetVersPathEnum() {
-
 
56
 
-
 
57
		$debut = microtime();
-
 
58
 
-
 
59
		$this->dao->viderTables();
-
 
60
 
-
 
61
		$mots_cles_hierarchiques = $this->dao->obtenirMotsClesOriginaux($this->mode);
-
 
62
		$mots_cles_hierarchiques = $this->formaterChemin($mots_cles_hierarchiques);
-
 
63
 
-
 
64
		$liaisons = $this->dao->obtenirLiaisonsMotsClesOriginaux($this->mode);
-
 
65
 
-
 
66
		if($this->mode_verbeux) {
-
 
67
			echo "-------------------------------------------------------------------\n";
-
 
68
			echo " Début de la migration des mots clés ".$this->mode." \n";
-
 
69
			echo " ".count($mots_cles_hierarchiques)." mots clés et ".count($liaisons)." liaisons à migrer \n";
-
 
70
			echo "-------------------------------------------------------------------\n";
-
 
71
		}
-
 
72
 
-
 
73
		$nb_mots_cles = 0;
-
 
74
		$nb_liaisons = 0;
-
 
75
 
-
 
76
		$mots_cles_slice = array_chunk($mots_cles_hierarchiques, 800, true);
-
 
77
		echo " Insertion des mots clés par paquet de 800 \n";
-
 
78
		foreach($mots_cles_slice as &$mots_cles_tranche) {
-
 
79
			$this->dao->insererMotsCles($mots_cles_tranche);
-
 
80
			$nb_mots_cles += 800;
-
 
81
			if($this->mode_verbeux) {
-
 
82
				$this->afficherAvancement(' mots clés insérés ', $nb_mots_cles);
-
 
83
			}
-
 
84
		}
-
 
85
		echo "\n Insertion des mots clés ".$this->mode." terminée \n";
-
 
86
 
-
 
87
		$infos_nouveaux_mots_cles = $this->dao->obtenirInfosNouveauxMotsCles();
-
 
88
		$correspondances = $this->formaterCorrespondanceCheminId($infos_nouveaux_mots_cles);
-
 
89
 
-
 
90
		$liaisons_slice = array_chunk($liaisons, 800, true);
-
 
91
		echo " Insertion des mots liaisons par paquet de 800 \n";
-
 
92
		foreach($liaisons_slice as &$liaison_tranche) {
-
 
93
			$this->dao->insererLiaisonsMotsCles($mots_cles_hierarchiques, $liaison_tranche, $correspondances);
-
 
94
			$nb_liaisons += 800;
-
 
95
			if($this->mode_verbeux) {
-
 
96
				$this->afficherAvancement(' liaisons insérées ', $nb_liaisons);
-
 
97
			}
-
 
98
		}
-
 
99
		echo "\n Insertion des liaisons ".$this->mode." terminée \n";
-
 
100
 
-
 
101
		$fin = microtime(true);
-
 
102
		if($this->mode_verbeux) {
-
 
103
			echo "\n";
-
 
104
			echo "-------------------------------------------------------------------\n";
-
 
105
			echo "  Fin de la migration des mots clés ".$this->mode.", \n";
-
 
106
			echo "  ".($fin - $debut)." secondes écoulées \n";
34
				break;
107
			echo "  ".count($mots_cles_hierarchiques)." mots clés insérés \n";
-
 
108
			echo "  ".count($liaisons)." liaisons insérées \n";
-
 
109
			echo "-------------------------------------------------------------------\n";
35
			default:
110
			echo "\n";
36
				echo "Action «$cmd» inconnue.\n";
Line 111... Line -...
111
		}
-
 
112
	}
37
		}
113
 
-
 
114
	private function formaterCorrespondanceCheminId($infos_nouveaux_mots_cles) {
38
	}
115
		$mots_cles_correspondances = array();
39
 
116
		foreach($infos_nouveaux_mots_cles as &$mot) {
-
 
117
			$cle = $mot['chemin'].'-'.$mot['id_utilisateur'];
-
 
118
			$mots_cles_correspondances[$cle] = $mot;
40
	private function migrerBdd() {
Line 119... Line 41...
119
		}
41
		$contenuSql = FichierUtil::recupererContenu(__DIR__.'/maj_optimisation.sql');
120
		return $mots_cles_correspondances;
42
		$this->executerScripSql($contenuSql);
121
	}
-
 
122
 
-
 
123
	private function formaterChemin($mots_cles) {
-
 
124
		$mots_cles_hierarchiques = array();
43
	}
125
		$chemin_traites = array();
-
 
126
		$pbs = array('doublons' => array(), 'vides' => array());
-
 
127
 
-
 
128
		foreach($mots_cles as &$mot) {
-
 
129
 
-
 
130
			if(trim($mot['mot_cle']) != "") {
-
 
131
				$chemin = '/';
-
 
132
				$cle_parent = $mot['parent'].'-'.$mot['id_utilisateur'];
-
 
133
				if(isset($mots_cles_hierarchiques[$cle_parent])) {
44
 
134
					$chemin = $mots_cles_hierarchiques[$cle_parent]['chemin'];
-
 
135
				}
-
 
136
				$chemin .= self::simplifier($mot['mot_cle']).'/';
-
 
137
				$chemin = str_replace("//", "/", $chemin);
-
 
138
 
-
 
139
				if(!isset($chemin_traites[self::harmoniserPourDoublon($chemin).'-'.$mot['id_utilisateur']])) {
-
 
140
					$cle = $mot['id_mot_cle'].'-'.$mot['id_utilisateur'];
-
 
141
 
-
 
142
					$mots_cles_hierarchiques[$cle] = array(
-
 
143
												'id_utilisateur' => $mot['id_utilisateur'],
-
 
144
												'chemin' => $chemin,
-
 
145
												'mot_cle' => $mot['mot_cle']
-
 
146
					);
-
 
147
					$chemin_traites[self::harmoniserPourDoublon($chemin).'-'.$mot['id_utilisateur']] = 1;
-
 
148
				} else {
45
	private function executerScripSql($sql) {
149
					$pbs['doublons'][self::harmoniserPourDoublon($chemin).'-'.$mot['id_utilisateur']] = $mot;
-
 
150
				}
46
		$requetes = SqlUtil::extraireRequetes($sql);
151
			} else {
-
 
152
				$pbs['vides'][] = $mot;
-
 
153
			}
-
 
154
		}
-
 
155
 
-
 
156
		//echo '<pre>'.print_r($mots_cles_hierarchiques,true).'</pre>';exit;
-
 
157
		return $mots_cles_hierarchiques;
-
 
158
	}
-
 
159
 
-
 
160
	static public function harmoniserPourDoublon($texte) {
-
 
161
		$texte = htmlentities($texte, ENT_NOQUOTES, 'utf-8');
-
 
162
		$texte = preg_replace('/&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);/', '\1', $texte);
-
 
163
		$texte = preg_replace('/&([A-za-z]{2})(?:lig);/', '\1', $texte); // pour les ligatures e.g. '&oelig;'
-
 
164
		$texte = preg_replace('/&[^;]+;/', '', $texte); // supprime les autres caractères
-
 
165
 
-
 
166
		return strtolower($texte);
-
 
167
	}
-
 
168
 
47
		foreach ($requetes as $requete) {
169
	static public function simplifier($text) {
48
			echo "Exécution de la requete : $requete\n";
170
		// le slash est le seul caractère interdit dans les mots clés
49
			$this->executer($requete);