Mercurial > hg > rr-repo
diff sites/all/modules/ctools/includes/cache.inc @ 0:ff03f76ab3fe
initial version
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Wed, 21 Aug 2013 18:51:11 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/modules/ctools/includes/cache.inc Wed Aug 21 18:51:11 2013 +0100 @@ -0,0 +1,169 @@ +<?php + +/** + * @file + * + * Plugins to handle cache-indirection. + * + * Simple plugin management to allow clients to more tightly control where + * object caches are stored. + * + * CTools provides an object cache mechanism, and it also provides a number + * of subsystems that are designed to plug into larger systems. When doing + * caching on multi-step forms (in particular during AJAX operations) these + * subsystems often need to operate their own cache. In reality, its best + * for everyone if they are able to piggyback off of the larger cache. + * + * This system allows this by registering plugins to control where caches + * are actually stored. For the most part, the subsystems could care less + * where the data is fetched from and stored to. All it needs to know is + * that it can 'get', 'set' and 'clear' caches. Additionally, some caches + * might need extra operations such as 'lock' and 'finalize', and other + * operations may be needed based upon the specific uses for the cache + * plugins. + * + * To utilize cache plugins, there are two pieces of data. First, there is + * the mechanism, which is simply the name of the plugin to use. CTools + * provides a 'simple' mechanism which goes straight through to the object + * cache. The second piece of data is the 'key' which is a unique identifier + * that can be used to find the data needed. Keys can be generated any number + * of ways, and the plugin must be agnostic about the key itself. + * + * That said, the 'mechanism' can be specified as pluginame::data and that + * data can be used to derive additional data. For example, it is often + * desirable to NOT store any cached data until original data (i.e, user + * input) has been received. The data can be used to derive this original + * data so that when a 'get' is called, if the cache is missed it can create + * the data needed. This can help prevent unwanted cache entries from + * building up just by visiting edit UIs without actually modifying anything. + * + * Modules wishing to implement cache indirection mechanisms need to implement + * a plugin of type 'cache' for the module 'ctools' and provide the .inc file. + * It should provide callbacks for 'cache set', 'cache get', and 'cache clear'. + * It can provide callbacks for 'break' and 'finalize' if these are relevant + * to the caching mechanism (i.e, for use with locking caches such as the page + * manager cache). Other operations may be utilized but at this time are not part + * of CTools. + */ + +/** + * Fetch data from an indirect cache. + * + * @param string $mechanism + * A string containing the plugin name, and an optional data element to + * send to the plugin separated by two colons. + * + * @param string $key + * The key used to identify the cache. + * + * @return mixed + * The cached data. This can be any format as the plugin does not necessarily + * have knowledge of what is being cached. + */ +function ctools_cache_get($mechanism, $key) { + return ctools_cache_operation($mechanism, $key, 'get'); +} + +/** + * Store data in an indirect cache. + * + * @param string $mechanism + * A string containing the plugin name, and an optional data element to + * send to the plugin separated by two colons. + * + * @param string $key + * The key used to identify the cache. + * + * @param mixed $object + * The data to cache. This can be any format as the plugin does not + * necessarily have knowledge of what is being cached. + */ +function ctools_cache_set($mechanism, $key, $object) { + return ctools_cache_operation($mechanism, $key, 'set', $object); +} + +/** + * Clear data from an indirect cache. + * + * @param string $mechanism + * A string containing the plugin name, and an optional data element to + * send to the plugin separated by two colons. + * + * @param string $key + * The key used to identify the cache. + */ +function ctools_cache_clear($mechanism, $key) { + return ctools_cache_operation($mechanism, $key, 'clear'); + +} + +/** + * Perform a secondary operation on an indirect cache. + * + * Additional operations, beyond get, set and clear may be items + * such as 'break' and 'finalize', which are needed to support cache + * locking. Other operations may be added by users of the indirect + * caching functions as needed. + * + * @param string $mechanism + * A string containing the plugin name, and an optional data element to + * send to the plugin separated by two colons. + * + * @param string $key + * The key used to identify the cache. + * + * @param string $op + * The operation to call, such as 'break' or 'finalize'. + * + * @param mixed $object + * The cache data being operated on, in case it is necessary. This is + * optional so no references should be used. + * + * @return mixed + * The operation may or may not return a value. + */ +function ctools_cache_operation($mechanism, $key, $op, $object = NULL) { + list($plugin, $data) = ctools_cache_find_plugin($mechanism); + if (empty($plugin)) { + return; + } + + $function = ctools_plugin_get_function($plugin, "cache $op"); + if (empty($function)) { + return; + } + + return $function($data, $key, $object, $op); +} + +/** + * Take a mechanism and return a plugin and data. + * + * @param string $mechanism + * A string containing the plugin name, and an optional data element to + * send to the plugin separated by two colons. + * + * @return array + * An array, the first element will be the plugin and the second element + * will be the data. If the plugin could not be found, the $plugin will + * be NULL. + */ +function ctools_cache_find_plugin($mechanism) { + if (strpos($mechanism, '::') !== FALSE) { + // use explode(2) to ensure that the data can contain double + // colons, just in case. + list($name, $data) = explode('::', $mechanism, 2); + } + else { + $name = $mechanism; + $data = ''; + } + + if (empty($name)) { + return array(NULL, $data); + } + + ctools_include('plugins'); + $plugin = ctools_get_plugins('ctools', 'cache', $name); + return array($plugin, $data); +}