CacheProvider.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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. namespace Doctrine\Common\Cache;
  20. /**
  21. * Base class for cache provider implementations.
  22. *
  23. * @since 2.2
  24. * @author Benjamin Eberlei <kontakt@beberlei.de>
  25. * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
  26. * @author Jonathan Wage <jonwage@gmail.com>
  27. * @author Roman Borschel <roman@code-factory.org>
  28. * @author Fabio B. Silva <fabio.bat.silva@gmail.com>
  29. */
  30. abstract class CacheProvider implements Cache
  31. {
  32. const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]';
  33. /**
  34. * The namespace to prefix all cache ids with.
  35. *
  36. * @var string
  37. */
  38. private $namespace = '';
  39. /**
  40. * The namespace version.
  41. *
  42. * @var string
  43. */
  44. private $namespaceVersion;
  45. /**
  46. * Sets the namespace to prefix all cache ids with.
  47. *
  48. * @param string $namespace
  49. *
  50. * @return void
  51. */
  52. public function setNamespace($namespace)
  53. {
  54. $this->namespace = (string) $namespace;
  55. }
  56. /**
  57. * Retrieves the namespace that prefixes all cache ids.
  58. *
  59. * @return string
  60. */
  61. public function getNamespace()
  62. {
  63. return $this->namespace;
  64. }
  65. /**
  66. * {@inheritdoc}
  67. */
  68. public function fetch($id)
  69. {
  70. return $this->doFetch($this->getNamespacedId($id));
  71. }
  72. /**
  73. * {@inheritdoc}
  74. */
  75. public function contains($id)
  76. {
  77. return $this->doContains($this->getNamespacedId($id));
  78. }
  79. /**
  80. * {@inheritdoc}
  81. */
  82. public function save($id, $data, $lifeTime = 0)
  83. {
  84. return $this->doSave($this->getNamespacedId($id), $data, $lifeTime);
  85. }
  86. /**
  87. * {@inheritdoc}
  88. */
  89. public function delete($id)
  90. {
  91. return $this->doDelete($this->getNamespacedId($id));
  92. }
  93. /**
  94. * {@inheritdoc}
  95. */
  96. public function getStats()
  97. {
  98. return $this->doGetStats();
  99. }
  100. /**
  101. * Flushes all cache entries.
  102. *
  103. * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise.
  104. */
  105. public function flushAll()
  106. {
  107. return $this->doFlush();
  108. }
  109. /**
  110. * Deletes all cache entries.
  111. *
  112. * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise.
  113. */
  114. public function deleteAll()
  115. {
  116. $namespaceCacheKey = $this->getNamespaceCacheKey();
  117. $namespaceVersion = $this->getNamespaceVersion() + 1;
  118. $this->namespaceVersion = $namespaceVersion;
  119. return $this->doSave($namespaceCacheKey, $namespaceVersion);
  120. }
  121. /**
  122. * Prefixes the passed id with the configured namespace value.
  123. *
  124. * @param string $id The id to namespace.
  125. *
  126. * @return string The namespaced id.
  127. */
  128. private function getNamespacedId($id)
  129. {
  130. $namespaceVersion = $this->getNamespaceVersion();
  131. return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion);
  132. }
  133. /**
  134. * Returns the namespace cache key.
  135. *
  136. * @return string
  137. */
  138. private function getNamespaceCacheKey()
  139. {
  140. return sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace);
  141. }
  142. /**
  143. * Returns the namespace version.
  144. *
  145. * @return string
  146. */
  147. private function getNamespaceVersion()
  148. {
  149. if (null !== $this->namespaceVersion) {
  150. return $this->namespaceVersion;
  151. }
  152. $namespaceCacheKey = $this->getNamespaceCacheKey();
  153. $namespaceVersion = $this->doFetch($namespaceCacheKey);
  154. if (false === $namespaceVersion) {
  155. $namespaceVersion = 1;
  156. $this->doSave($namespaceCacheKey, $namespaceVersion);
  157. }
  158. $this->namespaceVersion = $namespaceVersion;
  159. return $this->namespaceVersion;
  160. }
  161. /**
  162. * Fetches an entry from the cache.
  163. *
  164. * @param string $id The id of the cache entry to fetch.
  165. *
  166. * @return string|bool The cached data or FALSE, if no cache entry exists for the given id.
  167. */
  168. abstract protected function doFetch($id);
  169. /**
  170. * Tests if an entry exists in the cache.
  171. *
  172. * @param string $id The cache id of the entry to check for.
  173. *
  174. * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise.
  175. */
  176. abstract protected function doContains($id);
  177. /**
  178. * Puts data into the cache.
  179. *
  180. * @param string $id The cache id.
  181. * @param string $data The cache entry/data.
  182. * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this
  183. * cache entry (0 => infinite lifeTime).
  184. *
  185. * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise.
  186. */
  187. abstract protected function doSave($id, $data, $lifeTime = 0);
  188. /**
  189. * Deletes a cache entry.
  190. *
  191. * @param string $id The cache id.
  192. *
  193. * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise.
  194. */
  195. abstract protected function doDelete($id);
  196. /**
  197. * Flushes all cache entries.
  198. *
  199. * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise.
  200. */
  201. abstract protected function doFlush();
  202. /**
  203. * Retrieves cached information from the data store.
  204. *
  205. * @since 2.2
  206. *
  207. * @return array|null An associative array with server's statistics if available, NULL otherwise.
  208. */
  209. abstract protected function doGetStats();
  210. }