Parcourir la source

ZF-7600: Zend_Cache_Core::getIds* have to strip cache_id_prefix

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@21279 44c647ce-9c0f-0410-b52a-842ac1e357ba
mabe il y a 16 ans
Parent
commit
0f7e1e907c
3 fichiers modifiés avec 231 ajouts et 15 suppressions
  1. 141 2
      library/Zend/Cache/Backend/Test.php
  2. 58 13
      library/Zend/Cache/Core.php
  3. 32 0
      tests/Zend/Cache/CoreTest.php

+ 141 - 2
library/Zend/Cache/Backend/Test.php

@@ -24,7 +24,7 @@
 /**
  * @see Zend_Cache_Backend_Interface
  */
-require_once 'Zend/Cache/Backend/Interface.php';
+require_once 'Zend/Cache/Backend/ExtendedInterface.php';
 
 /**
  * @see Zend_Cache_Backend
@@ -37,7 +37,7 @@ require_once 'Zend/Cache/Backend.php';
  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
  * @license    http://framework.zend.com/license/new-bsd     New BSD License
  */
-class Zend_Cache_Backend_Test extends Zend_Cache_Backend implements Zend_Cache_Backend_Interface
+class Zend_Cache_Backend_Test extends Zend_Cache_Backend implements Zend_Cache_Backend_ExtendedInterface
 {
     /**
      * Available options
@@ -253,6 +253,145 @@ class Zend_Cache_Backend_Test extends Zend_Cache_Backend implements Zend_Cache_B
     }
 
     /**
+     * Return an array of stored cache ids
+     *
+     * @return array array of stored cache ids (string)
+     */
+    public function getIds()
+    {
+        return array(
+            'prefix_id1', 'prefix_id2'
+        );
+    }
+
+    /**
+     * Return an array of stored tags
+     *
+     * @return array array of stored tags (string)
+     */
+    public function getTags()
+    {
+        return array(
+            'tag1', 'tag2'
+        );
+    }
+
+    /**
+     * Return an array of stored cache ids which match given tags
+     *
+     * In case of multiple tags, a logical AND is made between tags
+     *
+     * @param array $tags array of tags
+     * @return array array of matching cache ids (string)
+     */
+    public function getIdsMatchingTags($tags = array())
+    {
+        if ($tags == array('tag1', 'tag2')) {
+            return array('prefix_id1', 'prefix_id2');
+        }
+
+        return array();
+    }
+
+    /**
+     * Return an array of stored cache ids which don't match given tags
+     *
+     * In case of multiple tags, a logical OR is made between tags
+     *
+     * @param array $tags array of tags
+     * @return array array of not matching cache ids (string)
+     */
+    public function getIdsNotMatchingTags($tags = array())
+    {
+        if ($tags == array('tag3', 'tag4')) {
+            return array('prefix_id3', 'prefix_id4');
+        }
+
+        return array();
+    }
+
+    /**
+     * Return an array of stored cache ids which match any given tags
+     *
+     * In case of multiple tags, a logical AND is made between tags
+     *
+     * @param array $tags array of tags
+     * @return array array of any matching cache ids (string)
+     */
+    public function getIdsMatchingAnyTags($tags = array())
+    {
+        if ($tags == array('tag5', 'tag6')) {
+            return array('prefix_id5', 'prefix_id6');
+        }
+
+        return array();
+    }
+
+    /**
+     * Return the filling percentage of the backend storage
+     *
+     * @return int integer between 0 and 100
+     */
+    public function getFillingPercentage()
+    {
+        return 50;
+    }
+
+    /**
+     * Return an array of metadatas for the given cache id
+     *
+     * The array must include these keys :
+     * - expire : the expire timestamp
+     * - tags : a string array of tags
+     * - mtime : timestamp of last modification time
+     *
+     * @param string $id cache id
+     * @return array array of metadatas (false if the cache id is not found)
+     */
+    public function getMetadatas($id)
+    {
+        return false;
+    }
+
+    /**
+     * Give (if possible) an extra lifetime to the given cache id
+     *
+     * @param string $id cache id
+     * @param int $extraLifetime
+     * @return boolean true if ok
+     */
+    public function touch($id, $extraLifetime)
+    {
+        return true;
+    }
+
+    /**
+     * Return an associative array of capabilities (booleans) of the backend
+     *
+     * The array must include these keys :
+     * - automatic_cleaning (is automating cleaning necessary)
+     * - tags (are tags supported)
+     * - expired_read (is it possible to read expired cache records
+     *                 (for doNotTestCacheValidity option for example))
+     * - priority does the backend deal with priority when saving
+     * - infinite_lifetime (is infinite lifetime can work with this backend)
+     * - get_list (is it possible to get the list of cache ids and the complete list of tags)
+     *
+     * @return array associative of with capabilities
+     */
+    public function getCapabilities()
+    {
+        return array(
+            'automatic_cleaning' => true,
+            'tags'               => true,
+            'expired_read'       => false,
+            'priority'           => true,
+            'infinite_lifetime'  => true,
+            'get_list'           => true
+        );
+    }
+
+    /**
      * Add an event to the log array
      *
      * @param  string $methodName MethodName

+ 58 - 13
library/Zend/Cache/Core.php

@@ -477,7 +477,21 @@ class Zend_Cache_Core
         if (!($this->_backendCapabilities['tags'])) {
             Zend_Cache::throwException(self::BACKEND_NOT_SUPPORT_TAG);
         }
-        return $this->_backend->getIdsMatchingTags($tags);
+
+        $ids = $this->_backend->getIdsMatchingTags($tags);
+
+        // we need to remove cache_id_prefix from ids (see #ZF-6178, #ZF-7600)
+        if (isset($this->_options['cache_id_prefix']) && $this->_options['cache_id_prefix'] !== '') {
+            $prefix    = & $this->_options['cache_id_prefix'];
+            $prefixLen = strlen($prefix);
+            foreach ($ids as &$id) {
+                if (strpos($id, $this->_options['cache_id_prefix']) === 0) {
+                    $id = substr($id, $prefixLen);
+                }
+            }
+        }
+
+        return $ids;
     }
 
     /**
@@ -496,7 +510,21 @@ class Zend_Cache_Core
         if (!($this->_backendCapabilities['tags'])) {
             Zend_Cache::throwException(self::BACKEND_NOT_SUPPORT_TAG);
         }
-        return $this->_backend->getIdsNotMatchingTags($tags);
+
+        $ids = $this->_backend->getIdsNotMatchingTags($tags);
+
+        // we need to remove cache_id_prefix from ids (see #ZF-6178, #ZF-7600)
+        if (isset($this->_options['cache_id_prefix']) && $this->_options['cache_id_prefix'] !== '') {
+            $prefix    = & $this->_options['cache_id_prefix'];
+            $prefixLen = strlen($prefix);
+            foreach ($ids as &$id) {
+                if (strpos($id, $this->_options['cache_id_prefix']) === 0) {
+                    $id = substr($id, $prefixLen);
+                }
+            }
+        }
+
+        return $ids;
     }
 
     /**
@@ -515,7 +543,21 @@ class Zend_Cache_Core
         if (!($this->_backendCapabilities['tags'])) {
             Zend_Cache::throwException(self::BACKEND_NOT_SUPPORT_TAG);
         }
-        return $this->_backend->getIdsMatchingAnyTags($tags);
+
+        $ids = $this->_backend->getIdsMatchingAnyTags($tags);
+
+        // we need to remove cache_id_prefix from ids (see #ZF-6178, #ZF-7600)
+        if (isset($this->_options['cache_id_prefix']) && $this->_options['cache_id_prefix'] !== '') {
+            $prefix    = & $this->_options['cache_id_prefix'];
+            $prefixLen = strlen($prefix);
+            foreach ($ids as &$id) {
+                if (strpos($id, $this->_options['cache_id_prefix']) === 0) {
+                    $id = substr($id, $prefixLen);
+                }
+            }
+        }
+
+        return $ids;
     }
 
     /**
@@ -528,18 +570,21 @@ class Zend_Cache_Core
         if (!$this->_extendedBackend) {
             Zend_Cache::throwException(self::BACKEND_NOT_IMPLEMENTS_EXTENDED_IF);
         }
-        $array = $this->_backend->getIds();
-        if ((!isset($this->_options['cache_id_prefix'])) || ($this->_options['cache_id_prefix'] == '')) return $array;
-        // we need to remove cache_id_prefix from ids (see #ZF-6178)
-        $res = array();
-        while (list(,$id) = each($array)) {
-            if (strpos($id, $this->_options['cache_id_prefix']) === 0) {
-                $res[] = preg_replace("~^{$this->_options['cache_id_prefix']}~", '', $id);
-            } else {
-                $res[] = $id;
+
+        $ids = $this->_backend->getIds();
+
+        // we need to remove cache_id_prefix from ids (see #ZF-6178, #ZF-7600)
+        if (isset($this->_options['cache_id_prefix']) && $this->_options['cache_id_prefix'] !== '') {
+            $prefix    = & $this->_options['cache_id_prefix'];
+            $prefixLen = strlen($prefix);
+            foreach ($ids as &$id) {
+                if (strpos($id, $this->_options['cache_id_prefix']) === 0) {
+                    $id = substr($id, $prefixLen);
+                }
             }
         }
-        return $res;
+
+        return $ids;
     }
 
     /**

+ 32 - 0
tests/Zend/Cache/CoreTest.php

@@ -490,4 +490,36 @@ class Zend_Cache_CoreTest extends PHPUnit_Framework_TestCase
         $this->assertEquals($expected, $log);
     }
 
+    public function testGetIds()
+    {
+        $this->_instance->setOption('cache_id_prefix', 'prefix_');
+        $ids = $this->_instance->getIds();
+        $this->assertContains('id1', $ids);
+        $this->assertContains('id2', $ids);
+    }
+
+    public function testGetIdsMatchingTags()
+    {
+        $this->_instance->setOption('cache_id_prefix', 'prefix_');
+        $ids = $this->_instance->getIdsMatchingTags(array('tag1', 'tag2'));
+        $this->assertContains('id1', $ids);
+        $this->assertContains('id2', $ids);
+    }
+
+    public function testGetIdsNotMatchingTags()
+    {
+        $this->_instance->setOption('cache_id_prefix', 'prefix_');
+        $ids = $this->_instance->getIdsNotMatchingTags(array('tag3', 'tag4'));
+        $this->assertContains('id3', $ids);
+        $this->assertContains('id4', $ids);
+    }
+
+    public function testGetIdsMatchingAnyTags()
+    {
+        $this->_instance->setOption('cache_id_prefix', 'prefix_');
+        $ids = $this->_instance->getIdsMatchingAnyTags(array('tag5', 'tag6'));
+        $this->assertContains('id5', $ids);
+        $this->assertContains('id6', $ids);
+    }
+
 }