config=$config; } function verifierPresenceRacine($id) { $DB=$this->connectDB($this->config,'cel_db'); $query = 'SELECT COUNT(*) FROM cel_mots_cles'.$this->suffix.' WHERE cmc_id_proprietaire = "'.$DB->escapeSimple($id).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); } else { $valeurs = $res->fetchrow(DB_FETCHMODE_ORDERED) ; switch ($this->suffix) { case "_obs": $nom_racine = 'Projets'; $id_racine = 'racine_obs'; break; case "_images": $nom_racine = 'Mots clés'; $id_racine = 'racine'; break; default: $nom_racine = $this->suffix; $id_racine = $this->suffix; } if($valeurs[0] == 0) { $query = 'INSERT INTO cel_mots_cles'.$this->suffix.' VALUES ("'.$nom_racine.'",1,2,"'.$id_racine.'","'.$id_racine.'","'.$DB->escapeSimple($id).'","",0) ' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); } } } } function desactiverAutoCommitEtCommencerTransaction() { $DB=$this->connectDB($this->config,'cel_db'); // desactive l'autocommit le temps de la maniulation de l'arbre $query = "SET AUTOCOMMIT = 0" ; $res =& $DB->query($query); // et debute une nouvelle transaction $query = "BEGIN " ; $res =& $DB->query($query); } function reactiverAutoCommitEtCompleterTransaction() { $DB=$this->connectDB($this->config,'cel_db'); // complete la transaction $query = "COMMIT " ; $res =& $DB->query($query); // reactive l'autocommit le temps de la maniulation de l'arbre $query = "SET AUTOCOMMIT = 1" ; $res =& $DB->query($query); echo "OK" ; } function reactiverAutoCommitEtAnnulerTransaction() { $DB=$this->connectDB($this->config,'cel_db'); // annule la transaction $query = "ROLLBACK " ; $res =& $DB->query($query); // reactive l'autocommit le temps de la maniulation de l'arbre $query = "SET AUTOCOMMIT = 1" ; $res =& $DB->query($query); echo "ERROR" ; } // renvoie les bornes d'un noeud de l'arbre des mots cl�s function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) { $DB=$this->connectDB($this->config,'cel_db'); $query = 'SELECT cmc_bd, cmc_bg, cmc_niveau FROM cel_mots_cles'.$this->suffix.' WHERE cmc_id_mot_cle_utilisateur = "'.$DB->escapeSimple($id_mot_cle).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); } $results = array() ; $valeurs = $res->fetchrow(DB_FETCHMODE_ASSOC) ; return $valeurs ; } // decale les bornes de deux pour inserer un nouvel element function decalerBornesPlusDeux($valeur,$id_utilisateur) { $DB=$this->connectDB($this->config,'cel_db'); // decalage borne droite $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bd = cmc_bd + 2 WHERE cmc_bd >= "'.$DB->escapeSimple($valeur).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); $reussi_1 = false ; } else { $reussi_1 = true ; } // decalage borne gauche $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bg = cmc_bg + 2 WHERE cmc_bg >= "'.$DB->escapeSimple($valeur).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); $reussi_2 = false ; } else { $reussi_2 = true ; } $reussi = $reussi_1 && $reussi_2 ; return $reussi ; } // decale les bornes d'un intervalle negatif donne (pour la suppression d'un sous arbre) function decalerBornesMoinsIntervalle($bg, $bd,$id_utilisateur) { $DB=$this->connectDB($this->config,'cel_db'); $decalage = $bd - $bg + 1 ; // decalage borne droite $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bd = cmc_bd - "'.$DB->escapeSimple($decalage).'" WHERE cmc_bd >= "'.$DB->escapeSimple($bg).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); $reussi_1 = false ; } else { $reussi_1 = true ; } // decalage borne gauche $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bg = cmc_bg - "'.$DB->escapeSimple($decalage).'" WHERE cmc_bg > "'.$DB->escapeSimple($bg).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); $reussi_2 = false ; } else { $reussi_2 = true ; } $reussi = $reussi_1 && $reussi_2 ; return $reussi ; } // decale � droite des bornes don�es d'un intervalle positif donne (pour l'ajout d'un sous arbre) function decalerBornesPlusIntervalle($valeur_bornes, $largeur,$id_utilisateur) { $DB=$this->connectDB($this->config,'cel_db'); $decalage = $largeur ; // decalage borne droite $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bd = cmc_bd + "'.$DB->escapeSimple($decalage).'" WHERE cmc_bd >= "'.$DB->escapeSimple($valeur_bornes).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); $reussi_1 = false ; } else { $reussi_1 = true ; } // decalage borne gauche $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bg = cmc_bg + "'.$DB->escapeSimple($decalage).'" WHERE cmc_bg >= "'.$DB->escapeSimple($valeur_bornes).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); $reussi_2 = false ; } else { $reussi_2 = true ; } $reussi = $reussi_1 && $reussi_2 ; return $reussi ; } // inverse les bornes dun intervalle pour l'exclure des modifications sur l'arbre sans changer la hierarchie function exclureIntervalle($bg, $bd, $id_utilisateur) { $DB=$this->connectDB($this->config,'cel_db'); // decalage bornes $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bd = cmc_bd - "'.$DB->escapeSimple($bd).'" - 1 , cmc_bg = cmc_bg - "'.$DB->escapeSimple($bd).'" - 1 WHERE cmc_bd <= "'.$DB->escapeSimple($bd).'" AND cmc_bg >= "'.$DB->escapeSimple($bg).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); return false ; } else { return true ; } } // recale les bornes dun intervalle pour l'inclure dans l'arbre � la bonne place function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) { $DB=$this->connectDB($this->config,'cel_db'); // decalage borne droite $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_bg = cmc_bg + "'.$DB->escapeSimple($decalage).'" , cmc_bd = cmc_bd + "'.$DB->escapeSimple($decalage).'", cmc_niveau = cmc_niveau + "'.$modif_niveau.'" WHERE cmc_bg >= "'.$DB->escapeSimple($bg).'" AND cmc_bd <= "'.$DB->escapeSimple($bd).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); return false ; } else { return true ; } } function changerPere($id_mot_cle, $id_pere, $id_utilisateur) { $DB=$this->connectDB($this->config,'cel_db'); $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_id_parent = "'.$DB->escapeSimple($id_pere).'" WHERE cmc_id_mot_cle_utilisateur = "'.$DB->escapeSimple($id_mot_cle).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); return false ; } else { return true ; } } function getElement($uid) { // Controle detournement utilisateur session_start(); $this->controleUtilisateur($uid[1]); $DB=$this->connectDB($this->config,'cel_db'); $this->suffix = '_'.$uid[0]; $id_utilisateur = $uid[1] ; $query = 'SELECT cmc_mot_cle, cmc_id_mot_cle_utilisateur, cmc_id_parent FROM cel_mots_cles'.$this->suffix.' WHERE cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'" ORDER BY cmc_niveau' ; $result = array() ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); } else { while($motcle = $res->fetchrow(DB_FETCHMODE_ASSOC)) { $result[] = $motcle ; } $res = json_encode($result) ; header("content-type: text/json") ; print $res ; exit() ; } } // met � jour les mots clés d'une image function updateElement($uid,$pairs) { // Controle detournement utilisateur session_start(); $this->controleUtilisateur($uid[1]); $this->suffix = '_'.$uid[0]; $id_utilisateur = $uid[1] ; $id_mot_cle = $pairs['id'] ; $action = $pairs['action'] ; if($action == 'modification') { $nouveau_nom = $pairs['motcle'] ; $nouvel_id_general = md5($nouveau_nom) ; $DB=$this->connectDB($this->config,'cel_db'); $query = 'UPDATE cel_mots_cles'.$this->suffix.' SET cmc_mot_cle = "'.$DB->escapeSimple($nouveau_nom).'" , cmc_id_mot_cle_general = "'.$DB->escapeSimple($nouvel_id_general).'" WHERE cmc_id_mot_cle_utilisateur = "'.$DB->escapeSimple($id_mot_cle).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); $transaction_reussie_1 = false ; } else { $transaction_reussie_1 = true ; echo "OK" ; } } if($action == 'deplacement') { $this->desactiverAutoCommitEtCommencerTransaction() ; $transaction_reussie_1 = true ; $id_pere = $pairs['parent'] ; $bornes = $this->calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) ; $bg = $bornes['cmc_bg'] ; $bd = $bornes['cmc_bd'] ; $niveau = $bornes['cmc_niveau'] ; // on inverse l'intervalle de l'�l�ment d�plac� et du sous arbre if($this->exclureIntervalle($bg,$bd,$id_utilisateur)) { $transaction_reussie_2 = true ; } else { $transaction_reussie_2 = false ; } $bg_negative = $bg - $bd - 1 ; $bd_negative = $bd - $bd - 1 ; // on recalcule les intervalles de l'arbre priv� de ce sous arbre if($this->decalerBornesMoinsIntervalle($bg,$bd,$id_utilisateur)) { $transaction_reussie_3 = true ; } else { $transaction_reussie_3 = false ; } $bornes_pere = $this->calculerBornesEtNiveau($id_pere,$id_utilisateur) ; $bg_pere = $bornes_pere['cmc_bg'] ; $bd_pere = $bornes_pere['cmc_bd'] ; $niveau_pere = $bornes_pere['cmc_niveau'] ; $decalage = $bd - $bg + 1 ; // on decale les bornes droite du pere pour pr�parer l'insertion if($this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur)) { $transaction_reussie_4 = true ; } else { $transaction_reussie_4 = false ; } $nouvelle_bd = $bd_pere + $decalage ; $modif_niveau = $niveau_pere - $niveau + 1 ; if($this->inclureIntervalle($bg_negative,$bd_negative,$nouvelle_bd,$modif_niveau,$id_utilisateur)) { $transaction_reussie_5 = true ; } else { $transaction_reussie_5 = false ; } if($this->changerPere($id_mot_cle,$id_pere,$id_utilisateur)) { $transaction_reussie_6 = true ; } else { $transaction_reussie_6 = false ; } if($transaction_reussie_1 && $transaction_reussie_2 && $transaction_reussie_3 && $transaction_reussie_4 && $transaction_reussie_5 && $transaction_reussie_6) { $this->reactiverAutoCommitEtCompleterTransaction() ; } else { $this->reactiverAutoCommitEtAnnulerTransaction() ; } } } function createElement($pairs) { // Controle detournement utilisateur session_start(); $this->controleUtilisateur($pairs['identifiant']); $this->suffix = '_'.$pairs['mode']; $id_utilisateur = $pairs['identifiant'] ; $mot_cle = $pairs['motcle'] ; // TODO supprimer accents et majuscules $id_mot_cle_general = md5(mb_strtolower($mot_cle)) ; $id_mot_cle = $pairs['id'] ; $id_parent = $pairs['parent'] ; $this->verifierPresenceRacine($id_utilisateur) ; $transaction_reussie = false ; $this->desactiverAutoCommitEtCommencerTransaction() ; $bornes = $this->calculerBornesEtNiveau($id_parent,$id_utilisateur) ; $bg = $bornes['cmc_bd'] ; $bd = $bg + 1 ; $borne_pere = $bornes['cmc_bd'] ; $niveau = $bornes['cmc_niveau'] + 1; if($this->decalerBornesPlusDeux($borne_pere,$id_utilisateur)) { $transaction_reussie_1 = true ; } else { $transaction_reussie_1 = false ; } $DB=$this->connectDB($this->config,'cel_db'); $query = 'INSERT INTO cel_mots_cles'.$this->suffix.' VALUES (' ; $query .= '"'.$DB->escapeSimple($mot_cle).'",' ; $query .= '"'.$DB->escapeSimple($bg).'",' ; $query .= '"'.$DB->escapeSimple($bd).'",' ; $query .= '"'.$DB->escapeSimple($id_mot_cle_general).'",' ; $query .= '"'.$DB->escapeSimple($id_mot_cle).'",' ; $query .= '"'.$DB->escapeSimple($id_utilisateur).'",' ; $query .= '"'.$DB->escapeSimple($id_parent).'",' ; $query .= '"'.$DB->escapeSimple($niveau).'"' ; $query .= ')' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); $transaction_reussie_2 = false ; } else { $transaction_reussie_2 = true ; } if($transaction_reussie_1 && $transaction_reussie_2) { $this->reactiverAutoCommitEtCompleterTransaction() ; echo "OK" ; } else { $this->reactiverAutoCommitEtAnnulerTransaction() ; } } function deleteElement($uid){ session_start(); $this->controleUtilisateur($uid[1]); $this->suffix = '_'.$uid[0]; $DB=$this->connectDB($this->config,'cel_db'); $this->desactiverAutoCommitEtCommencerTransaction() ; $id_mot_cle= $uid[2] ; $id_utilisateur = $uid[1] ; $bornes = $this->calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) ; $bg = $bornes['cmc_bg'] ; $bd = $bornes['cmc_bd'] ; $query = 'DELETE FROM cel_mots_cles'.$this->suffix.' WHERE cmc_bg >= "'.$DB->escapeSimple($bg).'" AND cmc_bd <= "'.$DB->escapeSimple($bd).'" AND cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'"' ; $res =& $DB->query($query); if (PEAR::isError($res)) { die($res->getMessage()); $transaction_reussie_1 = false ; } else { if($DB->affectedRows() <= 0) { $transaction_reussie_1 = false ; } else { $transaction_reussie_1 = true ; } } if($this->decalerBornesMoinsIntervalle($bg,$bd, $id_utilisateur)) { $transaction_reussie_2 = true ; } else { $transaction_reussie_2 = false ; } if($transaction_reussie_1 && $transaction_reussie_2) { $this->reactiverAutoCommitEtCompleterTransaction() ; } else { $this->reactiverAutoCommitEtAnnulerTransaction() ; } } } ?>