Submit
Path:
~
/
/
opt
/
psa
/
admin
/
plib
/
modules
/
rest-api
/
vendor
/
doctrine
/
cache
/
lib
/
Doctrine
/
Common
/
Cache
/
Psr6
/
File Content:
CacheAdapter.php
<?php namespace PleskRestApi\Doctrine\Common\Cache\Psr6; use PleskRestApi\Doctrine\Common\Cache\Cache; use PleskRestApi\Doctrine\Common\Cache\ClearableCache; use PleskRestApi\Doctrine\Common\Cache\MultiDeleteCache; use PleskRestApi\Doctrine\Common\Cache\MultiGetCache; use PleskRestApi\Doctrine\Common\Cache\MultiPutCache; use Psr\Cache\CacheItemInterface; use Psr\Cache\CacheItemPoolInterface; use PleskRestApi\Symfony\Component\Cache\DoctrineProvider as SymfonyDoctrineProvider; use function array_key_exists; use function assert; use function count; use function current; use function get_class; use function gettype; use function is_object; use function is_string; use function microtime; use function sprintf; use function strpbrk; use const PHP_VERSION_ID; final class CacheAdapter implements CacheItemPoolInterface { private const RESERVED_CHARACTERS = '{}()/\\@:'; /** @var Cache */ private $cache; /** @var array<CacheItem|TypedCacheItem> */ private $deferredItems = []; public static function wrap(Cache $cache) : CacheItemPoolInterface { if ($cache instanceof DoctrineProvider && !$cache->getNamespace()) { return $cache->getPool(); } if ($cache instanceof SymfonyDoctrineProvider && !$cache->getNamespace()) { $getPool = function () { // phpcs:ignore Squiz.Scope.StaticThisUsage.Found return $this->pool; }; return $getPool->bindTo($cache, SymfonyDoctrineProvider::class)(); } return new self($cache); } private function __construct(Cache $cache) { $this->cache = $cache; } /** @internal */ public function getCache() : Cache { return $this->cache; } /** * {@inheritDoc} */ public function getItem($key) : CacheItemInterface { assert(self::validKey($key)); if (isset($this->deferredItems[$key])) { $this->commit(); } $value = $this->cache->fetch($key); if (PHP_VERSION_ID >= 80000) { if ($value !== \false) { return new TypedCacheItem($key, $value, \true); } return new TypedCacheItem($key, null, \false); } if ($value !== \false) { return new CacheItem($key, $value, \true); } return new CacheItem($key, null, \false); } /** * {@inheritDoc} */ public function getItems(array $keys = []) : array { if ($this->deferredItems) { $this->commit(); } assert(self::validKeys($keys)); $values = $this->doFetchMultiple($keys); $items = []; if (PHP_VERSION_ID >= 80000) { foreach ($keys as $key) { if (array_key_exists($key, $values)) { $items[$key] = new TypedCacheItem($key, $values[$key], \true); } else { $items[$key] = new TypedCacheItem($key, null, \false); } } return $items; } foreach ($keys as $key) { if (array_key_exists($key, $values)) { $items[$key] = new CacheItem($key, $values[$key], \true); } else { $items[$key] = new CacheItem($key, null, \false); } } return $items; } /** * {@inheritDoc} */ public function hasItem($key) : bool { assert(self::validKey($key)); if (isset($this->deferredItems[$key])) { $this->commit(); } return $this->cache->contains($key); } public function clear() : bool { $this->deferredItems = []; if (!$this->cache instanceof ClearableCache) { return \false; } return $this->cache->deleteAll(); } /** * {@inheritDoc} */ public function deleteItem($key) : bool { assert(self::validKey($key)); unset($this->deferredItems[$key]); return $this->cache->delete($key); } /** * {@inheritDoc} */ public function deleteItems(array $keys) : bool { foreach ($keys as $key) { assert(self::validKey($key)); unset($this->deferredItems[$key]); } return $this->doDeleteMultiple($keys); } public function save(CacheItemInterface $item) : bool { return $this->saveDeferred($item) && $this->commit(); } public function saveDeferred(CacheItemInterface $item) : bool { if (!$item instanceof CacheItem && !$item instanceof TypedCacheItem) { return \false; } $this->deferredItems[$item->getKey()] = $item; return \true; } public function commit() : bool { if (!$this->deferredItems) { return \true; } $now = microtime(\true); $itemsCount = 0; $byLifetime = []; $expiredKeys = []; foreach ($this->deferredItems as $key => $item) { $lifetime = ($item->getExpiry() ?? $now) - $now; if ($lifetime < 0) { $expiredKeys[] = $key; continue; } ++$itemsCount; $byLifetime[(int) $lifetime][$key] = $item->get(); } $this->deferredItems = []; switch (count($expiredKeys)) { case 0: break; case 1: $this->cache->delete(current($expiredKeys)); break; default: $this->doDeleteMultiple($expiredKeys); break; } if ($itemsCount === 1) { return $this->cache->save($key, $item->get(), (int) $lifetime); } $success = \true; foreach ($byLifetime as $lifetime => $values) { $success = $this->doSaveMultiple($values, $lifetime) && $success; } return $success; } public function __destruct() { $this->commit(); } /** * @param mixed $key */ private static function validKey($key) : bool { if (!is_string($key)) { throw new InvalidArgument(sprintf('Cache key must be string, "%s" given.', is_object($key) ? get_class($key) : gettype($key))); } if ($key === '') { throw new InvalidArgument('Cache key length must be greater than zero.'); } if (strpbrk($key, self::RESERVED_CHARACTERS) !== \false) { throw new InvalidArgument(sprintf('Cache key "%s" contains reserved characters "%s".', $key, self::RESERVED_CHARACTERS)); } return \true; } /** * @param mixed[] $keys */ private static function validKeys(array $keys) : bool { foreach ($keys as $key) { self::validKey($key); } return \true; } /** * @param mixed[] $keys */ private function doDeleteMultiple(array $keys) : bool { if ($this->cache instanceof MultiDeleteCache) { return $this->cache->deleteMultiple($keys); } $success = \true; foreach ($keys as $key) { $success = $this->cache->delete($key) && $success; } return $success; } /** * @param mixed[] $keys * * @return mixed[] */ private function doFetchMultiple(array $keys) : array { if ($this->cache instanceof MultiGetCache) { return $this->cache->fetchMultiple($keys); } $values = []; foreach ($keys as $key) { $value = $this->cache->fetch($key); if (!$value) { continue; } $values[$key] = $value; } return $values; } /** * @param mixed[] $keysAndValues */ private function doSaveMultiple(array $keysAndValues, int $lifetime = 0) : bool { if ($this->cache instanceof MultiPutCache) { return $this->cache->saveMultiple($keysAndValues, $lifetime); } $success = \true; foreach ($keysAndValues as $key => $value) { $success = $this->cache->save($key, $value, $lifetime) && $success; } return $success; } }
Submit
FILE
FOLDER
INFO
Name
Size
Permission
Action
CacheAdapter.php
8261 bytes
0644
CacheItem.php
2480 bytes
0644
DoctrineProvider.php
3047 bytes
0644
InvalidArgument.php
285 bytes
0644
TypedCacheItem.php
2061 bytes
0644
N4ST4R_ID | Naxtarrr