summaryrefslogtreecommitdiff
path: root/lib/cache.php
diff options
context:
space:
mode:
authorBrion Vibber <brion@pobox.com>2010-02-16 09:25:09 -0800
committerBrion Vibber <brion@pobox.com>2010-02-16 09:25:09 -0800
commitd5cbfe8071d56438cfa168dc3db56a959317eae0 (patch)
treec00ca6c3e0d1bd2fb9b05a515c337b6afce3a070 /lib/cache.php
parentd4f6235d7b8a40bd1b51370e7eb405cdb14e61fb (diff)
parent81b6b58e33f55054b7e5dd546f06dbdb5696ed92 (diff)
Merge branch 'testing' into 0.9.x
Conflicts: lib/iomaster.php
Diffstat (limited to 'lib/cache.php')
-rw-r--r--lib/cache.php26
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/cache.php b/lib/cache.php
index df6fc3649..c09a1dd9f 100644
--- a/lib/cache.php
+++ b/lib/cache.php
@@ -160,6 +160,32 @@ class Cache
}
/**
+ * 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
*
* @param string $key Key to delete