MDL-46151 cachestore_memcache: now checks extension version for support
This commit is contained in:
Vendored
+37
-1
@@ -87,6 +87,12 @@ class cachestore_memcache extends cache_store implements cache_is_configurable {
|
||||
*/
|
||||
protected $definition;
|
||||
|
||||
/**
|
||||
* If true data going in and out will be encoded.
|
||||
* @var bool
|
||||
*/
|
||||
protected $encode = true;
|
||||
|
||||
/**
|
||||
* Default prefix for key names.
|
||||
* @var string
|
||||
@@ -150,6 +156,24 @@ class cachestore_memcache extends cache_store implements cache_is_configurable {
|
||||
}
|
||||
$this->definition = $definition;
|
||||
$this->isinitialised = true;
|
||||
$this->encode = self::require_encoding();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if encoding is going to be required.
|
||||
*
|
||||
* Prior to memcache 3.0.3 scalar data types were not preserved.
|
||||
* For earlier versions of the memcache extension we need to encode and decode scalar types
|
||||
* to ensure that it is preserved.
|
||||
*
|
||||
* @param string $version The version to check, if null it is fetched from PHP.
|
||||
* @return bool
|
||||
*/
|
||||
public static function require_encoding($version = null) {
|
||||
if (!$version) {
|
||||
$version = phpversion('memcache');
|
||||
}
|
||||
return (version_compare($version, '3.0.3', '<'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -240,7 +264,11 @@ class cachestore_memcache extends cache_store implements cache_is_configurable {
|
||||
* @return mixed The data that was associated with the key, or false if the key did not exist.
|
||||
*/
|
||||
public function get($key) {
|
||||
return $this->connection->get($this->parse_key($key));
|
||||
$result = $this->connection->get($this->parse_key($key));
|
||||
if ($this->encode && $result !== false) {
|
||||
return @unserialize($result);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -267,6 +295,9 @@ class cachestore_memcache extends cache_store implements cache_is_configurable {
|
||||
$return[$key] = false;
|
||||
} else {
|
||||
$return[$key] = $result[$mkey];
|
||||
if ($this->encode && $return[$key] !== false) {
|
||||
$return[$key] = @unserialize($return[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
@@ -280,6 +311,11 @@ class cachestore_memcache extends cache_store implements cache_is_configurable {
|
||||
* @return bool True if the operation was a success false otherwise.
|
||||
*/
|
||||
public function set($key, $data) {
|
||||
if ($this->encode) {
|
||||
// We must serialise this data.
|
||||
$data = serialize($data);
|
||||
}
|
||||
|
||||
return $this->connection->set($this->parse_key($key), $data, MEMCACHE_COMPRESSED, $this->definition->get_ttl());
|
||||
}
|
||||
|
||||
|
||||
+26
@@ -90,4 +90,30 @@ class cachestore_memcache_test extends cachestore_tests {
|
||||
$this->assertEquals($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test our checks for encoding.
|
||||
*/
|
||||
public function test_require_encoding() {
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('dev'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('1.0'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('1.0.0'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('2.0'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('2.0.8'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('2.2.8'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('3.0'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('3.0-dev'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('3.0.0'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('3.0.1'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('3.0.2-dev'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('3.0.2'));
|
||||
$this->assertTrue(cachestore_memcache::require_encoding('3.0.3-dev'));
|
||||
$this->assertFalse(cachestore_memcache::require_encoding('3.0.3'));
|
||||
$this->assertFalse(cachestore_memcache::require_encoding('3.0.4'));
|
||||
$this->assertFalse(cachestore_memcache::require_encoding('3.0.4-dev'));
|
||||
$this->assertFalse(cachestore_memcache::require_encoding('3.0.8'));
|
||||
$this->assertFalse(cachestore_memcache::require_encoding('3.1.0'));
|
||||
$this->assertFalse(cachestore_memcache::require_encoding('3.1.2'));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user