/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php |
@@ -0,0 +1,147 @@ |
<?php |
/* |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* |
* This software consists of voluntary contributions made by many individuals |
* and is licensed under the MIT license. For more information, see |
* <http://www.doctrine-project.org>. |
*/ |
|
namespace Doctrine\Common\Cache; |
|
/** |
* Cache provider that allows to easily chain multiple cache providers |
* |
* @author Michaƫl Gallego <mic.gallego@gmail.com> |
*/ |
class ChainCache extends CacheProvider |
{ |
/** |
* @var CacheProvider[] |
*/ |
private $cacheProviders = array(); |
|
/** |
* Constructor |
* |
* @param CacheProvider[] $cacheProviders |
*/ |
public function __construct($cacheProviders = array()) |
{ |
$this->cacheProviders = $cacheProviders; |
} |
|
/** |
* {@inheritDoc} |
*/ |
public function setNamespace($namespace) |
{ |
parent::setNamespace($namespace); |
|
foreach ($this->cacheProviders as $cacheProvider) { |
$cacheProvider->setNamespace($namespace); |
} |
} |
|
/** |
* {@inheritDoc} |
*/ |
protected function doFetch($id) |
{ |
foreach ($this->cacheProviders as $key => $cacheProvider) { |
if ($cacheProvider->doContains($id)) { |
$value = $cacheProvider->doFetch($id); |
|
// We populate all the previous cache layers (that are assumed to be faster) |
for ($subKey = $key - 1 ; $subKey >= 0 ; $subKey--) { |
$this->cacheProviders[$subKey]->doSave($id, $value); |
} |
|
return $value; |
} |
} |
|
return false; |
} |
|
/** |
* {@inheritDoc} |
*/ |
protected function doContains($id) |
{ |
foreach ($this->cacheProviders as $cacheProvider) { |
if ($cacheProvider->doContains($id)) { |
return true; |
} |
} |
|
return false; |
} |
|
/** |
* {@inheritDoc} |
*/ |
protected function doSave($id, $data, $lifeTime = 0) |
{ |
$stored = true; |
|
foreach ($this->cacheProviders as $cacheProvider) { |
$stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored; |
} |
|
return $stored; |
} |
|
/** |
* {@inheritDoc} |
*/ |
protected function doDelete($id) |
{ |
$deleted = true; |
|
foreach ($this->cacheProviders as $cacheProvider) { |
$deleted = $cacheProvider->doDelete($id) && $deleted; |
} |
|
return $deleted; |
} |
|
/** |
* {@inheritDoc} |
*/ |
protected function doFlush() |
{ |
$flushed = true; |
|
foreach ($this->cacheProviders as $cacheProvider) { |
$flushed = $cacheProvider->doFlush() && $flushed; |
} |
|
return $flushed; |
} |
|
/** |
* {@inheritDoc} |
*/ |
protected function doGetStats() |
{ |
// We return all the stats from all adapters |
$stats = array(); |
|
foreach ($this->cacheProviders as $cacheProvider) { |
$stats[] = $cacheProvider->doGetStats(); |
} |
|
return $stats; |
} |
} |