From b5d3f3c5659456f4baaca5a592d644a17872da90 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Wed, 20 Jun 2018 17:35:14 -0700 Subject: [PATCH] (dev/core#174) ArrayCache - Updates to comply with PSR-16 --- CRM/Utils/Cache/ArrayCache.php | 32 ++++++++++++++--- tests/phpunit/E2E/Cache/ArrayCacheTest.php | 41 ++++++++++++++++++++++ 2 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 tests/phpunit/E2E/Cache/ArrayCacheTest.php diff --git a/CRM/Utils/Cache/ArrayCache.php b/CRM/Utils/Cache/ArrayCache.php index c74e1900f1..287c6a3e5c 100644 --- a/CRM/Utils/Cache/ArrayCache.php +++ b/CRM/Utils/Cache/ArrayCache.php @@ -39,11 +39,15 @@ class CRM_Utils_Cache_Arraycache implements CRM_Utils_Cache_Interface { use CRM_Utils_Cache_NaiveMultipleTrait; use CRM_Utils_Cache_NaiveHasTrait; // TODO Native implementation + const DEFAULT_TIMEOUT = 3600; + /** * The cache storage container, an in memory array by default */ protected $_cache; + protected $_expires; + /** * Constructor. * @@ -54,6 +58,7 @@ class CRM_Utils_Cache_Arraycache implements CRM_Utils_Cache_Interface { */ public function __construct($config) { $this->_cache = array(); + $this->_expires = array(); } /** @@ -61,12 +66,12 @@ class CRM_Utils_Cache_Arraycache implements CRM_Utils_Cache_Interface { * @param mixed $value * @param null|int|\DateInterval $ttl * @return bool + * @throws \Psr\SimpleCache\InvalidArgumentException */ public function set($key, $value, $ttl = NULL) { - if ($ttl !== NULL) { - throw new \RuntimeException("FIXME: " . __CLASS__ . "::set() should support non-NULL TTL"); - } - $this->_cache[$key] = $value; + CRM_Utils_Cache::assertValidKey($key); + $this->_cache[$key] = $this->reobjectify($value); + $this->_expires[$key] = CRM_Utils_Date::convertCacheTtlToExpires($ttl, self::DEFAULT_TIMEOUT); return TRUE; } @@ -75,22 +80,35 @@ class CRM_Utils_Cache_Arraycache implements CRM_Utils_Cache_Interface { * @param mixed $default * * @return mixed + * @throws \Psr\SimpleCache\InvalidArgumentException */ public function get($key, $default = NULL) { - return CRM_Utils_Array::value($key, $this->_cache, $default); + CRM_Utils_Cache::assertValidKey($key); + if (isset($this->_expires[$key]) && is_numeric($this->_expires[$key]) && $this->_expires[$key] <= time()) { + return $default; + } + if (array_key_exists($key, $this->_cache)) { + return $this->reobjectify($this->_cache[$key]); + } + return $default; } /** * @param string $key * @return bool + * @throws \Psr\SimpleCache\InvalidArgumentException */ public function delete($key) { + CRM_Utils_Cache::assertValidKey($key); + unset($this->_cache[$key]); + unset($this->_expires[$key]); return TRUE; } public function flush() { unset($this->_cache); + unset($this->_expires); $this->_cache = array(); return TRUE; } @@ -99,4 +117,8 @@ class CRM_Utils_Cache_Arraycache implements CRM_Utils_Cache_Interface { return $this->flush(); } + private function reobjectify($value) { + return is_object($value) ? unserialize(serialize($value)) : $value; + } + } diff --git a/tests/phpunit/E2E/Cache/ArrayCacheTest.php b/tests/phpunit/E2E/Cache/ArrayCacheTest.php new file mode 100644 index 0000000000..65bc045eb4 --- /dev/null +++ b/tests/phpunit/E2E/Cache/ArrayCacheTest.php @@ -0,0 +1,41 @@ + 'e2e arraycache test', + 'type' => ['ArrayCache'], + ]); + } + +} -- 2.25.1