diff options
| author | Sem <sembrestels@riseup.net> | 2012-08-28 18:43:39 +0200 | 
|---|---|---|
| committer | Sem <sembrestels@riseup.net> | 2012-08-28 18:43:39 +0200 | 
| commit | f3f3561b7ce6462e4f75649bab874b3112867dc3 (patch) | |
| tree | d017b2d5aff45549d2a08c2558553c51edb10a83 /engine/lib | |
| parent | afa701d29525b8ebd3782d3efa6838c14ff9cc54 (diff) | |
| parent | 9ccbd106a87a1742a61cc4df0e9ead921046772a (diff) | |
| download | elgg-f3f3561b7ce6462e4f75649bab874b3112867dc3.tar.gz elgg-f3f3561b7ce6462e4f75649bab874b3112867dc3.tar.bz2  | |
Merge branch '1.8' of git://github.com/Elgg/Elgg into lorea-preprod
Diffstat (limited to 'engine/lib')
| -rw-r--r-- | engine/lib/elgglib.php | 2 | ||||
| -rw-r--r-- | engine/lib/entities.php | 67 | ||||
| -rw-r--r-- | engine/lib/navigation.php | 3 | ||||
| -rw-r--r-- | engine/lib/upgrades/2010121602.php | 2 | 
4 files changed, 57 insertions, 17 deletions
diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index 3026a78e3..554b0561f 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -1575,7 +1575,7 @@ function elgg_http_url_is_identical($url1, $url2, $ignore_params = array('offset   * @param bool   $strict  Return array key if it's set, even if empty. If false,   *                        return $default if the array key is unset or empty.   * - * @return void + * @return mixed   * @since 1.8.0   */  function elgg_extract($key, array $array, $default = null, $strict = true) { diff --git a/engine/lib/entities.php b/engine/lib/entities.php index 66c1475b7..3896cd58f 100644 --- a/engine/lib/entities.php +++ b/engine/lib/entities.php @@ -30,7 +30,7 @@ $SUBTYPE_CACHE = NULL;   *   * @param int $guid The entity guid   * - * @return void + * @return null   * @access private   */  function invalidate_cache_for_entity($guid) { @@ -48,14 +48,27 @@ function invalidate_cache_for_entity($guid) {   *   * @param ElggEntity $entity Entity to cache   * - * @return void + * @return null   * @see retrieve_cached_entity()   * @see invalidate_cache_for_entity()   * @access private + * TODO(evan): Use an ElggCache object   */  function cache_entity(ElggEntity $entity) {  	global $ENTITY_CACHE; +	// Don't cache entities while access control is off, otherwise they could be +	// exposed to users who shouldn't see them when control is re-enabled. +	if (elgg_get_ignore_access()) { +		return; +	} + +	// Don't store too many or we'll have memory problems +	// TODO(evan): Pick a less arbitrary limit +	if (count($ENTITY_CACHE) > 256) { +		unset($ENTITY_CACHE[array_rand($ENTITY_CACHE)]); +	} +  	$ENTITY_CACHE[$entity->guid] = $entity;  } @@ -64,7 +77,7 @@ function cache_entity(ElggEntity $entity) {   *   * @param int $guid The guid   * - * @return void + * @return ElggEntity|bool false if entity not cached, or not fully loaded   * @see cache_entity()   * @see invalidate_cache_for_entity()   * @access private @@ -676,8 +689,10 @@ function entity_row_to_elggstar($row) {   * @link http://docs.elgg.org/DataModel/Entities   */  function get_entity($guid) { -	static $newentity_cache; -	$new_entity = false; +	// This should not be a static local var. Notice that cache writing occurs in a completely +	// different instance outside this function. +	// @todo We need a single Memcache instance with a shared pool of namespace wrappers. This function would pull an instance from the pool. +	static $shared_cache;  	// We could also use: if (!(int) $guid) { return FALSE },   	// but that evaluates to a false positive for $guid = TRUE. @@ -685,20 +700,33 @@ function get_entity($guid) {  	if (!is_numeric($guid) || $guid === 0 || $guid === '0') {  		return FALSE;  	} - -	if ((!$newentity_cache) && (is_memcache_available())) { -		$newentity_cache = new ElggMemcache('new_entity_cache'); +	 +	// Check local cache first +	$new_entity = retrieve_cached_entity($guid); +	if ($new_entity) { +		return $new_entity;  	} -	if ($newentity_cache) { -		$new_entity = $newentity_cache->load($guid); +	// Check shared memory cache, if available +	if (null === $shared_cache) { +		if (is_memcache_available()) { +			$shared_cache = new ElggMemcache('new_entity_cache'); +		} else { +			$shared_cache = false; +		} +	} +	if ($shared_cache) { +		$new_entity = $shared_cache->load($guid); +		if ($new_entity) { +			return $new_entity; +		}  	} +	$new_entity = entity_row_to_elggstar(get_entity_as_row($guid));  	if ($new_entity) { -		return $new_entity; +		cache_entity($new_entity);  	} - -	return entity_row_to_elggstar(get_entity_as_row($guid)); +	return $new_entity;  }  /** @@ -940,6 +968,18 @@ function elgg_get_entities(array $options = array()) {  		}  		$dt = get_data($query, $options['callback']); +		if ($dt) { +			foreach ($dt as $entity) { +				// If a custom callback is provided, it could return something other than ElggEntity, +				// so we have to do an explicit check here. +				if ($entity instanceof ElggEntity) { +					cache_entity($entity); +				} +			} +			// @todo Without this, recursive delete fails. See #4568 +			reset($dt); +		} +  		return $dt;  	} else {  		$total = get_data_row($query); @@ -1412,6 +1452,7 @@ function disable_entity($guid, $reason = "", $recursive = true) {  				$entity->disableMetadata();  				$entity->disableAnnotations(); +				invalidate_cache_for_entity($guid);  				$res = update_data("UPDATE {$CONFIG->dbprefix}entities  					SET enabled = 'no' diff --git a/engine/lib/navigation.php b/engine/lib/navigation.php index 10b11acfe..8c3952594 100644 --- a/engine/lib/navigation.php +++ b/engine/lib/navigation.php @@ -339,11 +339,10 @@ function elgg_river_menu_setup($hook, $type, $return, $params) {  		if (elgg_is_admin_logged_in()) {  			$options = array(  				'name' => 'delete', -				'href' => "action/river/delete?id=$item->id", +				'href' => elgg_add_action_tokens_to_url("action/river/delete?id=$item->id"),  				'text' => elgg_view_icon('delete'),  				'title' => elgg_echo('delete'),  				'confirm' => elgg_echo('deleteconfirm'), -				'is_action' => true,  				'priority' => 200,  			);  			$return[] = ElggMenuItem::factory($options); diff --git a/engine/lib/upgrades/2010121602.php b/engine/lib/upgrades/2010121602.php index 2d55c8214..5b0996b5e 100644 --- a/engine/lib/upgrades/2010121602.php +++ b/engine/lib/upgrades/2010121602.php @@ -4,7 +4,7 @@   */  $query = "UPDATE {$CONFIG->dbprefix}river -			SET view='river/annotation/generic_comment/create', action_type='create' +			SET view='river/annotation/generic_comment/create'  			WHERE view='annotation/annotate' AND action_type='comment'";  update_data($query);  | 
