Fix FileEngine not clearing keys when groups are used.

Fixes #3930
This commit is contained in:
mark_story 2013-07-27 22:20:40 -04:00
parent 17b25388b3
commit 8a81903e37
2 changed files with 22 additions and 5 deletions

View file

@ -223,11 +223,28 @@ class FileEngine extends CacheEngine {
if (!$this->_init) { if (!$this->_init) {
return false; return false;
} }
$dir = dir($this->settings['path']); $threshold = $now = false;
if ($check) { if ($check) {
$now = time(); $now = time();
$threshold = $now - $this->settings['duration']; $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']); $prefixLength = strlen($this->settings['prefix']);
while (($entry = $dir->read()) !== false) { while (($entry = $dir->read()) !== false) {
if (substr($entry, 0, $prefixLength) !== $this->settings['prefix']) { if (substr($entry, 0, $prefixLength) !== $this->settings['prefix']) {
@ -236,7 +253,7 @@ class FileEngine extends CacheEngine {
if ($this->_setKey($entry) === false) { if ($this->_setKey($entry) === false) {
continue; continue;
} }
if ($check) { if ($threshold) {
$mtime = $this->_File->getMTime(); $mtime = $this->_File->getMTime();
if ($mtime > $threshold) { if ($mtime > $threshold) {
@ -256,7 +273,6 @@ class FileEngine extends CacheEngine {
} }
} }
$dir->close(); $dir->close();
return true;
} }
/** /**

View file

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