芝麻web文件管理V1.00
编辑当前文件:/home/mgatv524/giga.mgaplay.com.br/vendor/mongodb/mongodb/src/Model/ChangeStreamIterator.php
batchSize = $firstBatchSize; $this->isRewindNop = ($firstBatchSize === 0); $this->postBatchResumeToken = $postBatchResumeToken; $this->resumeToken = $initialResumeToken; $this->server = $cursor->getServer(); } /** @internal */ final public function commandFailed(CommandFailedEvent $event) { } /** @internal */ final public function commandStarted(CommandStartedEvent $event) { if ($event->getCommandName() !== 'getMore') { return; } $this->batchPosition = 0; $this->batchSize = null; $this->postBatchResumeToken = null; } /** @internal */ final public function commandSucceeded(CommandSucceededEvent $event) { if ($event->getCommandName() !== 'getMore') { return; } $reply = $event->getReply(); if (! isset($reply->cursor->nextBatch) || ! is_array($reply->cursor->nextBatch)) { throw new UnexpectedValueException('getMore command did not return a "cursor.nextBatch" array'); } $this->batchSize = count($reply->cursor->nextBatch); if (isset($reply->cursor->postBatchResumeToken) && is_object($reply->cursor->postBatchResumeToken)) { $this->postBatchResumeToken = $reply->cursor->postBatchResumeToken; } } /** * @see https://php.net/iteratoriterator.current * @return mixed */ #[ReturnTypeWillChange] public function current() { return $this->isValid ? parent::current() : null; } /** * Returns the resume token for the iterator's current position. * * Null may be returned if no change documents have been iterated and the * server did not include a postBatchResumeToken in its aggregate or getMore * command response. * * @return array|object|null */ public function getResumeToken() { return $this->resumeToken; } /** * Returns the server the cursor is running on. */ public function getServer(): Server { return $this->server; } /** * @see https://php.net/iteratoriterator.key * @return mixed */ #[ReturnTypeWillChange] public function key() { return $this->isValid ? parent::key() : null; } /** * @see https://php.net/iteratoriterator.rewind * @return void */ #[ReturnTypeWillChange] public function next() { /* Determine if advancing the iterator will execute a getMore command * (i.e. we are already positioned at the end of the current batch). If * so, rely on the APM callbacks to reset $batchPosition and update * $batchSize. Otherwise, we can forgo APM and manually increment * $batchPosition after calling next(). */ $getMore = $this->isAtEndOfBatch(); if ($getMore) { addSubscriber($this); } try { parent::next(); $this->onIteration(! $getMore); } finally { if ($getMore) { removeSubscriber($this); } } } /** * @see https://php.net/iteratoriterator.rewind * @return void */ #[ReturnTypeWillChange] public function rewind() { if ($this->isRewindNop) { return; } parent::rewind(); $this->onIteration(false); } /** * @see https://php.net/iteratoriterator.valid * @return boolean */ #[ReturnTypeWillChange] public function valid() { return $this->isValid; } /** * Extracts the resume token (i.e. "_id" field) from a change document. * * @param array|object $document Change document * @return array|object * @throws InvalidArgumentException * @throws ResumeTokenException if the resume token is not found or invalid */ private function extractResumeToken($document) { if (! is_array($document) && ! is_object($document)) { throw InvalidArgumentException::invalidType('$document', $document, 'array or object'); } if ($document instanceof Serializable) { return $this->extractResumeToken($document->bsonSerialize()); } $resumeToken = is_array($document) ? ($document['_id'] ?? null) : ($document->_id ?? null); if (! isset($resumeToken)) { $this->isValid = false; throw ResumeTokenException::notFound(); } if (! is_array($resumeToken) && ! is_object($resumeToken)) { $this->isValid = false; throw ResumeTokenException::invalidType($resumeToken); } return $resumeToken; } /** * Return whether the iterator is positioned at the end of the batch. * * @return boolean */ private function isAtEndOfBatch() { return $this->batchPosition + 1 >= $this->batchSize; } /** * Perform housekeeping after an iteration event. * * @see https://github.com/mongodb/specifications/blob/master/source/change-streams/change-streams.rst#updating-the-cached-resume-token * @param boolean $incrementBatchPosition */ private function onIteration($incrementBatchPosition) { $this->isValid = parent::valid(); /* Disable rewind()'s NOP behavior once we advance to a valid position. * This will allow the driver to throw a LogicException if rewind() is * called after the cursor has advanced past its first element. */ if ($this->isRewindNop && $this->isValid) { $this->isRewindNop = false; } if ($incrementBatchPosition && $this->isValid) { $this->batchPosition++; } /* If the iterator is positioned at the end of the batch, apply the * postBatchResumeToken if it's available. This handles both the case * where the current batch is empty (since onIteration() will be called * after a successful getMore) and when the iterator has advanced to the * last document in its current batch. Otherwise, extract a resume token * from the current document if possible. */ if ($this->isAtEndOfBatch() && $this->postBatchResumeToken !== null) { $this->resumeToken = $this->postBatchResumeToken; } elseif ($this->isValid) { $this->resumeToken = $this->extractResumeToken($this->current()); } } }