File indexing completed on 2024-12-22 05:36:21
0001 <?php 0002 0003 /** 0004 * Abstract class representing Definition cache managers that implements 0005 * useful common methods and is a factory. 0006 * @todo Create a separate maintenance file advanced users can use to 0007 * cache their custom HTMLDefinition, which can be loaded 0008 * via a configuration directive 0009 * @todo Implement memcached 0010 */ 0011 abstract class HTMLPurifier_DefinitionCache 0012 { 0013 /** 0014 * @type string 0015 */ 0016 public $type; 0017 0018 /** 0019 * @param string $type Type of definition objects this instance of the 0020 * cache will handle. 0021 */ 0022 public function __construct($type) 0023 { 0024 $this->type = $type; 0025 } 0026 0027 /** 0028 * Generates a unique identifier for a particular configuration 0029 * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config 0030 * @return string 0031 */ 0032 public function generateKey($config) 0033 { 0034 return $config->version . ',' . // possibly replace with function calls 0035 $config->getBatchSerial($this->type) . ',' . 0036 $config->get($this->type . '.DefinitionRev'); 0037 } 0038 0039 /** 0040 * Tests whether or not a key is old with respect to the configuration's 0041 * version and revision number. 0042 * @param string $key Key to test 0043 * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against 0044 * @return bool 0045 */ 0046 public function isOld($key, $config) 0047 { 0048 if (substr_count($key, ',') < 2) { 0049 return true; 0050 } 0051 list($version, $hash, $revision) = explode(',', $key, 3); 0052 $compare = version_compare($version, $config->version); 0053 // version mismatch, is always old 0054 if ($compare != 0) { 0055 return true; 0056 } 0057 // versions match, ids match, check revision number 0058 if ($hash == $config->getBatchSerial($this->type) && 0059 $revision < $config->get($this->type . '.DefinitionRev')) { 0060 return true; 0061 } 0062 return false; 0063 } 0064 0065 /** 0066 * Checks if a definition's type jives with the cache's type 0067 * @note Throws an error on failure 0068 * @param HTMLPurifier_Definition $def Definition object to check 0069 * @return bool true if good, false if not 0070 */ 0071 public function checkDefType($def) 0072 { 0073 if ($def->type !== $this->type) { 0074 trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); 0075 return false; 0076 } 0077 return true; 0078 } 0079 0080 /** 0081 * Adds a definition object to the cache 0082 * @param HTMLPurifier_Definition $def 0083 * @param HTMLPurifier_Config $config 0084 */ 0085 abstract public function add($def, $config); 0086 0087 /** 0088 * Unconditionally saves a definition object to the cache 0089 * @param HTMLPurifier_Definition $def 0090 * @param HTMLPurifier_Config $config 0091 */ 0092 abstract public function set($def, $config); 0093 0094 /** 0095 * Replace an object in the cache 0096 * @param HTMLPurifier_Definition $def 0097 * @param HTMLPurifier_Config $config 0098 */ 0099 abstract public function replace($def, $config); 0100 0101 /** 0102 * Retrieves a definition object from the cache 0103 * @param HTMLPurifier_Config $config 0104 */ 0105 abstract public function get($config); 0106 0107 /** 0108 * Removes a definition object to the cache 0109 * @param HTMLPurifier_Config $config 0110 */ 0111 abstract public function remove($config); 0112 0113 /** 0114 * Clears all objects from cache 0115 * @param HTMLPurifier_Config $config 0116 */ 0117 abstract public function flush($config); 0118 0119 /** 0120 * Clears all expired (older version or revision) objects from cache 0121 * @note Be careful implementing this method as flush. Flush must 0122 * not interfere with other Definition types, and cleanup() 0123 * should not be repeatedly called by userland code. 0124 * @param HTMLPurifier_Config $config 0125 */ 0126 abstract public function cleanup($config); 0127 } 0128 0129 // vim: et sw=4 sts=4