/** * {@inheritdoc} */ public function decrement($key, $amount = 1, $options = array()) { if (!$this->online()) { return Gdn_Cache::CACHEOP_FAILURE; } $finalOptions = array_merge($this->StoreDefaults, $options); $initial = val(Gdn_Cache::FEATURE_INITIAL, $finalOptions, null); $expiry = val(Gdn_Cache::FEATURE_EXPIRY, $finalOptions, null); $requireBinary = $initial || $expiry; $initial = !is_null($initial) ? $initial : 0; $expiry = !is_null($expiry) ? $expiry : 0; $tryBinary = $this->option(Memcached::OPT_BINARY_PROTOCOL, false) & $requireBinary; $realKey = $this->makeKey($key, $finalOptions); switch ($tryBinary) { case false: $decremented = $this->memcache->decrement($realKey, $amount); if (is_null($decremented) && $initial) { $decremented = $this->memcache->set($realKey, $initial); if ($decremented) { $decremented = $initial; } } break; case true: $decremented = $this->memcache->decrement($realKey, $amount, $initial, $expiry); break; } // Check if things went ok $ok = $this->lastAction($realKey); if (!$ok) { return Gdn_Cache::CACHEOP_FAILURE; } if ($decremented !== false) { Gdn_Cache::localSet($realKey, $decremented); return $decremented; } return Gdn_Cache::CACHEOP_FAILURE; }