diff options
Diffstat (limited to 'apps/files_external/3rdparty/aws-sdk-php/Guzzle/Batch/Batch.php')
-rw-r--r-- | apps/files_external/3rdparty/aws-sdk-php/Guzzle/Batch/Batch.php | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/apps/files_external/3rdparty/aws-sdk-php/Guzzle/Batch/Batch.php b/apps/files_external/3rdparty/aws-sdk-php/Guzzle/Batch/Batch.php new file mode 100644 index 00000000000..4d41c54f887 --- /dev/null +++ b/apps/files_external/3rdparty/aws-sdk-php/Guzzle/Batch/Batch.php @@ -0,0 +1,92 @@ +<?php + +namespace Guzzle\Batch; + +use Guzzle\Batch\Exception\BatchTransferException; + +/** + * Default batch implementation used to convert queued items into smaller chunks of batches using a + * {@see BatchDivisorIterface} and transfers each batch using a {@see BatchTransferInterface}. + * + * Any exception encountered during a flush operation will throw a {@see BatchTransferException} object containing the + * batch that failed. After an exception is encountered, you can flush the batch again to attempt to finish transferring + * any previously created batches or queued items. + */ +class Batch implements BatchInterface +{ + /** @var \SplQueue Queue of items in the queue */ + protected $queue; + + /** @var array Divided batches to be transferred */ + protected $dividedBatches; + + /** @var BatchTransferInterface */ + protected $transferStrategy; + + /** @var BatchDivisorInterface */ + protected $divisionStrategy; + + /** + * @param BatchTransferInterface $transferStrategy Strategy used to transfer items + * @param BatchDivisorInterface $divisionStrategy Divisor used to create batches + */ + public function __construct(BatchTransferInterface $transferStrategy, BatchDivisorInterface $divisionStrategy) + { + $this->transferStrategy = $transferStrategy; + $this->divisionStrategy = $divisionStrategy; + $this->queue = new \SplQueue(); + $this->queue->setIteratorMode(\SplQueue::IT_MODE_DELETE); + $this->dividedBatches = array(); + } + + public function add($item) + { + $this->queue->enqueue($item); + + return $this; + } + + public function flush() + { + $this->createBatches(); + + $items = array(); + foreach ($this->dividedBatches as $batchIndex => $dividedBatch) { + while ($dividedBatch->valid()) { + $batch = $dividedBatch->current(); + $dividedBatch->next(); + try { + $this->transferStrategy->transfer($batch); + $items = array_merge($items, $batch); + } catch (\Exception $e) { + throw new BatchTransferException($batch, $items, $e, $this->transferStrategy, $this->divisionStrategy); + } + } + // Keep the divided batch down to a minimum in case of a later exception + unset($this->dividedBatches[$batchIndex]); + } + + return $items; + } + + public function isEmpty() + { + return count($this->queue) == 0 && count($this->dividedBatches) == 0; + } + + /** + * Create batches for any queued items + */ + protected function createBatches() + { + if (count($this->queue)) { + if ($batches = $this->divisionStrategy->createBatches($this->queue)) { + // Convert arrays into iterators + if (is_array($batches)) { + $batches = new \ArrayIterator($batches); + } + $this->dividedBatches[] = $batches; + } + } + } +} |