aboutsummaryrefslogtreecommitdiff
path: root/srcs/phpmyadmin/vendor/symfony/cache/Traits
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2020-07-27 10:05:23 +0200
committerCharles Cabergs <me@cacharle.xyz>2020-07-27 10:05:23 +0200
commit5bf66662a9bdd62c5bccab15e607cd95cfb8fcab (patch)
tree39a1a4629749056191c05dfd899f931701b7acf3 /srcs/phpmyadmin/vendor/symfony/cache/Traits
parent5afd237bbd22028b85532b8c0b3fcead49a00764 (diff)
downloadft_server-master.tar.gz
ft_server-master.tar.bz2
ft_server-master.zip
Removed wordpress and phpmyadmin, my server doesn't handle it well and it brings shame on my famillyHEADmaster
Diffstat (limited to 'srcs/phpmyadmin/vendor/symfony/cache/Traits')
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/AbstractAdapterTrait.php155
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/AbstractTrait.php295
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/ApcuTrait.php121
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/ArrayTrait.php183
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/ContractsTrait.php97
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/DoctrineTrait.php98
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/FilesystemCommonTrait.php183
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/FilesystemTrait.php124
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/MemcachedTrait.php325
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/PdoTrait.php445
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/PhpArrayTrait.php169
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/PhpFilesTrait.php313
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/ProxyTrait.php43
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisClusterProxy.php63
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisProxy.php65
-rw-r--r--srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisTrait.php511
16 files changed, 0 insertions, 3190 deletions
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/AbstractAdapterTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/AbstractAdapterTrait.php
deleted file mode 100644
index 8bf9354..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/AbstractAdapterTrait.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Psr\Cache\CacheItemInterface;
-use Symfony\Component\Cache\CacheItem;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait AbstractAdapterTrait
-{
- use AbstractTrait;
-
- /**
- * @var \Closure needs to be set by class, signature is function(string <key>, mixed <value>, bool <isHit>)
- */
- private $createCacheItem;
-
- /**
- * @var \Closure needs to be set by class, signature is function(array <deferred>, string <namespace>, array <&expiredIds>)
- */
- private $mergeByLifetime;
-
- /**
- * {@inheritdoc}
- */
- public function getItem($key)
- {
- if ($this->deferred) {
- $this->commit();
- }
- $id = $this->getId($key);
-
- $f = $this->createCacheItem;
- $isHit = false;
- $value = null;
-
- try {
- foreach ($this->doFetch([$id]) as $value) {
- $isHit = true;
- }
-
- return $f($key, $value, $isHit);
- } catch (\Exception $e) {
- CacheItem::log($this->logger, 'Failed to fetch key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e]);
- }
-
- return $f($key, null, false);
- }
-
- /**
- * {@inheritdoc}
- */
- public function getItems(array $keys = [])
- {
- if ($this->deferred) {
- $this->commit();
- }
- $ids = [];
-
- foreach ($keys as $key) {
- $ids[] = $this->getId($key);
- }
- try {
- $items = $this->doFetch($ids);
- } catch (\Exception $e) {
- CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => $keys, 'exception' => $e]);
- $items = [];
- }
- $ids = array_combine($ids, $keys);
-
- return $this->generateItems($items, $ids);
- }
-
- /**
- * {@inheritdoc}
- *
- * @return bool
- */
- public function save(CacheItemInterface $item)
- {
- if (!$item instanceof CacheItem) {
- return false;
- }
- $this->deferred[$item->getKey()] = $item;
-
- return $this->commit();
- }
-
- /**
- * {@inheritdoc}
- *
- * @return bool
- */
- public function saveDeferred(CacheItemInterface $item)
- {
- if (!$item instanceof CacheItem) {
- return false;
- }
- $this->deferred[$item->getKey()] = $item;
-
- return true;
- }
-
- public function __sleep()
- {
- throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
- }
-
- public function __wakeup()
- {
- throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
- }
-
- public function __destruct()
- {
- if ($this->deferred) {
- $this->commit();
- }
- }
-
- private function generateItems(iterable $items, array &$keys): iterable
- {
- $f = $this->createCacheItem;
-
- try {
- foreach ($items as $id => $value) {
- if (!isset($keys[$id])) {
- $id = key($keys);
- }
- $key = $keys[$id];
- unset($keys[$id]);
- yield $key => $f($key, $value, true);
- }
- } catch (\Exception $e) {
- CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => array_values($keys), 'exception' => $e]);
- }
-
- foreach ($keys as $key) {
- yield $key => $f($key, null, false);
- }
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/AbstractTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/AbstractTrait.php
deleted file mode 100644
index f9a1d8f..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/AbstractTrait.php
+++ /dev/null
@@ -1,295 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Psr\Log\LoggerAwareTrait;
-use Symfony\Component\Cache\CacheItem;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait AbstractTrait
-{
- use LoggerAwareTrait;
-
- private $namespace;
- private $namespaceVersion = '';
- private $versioningIsEnabled = false;
- private $deferred = [];
- private $ids = [];
-
- /**
- * @var int|null The maximum length to enforce for identifiers or null when no limit applies
- */
- protected $maxIdLength;
-
- /**
- * Fetches several cache items.
- *
- * @param array $ids The cache identifiers to fetch
- *
- * @return array|\Traversable The corresponding values found in the cache
- */
- abstract protected function doFetch(array $ids);
-
- /**
- * Confirms if the cache contains specified cache item.
- *
- * @param string $id The identifier for which to check existence
- *
- * @return bool True if item exists in the cache, false otherwise
- */
- abstract protected function doHave($id);
-
- /**
- * Deletes all items in the pool.
- *
- * @param string $namespace The prefix used for all identifiers managed by this pool
- *
- * @return bool True if the pool was successfully cleared, false otherwise
- */
- abstract protected function doClear($namespace);
-
- /**
- * Removes multiple items from the pool.
- *
- * @param array $ids An array of identifiers that should be removed from the pool
- *
- * @return bool True if the items were successfully removed, false otherwise
- */
- abstract protected function doDelete(array $ids);
-
- /**
- * Persists several cache items immediately.
- *
- * @param array $values The values to cache, indexed by their cache identifier
- * @param int $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning
- *
- * @return array|bool The identifiers that failed to be cached or a boolean stating if caching succeeded or not
- */
- abstract protected function doSave(array $values, $lifetime);
-
- /**
- * {@inheritdoc}
- *
- * @return bool
- */
- public function hasItem($key)
- {
- $id = $this->getId($key);
-
- if (isset($this->deferred[$key])) {
- $this->commit();
- }
-
- try {
- return $this->doHave($id);
- } catch (\Exception $e) {
- CacheItem::log($this->logger, 'Failed to check if key "{key}" is cached: '.$e->getMessage(), ['key' => $key, 'exception' => $e]);
-
- return false;
- }
- }
-
- /**
- * {@inheritdoc}
- *
- * @param string $prefix
- *
- * @return bool
- */
- public function clear(/*string $prefix = ''*/)
- {
- $prefix = 0 < \func_num_args() ? (string) func_get_arg(0) : '';
- $this->deferred = [];
- if ($cleared = $this->versioningIsEnabled) {
- $namespaceVersion = substr_replace(base64_encode(pack('V', mt_rand())), static::NS_SEPARATOR, 5);
- try {
- $cleared = $this->doSave([static::NS_SEPARATOR.$this->namespace => $namespaceVersion], 0);
- } catch (\Exception $e) {
- $cleared = false;
- }
- if ($cleared = true === $cleared || [] === $cleared) {
- $this->namespaceVersion = $namespaceVersion;
- $this->ids = [];
- }
- }
-
- try {
- return $this->doClear($this->namespace.$prefix) || $cleared;
- } catch (\Exception $e) {
- CacheItem::log($this->logger, 'Failed to clear the cache: '.$e->getMessage(), ['exception' => $e]);
-
- return false;
- }
- }
-
- /**
- * {@inheritdoc}
- *
- * @return bool
- */
- public function deleteItem($key)
- {
- return $this->deleteItems([$key]);
- }
-
- /**
- * {@inheritdoc}
- *
- * @return bool
- */
- public function deleteItems(array $keys)
- {
- $ids = [];
-
- foreach ($keys as $key) {
- $ids[$key] = $this->getId($key);
- unset($this->deferred[$key]);
- }
-
- try {
- if ($this->doDelete($ids)) {
- return true;
- }
- } catch (\Exception $e) {
- }
-
- $ok = true;
-
- // When bulk-delete failed, retry each item individually
- foreach ($ids as $key => $id) {
- try {
- $e = null;
- if ($this->doDelete([$id])) {
- continue;
- }
- } catch (\Exception $e) {
- }
- $message = 'Failed to delete key "{key}"'.($e instanceof \Exception ? ': '.$e->getMessage() : '.');
- CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e]);
- $ok = false;
- }
-
- return $ok;
- }
-
- /**
- * Enables/disables versioning of items.
- *
- * When versioning is enabled, clearing the cache is atomic and doesn't require listing existing keys to proceed,
- * but old keys may need garbage collection and extra round-trips to the back-end are required.
- *
- * Calling this method also clears the memoized namespace version and thus forces a resynchonization of it.
- *
- * @param bool $enable
- *
- * @return bool the previous state of versioning
- */
- public function enableVersioning($enable = true)
- {
- $wasEnabled = $this->versioningIsEnabled;
- $this->versioningIsEnabled = (bool) $enable;
- $this->namespaceVersion = '';
- $this->ids = [];
-
- return $wasEnabled;
- }
-
- /**
- * {@inheritdoc}
- */
- public function reset()
- {
- if ($this->deferred) {
- $this->commit();
- }
- $this->namespaceVersion = '';
- $this->ids = [];
- }
-
- /**
- * Like the native unserialize() function but throws an exception if anything goes wrong.
- *
- * @param string $value
- *
- * @return mixed
- *
- * @throws \Exception
- *
- * @deprecated since Symfony 4.2, use DefaultMarshaller instead.
- */
- protected static function unserialize($value)
- {
- @trigger_error(sprintf('The "%s::unserialize()" method is deprecated since Symfony 4.2, use DefaultMarshaller instead.', __CLASS__), E_USER_DEPRECATED);
-
- if ('b:0;' === $value) {
- return false;
- }
- $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');
- try {
- if (false !== $value = unserialize($value)) {
- return $value;
- }
- throw new \DomainException('Failed to unserialize cached value');
- } catch (\Error $e) {
- throw new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
- } finally {
- ini_set('unserialize_callback_func', $unserializeCallbackHandler);
- }
- }
-
- private function getId($key): string
- {
- if ($this->versioningIsEnabled && '' === $this->namespaceVersion) {
- $this->ids = [];
- $this->namespaceVersion = '1'.static::NS_SEPARATOR;
- try {
- foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) {
- $this->namespaceVersion = $v;
- }
- if ('1'.static::NS_SEPARATOR === $this->namespaceVersion) {
- $this->namespaceVersion = substr_replace(base64_encode(pack('V', time())), static::NS_SEPARATOR, 5);
- $this->doSave([static::NS_SEPARATOR.$this->namespace => $this->namespaceVersion], 0);
- }
- } catch (\Exception $e) {
- }
- }
-
- if (\is_string($key) && isset($this->ids[$key])) {
- return $this->namespace.$this->namespaceVersion.$this->ids[$key];
- }
- CacheItem::validateKey($key);
- $this->ids[$key] = $key;
-
- if (null === $this->maxIdLength) {
- return $this->namespace.$this->namespaceVersion.$key;
- }
- if (\strlen($id = $this->namespace.$this->namespaceVersion.$key) > $this->maxIdLength) {
- // Use MD5 to favor speed over security, which is not an issue here
- $this->ids[$key] = $id = substr_replace(base64_encode(hash('md5', $key, true)), static::NS_SEPARATOR, -(\strlen($this->namespaceVersion) + 2));
- $id = $this->namespace.$this->namespaceVersion.$id;
- }
-
- return $id;
- }
-
- /**
- * @internal
- */
- public static function handleUnserializeCallback($class)
- {
- throw new \DomainException('Class not found: '.$class);
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/ApcuTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/ApcuTrait.php
deleted file mode 100644
index c55def6..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/ApcuTrait.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Symfony\Component\Cache\CacheItem;
-use Symfony\Component\Cache\Exception\CacheException;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait ApcuTrait
-{
- public static function isSupported()
- {
- return \function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN);
- }
-
- private function init(string $namespace, int $defaultLifetime, ?string $version)
- {
- if (!static::isSupported()) {
- throw new CacheException('APCu is not enabled');
- }
- if ('cli' === \PHP_SAPI) {
- ini_set('apc.use_request_time', 0);
- }
- parent::__construct($namespace, $defaultLifetime);
-
- if (null !== $version) {
- CacheItem::validateKey($version);
-
- if (!apcu_exists($version.'@'.$namespace)) {
- $this->doClear($namespace);
- apcu_add($version.'@'.$namespace, null);
- }
- }
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doFetch(array $ids)
- {
- $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');
- try {
- $values = [];
- foreach (apcu_fetch($ids, $ok) ?: [] as $k => $v) {
- if (null !== $v || $ok) {
- $values[$k] = $v;
- }
- }
-
- return $values;
- } catch (\Error $e) {
- throw new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
- } finally {
- ini_set('unserialize_callback_func', $unserializeCallbackHandler);
- }
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doHave($id)
- {
- return apcu_exists($id);
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doClear($namespace)
- {
- return isset($namespace[0]) && class_exists('APCuIterator', false) && ('cli' !== \PHP_SAPI || filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN))
- ? apcu_delete(new \APCuIterator(sprintf('/^%s/', preg_quote($namespace, '/')), APC_ITER_KEY))
- : apcu_clear_cache();
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doDelete(array $ids)
- {
- foreach ($ids as $id) {
- apcu_delete($id);
- }
-
- return true;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doSave(array $values, $lifetime)
- {
- try {
- if (false === $failures = apcu_store($values, null, $lifetime)) {
- $failures = $values;
- }
-
- return array_keys($failures);
- } catch (\Throwable $e) {
- if (1 === \count($values)) {
- // Workaround https://github.com/krakjoe/apcu/issues/170
- apcu_delete(key($values));
- }
-
- throw $e;
- }
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/ArrayTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/ArrayTrait.php
deleted file mode 100644
index 21872c5..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/ArrayTrait.php
+++ /dev/null
@@ -1,183 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Psr\Log\LoggerAwareTrait;
-use Symfony\Component\Cache\CacheItem;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait ArrayTrait
-{
- use LoggerAwareTrait;
-
- private $storeSerialized;
- private $values = [];
- private $expiries = [];
-
- /**
- * Returns all cached values, with cache miss as null.
- *
- * @return array
- */
- public function getValues()
- {
- if (!$this->storeSerialized) {
- return $this->values;
- }
-
- $values = $this->values;
- foreach ($values as $k => $v) {
- if (null === $v || 'N;' === $v) {
- continue;
- }
- if (!\is_string($v) || !isset($v[2]) || ':' !== $v[1]) {
- $values[$k] = serialize($v);
- }
- }
-
- return $values;
- }
-
- /**
- * {@inheritdoc}
- *
- * @return bool
- */
- public function hasItem($key)
- {
- if (\is_string($key) && isset($this->expiries[$key]) && $this->expiries[$key] > microtime(true)) {
- return true;
- }
- CacheItem::validateKey($key);
-
- return isset($this->expiries[$key]) && !$this->deleteItem($key);
- }
-
- /**
- * {@inheritdoc}
- *
- * @param string $prefix
- *
- * @return bool
- */
- public function clear(/*string $prefix = ''*/)
- {
- $prefix = 0 < \func_num_args() ? (string) func_get_arg(0) : '';
-
- if ('' !== $prefix) {
- foreach ($this->values as $key => $value) {
- if (0 === strpos($key, $prefix)) {
- unset($this->values[$key], $this->expiries[$key]);
- }
- }
- } else {
- $this->values = $this->expiries = [];
- }
-
- return true;
- }
-
- /**
- * {@inheritdoc}
- *
- * @return bool
- */
- public function deleteItem($key)
- {
- if (!\is_string($key) || !isset($this->expiries[$key])) {
- CacheItem::validateKey($key);
- }
- unset($this->values[$key], $this->expiries[$key]);
-
- return true;
- }
-
- /**
- * {@inheritdoc}
- */
- public function reset()
- {
- $this->clear();
- }
-
- private function generateItems(array $keys, float $now, callable $f): iterable
- {
- foreach ($keys as $i => $key) {
- if (!$isHit = isset($this->expiries[$key]) && ($this->expiries[$key] > $now || !$this->deleteItem($key))) {
- $this->values[$key] = $value = null;
- } else {
- $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key];
- }
- unset($keys[$i]);
-
- yield $key => $f($key, $value, $isHit);
- }
-
- foreach ($keys as $key) {
- yield $key => $f($key, null, false);
- }
- }
-
- private function freeze($value, $key)
- {
- if (null === $value) {
- return 'N;';
- }
- if (\is_string($value)) {
- // Serialize strings if they could be confused with serialized objects or arrays
- if ('N;' === $value || (isset($value[2]) && ':' === $value[1])) {
- return serialize($value);
- }
- } elseif (!is_scalar($value)) {
- try {
- $serialized = serialize($value);
- } catch (\Exception $e) {
- $type = \is_object($value) ? \get_class($value) : \gettype($value);
- $message = sprintf('Failed to save key "{key}" of type %s: %s', $type, $e->getMessage());
- CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e]);
-
- return null;
- }
- // Keep value serialized if it contains any objects or any internal references
- if ('C' === $serialized[0] || 'O' === $serialized[0] || preg_match('/;[OCRr]:[1-9]/', $serialized)) {
- return $serialized;
- }
- }
-
- return $value;
- }
-
- private function unfreeze(string $key, bool &$isHit)
- {
- if ('N;' === $value = $this->values[$key]) {
- return null;
- }
- if (\is_string($value) && isset($value[2]) && ':' === $value[1]) {
- try {
- $value = unserialize($value);
- } catch (\Exception $e) {
- CacheItem::log($this->logger, 'Failed to unserialize key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e]);
- $value = false;
- }
- if (false === $value) {
- $this->values[$key] = $value = null;
- $isHit = false;
- }
- }
-
- return $value;
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/ContractsTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/ContractsTrait.php
deleted file mode 100644
index c5827c3..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/ContractsTrait.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Psr\Log\LoggerInterface;
-use Symfony\Component\Cache\Adapter\AdapterInterface;
-use Symfony\Component\Cache\CacheItem;
-use Symfony\Component\Cache\Exception\InvalidArgumentException;
-use Symfony\Component\Cache\LockRegistry;
-use Symfony\Contracts\Cache\CacheInterface;
-use Symfony\Contracts\Cache\CacheTrait;
-use Symfony\Contracts\Cache\ItemInterface;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait ContractsTrait
-{
- use CacheTrait {
- doGet as private contractsGet;
- }
-
- private $callbackWrapper = [LockRegistry::class, 'compute'];
- private $computing = [];
-
- /**
- * Wraps the callback passed to ->get() in a callable.
- *
- * @return callable the previous callback wrapper
- */
- public function setCallbackWrapper(?callable $callbackWrapper): callable
- {
- $previousWrapper = $this->callbackWrapper;
- $this->callbackWrapper = $callbackWrapper ?? function (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger) {
- return $callback($item, $save);
- };
-
- return $previousWrapper;
- }
-
- private function doGet(AdapterInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null)
- {
- if (0 > $beta = $beta ?? 1.0) {
- throw new InvalidArgumentException(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', \get_class($this), $beta));
- }
-
- static $setMetadata;
-
- $setMetadata = $setMetadata ?? \Closure::bind(
- static function (CacheItem $item, float $startTime, ?array &$metadata) {
- if ($item->expiry > $endTime = microtime(true)) {
- $item->newMetadata[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry;
- $item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime));
- } else {
- unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME]);
- }
- },
- null,
- CacheItem::class
- );
-
- return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata, $key) {
- // don't wrap nor save recursive calls
- if (isset($this->computing[$key])) {
- $value = $callback($item, $save);
- $save = false;
-
- return $value;
- }
-
- $this->computing[$key] = $key;
- $startTime = microtime(true);
-
- try {
- $value = ($this->callbackWrapper)($callback, $item, $save, $pool, function (CacheItem $item) use ($setMetadata, $startTime, &$metadata) {
- $setMetadata($item, $startTime, $metadata);
- }, $this->logger ?? null);
- $setMetadata($item, $startTime, $metadata);
-
- return $value;
- } finally {
- unset($this->computing[$key]);
- }
- }, $beta, $metadata, $this->logger ?? null);
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/DoctrineTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/DoctrineTrait.php
deleted file mode 100644
index c87ecab..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/DoctrineTrait.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait DoctrineTrait
-{
- private $provider;
-
- /**
- * {@inheritdoc}
- */
- public function reset()
- {
- parent::reset();
- $this->provider->setNamespace($this->provider->getNamespace());
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doFetch(array $ids)
- {
- $unserializeCallbackHandler = ini_set('unserialize_callback_func', parent::class.'::handleUnserializeCallback');
- try {
- return $this->provider->fetchMultiple($ids);
- } catch (\Error $e) {
- $trace = $e->getTrace();
-
- if (isset($trace[0]['function']) && !isset($trace[0]['class'])) {
- switch ($trace[0]['function']) {
- case 'unserialize':
- case 'apcu_fetch':
- case 'apc_fetch':
- throw new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
- }
- }
-
- throw $e;
- } finally {
- ini_set('unserialize_callback_func', $unserializeCallbackHandler);
- }
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doHave($id)
- {
- return $this->provider->contains($id);
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doClear($namespace)
- {
- $namespace = $this->provider->getNamespace();
-
- return isset($namespace[0])
- ? $this->provider->deleteAll()
- : $this->provider->flushAll();
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doDelete(array $ids)
- {
- $ok = true;
- foreach ($ids as $id) {
- $ok = $this->provider->delete($id) && $ok;
- }
-
- return $ok;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doSave(array $values, $lifetime)
- {
- return $this->provider->saveMultiple($values, $lifetime);
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/FilesystemCommonTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/FilesystemCommonTrait.php
deleted file mode 100644
index d828982..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/FilesystemCommonTrait.php
+++ /dev/null
@@ -1,183 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Symfony\Component\Cache\Exception\InvalidArgumentException;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait FilesystemCommonTrait
-{
- private $directory;
- private $tmp;
-
- private function init(string $namespace, ?string $directory)
- {
- if (!isset($directory[0])) {
- $directory = sys_get_temp_dir().\DIRECTORY_SEPARATOR.'symfony-cache';
- } else {
- $directory = realpath($directory) ?: $directory;
- }
- if (isset($namespace[0])) {
- if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {
- throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));
- }
- $directory .= \DIRECTORY_SEPARATOR.$namespace;
- }
- if (!file_exists($directory)) {
- @mkdir($directory, 0777, true);
- }
- $directory .= \DIRECTORY_SEPARATOR;
- // On Windows the whole path is limited to 258 chars
- if ('\\' === \DIRECTORY_SEPARATOR && \strlen($directory) > 234) {
- throw new InvalidArgumentException(sprintf('Cache directory too long (%s)', $directory));
- }
-
- $this->directory = $directory;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doClear($namespace)
- {
- $ok = true;
-
- foreach ($this->scanHashDir($this->directory) as $file) {
- if ('' !== $namespace && 0 !== strpos($this->getFileKey($file), $namespace)) {
- continue;
- }
-
- $ok = ($this->doUnlink($file) || !file_exists($file)) && $ok;
- }
-
- return $ok;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doDelete(array $ids)
- {
- $ok = true;
-
- foreach ($ids as $id) {
- $file = $this->getFile($id);
- $ok = (!file_exists($file) || $this->doUnlink($file) || !file_exists($file)) && $ok;
- }
-
- return $ok;
- }
-
- protected function doUnlink($file)
- {
- return @unlink($file);
- }
-
- private function write(string $file, string $data, int $expiresAt = null)
- {
- set_error_handler(__CLASS__.'::throwError');
- try {
- if (null === $this->tmp) {
- $this->tmp = $this->directory.uniqid('', true);
- }
- file_put_contents($this->tmp, $data);
-
- if (null !== $expiresAt) {
- touch($this->tmp, $expiresAt);
- }
-
- return rename($this->tmp, $file);
- } finally {
- restore_error_handler();
- }
- }
-
- private function getFile(string $id, bool $mkdir = false, string $directory = null)
- {
- // Use MD5 to favor speed over security, which is not an issue here
- $hash = str_replace('/', '-', base64_encode(hash('md5', static::class.$id, true)));
- $dir = ($directory ?? $this->directory).strtoupper($hash[0].\DIRECTORY_SEPARATOR.$hash[1].\DIRECTORY_SEPARATOR);
-
- if ($mkdir && !file_exists($dir)) {
- @mkdir($dir, 0777, true);
- }
-
- return $dir.substr($hash, 2, 20);
- }
-
- private function getFileKey(string $file): string
- {
- return '';
- }
-
- private function scanHashDir(string $directory): \Generator
- {
- if (!file_exists($directory)) {
- return;
- }
-
- $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
-
- for ($i = 0; $i < 38; ++$i) {
- if (!file_exists($directory.$chars[$i])) {
- continue;
- }
-
- for ($j = 0; $j < 38; ++$j) {
- if (!file_exists($dir = $directory.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) {
- continue;
- }
-
- foreach (@scandir($dir, SCANDIR_SORT_NONE) ?: [] as $file) {
- if ('.' !== $file && '..' !== $file) {
- yield $dir.\DIRECTORY_SEPARATOR.$file;
- }
- }
- }
- }
- }
-
- /**
- * @internal
- */
- public static function throwError($type, $message, $file, $line)
- {
- throw new \ErrorException($message, 0, $type, $file, $line);
- }
-
- /**
- * @return array
- */
- public function __sleep()
- {
- throw new \BadMethodCallException('Cannot serialize '.__CLASS__);
- }
-
- public function __wakeup()
- {
- throw new \BadMethodCallException('Cannot unserialize '.__CLASS__);
- }
-
- public function __destruct()
- {
- if (method_exists(parent::class, '__destruct')) {
- parent::__destruct();
- }
- if (null !== $this->tmp && file_exists($this->tmp)) {
- unlink($this->tmp);
- }
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/FilesystemTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/FilesystemTrait.php
deleted file mode 100644
index 185eb00..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/FilesystemTrait.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Symfony\Component\Cache\Exception\CacheException;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- * @author Rob Frawley 2nd <rmf@src.run>
- *
- * @internal
- */
-trait FilesystemTrait
-{
- use FilesystemCommonTrait;
-
- private $marshaller;
-
- /**
- * @return bool
- */
- public function prune()
- {
- $time = time();
- $pruned = true;
-
- foreach ($this->scanHashDir($this->directory) as $file) {
- if (!$h = @fopen($file, 'rb')) {
- continue;
- }
-
- if (($expiresAt = (int) fgets($h)) && $time >= $expiresAt) {
- fclose($h);
- $pruned = @unlink($file) && !file_exists($file) && $pruned;
- } else {
- fclose($h);
- }
- }
-
- return $pruned;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doFetch(array $ids)
- {
- $values = [];
- $now = time();
-
- foreach ($ids as $id) {
- $file = $this->getFile($id);
- if (!file_exists($file) || !$h = @fopen($file, 'rb')) {
- continue;
- }
- if (($expiresAt = (int) fgets($h)) && $now >= $expiresAt) {
- fclose($h);
- @unlink($file);
- } else {
- $i = rawurldecode(rtrim(fgets($h)));
- $value = stream_get_contents($h);
- fclose($h);
- if ($i === $id) {
- $values[$id] = $this->marshaller->unmarshall($value);
- }
- }
- }
-
- return $values;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doHave($id)
- {
- $file = $this->getFile($id);
-
- return file_exists($file) && (@filemtime($file) > time() || $this->doFetch([$id]));
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doSave(array $values, $lifetime)
- {
- $expiresAt = $lifetime ? (time() + $lifetime) : 0;
- $values = $this->marshaller->marshall($values, $failed);
-
- foreach ($values as $id => $value) {
- if (!$this->write($this->getFile($id, true), $expiresAt."\n".rawurlencode($id)."\n".$value, $expiresAt)) {
- $failed[] = $id;
- }
- }
-
- if ($failed && !is_writable($this->directory)) {
- throw new CacheException(sprintf('Cache directory is not writable (%s)', $this->directory));
- }
-
- return $failed;
- }
-
- private function getFileKey(string $file): string
- {
- if (!$h = @fopen($file, 'rb')) {
- return '';
- }
-
- fgets($h); // expiry
- $encodedKey = fgets($h);
- fclose($h);
-
- return rawurldecode(rtrim($encodedKey));
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/MemcachedTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/MemcachedTrait.php
deleted file mode 100644
index 070eb0e..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/MemcachedTrait.php
+++ /dev/null
@@ -1,325 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Symfony\Component\Cache\Exception\CacheException;
-use Symfony\Component\Cache\Exception\InvalidArgumentException;
-use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
-use Symfony\Component\Cache\Marshaller\MarshallerInterface;
-
-/**
- * @author Rob Frawley 2nd <rmf@src.run>
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait MemcachedTrait
-{
- private static $defaultClientOptions = [
- 'persistent_id' => null,
- 'username' => null,
- 'password' => null,
- \Memcached::OPT_SERIALIZER => \Memcached::SERIALIZER_PHP,
- ];
-
- private $marshaller;
- private $client;
- private $lazyClient;
-
- public static function isSupported()
- {
- return \extension_loaded('memcached') && version_compare(phpversion('memcached'), '2.2.0', '>=');
- }
-
- private function init(\Memcached $client, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller)
- {
- if (!static::isSupported()) {
- throw new CacheException('Memcached >= 2.2.0 is required');
- }
- if ('Memcached' === \get_class($client)) {
- $opt = $client->getOption(\Memcached::OPT_SERIALIZER);
- if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) {
- throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".');
- }
- $this->maxIdLength -= \strlen($client->getOption(\Memcached::OPT_PREFIX_KEY));
- $this->client = $client;
- } else {
- $this->lazyClient = $client;
- }
-
- parent::__construct($namespace, $defaultLifetime);
- $this->enableVersioning();
- $this->marshaller = $marshaller ?? new DefaultMarshaller();
- }
-
- /**
- * Creates a Memcached instance.
- *
- * By default, the binary protocol, no block, and libketama compatible options are enabled.
- *
- * Examples for servers:
- * - 'memcached://user:pass@localhost?weight=33'
- * - [['localhost', 11211, 33]]
- *
- * @param array[]|string|string[] $servers An array of servers, a DSN, or an array of DSNs
- *
- * @return \Memcached
- *
- * @throws \ErrorException When invalid options or servers are provided
- */
- public static function createConnection($servers, array $options = [])
- {
- if (\is_string($servers)) {
- $servers = [$servers];
- } elseif (!\is_array($servers)) {
- throw new InvalidArgumentException(sprintf('MemcachedAdapter::createClient() expects array or string as first argument, %s given.', \gettype($servers)));
- }
- if (!static::isSupported()) {
- throw new CacheException('Memcached >= 2.2.0 is required');
- }
- set_error_handler(function ($type, $msg, $file, $line) { throw new \ErrorException($msg, 0, $type, $file, $line); });
- try {
- $options += static::$defaultClientOptions;
- $client = new \Memcached($options['persistent_id']);
- $username = $options['username'];
- $password = $options['password'];
-
- // parse any DSN in $servers
- foreach ($servers as $i => $dsn) {
- if (\is_array($dsn)) {
- continue;
- }
- if (0 !== strpos($dsn, 'memcached:')) {
- throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: %s does not start with "memcached:"', $dsn));
- }
- $params = preg_replace_callback('#^memcached:(//)?(?:([^@]*+)@)?#', function ($m) use (&$username, &$password) {
- if (!empty($m[2])) {
- list($username, $password) = explode(':', $m[2], 2) + [1 => null];
- }
-
- return 'file:'.($m[1] ?? '');
- }, $dsn);
- if (false === $params = parse_url($params)) {
- throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: %s', $dsn));
- }
- $query = $hosts = [];
- if (isset($params['query'])) {
- parse_str($params['query'], $query);
-
- if (isset($query['host'])) {
- if (!\is_array($hosts = $query['host'])) {
- throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: %s', $dsn));
- }
- foreach ($hosts as $host => $weight) {
- if (false === $port = strrpos($host, ':')) {
- $hosts[$host] = [$host, 11211, (int) $weight];
- } else {
- $hosts[$host] = [substr($host, 0, $port), (int) substr($host, 1 + $port), (int) $weight];
- }
- }
- $hosts = array_values($hosts);
- unset($query['host']);
- }
- if ($hosts && !isset($params['host']) && !isset($params['path'])) {
- unset($servers[$i]);
- $servers = array_merge($servers, $hosts);
- continue;
- }
- }
- if (!isset($params['host']) && !isset($params['path'])) {
- throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: %s', $dsn));
- }
- if (isset($params['path']) && preg_match('#/(\d+)$#', $params['path'], $m)) {
- $params['weight'] = $m[1];
- $params['path'] = substr($params['path'], 0, -\strlen($m[0]));
- }
- $params += [
- 'host' => isset($params['host']) ? $params['host'] : $params['path'],
- 'port' => isset($params['host']) ? 11211 : null,
- 'weight' => 0,
- ];
- if ($query) {
- $params += $query;
- $options = $query + $options;
- }
-
- $servers[$i] = [$params['host'], $params['port'], $params['weight']];
-
- if ($hosts) {
- $servers = array_merge($servers, $hosts);
- }
- }
-
- // set client's options
- unset($options['persistent_id'], $options['username'], $options['password'], $options['weight'], $options['lazy']);
- $options = array_change_key_case($options, CASE_UPPER);
- $client->setOption(\Memcached::OPT_BINARY_PROTOCOL, true);
- $client->setOption(\Memcached::OPT_NO_BLOCK, true);
- $client->setOption(\Memcached::OPT_TCP_NODELAY, true);
- if (!\array_key_exists('LIBKETAMA_COMPATIBLE', $options) && !\array_key_exists(\Memcached::OPT_LIBKETAMA_COMPATIBLE, $options)) {
- $client->setOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
- }
- foreach ($options as $name => $value) {
- if (\is_int($name)) {
- continue;
- }
- if ('HASH' === $name || 'SERIALIZER' === $name || 'DISTRIBUTION' === $name) {
- $value = \constant('Memcached::'.$name.'_'.strtoupper($value));
- }
- $opt = \constant('Memcached::OPT_'.$name);
-
- unset($options[$name]);
- $options[$opt] = $value;
- }
- $client->setOptions($options);
-
- // set client's servers, taking care of persistent connections
- if (!$client->isPristine()) {
- $oldServers = [];
- foreach ($client->getServerList() as $server) {
- $oldServers[] = [$server['host'], $server['port']];
- }
-
- $newServers = [];
- foreach ($servers as $server) {
- if (1 < \count($server)) {
- $server = array_values($server);
- unset($server[2]);
- $server[1] = (int) $server[1];
- }
- $newServers[] = $server;
- }
-
- if ($oldServers !== $newServers) {
- $client->resetServerList();
- $client->addServers($servers);
- }
- } else {
- $client->addServers($servers);
- }
-
- if (null !== $username || null !== $password) {
- if (!method_exists($client, 'setSaslAuthData')) {
- trigger_error('Missing SASL support: the memcached extension must be compiled with --enable-memcached-sasl.');
- }
- $client->setSaslAuthData($username, $password);
- }
-
- return $client;
- } finally {
- restore_error_handler();
- }
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doSave(array $values, $lifetime)
- {
- if (!$values = $this->marshaller->marshall($values, $failed)) {
- return $failed;
- }
-
- if ($lifetime && $lifetime > 30 * 86400) {
- $lifetime += time();
- }
-
- $encodedValues = [];
- foreach ($values as $key => $value) {
- $encodedValues[rawurlencode($key)] = $value;
- }
-
- return $this->checkResultCode($this->getClient()->setMulti($encodedValues, $lifetime)) ? $failed : false;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doFetch(array $ids)
- {
- try {
- $encodedIds = array_map('rawurlencode', $ids);
-
- $encodedResult = $this->checkResultCode($this->getClient()->getMulti($encodedIds));
-
- $result = [];
- foreach ($encodedResult as $key => $value) {
- $result[rawurldecode($key)] = $this->marshaller->unmarshall($value);
- }
-
- return $result;
- } catch (\Error $e) {
- throw new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
- }
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doHave($id)
- {
- return false !== $this->getClient()->get(rawurlencode($id)) || $this->checkResultCode(\Memcached::RES_SUCCESS === $this->client->getResultCode());
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doDelete(array $ids)
- {
- $ok = true;
- $encodedIds = array_map('rawurlencode', $ids);
- foreach ($this->checkResultCode($this->getClient()->deleteMulti($encodedIds)) as $result) {
- if (\Memcached::RES_SUCCESS !== $result && \Memcached::RES_NOTFOUND !== $result) {
- $ok = false;
- break;
- }
- }
-
- return $ok;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doClear($namespace)
- {
- return '' === $namespace && $this->getClient()->flush();
- }
-
- private function checkResultCode($result)
- {
- $code = $this->client->getResultCode();
-
- if (\Memcached::RES_SUCCESS === $code || \Memcached::RES_NOTFOUND === $code) {
- return $result;
- }
-
- throw new CacheException(sprintf('MemcachedAdapter client error: %s.', strtolower($this->client->getResultMessage())));
- }
-
- private function getClient(): \Memcached
- {
- if ($this->client) {
- return $this->client;
- }
-
- $opt = $this->lazyClient->getOption(\Memcached::OPT_SERIALIZER);
- if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) {
- throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".');
- }
- if ('' !== $prefix = (string) $this->lazyClient->getOption(\Memcached::OPT_PREFIX_KEY)) {
- throw new CacheException(sprintf('MemcachedAdapter: "prefix_key" option must be empty when using proxified connections, "%s" given.', $prefix));
- }
-
- return $this->client = $this->lazyClient;
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/PdoTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/PdoTrait.php
deleted file mode 100644
index 3ee1f8c..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/PdoTrait.php
+++ /dev/null
@@ -1,445 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Doctrine\DBAL\Connection;
-use Doctrine\DBAL\DBALException;
-use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
-use Doctrine\DBAL\DriverManager;
-use Doctrine\DBAL\Exception\TableNotFoundException;
-use Doctrine\DBAL\Schema\Schema;
-use Symfony\Component\Cache\Exception\InvalidArgumentException;
-use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
-use Symfony\Component\Cache\Marshaller\MarshallerInterface;
-
-/**
- * @internal
- */
-trait PdoTrait
-{
- private $marshaller;
- private $conn;
- private $dsn;
- private $driver;
- private $serverVersion;
- private $table = 'cache_items';
- private $idCol = 'item_id';
- private $dataCol = 'item_data';
- private $lifetimeCol = 'item_lifetime';
- private $timeCol = 'item_time';
- private $username = '';
- private $password = '';
- private $connectionOptions = [];
- private $namespace;
-
- private function init($connOrDsn, string $namespace, int $defaultLifetime, array $options, ?MarshallerInterface $marshaller)
- {
- if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) {
- throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0]));
- }
-
- if ($connOrDsn instanceof \PDO) {
- if (\PDO::ERRMODE_EXCEPTION !== $connOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) {
- throw new InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION))', __CLASS__));
- }
-
- $this->conn = $connOrDsn;
- } elseif ($connOrDsn instanceof Connection) {
- $this->conn = $connOrDsn;
- } elseif (\is_string($connOrDsn)) {
- $this->dsn = $connOrDsn;
- } else {
- throw new InvalidArgumentException(sprintf('"%s" requires PDO or Doctrine\DBAL\Connection instance or DSN string as first argument, "%s" given.', __CLASS__, \is_object($connOrDsn) ? \get_class($connOrDsn) : \gettype($connOrDsn)));
- }
-
- $this->table = isset($options['db_table']) ? $options['db_table'] : $this->table;
- $this->idCol = isset($options['db_id_col']) ? $options['db_id_col'] : $this->idCol;
- $this->dataCol = isset($options['db_data_col']) ? $options['db_data_col'] : $this->dataCol;
- $this->lifetimeCol = isset($options['db_lifetime_col']) ? $options['db_lifetime_col'] : $this->lifetimeCol;
- $this->timeCol = isset($options['db_time_col']) ? $options['db_time_col'] : $this->timeCol;
- $this->username = isset($options['db_username']) ? $options['db_username'] : $this->username;
- $this->password = isset($options['db_password']) ? $options['db_password'] : $this->password;
- $this->connectionOptions = isset($options['db_connection_options']) ? $options['db_connection_options'] : $this->connectionOptions;
- $this->namespace = $namespace;
- $this->marshaller = $marshaller ?? new DefaultMarshaller();
-
- parent::__construct($namespace, $defaultLifetime);
- }
-
- /**
- * Creates the table to store cache items which can be called once for setup.
- *
- * Cache ID are saved in a column of maximum length 255. Cache data is
- * saved in a BLOB.
- *
- * @throws \PDOException When the table already exists
- * @throws DBALException When the table already exists
- * @throws \DomainException When an unsupported PDO driver is used
- */
- public function createTable()
- {
- // connect if we are not yet
- $conn = $this->getConnection();
-
- if ($conn instanceof Connection) {
- $types = [
- 'mysql' => 'binary',
- 'sqlite' => 'text',
- 'pgsql' => 'string',
- 'oci' => 'string',
- 'sqlsrv' => 'string',
- ];
- if (!isset($types[$this->driver])) {
- throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver));
- }
-
- $schema = new Schema();
- $table = $schema->createTable($this->table);
- $table->addColumn($this->idCol, $types[$this->driver], ['length' => 255]);
- $table->addColumn($this->dataCol, 'blob', ['length' => 16777215]);
- $table->addColumn($this->lifetimeCol, 'integer', ['unsigned' => true, 'notnull' => false]);
- $table->addColumn($this->timeCol, 'integer', ['unsigned' => true]);
- $table->setPrimaryKey([$this->idCol]);
-
- foreach ($schema->toSql($conn->getDatabasePlatform()) as $sql) {
- $conn->exec($sql);
- }
-
- return;
- }
-
- switch ($this->driver) {
- case 'mysql':
- // We use varbinary for the ID column because it prevents unwanted conversions:
- // - character set conversions between server and client
- // - trailing space removal
- // - case-insensitivity
- // - language processing like é == e
- $sql = "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8_bin, ENGINE = InnoDB";
- break;
- case 'sqlite':
- $sql = "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
- break;
- case 'pgsql':
- $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
- break;
- case 'oci':
- $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
- break;
- case 'sqlsrv':
- $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)";
- break;
- default:
- throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver));
- }
-
- $conn->exec($sql);
- }
-
- /**
- * {@inheritdoc}
- */
- public function prune()
- {
- $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= :time";
-
- if ('' !== $this->namespace) {
- $deleteSql .= " AND $this->idCol LIKE :namespace";
- }
-
- try {
- $delete = $this->getConnection()->prepare($deleteSql);
- } catch (TableNotFoundException $e) {
- return true;
- } catch (\PDOException $e) {
- return true;
- }
- $delete->bindValue(':time', time(), \PDO::PARAM_INT);
-
- if ('' !== $this->namespace) {
- $delete->bindValue(':namespace', sprintf('%s%%', $this->namespace), \PDO::PARAM_STR);
- }
- try {
- return $delete->execute();
- } catch (TableNotFoundException $e) {
- return true;
- } catch (\PDOException $e) {
- return true;
- }
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doFetch(array $ids)
- {
- $now = time();
- $expired = [];
-
- $sql = str_pad('', (\count($ids) << 1) - 1, '?,');
- $sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN ($sql)";
- $stmt = $this->getConnection()->prepare($sql);
- $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
- foreach ($ids as $id) {
- $stmt->bindValue(++$i, $id);
- }
- $stmt->execute();
-
- while ($row = $stmt->fetch(\PDO::FETCH_NUM)) {
- if (null === $row[1]) {
- $expired[] = $row[0];
- } else {
- yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]);
- }
- }
-
- if ($expired) {
- $sql = str_pad('', (\count($expired) << 1) - 1, '?,');
- $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN ($sql)";
- $stmt = $this->getConnection()->prepare($sql);
- $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT);
- foreach ($expired as $id) {
- $stmt->bindValue(++$i, $id);
- }
- $stmt->execute();
- }
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doHave($id)
- {
- $sql = "SELECT 1 FROM $this->table WHERE $this->idCol = :id AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > :time)";
- $stmt = $this->getConnection()->prepare($sql);
-
- $stmt->bindValue(':id', $id);
- $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
- $stmt->execute();
-
- return (bool) $stmt->fetchColumn();
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doClear($namespace)
- {
- $conn = $this->getConnection();
-
- if ('' === $namespace) {
- if ('sqlite' === $this->driver) {
- $sql = "DELETE FROM $this->table";
- } else {
- $sql = "TRUNCATE TABLE $this->table";
- }
- } else {
- $sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'";
- }
-
- try {
- $conn->exec($sql);
- } catch (TableNotFoundException $e) {
- } catch (\PDOException $e) {
- }
-
- return true;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doDelete(array $ids)
- {
- $sql = str_pad('', (\count($ids) << 1) - 1, '?,');
- $sql = "DELETE FROM $this->table WHERE $this->idCol IN ($sql)";
- try {
- $stmt = $this->getConnection()->prepare($sql);
- $stmt->execute(array_values($ids));
- } catch (TableNotFoundException $e) {
- } catch (\PDOException $e) {
- }
-
- return true;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doSave(array $values, $lifetime)
- {
- if (!$values = $this->marshaller->marshall($values, $failed)) {
- return $failed;
- }
-
- $conn = $this->getConnection();
- $driver = $this->driver;
- $insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)";
-
- switch (true) {
- case 'mysql' === $driver:
- $sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)";
- break;
- case 'oci' === $driver:
- // DUAL is Oracle specific dummy table
- $sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ".
- "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
- "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?";
- break;
- case 'sqlsrv' === $driver && version_compare($this->getServerVersion(), '10', '>='):
- // MERGE is only available since SQL Server 2008 and must be terminated by semicolon
- // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx
- $sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ".
- "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
- "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;";
- break;
- case 'sqlite' === $driver:
- $sql = 'INSERT OR REPLACE'.substr($insertSql, 6);
- break;
- case 'pgsql' === $driver && version_compare($this->getServerVersion(), '9.5', '>='):
- $sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
- break;
- default:
- $driver = null;
- $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id";
- break;
- }
-
- $now = time();
- $lifetime = $lifetime ?: null;
- try {
- $stmt = $conn->prepare($sql);
- } catch (TableNotFoundException $e) {
- if (!$conn->isTransactionActive() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
- $this->createTable();
- }
- $stmt = $conn->prepare($sql);
- } catch (\PDOException $e) {
- if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
- $this->createTable();
- }
- $stmt = $conn->prepare($sql);
- }
-
- if ('sqlsrv' === $driver || 'oci' === $driver) {
- $stmt->bindParam(1, $id);
- $stmt->bindParam(2, $id);
- $stmt->bindParam(3, $data, \PDO::PARAM_LOB);
- $stmt->bindValue(4, $lifetime, \PDO::PARAM_INT);
- $stmt->bindValue(5, $now, \PDO::PARAM_INT);
- $stmt->bindParam(6, $data, \PDO::PARAM_LOB);
- $stmt->bindValue(7, $lifetime, \PDO::PARAM_INT);
- $stmt->bindValue(8, $now, \PDO::PARAM_INT);
- } else {
- $stmt->bindParam(':id', $id);
- $stmt->bindParam(':data', $data, \PDO::PARAM_LOB);
- $stmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
- $stmt->bindValue(':time', $now, \PDO::PARAM_INT);
- }
- if (null === $driver) {
- $insertStmt = $conn->prepare($insertSql);
-
- $insertStmt->bindParam(':id', $id);
- $insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
- $insertStmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT);
- $insertStmt->bindValue(':time', $now, \PDO::PARAM_INT);
- }
-
- foreach ($values as $id => $data) {
- try {
- $stmt->execute();
- } catch (TableNotFoundException $e) {
- if (!$conn->isTransactionActive() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
- $this->createTable();
- }
- $stmt->execute();
- } catch (\PDOException $e) {
- if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) {
- $this->createTable();
- }
- $stmt->execute();
- }
- if (null === $driver && !$stmt->rowCount()) {
- try {
- $insertStmt->execute();
- } catch (DBALException $e) {
- } catch (\PDOException $e) {
- // A concurrent write won, let it be
- }
- }
- }
-
- return $failed;
- }
-
- /**
- * @return \PDO|Connection
- */
- private function getConnection()
- {
- if (null === $this->conn) {
- if (strpos($this->dsn, '://')) {
- if (!class_exists(DriverManager::class)) {
- throw new InvalidArgumentException(sprintf('Failed to parse the DSN "%s". Try running "composer require doctrine/dbal".', $this->dsn));
- }
- $this->conn = DriverManager::getConnection(['url' => $this->dsn]);
- } else {
- $this->conn = new \PDO($this->dsn, $this->username, $this->password, $this->connectionOptions);
- $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
- }
- }
- if (null === $this->driver) {
- if ($this->conn instanceof \PDO) {
- $this->driver = $this->conn->getAttribute(\PDO::ATTR_DRIVER_NAME);
- } else {
- switch ($this->driver = $this->conn->getDriver()->getName()) {
- case 'mysqli':
- case 'pdo_mysql':
- case 'drizzle_pdo_mysql':
- $this->driver = 'mysql';
- break;
- case 'pdo_sqlite':
- $this->driver = 'sqlite';
- break;
- case 'pdo_pgsql':
- $this->driver = 'pgsql';
- break;
- case 'oci8':
- case 'pdo_oracle':
- $this->driver = 'oci';
- break;
- case 'pdo_sqlsrv':
- $this->driver = 'sqlsrv';
- break;
- }
- }
- }
-
- return $this->conn;
- }
-
- private function getServerVersion(): string
- {
- if (null === $this->serverVersion) {
- $conn = $this->conn instanceof \PDO ? $this->conn : $this->conn->getWrappedConnection();
- if ($conn instanceof \PDO) {
- $this->serverVersion = $conn->getAttribute(\PDO::ATTR_SERVER_VERSION);
- } elseif ($conn instanceof ServerInfoAwareConnection) {
- $this->serverVersion = $conn->getServerVersion();
- } else {
- $this->serverVersion = '0';
- }
- }
-
- return $this->serverVersion;
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/PhpArrayTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/PhpArrayTrait.php
deleted file mode 100644
index 6e7c72c..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/PhpArrayTrait.php
+++ /dev/null
@@ -1,169 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Symfony\Component\Cache\Adapter\AdapterInterface;
-use Symfony\Component\Cache\CacheItem;
-use Symfony\Component\Cache\Exception\InvalidArgumentException;
-use Symfony\Component\VarExporter\VarExporter;
-
-/**
- * @author Titouan Galopin <galopintitouan@gmail.com>
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait PhpArrayTrait
-{
- use ProxyTrait;
-
- private $file;
- private $keys;
- private $values;
-
- private static $valuesCache = [];
-
- /**
- * Store an array of cached values.
- *
- * @param array $values The cached values
- */
- public function warmUp(array $values)
- {
- if (file_exists($this->file)) {
- if (!is_file($this->file)) {
- throw new InvalidArgumentException(sprintf('Cache path exists and is not a file: %s.', $this->file));
- }
-
- if (!is_writable($this->file)) {
- throw new InvalidArgumentException(sprintf('Cache file is not writable: %s.', $this->file));
- }
- } else {
- $directory = \dirname($this->file);
-
- if (!is_dir($directory) && !@mkdir($directory, 0777, true)) {
- throw new InvalidArgumentException(sprintf('Cache directory does not exist and cannot be created: %s.', $directory));
- }
-
- if (!is_writable($directory)) {
- throw new InvalidArgumentException(sprintf('Cache directory is not writable: %s.', $directory));
- }
- }
-
- $dumpedValues = '';
- $dumpedMap = [];
- $dump = <<<'EOF'
-<?php
-
-// This file has been auto-generated by the Symfony Cache Component.
-
-return [[
-
-
-EOF;
-
- foreach ($values as $key => $value) {
- CacheItem::validateKey(\is_int($key) ? (string) $key : $key);
- $isStaticValue = true;
-
- if (null === $value) {
- $value = "'N;'";
- } elseif (\is_object($value) || \is_array($value)) {
- try {
- $value = VarExporter::export($value, $isStaticValue);
- } catch (\Exception $e) {
- throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable %s value.', $key, \is_object($value) ? \get_class($value) : 'array'), 0, $e);
- }
- } elseif (\is_string($value)) {
- // Wrap "N;" in a closure to not confuse it with an encoded `null`
- if ('N;' === $value) {
- $isStaticValue = false;
- }
- $value = var_export($value, true);
- } elseif (!is_scalar($value)) {
- throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable %s value.', $key, \gettype($value)));
- } else {
- $value = var_export($value, true);
- }
-
- if (!$isStaticValue) {
- $value = str_replace("\n", "\n ", $value);
- $value = "static function () {\n return {$value};\n}";
- }
- $hash = hash('md5', $value);
-
- if (null === $id = $dumpedMap[$hash] ?? null) {
- $id = $dumpedMap[$hash] = \count($dumpedMap);
- $dumpedValues .= "{$id} => {$value},\n";
- }
-
- $dump .= var_export($key, true)." => {$id},\n";
- }
-
- $dump .= "\n], [\n\n{$dumpedValues}\n]];\n";
-
- $tmpFile = uniqid($this->file, true);
-
- file_put_contents($tmpFile, $dump);
- @chmod($tmpFile, 0666 & ~umask());
- unset($serialized, $value, $dump);
-
- @rename($tmpFile, $this->file);
- unset(self::$valuesCache[$this->file]);
-
- $this->initialize();
- }
-
- /**
- * {@inheritdoc}
- *
- * @param string $prefix
- *
- * @return bool
- */
- public function clear(/*string $prefix = ''*/)
- {
- $prefix = 0 < \func_num_args() ? (string) func_get_arg(0) : '';
- $this->keys = $this->values = [];
-
- $cleared = @unlink($this->file) || !file_exists($this->file);
- unset(self::$valuesCache[$this->file]);
-
- if ($this->pool instanceof AdapterInterface) {
- return $this->pool->clear($prefix) && $cleared;
- }
-
- return $this->pool->clear() && $cleared;
- }
-
- /**
- * Load the cache file.
- */
- private function initialize()
- {
- if (isset(self::$valuesCache[$this->file])) {
- $values = self::$valuesCache[$this->file];
- } elseif (!file_exists($this->file)) {
- $this->keys = $this->values = [];
-
- return;
- } else {
- $values = self::$valuesCache[$this->file] = (include $this->file) ?: [[], []];
- }
-
- if (2 !== \count($values) || !isset($values[0], $values[1])) {
- $this->keys = $this->values = [];
- } else {
- list($this->keys, $this->values) = $values;
- }
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/PhpFilesTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/PhpFilesTrait.php
deleted file mode 100644
index 05b9d88..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/PhpFilesTrait.php
+++ /dev/null
@@ -1,313 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Symfony\Component\Cache\Exception\CacheException;
-use Symfony\Component\Cache\Exception\InvalidArgumentException;
-use Symfony\Component\VarExporter\VarExporter;
-
-/**
- * @author Piotr Stankowski <git@trakos.pl>
- * @author Nicolas Grekas <p@tchwork.com>
- * @author Rob Frawley 2nd <rmf@src.run>
- *
- * @internal
- */
-trait PhpFilesTrait
-{
- use FilesystemCommonTrait {
- doClear as private doCommonClear;
- doDelete as private doCommonDelete;
- }
-
- private $includeHandler;
- private $appendOnly;
- private $values = [];
- private $files = [];
-
- private static $startTime;
- private static $valuesCache = [];
-
- public static function isSupported()
- {
- self::$startTime = self::$startTime ?? $_SERVER['REQUEST_TIME'] ?? time();
-
- return \function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(ini_get('opcache.enable_cli'), FILTER_VALIDATE_BOOLEAN));
- }
-
- /**
- * @return bool
- */
- public function prune()
- {
- $time = time();
- $pruned = true;
- $getExpiry = true;
-
- set_error_handler($this->includeHandler);
- try {
- foreach ($this->scanHashDir($this->directory) as $file) {
- try {
- if (\is_array($expiresAt = include $file)) {
- $expiresAt = $expiresAt[0];
- }
- } catch (\ErrorException $e) {
- $expiresAt = $time;
- }
-
- if ($time >= $expiresAt) {
- $pruned = $this->doUnlink($file) && !file_exists($file) && $pruned;
- }
- }
- } finally {
- restore_error_handler();
- }
-
- return $pruned;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doFetch(array $ids)
- {
- if ($this->appendOnly) {
- $now = 0;
- $missingIds = [];
- } else {
- $now = time();
- $missingIds = $ids;
- $ids = [];
- }
- $values = [];
-
- begin:
- $getExpiry = false;
-
- foreach ($ids as $id) {
- if (null === $value = $this->values[$id] ?? null) {
- $missingIds[] = $id;
- } elseif ('N;' === $value) {
- $values[$id] = null;
- } elseif (!\is_object($value)) {
- $values[$id] = $value;
- } elseif (!$value instanceof LazyValue) {
- $values[$id] = $value();
- } elseif (false === $values[$id] = include $value->file) {
- unset($values[$id], $this->values[$id]);
- $missingIds[] = $id;
- }
- if (!$this->appendOnly) {
- unset($this->values[$id]);
- }
- }
-
- if (!$missingIds) {
- return $values;
- }
-
- set_error_handler($this->includeHandler);
- try {
- $getExpiry = true;
-
- foreach ($missingIds as $k => $id) {
- try {
- $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id);
-
- if (isset(self::$valuesCache[$file])) {
- [$expiresAt, $this->values[$id]] = self::$valuesCache[$file];
- } elseif (\is_array($expiresAt = include $file)) {
- if ($this->appendOnly) {
- self::$valuesCache[$file] = $expiresAt;
- }
-
- [$expiresAt, $this->values[$id]] = $expiresAt;
- } elseif ($now < $expiresAt) {
- $this->values[$id] = new LazyValue($file);
- }
-
- if ($now >= $expiresAt) {
- unset($this->values[$id], $missingIds[$k], self::$valuesCache[$file]);
- }
- } catch (\ErrorException $e) {
- unset($missingIds[$k]);
- }
- }
- } finally {
- restore_error_handler();
- }
-
- $ids = $missingIds;
- $missingIds = [];
- goto begin;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doHave($id)
- {
- if ($this->appendOnly && isset($this->values[$id])) {
- return true;
- }
-
- set_error_handler($this->includeHandler);
- try {
- $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id);
- $getExpiry = true;
-
- if (isset(self::$valuesCache[$file])) {
- [$expiresAt, $value] = self::$valuesCache[$file];
- } elseif (\is_array($expiresAt = include $file)) {
- if ($this->appendOnly) {
- self::$valuesCache[$file] = $expiresAt;
- }
-
- [$expiresAt, $value] = $expiresAt;
- } elseif ($this->appendOnly) {
- $value = new LazyValue($file);
- }
- } catch (\ErrorException $e) {
- return false;
- } finally {
- restore_error_handler();
- }
- if ($this->appendOnly) {
- $now = 0;
- $this->values[$id] = $value;
- } else {
- $now = time();
- }
-
- return $now < $expiresAt;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doSave(array $values, $lifetime)
- {
- $ok = true;
- $expiry = $lifetime ? time() + $lifetime : 'PHP_INT_MAX';
- $allowCompile = self::isSupported();
-
- foreach ($values as $key => $value) {
- unset($this->values[$key]);
- $isStaticValue = true;
- if (null === $value) {
- $value = "'N;'";
- } elseif (\is_object($value) || \is_array($value)) {
- try {
- $value = VarExporter::export($value, $isStaticValue);
- } catch (\Exception $e) {
- throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable %s value.', $key, \is_object($value) ? \get_class($value) : 'array'), 0, $e);
- }
- } elseif (\is_string($value)) {
- // Wrap "N;" in a closure to not confuse it with an encoded `null`
- if ('N;' === $value) {
- $isStaticValue = false;
- }
- $value = var_export($value, true);
- } elseif (!is_scalar($value)) {
- throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable %s value.', $key, \gettype($value)));
- } else {
- $value = var_export($value, true);
- }
-
- $encodedKey = rawurlencode($key);
-
- if ($isStaticValue) {
- $value = "return [{$expiry}, {$value}];";
- } elseif ($this->appendOnly) {
- $value = "return [{$expiry}, static function () { return {$value}; }];";
- } else {
- // We cannot use a closure here because of https://bugs.php.net/76982
- $value = str_replace('\Symfony\Component\VarExporter\Internal\\', '', $value);
- $value = "namespace Symfony\Component\VarExporter\Internal;\n\nreturn \$getExpiry ? {$expiry} : {$value};";
- }
-
- $file = $this->files[$key] = $this->getFile($key, true);
- // Since OPcache only compiles files older than the script execution start, set the file's mtime in the past
- $ok = $this->write($file, "<?php //{$encodedKey}\n\n{$value}\n", self::$startTime - 10) && $ok;
-
- if ($allowCompile) {
- @opcache_invalidate($file, true);
- @opcache_compile_file($file);
- }
- unset(self::$valuesCache[$file]);
- }
-
- if (!$ok && !is_writable($this->directory)) {
- throw new CacheException(sprintf('Cache directory is not writable (%s)', $this->directory));
- }
-
- return $ok;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doClear($namespace)
- {
- $this->values = [];
-
- return $this->doCommonClear($namespace);
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doDelete(array $ids)
- {
- foreach ($ids as $id) {
- unset($this->values[$id]);
- }
-
- return $this->doCommonDelete($ids);
- }
-
- protected function doUnlink($file)
- {
- unset(self::$valuesCache[$file]);
-
- if (self::isSupported()) {
- @opcache_invalidate($file, true);
- }
-
- return @unlink($file);
- }
-
- private function getFileKey(string $file): string
- {
- if (!$h = @fopen($file, 'rb')) {
- return '';
- }
-
- $encodedKey = substr(fgets($h), 8);
- fclose($h);
-
- return rawurldecode(rtrim($encodedKey));
- }
-}
-
-/**
- * @internal
- */
-class LazyValue
-{
- public $file;
-
- public function __construct(string $file)
- {
- $this->file = $file;
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/ProxyTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/ProxyTrait.php
deleted file mode 100644
index c86f360..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/ProxyTrait.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Symfony\Component\Cache\PruneableInterface;
-use Symfony\Contracts\Service\ResetInterface;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait ProxyTrait
-{
- private $pool;
-
- /**
- * {@inheritdoc}
- */
- public function prune()
- {
- return $this->pool instanceof PruneableInterface && $this->pool->prune();
- }
-
- /**
- * {@inheritdoc}
- */
- public function reset()
- {
- if ($this->pool instanceof ResetInterface) {
- $this->pool->reset();
- }
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisClusterProxy.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisClusterProxy.php
deleted file mode 100644
index b4cef59..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisClusterProxy.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-/**
- * @author Alessandro Chitolina <alekitto@gmail.com>
- *
- * @internal
- */
-class RedisClusterProxy
-{
- private $redis;
- private $initializer;
-
- public function __construct(\Closure $initializer)
- {
- $this->initializer = $initializer;
- }
-
- public function __call($method, array $args)
- {
- $this->redis ?: $this->redis = $this->initializer->__invoke();
-
- return $this->redis->{$method}(...$args);
- }
-
- public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
- {
- $this->redis ?: $this->redis = $this->initializer->__invoke();
-
- return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount);
- }
-
- public function scan(&$iIterator, $strPattern = null, $iCount = null)
- {
- $this->redis ?: $this->redis = $this->initializer->__invoke();
-
- return $this->redis->scan($iIterator, $strPattern, $iCount);
- }
-
- public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
- {
- $this->redis ?: $this->redis = $this->initializer->__invoke();
-
- return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount);
- }
-
- public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
- {
- $this->redis ?: $this->redis = $this->initializer->__invoke();
-
- return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount);
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisProxy.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisProxy.php
deleted file mode 100644
index 2b0b857..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisProxy.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-/**
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-class RedisProxy
-{
- private $redis;
- private $initializer;
- private $ready = false;
-
- public function __construct(\Redis $redis, \Closure $initializer)
- {
- $this->redis = $redis;
- $this->initializer = $initializer;
- }
-
- public function __call($method, array $args)
- {
- $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
-
- return $this->redis->{$method}(...$args);
- }
-
- public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
- {
- $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
-
- return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount);
- }
-
- public function scan(&$iIterator, $strPattern = null, $iCount = null)
- {
- $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
-
- return $this->redis->scan($iIterator, $strPattern, $iCount);
- }
-
- public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
- {
- $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
-
- return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount);
- }
-
- public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
- {
- $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis);
-
- return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount);
- }
-}
diff --git a/srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisTrait.php b/srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisTrait.php
deleted file mode 100644
index 9b65ccb..0000000
--- a/srcs/phpmyadmin/vendor/symfony/cache/Traits/RedisTrait.php
+++ /dev/null
@@ -1,511 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Cache\Traits;
-
-use Predis\Connection\Aggregate\ClusterInterface;
-use Predis\Connection\Aggregate\RedisCluster;
-use Predis\Response\Status;
-use Symfony\Component\Cache\Exception\CacheException;
-use Symfony\Component\Cache\Exception\InvalidArgumentException;
-use Symfony\Component\Cache\Marshaller\DefaultMarshaller;
-use Symfony\Component\Cache\Marshaller\MarshallerInterface;
-
-/**
- * @author Aurimas Niekis <aurimas@niekis.lt>
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @internal
- */
-trait RedisTrait
-{
- private static $defaultConnectionOptions = [
- 'class' => null,
- 'persistent' => 0,
- 'persistent_id' => null,
- 'timeout' => 30,
- 'read_timeout' => 0,
- 'retry_interval' => 0,
- 'tcp_keepalive' => 0,
- 'lazy' => null,
- 'redis_cluster' => false,
- 'redis_sentinel' => null,
- 'dbindex' => 0,
- 'failover' => 'none',
- ];
- private $redis;
- private $marshaller;
-
- /**
- * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface $redisClient
- */
- private function init($redisClient, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller)
- {
- parent::__construct($namespace, $defaultLifetime);
-
- if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) {
- throw new InvalidArgumentException(sprintf('RedisAdapter namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));
- }
-
- if (!$redisClient instanceof \Redis && !$redisClient instanceof \RedisArray && !$redisClient instanceof \RedisCluster && !$redisClient instanceof \Predis\ClientInterface && !$redisClient instanceof RedisProxy && !$redisClient instanceof RedisClusterProxy) {
- throw new InvalidArgumentException(sprintf('%s() expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, %s given.', __METHOD__, \is_object($redisClient) ? \get_class($redisClient) : \gettype($redisClient)));
- }
-
- if ($redisClient instanceof \Predis\ClientInterface && $redisClient->getOptions()->exceptions) {
- $options = clone $redisClient->getOptions();
- \Closure::bind(function () { $this->options['exceptions'] = false; }, $options, $options)();
- $redisClient = new $redisClient($redisClient->getConnection(), $options);
- }
-
- $this->redis = $redisClient;
- $this->marshaller = $marshaller ?? new DefaultMarshaller();
- }
-
- /**
- * Creates a Redis connection using a DSN configuration.
- *
- * Example DSN:
- * - redis://localhost
- * - redis://example.com:1234
- * - redis://secret@example.com/13
- * - redis:///var/run/redis.sock
- * - redis://secret@/var/run/redis.sock/13
- *
- * @param string $dsn
- * @param array $options See self::$defaultConnectionOptions
- *
- * @throws InvalidArgumentException when the DSN is invalid
- *
- * @return \Redis|\RedisCluster|\Predis\ClientInterface According to the "class" option
- */
- public static function createConnection($dsn, array $options = [])
- {
- if (0 === strpos($dsn, 'redis:')) {
- $scheme = 'redis';
- } elseif (0 === strpos($dsn, 'rediss:')) {
- $scheme = 'rediss';
- } else {
- throw new InvalidArgumentException(sprintf('Invalid Redis DSN: %s does not start with "redis:" or "rediss".', $dsn));
- }
-
- if (!\extension_loaded('redis') && !class_exists(\Predis\Client::class)) {
- throw new CacheException(sprintf('Cannot find the "redis" extension nor the "predis/predis" package: %s', $dsn));
- }
-
- $params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:[^:@]*+:)?([^@]*+)@)?#', function ($m) use (&$auth) {
- if (isset($m[2])) {
- $auth = $m[2];
- }
-
- return 'file:'.($m[1] ?? '');
- }, $dsn);
-
- if (false === $params = parse_url($params)) {
- throw new InvalidArgumentException(sprintf('Invalid Redis DSN: %s', $dsn));
- }
-
- $query = $hosts = [];
-
- if (isset($params['query'])) {
- parse_str($params['query'], $query);
-
- if (isset($query['host'])) {
- if (!\is_array($hosts = $query['host'])) {
- throw new InvalidArgumentException(sprintf('Invalid Redis DSN: %s', $dsn));
- }
- foreach ($hosts as $host => $parameters) {
- if (\is_string($parameters)) {
- parse_str($parameters, $parameters);
- }
- if (false === $i = strrpos($host, ':')) {
- $hosts[$host] = ['scheme' => 'tcp', 'host' => $host, 'port' => 6379] + $parameters;
- } elseif ($port = (int) substr($host, 1 + $i)) {
- $hosts[$host] = ['scheme' => 'tcp', 'host' => substr($host, 0, $i), 'port' => $port] + $parameters;
- } else {
- $hosts[$host] = ['scheme' => 'unix', 'path' => substr($host, 0, $i)] + $parameters;
- }
- }
- $hosts = array_values($hosts);
- }
- }
-
- if (isset($params['host']) || isset($params['path'])) {
- if (!isset($params['dbindex']) && isset($params['path']) && preg_match('#/(\d+)$#', $params['path'], $m)) {
- $params['dbindex'] = $m[1];
- $params['path'] = substr($params['path'], 0, -\strlen($m[0]));
- }
-
- if (isset($params['host'])) {
- array_unshift($hosts, ['scheme' => 'tcp', 'host' => $params['host'], 'port' => $params['port'] ?? 6379]);
- } else {
- array_unshift($hosts, ['scheme' => 'unix', 'path' => $params['path']]);
- }
- }
-
- if (!$hosts) {
- throw new InvalidArgumentException(sprintf('Invalid Redis DSN: %s', $dsn));
- }
-
- if (isset($params['redis_sentinel']) && !class_exists(\Predis\Client::class)) {
- throw new CacheException(sprintf('Redis Sentinel support requires the "predis/predis" package: %s', $dsn));
- }
-
- $params += $query + $options + self::$defaultConnectionOptions;
-
- if (null === $params['class'] && !isset($params['redis_sentinel']) && \extension_loaded('redis')) {
- $class = $params['redis_cluster'] ? \RedisCluster::class : (1 < \count($hosts) ? \RedisArray::class : \Redis::class);
- } else {
- $class = null === $params['class'] ? \Predis\Client::class : $params['class'];
- }
-
- if (is_a($class, \Redis::class, true)) {
- $connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect';
- $redis = new $class();
-
- $initializer = function ($redis) use ($connect, $params, $dsn, $auth, $hosts) {
- try {
- @$redis->{$connect}($hosts[0]['host'] ?? $hosts[0]['path'], $hosts[0]['port'] ?? null, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval']);
- } catch (\RedisException $e) {
- throw new InvalidArgumentException(sprintf('Redis connection failed (%s): %s', $e->getMessage(), $dsn));
- }
-
- set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
- $isConnected = $redis->isConnected();
- restore_error_handler();
- if (!$isConnected) {
- $error = preg_match('/^Redis::p?connect\(\): (.*)/', $error, $error) ? sprintf(' (%s)', $error[1]) : '';
- throw new InvalidArgumentException(sprintf('Redis connection failed%s: %s', $error, $dsn));
- }
-
- if ((null !== $auth && !$redis->auth($auth))
- || ($params['dbindex'] && !$redis->select($params['dbindex']))
- || ($params['read_timeout'] && !$redis->setOption(\Redis::OPT_READ_TIMEOUT, $params['read_timeout']))
- ) {
- $e = preg_replace('/^ERR /', '', $redis->getLastError());
- throw new InvalidArgumentException(sprintf('Redis connection failed (%s): %s', $e, $dsn));
- }
-
- if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) {
- $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);
- }
-
- return true;
- };
-
- if ($params['lazy']) {
- $redis = new RedisProxy($redis, $initializer);
- } else {
- $initializer($redis);
- }
- } elseif (is_a($class, \RedisArray::class, true)) {
- foreach ($hosts as $i => $host) {
- $hosts[$i] = 'tcp' === $host['scheme'] ? $host['host'].':'.$host['port'] : $host['path'];
- }
- $params['lazy_connect'] = $params['lazy'] ?? true;
- $params['connect_timeout'] = $params['timeout'];
-
- try {
- $redis = new $class($hosts, $params);
- } catch (\RedisClusterException $e) {
- throw new InvalidArgumentException(sprintf('Redis connection failed (%s): %s', $e->getMessage(), $dsn));
- }
-
- if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) {
- $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);
- }
- } elseif (is_a($class, \RedisCluster::class, true)) {
- $initializer = function () use ($class, $params, $dsn, $hosts) {
- foreach ($hosts as $i => $host) {
- $hosts[$i] = 'tcp' === $host['scheme'] ? $host['host'].':'.$host['port'] : $host['path'];
- }
-
- try {
- $redis = new $class(null, $hosts, $params['timeout'], $params['read_timeout'], (bool) $params['persistent']);
- } catch (\RedisClusterException $e) {
- throw new InvalidArgumentException(sprintf('Redis connection failed (%s): %s', $e->getMessage(), $dsn));
- }
-
- if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) {
- $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']);
- }
- switch ($params['failover']) {
- case 'error': $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_ERROR); break;
- case 'distribute': $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE); break;
- case 'slaves': $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES); break;
- }
-
- return $redis;
- };
-
- $redis = $params['lazy'] ? new RedisClusterProxy($initializer) : $initializer();
- } elseif (is_a($class, \Predis\ClientInterface::class, true)) {
- if ($params['redis_cluster']) {
- $params['cluster'] = 'redis';
- if (isset($params['redis_sentinel'])) {
- throw new InvalidArgumentException(sprintf('Cannot use both "redis_cluster" and "redis_sentinel" at the same time: %s', $dsn));
- }
- } elseif (isset($params['redis_sentinel'])) {
- $params['replication'] = 'sentinel';
- $params['service'] = $params['redis_sentinel'];
- }
- $params += ['parameters' => []];
- $params['parameters'] += [
- 'persistent' => $params['persistent'],
- 'timeout' => $params['timeout'],
- 'read_write_timeout' => $params['read_timeout'],
- 'tcp_nodelay' => true,
- ];
- if ($params['dbindex']) {
- $params['parameters']['database'] = $params['dbindex'];
- }
- if (null !== $auth) {
- $params['parameters']['password'] = $auth;
- }
- if (1 === \count($hosts) && !($params['redis_cluster'] || $params['redis_sentinel'])) {
- $hosts = $hosts[0];
- } elseif (\in_array($params['failover'], ['slaves', 'distribute'], true) && !isset($params['replication'])) {
- $params['replication'] = true;
- $hosts[0] += ['alias' => 'master'];
- }
- $params['exceptions'] = false;
-
- $redis = new $class($hosts, array_diff_key($params, self::$defaultConnectionOptions));
- if (isset($params['redis_sentinel'])) {
- $redis->getConnection()->setSentinelTimeout($params['timeout']);
- }
- } elseif (class_exists($class, false)) {
- throw new InvalidArgumentException(sprintf('"%s" is not a subclass of "Redis", "RedisArray", "RedisCluster" nor "Predis\ClientInterface".', $class));
- } else {
- throw new InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
- }
-
- return $redis;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doFetch(array $ids)
- {
- if (!$ids) {
- return [];
- }
-
- $result = [];
-
- if ($this->redis instanceof \Predis\ClientInterface && $this->redis->getConnection() instanceof ClusterInterface) {
- $values = $this->pipeline(function () use ($ids) {
- foreach ($ids as $id) {
- yield 'get' => [$id];
- }
- });
- } else {
- $values = $this->redis->mget($ids);
-
- if (!\is_array($values) || \count($values) !== \count($ids)) {
- return [];
- }
-
- $values = array_combine($ids, $values);
- }
-
- foreach ($values as $id => $v) {
- if ($v) {
- $result[$id] = $this->marshaller->unmarshall($v);
- }
- }
-
- return $result;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doHave($id)
- {
- return (bool) $this->redis->exists($id);
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doClear($namespace)
- {
- $cleared = true;
- if ($this->redis instanceof \Predis\ClientInterface) {
- $evalArgs = [0, $namespace];
- } else {
- $evalArgs = [[$namespace], 0];
- }
-
- foreach ($this->getHosts() as $host) {
- if (!isset($namespace[0])) {
- $cleared = $host->flushDb() && $cleared;
- continue;
- }
-
- $info = $host->info('Server');
- $info = isset($info['Server']) ? $info['Server'] : $info;
-
- if (!version_compare($info['redis_version'], '2.8', '>=')) {
- // As documented in Redis documentation (http://redis.io/commands/keys) using KEYS
- // can hang your server when it is executed against large databases (millions of items).
- // Whenever you hit this scale, you should really consider upgrading to Redis 2.8 or above.
- $cleared = $host->eval("local keys=redis.call('KEYS',ARGV[1]..'*') for i=1,#keys,5000 do redis.call('DEL',unpack(keys,i,math.min(i+4999,#keys))) end return 1", $evalArgs[0], $evalArgs[1]) && $cleared;
- continue;
- }
-
- $cursor = null;
- do {
- $keys = $host instanceof \Predis\ClientInterface ? $host->scan($cursor, 'MATCH', $namespace.'*', 'COUNT', 1000) : $host->scan($cursor, $namespace.'*', 1000);
- if (isset($keys[1]) && \is_array($keys[1])) {
- $cursor = $keys[0];
- $keys = $keys[1];
- }
- if ($keys) {
- $this->doDelete($keys);
- }
- } while ($cursor = (int) $cursor);
- }
-
- return $cleared;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doDelete(array $ids)
- {
- if (!$ids) {
- return true;
- }
-
- if ($this->redis instanceof \Predis\ClientInterface && $this->redis->getConnection() instanceof ClusterInterface) {
- $this->pipeline(function () use ($ids) {
- foreach ($ids as $id) {
- yield 'del' => [$id];
- }
- })->rewind();
- } else {
- $this->redis->del($ids);
- }
-
- return true;
- }
-
- /**
- * {@inheritdoc}
- */
- protected function doSave(array $values, $lifetime)
- {
- if (!$values = $this->marshaller->marshall($values, $failed)) {
- return $failed;
- }
-
- $results = $this->pipeline(function () use ($values, $lifetime) {
- foreach ($values as $id => $value) {
- if (0 >= $lifetime) {
- yield 'set' => [$id, $value];
- } else {
- yield 'setEx' => [$id, $lifetime, $value];
- }
- }
- });
-
- foreach ($results as $id => $result) {
- if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) {
- $failed[] = $id;
- }
- }
-
- return $failed;
- }
-
- private function pipeline(\Closure $generator, $redis = null): \Generator
- {
- $ids = [];
- $redis = $redis ?? $this->redis;
-
- if ($redis instanceof RedisClusterProxy || $redis instanceof \RedisCluster || ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof RedisCluster)) {
- // phpredis & predis don't support pipelining with RedisCluster
- // see https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#pipelining
- // see https://github.com/nrk/predis/issues/267#issuecomment-123781423
- $results = [];
- foreach ($generator() as $command => $args) {
- $results[] = $redis->{$command}(...$args);
- $ids[] = 'eval' === $command ? ($redis instanceof \Predis\ClientInterface ? $args[2] : $args[1][0]) : $args[0];
- }
- } elseif ($redis instanceof \Predis\ClientInterface) {
- $results = $redis->pipeline(static function ($redis) use ($generator, &$ids) {
- foreach ($generator() as $command => $args) {
- $redis->{$command}(...$args);
- $ids[] = 'eval' === $command ? $args[2] : $args[0];
- }
- });
- } elseif ($redis instanceof \RedisArray) {
- $connections = $results = $ids = [];
- foreach ($generator() as $command => $args) {
- $id = 'eval' === $command ? $args[1][0] : $args[0];
- if (!isset($connections[$h = $redis->_target($id)])) {
- $connections[$h] = [$redis->_instance($h), -1];
- $connections[$h][0]->multi(\Redis::PIPELINE);
- }
- $connections[$h][0]->{$command}(...$args);
- $results[] = [$h, ++$connections[$h][1]];
- $ids[] = $id;
- }
- foreach ($connections as $h => $c) {
- $connections[$h] = $c[0]->exec();
- }
- foreach ($results as $k => list($h, $c)) {
- $results[$k] = $connections[$h][$c];
- }
- } else {
- $redis->multi(\Redis::PIPELINE);
- foreach ($generator() as $command => $args) {
- $redis->{$command}(...$args);
- $ids[] = 'eval' === $command ? $args[1][0] : $args[0];
- }
- $results = $redis->exec();
- }
-
- foreach ($ids as $k => $id) {
- yield $id => $results[$k];
- }
- }
-
- private function getHosts(): array
- {
- $hosts = [$this->redis];
- if ($this->redis instanceof \Predis\ClientInterface) {
- $connection = $this->redis->getConnection();
- if ($connection instanceof ClusterInterface && $connection instanceof \Traversable) {
- $hosts = [];
- foreach ($connection as $c) {
- $hosts[] = new \Predis\Client($c);
- }
- }
- } elseif ($this->redis instanceof \RedisArray) {
- $hosts = [];
- foreach ($this->redis->_hosts() as $host) {
- $hosts[] = $this->redis->_instance($host);
- }
- } elseif ($this->redis instanceof RedisClusterProxy || $this->redis instanceof \RedisCluster) {
- $hosts = [];
- foreach ($this->redis->_masters() as $host) {
- $hosts[] = $h = new \Redis();
- $h->connect($host[0], $host[1]);
- }
- }
-
- return $hosts;
- }
-}