Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 2414 → Rev 2415

/trunk/scripts/modules/maintenance/Maintenance.php
1,4 → 1,21
<?php
// declare(encoding='UTF-8');
/**
* Classe de maintenance de la base de données du CEL.
*
* Utilisation :
* - <code>/opt/lamp/bin/php cli.php maintenance -a (voir méthode executer)</code>
*
* @category CEL
* @package Scripts
* @subpackage Maintenance
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class Maintenance extends Script {
 
protected $bdd;
105,7 → 122,7
$this->traiterErreur($e->getMessage());
}
}
 
private function obtenirParametreIntObligatoirePourMethode($param) {
$param_val = $this->getParametre($param);
if(!$param_val || !is_numeric($param_val)) {
129,7 → 146,7
$req = "UPDATE cel_images SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_images cm "
. "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'] . "') "
. "WHERE id_image = '" . $image['id_image'] . "'";
$this->bdd->requeter($req);
$this->bdd->requeter($req);
}
}
 
140,7 → 157,7
"id_observation IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
if(!$tout) {
$req .= " AND (mots_cles_texte IS NULL OR mots_cles_texte='')";
}
}
$res = $this->bdd->recupererTous($req);
echo count($res) . " observations trouvées\n";
foreach ($res as $image) {
147,7 → 164,7
$req = "UPDATE cel_obs SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_obs cm "
. "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'] . "') "
. "WHERE id_observation = '" . $image['id_observation'] . "'";
$this->bdd->requeter($req);
$this->bdd->requeter($req);
}
}
 
164,19 → 181,19
$res = $this->bdd->requeter($req);
echo "$res observations mises à jour\n";
}
 
protected function regenererChampsTailleImage() {
$req = "SELECT id_image FROM cel_images WHERE hauteur = 0 OR largeur = 0";
$res = $this->bdd->recupererTous($req);
 
echo count($res)." images concernees \n";
echo "Début du traitement \n";
$images_maj = 0;
$image_meta_ratees = 0;
$images_inexistantes = 0;
 
foreach($res as $image) {
$chemin = $this->getCheminImage($image['id_image']);
$chemin = $this->getCheminImage($image['id_image']);
if(file_exists($chemin)) {
list($largeur, $hauteur) = @getimagesize($chemin);
if(is_numeric($largeur) && is_numeric($hauteur)) {
193,7 → 210,7
$images_inexistantes++;
}
$this->afficherAvancement("\tImages traitées : ", 1);
}
}
echo "\n";
echo "Fin de la régénération des tailles des images à partir des metadonnées \n";
echo $images_maj." images ont vu leur infos de taille régénérées \n";
200,33 → 217,33
echo $image_meta_ratees." images ont raté l'extraction de metadonnées \n";
echo $images_inexistantes." images n'existent pas en tant que fichier \n";
}
 
private function getCheminImage($id) {
$chemin_base = Config::get('dossierImages');
 
$id = sprintf('%09s', $id);
$id = wordwrap($id, 3 , '_', true);
 
list($dossierNiveau1, $dossierNiveau2) = explode('_', $id);
 
$chemin = $chemin_base.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/O/'.$id.'_O.jpg';
 
return $chemin;
}
 
protected function reparerLiaisonsOublieesObs() {
// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
// dans la table de liaison il est souvent vide
// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
// dans la table de liaison il est souvent vide
$requete_liaisons = "SELECT com.id_observation, com.id_mot_cle_obs, co.ce_utilisateur ".
"FROM `cel_obs_mots_cles` com INNER JOIN cel_obs co ON co.id_observation = com.id_observation ";
 
$liaisons = $this->bdd->recupererTous($requete_liaisons);
$nb_liaisons_originales = count($liaisons);
 
// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
$requete_mots_cles = "SELECT id_mot_cle_obs, id_utilisateur, mot_cle FROM cel_mots_cles_obs ";
$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
 
$anciens_mots_cles_fmt = array();
foreach($anciens_mots_cles as &$ancien_mot_cle) {
$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
235,11 → 252,11
}
$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_obs']] = $ancien_mot_cle;
}
 
// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_obs";
$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
 
$nouveau_mots_cles_fmt = array();
foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
248,18 → 265,18
}
$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][strtolower($nouveau_mot_cle['mot_cle'])] = $nouveau_mot_cle;
}
 
$anciens_mot_cles_pas_trouves = 0;
$nouveaux_mot_cles_pas_trouves = 0;
$utilisateurs_pas_trouves = 0;
$valeurs_a_inserer = array();
 
$ids_obs = array();
 
foreach($liaisons as &$liaison) {
$id_utilisateur_liaison = $liaison['ce_utilisateur'];
$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_obs'];
 
if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
267,7 → 284,7
if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
 
$valeurs_a_inserer[] = array(
'id_element_lie' => $liaison['id_observation'],
'id_mot_cle' => $nouvel_id_mot_cle,
278,9 → 295,9
$nouveaux_mot_cles_pas_trouves++;
}
} else {
 
}
 
} else {
$anciens_mot_cles_pas_trouves++;
}
288,13 → 305,13
$utilisateurs_pas_trouves++;
}
}
 
echo "Anciennes liaisons ".$nb_liaisons_originales." \n";
echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
echo "Nouveaux mots clés inconnus ".$nouveaux_mot_cles_pas_trouves."\n";
 
$tranches = array_chunk($valeurs_a_inserer, 800);
 
foreach($tranches as $tranche) {
309,7 → 326,7
}
echo "\n";
}
 
private function reparerLiaisonsOublieesImages() {
// Toutes les liaisons obs-motscles avec l'id utilisateur issu de la table cel obs car
// dans la table de liaison il est souvent vide
317,11 → 334,11
"FROM cel_images_mots_cles cim INNER JOIN cel_images ci ON ci.id_image = cim.id_image ";
 
$liaisons = $this->bdd->recupererTous($requete_liaisons);
 
// Tous les anciens mots clés, à classer par utilisateur, puis par id mot clé
$requete_mots_cles = "SELECT id_mot_cle_image, id_utilisateur, mot_cle FROM cel_mots_cles_images ";
$anciens_mots_cles = $this->bdd->recupererTous($requete_mots_cles);
 
$anciens_mots_cles_fmt = array();
foreach($anciens_mots_cles as &$ancien_mot_cle) {
$id_utilisateur_ancien = $ancien_mot_cle['id_utilisateur'];
330,11 → 347,11
}
$anciens_mots_cles_fmt[$id_utilisateur_ancien][$ancien_mot_cle['id_mot_cle_image']] = $ancien_mot_cle;
}
 
// Tous les nouveau mots clés, à classer par utilisateur, puis par valeur textuelle du mot
$requete_nouveaux_mots_cles = "SELECT * FROM cel_arbre_mots_cles_images";
$nouveau_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cles);
 
$nouveau_mots_cles_fmt = array();
foreach($nouveau_mots_cles as &$nouveau_mot_cle) {
$id_utilisateur_nouveau = $nouveau_mot_cle['id_utilisateur'];
343,16 → 360,16
}
$nouveau_mots_cles_fmt[$id_utilisateur_nouveau][$nouveau_mot_cle['mot_cle']] = $nouveau_mot_cle;
}
 
$anciens_mot_cles_pas_trouves = 0;
$nouveaux_mot_cles_pas_trouves = 0;
$utilisateurs_pas_trouves = 0;
$valeurs_a_inserer = array();
 
foreach($liaisons as &$liaison) {
$id_utilisateur_liaison = $liaison['ce_utilisateur'];
$id_mot_cle_ancien_liaison = $liaison['id_mot_cle_image'];
 
if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison])) {
if(isset($anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison])) {
$texte_ancien_mot_cle = $anciens_mots_cles_fmt[$id_utilisateur_liaison][$id_mot_cle_ancien_liaison]['mot_cle'];
359,7 → 376,7
if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison])) {
if(isset($nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle])) {
$nouvel_id_mot_cle = $nouveau_mots_cles_fmt[$id_utilisateur_liaison][$texte_ancien_mot_cle]['id_mot_cle'];
 
$valeurs_a_inserer[] = array(
'id_element_lie' => $liaison['id_image'],
'id_mot_cle' => $nouvel_id_mot_cle,
370,9 → 387,9
$nouveaux_mot_cles_pas_trouves++;
}
} else {
 
}
 
} else {
$anciens_mot_cles_pas_trouves++;
}
380,7 → 397,7
$utilisateurs_pas_trouves++;
}
}
 
echo "Liaisons à insérer ".count($valeurs_a_inserer)."\n";
echo "Utilisateurs inconnus ".$utilisateurs_pas_trouves."\n";
echo "Anciens mots clés inconnus ".$anciens_mot_cles_pas_trouves."\n";
400,24 → 417,24
}
echo "\n";
}
 
private function reparerLiaisonsObsParMotsClesTexte($mot_cle_texte_recherche) {
$ancienne_table_obs = Config::get('table_obs_recup');
$requete_anciens_mots_cles_texte = "SELECT ce_utilisateur, id_observation, mots_cles_texte ".
"FROM ".$ancienne_table_obs." WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%'";
$obs_a_mot_cle = $this->bdd->recupererTous($requete_anciens_mots_cles_texte);
 
$requete_nouveaux_mots_cle = "SELECT * FROM cel_arbre_mots_cles_obs ".
"WHERE id_utilisateur IN ".
"WHERE id_utilisateur IN ".
"(SELECT id_utilisateur FROM ".$ancienne_table_obs." ".
"WHERE mots_cles_texte LIKE '%".$mot_cle_texte_recherche."%')";
$nouveaux_mots_cles = $this->bdd->recupererTous($requete_nouveaux_mots_cle);
 
$mots_cles_indexes = array();
foreach($nouveaux_mots_cles as $mot_cle) {
$mots_cles_indexes[$mot_cle['id_utilisateur']][strtolower($mot_cle['mot_cle'])] = $mot_cle;
}
 
$liaisons_a_inserer = array();
$utilFoirax = 0;
$mcFoirax = 0;
470,7 → 487,7
$q2 = "DELETE FROM cel_mots_cles_images_liaison WHERE id_mot_cle = $idDoublon AND id_element_lie IN (" . implode(',', $idsImages) . ");";
$r2 = $this->bdd->requeter($q2);
}
 
// On convertit tous les doublons en cible
$q3 = "UPDATE cel_mots_cles_images_liaison SET id_mot_cle = $idCible WHERE id_mot_cle = $idDoublon;";
$r3 = $this->bdd->requeter($q3);
499,7 → 516,7
$q2 = "DELETE FROM cel_mots_cles_obs_liaison WHERE id_mot_cle = $idDoublon AND id_element_lie IN (" . implode(',', $idsObs) . ");";
$r2 = $this->bdd->requeter($q2);
}
 
// On convertit tous les doublons en cible
$q3 = "UPDATE cel_mots_cles_obs_liaison SET id_mot_cle = $idCible WHERE id_mot_cle = $idDoublon;";
$r3 = $this->bdd->requeter($q3);
560,16 → 577,16
}
echo "$aTraiter groupes ($mode) ont été réduits" . PHP_EOL;
}
 
private function reduireEtNormaliserMotsClesImages($util=null) {
$this->reduireEtNormaliserMotsCles('cel_arbre_mots_cles_images', 'chemin', 'images', $util);
}
 
private function reduireEtNormaliserMotsClesObs($util=null) {
$this->reduireEtNormaliserMotsCles('cel_arbre_mots_cles_obs', 'chemin', 'obs', $util);
}
private function reduireEtNormaliserMotsCles($table, $colonne, $mode = "images", $util=null) {
 
private function reduireEtNormaliserMotsCles($table, $colonne, $mode = "images", $util=null) {
echo "Suppression des accents dans la table $table, colonne $colonne ...";
$this->supprimerAccents($table, $colonne, $util);
echo "effectuée \n";
588,7 → 605,7
echo "Réduction de tous les mots clés $mode \n";
$req_utilisateurs = "SELECT DISTINCT id_utilisateur FROM ".$table;
$utilisateurs = $this->bdd->recupererTous($req_utilisateurs);
 
foreach($utilisateurs as $utilisateur) {
echo "Utilisateur en cours de traitement : ".$utilisateur['id_utilisateur']." \n";
if($mode == "images") {
600,17 → 617,17
}
echo "Fin de la réduction des mots clés $mode \n";
}
 
private function supprimerMajuscules($table, $colonne, $util=null) {
$requete = "UPDATE ".$table." SET ".$colonne." = LOWER(".$colonne.")";
if ($util !== null) {
$requete .= " WHERE id_utilisateur = $util";
}
$this->bdd->requeter($requete);
$this->bdd->requeter($requete);
}
 
private function supprimerAccents($table, $colonne, $util=null) {
 
$requetes = array(
"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'Š','S')",
"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'š','s')",
680,7 → 697,7
"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ÿ','y')",
"UPDATE ".$table." SET ".$colonne." = REPLACE(".$colonne.",'ƒ','f')",
);
 
foreach($requetes as $requete) {
if ($util !== null) {
$requete .= " WHERE id_utilisateur = $util";
688,5 → 705,4
$this->bdd->requeter($requete);
}
}
}
?>
}