1,10 → 1,12 |
<?php |
|
class MigrationImages extends Cel { |
|
const bdd_cel_migration = 'cel'; |
const bdd_utilisateurs = 'cel_old'; |
|
public static $bdd_cel_migration; |
public static $bdd_utilisateurs; |
|
const truncate = true; //Doit on vider les tables de destination ? |
|
const separateur_champs_metadonnees = ';'; |
const separateur_valeurs_metadonnees = ':'; |
|
16,7 → 18,7 |
*/ |
private static $avancement = array(); |
|
const dry_run = true; |
const dry_run = false; |
|
private $tableau_utilisateurs = array(); |
private $tableau_observations = array(); |
113,25 → 115,25 |
* @return void le message est affiché dans la console. |
*/ |
protected function afficherAvancement($message, $depart = 0) { |
if (! isset(self::$avancement[$message])) { |
self::$avancement[$message] = $depart; |
echo "$message : "; |
|
$actuel =& self::$avancement[$message]; |
echo $actuel++; |
} else { |
$actuel =& self::$avancement[$message]; |
|
// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères) |
$passage = 0; |
if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) { |
$passage = 1; |
if (! isset(self::$avancement[$message])) { |
self::$avancement[$message] = $depart; |
echo "$message : "; |
|
$actuel =& self::$avancement[$message]; |
echo $actuel++; |
} else { |
$actuel =& self::$avancement[$message]; |
|
// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères) |
$passage = 0; |
if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) { |
$passage = 1; |
} |
|
echo str_repeat(chr(8), (strlen((string) $actuel) - $passage)); |
echo $actuel++; |
} |
} |
|
echo str_repeat(chr(8), (strlen((string) $actuel) - $passage)); |
echo $actuel++; |
} |
} |
|
/** |
* Méthode appelée avec une requête de type GET. |
138,24 → 140,63 |
*/ |
public function getElement($params) { |
|
if(!isset($this->config['database_cel']['database_migration']) || $this->config['database_cel']['database_migration'] == '') { |
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"; |
exit; |
} |
|
if(!isset($this->config['database_ident']['database']) || $this->config['database_ident']['database'] == '') { |
echo 'Attention la variable de configuration database dans la section database_ident, contenant la base de données utilisateurs, doit être remplie '."\n"; |
exit; |
} |
|
self::$bdd_cel_migration = $this->config['database_cel']['database_migration']; |
self::$bdd_utilisateurs = $this->config['database_ident']['database']; |
|
$this->id_cle_metadonnees = array_merge($this->tableau_ids_tags_exif, $this->tableau_ids_tags_iptc); |
|
echo "--MIGRATION DES IMAGES --------------------------------------\n"; |
//1. TEMPORAIRE : vider les tables de destinations |
if (self::truncate) { |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 0. Vider les tables ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$nouvellesTables = array('`cel_images`', '`cel_obs_images`'); |
foreach ($nouvellesTables as $nomTable) { |
echo 'Vider la table '.$nomTable.'...'; |
$requeteTruncate = 'TRUNCATE TABLE '.self::$bdd_cel_migration.'.'.$nomTable; |
$resultatTruncate = $this->executerRequete($requeteTruncate); |
echo "ok \n"; |
} |
|
echo "\n---------------------------------------------------------------- OK\n\n"; |
} |
|
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 1. Paramétrage ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->getUtilisateurs(); |
$this->getMotsCles(); |
$this->getObservations(); |
|
echo '|| Migration des images ||'."\n"; |
//$this->migrerImages(); |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 2. Migration des images ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->migrerImages(); |
echo "\n"."\n"."\n"; |
|
echo '|| Migration des liaisons obs images ||'."\n"; |
$this->migrerLiaisonsObsImages(); |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 3. migration des liaisons obs images ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
//$this->migrerLiaisonsObsImages(); |
echo "\n"."\n"."\n"; |
} |
|
private function getUtilisateurs() { |
echo "\n-------------------------------------------------------------------\n"; |
echo "--SELECTION DES UTILISATEURS---------------------------------------\n\n"; |
|
$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'; |
$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'; |
$tableau_utilisateurs = $this->executerRequete($requete_selection_utilisateurs); |
|
foreach( $tableau_utilisateurs as &$utilisateur) { |
162,19 → 203,28 |
$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur; |
} |
|
echo sizeof($this->tableau_utilisateurs)." utilisateurs sélectionnés"; |
echo "\n-----------------------------------------------------------------OK\n"; |
} |
|
private function getMotsCles() { |
echo "\n-------------------------------------------------------------------\n"; |
echo "--SELECTION DES MOTS-CLES -----------------------------------------\n\n"; |
|
$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'; |
$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'; |
$tableau_mots_cles = $this->executerRequete($requete_selection_mots_cles); |
|
foreach($tableau_mots_cles as &$mot_cle) { |
foreach( $tableau_mots_cles as &$mot_cle) { |
$this->tableau_mots_cles[$mot_cle['id_utilisateur']][$mot_cle['id_mot_cle']] = $mot_cle; |
} |
|
echo sizeof($this->tableau_mots_cles)." mots-clés sélectionnés"; |
echo "\n-----------------------------------------------------------------OK\n"; |
|
} |
|
private function getObservations() { |
|
$pas = 5000; |
|
$nObs = "SELECT COUNT(*) AS nb FROM cel_inventory"; |
188,12 → 238,10 |
$this->tableau_observations[$obs['identifiant']][$obs['ordre']] = $obs['id']; |
} |
|
//$this->afficherAvancement('Selection des observations (par '.$pas.' )', $i); |
echo "\n obs : ".$i; |
$this->afficherAvancement('Selection des observations (par '.$pas.' )', $nbObs); |
} |
|
|
|
echo "\n\n"; |
} |
|
public function executerRequeteSimple($requete) { |
212,13 → 260,18 |
$pas = 200; |
$fin = 150000; |
|
//Selectionner le nombre d'images |
$requeteNbImg = "SELECT COUNT(*) as nb FROM cel_images"; |
$resultatNbImg = $this->executerRequete($requeteNbImg); |
$fin = $resultatNbImg[0]['nb']; |
|
for ($i = $debut; $i <= $fin ; $i += $pas) { |
$requete_selection_images = 'SELECT * FROM cel_images '. |
'ORDER BY ci_id_image ASC LIMIT '.$i.','.$pas; |
|
$images = $this->requeter($requete_selection_images); |
$images = @$this->requeter($requete_selection_images); |
|
$requete_insertion_images = 'INSERT INTO '.self::bdd_cel_migration.'.cel_images ('; |
$requete_insertion_images = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_images ('; |
foreach ($this->tableau_nouveau_ancien as $nouveau_champ => $ancien_champ) { |
$requete_insertion_images .= $nouveau_champ.','; |
} |
244,12 → 297,12 |
if (!$migration_images) { |
echo 'la migration des images '.$i.' à '.($i+$nb_images_a_traiter).' a échoué '."\n"; |
} else { |
echo 'migration des images '.$i.' à '.($i+$nb_images_a_traiter).' effectuée '."\n"; |
$this->afficherAvancement('Migration des images (par '.$pas.' )', $fin); |
} |
} |
|
if(count($images) < $pas) { |
echo 'Fin de la migration des images '."\n"; |
echo "\n---------------------------------------------------------------- OK\n\n"; |
return; |
} |
} |
257,54 → 310,73 |
|
private function migrerLiaisonsObsImages() { |
$debut = 0; |
$pas = 200; |
$pas = 500; |
$fin = 50000; |
|
$liaisons_obs_inexistantes = 0; |
|
//Selectionner le nombre de liaisons |
$requeteNbImgObs = "SELECT COUNT(*) as nb FROM cel_obs_images"; |
$resultatNbImgObs = $this->executerRequete($requeteNbImgObs); |
$fin = $resultatNbImgObs[0]['nb']; |
|
for ($i = $debut; $i <= $fin ; $i += $pas) { |
|
if($i > $fin) { |
$i = $fin; |
} |
|
$requete_selection_liaisons = 'SELECT * FROM cel_obs_images LIMIT '.$i.','.$pas; |
$tableau_liaisons = $this->executerRequete($requete_selection_liaisons); |
|
$requete_migration_liaison = 'INSERT INTO '.self::bdd_cel_migration.'.cel_obs_images '. |
'(ce_image, ce_utilisateur, ce_observation, date_liaison) '. |
$requete_migration_liaison = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_obs_images '. |
'(id_image, id_utilisateur, id_observation, date_liaison) '. |
'VALUES '; |
|
$sous_requete_insertion = ''; |
|
foreach($tableau_liaisons as &$liaison) { |
if(is_array($tableau_liaisons)) { |
foreach($tableau_liaisons as &$liaison) { |
|
$mail_utilisateur = $liaison['coi_ce_utilisateur']; |
$utilisateur = $mail_utilisateur; |
|
$mail_utilisateur = $liaison['coi_ce_utilisateur']; |
$utilisateur = $mail_utilisateur; |
|
if (isset($this->tableau_utilisateurs[$mail_utilisateur])) { |
$utilisateur = $this->tableau_utilisateurs[$mail_utilisateur]['id']; |
if (isset($this->tableau_utilisateurs[$mail_utilisateur])) { |
$utilisateur = $this->tableau_utilisateurs[$mail_utilisateur]['id']; |
} |
|
$id_obs = $liaison['coi_ce_observation']; |
|
if (isset($this->tableau_observations[$mail_utilisateur][$id_obs])) { |
$id_obs = $this->tableau_observations[$mail_utilisateur][$id_obs]; |
|
$sous_requete_insertion .= '('.$this->proteger($liaison['coi_ce_image']).','. |
$this->proteger($utilisateur).','. |
$this->proteger($id_obs).','. |
$this->proteger($liaison['coi_date_liaison']). |
'),'; |
} else { |
// cas d'une observation inexistante, la liaison est ignorée |
$liaisons_obs_inexistantes++; |
} |
} |
|
$id_obs = $liaison['coi_ce_observation']; |
|
if (isset($this->tableau_observations[$mail_utilisateur][$id_obs])) { |
$id_obs = $this->tableau_observations[$mail_utilisateur][$id_obs]; |
|
$sous_requete_insertion .= '('.$this->proteger($liaison['coi_ce_image']).','. |
$this->proteger($utilisateur).','. |
$this->proteger($id_obs).','. |
$this->proteger($liaison['coi_date_liaison']). |
'),'; |
$sous_requete_insertion = rtrim($sous_requete_insertion,','); |
$requete_migration_liaison = $requete_migration_liaison.$sous_requete_insertion; |
|
$migration_liaison = $this->executerRequeteSimple($requete_migration_liaison); |
|
if (!$migration_liaison) { |
echo 'la migration des liaisons obs images de '.$i.' à '.($i+$pas).' a échoué ! '."\n<br />"; |
} else { |
echo 'l\'obs '.$id_obs.' n\'existe pas pour l\'utilisateur '.$mail_utilisateur."\n"; |
} |
$this->afficherAvancement('Migration des liaisons obs images (par '.$pas.' )', $fin); |
} |
} |
|
$sous_requete_insertion = rtrim($sous_requete_insertion,','); |
$requete_migration_liaison = $requete_migration_liaison.$sous_requete_insertion; |
|
$migration_liaison = $this->executerRequeteSimple($requete_migration_liaison); |
|
if (!$migration_liaison) { |
echo 'la migration des liaisons obs images a échoué ! '; |
} else { |
echo 'migration des liaisons obs images réussie '; |
} |
} |
echo "\n\n"; |
echo $liaisons_obs_inexistantes ? $liaisons_obs_inexistantes." liaisons image obs ont été ignorées car les obs sont absentes" : '' ; |
echo "\n"; |
echo "\n---------------------------------------------------------------- OK\n\n"; |
} |
|
private function traiterLigneImage($image) { |
373,7 → 445,9 |
} else { |
// on met le mot clé dans sa propre case afin d'éviter |
// facilement les doublons provoqués par de mauvais formatages |
$tableau_mots_cles_formates[$mot_cle] = $this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle']; |
if(isset($this->tableau_mots_cles[$utilisateur][$mot_cle])) { |
$tableau_mots_cles_formates[$mot_cle] = $this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle']; |
} |
} |
|
} |
445,7 → 519,7 |
|
$xml = ''; |
|
/*foreach($tableau as $cle => $valeur) { |
foreach($tableau as $cle => $valeur) { |
|
$cle = str_replace('ci_meta_exif_','',$cle); |
$cle = str_replace('ci_meta_iptc_','',$cle); |
453,8 → 527,9 |
$cle = str_replace('_',' ',$cle); |
$cle = str_replace(' ','',ucwords($cle)); |
$valeur = str_replace("\0",'',$valeur); |
$xml .= '<'.$cle.' id="'.$this->id_cle_metadonnees[$cle].'">'.$valeur.'</'.$cle.'>'."\n"; |
}*/ |
$id = isset($this->id_cle_metadonnees[$cle]) ? $this->id_cle_metadonnees[$cle] : $cle; |
$xml .= '<'.$cle.' id="'.$id.'">'.$valeur.'</'.$cle.'>'."\n"; |
} |
|
return $xml; |
} |
566,6 → 641,7 |
private function traiterXmp($ligne_image) { |
|
$chemin = $this->obtenirCheminImageOriginale($ligne_image['ci_id_image']); |
// TODO décommenté car pour le moment ça n'est pas necessaire, à éxécuter à part |
//$res = $this->decoderMetadonneesExifTool($chemin); |
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'; |
$xml .= '<xmp>'; |