Subversion Repositories eFlore/Applications.cel

Rev

Rev 1110 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php

/**

 Aurelien Peronnet aurelienperonnet@gmail.com 2008

 Ce logiciel est r?gi par la licence CeCILL soumise au droit fran?ais et
 respectant les principes de diffusion des logiciels libres. Vous pouvez
 utiliser, modifier et/ou redistribuer ce programme sous les conditions
 de la licence CeCILL telle que diffus?e par le CEA, le CNRS et l'INRIA
 sur le site "http://www.cecill.info".
 En contrepartie de l'accessibilit? au code source et des droits de copie,
 de modification et de redistribution accord?s par cette licence, il n'est
 offert aux utilisateurs qu'une garantie limit?e.  Pour les m?mes raisons,
 seule une responsabilit? restreinte p?se sur l'auteur du programme,  le
 titulaire des droits patrimoniaux et les conc?dants successifs.

 A cet ?gard  l'attention de l'utilisateur est attir?e sur les risques
 associ?s au chargement,  ? l'utilisation,  ? la modification et/ou au
 d?veloppement et ? la reproduction du logiciel par l'utilisateur ?tant
 donn? sa sp?cificit? de logiciel libre, qui peut le rendre complexe ?
 manipuler et qui le r?serve donc ? des d?veloppeurs et des professionnels
 avertis poss?dant  des  connaissances  informatiques approfondies.  Les
 utilisateurs sont donc invit?s ? charger  et  tester  l'ad?quation  du
 logiciel ? leurs besoins dans des conditions permettant d'assurer la
 s?curit? de leurs syst?mes et ou de leurs donn?es et, plus g?n?ralement,
 ? l'utiliser et l'exploiter dans les m?mes conditions de s?curit?.

 Le fait que vous puissiez acc?der ? cet en-t?te signifie que vous avez
 pris connaissance de la licence CeCILL, et que vous en avez accept? les
 termes.

 */


// in : utf8
// out : utf8
/*
 * InventoryKeyWordList.php
 *
 * Cas d'utilisation :
 * Service recherche et modifie l'arbre des mots cl�s associ�s � un id
 *
 * 1: Le service recoit un mot cl� � ajouter � l'arbre
 * 2: Le service recherche l'arbre ou sous arbre correspondant au crit�res demand�
 * 3: Le service renvoie l'arbre au format json
 */

 Class InventoryKeyWordList extends DBAccessor {

        var $config ;

        protected $suffix = "";

        function InventoryKeyWordList($config) {

                $this->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
                if(!isset($_SESSION)) {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: application/json") ;
                        print $res ;
                        exit() ;
                }
        }

        // met � jour les mots clés d'une image
        function updateElement($uid,$pairs)
        {
                // Controle detournement utilisateur
                if(!isset($_SESSION)) {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(mb_strtolower($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
                if(!isset($_SESSION)) {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() ;
                }
                else
                {
                        $this->reactiverAutoCommitEtAnnulerTransaction() ;
                }

        }

        function deleteElement($uid){

                if(!isset($_SESSION)) {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() ;
                }
        }

 }
?>