| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | <?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\VarDumper\Caster;use Symfony\Component\VarDumper\Cloner\Stub;/** * Casts Redis class from ext-redis to array representation. * * @author Nicolas Grekas <p@tchwork.com> * * @final since Symfony 4.4 */class RedisCaster{    private const SERIALIZERS = [        \Redis::SERIALIZER_NONE => 'NONE',        \Redis::SERIALIZER_PHP => 'PHP',        2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY    ];    private const MODES = [        \Redis::ATOMIC => 'ATOMIC',        \Redis::MULTI => 'MULTI',        \Redis::PIPELINE => 'PIPELINE',    ];    private const COMPRESSION_MODES = [        0 => 'NONE', // Redis::COMPRESSION_NONE        1 => 'LZF',  // Redis::COMPRESSION_LZF    ];    private const FAILOVER_OPTIONS = [        \RedisCluster::FAILOVER_NONE => 'NONE',        \RedisCluster::FAILOVER_ERROR => 'ERROR',        \RedisCluster::FAILOVER_DISTRIBUTE => 'DISTRIBUTE',        \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES => 'DISTRIBUTE_SLAVES',    ];    public static function castRedis(\Redis $c, array $a, Stub $stub, $isNested)    {        $prefix = Caster::PREFIX_VIRTUAL;        if (!$connected = $c->isConnected()) {            return $a + [                $prefix.'isConnected' => $connected,            ];        }        $mode = $c->getMode();        return $a + [            $prefix.'isConnected' => $connected,            $prefix.'host' => $c->getHost(),            $prefix.'port' => $c->getPort(),            $prefix.'auth' => $c->getAuth(),            $prefix.'mode' => isset(self::MODES[$mode]) ? new ConstStub(self::MODES[$mode], $mode) : $mode,            $prefix.'dbNum' => $c->getDbNum(),            $prefix.'timeout' => $c->getTimeout(),            $prefix.'lastError' => $c->getLastError(),            $prefix.'persistentId' => $c->getPersistentID(),            $prefix.'options' => self::getRedisOptions($c),        ];    }    public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, $isNested)    {        $prefix = Caster::PREFIX_VIRTUAL;        return $a + [            $prefix.'hosts' => $c->_hosts(),            $prefix.'function' => ClassStub::wrapCallable($c->_function()),            $prefix.'lastError' => $c->getLastError(),            $prefix.'options' => self::getRedisOptions($c),        ];    }    public static function castRedisCluster(\RedisCluster $c, array $a, Stub $stub, $isNested)    {        $prefix = Caster::PREFIX_VIRTUAL;        $failover = $c->getOption(\RedisCluster::OPT_SLAVE_FAILOVER);        $a += [            $prefix.'_masters' => $c->_masters(),            $prefix.'_redir' => $c->_redir(),            $prefix.'mode' => new ConstStub($c->getMode() ? 'MULTI' : 'ATOMIC', $c->getMode()),            $prefix.'lastError' => $c->getLastError(),            $prefix.'options' => self::getRedisOptions($c, [                'SLAVE_FAILOVER' => isset(self::FAILOVER_OPTIONS[$failover]) ? new ConstStub(self::FAILOVER_OPTIONS[$failover], $failover) : $failover,            ]),        ];        return $a;    }    /**     * @param \Redis|\RedisArray|\RedisCluster $redis     */    private static function getRedisOptions($redis, array $options = []): EnumStub    {        $serializer = $redis->getOption(\Redis::OPT_SERIALIZER);        if (\is_array($serializer)) {            foreach ($serializer as &$v) {                if (isset(self::SERIALIZERS[$v])) {                    $v = new ConstStub(self::SERIALIZERS[$v], $v);                }            }        } elseif (isset(self::SERIALIZERS[$serializer])) {            $serializer = new ConstStub(self::SERIALIZERS[$serializer], $serializer);        }        $compression = \defined('Redis::OPT_COMPRESSION') ? $redis->getOption(\Redis::OPT_COMPRESSION) : 0;        if (\is_array($compression)) {            foreach ($compression as &$v) {                if (isset(self::COMPRESSION_MODES[$v])) {                    $v = new ConstStub(self::COMPRESSION_MODES[$v], $v);                }            }        } elseif (isset(self::COMPRESSION_MODES[$compression])) {            $compression = new ConstStub(self::COMPRESSION_MODES[$compression], $compression);        }        $retry = \defined('Redis::OPT_SCAN') ? $redis->getOption(\Redis::OPT_SCAN) : 0;        if (\is_array($retry)) {            foreach ($retry as &$v) {                $v = new ConstStub($v ? 'RETRY' : 'NORETRY', $v);            }        } else {            $retry = new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry);        }        $options += [            'TCP_KEEPALIVE' => \defined('Redis::OPT_TCP_KEEPALIVE') ? $redis->getOption(\Redis::OPT_TCP_KEEPALIVE) : 0,            'READ_TIMEOUT' => $redis->getOption(\Redis::OPT_READ_TIMEOUT),            'COMPRESSION' => $compression,            'SERIALIZER' => $serializer,            'PREFIX' => $redis->getOption(\Redis::OPT_PREFIX),            'SCAN' => $retry,        ];        return new EnumStub($options);    }}
 |