Merge branch 'MDL-39472-master' of git://github.com/sammarshallou/moodle
authorDan Poltawski <dan@moodle.com>
Wed, 12 Jun 2013 05:56:39 +0000 (13:56 +0800)
committerDan Poltawski <dan@moodle.com>
Wed, 12 Jun 2013 05:56:39 +0000 (13:56 +0800)
1  2 
cache/classes/helper.php

diff --combined cache/classes/helper.php
@@@ -192,7 -192,8 +192,7 @@@ class cache_helper 
              if (in_array($pluginname, $ignored)) {
                  continue;
              }
 -            $pluginname = clean_param($pluginname, PARAM_PLUGIN);
 -            if (empty($pluginname)) {
 +            if (!is_valid_plugin_name($pluginname)) {
                  // Better ignore plugins with problematic names here.
                  continue;
              }
      /**
       * Purges the cache for a specific definition.
       *
 +     * If you need to purge a definition that requires identifiers or an aggregate and you don't
 +     * know the details of those please use cache_helper::purge_stores_used_by_definition instead.
 +     * It is a more aggressive purge and will purge all data within the store, not just the data
 +     * belonging to the given definition.
 +     *
       * @todo MDL-36660: Change the signature: $aggregate must be added.
       *
       * @param string $component
       * @param string $definition
       */
      protected static function ensure_ready_for_stats($store, $definition) {
+         // This function is performance-sensitive, so exit as quickly as possible
+         // if we do not need to do anything.
+         if (isset(self::$stats[$definition][$store])) {
+             return;
+         }
          if (!array_key_exists($definition, self::$stats)) {
              self::$stats[$definition] = array(
                  $store => array(
       * Think twice before calling this method. It will purge **ALL** caches regardless of whether they have been used recently or
       * anything. This will involve full setup of the cache + the purge operation. On a site using caching heavily this WILL be
       * painful.
 +     *
 +     * @param bool $usewriter If set to true the cache_config_writer class is used. This class is special as it avoids
 +     *      it is still usable when caches have been disabled.
 +     *      Please use this option only if you really must. It's purpose is to allow the cache to be purged when it would be
 +     *      otherwise impossible.
       */
 -    public static function purge_all() {
 -        $config = cache_config::instance();
 -
 +    public static function purge_all($usewriter = false) {
 +        $factory = cache_factory::instance();
 +        $config = $factory->create_config_instance($usewriter);
          foreach ($config->get_all_stores() as $store) {
 -            self::purge_store($store['name']);
 +            self::purge_store($store['name'], $config);
          }
      }
  
       * Purges a store given its name.
       *
       * @param string $storename
 +     * @param cache_config $config
       * @return bool
       */
 -    public static function purge_store($storename) {
 -        $config = cache_config::instance();
 +    public static function purge_store($storename, cache_config $config = null) {
 +        if ($config === null) {
 +            $config = cache_config::instance();
 +        }
  
          $stores = $config->get_all_stores();
          if (!array_key_exists($storename, $stores)) {
  
          foreach ($config->get_definitions_by_store($storename) as $id => $definition) {
              $definition = cache_definition::load($id, $definition);
 -            $instance = new $class($store['name'], $store['configuration']);
 -            $instance->initialise($definition);
 -            $instance->purge();
 -            unset($instance);
 +            $definitioninstance = clone($instance);
 +            $definitioninstance->initialise($definition);
 +            $definitioninstance->purge();
 +            unset($definitioninstance);
          }
  
          return true;
      }
  
 +    /**
 +     * Purges all of the stores used by a definition.
 +     *
 +     * Unlike cache_helper::purge_by_definition this purges all of the data from the stores not
 +     * just the data relating to the definition.
 +     * This function is useful when you must purge a definition that requires setup but you don't
 +     * want to set it up.
 +     *
 +     * @param string $component
 +     * @param string $area
 +     */
 +    public static function purge_stores_used_by_definition($component, $area) {
 +        $factory = cache_factory::instance();
 +        $config = $factory->create_config_instance();
 +        $definition = $factory->create_definition($component, $area);
 +        $stores = $config->get_stores_for_definition($definition);
 +        foreach ($stores as $store) {
 +            self::purge_store($store['name']);
 +        }
 +    }
 +
      /**
       * Returns the translated name of the definition.
       *