diff options
Diffstat (limited to 'includes/cache/CacheDependency.php')
-rw-r--r-- | includes/cache/CacheDependency.php | 230 |
1 files changed, 32 insertions, 198 deletions
diff --git a/includes/cache/CacheDependency.php b/includes/cache/CacheDependency.php index 32bcdf7f..9b48ecb7 100644 --- a/includes/cache/CacheDependency.php +++ b/includes/cache/CacheDependency.php @@ -28,14 +28,15 @@ * @ingroup Cache */ class DependencyWrapper { - var $value; - var $deps; + private $value; + /** @var CacheDependency[] */ + private $deps; /** * Create an instance. - * @param $value Mixed: the user-supplied value - * @param $deps Mixed: a dependency or dependency array. All dependencies - * must be objects implementing CacheDependency. + * @param mixed $value The user-supplied value + * @param CacheDependency|CacheDependency[] $deps A dependency or dependency + * array. All dependencies must be objects implementing CacheDependency. */ function __construct( $value = false, $deps = array() ) { $this->value = $value; @@ -74,7 +75,7 @@ class DependencyWrapper { /** * Get the user-defined value - * @return bool|Mixed + * @return bool|mixed */ function getValue() { return $this->value; @@ -83,9 +84,9 @@ class DependencyWrapper { /** * Store the wrapper to a cache * - * @param $cache BagOStuff - * @param $key - * @param $expiry + * @param BagOStuff $cache + * @param string $key + * @param int $expiry */ function storeToCache( $cache, $key, $expiry = 0 ) { $this->initialiseDeps(); @@ -97,12 +98,12 @@ class DependencyWrapper { * it will be generated with the callback function (if present), and the newly * calculated value will be stored to the cache in a wrapper. * - * @param $cache BagOStuff a cache object such as $wgMemc - * @param string $key the cache key - * @param $expiry Integer: the expiry timestamp or interval in seconds - * @param $callback Mixed: the callback for generating the value, or false - * @param array $callbackParams the function parameters for the callback - * @param array $deps the dependencies to store on a cache miss. Note: these + * @param BagOStuff $cache A cache object such as $wgMemc + * @param string $key The cache key + * @param int $expiry The expiry timestamp or interval in seconds + * @param bool|callable $callback The callback for generating the value, or false + * @param array $callbackParams The function parameters for the callback + * @param array $deps The dependencies to store on a cache miss. Note: these * are not the dependencies used on a cache hit! Cache hits use the stored * dependency array. * @@ -110,8 +111,8 @@ class DependencyWrapper { * callback was defined. */ static function getValueFromCache( $cache, $key, $expiry = 0, $callback = false, - $callbackParams = array(), $deps = array() ) - { + $callbackParams = array(), $deps = array() + ) { $obj = $cache->get( $key ); if ( is_object( $obj ) && $obj instanceof DependencyWrapper && !$obj->isExpired() ) { @@ -141,20 +142,22 @@ abstract class CacheDependency { /** * Hook to perform any expensive pre-serialize loading of dependency values. */ - function loadDependencyValues() { } + function loadDependencyValues() { + } } /** * @ingroup Cache */ class FileDependency extends CacheDependency { - var $filename, $timestamp; + private $filename; + private $timestamp; /** * Create a file dependency * - * @param string $filename the name of the file, preferably fully qualified - * @param $timestamp Mixed: the unix last modified timestamp, or false if the + * @param string $filename The name of the file, preferably fully qualified + * @param null|bool|int $timestamp The unix last modified timestamp, or false if the * file does not exist. If omitted, the timestamp will be loaded from * the file. * @@ -172,6 +175,7 @@ class FileDependency extends CacheDependency { */ function __sleep() { $this->loadDependencyValues(); + return array( 'filename', 'timestamp' ); } @@ -198,6 +202,7 @@ class FileDependency extends CacheDependency { } else { # Deleted wfDebug( "Dependency triggered: {$this->filename} deleted.\n" ); + return true; } } else { @@ -205,6 +210,7 @@ class FileDependency extends CacheDependency { if ( $lastmod > $this->timestamp ) { # Modified or created wfDebug( "Dependency triggered: {$this->filename} changed.\n" ); + return true; } else { # Not modified @@ -217,183 +223,9 @@ class FileDependency extends CacheDependency { /** * @ingroup Cache */ -class TitleDependency extends CacheDependency { - var $titleObj; - var $ns, $dbk; - var $touched; - - /** - * Construct a title dependency - * @param $title Title - */ - function __construct( Title $title ) { - $this->titleObj = $title; - $this->ns = $title->getNamespace(); - $this->dbk = $title->getDBkey(); - } - - function loadDependencyValues() { - $this->touched = $this->getTitle()->getTouched(); - } - - /** - * Get rid of bulky Title object for sleep - * - * @return array - */ - function __sleep() { - return array( 'ns', 'dbk', 'touched' ); - } - - /** - * @return Title - */ - function getTitle() { - if ( !isset( $this->titleObj ) ) { - $this->titleObj = Title::makeTitle( $this->ns, $this->dbk ); - } - - return $this->titleObj; - } - - /** - * @return bool - */ - function isExpired() { - $touched = $this->getTitle()->getTouched(); - - if ( $this->touched === false ) { - if ( $touched === false ) { - # Still missing - return false; - } else { - # Created - return true; - } - } elseif ( $touched === false ) { - # Deleted - return true; - } elseif ( $touched > $this->touched ) { - # Updated - return true; - } else { - # Unmodified - return false; - } - } -} - -/** - * @ingroup Cache - */ -class TitleListDependency extends CacheDependency { - var $linkBatch; - var $timestamps; - - /** - * Construct a dependency on a list of titles - * @param $linkBatch LinkBatch - */ - function __construct( LinkBatch $linkBatch ) { - $this->linkBatch = $linkBatch; - } - - /** - * @return array - */ - function calculateTimestamps() { - # Initialise values to false - $timestamps = array(); - - foreach ( $this->getLinkBatch()->data as $ns => $dbks ) { - if ( count( $dbks ) > 0 ) { - $timestamps[$ns] = array(); - - foreach ( $dbks as $dbk => $value ) { - $timestamps[$ns][$dbk] = false; - } - } - } - - # Do the query - if ( count( $timestamps ) ) { - $dbr = wfGetDB( DB_SLAVE ); - $where = $this->getLinkBatch()->constructSet( 'page', $dbr ); - $res = $dbr->select( - 'page', - array( 'page_namespace', 'page_title', 'page_touched' ), - $where, - __METHOD__ - ); - - foreach ( $res as $row ) { - $timestamps[$row->page_namespace][$row->page_title] = $row->page_touched; - } - } - - return $timestamps; - } - - function loadDependencyValues() { - $this->timestamps = $this->calculateTimestamps(); - } - - /** - * @return array - */ - function __sleep() { - return array( 'timestamps' ); - } - - /** - * @return LinkBatch - */ - function getLinkBatch() { - if ( !isset( $this->linkBatch ) ) { - $this->linkBatch = new LinkBatch; - $this->linkBatch->setArray( $this->timestamps ); - } - return $this->linkBatch; - } - - /** - * @return bool - */ - function isExpired() { - $newTimestamps = $this->calculateTimestamps(); - - foreach ( $this->timestamps as $ns => $dbks ) { - foreach ( $dbks as $dbk => $oldTimestamp ) { - $newTimestamp = $newTimestamps[$ns][$dbk]; - - if ( $oldTimestamp === false ) { - if ( $newTimestamp === false ) { - # Still missing - } else { - # Created - return true; - } - } elseif ( $newTimestamp === false ) { - # Deleted - return true; - } elseif ( $newTimestamp > $oldTimestamp ) { - # Updated - return true; - } else { - # Unmodified - } - } - } - - return false; - } -} - -/** - * @ingroup Cache - */ class GlobalDependency extends CacheDependency { - var $name, $value; + private $name; + private $value; function __construct( $name ) { $this->name = $name; @@ -407,6 +239,7 @@ class GlobalDependency extends CacheDependency { if ( !isset( $GLOBALS[$this->name] ) ) { return true; } + return $GLOBALS[$this->name] != $this->value; } } @@ -415,7 +248,8 @@ class GlobalDependency extends CacheDependency { * @ingroup Cache */ class ConstantDependency extends CacheDependency { - var $name, $value; + private $name; + private $value; function __construct( $name ) { $this->name = $name; |