177 lines
5.1 KiB
PHP
177 lines
5.1 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Doctrine\DBAL\Cache;
|
||
|
|
||
|
use Doctrine\Common\Cache\Cache;
|
||
|
use Doctrine\Common\Cache\Psr6\CacheAdapter;
|
||
|
use Doctrine\Common\Cache\Psr6\DoctrineProvider;
|
||
|
use Doctrine\DBAL\Types\Type;
|
||
|
use Doctrine\Deprecations\Deprecation;
|
||
|
use Psr\Cache\CacheItemPoolInterface;
|
||
|
use TypeError;
|
||
|
|
||
|
use function get_class;
|
||
|
use function hash;
|
||
|
use function serialize;
|
||
|
use function sha1;
|
||
|
use function sprintf;
|
||
|
|
||
|
/**
|
||
|
* Query Cache Profile handles the data relevant for query caching.
|
||
|
*
|
||
|
* It is a value object, setter methods return NEW instances.
|
||
|
*/
|
||
|
class QueryCacheProfile
|
||
|
{
|
||
|
private ?CacheItemPoolInterface $resultCache = null;
|
||
|
|
||
|
/** @var int */
|
||
|
private $lifetime;
|
||
|
|
||
|
/** @var string|null */
|
||
|
private $cacheKey;
|
||
|
|
||
|
/**
|
||
|
* @param int $lifetime
|
||
|
* @param string|null $cacheKey
|
||
|
* @param CacheItemPoolInterface|Cache|null $resultCache
|
||
|
*/
|
||
|
public function __construct($lifetime = 0, $cacheKey = null, ?object $resultCache = null)
|
||
|
{
|
||
|
$this->lifetime = $lifetime;
|
||
|
$this->cacheKey = $cacheKey;
|
||
|
if ($resultCache instanceof CacheItemPoolInterface) {
|
||
|
$this->resultCache = $resultCache;
|
||
|
} elseif ($resultCache instanceof Cache) {
|
||
|
Deprecation::trigger(
|
||
|
'doctrine/dbal',
|
||
|
'https://github.com/doctrine/dbal/pull/4620',
|
||
|
'Passing an instance of %s to %s as $resultCache is deprecated. Pass an instance of %s instead.',
|
||
|
Cache::class,
|
||
|
__METHOD__,
|
||
|
CacheItemPoolInterface::class,
|
||
|
);
|
||
|
|
||
|
$this->resultCache = CacheAdapter::wrap($resultCache);
|
||
|
} elseif ($resultCache !== null) {
|
||
|
throw new TypeError(sprintf(
|
||
|
'$resultCache: Expected either null or an instance of %s or %s, got %s.',
|
||
|
CacheItemPoolInterface::class,
|
||
|
Cache::class,
|
||
|
get_class($resultCache),
|
||
|
));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function getResultCache(): ?CacheItemPoolInterface
|
||
|
{
|
||
|
return $this->resultCache;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @deprecated Use {@see getResultCache()} instead.
|
||
|
*
|
||
|
* @return Cache|null
|
||
|
*/
|
||
|
public function getResultCacheDriver()
|
||
|
{
|
||
|
Deprecation::trigger(
|
||
|
'doctrine/dbal',
|
||
|
'https://github.com/doctrine/dbal/pull/4620',
|
||
|
'%s is deprecated, call getResultCache() instead.',
|
||
|
__METHOD__,
|
||
|
);
|
||
|
|
||
|
return $this->resultCache !== null ? DoctrineProvider::wrap($this->resultCache) : null;
|
||
|
}
|
||
|
|
||
|
/** @return int */
|
||
|
public function getLifetime()
|
||
|
{
|
||
|
return $this->lifetime;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return string
|
||
|
*
|
||
|
* @throws CacheException
|
||
|
*/
|
||
|
public function getCacheKey()
|
||
|
{
|
||
|
if ($this->cacheKey === null) {
|
||
|
throw CacheException::noCacheKey();
|
||
|
}
|
||
|
|
||
|
return $this->cacheKey;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generates the real cache key from query, params, types and connection parameters.
|
||
|
*
|
||
|
* @param string $sql
|
||
|
* @param list<mixed>|array<string, mixed> $params
|
||
|
* @param array<int, Type|int|string|null>|array<string, Type|int|string|null> $types
|
||
|
* @param array<string, mixed> $connectionParams
|
||
|
*
|
||
|
* @return array{string, string}
|
||
|
*/
|
||
|
public function generateCacheKeys($sql, $params, $types, array $connectionParams = [])
|
||
|
{
|
||
|
if (isset($connectionParams['password'])) {
|
||
|
unset($connectionParams['password']);
|
||
|
}
|
||
|
|
||
|
$realCacheKey = 'query=' . $sql .
|
||
|
'¶ms=' . serialize($params) .
|
||
|
'&types=' . serialize($types) .
|
||
|
'&connectionParams=' . hash('sha256', serialize($connectionParams));
|
||
|
|
||
|
// should the key be automatically generated using the inputs or is the cache key set?
|
||
|
$cacheKey = $this->cacheKey ?? sha1($realCacheKey);
|
||
|
|
||
|
return [$cacheKey, $realCacheKey];
|
||
|
}
|
||
|
|
||
|
public function setResultCache(CacheItemPoolInterface $cache): QueryCacheProfile
|
||
|
{
|
||
|
return new QueryCacheProfile($this->lifetime, $this->cacheKey, $cache);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @deprecated Use {@see setResultCache()} instead.
|
||
|
*
|
||
|
* @return QueryCacheProfile
|
||
|
*/
|
||
|
public function setResultCacheDriver(Cache $cache)
|
||
|
{
|
||
|
Deprecation::trigger(
|
||
|
'doctrine/dbal',
|
||
|
'https://github.com/doctrine/dbal/pull/4620',
|
||
|
'%s is deprecated, call setResultCache() instead.',
|
||
|
__METHOD__,
|
||
|
);
|
||
|
|
||
|
return new QueryCacheProfile($this->lifetime, $this->cacheKey, CacheAdapter::wrap($cache));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string|null $cacheKey
|
||
|
*
|
||
|
* @return QueryCacheProfile
|
||
|
*/
|
||
|
public function setCacheKey($cacheKey)
|
||
|
{
|
||
|
return new QueryCacheProfile($this->lifetime, $cacheKey, $this->resultCache);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $lifetime
|
||
|
*
|
||
|
* @return QueryCacheProfile
|
||
|
*/
|
||
|
public function setLifetime($lifetime)
|
||
|
{
|
||
|
return new QueryCacheProfile($lifetime, $this->cacheKey, $this->resultCache);
|
||
|
}
|
||
|
}
|