]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/cache.php
Fix for PG filtering
[quix0rs-gnu-social.git] / lib / cache.php
index 63f582861984f8cf5380b4b0948fef679a3facbb..3d78c79adb2ba5f34003c3f69c60ce893a3b3d3f 100644 (file)
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
  * @link      http://status.net/
  */
-
 class Cache
 {
     var $_items   = array();
     static $_inst = null;
 
+    const COMPRESSED = 1;
+
     /**
      * Singleton constructor
      *
@@ -54,7 +55,6 @@ class Cache
      *
      * @return Cache cache object
      */
-
     static function instance()
     {
         if (is_null(self::$_inst)) {
@@ -75,13 +75,12 @@ class Cache
      *
      * @return string full key
      */
-
     static function key($extra)
     {
-        $base_key = common_config('memcached', 'base');
+        $base_key = common_config('cache', 'base');
 
         if (empty($base_key)) {
-            $base_key = common_keyize(common_config('site', 'name'));
+            $base_key = self::keyize(common_config('site', 'name'));
         }
 
         return 'statusnet:' . $base_key . ':' . $extra;
@@ -96,7 +95,6 @@ class Cache
      *
      * @return string keyized string
      */
-
     static function keyize($str)
     {
         $str = strtolower($str);
@@ -113,17 +111,13 @@ class Cache
      *
      * @return string retrieved value or null if unfound
      */
-
     function get($key)
     {
-        $value = null;
+        $value = false;
 
         if (Event::handle('StartCacheGet', array(&$key, &$value))) {
             if (array_key_exists($key, $this->_items)) {
-                common_log(LOG_INFO, 'Cache HIT for key ' . $key);
-                $value = $this->_items[$key];
-            } else {
-                common_log(LOG_INFO, 'Cache MISS for key ' . $key);
+                $value = unserialize($this->_items[$key]);
             }
             Event::handle('EndCacheGet', array($key, &$value));
         }
@@ -136,21 +130,19 @@ class Cache
      *
      * @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
      */
-
     function set($key, $value, $flag=null, $expiry=null)
     {
         $success = false;
 
         if (Event::handle('StartCacheSet', array(&$key, &$value, &$flag,
                                                  &$expiry, &$success))) {
-            common_log(LOG_INFO, 'Setting cache value for key ' . $key);
 
-            $this->_items[$key] = $value;
+            $this->_items[$key] = serialize($value);
 
             $success = true;
 
@@ -161,6 +153,32 @@ class Cache
         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
      *
@@ -168,14 +186,12 @@ class Cache
      *
      * @return boolean success flag
      */
-
     function delete($key)
     {
         $success = false;
 
         if (Event::handle('StartCacheDelete', array(&$key, &$success))) {
-            if (array_key_exists($key, $this->_items[$key])) {
-                common_log(LOG_INFO, 'Deleting cache value for key ' . $key);
+            if (array_key_exists($key, $this->_items)) {
                 unset($this->_items[$key]);
             }
             $success = true;
@@ -184,4 +200,22 @@ class Cache
 
         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;
+    }
 }