Blame view

sources/apps/files_external/3rdparty/aws-sdk-php/Guzzle/Batch/Batch.php 2.96 KB
31b7f2792   Kload   Upgrade to ownclo...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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;
              }
          }
      }
  }