Chris@0: . Chris@0: */ Chris@0: Chris@0: namespace Doctrine\Common\Cache; Chris@0: Chris@0: /** Chris@0: * Cache provider that allows to easily chain multiple cache providers Chris@0: * Chris@0: * @author Michaƫl Gallego Chris@0: */ Chris@0: class ChainCache extends CacheProvider Chris@0: { Chris@0: /** Chris@0: * @var CacheProvider[] Chris@0: */ Chris@0: private $cacheProviders = array(); Chris@0: Chris@0: /** Chris@0: * Constructor Chris@0: * Chris@0: * @param CacheProvider[] $cacheProviders Chris@0: */ Chris@0: public function __construct($cacheProviders = array()) Chris@0: { Chris@0: $this->cacheProviders = $cacheProviders; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritDoc} Chris@0: */ Chris@0: public function setNamespace($namespace) Chris@0: { Chris@0: parent::setNamespace($namespace); Chris@0: Chris@0: foreach ($this->cacheProviders as $cacheProvider) { Chris@0: $cacheProvider->setNamespace($namespace); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritDoc} Chris@0: */ Chris@0: protected function doFetch($id) Chris@0: { Chris@0: foreach ($this->cacheProviders as $key => $cacheProvider) { Chris@0: if ($cacheProvider->doContains($id)) { Chris@0: $value = $cacheProvider->doFetch($id); Chris@0: Chris@0: // We populate all the previous cache layers (that are assumed to be faster) Chris@0: for ($subKey = $key - 1 ; $subKey >= 0 ; $subKey--) { Chris@0: $this->cacheProviders[$subKey]->doSave($id, $value); Chris@0: } Chris@0: Chris@0: return $value; Chris@0: } Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritDoc} Chris@0: */ Chris@0: protected function doContains($id) Chris@0: { Chris@0: foreach ($this->cacheProviders as $cacheProvider) { Chris@0: if ($cacheProvider->doContains($id)) { Chris@0: return true; Chris@0: } Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritDoc} Chris@0: */ Chris@0: protected function doSave($id, $data, $lifeTime = 0) Chris@0: { Chris@0: $stored = true; Chris@0: Chris@0: foreach ($this->cacheProviders as $cacheProvider) { Chris@0: $stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored; Chris@0: } Chris@0: Chris@0: return $stored; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritDoc} Chris@0: */ Chris@0: protected function doDelete($id) Chris@0: { Chris@0: $deleted = true; Chris@0: Chris@0: foreach ($this->cacheProviders as $cacheProvider) { Chris@0: $deleted = $cacheProvider->doDelete($id) && $deleted; Chris@0: } Chris@0: Chris@0: return $deleted; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritDoc} Chris@0: */ Chris@0: protected function doFlush() Chris@0: { Chris@0: $flushed = true; Chris@0: Chris@0: foreach ($this->cacheProviders as $cacheProvider) { Chris@0: $flushed = $cacheProvider->doFlush() && $flushed; Chris@0: } Chris@0: Chris@0: return $flushed; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritDoc} Chris@0: */ Chris@0: protected function doGetStats() Chris@0: { Chris@0: // We return all the stats from all adapters Chris@0: $stats = array(); Chris@0: Chris@0: foreach ($this->cacheProviders as $cacheProvider) { Chris@0: $stats[] = $cacheProvider->doGetStats(); Chris@0: } Chris@0: Chris@0: return $stats; Chris@0: } Chris@0: }