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); |
} |
} |
} |
?> |
} |