Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 820 → Rev 821

/trunk/jrest/services/InventoryKeyWordList.php
1,630 → 1,426
<?php
 
// declare(encoding='UTF-8');
/**
 
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
* Service de recherche et modification de 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
*
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* 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
* @author Aurélien 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>
* @version $Id$
* @copyright © 2011, Tela-Botanica
*/
class InventoryKeyWordList extends DBAccessor {
public $config ;
protected $suffix = '';
 
Class InventoryKeyWordList extends DBAccessor {
 
var $config ;
 
protected $suffix = "";
 
function InventoryKeyWordList($config) {
 
$this->config=$config;
public 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;
public function getElement($uid) {
// Controle detournement utilisateur
session_start();
$this->suffix = '_'.$uid[0];
$id_utilisateur = $uid[1] ;
$this->controleUtilisateur($uid[1]);
$requete = '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 ';
$resultat = $this->recupererResultat($requete);
if ($resultat) {
$mots_cles = array();
while($mot_cle = $resultat->fetchrow(DB_FETCHMODE_ASSOC)) {
$mots_cles[] = $mot_cle;
}
$infos = json_encode($mots_cles);
 
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());
}
}
header('content-type: text/json');
print $infos;
exit();
}
}
 
function desactiverAutoCommitEtCommencerTransaction()
{
$DB=$this->connectDB($this->config,'cel_db');
public function updateElement($uid, $pairs) {
session_start();
$this->suffix = '_'.$uid[0];
$id_utilisateur = $uid[1];
$this->controleUtilisateur($uid[1]);
 
// desactive l'autocommit le temps de la maniulation de l'arbre
$query = "SET AUTOCOMMIT = 0" ;
$res =& $DB->query($query);
$id_mot_cle = $pairs['id'];
$action = $pairs['action'];
 
// et debute une nouvelle transaction
$query = "BEGIN " ;
$res =& $DB->query($query);
}
if ($action == 'modification') {
$nouveau_nom = $pairs['motcle'];
$nouvel_id_general = md5(strtolower($nouveau_nom));
 
function reactiverAutoCommitEtCompleterTransaction()
{
$DB=$this->connectDB($this->config,'cel_db');
$requete = '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).'"' ;
$reussite = $this->executerRequete($requete);
if ($reussite) {
echo 'OK';
}
} else if ($action == 'deplacement') {
$this->commencerTransaction();
 
// complete la transaction
$query = "COMMIT " ;
$res =& $DB->query($query);
$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'];
 
// reactive l'autocommit le temps de la maniulation de l'arbre
$query = "SET AUTOCOMMIT = 1" ;
$res =& $DB->query($query);
// on inverse l'intervalle de l'élément déplacé et du sous arbre
$transaction_reussie_2 = $this->exclureIntervalle($bg, $bd, $id_utilisateur) ? true : false;
 
echo "OK" ;
}
$bg_negative = $bg - $bd - 1;
$bd_negative = $bd - $bd - 1;
 
function reactiverAutoCommitEtAnnulerTransaction()
{
$DB=$this->connectDB($this->config,'cel_db');
// on recalcule les intervalles de l'arbre privé de ce sous arbre
$transaction_reussie_3 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
 
// annule la transaction
$query = "ROLLBACK " ;
$res =& $DB->query($query);
$bornes_pere = $this->calculerBornesEtNiveau($id_pere, $id_utilisateur);
$bg_pere = $bornes_pere['cmc_bg'];
$bd_pere = $bornes_pere['cmc_bd'];
 
// reactive l'autocommit le temps de la maniulation de l'arbre
$query = "SET AUTOCOMMIT = 1" ;
$res =& $DB->query($query);
$niveau_pere = $bornes_pere['cmc_niveau'];
 
echo "ERROR" ;
}
$decalage = $bd - $bg + 1;
 
// 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');
// on decale les bornes droite du pere pour préparer l'insertion
$transaction_reussie_4 = $this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur) ? true : false;
$nouvelle_bd = $bd_pere + $decalage;
$modif_niveau = $niveau_pere - $niveau + 1;
 
$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).'"' ;
$transaction_reussie_5 = $this->inclureIntervalle($bg_negative, $bd_negative, $nouvelle_bd, $modif_niveau, $id_utilisateur) ? true : false;
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
$transaction_reussie_6 = $this->changerPere($id_mot_cle, $id_pere, $id_utilisateur) ? true : false;
 
die($res->getMessage());
}
if ($transaction_reussie_1 && $transaction_reussie_2 && $transaction_reussie_3 && $transaction_reussie_4 && $transaction_reussie_5 && $transaction_reussie_6) {
$this->completerTransaction();
} else {
$this->annulerTransaction();
}
 
$results = array() ;
$valeurs = $res->fetchrow(DB_FETCHMODE_ASSOC) ;
}
}
 
public function createElement($pairs) {
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($pairs['identifiant']);
 
return $valeurs ;
$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'];
 
// decale les bornes de deux pour inserer un nouvel element
function decalerBornesPlusDeux($valeur,$id_utilisateur)
{
$DB=$this->connectDB($this->config,'cel_db');
$this->ajouterMotCleRacine($id_utilisateur);
 
// 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)) {
$this->commencerTransaction();
 
die($res->getMessage());
$reussi_1 = false ;
}
else
{
$reussi_1 = true ;
}
$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur);
$borne_pere = $bornes['cmc_bd'];
$niveau = $bornes['cmc_niveau'] + 1;
$bg = $bornes['cmc_bd'];
$bd = $bg + 1;
 
// 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)) {
$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false;
$requete = 'INSERT INTO cel_mots_cles'.$this->suffix.' '.
'VALUES ( '.
'"'.$DB->escapeSimple($mot_cle).'", '.
'"'.$DB->escapeSimple($bg).'", '.
'"'.$DB->escapeSimple($bd).'", '.
'"'.$DB->escapeSimple($id_mot_cle_general).'", '.
'"'.$DB->escapeSimple($id_mot_cle).'", '.
'"'.$DB->escapeSimple($id_utilisateur).'", '.
'"'.$DB->escapeSimple($id_parent).'", '.
'"'.$DB->escapeSimple($niveau).'" )' ;
$transaction_reussie_2 = $this->executerRequete($requete);
 
die($res->getMessage());
$reussi_2 = false ;
}
else
{
$reussi_2 = true ;
if ($transaction_reussie_1 && $transaction_reussie_2) {
$this->completerTransaction();
echo 'OK';
} else {
$this->annulerTransaction();
}
 
$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');
public function deleteElement($uid) {
session_start();
$this->suffix = '_'.$uid[0];
$id_utilisateur = $uid[1];
$id_mot_cle = $uid[2];
 
$this->controleUtilisateur($id_utilisateur);
$this->commencerTransaction();
 
$decalage = $bd - $bg + 1 ;
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
$bg = $bornes['cmc_bg'];
$bd = $bornes['cmc_bd'];
 
// 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)) {
$requete = '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).'" ';
$transaction_reussie_1 = $this->verifierLignesAffectees($requete);
 
die($res->getMessage());
$reussi_1 = false ;
}
else
{
$reussi_1 = true ;
}
$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
 
// 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 ;
if ($transaction_reussie_1 && $transaction_reussie_2) {
$this->completerTransaction();
} else {
$this->annulerTransaction();
}
 
$reussi = $reussi_1 && $reussi_2 ;
 
return $reussi ;
}
private function ajouterMotCleRacine($id) {
$requete = 'SELECT COUNT(*) '.
'FROM cel_mots_cles'.$this->suffix.' '.
'WHERE cmc_id_proprietaire = "'.$DB->escapeSimple($id).'" ';
$resultat = $this->recupererResultat($requete);
 
// 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');
if ($resultat) {
$valeurs = $resultat->fetchrow(DB_FETCHMODE_ORDERED);
 
$decalage = $largeur ;
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;
}
 
// 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 ;
if ($valeurs[0] == 0) {
$requete = 'INSERT INTO cel_mots_cles'.$this->suffix.' '.
'VALUES ("'.$nom_racine.'", 1, 2, "'.$id_racine.'", "'.$id_racine.'", "'.$DB->escapeSimple($id).'", "", 0) ';
$this->executerRequete($requete);
}
}
}
 
// 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)) {
/**
* Désactive l'auto-commit puis débute la transaction
*/
private function commencerTransaction() {
// Désactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 0 ';
$reussite_autocommit = $this->executerRequete($requete);
 
die($res->getMessage());
$reussi_2 = false ;
}
else
{
$reussi_2 = true ;
}
 
$reussi = $reussi_1 && $reussi_2 ;
 
return $reussi ;
// Débute une nouvelle transaction
$requete = 'BEGIN ';
$reussite_begin = $this->executerRequete($requete);
}
 
// 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');
/**
* Termine la transaction puis réactive l'auto-commit
*/
private function completerTransaction() {
// Complète la transaction
$requete = 'COMMIT ';
$reussite_commit = $this->executerRequete($requete);
 
// 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).'"' ;
// Réactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = $this->executerRequete($requete);
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
return false ;
}
else
{
return true ;
}
echo 'OK';
}
/**
* Annule la transaction et réactive l'auto-commit
*/
private function annulerTransaction() {
// Annule la transaction
$requete = 'ROLLBACK ';
$reussite_rollback = $this->executerRequete($requete);
 
// 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');
// Réactive l'autocommit le temps de la manipulation de l'arbre
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = $this->executerRequete($requete);
 
// 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).'"' ;
echo 'ERROR';
}
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
/**
* Renvoie les bornes d'un noeud de l'arbre des mots clés
*/
private function calculerBornesEtNiveau($id_mot_cle,$id_utilisateur) {
$requete = '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).'" ';
$resultat = $this->recupererResultat($requete);
$valeurs = $resultat->fetchrow(DB_FETCHMODE_ASSOC);
return $valeurs;
}
 
die($res->getMessage());
return false ;
}
else
{
return true ;
}
/**
* Décale les bornes de deux pour insérer un nouvel élément
*/
private function decalerBornesPlusDeux($valeur, $id_utilisateur) {
// Décalage borne droite
$requete = '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).'" ';
$reussi_1 = $this->executerRequete($requete);
// Décalage borne gauche
$requete = '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).'" ';
$reussi_2 = $this->executerRequete($requete);
return $reussi_1 && $reussi_2;
}
 
function changerPere($id_mot_cle, $id_pere, $id_utilisateur)
{
$DB=$this->connectDB($this->config,'cel_db');
/**
* Décale les bornes d'un intervalle negatif donne (pour la suppression d'un sous arbre).
*/
private function decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) {
$decalage = $bd - $bg + 1;
 
$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).'"' ;
// Décalage borne droite
$requete = '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).'" ';
$reussi_1 = $this->executerRequete($requete);
 
$res =& $DB->query($query);
if (PEAR::isError($res)) {
 
die($res->getMessage());
return false ;
}
else
{
return true ;
}
// Décalage borne gauche
$requete = '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).'" ';
$reussi_2 = $this->executerRequete($requete);
return $reussi_1 && $reussi_2;
}
 
function getElement($uid)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[1]);
$DB=$this->connectDB($this->config,'cel_db');
/**
* Décale à droite des bornes donées d'un intervalle positif donne (pour l'ajout d'un sous arbre).
*/
private function decalerBornesPlusIntervalle($valeur_bornes, $largeur, $id_utilisateur) {
$decalage = $largeur;
 
$this->suffix = '_'.$uid[0];
$id_utilisateur = $uid[1] ;
// decalage borne droite
$requete = '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).'" ';
$reussi_1 = $this->executerRequete($requete);
 
$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' ;
// decalage borne gauche
$requete = '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).'" ';
$reussi_2 = $this->executerRequete($requete);
 
$result = array() ;
return $reussi_1 && $reussi_2;
}
 
$res =& $DB->query($query);
if (PEAR::isError($res))
{
die($res->getMessage());
}
else
{
while($motcle = $res->fetchrow(DB_FETCHMODE_ASSOC))
{
$result[] = $motcle ;
}
/**
* Inverse les bornes d'un intervalle pour l'exclure des modifications sur l'arbre sans changer la hiérarchie.
*/
private function exclureIntervalle($bg, $bd, $id_utilisateur) {
$requete = '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 = json_encode($result) ;
 
header("content-type: text/json") ;
print $res ;
exit() ;
}
return $this->executerRequete($requete);
}
 
// met � jour les mots clés d'une image
function updateElement($uid,$pairs)
{
// Controle detournement utilisateur
session_start();
$this->controleUtilisateur($uid[1]);
/**
* Recale les bornes dun intervalle pour l'inclure dans l'arbre à la bonne place.
* Décalage borne droite
*/
private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) {
 
$this->suffix = '_'.$uid[0];
$requete = '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).'" ';
 
$id_utilisateur = $uid[1] ;
$id_mot_cle = $pairs['id'] ;
$action = $pairs['action'] ;
return $this->executerRequete($requete);
}
 
if($action == 'modification')
{
$nouveau_nom = $pairs['motcle'] ;
$nouvel_id_general = md5(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" ;
}
private function changerPere($id_mot_cle, $id_pere, $id_utilisateur) {
$requete = '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).'" ';
return $this->executerRequete($requete);
}
private function executerRequete($requete) {
$DB = $this->connectDB($this->config, 'cel_db');
$resultat =& $DB->query($requete);
$execution = true;
if (PEAR::isError($resultat)) {
die($res->getMessage());
$execution = false;
}
 
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() ;
}
 
}
return $execution;
}
 
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))
{
private function recupererResultat($requete) {
$DB = $this->connectDB($this->config, 'cel_db');
$resultat =& $DB->query($requete);
if (PEAR::isError($resultat)) {
die($res->getMessage());
$transaction_reussie_2 = false ;
}
else
{
$transaction_reussie_2 = true ;
$resultat = false;
}
 
if($transaction_reussie_1 && $transaction_reussie_2)
{
$this->reactiverAutoCommitEtCompleterTransaction() ;
echo "OK" ;
}
else
{
$this->reactiverAutoCommitEtAnnulerTransaction() ;
}
 
return $resultat;
}
 
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 ;
private function verifierLignesAffectees($requete) {
$DB = $this->connectDB($this->config, 'cel_db');
$resultat =& $DB->query($requete);
$execution = true;
if (PEAR::isError($resultat)) {
die($res->getMessage());
$execution = false;
} else {
if ($DB->affectedRows() <= 0) {
$execution = 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() ;
}
}
return $execution;
}
 
}
?>