From: Umherirrender Date: Fri, 8 Mar 2019 21:27:29 +0000 (+0100) Subject: Move CacheDependency classes to own files X-Git-Tag: 1.34.0-rc.0~2594^2 X-Git-Url: http://git.cyclocoop.org/data/%24self?a=commitdiff_plain;h=ba03d8f32a7ad4f375613a250f39e6de5de8ad6d;p=lhc%2Fweb%2Fwiklou.git Move CacheDependency classes to own files Change-Id: Icacf36674f10fa19a09499d68d596d5e2cc235f0 --- diff --git a/.phpcs.xml b/.phpcs.xml index 5a639adb99..171cfaf63e 100644 --- a/.phpcs.xml +++ b/.phpcs.xml @@ -74,7 +74,6 @@ */includes/RevisionList\.php */includes/installer/PhpBugTests\.php */includes/specials/SpecialMostinterwikis\.php - */includes/cache/CacheDependency\.php */includes/compat/XMPReader\.php */includes/diff/DairikiDiff\.php */includes/specials/SpecialAncientpages\.php @@ -213,7 +212,6 @@ */includes/api/ApiMessage\.php */includes/api/ApiOpenSearch\.php */includes/api/ApiRsd\.php - */includes/cache/CacheDependency\.php */includes/compat/XMPReader\.php */includes/diff/DairikiDiff\.php */includes/diff/DiffEngine\.php diff --git a/autoload.php b/autoload.php index be377373e9..403b61026d 100644 --- a/autoload.php +++ b/autoload.php @@ -217,7 +217,7 @@ $wgAutoloadLocalClasses = [ 'BufferingStatsdDataFactory' => __DIR__ . '/includes/libs/stats/BufferingStatsdDataFactory.php', 'CLIParser' => __DIR__ . '/maintenance/parse.php', 'CSSMin' => __DIR__ . '/includes/libs/CSSMin.php', - 'CacheDependency' => __DIR__ . '/includes/cache/CacheDependency.php', + 'CacheDependency' => __DIR__ . '/includes/cache/dependency/CacheDependency.php', 'CacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php', 'CacheTime' => __DIR__ . '/includes/parser/CacheTime.php', 'CachedAction' => __DIR__ . '/includes/actions/CachedAction.php', @@ -303,7 +303,7 @@ $wgAutoloadLocalClasses = [ 'ConfigException' => __DIR__ . '/includes/config/ConfigException.php', 'ConfigFactory' => __DIR__ . '/includes/config/ConfigFactory.php', 'ConfiguredReadOnlyMode' => __DIR__ . '/includes/ConfiguredReadOnlyMode.php', - 'ConstantDependency' => __DIR__ . '/includes/cache/CacheDependency.php', + 'ConstantDependency' => __DIR__ . '/includes/cache/dependency/ConstantDependency.php', 'Content' => __DIR__ . '/includes/content/Content.php', 'ContentHandler' => __DIR__ . '/includes/content/ContentHandler.php', 'ContentModelLogFormatter' => __DIR__ . '/includes/logging/ContentModelLogFormatter.php', @@ -387,7 +387,7 @@ $wgAutoloadLocalClasses = [ 'DeleteSelfExternals' => __DIR__ . '/maintenance/deleteSelfExternals.php', 'DeletedContribsPager' => __DIR__ . '/includes/specials/pagers/DeletedContribsPager.php', 'DeletedContributionsPage' => __DIR__ . '/includes/specials/SpecialDeletedContributions.php', - 'DependencyWrapper' => __DIR__ . '/includes/cache/CacheDependency.php', + 'DependencyWrapper' => __DIR__ . '/includes/cache/dependency/DependencyWrapper.php', 'DeprecatedGlobal' => __DIR__ . '/includes/DeprecatedGlobal.php', 'DeprecatedInterfaceFinder' => __DIR__ . '/maintenance/findDeprecated.php', 'DeprecationHelper' => __DIR__ . '/includes/debug/DeprecationHelper.php', @@ -519,7 +519,7 @@ $wgAutoloadLocalClasses = [ 'FileContentHandler' => __DIR__ . '/includes/content/FileContentHandler.php', 'FileContentsHasher' => __DIR__ . '/includes/utils/FileContentsHasher.php', 'FileDeleteForm' => __DIR__ . '/includes/FileDeleteForm.php', - 'FileDependency' => __DIR__ . '/includes/cache/CacheDependency.php', + 'FileDependency' => __DIR__ . '/includes/cache/dependency/FileDependency.php', 'FileDuplicateSearchPage' => __DIR__ . '/includes/specials/SpecialFileDuplicateSearch.php', 'FileJournal' => __DIR__ . '/includes/libs/filebackend/filejournal/FileJournal.php', 'FileOp' => __DIR__ . '/includes/libs/filebackend/fileop/FileOp.php', @@ -569,7 +569,7 @@ $wgAutoloadLocalClasses = [ 'GetReplicaServer' => __DIR__ . '/maintenance/getReplicaServer.php', 'GetTextMaint' => __DIR__ . '/maintenance/getText.php', 'GitInfo' => __DIR__ . '/includes/GitInfo.php', - 'GlobalDependency' => __DIR__ . '/includes/cache/CacheDependency.php', + 'GlobalDependency' => __DIR__ . '/includes/cache/dependency/GlobalDependency.php', 'GlobalVarConfig' => __DIR__ . '/includes/config/GlobalVarConfig.php', 'GuzzleHttpRequest' => __DIR__ . '/includes/http/GuzzleHttpRequest.php', 'HHVMMakeRepo' => __DIR__ . '/maintenance/hhvm/makeRepo.php', @@ -845,7 +845,7 @@ $wgAutoloadLocalClasses = [ 'MagicWordArray' => __DIR__ . '/includes/MagicWordArray.php', 'MagicWordFactory' => __DIR__ . '/includes/MagicWordFactory.php', 'MailAddress' => __DIR__ . '/includes/mail/MailAddress.php', - 'MainConfigDependency' => __DIR__ . '/includes/cache/CacheDependency.php', + 'MainConfigDependency' => __DIR__ . '/includes/cache/dependency/MainConfigDependency.php', 'MaintainableDBConnRef' => __DIR__ . '/includes/libs/rdbms/database/MaintainableDBConnRef.php', 'Maintenance' => __DIR__ . '/maintenance/Maintenance.php', 'MakeTestEdits' => __DIR__ . '/maintenance/makeTestEdits.php', diff --git a/includes/cache/CacheDependency.php b/includes/cache/CacheDependency.php deleted file mode 100644 index 11df5bcffc..0000000000 --- a/includes/cache/CacheDependency.php +++ /dev/null @@ -1,293 +0,0 @@ -value = $value; - - if ( !is_array( $deps ) ) { - $deps = [ $deps ]; - } - - $this->deps = $deps; - } - - /** - * Returns true if any of the dependencies have expired - * - * @return bool - */ - function isExpired() { - foreach ( $this->deps as $dep ) { - if ( $dep->isExpired() ) { - return true; - } - } - - return false; - } - - /** - * Initialise dependency values in preparation for storing. This must be - * called before serialization. - */ - function initialiseDeps() { - foreach ( $this->deps as $dep ) { - $dep->loadDependencyValues(); - } - } - - /** - * Get the user-defined value - * @return bool|mixed - */ - function getValue() { - return $this->value; - } - - /** - * Store the wrapper to a cache - * - * @param BagOStuff $cache - * @param string $key - * @param int $expiry - */ - function storeToCache( $cache, $key, $expiry = 0 ) { - $this->initialiseDeps(); - $cache->set( $key, $this, $expiry ); - } - - /** - * Attempt to get a value from the cache. If the value is expired or missing, - * 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 BagOStuff $cache - * @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. - * - * @return mixed The value, or null if it was not present in the cache and no - * callback was defined. - */ - static function getValueFromCache( $cache, $key, $expiry = 0, $callback = false, - $callbackParams = [], $deps = [] - ) { - $obj = $cache->get( $key ); - - if ( is_object( $obj ) && $obj instanceof DependencyWrapper && !$obj->isExpired() ) { - $value = $obj->value; - } elseif ( $callback ) { - $value = $callback( ...$callbackParams ); - # Cache the newly-generated value - $wrapper = new DependencyWrapper( $value, $deps ); - $wrapper->storeToCache( $cache, $key, $expiry ); - } else { - $value = null; - } - - return $value; - } -} - -/** - * @ingroup Cache - */ -abstract class CacheDependency { - /** - * Returns true if the dependency is expired, false otherwise - */ - abstract function isExpired(); - - /** - * Hook to perform any expensive pre-serialize loading of dependency values. - */ - function loadDependencyValues() { - } -} - -/** - * @ingroup Cache - */ -class FileDependency extends CacheDependency { - private $filename; - private $timestamp; - - /** - * Create a file dependency - * - * @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. - * - * A dependency on a nonexistent file will be triggered when the file is - * created. A dependency on an existing file will be triggered when the - * file is changed. - */ - function __construct( $filename, $timestamp = null ) { - $this->filename = $filename; - $this->timestamp = $timestamp; - } - - /** - * @return array - */ - function __sleep() { - $this->loadDependencyValues(); - - return [ 'filename', 'timestamp' ]; - } - - function loadDependencyValues() { - if ( is_null( $this->timestamp ) ) { - Wikimedia\suppressWarnings(); - # Dependency on a non-existent file stores "false" - # This is a valid concept! - $this->timestamp = filemtime( $this->filename ); - Wikimedia\restoreWarnings(); - } - } - - /** - * @return bool - */ - function isExpired() { - Wikimedia\suppressWarnings(); - $lastmod = filemtime( $this->filename ); - Wikimedia\restoreWarnings(); - if ( $lastmod === false ) { - if ( $this->timestamp === false ) { - # Still nonexistent - return false; - } else { - # Deleted - wfDebug( "Dependency triggered: {$this->filename} deleted.\n" ); - - return true; - } - } else { - if ( $lastmod > $this->timestamp ) { - # Modified or created - wfDebug( "Dependency triggered: {$this->filename} changed.\n" ); - - return true; - } else { - # Not modified - return false; - } - } - } -} - -/** - * @ingroup Cache - */ -class GlobalDependency extends CacheDependency { - private $name; - private $value; - - function __construct( $name ) { - $this->name = $name; - $this->value = $GLOBALS[$name]; - } - - /** - * @return bool - */ - function isExpired() { - if ( !isset( $GLOBALS[$this->name] ) ) { - return true; - } - - return $GLOBALS[$this->name] != $this->value; - } -} - -/** - * @ingroup Cache - */ -class MainConfigDependency extends CacheDependency { - private $name; - private $value; - - function __construct( $name ) { - $this->name = $name; - $this->value = $this->getConfig()->get( $this->name ); - } - - private function getConfig() { - return MediaWikiServices::getInstance()->getMainConfig(); - } - - /** - * @return bool - */ - function isExpired() { - if ( !$this->getConfig()->has( $this->name ) ) { - return true; - } - - return $this->getConfig()->get( $this->name ) != $this->value; - } -} - -/** - * @ingroup Cache - */ -class ConstantDependency extends CacheDependency { - private $name; - private $value; - - function __construct( $name ) { - $this->name = $name; - $this->value = constant( $name ); - } - - /** - * @return bool - */ - function isExpired() { - return constant( $this->name ) != $this->value; - } -} diff --git a/includes/cache/dependency/CacheDependency.php b/includes/cache/dependency/CacheDependency.php new file mode 100644 index 0000000000..2e4711f1ba --- /dev/null +++ b/includes/cache/dependency/CacheDependency.php @@ -0,0 +1,38 @@ +name = $name; + $this->value = constant( $name ); + } + + /** + * @return bool + */ + function isExpired() { + return constant( $this->name ) != $this->value; + } +} diff --git a/includes/cache/dependency/DependencyWrapper.php b/includes/cache/dependency/DependencyWrapper.php new file mode 100644 index 0000000000..43d659c087 --- /dev/null +++ b/includes/cache/dependency/DependencyWrapper.php @@ -0,0 +1,130 @@ +value = $value; + + if ( !is_array( $deps ) ) { + $deps = [ $deps ]; + } + + $this->deps = $deps; + } + + /** + * Returns true if any of the dependencies have expired + * + * @return bool + */ + function isExpired() { + foreach ( $this->deps as $dep ) { + if ( $dep->isExpired() ) { + return true; + } + } + + return false; + } + + /** + * Initialise dependency values in preparation for storing. This must be + * called before serialization. + */ + function initialiseDeps() { + foreach ( $this->deps as $dep ) { + $dep->loadDependencyValues(); + } + } + + /** + * Get the user-defined value + * @return bool|mixed + */ + function getValue() { + return $this->value; + } + + /** + * Store the wrapper to a cache + * + * @param BagOStuff $cache + * @param string $key + * @param int $expiry + */ + function storeToCache( $cache, $key, $expiry = 0 ) { + $this->initialiseDeps(); + $cache->set( $key, $this, $expiry ); + } + + /** + * Attempt to get a value from the cache. If the value is expired or missing, + * 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 BagOStuff $cache + * @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. + * + * @return mixed The value, or null if it was not present in the cache and no + * callback was defined. + */ + static function getValueFromCache( $cache, $key, $expiry = 0, $callback = false, + $callbackParams = [], $deps = [] + ) { + $obj = $cache->get( $key ); + + if ( is_object( $obj ) && $obj instanceof DependencyWrapper && !$obj->isExpired() ) { + $value = $obj->value; + } elseif ( $callback ) { + $value = $callback( ...$callbackParams ); + # Cache the newly-generated value + $wrapper = new DependencyWrapper( $value, $deps ); + $wrapper->storeToCache( $cache, $key, $expiry ); + } else { + $value = null; + } + + return $value; + } +} diff --git a/includes/cache/dependency/FileDependency.php b/includes/cache/dependency/FileDependency.php new file mode 100644 index 0000000000..8d199e2c78 --- /dev/null +++ b/includes/cache/dependency/FileDependency.php @@ -0,0 +1,96 @@ +filename = $filename; + $this->timestamp = $timestamp; + } + + /** + * @return array + */ + function __sleep() { + $this->loadDependencyValues(); + + return [ 'filename', 'timestamp' ]; + } + + function loadDependencyValues() { + if ( is_null( $this->timestamp ) ) { + Wikimedia\suppressWarnings(); + # Dependency on a non-existent file stores "false" + # This is a valid concept! + $this->timestamp = filemtime( $this->filename ); + Wikimedia\restoreWarnings(); + } + } + + /** + * @return bool + */ + function isExpired() { + Wikimedia\suppressWarnings(); + $lastmod = filemtime( $this->filename ); + Wikimedia\restoreWarnings(); + if ( $lastmod === false ) { + if ( $this->timestamp === false ) { + # Still nonexistent + return false; + } else { + # Deleted + wfDebug( "Dependency triggered: {$this->filename} deleted.\n" ); + + return true; + } + } else { + if ( $lastmod > $this->timestamp ) { + # Modified or created + wfDebug( "Dependency triggered: {$this->filename} changed.\n" ); + + return true; + } else { + # Not modified + return false; + } + } + } +} diff --git a/includes/cache/dependency/GlobalDependency.php b/includes/cache/dependency/GlobalDependency.php new file mode 100644 index 0000000000..be1d34548c --- /dev/null +++ b/includes/cache/dependency/GlobalDependency.php @@ -0,0 +1,46 @@ +name = $name; + $this->value = $GLOBALS[$name]; + } + + /** + * @return bool + */ + function isExpired() { + if ( !isset( $GLOBALS[$this->name] ) ) { + return true; + } + + return $GLOBALS[$this->name] != $this->value; + } +} diff --git a/includes/cache/dependency/MainConfigDependency.php b/includes/cache/dependency/MainConfigDependency.php new file mode 100644 index 0000000000..dd33a2e202 --- /dev/null +++ b/includes/cache/dependency/MainConfigDependency.php @@ -0,0 +1,51 @@ +name = $name; + $this->value = $this->getConfig()->get( $this->name ); + } + + private function getConfig() { + return MediaWikiServices::getInstance()->getMainConfig(); + } + + /** + * @return bool + */ + function isExpired() { + if ( !$this->getConfig()->has( $this->name ) ) { + return true; + } + + return $this->getConfig()->get( $this->name ) != $this->value; + } +}