From a36e89e58524d40582971aaba313cf0f9fb2e3e9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 28 Feb 2007 03:13:34 +0000 Subject: [PATCH] Optimisation chargement permissions --- htdocs/user.class.php | 173 ++++++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 82 deletions(-) diff --git a/htdocs/user.class.php b/htdocs/user.class.php index b2d793ae202..030cfdaddc2 100644 --- a/htdocs/user.class.php +++ b/htdocs/user.class.php @@ -80,6 +80,9 @@ class User //! Liste des entrepots auquel a acces l'utilisateur var $entrepots; + var $tab_loaded=array(); // Tableau pour signaler les permissions deja chargées + + /** * \brief Constructeur de la classe * \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 - \param module nom du module dont il faut récupérer les droits ('' par defaut signifie tous les droits) - */ - function getrights($module='') - { - dolibarr_syslog('User::Getrights id='.$this->id.' module='.$module, LOG_DEBUG); + /** + \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) + */ + function getrights($module='') + { + 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) - { - // Si les permissions ont déja été chargé pour ce user, on quitte - return; - } - - // Récupération des droits utilisateurs + récupération des droits groupes - - // D'abord les droits utilisateurs - $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 .= " WHERE r.id = ur.fk_id AND ur.fk_user= ".$this->id." AND r.perms IS NOT NULL"; - - $result = $this->db->query($sql); - if ($result) - { - $num = $this->db->num_rows($result); - $i = 0; - while ($i < $num) - { - $row = $this->db->fetch_row($result); + if ($this->all_permissions_are_loaded) + { + // Si les permissions ont déja été chargé pour ce user, on quitte + return; + } + + // 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 + $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 .= " WHERE r.id = ur.fk_id AND ur.fk_user= ".$this->id." AND r.perms IS NOT NULL"; + + $result = $this->db->query($sql); + if ($result) + { + $num = $this->db->num_rows($result); + $i = 0; + while ($i < $num) + { + $row = $this->db->fetch_row($result); - if ($row[1]) - { - if ($row[2]) - { - if (! $this->rights->$row[0] || - (is_object($this->rights->$row[0]) && ! $this->rights->$row[0]->$row[1]) || - (is_object($this->rights->$row[0]->$row[1])) ) - { - $this->rights->$row[0]->$row[1]->$row[2] = 1; - } - } - else - { - $this->rights->$row[0]->$row[1] = 1; - } + if ($row[1]) + { + if ($row[2]) + { + if (! $this->rights->$row[0] || + (is_object($this->rights->$row[0]) && ! $this->rights->$row[0]->$row[1]) || + (is_object($this->rights->$row[0]->$row[1])) ) + { + $this->rights->$row[0]->$row[1]->$row[2] = 1; + } + } + else + { + $this->rights->$row[0]->$row[1] = 1; + } - } - $i++; - } - $this->db->free($result); - } + } + $i++; + } + $this->db->free($result); + } - // Maintenant les droits groupes - $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 .= " 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"; + // Maintenant les droits groupes + $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 .= " 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); - if ($result) - { - $num = $this->db->num_rows($result); - $i = 0; - while ($i < $num) - { - $row = $this->db->fetch_row($result); + $result = $this->db->query($sql); + if ($result) + { + $num = $this->db->num_rows($result); + $i = 0; + while ($i < $num) + { + $row = $this->db->fetch_row($result); - if (strlen($row[1]) > 0) - { + if (strlen($row[1]) > 0) + { - if (strlen($row[2]) > 0) - { - $this->rights->$row[0]->$row[1]->$row[2] = 1; - } - else - { - $this->rights->$row[0]->$row[1] = 1; - } + if (strlen($row[2]) > 0) + { + $this->rights->$row[0]->$row[1]->$row[2] = 1; + } + else + { + $this->rights->$row[0]->$row[1] = 1; + } - } - $i++; - } - $this->db->free($result); - } + } + $i++; + } + $this->db->free($result); + } - if ($module == '') - { - // 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 - $this->all_permissions_are_loaded=1; - } - } + if (! $module) + { + // 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 + $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