mirror of
https://github.com/predis/predis.git
synced 2026-08-22 18:51:28 +00:00
1a7b604c1b
Despite not being a globally supported feature of Predis anymore, they are still optionally supported by our default text protocol processors and they can be used to build custom stuff for specific needs.
90 lines
2.2 KiB
PHP
90 lines
2.2 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Predis package.
|
|
*
|
|
* (c) Daniele Alessandri <suppakilla@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Predis\Iterator;
|
|
|
|
use OuterIterator;
|
|
use RuntimeException;
|
|
use UnexpectedValueException;
|
|
|
|
/**
|
|
* Outer iterator consuming streamable multibulk responses by yielding tuples of
|
|
* keys and values.
|
|
*
|
|
* This wrapper is useful for responses to commands such as `HGETALL` that can
|
|
* be iterater as $key => $value pairs.
|
|
*
|
|
* @author Daniele Alessandri <suppakilla@gmail.com>
|
|
*/
|
|
class MultiBulkResponseTuple extends MultiBulkResponse implements OuterIterator
|
|
{
|
|
private $iterator;
|
|
|
|
/**
|
|
* @param MultiBulkResponseSimple $iterator Inner multibulk response iterator.
|
|
*/
|
|
public function __construct(MultiBulkResponseSimple $iterator)
|
|
{
|
|
$this->checkPreconditions($iterator);
|
|
|
|
$this->size = count($iterator) / 2;
|
|
$this->iterator = $iterator;
|
|
$this->position = $iterator->getPosition();
|
|
$this->current = $this->size > 0 ? $this->getValue() : null;
|
|
}
|
|
|
|
/**
|
|
* Checks for valid preconditions.
|
|
*
|
|
* @param MultiBulkResponseSimple $iterator Inner multibulk response iterator.
|
|
*/
|
|
protected function checkPreconditions(MultiBulkResponseSimple $iterator)
|
|
{
|
|
if ($iterator->getPosition() !== 0) {
|
|
throw new RuntimeException('Cannot initialize a tuple iterator with an already initiated iterator');
|
|
}
|
|
|
|
if (($size = count($iterator)) % 2 !== 0) {
|
|
throw new UnexpectedValueException("Invalid response size for a tuple iterator [$size]");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getInnerIterator()
|
|
{
|
|
return $this->iterator;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function __destruct()
|
|
{
|
|
$this->iterator->drop(true);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function getValue()
|
|
{
|
|
$k = $this->iterator->current();
|
|
$this->iterator->next();
|
|
|
|
$v = $this->iterator->current();
|
|
$this->iterator->next();
|
|
|
|
return array($k, $v);
|
|
}
|
|
}
|