X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Flibs%2Fobjectcache%2FWinCacheBagOStuff.php;h=cae0280128b80d8f965a2ee55f1cfc79e8f4c963;hb=4d1478c76fc650787ee9d7fb12c7ee62a707e907;hp=98f44d11b5cef30a9e24a4d3ead79d04cfefb197;hpb=c584722cc2e3d33edae58d46c2149063b3fc6d72;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/libs/objectcache/WinCacheBagOStuff.php b/includes/libs/objectcache/WinCacheBagOStuff.php index 98f44d11b5..cae0280128 100644 --- a/includes/libs/objectcache/WinCacheBagOStuff.php +++ b/includes/libs/objectcache/WinCacheBagOStuff.php @@ -40,12 +40,16 @@ class WinCacheBagOStuff extends BagOStuff { public function set( $key, $value, $expire = 0, $flags = 0 ) { $result = wincache_ucache_set( $key, serialize( $value ), $expire ); - /* wincache_ucache_set returns an empty array on success if $value - * was an array, bool otherwise */ - return ( is_array( $result ) && $result === [] ) || $result; + return ( $result === [] || $result === true ); } - public function delete( $key ) { + public function add( $key, $value, $exptime = 0, $flags = 0 ) { + $result = wincache_ucache_add( $key, serialize( $value ), $exptime ); + + return ( $result === [] || $result === true ); + } + + public function delete( $key, $flags = 0 ) { wincache_ucache_delete( $key ); return true; @@ -61,4 +65,63 @@ class WinCacheBagOStuff extends BagOStuff { return $ok; } + + /** + * Construct a cache key. + * + * @since 1.27 + * @param string $keyspace + * @param array $args + * @return string + */ + public function makeKeyInternal( $keyspace, $args ) { + // WinCache keys have a maximum length of 150 characters. From that, + // subtract the number of characters we need for the keyspace and for + // the separator character needed for each argument. To handle some + // custom prefixes used by thing like WANObjectCache, limit to 125. + // NOTE: Same as in memcached, except the max key length there is 255. + $charsLeft = 125 - strlen( $keyspace ) - count( $args ); + + $args = array_map( + function ( $arg ) use ( &$charsLeft ) { + // 33 = 32 characters for the MD5 + 1 for the '#' prefix. + if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) { + $arg = '#' . md5( $arg ); + } + + $charsLeft -= strlen( $arg ); + return $arg; + }, + $args + ); + + if ( $charsLeft < 0 ) { + return $keyspace . ':BagOStuff-long-key:##' . md5( implode( ':', $args ) ); + } + + return $keyspace . ':' . implode( ':', $args ); + } + + /** + * Increase stored value of $key by $value while preserving its original TTL + * @param string $key Key to increase + * @param int $value Value to add to $key (Default 1) + * @return int|bool New value or false on failure + */ + public function incr( $key, $value = 1 ) { + if ( !$this->lock( $key ) ) { + return false; + } + $n = $this->get( $key ); + if ( $this->isInteger( $n ) ) { // key exists? + $n += intval( $value ); + $oldTTL = wincache_ucache_info( false, $key )["ucache_entries"][1]["ttl_seconds"]; + $this->set( $key, max( 0, $n ), $oldTTL ); + } else { + $n = false; + } + $this->unlock( $key ); + + return $n; + } }