Security update to Drupal 8.4.6
[yaffs-website] / vendor / doctrine / cache / lib / Doctrine / Common / Cache / ChainCache.php
1 <?php
2 /*
3  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14  *
15  * This software consists of voluntary contributions made by many individuals
16  * and is licensed under the MIT license. For more information, see
17  * <http://www.doctrine-project.org>.
18  */
19
20 namespace Doctrine\Common\Cache;
21
22 /**
23  * Cache provider that allows to easily chain multiple cache providers
24  *
25  * @author MichaĆ«l Gallego <mic.gallego@gmail.com>
26  */
27 class ChainCache extends CacheProvider
28 {
29     /**
30      * @var CacheProvider[]
31      */
32     private $cacheProviders = [];
33
34     /**
35      * Constructor
36      *
37      * @param CacheProvider[] $cacheProviders
38      */
39     public function __construct($cacheProviders = [])
40     {
41         $this->cacheProviders = $cacheProviders instanceof \Traversable
42             ? iterator_to_array($cacheProviders, false)
43             : array_values($cacheProviders);
44     }
45
46     /**
47      * {@inheritDoc}
48      */
49     public function setNamespace($namespace)
50     {
51         parent::setNamespace($namespace);
52
53         foreach ($this->cacheProviders as $cacheProvider) {
54             $cacheProvider->setNamespace($namespace);
55         }
56     }
57
58     /**
59      * {@inheritDoc}
60      */
61     protected function doFetch($id)
62     {
63         foreach ($this->cacheProviders as $key => $cacheProvider) {
64             if ($cacheProvider->doContains($id)) {
65                 $value = $cacheProvider->doFetch($id);
66
67                 // We populate all the previous cache layers (that are assumed to be faster)
68                 for ($subKey = $key - 1 ; $subKey >= 0 ; $subKey--) {
69                     $this->cacheProviders[$subKey]->doSave($id, $value);
70                 }
71
72                 return $value;
73             }
74         }
75
76         return false;
77     }
78
79     /**
80      * {@inheritdoc}
81      */
82     protected function doFetchMultiple(array $keys)
83     {
84         /* @var $traversedProviders CacheProvider[] */
85         $traversedProviders = [];
86         $keysCount          = count($keys);
87         $fetchedValues      = [];
88
89         foreach ($this->cacheProviders as $key => $cacheProvider) {
90             $fetchedValues = $cacheProvider->doFetchMultiple($keys);
91
92             // We populate all the previous cache layers (that are assumed to be faster)
93             if (count($fetchedValues) === $keysCount) {
94                 foreach ($traversedProviders as $previousCacheProvider) {
95                     $previousCacheProvider->doSaveMultiple($fetchedValues);
96                 }
97
98                 return $fetchedValues;
99             }
100
101             $traversedProviders[] = $cacheProvider;
102         }
103
104         return $fetchedValues;
105     }
106
107     /**
108      * {@inheritDoc}
109      */
110     protected function doContains($id)
111     {
112         foreach ($this->cacheProviders as $cacheProvider) {
113             if ($cacheProvider->doContains($id)) {
114                 return true;
115             }
116         }
117
118         return false;
119     }
120
121     /**
122      * {@inheritDoc}
123      */
124     protected function doSave($id, $data, $lifeTime = 0)
125     {
126         $stored = true;
127
128         foreach ($this->cacheProviders as $cacheProvider) {
129             $stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored;
130         }
131
132         return $stored;
133     }
134
135     /**
136      * {@inheritdoc}
137      */
138     protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
139     {
140         $stored = true;
141
142         foreach ($this->cacheProviders as $cacheProvider) {
143             $stored = $cacheProvider->doSaveMultiple($keysAndValues, $lifetime) && $stored;
144         }
145
146         return $stored;
147     }
148
149     /**
150      * {@inheritDoc}
151      */
152     protected function doDelete($id)
153     {
154         $deleted = true;
155
156         foreach ($this->cacheProviders as $cacheProvider) {
157             $deleted = $cacheProvider->doDelete($id) && $deleted;
158         }
159
160         return $deleted;
161     }
162
163     /**
164      * {@inheritdoc}
165      */
166     protected function doDeleteMultiple(array $keys)
167     {
168         $deleted = true;
169
170         foreach ($this->cacheProviders as $cacheProvider) {
171             $deleted = $cacheProvider->doDeleteMultiple($keys) && $deleted;
172         }
173
174         return $deleted;
175     }
176
177     /**
178      * {@inheritDoc}
179      */
180     protected function doFlush()
181     {
182         $flushed = true;
183
184         foreach ($this->cacheProviders as $cacheProvider) {
185             $flushed = $cacheProvider->doFlush() && $flushed;
186         }
187
188         return $flushed;
189     }
190
191     /**
192      * {@inheritDoc}
193      */
194     protected function doGetStats()
195     {
196         // We return all the stats from all adapters
197         $stats = [];
198
199         foreach ($this->cacheProviders as $cacheProvider) {
200             $stats[] = $cacheProvider->doGetStats();
201         }
202
203         return $stats;
204     }
205 }