var $_items = array();
static $_inst = null;
+ const COMPRESSED = 1;
+
/**
* Singleton constructor
*
if (Event::handle('StartCacheGet', array(&$key, &$value))) {
if (array_key_exists($key, $this->_items)) {
- $value = $this->_items[$key];
+ $value = unserialize($this->_items[$key]);
}
Event::handle('EndCacheGet', array($key, &$value));
}
*
* @param string $key The key to use for lookups
* @param string $value The value to store
- * @param integer $flag Flags to use, mostly ignored
+ * @param integer $flag Flags to use, may include Cache::COMPRESSED
* @param integer $expiry Expiry value, mostly ignored
*
* @return boolean success flag
if (Event::handle('StartCacheSet', array(&$key, &$value, &$flag,
&$expiry, &$success))) {
- $this->_items[$key] = $value;
+ $this->_items[$key] = serialize($value);
$success = true;
return $success;
}
+ /**
+ * Atomically increment an existing numeric value.
+ * Existing expiration time should remain unchanged, if any.
+ *
+ * @param string $key The key to use for lookups
+ * @param int $step Amount to increment (default 1)
+ *
+ * @return mixed incremented value, or false if not set.
+ */
+ function increment($key, $step=1)
+ {
+ $value = false;
+ if (Event::handle('StartCacheIncrement', array(&$key, &$step, &$value))) {
+ // Fallback is not guaranteed to be atomic,
+ // and may original expiry value.
+ $value = $this->get($key);
+ if ($value !== false) {
+ $value += $step;
+ $ok = $this->set($key, $value);
+ $got = $this->get($key);
+ }
+ Event::handle('EndCacheIncrement', array($key, $step, $value));
+ }
+ return $value;
+ }
+
/**
* Delete the value associated with a key
*
$success = false;
if (Event::handle('StartCacheDelete', array(&$key, &$success))) {
- if (array_key_exists($key, $this->_items[$key])) {
+ if (array_key_exists($key, $this->_items)) {
unset($this->_items[$key]);
}
$success = true;
return $success;
}
+
+ /**
+ * Close or reconnect any remote connections, such as to give
+ * daemon processes a chance to reconnect on a fresh socket.
+ *
+ * @return boolean success flag
+ */
+
+ function reconnect()
+ {
+ $success = false;
+
+ if (Event::handle('StartCacheReconnect', array(&$success))) {
+ $success = true;
+ Event::handle('EndCacheReconnect', array());
+ }
+
+ return $success;
+ }
}