From 8b6c974cd0879228a5f9363450763eeaf71963cd Mon Sep 17 00:00:00 2001 From: mark_story Date: Thu, 27 May 2010 00:01:17 -0400 Subject: [PATCH] Making FileEngine not greedily clear files in a directory that may belong to another cache configuration. Tests added. Fixes #754 --- cake/libs/cache/file.php | 4 ++++ cake/tests/cases/libs/cache/file.test.php | 28 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/cake/libs/cache/file.php b/cake/libs/cache/file.php index e8e8ffdad..3494c62ce 100644 --- a/cake/libs/cache/file.php +++ b/cake/libs/cache/file.php @@ -209,7 +209,11 @@ class FileEngine extends CacheEngine { $now = time(); $threshold = $now - $this->settings['duration']; } + $prefixLength = strlen($this->settings['prefix']); while (($entry = $dir->read()) !== false) { + if (substr($entry, 0, $prefixLength) !== $this->settings['prefix']) { + continue; + } if ($this->_setKey($entry) === false) { continue; } diff --git a/cake/tests/cases/libs/cache/file.test.php b/cake/tests/cases/libs/cache/file.test.php index 15ee52673..ffb571f73 100644 --- a/cake/tests/cases/libs/cache/file.test.php +++ b/cake/tests/cases/libs/cache/file.test.php @@ -273,6 +273,34 @@ class FileEngineTest extends CakeTestCase { Cache::config('default', array('engine' => 'File', 'path' => CACHE)); } +/** + * test that clear() doesn't wipe files not in the current engine's prefix. + * + * @return void + */ + function testClearWithPrefixes() { + $FileOne =& new FileEngine(); + $FileOne->init(array( + 'prefix' => 'prefix_one_', + 'duration' => DAY + )); + $FileTwo =& new FileEngine(); + $FileTwo->init(array( + 'prefix' => 'prefix_two_', + 'duration' => DAY + )); + + $data1 = $data2 = $expected = 'content to cache'; + $FileOne->write('key_one', $data1, DAY); + $FileTwo->write('key_two', $data2, DAY); + + $this->assertEqual($FileOne->read('key_one'), $expected); + $this->assertEqual($FileTwo->read('key_two'), $expected); + + $FileOne->clear(false); + $this->assertEqual($FileTwo->read('key_two'), $expected, 'secondary config was cleared by accident.'); + } + /** * testKeyPath method *