From 570f261302f5203de0319ad997e6a68a3c5803b3 Mon Sep 17 00:00:00 2001 From: Loz Calver Date: Wed, 15 Oct 2014 11:25:02 +0100 Subject: [PATCH] FIX: Tag-less cache backends error on flush --- i18n/i18n.php | 13 ++++++++++++- model/Aggregate.php | 23 +++++++++++++++-------- view/SSViewer.php | 15 +++++++++++++-- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/i18n/i18n.php b/i18n/i18n.php index c6f8e3bac..6f45197a0 100644 --- a/i18n/i18n.php +++ b/i18n/i18n.php @@ -101,7 +101,18 @@ class i18n extends Object implements TemplateGlobalProvider, Flushable { * Triggered early in the request when someone requests a flush. */ public static function flush() { - self::get_cache()->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('Zend_Translate')); + $cache = self::get_cache(); + $backend = $cache->getBackend(); + + if( + $backend instanceof Zend_Cache_Backend_ExtendedInterface + && ($capabilities = $backend->getCapabilities()) + && $capabilities['tags'] + ) { + $cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, $cache->getTags()); + } else { + $cache->clean(Zend_Cache::CLEANING_MODE_ALL); + } } /** diff --git a/model/Aggregate.php b/model/Aggregate.php index 84cc105e2..1e3287471 100644 --- a/model/Aggregate.php +++ b/model/Aggregate.php @@ -50,15 +50,22 @@ class Aggregate extends ViewableData { */ public static function flushCache($class=null) { $cache = self::cache(); - $capabilities = $cache->getBackend()->getCapabilities(); - if($capabilities['tags'] && (!$class || $class == 'DataObject')) { - $cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('aggregate')); - } elseif($capabilities['tags']) { - $tags = ClassInfo::ancestry($class); - foreach($tags as &$tag) { - $tag = preg_replace('/[^a-zA-Z0-9_]/', '_', $tag); + $backend = $cache->getBackend(); + + if( + $backend instanceof Zend_Cache_Backend_ExtendedInterface + && ($capabilities = $backend->getCapabilities()) + && $capabilities['tags'] + ) { + if( ! $class || $class == 'DataObject') { + $cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('aggregate')); + } else { + $tags = ClassInfo::ancestry($class); + foreach($tags as &$tag) { + $tag = preg_replace('/[^a-zA-Z0-9_]/', '_', $tag); + } + $cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, $tags); } - $cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, $tags); } else { $cache->clean(Zend_Cache::CLEANING_MODE_ALL); } diff --git a/view/SSViewer.php b/view/SSViewer.php index e13658706..0bfd23c29 100644 --- a/view/SSViewer.php +++ b/view/SSViewer.php @@ -948,8 +948,19 @@ class SSViewer implements Flushable { public static function flush_cacheblock_cache($force = false) { if (!self::$cacheblock_cache_flushed || $force) { $cache = SS_Cache::factory('cacheblock'); - $tags = $cache->getTags(); - $cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, $tags); + $backend = $cache->getBackend(); + + if( + $backend instanceof Zend_Cache_Backend_ExtendedInterface + && ($capabilities = $backend->getCapabilities()) + && $capabilities['tags'] + ) { + $cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, $cache->getTags()); + } else { + $cache->clean(Zend_Cache::CLEANING_MODE_ALL); + } + + self::$cacheblock_cache_flushed = true; } }