MDL-42012 cache: Allow data sources to work when caching is disabled
authorAndrew Nicols <andrew@nicols.co.uk>
Fri, 4 Sep 2020 06:17:24 +0000 (14:17 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Wed, 9 Sep 2020 05:59:41 +0000 (13:59 +0800)
cache/classes/factory.php
cache/classes/loaders.php
cache/disabledlib.php
cache/tests/cache_test.php

index 9abfe0e..07d7b35 100644 (file)
@@ -449,7 +449,8 @@ class cache_factory {
                         $definition = $instance->get_definition_by_id($id);
                         if (!$definition) {
                             throw new coding_exception('The requested cache definition does not exist.'. $id, $id);
-                        } else if (!$this->is_disabled()) {
+                        }
+                        if (!$this->is_disabled() && !($this instanceof cache_factory_disabled)) {
                             debugging('Cache definitions reparsed causing cache reset in order to locate definition.
                                 You should bump the version number to ensure definitions are reprocessed.', DEBUG_DEVELOPER);
                         }
index 2b86132..a557a3e 100644 (file)
@@ -223,11 +223,9 @@ class cache implements cache_loader {
         $this->storetype = get_class($store);
         $this->perfdebug = (!empty($CFG->perfdebug) and $CFG->perfdebug > 7);
         if ($loader instanceof cache_loader) {
-            $this->loader = $loader;
-            // Mark the loader as a sub (chained) loader.
-            $this->loader->set_is_sub_loader(true);
+            $this->set_loader($loader);
         } else if ($loader instanceof cache_data_source) {
-            $this->datasource = $loader;
+            $this->set_data_source($loader);
         }
         $this->definition->generate_definition_hash();
         $this->staticacceleration = $this->definition->use_static_acceleration();
@@ -237,6 +235,27 @@ class cache implements cache_loader {
         $this->hasattl = ($this->definition->get_ttl() > 0);
     }
 
+    /**
+     * Set the loader for this cache.
+     *
+     * @param   cache_loader $loader
+     */
+    protected function set_loader(cache_loader $loader): void {
+        $this->loader = $loader;
+
+        // Mark the loader as a sub (chained) loader.
+        $this->loader->set_is_sub_loader(true);
+    }
+
+    /**
+     * Set the data source for this cache.
+     *
+     * @param   cache_data_source $datasource
+     */
+    protected function set_data_source(cache_data_source $datasource): void {
+        $this->datasource = $datasource;
+    }
+
     /**
      * Used to inform the loader of its state as a sub loader, or as the top of the chain.
      *
index 2bcc1ca..1883fcc 100644 (file)
@@ -49,7 +49,12 @@ class cache_disabled extends cache {
      * @param null $loader Unused.
      */
     public function __construct(cache_definition $definition, cache_store $store, $loader = null) {
-        // Nothing to do here.
+        if ($loader instanceof cache_data_source) {
+            // Set the data source to allow data sources to work when caching is entirely disabled.
+            $this->set_data_source($loader);
+        }
+
+        // No other features are handled.
     }
 
     /**
@@ -60,6 +65,10 @@ class cache_disabled extends cache {
      * @return bool
      */
     public function get($key, $strictness = IGNORE_MISSING) {
+        if ($this->get_datasource() !== false) {
+            return $this->get_datasource()->load_for_cache($key);
+        }
+
         return false;
     }
 
@@ -71,10 +80,10 @@ class cache_disabled extends cache {
      * @return array
      */
     public function get_many(array $keys, $strictness = IGNORE_MISSING) {
-        $return = array();
-        foreach ($keys as $key) {
-            $return[$key] = false;
+        if ($this->get_datasource() !== false) {
+            return $this->get_datasource()->load_many_for_cache($keys);
         }
+
         return $return;
     }
 
@@ -129,7 +138,9 @@ class cache_disabled extends cache {
      * @return bool
      */
     public function has($key, $tryloadifpossible = false) {
-        return false;
+        $result = $this->get($key);
+
+        return $result !== false;
     }
 
     /**
@@ -138,7 +149,16 @@ class cache_disabled extends cache {
      * @return bool
      */
     public function has_all(array $keys) {
-        return false;
+        if (!$this->get_datasource()) {
+            return false;
+        }
+
+        foreach ($keys as $key) {
+            if (!$this->has($key)) {
+                return false;
+            }
+        }
+        return true;
     }
 
     /**
@@ -148,6 +168,12 @@ class cache_disabled extends cache {
      * @return bool
      */
     public function has_any(array $keys) {
+        foreach ($keys as $key) {
+            if ($this->has($key)) {
+                return true;
+            }
+        }
+
         return false;
     }
 
@@ -189,6 +215,11 @@ class cache_factory_disabled extends cache_factory {
      * @return cache_definition
      */
     public function create_definition($component, $area, $unused = null) {
+        $definition = parent::create_definition($component, $area);
+        if ($definition->has_data_source()) {
+            return $definition;
+        }
+
         return cache_definition::load_adhoc(cache_store::MODE_REQUEST, $component, $area);
     }
 
@@ -200,7 +231,11 @@ class cache_factory_disabled extends cache_factory {
      * @throws coding_exception
      */
     public function create_cache(cache_definition $definition) {
-        return new cache_disabled($definition, $this->create_dummy_store($definition));
+        $loader = null;
+        if ($definition->has_data_source()) {
+            $loader = $definition->get_data_source();
+        }
+        return new cache_disabled($definition, $this->create_dummy_store($definition), $loader);
     }
 
     /**
@@ -484,4 +519,4 @@ class cache_config_disabled extends cache_config_writer {
     public function set_definition_mappings($definition, $mappings) {
         // Nothing to do here.
     }
-}
\ No newline at end of file
+}
index a23672e..a711e69 100644 (file)
@@ -1342,8 +1342,6 @@ class core_cache_testcase extends advanced_testcase {
         $cache = cache::make_from_params(cache_store::MODE_APPLICATION, 'phpunit', 'disable');
         $this->assertInstanceOf('cache_disabled', $cache);
 
-        $this->assertFalse(file_exists($configfile));
-
         $this->assertFalse($cache->get('test'));
         $this->assertFalse($cache->set('test', 'test'));
         $this->assertFalse($cache->delete('test'));
@@ -1353,8 +1351,6 @@ class core_cache_testcase extends advanced_testcase {
         $cache = cache::make_from_params(cache_store::MODE_SESSION, 'phpunit', 'disable');
         $this->assertInstanceOf('cache_disabled', $cache);
 
-        $this->assertFalse(file_exists($configfile));
-
         $this->assertFalse($cache->get('test'));
         $this->assertFalse($cache->set('test', 'test'));
         $this->assertFalse($cache->delete('test'));
@@ -1364,8 +1360,6 @@ class core_cache_testcase extends advanced_testcase {
         $cache = cache::make_from_params(cache_store::MODE_REQUEST, 'phpunit', 'disable');
         $this->assertInstanceOf('cache_disabled', $cache);
 
-        $this->assertFalse(file_exists($configfile));
-
         $this->assertFalse($cache->get('test'));
         $this->assertFalse($cache->set('test', 'test'));
         $this->assertFalse($cache->delete('test'));