From 31106a9211d1e747f3783f59b54ccdd66edf83d7 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sat, 28 Apr 2012 22:40:11 -0500 Subject: [PATCH] Support implicit sectioned caching using :: syntax. --- laravel/cache/drivers/memcached.php | 73 +++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/laravel/cache/drivers/memcached.php b/laravel/cache/drivers/memcached.php index 9b3af1a7..d6fdf310 100644 --- a/laravel/cache/drivers/memcached.php +++ b/laravel/cache/drivers/memcached.php @@ -16,6 +16,20 @@ class Memcached extends Driver implements Sectionable { */ protected $key; + /** + * Indicates that section caching is implicit based on keys. + * + * @var bool + */ + public $implicit = true; + + /** + * The implicit section key delimiter. + * + * @var string + */ + public $delimiter = '::'; + /** * Create a new Memcached cache driver instance. * @@ -47,7 +61,13 @@ class Memcached extends Driver implements Sectionable { */ protected function retrieve($key) { - if (($cache = $this->memcache->get($this->key.$key)) !== false) + if ($this->sectionable($key)) + { + list($section, $key) = $this->parse($key); + + return $this->get_from_section($section, $key); + } + elseif (($cache = $this->memcache->get($this->key.$key)) !== false) { return $cache; } @@ -81,7 +101,16 @@ class Memcached extends Driver implements Sectionable { */ public function put($key, $value, $minutes) { - $this->memcache->set($this->key.$key, $value, $minutes * 60); + if ($this->sectionable($key)) + { + list($section, $key) = $this->parse($key); + + return $this->put_in_section($section, $key, $value, $minutes); + } + else + { + $this->memcache->set($this->key.$key, $value, $minutes * 60); + } } /** @@ -107,7 +136,16 @@ class Memcached extends Driver implements Sectionable { */ public function forever($key, $value) { - return $this->put($key, $value, 0); + if ($this->sectionable($key)) + { + list($section, $key) = $this->parse($key); + + return $this->forever_in_section($section, $key, $value); + } + else + { + return $this->put($key, $value, 0); + } } /** @@ -160,7 +198,23 @@ class Memcached extends Driver implements Sectionable { */ public function forget($key) { - $this->memcache->delete($this->key.$key); + if ($this->sectionable($key)) + { + list($section, $key) = $this->parse($key); + + if ($key == '*') + { + $this->forget_section($section); + } + else + { + $this->forget_in_section($section, $key); + } + } + else + { + $this->memcache->delete($this->key.$key); + } } /** @@ -223,6 +277,17 @@ class Memcached extends Driver implements Sectionable { return $section.'#'.$this->section_id($section).'#'.$key; } + /** + * Indicates if a key is sectionable. + * + * @param string $key + * @return bool + */ + protected function sectionable($key) + { + return $this->implicit and $this->sectioned($key); + } + /** * Determine if a key is sectioned. *