]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Memcached_DataObject.php
Merge branch '0.8.x' into userdesign
[quix0rs-gnu-social.git] / classes / Memcached_DataObject.php
index 1d12730c9e86a8c23a6da561d6f92a82e71ac5de..33ac70dd045643a5a57ff87e58d383a0bc52bd2b 100644 (file)
@@ -21,9 +21,10 @@ if (!defined('LACONICA')) { exit(1); }
 
 require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 
-class Memcached_DataObject extends DB_DataObject 
+class Memcached_DataObject extends DB_DataObject
 {
-    function &staticGet($cls, $k, $v=null) {
+    function &staticGet($cls, $k, $v=null)
+    {
         if (is_null($v)) {
             $v = $k;
             # XXX: HACK!
@@ -44,7 +45,8 @@ class Memcached_DataObject extends DB_DataObject
         }
     }
 
-    function &pkeyGet($cls, $kv) {
+    function &pkeyGet($cls, $kv)
+    {
         $i = Memcached_DataObject::multicache($cls, $kv);
         if ($i) {
             return $i;
@@ -62,12 +64,14 @@ class Memcached_DataObject extends DB_DataObject
         }
     }
 
-    function insert() {
+    function insert()
+    {
         $result = parent::insert();
         return $result;
     }
-    
-    function update($orig=null) {
+
+    function update($orig=null)
+    {
         if (is_object($orig) && $orig instanceof Memcached_DataObject) {
             $orig->decache(); # might be different keys
         }
@@ -77,20 +81,21 @@ class Memcached_DataObject extends DB_DataObject
         }
         return $result;
     }
-    
-    function delete() {
+
+    function delete()
+    {
         $this->decache(); # while we still have the values!
         return parent::delete();
     }
-    
+
     static function memcache() {
         return common_memcache();
     }
-    
+
     static function cacheKey($cls, $k, $v) {
         return common_cache_key(strtolower($cls).':'.$k.':'.$v);
     }
-    
+
     static function getcached($cls, $k, $v) {
         $c = Memcached_DataObject::memcache();
         if (!$c) {
@@ -100,7 +105,8 @@ class Memcached_DataObject extends DB_DataObject
         }
     }
 
-    function keyTypes() {
+    function keyTypes()
+    {
         global $_DB_DATAOBJECT;
         if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
             $this->databaseStructure();
@@ -108,14 +114,15 @@ class Memcached_DataObject extends DB_DataObject
         }
         return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
     }
-    
-    function encache() {
+
+    function encache()
+    {
         $c = $this->memcache();
         if (!$c) {
             return false;
         } else {
             $pkey = array();
-            $pval = array();            
+            $pval = array();
             $types = $this->keyTypes();
             ksort($types);
             foreach ($types as $key => $type) {
@@ -132,14 +139,15 @@ class Memcached_DataObject extends DB_DataObject
             $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
         }
     }
-    
-    function decache() {
+
+    function decache()
+    {
         $c = $this->memcache();
         if (!$c) {
             return false;
         } else {
             $pkey = array();
-            $pval = array();            
+            $pval = array();
             $types = $this->keyTypes();
             ksort($types);
             foreach ($types as $key => $type) {
@@ -158,7 +166,8 @@ class Memcached_DataObject extends DB_DataObject
         }
     }
 
-    function multicache($cls, $kv) {
+    function multicache($cls, $kv)
+    {
         ksort($kv);
         $c = Memcached_DataObject::memcache();
         if (!$c) {
@@ -170,7 +179,8 @@ class Memcached_DataObject extends DB_DataObject
         }
     }
 
-    function getSearchEngine($table) {
+    function getSearchEngine($table)
+    {
         require_once INSTALLDIR.'/lib/search_engines.php';
         static $search_engine;
         if (!isset($search_engine)) {
@@ -191,4 +201,54 @@ class Memcached_DataObject extends DB_DataObject
         }
         return $search_engine;
     }
+
+    static function cachedQuery($cls, $qry, $expiry=3600)
+    {
+        $c = Memcached_DataObject::memcache();
+        if (!$c) {
+            $inst = new $cls();
+            $inst->query($qry);
+            return $inst;
+        }
+        $key_part = common_keyize($cls).':'.md5($qry);
+        $ckey = common_cache_key($key_part);
+        $stored = $c->get($ckey);
+        if ($stored) {
+            return new ArrayWrapper($stored);
+        }
+
+        $inst = new $cls();
+        $inst->query($qry);
+        $cached = array();
+        while ($inst->fetch()) {
+            $cached[] = clone($inst);
+        }
+        $inst->free();
+        $c->set($ckey, $cached, MEMCACHE_COMPRESSED, $expiry);
+        return new ArrayWrapper($cached);
+    }
+
+    // We overload so that 'SET NAMES "utf8"' is called for
+    // each connection
+
+    function _connect()
+    {
+        global $_DB_DATAOBJECT;
+        $exists = !empty($this->_database_dsn_md5) &&
+          isset($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]);
+        $result = parent::_connect();
+        if (!$exists) {
+            $DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5];
+            if (common_config('db', 'type') == 'mysql' &&
+                common_config('db', 'utf8')) {
+                $conn = $DB->connection;
+                if ($DB instanceof DB_mysqli) {
+                    mysqli_set_charset($conn, 'utf8');
+                } else if ($DB instanceof DB_mysql) {
+                    mysql_set_charset('utf8', $conn);
+                }
+            }
+        }
+        return $result;
+    }
 }