| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | <?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);}
 |