Skip to content

Commit

Permalink
Adding configurable namespace separator to have separator compatible …
Browse files Browse the repository at this point in the history
…with PSR-16.
  • Loading branch information
moufmouf committed Jun 13, 2019
1 parent eb29498 commit ca39d00
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/Symfony/Component/Cache/Adapter/AbstractAdapter.php
Expand Up @@ -39,7 +39,7 @@ abstract class AbstractAdapter implements AdapterInterface, LoggerAwareInterface
*/
protected function __construct($namespace = '', $defaultLifetime = 0)
{
$this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).':';
$this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).static::getNsSeparator();
if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) {
throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s")', $this->maxIdLength - 24, \strlen($namespace), $namespace));
}
Expand Down
8 changes: 8 additions & 0 deletions src/Symfony/Component/Cache/Adapter/SimpleCacheAdapter.php
Expand Up @@ -75,4 +75,12 @@ protected function doSave(array $values, $lifetime)
{
return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime);
}

/**
* @return string The namespace separator for cache keys.
*/
protected static function getNsSeparator()
{
return '_';
}
}
18 changes: 13 additions & 5 deletions src/Symfony/Component/Cache/Traits/AbstractTrait.php
Expand Up @@ -106,7 +106,7 @@ public function clear()
{
$this->deferred = [];
if ($cleared = $this->versioningIsEnabled) {
$namespaceVersion = substr_replace(base64_encode(pack('V', mt_rand())), ':', 5);
$namespaceVersion = substr_replace(base64_encode(pack('V', mt_rand())), static::getNsSeparator(), 5);
try {
$cleared = $this->doSave(['@'.$this->namespace => $namespaceVersion], 0);
} catch (\Exception $e) {
Expand Down Expand Up @@ -235,13 +235,13 @@ private function getId($key)
CacheItem::validateKey($key);

if ($this->versioningIsEnabled && '' === $this->namespaceVersion) {
$this->namespaceVersion = '1:';
$this->namespaceVersion = '1'.static::getNsSeparator();
try {
foreach ($this->doFetch(['@'.$this->namespace]) as $v) {
$this->namespaceVersion = $v;
}
if ('1:' === $this->namespaceVersion) {
$this->namespaceVersion = substr_replace(base64_encode(pack('V', time())), ':', 5);
if ('1'.static::getNsSeparator() === $this->namespaceVersion) {
$this->namespaceVersion = substr_replace(base64_encode(pack('V', time())), static::getNsSeparator(), 5);
$this->doSave(['@'.$this->namespace => $this->namespaceVersion], 0);
}
} catch (\Exception $e) {
Expand All @@ -252,7 +252,7 @@ private function getId($key)
return $this->namespace.$this->namespaceVersion.$key;
}
if (\strlen($id = $this->namespace.$this->namespaceVersion.$key) > $this->maxIdLength) {
$id = $this->namespace.$this->namespaceVersion.substr_replace(base64_encode(hash('sha256', $key, true)), ':', -(\strlen($this->namespaceVersion) + 22));
$id = $this->namespace.$this->namespaceVersion.substr_replace(base64_encode(hash('sha256', $key, true)), static::getNsSeparator(), -(\strlen($this->namespaceVersion) + 22));
}

return $id;
Expand All @@ -265,4 +265,12 @@ public static function handleUnserializeCallback($class)
{
throw new \DomainException('Class not found: '.$class);
}

/**
* @return string The namespace separator for cache keys.
*/
protected static function getNsSeparator()
{
return ':';
}
}

0 comments on commit ca39d00

Please sign in to comment.