%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/MessageSet.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 MessageSet implements \Iterator { // {{{ members /** * kafka socket object * * @var mixed * @access private */ private $stream = null; /** * messageSet size * * @var float * @access private */ private $messageSetSize = 0; /** * validByteCount * * @var float * @access private */ private $validByteCount = 0; /** * messageSet offset * * @var float * @access private */ private $offset = 0; /** * valid * * @var mixed * @access private */ private $valid = false; /** * partition object * * @var \Kafka\Protocol\Fetch\Partition * @access private */ private $partition = null; /** * request fetch context * * @var array */ private $context = array(); /** * @var Message */ private $current = null; // }}} // {{{ functions // {{{ public function __construct() /** * __construct * * @param Partition $partition * @param array $context * @access public */ public function __construct(\Kafka\Protocol\Fetch\Partition $partition, $context = array()) { $this->stream = $partition->getStream(); $this->partition = $partition; $this->context = $context; $this->messageSetSize = $this->getMessageSetSize(); \Kafka\Log::log("messageSetSize: {$this->messageSetSize}", LOG_INFO); } // }}} // {{{ public function current() /** * current * * @access public * @return Message */ public function current() { return $this->current; } // }}} // {{{ public function key() /** * key * * @access public * @return float */ public function key() { return $this->validByteCount; } // }}} // {{{ public function rewind() /** * implements Iterator function * * @access public * @return integer */ public function rewind() { $this->valid = $this->loadNextMessage(); } // }}} // {{{ public function valid() /** * implements Iterator function * * @access public * @return integer */ public function valid() { if (!$this->valid) { $this->partition->setMessageOffset($this->offset); // one partition iterator end \Kafka\Protocol\Fetch\Helper\Helper::onPartitionEof($this->partition); } return $this->valid; } // }}} // {{{ public function next() /** * implements Iterator function * * @access public * @return void */ public function next() { $this->valid = $this->loadNextMessage(); } // }}} // {{{ protected function getMessageSetSize() /** * get message set size * * @access protected * @return integer */ protected function getMessageSetSize() { // read message size $data = $this->stream->read(4, true); $data = Decoder::unpack(Decoder::BIT_B32, $data); $size = array_shift($data); if ($size <= 0) { throw new \Kafka\Exception\OutOfRange($size . ' is not a valid message size'); } return $size; } // }}} // {{{ public function loadNextMessage() /** * load next message * * @access public * @return bool */ public function loadNextMessage() { if ($this->validByteCount >= $this->messageSetSize) { return false; } try { if ($this->validByteCount + 12 > $this->messageSetSize) { // read socket buffer dirty data $this->stream->read($this->messageSetSize - $this->validByteCount); return false; } $offset = $this->stream->read(8, true); $this->offset = \Kafka\Protocol\Decoder::unpack(Decoder::BIT_B64, $offset); $messageSize = $this->stream->read(4, true); $messageSize = Decoder::unpack(Decoder::BIT_B32, $messageSize); $messageSize = array_shift($messageSize); $this->validByteCount += 12; if (($this->validByteCount + $messageSize) > $this->messageSetSize) { // read socket buffer dirty data $this->stream->read($this->messageSetSize - $this->validByteCount); return false; } $msg = $this->stream->read($messageSize, true); $this->current = new Message($msg); } catch (\Kafka\Exception $e) { \Kafka\Log::log("already fetch: {$this->validByteCount}, {$e->getMessage()}", LOG_INFO); return false; } $this->validByteCount += $messageSize; return true; } // }}} // {{{ public function messageOffset() /** * current message offset in producer * * @return float */ public function messageOffset() { return $this->offset; } // }}} // }}} }