Author: Daniele Alessandri (suppakilla@gmail.com)
コード例 #1
0
 /**
  * {@inheritdoc}
  */
 public function executeCommand(CommandInterface $command, callable $callback)
 {
     if ($this->buffer->isEmpty() && ($stream = $this->getResource())) {
         $this->loop->addWriteStream($stream, $this->writableCallback);
     }
     $request = $this->serializer->getRequestMessage($command->getId(), $command->getArguments());
     $this->buffer->append($request);
     $this->commands->enqueue([$command, $callback]);
 }
コード例 #2
0
 /**
  * {@inheritdoc}
  */
 public function executeCommand(CommandInterface $command, callable $callback)
 {
     if ($this->buffer->isEmpty() && ($stream = $this->getResource())) {
         $this->loop->addWriteStream($stream, $this->writableCallback);
     }
     $cmdargs = $command->getArguments();
     array_unshift($cmdargs, $command->getId());
     $this->buffer->append(phpiredis_format_command($cmdargs));
     $this->commands->enqueue([$command, $callback]);
 }
コード例 #3
0
 /**
  * Handles a response object.
  *
  * @param  ConnectionInterface     $connection
  * @param  CommandInterface        $command
  * @param  ResponseObjectInterface $response
  * @return mixed
  */
 protected function onResponseObject(ConnectionInterface $connection, CommandInterface $command, ResponseObjectInterface $response)
 {
     if ($response instanceof ResponseErrorInterface) {
         return $this->onResponseError($connection, $response);
     }
     if ($response instanceof Iterator) {
         return $command->parseResponse(iterator_to_array($response));
     }
     return $response;
 }
コード例 #4
0
 /**
  * @param string|CommandInterface $command   Expected command ID or instance.
  * @param array                   $arguments Expected command arguments.
  */
 public function __construct($command = null, array $arguments = null)
 {
     if ($command instanceof CommandInterface) {
         $this->commandID = strtoupper($command->getId());
         $this->arguments = $arguments ?: $command->getArguments();
     } else {
         $this->commandID = strtoupper($command);
         $this->arguments = $arguments;
     }
 }
コード例 #5
0
 private function storeDebug(CommandInterface $command, $direction)
 {
     $firtsArg = $command->getArgument(0);
     $timestamp = round(microtime(true) - $this->tstart, 4);
     $debug = $command->getId();
     $debug .= isset($firtsArg) ? " {$firtsArg} " : ' ';
     $debug .= "{$direction} {$this}";
     $debug .= " [{$timestamp}s]";
     $this->debugBuffer[] = $debug;
 }
コード例 #6
0
ファイル: RequestSerializer.php プロジェクト: cdandy/code-lib
 /**
  * {@inheritdoc}
  */
 public function serialize(CommandInterface $command)
 {
     $commandID = $command->getId();
     $arguments = $command->getArguments();
     $cmdlen = strlen($commandID);
     $reqlen = count($arguments) + 1;
     $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n";
     foreach ($arguments as $argument) {
         $arglen = strlen($argument);
         $buffer .= "\${$arglen}\r\n{$argument}\r\n";
     }
     return $buffer;
 }
コード例 #7
0
 /**
  * {@inheritdoc}
  */
 public function serialize(CommandInterface $command)
 {
     $commandId = $command->getId();
     $arguments = $command->getArguments();
     $cmdlen = strlen($commandId);
     $reqlen = count($arguments) + 1;
     $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandId}\r\n";
     for ($i = 0, $reqlen--; $i < $reqlen; $i++) {
         $argument = $arguments[$i];
         $arglen = strlen($argument);
         $buffer .= "\${$arglen}\r\n{$argument}\r\n";
     }
     return $buffer;
 }
コード例 #8
0
 /**
  * {@inheritdoc}
  */
 public function writeCommand(CommandInterface $command)
 {
     $cmdargs = $command->getArguments();
     array_unshift($cmdargs, $command->getId());
     $this->write(phpiredis_format_command($cmdargs));
 }
コード例 #9
0
ファイル: predis.php プロジェクト: sohel4r/wordpress_4_1_1
 /**
  * Checks if a SORT command is a readable operation by parsing the arguments
  * array of the specified commad instance.
  *
  * @param CommandInterface $command Command instance.
  *
  * @return bool
  */
 protected function isSortReadOnly(CommandInterface $command)
 {
     $arguments = $command->getArguments();
     return ($c = count($arguments)) === 1 ? true : $arguments[$c - 2] !== 'STORE';
 }
コード例 #10
0
 /**
  * {@inheritdoc}
  */
 public function process(CommandInterface $command)
 {
     if ($command instanceof PrefixableCommandInterface && $command->getArguments()) {
         $command->prefixKeys($this->prefix);
     }
 }
コード例 #11
0
 /**
  * {@inheritdoc}
  */
 public function getHash(CommandInterface $command)
 {
     $hash = $command->getHash();
     if (!isset($hash) && isset($this->commands[$cmdID = $command->getId()])) {
         if (null !== ($key = call_user_func($this->commands[$cmdID], $command))) {
             $hash = $this->hashGenerator->hash($key);
             $command->setHash($hash);
         }
     }
     return $hash;
 }
コード例 #12
0
 /**
  * Checks if the specified command is supported by this connection class.
  *
  * @param CommandInterface $command Command instance.
  *
  * @return string
  *
  * @throws NotSupportedException
  */
 protected function getCommandId(CommandInterface $command)
 {
     switch ($commandID = $command->getId()) {
         case 'AUTH':
         case 'SELECT':
         case 'MULTI':
         case 'EXEC':
         case 'WATCH':
         case 'UNWATCH':
         case 'DISCARD':
         case 'MONITOR':
             throw new NotSupportedException("Command '{$commandID}' is not allowed by Webdis.");
         default:
             return $commandID;
     }
 }
コード例 #13
0
 /**
  * Applies the specified prefix to the key of a MIGRATE command.
  *
  * @param CommandInterface $command Command instance.
  * @param string           $prefix  Prefix string.
  */
 public static function migrate(CommandInterface $command, $prefix)
 {
     if ($arguments = $command->getArguments()) {
         $arguments[2] = "{$prefix}{$arguments[2]}";
         $command->setRawArguments($arguments);
     }
 }
コード例 #14
0
ファイル: Client.php プロジェクト: sandeeprajoria/predis
 /**
  * Handles -ERR responses returned by Redis.
  *
  * @param CommandInterface       $command  Redis command that generated the error.
  * @param ErrorResponseInterface $response Instance of the error response.
  *
  * @throws ServerException
  * @return mixed
  *
  */
 protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $response)
 {
     if ($command instanceof ScriptCommand && $response->getErrorType() === 'NOSCRIPT') {
         $eval = $this->createCommand('EVAL');
         $eval->setRawArguments($command->getEvalArguments());
         $response = $this->executeCommand($eval);
         if (!$response instanceof ResponseInterface) {
             $response = $command->parseResponse($response);
         }
         return $response;
     }
     if ($this->options->exceptions) {
         throw new ServerException($response->getMessage());
     }
     return $response;
 }
コード例 #15
0
    protected function getTestCaseBuffer(CommandInterface $instance)
    {
        $id = $instance->getId();
        $fqn = get_class($instance);
        $fqnParts = explode('\\', $fqn);
        $class = array_pop($fqnParts) . "Test";
        $realm = $this->getTestRealm();
        $buffer = <<<PHP
<?php

/*
 * This file is part of the Predis package.
 *
 * (c) Daniele Alessandri <*****@*****.**>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Predis\\Command;

use \\PHPUnit_Framework_TestCase as StandardTestCase;

/**
 * @group commands
 * @group realm-{$realm}
 */
class {$class} extends CommandTestCase
{
    /**
     * {@inheritdoc}
     */
    protected function getExpectedCommand()
    {
        return '{$fqn}';
    }

    /**
     * {@inheritdoc}
     */
    protected function getExpectedId()
    {
        return '{$id}';
    }

    /**
     * @group disconnected
     */
    public function testFilterArguments()
    {
        \$this->markTestIncomplete('This test has not been implemented yet.');

        \$arguments = array(/* add arguments */);
        \$expected = array(/* add arguments */);

        \$command = \$this->getCommand();
        \$command->setArguments(\$arguments);

        \$this->assertSame(\$expected, \$command->getArguments());
    }

    /**
     * @group disconnected
     */
    public function testParseResponse()
    {
        \$this->markTestIncomplete('This test has not been implemented yet.');

        \$raw = null;
        \$expected = null;

        \$command = \$this->getCommand();

        \$this->assertSame(\$expected, \$command->parseResponse(\$raw));
    }

PHP;
        if ($instance instanceof PrefixableCommandInterface) {
            $buffer .= <<<PHP

    /**
     * @group disconnected
     */
    public function testPrefixKeys()
    {
        \$this->markTestIncomplete('This test has not been implemented yet.');

        \$arguments = array(/* add arguments */);
        \$expected = array(/* add arguments */);

        \$command = \$this->getCommandWithArgumentsArray(\$arguments);
        \$command->prefixKeys('prefix:');

        \$this->assertSame(\$expected, \$command->getArguments());
    }

    /**
     * @group disconnected
     */
    public function testPrefixKeysIgnoredOnEmptyArguments()
    {
        \$command = \$this->getCommand();
        \$command->prefixKeys('prefix:');

        \$this->assertSame(array(), \$command->getArguments());
    }

PHP;
        }
        return "{$buffer}}\n";
    }
コード例 #16
0
ファイル: Client.php プロジェクト: nvanh1984/predis
 /**
  * Handles -ERR responses returned by Redis.
  *
  * @param CommandInterface $command The command that generated the error.
  * @param ResponseErrorInterface $response The error response instance.
  * @return mixed
  */
 protected function onResponseError(CommandInterface $command, ResponseErrorInterface $response)
 {
     if ($command instanceof ScriptedCommand && $response->getErrorType() === 'NOSCRIPT') {
         $eval = $this->createCommand('eval');
         $eval->setRawArguments($command->getEvalArguments());
         return $this->executeCommand($eval);
     }
     if ($this->options->exceptions === true) {
         throw new ServerException($response->getMessage());
     }
     return $response;
 }
コード例 #17
0
 /**
  * Applies the specified prefix to the key of a GEORADIUS command.
  *
  * @param CommandInterface $command Command instance.
  * @param string           $prefix  Prefix string.
  */
 public static function georadius(CommandInterface $command, $prefix)
 {
     if ($arguments = $command->getArguments()) {
         $arguments[0] = "{$prefix}{$arguments[0]}";
         $startIndex = $command->getId() === 'GEORADIUS' ? 5 : 4;
         if (($count = count($arguments)) > $startIndex) {
             for ($i = $startIndex; $i < $count; ++$i) {
                 switch (strtoupper($arguments[$i])) {
                     case 'STORE':
                     case 'STOREDIST':
                         $arguments[$i] = "{$prefix}{$arguments[++$i]}";
                         break;
                 }
             }
         }
         $command->setRawArguments($arguments);
     }
 }
コード例 #18
0
 /**
  * {@inheritdoc}
  */
 public function writeCommand(CommandInterface $command)
 {
     $commandId = $command->getId();
     $arguments = $command->getArguments();
     $cmdlen = strlen($commandId);
     $reqlen = count($arguments) + 1;
     $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandId}\r\n";
     for ($i = 0; $i < $reqlen - 1; $i++) {
         $argument = $arguments[$i];
         $arglen = strlen($argument);
         $buffer .= "\${$arglen}\r\n{$argument}\r\n";
     }
     $this->writeBytes($buffer);
 }
コード例 #19
0
 /**
  * Checks if a GEORADIUS command is a readable operation by parsing the
  * arguments array of the specified commad instance.
  *
  * @param CommandInterface $command Command instance.
  *
  * @return bool
  */
 protected function isGeoradiusReadOnly(CommandInterface $command)
 {
     $arguments = $command->getArguments();
     $argc = count($arguments);
     $startIndex = $command->getId() === 'GEORADIUS' ? 5 : 4;
     if ($argc > $startIndex) {
         for ($i = $startIndex; $i < $argc; ++$i) {
             $argument = strtoupper($arguments[$i]);
             if ($argument === 'STORE' || $argument === 'STOREDIST') {
                 return false;
             }
         }
     }
     return true;
 }
コード例 #20
0
ファイル: KeyPrefixProcessor.php プロジェクト: goodww1/predis
 /**
  * Applies the specified prefix to the keys of Z[INTERSECTION|UNION]STORE.
  *
  * @param CommandInterface $command Command instance.
  * @param string           $prefix  Prefix string.
  */
 public static function zsetStore(CommandInterface $command, $prefix)
 {
     if ($arguments = $command->getArguments()) {
         $arguments[0] = "{$prefix}{$arguments[0]}";
         $length = (int) $arguments[1] + 2;
         for ($i = 2; $i < $length; $i++) {
             $arguments[$i] = "{$prefix}{$arguments[$i]}";
         }
         $command->setRawArguments($arguments);
     }
 }
コード例 #21
0
 /**
  * {@inheritdoc}
  */
 public function getHash(CommandInterface $command)
 {
     $hash = $command->getHash();
     if (!isset($hash) && isset($this->commands[$cmdID = $command->getId()])) {
         $key = call_user_func($this->commands[$cmdID], $command);
         if (isset($key)) {
             $hash = $this->getKeyHash($key);
             $command->setHash($hash);
         }
     }
     return $hash;
 }
コード例 #22
0
ファイル: WebdisConnection.php プロジェクト: biswars/retwis
 /**
  * Checks if the specified command is supported by this connection class.
  *
  * @param  CommandInterface $command The instance of a Redis command.
  * @return string
  */
 protected function getCommandId(CommandInterface $command)
 {
     switch ($commandId = $command->getId()) {
         case 'AUTH':
         case 'SELECT':
         case 'MULTI':
         case 'EXEC':
         case 'WATCH':
         case 'UNWATCH':
         case 'DISCARD':
         case 'MONITOR':
             throw new NotSupportedException("Disabled command: {$command->getId()}");
         default:
             return $commandId;
     }
 }
コード例 #23
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;
 }
コード例 #24
0
 private function commandToString(CommandInterface $command)
 {
     return array_reduce($command->getArguments(), array($this, 'toStringArgumentReducer'), $command->getId());
 }
コード例 #25
0
 /**
  * {@inheritdoc}
  */
 public function writeRequest(CommandInterface $command)
 {
     $commandID = $command->getId();
     $arguments = $command->getArguments();
     $cmdlen = strlen($commandID);
     $reqlen = count($arguments) + 1;
     $buffer = "*{$reqlen}\r\n\${$cmdlen}\r\n{$commandID}\r\n";
     for ($i = 0, $reqlen--; $i < $reqlen; ++$i) {
         $argument = $arguments[$i];
         $arglen = strlen($argument);
         $buffer .= "\${$arglen}\r\n{$argument}\r\n";
     }
     $this->write($buffer);
 }
コード例 #26
0
 /**
  * {@inheritdoc}
  */
 public function readResponse(CommandInterface $command)
 {
     $reply = $this->read();
     if ($reply instanceof ResponseObjectInterface) {
         return $reply;
     }
     return $command->parseResponse($reply);
 }