summaryrefslogtreecommitdiff
path: root/vendor/guzzle/guzzle/src/Guzzle/Batch/Batch.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/guzzle/guzzle/src/Guzzle/Batch/Batch.php')
-rw-r--r--vendor/guzzle/guzzle/src/Guzzle/Batch/Batch.php92
1 files changed, 92 insertions, 0 deletions
diff --git a/vendor/guzzle/guzzle/src/Guzzle/Batch/Batch.php b/vendor/guzzle/guzzle/src/Guzzle/Batch/Batch.php
new file mode 100644
index 0000000..4d41c54
--- /dev/null
+++ b/vendor/guzzle/guzzle/src/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;
+ }
+ }
+ }
+}