aboutsummaryrefslogtreecommitdiff
path: root/engine/lib
diff options
context:
space:
mode:
authorSteve Clay <steve@mrclay.org>2013-06-07 09:43:12 -0400
committerSteve Clay <steve@mrclay.org>2013-06-07 09:43:12 -0400
commitd3703130652337583daec95e322f6f7d497a581d (patch)
tree34b29fd407663d693bbc5f131c86b7282115f0b5 /engine/lib
parent8dbdf2f72c9dccbbd471e805fbd112c6817cdcec (diff)
downloadelgg-d3703130652337583daec95e322f6f7d497a581d.tar.gz
elgg-d3703130652337583daec95e322f6f7d497a581d.tar.bz2
Add way to ban entities from the entity cache
Diffstat (limited to 'engine/lib')
-rw-r--r--engine/lib/entities.php46
1 files changed, 44 insertions, 2 deletions
diff --git a/engine/lib/entities.php b/engine/lib/entities.php
index 5cfeca6f8..ac4b4d995 100644
--- a/engine/lib/entities.php
+++ b/engine/lib/entities.php
@@ -17,6 +17,15 @@ global $ENTITY_CACHE;
$ENTITY_CACHE = array();
/**
+ * GUIDs of entities banned from the entity cache (during this request)
+ *
+ * @global array $ENTITY_CACHE_BANNED_GUIDS
+ * @access private
+ */
+global $ENTITY_CACHE_BANNED_GUIDS;
+$ENTITY_CACHE_BANNED_GUIDS = array();
+
+/**
* Cache subtypes and related class names.
*
* @global array|null $SUBTYPE_CACHE array once populated from DB, initially null
@@ -26,6 +35,34 @@ global $SUBTYPE_CACHE;
$SUBTYPE_CACHE = null;
/**
+ * Ban this entity from the entity cache
+ *
+ * @param int $guid The entity guid
+ *
+ * @access private
+ * @todo this is a workaround until #5604 can be implemented
+ */
+function _elgg_ban_caching_for_entity($guid) {
+ global $ENTITY_CACHE_BANNED_GUIDS;
+
+ _elgg_invalidate_cache_for_entity($guid);
+ $ENTITY_CACHE_BANNED_GUIDS[$guid] = true;
+}
+
+/**
+ * Allow this entity to be stored in the entity cache
+ *
+ * @param int $guid The entity guid
+ *
+ * @access private
+ */
+function _elgg_unban_caching_for_entity($guid) {
+ global $ENTITY_CACHE_BANNED_GUIDS;
+
+ unset($ENTITY_CACHE_BANNED_GUIDS[$guid]);
+}
+
+/**
* Invalidate this class's entry in the cache.
*
* @param int $guid The entity guid
@@ -57,7 +94,7 @@ function _elgg_invalidate_cache_for_entity($guid) {
* @todo Use an ElggCache object
*/
function _elgg_cache_entity(ElggEntity $entity) {
- global $ENTITY_CACHE;
+ global $ENTITY_CACHE, $ENTITY_CACHE_BANNED_GUIDS;
// Don't cache non-plugin entities while access control is off, otherwise they could be
// exposed to users who shouldn't see them when control is re-enabled.
@@ -65,6 +102,11 @@ function _elgg_cache_entity(ElggEntity $entity) {
return;
}
+ $guid = $entity->getGUID();
+ if (isset($ENTITY_CACHE_BANNED_GUIDS[$guid])) {
+ return;
+ }
+
// Don't store too many or we'll have memory problems
// @todo Pick a less arbitrary limit
if (count($ENTITY_CACHE) > 256) {
@@ -79,7 +121,7 @@ function _elgg_cache_entity(ElggEntity $entity) {
elgg_get_metadata_cache()->clear($random_guid);
}
- $ENTITY_CACHE[$entity->guid] = $entity;
+ $ENTITY_CACHE[$guid] = $entity;
}
/**