1,5 → 1,6 |
<?php |
// declare(encoding='UTF-8'); |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* 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 |
17,14 → 18,10 |
* @version $Id$ |
* @copyright © 2011, Tela-Botanica |
*/ |
class InventoryKeyWordList extends DBAccessor { |
public $config ; |
class InventoryKeyWordList extends Cel { |
|
protected $suffix = ''; |
|
public function InventoryKeyWordList($config) { |
$this->config = $config; |
} |
|
public function getElement($uid) { |
// Controle detournement utilisateur |
session_start(); |
32,20 → 29,21 |
$id_utilisateur = $uid[1] ; |
$this->controleUtilisateur($uid[1]); |
|
$requete = 'SELECT cmc_mot_cle, cmc_id_mot_cle_utilisateur, cmc_id_parent '. |
$requete = 'SELECT mot_cle, id_mot_cle_utilisateur, ce_mot_cle_utilisateur_parent '. |
'FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE cmc_id_proprietaire = "'.$DB->escapeSimple($id_utilisateur).'" '. |
'ORDER BY cmc_niveau '; |
'WHERE ce_utilisateur = '.$this->proteger($id_utilisateur).' '. |
'ORDER BY niveau '; |
|
$resultat = $this->recupererResultat($requete); |
if ($resultat) { |
$resultats_mots_cles = $this->requeter($requete); |
|
if (is_array($resultats_mots_cles)) { |
$mots_cles = array(); |
while($mot_cle = $resultat->fetchrow(DB_FETCHMODE_ASSOC)) { |
foreach($resultats_mots_cles as $mot_cle) { |
$mots_cles[] = $mot_cle; |
} |
|
$infos = json_encode($mots_cles); |
|
header('content-type: text/json'); |
header('content-type: application/json'); |
print $infos; |
exit(); |
} |
65,51 → 63,52 |
$nouvel_id_general = md5(strtolower($nouveau_nom)); |
|
$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); |
'SET mot_cle = '.$this->proteger($nouveau_nom).' , '. |
' md5 = '.$this->proteger($nouvel_id_general).' '. |
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur) ; |
$reussite = $this->executer($requete); |
if ($reussite) { |
echo 'OK'; |
} |
} else if ($action == 'deplacement') { |
|
$this->commencerTransaction(); |
|
|
$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']; |
$bg = $bornes['bg']; |
$bd = $bornes['bd']; |
$niveau = $bornes['niveau']; |
|
// 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; |
$transaction_reussie_2 = $this->exclureIntervalle($bg, $bd, $id_utilisateur); |
|
$bg_negative = $bg - $bd - 1; |
$bd_negative = $bd - $bd - 1; |
|
// on recalcule les intervalles de l'arbre privé de ce sous arbre |
$transaction_reussie_3 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false; |
$transaction_reussie_3 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur); |
|
$bornes_pere = $this->calculerBornesEtNiveau($id_pere, $id_utilisateur); |
$bg_pere = $bornes_pere['cmc_bg']; |
$bd_pere = $bornes_pere['cmc_bd']; |
$bg_pere = $bornes_pere['bg']; |
$bd_pere = $bornes_pere['bd']; |
|
$niveau_pere = $bornes_pere['cmc_niveau']; |
$niveau_pere = $bornes_pere['niveau']; |
|
$decalage = $bd - $bg + 1; |
|
// on decale les bornes droite du pere pour préparer l'insertion |
$transaction_reussie_4 = $this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur) ? true : false; |
$transaction_reussie_4 = $this->decalerBornesPlusIntervalle($bd_pere, $decalage, $id_utilisateur); |
|
$nouvelle_bd = $bd_pere + $decalage; |
$modif_niveau = $niveau_pere - $niveau + 1; |
|
$transaction_reussie_5 = $this->inclureIntervalle($bg_negative, $bd_negative, $nouvelle_bd, $modif_niveau, $id_utilisateur) ? true : false; |
$transaction_reussie_5 = $this->inclureIntervalle($bg_negative, $bd_negative, $nouvelle_bd, $modif_niveau, $id_utilisateur); |
|
$transaction_reussie_6 = $this->changerPere($id_mot_cle, $id_pere, $id_utilisateur); |
|
$transaction_reussie_6 = $this->changerPere($id_mot_cle, $id_pere, $id_utilisateur) ? true : false; |
|
if ($transaction_reussie_1 && $transaction_reussie_2 && $transaction_reussie_3 && $transaction_reussie_4 && $transaction_reussie_5 && $transaction_reussie_6) { |
$this->completerTransaction(); |
} else { |
122,13 → 121,13 |
public function createElement($pairs) { |
// Controle detournement utilisateur |
session_start(); |
$this->controleUtilisateur($pairs['identifiant']); |
$this->controleUtilisateur($pairs['ce_utilisateur']); |
|
$this->suffix = '_'.$pairs['mode']; |
$id_utilisateur = $pairs['identifiant']; |
$id_utilisateur = $pairs['ce_utilisateur']; |
$mot_cle = $pairs['motcle']; |
|
// TODO supprimer accents et majuscules |
// TODO supprimer accents |
$id_mot_cle_general = md5(mb_strtolower($mot_cle)); |
$id_mot_cle = $pairs['id']; |
$id_parent = $pairs['parent']; |
138,9 → 137,9 |
$this->commencerTransaction(); |
|
$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur); |
$borne_pere = $bornes['cmc_bd']; |
$niveau = $bornes['cmc_niveau'] + 1; |
$bg = $bornes['cmc_bd']; |
$borne_pere = $bornes['bd']; |
$niveau = $bornes['niveau'] + 1; |
$bg = $bornes['bd']; |
$bd = $bg + 1; |
|
$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false; |
147,15 → 146,16 |
|
$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); |
$this->proteger($id_mot_cle).', '. |
$this->proteger($id_utilisateur).', '. |
$this->proteger($mot_cle).', '. |
$this->proteger($id_mot_cle_general).', '. |
$this->proteger($bg).', '. |
$this->proteger($bd).', '. |
$this->proteger($niveau).', '. |
$this->proteger($id_parent).') ' ; |
|
$transaction_reussie_2 = $this->executer($requete); |
|
if ($transaction_reussie_1 && $transaction_reussie_2) { |
$this->completerTransaction(); |
176,15 → 176,15 |
$this->commencerTransaction(); |
|
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur); |
$bg = $bornes['cmc_bg']; |
$bd = $bornes['cmc_bd']; |
$bg = $bornes['bg']; |
$bd = $bornes['bd']; |
|
$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); |
|
'WHERE bg >= '.$this->proteger($bg).' '. |
' AND bd <= '.$this->proteger($bd).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
|
$transaction_reussie_1 = $this->executer($requete); |
$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false; |
|
if ($transaction_reussie_1 && $transaction_reussie_2) { |
195,13 → 195,13 |
} |
|
private function ajouterMotCleRacine($id) { |
$requete = 'SELECT COUNT(*) '. |
$requete = 'SELECT COUNT(*) as nb_mc '. |
'FROM cel_mots_cles'.$this->suffix.' '. |
'WHERE cmc_id_proprietaire = "'.$DB->escapeSimple($id).'" '; |
$resultat = $this->recupererResultat($requete); |
'WHERE ce_utilisateur = '.$this->proteger($id).' '; |
$resultat = $this->requeter($requete); |
|
if ($resultat) { |
$valeurs = $resultat->fetchrow(DB_FETCHMODE_ORDERED); |
if (is_array($resultat) && count($resultat) > 0) { |
$valeurs = $resultat[0]['nb_mc']; |
|
switch ($this->suffix) { |
case '_obs' : |
217,10 → 217,10 |
$id_racine = $this->suffix; |
} |
|
if ($valeurs[0] == 0) { |
if ($valeurs == 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); |
'VALUES ("'.$nom_racine.'", 1, 2, "'.$id_racine.'", "'.$id_racine.'", '.$this->proteger($id).', "", 0) '; |
$this->executer($requete); |
} |
} |
} |
231,11 → 231,11 |
private function commencerTransaction() { |
// Désactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 0 '; |
$reussite_autocommit = $this->executerRequete($requete); |
$reussite_autocommit = $this->executer($requete); |
|
// Débute une nouvelle transaction |
$requete = 'BEGIN '; |
$reussite_begin = $this->executerRequete($requete); |
$reussite_begin = $this->executer($requete); |
} |
|
/** |
244,11 → 244,11 |
private function completerTransaction() { |
// Complète la transaction |
$requete = 'COMMIT '; |
$reussite_commit = $this->executerRequete($requete); |
$reussite_commit = $this->executer($requete); |
|
// Réactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 1 '; |
$reussite_autocommit = $this->executerRequete($requete); |
$reussite_autocommit = $this->executer($requete); |
|
echo 'OK'; |
} |
259,11 → 259,11 |
private function annulerTransaction() { |
// Annule la transaction |
$requete = 'ROLLBACK '; |
$reussite_rollback = $this->executerRequete($requete); |
$reussite_rollback = $this->executer($requete); |
|
// Réactive l'autocommit le temps de la manipulation de l'arbre |
$requete = 'SET AUTOCOMMIT = 1 '; |
$reussite_autocommit = $this->executerRequete($requete); |
$reussite_autocommit = $this->executer($requete); |
|
echo 'ERROR'; |
} |
272,12 → 272,16 |
* 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 '. |
$requete = 'SELECT bd, bg, 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); |
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$resultat = $this->requeter($requete); |
|
if(is_array($resultat) && count($resultat) > 0) { |
$valeurs = $resultat[0]; |
} |
|
return $valeurs; |
} |
|
287,16 → 291,16 |
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); |
'SET bd = bd + 2 WHERE bd >= '.$this->proteger($valeur).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_1 = $this->executer($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); |
'SET bg = bg + 2 '. |
'WHERE bg >= '.$this->proteger($valeur).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_2 = $this->executer($requete); |
|
return $reussi_1 && $reussi_2; |
} |
309,17 → 313,17 |
|
// 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); |
'SET bd = bd - '.$this->proteger($decalage).' '. |
'WHERE bd >= '.$this->proteger($bg).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_1 = $this->executer($requete); |
|
// 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); |
'SET bg = bg - '.$this->proteger($decalage).' '. |
'WHERE bg > '.$this->proteger($bg).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_2 = $this->executer($requete); |
|
return $reussi_1 && $reussi_2; |
} |
332,17 → 336,17 |
|
// 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); |
'SET bd = bd + '.$this->proteger($decalage).' '. |
'WHERE bd >= '.$this->proteger($valeur_bornes).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_1 = $this->executer($requete); |
|
// 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); |
'SET bg = bg + '.$this->proteger($decalage).' '. |
'WHERE bg >= '.$this->proteger($valeur_bornes).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
$reussi_2 = $this->executer($requete); |
|
return $reussi_1 && $reussi_2; |
} |
352,13 → 356,13 |
*/ |
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).'" '; |
'SET bd = bd - '.$this->proteger($bd).' - 1 , '. |
' bg = bg - '.$this->proteger($bd).' - 1 '. |
'WHERE bd <= '.$this->proteger($bd).' '. |
' AND bg >= '.$this->proteger($bg).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
|
return $this->executerRequete($requete); |
return $this->executer($requete); |
} |
|
/** |
368,59 → 372,23 |
private function inclureIntervalle($bg, $bd, $decalage,$modif_niveau, $id_utilisateur) { |
|
$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).'" '; |
'SET bg = bg + '.$this->proteger($decalage).' , '. |
' bd = bd + '.$this->proteger($decalage).', '. |
' niveau = niveau + '.$modif_niveau.' '. |
' WHERE bg >= '.$this->proteger($bg).' '. |
' AND bd <= '.$this->proteger($bd).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
|
return $this->executerRequete($requete); |
return $this->executer($requete); |
} |
|
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).'" '; |
'SET ce_mot_cle_utilisateur_parent = '.$this->proteger($id_pere).' '. |
'WHERE id_mot_cle_utilisateur = '.$this->proteger($id_mot_cle).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur).' '; |
|
return $this->executerRequete($requete); |
return $this->executer($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; |
} |
return $execution; |
} |
|
private function recupererResultat($requete) { |
$DB = $this->connectDB($this->config, 'cel_db'); |
$resultat =& $DB->query($requete); |
if (PEAR::isError($resultat)) { |
die($res->getMessage()); |
$resultat = false; |
} |
return $resultat; |
} |
|
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; |
} |
} |
return $execution; |
} |
} |
?> |