%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/vendor/nmred/kafka-php/src/Kafka/Protocol/Fetch/ |
| Current File : /www/varak.net/wiki.varak.net/vendor/nmred/kafka-php/src/Kafka/Protocol/Fetch/Partition.php |
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
// +---------------------------------------------------------------------------
// | SWAN [ $_SWANBR_SLOGAN_$ ]
// +---------------------------------------------------------------------------
// | Copyright $_SWANBR_COPYRIGHT_$
// +---------------------------------------------------------------------------
// | Version $_SWANBR_VERSION_$
// +---------------------------------------------------------------------------
// | Licensed ( $_SWANBR_LICENSED_URL_$ )
// +---------------------------------------------------------------------------
// | $_SWANBR_WEB_DOMAIN_$
// +---------------------------------------------------------------------------
namespace Kafka\Protocol\Fetch;
use \Kafka\Protocol\Decoder;
/**
+------------------------------------------------------------------------------
* Kafka protocol since Kafka v0.8
+------------------------------------------------------------------------------
*
* @package
* @version $_SWANBR_VERSION_$
* @copyright Copyleft
* @author $_SWANBR_AUTHOR_$
+------------------------------------------------------------------------------
*/
class Partition implements \Iterator, \Countable
{
// {{{ members
/**
* kafka socket object
*
* @var mixed
* @access private
*/
private $stream = null;
/**
* validCount
*
* @var float
* @access private
*/
private $validCount = 0;
/**
* partitions count
*
* @var float
* @access private
*/
private $partitionCount = false;
/**
* current topic
*
* @var mixed
* @access private
*/
private $current = null;
/**
* current iterator key
* partition id
*
* @var string
* @access private
*/
private $key = null;
/**
* partition errCode
*
* @var float
* @access private
*/
private $errCode = 0;
/**
* partition offset
*
* @var float
* @access private
*/
private $offset = 0;
/**
* partition current fetch offset
*
* @var float
* @access private
*/
private $currentOffset = 0;
/**
* valid
*
* @var mixed
* @access private
*/
private $valid = false;
/**
* current topic name
*
* @var string
* @access private
*/
private $topicName = '';
/**
* request fetch context
*
* @var array
*/
private $context = array();
// }}}
// {{{ functions
// {{{ public function __construct()
/**
* __construct
*
* @param \Kafka\Protocol\Fetch\Topic $topic
* @param array $context
* @access public
*/
public function __construct(\Kafka\Protocol\Fetch\Topic $topic, $context = array())
{
$this->stream = $topic->getStream();
$this->topicName = $topic->key();
$this->context = $context;
$this->partitionCount = $this->getPartitionCount();
}
// }}}
// {{{ public function current()
/**
* current
*
* @access public
* @return mixed
*/
public function current()
{
return $this->current;
}
// }}}
// {{{ public function key()
/**
* key
*
* @access public
* @return string
*/
public function key()
{
return $this->key;
}
// }}}
// {{{ public function rewind()
/**
* implements Iterator function
*
* @access public
* @return integer
*/
public function rewind()
{
$this->valid = $this->loadNextPartition();
}
// }}}
// {{{ public function valid()
/**
* implements Iterator function
*
* @access public
* @return integer
*/
public function valid()
{
return $this->valid && $this->validCount <= $this->partitionCount;
}
// }}}
// {{{ public function next()
/**
* implements Iterator function
*
* @access public
* @return void
*/
public function next()
{
$this->valid = $this->loadNextPartition();
}
// }}}
// {{{ public function count()
/**
* implements Countable function
*
* @access public
* @return integer
*/
public function count()
{
return $this->partitionCount;
}
// }}}
// {{{ public function getErrCode()
/**
* get partition errcode
*
* @access public
* @return float
*/
public function getErrCode()
{
return $this->errCode;
}
// }}}
// {{{ public function getHighOffset()
/**
* get partition high offset
*
* @access public
* @return float
*/
public function getHighOffset()
{
return $this->offset;
}
// }}}
// {{{ public function getTopicName()
/**
* get partition topic name
*
* @access public
* @return string
*/
public function getTopicName()
{
return $this->topicName;
}
// }}}
// {{{ public function getStream()
/**
* get current stream
*
* @access public
* @return \Kafka\Socket
*/
public function getStream()
{
return $this->stream;
}
// }}}
// {{{ protected function getPartitionCount()
/**
* get message size
* only use to object init
*
* @access protected
* @return integer
*/
protected function getPartitionCount()
{
// read topic count
$data = $this->stream->read(4, true);
$data = Decoder::unpack(Decoder::BIT_B32, $data);
$count = array_shift($data);
if ($count <= 0) {
throw new \Kafka\Exception\OutOfRange($count . ' is not a valid partition count');
}
return $count;
}
// }}}
// {{{ public function loadNextPartition()
/**
* load next partition
*
* @access public
* @return bool
*/
public function loadNextPartition()
{
if ($this->validCount >= $this->partitionCount) {
return false;
}
try {
$partitionId = $this->stream->read(4, true);
$partitionId = Decoder::unpack(Decoder::BIT_B32, $partitionId);
$partitionId = array_shift($partitionId);
\Kafka\Log::log("kafka client:fetch partition:" . $partitionId, LOG_INFO);
$errCode = $this->stream->read(2, true);
$errCode = Decoder::unpack(Decoder::BIT_B16, $errCode);
$this->errCode = array_shift($errCode);
if ($this->errCode != 0) {
throw new \Kafka\Exception(\Kafka\Protocol\Decoder::getError($this->errCode));
}
$offset = $this->stream->read(8, true);
$this->offset = \Kafka\Protocol\Decoder::unpack(Decoder::BIT_B64, $offset);
$this->key = $partitionId;
$this->current = new MessageSet($this, $this->context);
} catch (\Kafka\Exception $e) {
return false;
}
$this->validCount++;
return true;
}
// }}}
// {{{ public function setMessageOffset()
/**
* set messageSet fetch offset current
*
* @param int $offset
* @return void
*/
public function setMessageOffset($offset)
{
$this->currentOffset = $offset;
}
// }}}
// {{{ public function getMessageOffset()
/**
* get messageSet fetch offset current
*
* @return int
*/
public function getMessageOffset()
{
return $this->currentOffset;
}
// }}}
// }}}
}