132 lines
3.2 KiB
PHP
132 lines
3.2 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
|
|
* Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
|
*
|
|
* Licensed under The MIT License
|
|
* For full copyright and license information, please see the LICENSE.txt
|
|
* Redistributions of files must retain the above copyright notice.
|
|
*
|
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
|
|
* @link https://cakephp.org CakePHP(tm) Project
|
|
* @since 3.0.0
|
|
* @license https://opensource.org/licenses/mit-license.php MIT License
|
|
*/
|
|
namespace Cake\Database\Schema;
|
|
|
|
use Psr\SimpleCache\CacheInterface;
|
|
|
|
/**
|
|
* Decorates a schema collection and adds caching
|
|
*/
|
|
class CachedCollection implements CollectionInterface
|
|
{
|
|
/**
|
|
* Cacher instance.
|
|
*
|
|
* @var \Psr\SimpleCache\CacheInterface
|
|
*/
|
|
protected $cacher;
|
|
|
|
/**
|
|
* The decorated schema collection
|
|
*
|
|
* @var \Cake\Database\Schema\CollectionInterface
|
|
*/
|
|
protected $collection;
|
|
|
|
/**
|
|
* The cache key prefix
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $prefix;
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param \Cake\Database\Schema\CollectionInterface $collection The collection to wrap.
|
|
* @param string $prefix The cache key prefix to use. Typically the connection name.
|
|
* @param \Psr\SimpleCache\CacheInterface $cacher Cacher instance.
|
|
*/
|
|
public function __construct(CollectionInterface $collection, string $prefix, CacheInterface $cacher)
|
|
{
|
|
$this->collection = $collection;
|
|
$this->prefix = $prefix;
|
|
$this->cacher = $cacher;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function listTablesWithoutViews(): array
|
|
{
|
|
return $this->collection->listTablesWithoutViews();
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function listTables(): array
|
|
{
|
|
return $this->collection->listTables();
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function describe(string $name, array $options = []): TableSchemaInterface
|
|
{
|
|
$options += ['forceRefresh' => false];
|
|
$cacheKey = $this->cacheKey($name);
|
|
|
|
if (!$options['forceRefresh']) {
|
|
$cached = $this->cacher->get($cacheKey);
|
|
if ($cached !== null) {
|
|
return $cached;
|
|
}
|
|
}
|
|
|
|
$table = $this->collection->describe($name, $options);
|
|
$this->cacher->set($cacheKey, $table);
|
|
|
|
return $table;
|
|
}
|
|
|
|
/**
|
|
* Get the cache key for a given name.
|
|
*
|
|
* @param string $name The name to get a cache key for.
|
|
* @return string The cache key.
|
|
*/
|
|
public function cacheKey(string $name): string
|
|
{
|
|
return $this->prefix . '_' . $name;
|
|
}
|
|
|
|
/**
|
|
* Set a cacher.
|
|
*
|
|
* @param \Psr\SimpleCache\CacheInterface $cacher Cacher object
|
|
* @return $this
|
|
*/
|
|
public function setCacher(CacheInterface $cacher)
|
|
{
|
|
$this->cacher = $cacher;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get a cacher.
|
|
*
|
|
* @return \Psr\SimpleCache\CacheInterface $cacher Cacher object
|
|
*/
|
|
public function getCacher(): CacheInterface
|
|
{
|
|
return $this->cacher;
|
|
}
|
|
}
|