/vendor/nmred/kafka-php/src/Kafka/Protocol/Fetch/Partition.php
https://gitlab.com/link233/bootmw · PHP · 374 lines · 108 code · 51 blank · 215 comment · 5 complexity · 1c9d304e05cfe8a80ee0e1e8b5bdbb28 MD5 · raw file
- <?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;
- }
- // }}}
- // }}}
- }