return INF;
}
+ /**
+ * @param int $field
+ * @param int $flags
+ * @return bool
+ * @since 1.34
+ */
+ final protected function fieldHasFlags( $field, $flags ) {
+ return ( ( $field & $flags ) === $flags );
+ }
+
/**
* Merge the flag maps of one or more BagOStuff objects into a "lowest common denominator" map
*
public function set( $key, $value, $exptime = 0, $flags = 0 ) {
$this->procCache->set( $key, $value, $exptime, $flags );
- if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+ if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
$this->backend->set( $key, $value, $exptime, $flags );
}
public function delete( $key, $flags = 0 ) {
$this->procCache->delete( $key, $flags );
- if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+ if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
$this->backend->delete( $key, $flags );
}
public function setMulti( array $data, $exptime = 0, $flags = 0 ) {
$this->procCache->setMulti( $data, $exptime, $flags );
- if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+
+ if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
return $this->backend->setMulti( $data, $exptime, $flags );
}
public function deleteMulti( array $keys, $flags = 0 ) {
$this->procCache->deleteMulti( $keys, $flags );
- if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+
+ if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
return $this->backend->deleteMulti( $keys, $flags );
}
public function changeTTLMulti( array $keys, $exptime, $flags = 0 ) {
$this->procCache->changeTTLMulti( $keys, $exptime, $flags );
- if ( ( $flags & self::WRITE_CACHE_ONLY ) != self::WRITE_CACHE_ONLY ) {
+
+ if ( !$this->fieldHasFlags( $flags, self::WRITE_CACHE_ONLY ) ) {
return $this->backend->changeTTLMulti( $keys, $exptime, $flags );
}
* @return bool True if the item was deleted or not found, false on failure
*/
public function delete( $key, $flags = 0 ) {
- if ( ( $flags & self::WRITE_PRUNE_SEGMENTS ) != self::WRITE_PRUNE_SEGMENTS ) {
+ if ( !$this->fieldHasFlags( $flags, self::WRITE_PRUNE_SEGMENTS ) ) {
return $this->doDelete( $key, $flags );
}
* @since 1.24
*/
public function setMulti( array $data, $exptime = 0, $flags = 0 ) {
- if ( ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS ) {
+ if ( $this->fieldHasFlags( $flags, self::WRITE_ALLOW_SEGMENTS ) ) {
throw new InvalidArgumentException( __METHOD__ . ' got WRITE_ALLOW_SEGMENTS' );
}
+
return $this->doSetMulti( $data, $exptime, $flags );
}
foreach ( $data as $key => $value ) {
$res = $this->doSet( $key, $value, $exptime, $flags ) && $res;
}
+
return $res;
}
* @since 1.33
*/
public function deleteMulti( array $keys, $flags = 0 ) {
- if ( ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS ) {
- throw new InvalidArgumentException( __METHOD__ . ' got WRITE_ALLOW_SEGMENTS' );
+ if ( $this->fieldHasFlags( $flags, self::WRITE_PRUNE_SEGMENTS ) ) {
+ throw new InvalidArgumentException( __METHOD__ . ' got WRITE_PRUNE_SEGMENTS' );
}
+
return $this->doDeleteMulti( $keys, $flags );
}
$usable = true;
if (
- ( $flags & self::WRITE_ALLOW_SEGMENTS ) === self::WRITE_ALLOW_SEGMENTS &&
+ $this->fieldHasFlags( $flags, self::WRITE_ALLOW_SEGMENTS ) &&
!is_int( $value ) && // avoid breaking incr()/decr()
is_finite( $this->segmentationSize )
) {
// The PECL implementation is a naïve for-loop so use async I/O to pipeline;
// https://github.com/php-memcached-dev/php-memcached/blob/master/php_memcached.c#L1852
- if ( ( $flags & self::WRITE_BACKGROUND ) == self::WRITE_BACKGROUND ) {
+ if ( $this->fieldHasFlags( $flags, self::WRITE_BACKGROUND ) ) {
$client = $this->acquireAsyncClient();
$result = $client->setMulti( $data, $exptime );
$this->releaseAsyncClient( $client );
// The PECL implementation is a naïve for-loop so use async I/O to pipeline;
// https://github.com/php-memcached-dev/php-memcached/blob/7443d16d02fb73cdba2e90ae282446f80969229c/php_memcached.c#L1852
- if ( ( $flags & self::WRITE_BACKGROUND ) == self::WRITE_BACKGROUND ) {
+ if ( $this->fieldHasFlags( $flags, self::WRITE_BACKGROUND ) ) {
$client = $this->acquireAsyncClient();
$resultArray = $client->deleteMulti( $keys ) ?: [];
$this->releaseAsyncClient( $client );
}
public function get( $key, $flags = 0 ) {
- if ( ( $flags & self::READ_LATEST ) == self::READ_LATEST ) {
+ if ( $this->fieldHasFlags( $flags, self::READ_LATEST ) ) {
// If the latest write was a delete(), we do NOT want to fallback
// to the other tiers and possibly see the old value. Also, this
// is used by merge(), which only needs to hit the primary.
if ( $value !== false
&& $missIndexes
- && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
+ && $this->fieldHasFlags( $flags, self::READ_VERIFIED )
) {
// Backfill the value to the higher (and often faster/smaller) cache tiers
$this->doWrite(
* @return bool
*/
protected function usesAsyncWritesGivenFlags( $flags ) {
- return ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) ? false : $this->asyncWrites;
+ return $this->fieldHasFlags( $flags, self::WRITE_SYNC ) ? false : $this->asyncWrites;
}
public function makeKeyInternal( $keyspace, $args ) {
}
public function get( $key, $flags = 0 ) {
- return ( ( $flags & self::READ_LATEST ) == self::READ_LATEST )
+ return $this->fieldHasFlags( $flags, self::READ_LATEST )
? $this->writeStore->get( $key, $flags )
: $this->readStore->get( $key, $flags );
}
}
public function getMulti( array $keys, $flags = 0 ) {
- return ( ( $flags & self::READ_LATEST ) == self::READ_LATEST )
+ return $this->fieldHasFlags( $flags, self::READ_LATEST )
? $this->writeStore->getMulti( $keys, $flags )
: $this->readStore->getMulti( $keys, $flags );
}
}
}
- if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+ if ( $this->fieldHasFlags( $flags, self::WRITE_SYNC ) ) {
$result = $this->waitForReplication() && $result;
}
public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
$ok = $this->mergeViaCas( $key, $callback, $exptime, $attempts, $flags );
- if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+ if ( $this->fieldHasFlags( $flags, self::WRITE_SYNC ) ) {
$ok = $this->waitForReplication() && $ok;
}