Optimisation chargement permissions

This commit is contained in:
Laurent Destailleur 2007-02-28 03:13:34 +00:00
parent bfe0fea6a5
commit a36e89e585

View File

@ -80,6 +80,9 @@ class User
//! Liste des entrepots auquel a acces l'utilisateur //! Liste des entrepots auquel a acces l'utilisateur
var $entrepots; var $entrepots;
var $tab_loaded=array(); // Tableau pour signaler les permissions deja chargées
/** /**
* \brief Constructeur de la classe * \brief Constructeur de la classe
* \param DB Handler accès base de données * \param DB Handler accès base de données
@ -435,97 +438,103 @@ class User
} }
/** /**
\brief Charge dans l'objet user, la liste des permissions auxquelles l'utilisateur a droit \brief Charge dans l'objet user, la liste des permissions auxquelles l'utilisateur a droit
\param module nom du module dont il faut récupérer les droits ('' par defaut signifie tous les droits) \param module nom du module dont il faut récupérer les droits ('' par defaut signifie tous les droits)
*/ */
function getrights($module='') function getrights($module='')
{ {
dolibarr_syslog('User::Getrights id='.$this->id.' module='.$module, LOG_DEBUG); if ($module && isset($this->tab_loaded[$module]) && $this->tab_loaded[$module]) { return; } // Le fichier de ce module est deja chargé
if ($this->all_permissions_are_loaded) if ($this->all_permissions_are_loaded)
{ {
// Si les permissions ont déja été chargé pour ce user, on quitte // Si les permissions ont déja été chargé pour ce user, on quitte
return; return;
} }
// Récupération des droits utilisateurs + récupération des droits groupes // Récupération des droits utilisateurs + récupération des droits groupes
dolibarr_syslog('User::Getrights id='.$this->id.' module='.$module, LOG_DEBUG);
// D'abord les droits utilisateurs // D'abord les droits utilisateurs
$sql = "SELECT r.module, r.perms, r.subperms"; $sql = "SELECT r.module, r.perms, r.subperms";
$sql .= " FROM ".MAIN_DB_PREFIX."user_rights as ur, ".MAIN_DB_PREFIX."rights_def as r"; $sql .= " FROM ".MAIN_DB_PREFIX."user_rights as ur, ".MAIN_DB_PREFIX."rights_def as r";
$sql .= " WHERE r.id = ur.fk_id AND ur.fk_user= ".$this->id." AND r.perms IS NOT NULL"; $sql .= " WHERE r.id = ur.fk_id AND ur.fk_user= ".$this->id." AND r.perms IS NOT NULL";
$result = $this->db->query($sql); $result = $this->db->query($sql);
if ($result) if ($result)
{ {
$num = $this->db->num_rows($result); $num = $this->db->num_rows($result);
$i = 0; $i = 0;
while ($i < $num) while ($i < $num)
{ {
$row = $this->db->fetch_row($result); $row = $this->db->fetch_row($result);
if ($row[1]) if ($row[1])
{ {
if ($row[2]) if ($row[2])
{ {
if (! $this->rights->$row[0] || if (! $this->rights->$row[0] ||
(is_object($this->rights->$row[0]) && ! $this->rights->$row[0]->$row[1]) || (is_object($this->rights->$row[0]) && ! $this->rights->$row[0]->$row[1]) ||
(is_object($this->rights->$row[0]->$row[1])) ) (is_object($this->rights->$row[0]->$row[1])) )
{ {
$this->rights->$row[0]->$row[1]->$row[2] = 1; $this->rights->$row[0]->$row[1]->$row[2] = 1;
} }
} }
else else
{ {
$this->rights->$row[0]->$row[1] = 1; $this->rights->$row[0]->$row[1] = 1;
} }
} }
$i++; $i++;
} }
$this->db->free($result); $this->db->free($result);
} }
// Maintenant les droits groupes // Maintenant les droits groupes
$sql = " SELECT r.module, r.perms, r.subperms"; $sql = " SELECT r.module, r.perms, r.subperms";
$sql .= " FROM ".MAIN_DB_PREFIX."usergroup_rights as gr, ".MAIN_DB_PREFIX."usergroup_user as gu, ".MAIN_DB_PREFIX."rights_def as r"; $sql .= " FROM ".MAIN_DB_PREFIX."usergroup_rights as gr, ".MAIN_DB_PREFIX."usergroup_user as gu, ".MAIN_DB_PREFIX."rights_def as r";
$sql .= " WHERE r.id = gr.fk_id AND gr.fk_usergroup = gu.fk_usergroup AND gu.fk_user = ".$this->id." AND r.perms IS NOT NULL"; $sql .= " WHERE r.id = gr.fk_id AND gr.fk_usergroup = gu.fk_usergroup AND gu.fk_user = ".$this->id." AND r.perms IS NOT NULL";
$result = $this->db->query($sql); $result = $this->db->query($sql);
if ($result) if ($result)
{ {
$num = $this->db->num_rows($result); $num = $this->db->num_rows($result);
$i = 0; $i = 0;
while ($i < $num) while ($i < $num)
{ {
$row = $this->db->fetch_row($result); $row = $this->db->fetch_row($result);
if (strlen($row[1]) > 0) if (strlen($row[1]) > 0)
{ {
if (strlen($row[2]) > 0) if (strlen($row[2]) > 0)
{ {
$this->rights->$row[0]->$row[1]->$row[2] = 1; $this->rights->$row[0]->$row[1]->$row[2] = 1;
} }
else else
{ {
$this->rights->$row[0]->$row[1] = 1; $this->rights->$row[0]->$row[1] = 1;
} }
} }
$i++; $i++;
} }
$this->db->free($result); $this->db->free($result);
} }
if ($module == '') if (! $module)
{ {
// Si module etait non defini, alors on a tout chargé, on peut donc considérer // Si module etait non defini, alors on a tout chargé, on peut donc considérer
// que les droits sont en cache (car tous chargés) pour cet instance de user // que les droits sont en cache (car tous chargés) pour cet instance de user
$this->all_permissions_are_loaded=1; $this->all_permissions_are_loaded=1;
} }
} else
{
// Si module défini, on considère chargé en cache que le module
$this->tab_loaded[$module]=1;
}
}
/** /**
* \brief Change statut d'un utilisateur * \brief Change statut d'un utilisateur