New file |
0,0 → 1,630 |
<?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 |
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() ; |
} |
} |
|
} |
?> |