Changeset 26368


Ignore:
Timestamp:
06/15/10 19:34:39 (7 years ago)
Author:
flack
Message:

cache self and content privileges separately to avoid repeated filtering, refs #1848

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/developers/flack/acltuning/midcom.core/midcom/core/privilege.php

    r26330 r26368  
    366366    public static function get_content_privileges($guid)
    367367    {
    368         $all_privileges = self::get_all_privileges($guid);
    369 
    370         $return = Array();
    371         foreach ($all_privileges as $privilege)
    372         {
    373             if ($privilege->assignee != 'SELF')
    374             {
    375                 $return[] = $privilege;
    376             }
    377         }
    378 
    379         return $return;
     368        return self::_get_privileges($guid, 'CONTENT');
    380369    }
    381370
     
    394383    public static function get_self_privileges($guid)
    395384    {
    396         $all_privileges = midcom_core_privilege::get_all_privileges($guid);
    397 
    398         $return = Array();
    399         foreach ($all_privileges as $privilege)
    400         {
    401             if ($privilege->assignee == 'SELF')
    402             {
    403                 $return[] = $privilege;
    404             }
    405         }
    406 
    407         return $return;
     385        return self::_get_privileges($guid, 'SELF');
    408386    }
    409387
     
    422400    public static function get_all_privileges($guid)
    423401    {
     402        $return = array_merge(self::get_content_privileges($guid), self::get_self_privileges($guid));
     403
     404        return $return;
     405    }
     406
     407    /**
     408     * This is a static helper function which lists all privileges assigned
     409     * an object unfiltered.
     410     *
     411     * This function is for use in the authentication framework only and may only
     412     * be called statically.
     413     *
     414     * @access protected
     415     * @param string GUID the GUID of the object for which we should look up privileges.
     416     * @return Array A list of midcom_core_privilege instances.
     417     * @static
     418     */
     419    private static function _get_privileges($guid, $type)
     420    {
    424421        static $cache = array();
    425422
    426         if (array_key_exists($guid, $cache))
    427         {
    428             $return = $cache[$guid];
     423        $cache_key = $type . '::' . $guid;
     424
     425        if (array_key_exists($cache_key, $cache))
     426        {
     427            $return = $cache[$cache_key];
    429428        }
    430429        else
    431430        {
    432             $return = $_MIDCOM->cache->memcache->get('ACL', $guid);
     431            $return = $_MIDCOM->cache->memcache->get('ACL', $cache_key);
    433432
    434433            if (! is_array($return))
    435434            {
    436435                // Didn't get privileges from cache, get them from DB
    437                 $return = self::_query_all_privileges($guid);
    438                 $_MIDCOM->cache->memcache->put('ACL', $guid, $return);
    439             }
    440 
    441             $cache[$guid] = $return;
     436                $return = self::_query_privileges($guid, $type);
     437                $_MIDCOM->cache->memcache->put('ACL', $cache_key, $return);
     438            }
     439
     440            $cache[$cache_key] = $return;
    442441        }
    443442
    444443        return $return;
    445444    }
     445
    446446
    447447    /**
     
    453453     * @access protected
    454454     * @param string $guid The GUID of the object for which to query ACL data.
     455     * @param string $type SELF or CONTENT
    455456     * @return Array A list of midcom_core_privilege instances.
    456457     * @static
    457458     */
    458     public static function _query_all_privileges($guid)
     459    protected static function _query_privileges($guid, $type)
    459460    {
    460461        $result = array();
     
    462463        $mc = new midgard_collector('midcom_core_privilege_db', 'objectguid', $guid);
    463464        $mc->add_constraint('value', '<>', MIDCOM_PRIVILEGE_INHERIT);
     465       
     466        if ($type == 'CONTENT')
     467        {
     468            $mc->add_constraint('assignee', '<>', 'SELF');
     469        }
     470        else
     471        {
     472            $mc->add_constraint('assignee', '=', 'SELF');
     473        }
     474
    464475        //FIXME:
    465476        $mc->set_key_property('guid');
Note: See TracChangeset for help on using the changeset viewer.