Browse Source

Fix FileEngine not clearing keys when groups are used.

Fixes #3930
mark_story 12 years ago
parent
commit
8a81903e37

+ 19 - 3
lib/Cake/Cache/Engine/FileEngine.php

@@ -223,11 +223,28 @@ class FileEngine extends CacheEngine {
 		if (!$this->_init) {
 			return false;
 		}
-		$dir = dir($this->settings['path']);
+		$threshold = $now = false;
 		if ($check) {
 			$now = time();
 			$threshold = $now - $this->settings['duration'];
 		}
+		$this->_clearDirectory($this->settings['path'], $now, $threshold);
+		foreach ($this->settings['groups'] as $group) {
+			$this->_clearDirectory($this->settings['path'] . $group . DS, $now, $threshold);
+		}
+		return true;
+	}
+
+/**
+ * Used to clear a directory of matching files.
+ *
+ * @param string $path The path to search.
+ * @param integer $now The current timestamp
+ * @param integer $threshold Any file not modified after this value will be deleted.
+ * @return void
+ */
+	protected function _clearDirectory($path, $now, $threshold) {
+		$dir = dir($path);
 		$prefixLength = strlen($this->settings['prefix']);
 		while (($entry = $dir->read()) !== false) {
 			if (substr($entry, 0, $prefixLength) !== $this->settings['prefix']) {
@@ -236,7 +253,7 @@ class FileEngine extends CacheEngine {
 			if ($this->_setKey($entry) === false) {
 				continue;
 			}
-			if ($check) {
+			if ($threshold) {
 				$mtime = $this->_File->getMTime();
 
 				if ($mtime > $threshold) {
@@ -256,7 +273,6 @@ class FileEngine extends CacheEngine {
 			}
 		}
 		$dir->close();
-		return true;
 	}
 
 /**

+ 3 - 2
lib/Cake/Test/Case/Cache/Engine/FileEngineTest.php

@@ -267,9 +267,10 @@ class FileEngineTest extends CakeTestCase {
 			'duration' => DAY,
 			'groups' => array('short')
 		));
-		$engine->write('test_key', 'it works', DAY);
+		$key = 'cake_test_test_key';
+		$engine->write($key, 'it works', DAY);
 		$engine->clear(false);
-		$this->assertFalse($engine->read('test_key'), 'Key should have been removed');
+		$this->assertFalse($engine->read($key), 'Key should have been removed');
 	}
 
 /**