src/flow/util/ICDataCacheWrapper.php (49 lines of code) (raw):
<?php
final class ICDataCacheWrapper extends PhutilKeyValueCacheProxy {
private $hashFunction = 'crc32b';
private $serializeCallback = 'serialize';
private $unserializeCallback = 'unserialize';
public function setHashFunction($function) {
$this->hashFunction = $function;
return $this;
}
public function setSerializeCallback($serialize) {
$this->serializeCallback = $serialize;
return $this;
}
public function setUnserializeCallback($unserialize) {
$this->unserializeCallback = $unserialize;
return $this;
}
private function getShortKey($key) {
return hash($this->hashFunction, $key);
}
private function getShortKeyMap(array $keys) {
$map = array();
foreach ($keys as $key) {
$map[$this->getShortKey($key)] = $key;
}
return $map;
}
public function getKeys(array $keys) {
$map = $this->getShortKeyMap($keys);
$values = array();
foreach ($this->getProxy()->getKeys(array_keys($map)) as $key => $value) {
$values[$map[$key]] = call_user_func($this->unserializeCallback, $value);
}
return $values;
}
public function setKeys(array $keys, $ttl = null) {
$values = array();
foreach ($keys as $key => $value) {
$values[$this->getShortKey($key)] = call_user_func(
$this->serializeCallback,
$value);
}
$this->getProxy()->setKeys($values, $ttl);
}
public function deleteKeys(array $keys) {
return $this->getProxy()->deleteKeys(
array_keys($this->getShortKeyMap($keys)));
}
}