147 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?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;
 | 
						|
    }
 | 
						|
}
 |