X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Flibs%2FMapCacheLRU.php;h=e0c81eddba10a71b84bb5183be8b990bae883b78;hb=35243c574fa96b447d1683a9cae234ec7958d611;hp=ad5e58d8082f328dd43a1f9639cdd650b19950c4;hpb=b85e01f60bca73668eed043bf4b1d3b71ecf3401;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/libs/MapCacheLRU.php b/includes/libs/MapCacheLRU.php index ad5e58d808..e0c81eddba 100644 --- a/includes/libs/MapCacheLRU.php +++ b/includes/libs/MapCacheLRU.php @@ -48,6 +48,7 @@ class MapCacheLRU implements IExpiringStore, Serializable { /** @var float|null */ private $wallClockOverride; + /** @var float */ const RANK_TOP = 1.0; /** @var int Array key that holds the entry's main timestamp (flat key use) */ @@ -64,7 +65,7 @@ class MapCacheLRU implements IExpiringStore, Serializable { Assert::parameter( $maxKeys > 0, '$maxKeys', 'must be above zero' ); $this->maxCacheKeys = $maxKeys; - // Use the current time as the default "as of" timesamp of entries + // Use the current time as the default "as of" timestamp of entries $this->epoch = $this->getCurrentTime(); } @@ -103,7 +104,7 @@ class MapCacheLRU implements IExpiringStore, Serializable { * * @param string $key * @param mixed $value - * @param float $rank Bottom fraction of the list where keys start off [Default: 1.0] + * @param float $rank Bottom fraction of the list where keys start off [default: 1.0] * @return void */ public function set( $key, $value, $rank = self::RANK_TOP ) { @@ -135,13 +136,14 @@ class MapCacheLRU implements IExpiringStore, Serializable { * Check if a key exists * * @param string $key - * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32) + * @param float $maxAge Ignore items older than this many seconds [default: INF] * @return bool + * @since 1.32 Added $maxAge */ - public function has( $key, $maxAge = 0.0 ) { + public function has( $key, $maxAge = INF ) { if ( !is_int( $key ) && !is_string( $key ) ) { throw new UnexpectedValueException( - __METHOD__ . ' called with invalid key. Must be string or integer.' ); + __METHOD__ . ': invalid key; must be string or integer.' ); } if ( !array_key_exists( $key, $this->cache ) ) { @@ -157,12 +159,15 @@ class MapCacheLRU implements IExpiringStore, Serializable { * If the item is already set, it will be pushed to the top of the cache. * * @param string $key - * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32) - * @return mixed Returns null if the key was not found or is older than $maxAge + * @param float $maxAge Ignore items older than this many seconds [default: INF] + * @param mixed|null $default Value to return if no key is found [default: null] + * @return mixed Returns $default if the key was not found or is older than $maxAge + * @since 1.32 Added $maxAge + * @since 1.34 Added $default */ - public function get( $key, $maxAge = 0.0 ) { + public function get( $key, $maxAge = INF, $default = null ) { if ( !$this->has( $key, $maxAge ) ) { - return null; + return $default; } $this->ping( $key ); @@ -183,8 +188,15 @@ class MapCacheLRU implements IExpiringStore, Serializable { $this->set( $key, [], $initRank ); } + if ( !is_int( $field ) && !is_string( $field ) ) { + throw new UnexpectedValueException( + __METHOD__ . ": invalid field for '$key'; must be string or integer." ); + } + if ( !is_array( $this->cache[$key] ) ) { - throw new UnexpectedValueException( "The value of '$key' is not an array." ); + $type = gettype( $this->cache[$key] ); + + throw new UnexpectedValueException( "The value of '$key' ($type) is not an array." ); } $this->cache[$key][$field] = $value; @@ -194,11 +206,18 @@ class MapCacheLRU implements IExpiringStore, Serializable { /** * @param string|int $key * @param string|int $field - * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32) + * @param float $maxAge Ignore items older than this many seconds [default: INF] * @return bool + * @since 1.32 Added $maxAge */ - public function hasField( $key, $field, $maxAge = 0.0 ) { + public function hasField( $key, $field, $maxAge = INF ) { $value = $this->get( $key ); + + if ( !is_int( $field ) && !is_string( $field ) ) { + throw new UnexpectedValueException( + __METHOD__ . ": invalid field for '$key'; must be string or integer." ); + } + if ( !is_array( $value ) || !array_key_exists( $field, $value ) ) { return false; } @@ -209,10 +228,11 @@ class MapCacheLRU implements IExpiringStore, Serializable { /** * @param string|int $key * @param string|int $field - * @param float $maxAge Ignore items older than this many seconds [optional] (since 1.32) + * @param float $maxAge Ignore items older than this many seconds [default: INF] * @return mixed Returns null if the key was not found or is older than $maxAge + * @since 1.32 Added $maxAge */ - public function getField( $key, $field, $maxAge = 0.0 ) { + public function getField( $key, $field, $maxAge = INF ) { if ( !$this->hasField( $key, $field, $maxAge ) ) { return null; } @@ -236,12 +256,13 @@ class MapCacheLRU implements IExpiringStore, Serializable { * @since 1.28 * @param string $key * @param callable $callback Callback that will produce the value - * @param float $rank Bottom fraction of the list where keys start off [Default: 1.0] - * @param float $maxAge Ignore items older than this many seconds [Default: 0.0] (since 1.32) + * @param float $rank Bottom fraction of the list where keys start off [default: 1.0] + * @param float $maxAge Ignore items older than this many seconds [default: INF] * @return mixed The cached value if found or the result of $callback otherwise + * @since 1.32 Added $maxAge */ public function getWithSetCallback( - $key, callable $callback, $rank = self::RANK_TOP, $maxAge = 0.0 + $key, callable $callback, $rank = self::RANK_TOP, $maxAge = INF ) { if ( $this->has( $key, $maxAge ) ) { $value = $this->get( $key );