/** * {@inheritdoc} */ public function execute(ConnectionInterface $connection, SplQueue $commands) { $size = count($commands); $values = array(); $connectionExceptions = array(); foreach ($commands as $command) { $cmdConnection = $connection->getConnection($command); if (isset($connectionExceptions[spl_object_hash($cmdConnection)])) { continue; } try { $cmdConnection->writeCommand($command); } catch (CommunicationException $exception) { $connectionExceptions[spl_object_hash($cmdConnection)] = $exception; } } for ($i = 0; $i < $size; $i++) { $command = $commands->dequeue(); $cmdConnection = $connection->getConnection($command); $connectionObjectHash = spl_object_hash($cmdConnection); if (isset($connectionExceptions[$connectionObjectHash])) { $values[$i] = $connectionExceptions[$connectionObjectHash]; continue; } try { $response = $cmdConnection->readResponse($command); $values[$i] = $response instanceof \Iterator ? iterator_to_array($response) : $response; } catch (CommunicationException $exception) { $values[$i] = $exception; $connectionExceptions[$connectionObjectHash] = $exception; } } return $values; }
/** * Handles -ERR responses returned by Redis. * * @param ConnectionInterface $connection The connection that returned the error. * @param ResponseErrorInterface $response The error response instance. */ protected function onResponseError(ConnectionInterface $connection, ResponseErrorInterface $response) { // Force disconnection to prevent protocol desynchronization. $connection->disconnect(); $message = $response->getMessage(); throw new ServerException($message); }
/** * {@inheritdoc} */ protected function executePipeline(ConnectionInterface $connection, SplQueue $commands) { while (!$commands->isEmpty()) { $connection->writeRequest($commands->dequeue()); } $connection->disconnect(); return array(); }
/** * {@inheritdoc} */ public function executeCommand(CommandInterface $command) { $response = $this->connection->executeCommand($command); if ($response instanceof ResponseInterface) { if ($response instanceof ErrorResponseInterface) { $response = $this->onErrorResponse($command, $response); } return $response; } return $command->parseResponse($response); }
/** * {@inheritdoc} */ public function execute(ConnectionInterface $connection, SplQueue $commands) { $size = count($commands); $values = array(); foreach ($commands as $command) { try { $connection->writeCommand($command); } catch (CommunicationException $exception) { return array_fill(0, $size, $exception); } } for ($i = 0; $i < $size; $i++) { $command = $commands->dequeue(); try { $response = $connection->readResponse($command); $values[$i] = $response instanceof \Iterator ? iterator_to_array($response) : $response; } catch (CommunicationException $exception) { $toAdd = count($commands) - count($values); $values = array_merge($values, array_fill(0, $toAdd, $exception)); break; } } return $values; }
/** * {@inheritdoc} */ protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) { $profile = $this->getClient()->getProfile(); $connection->executeCommand($profile->createCommand('multi')); foreach ($commands as $command) { $connection->writeRequest($command); } foreach ($commands as $command) { $response = $connection->readResponse($command); if ($response instanceof ErrorResponseInterface) { $connection->executeCommand($profile->createCommand('discard')); throw new ServerException($response->getMessage()); } } $executed = $connection->executeCommand($profile->createCommand('exec')); if (!isset($executed)) { // TODO: should be throwing a more appropriate exception. throw new ClientException('The underlying transaction has been aborted by the server.'); } if (count($executed) !== count($commands)) { $expected = count($commands); $received = count($executed); throw new ClientException("Invalid number of responses [expected {$expected}, received {$received}]."); } $responses = array(); $sizeOfPipe = count($commands); $exceptions = $this->throwServerExceptions(); for ($i = 0; $i < $sizeOfPipe; ++$i) { $command = $commands->dequeue(); $response = $executed[$i]; if (!$response instanceof ResponseInterface) { $responses[] = $command->parseResponse($response); } elseif ($response instanceof ErrorResponseInterface && $exceptions) { $this->exception($connection, $response); } else { $responses[] = $response; } unset($executed[$i]); } return $responses; }
/** * Allows the pipeline executor to perform operations on the * connection before starting to execute the commands stored * in the pipeline. * * @param ConnectionInterface $connection Connection instance. */ protected function checkConnection(ConnectionInterface $connection) { if ($connection instanceof ReplicationConnectionInterface) { $connection->switchTo('master'); } }
/** * Implements the logic to flush the queued commands and read the responses * from the current connection. * * @param ConnectionInterface $connection Current connection instance. * @param \SplQueue $commands Queued commands. * * @return array */ protected function executePipeline(ConnectionInterface $connection, \SplQueue $commands) { foreach ($commands as $command) { $connection->writeRequest($command); } $responses = array(); $exceptions = $this->throwServerExceptions(); while (!$commands->isEmpty()) { $command = $commands->dequeue(); $response = $connection->readResponse($command); if (!$response instanceof ResponseInterface) { $responses[] = $command->parseResponse($response); } elseif ($response instanceof ErrorResponseInterface && $exceptions) { $this->exception($connection, $response); } else { $responses[] = $response; } } return $responses; }