]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Memcached_DataObject.php
Merge remote-tracking branch 'upstream/master' into social-master
[quix0rs-gnu-social.git] / classes / Memcached_DataObject.php
index 445b29e77c053a5e6c35f25c4be9de22ea09669d..b5057ba22043463f5c06dae96879564b1f69cb8c 100644 (file)
@@ -34,7 +34,7 @@ class Memcached_DataObject extends Safe_DataObject
     {
         if (is_null($v)) {
             $v = $k;
-            $keys = self::pkeyCols($cls);
+            $keys = static::pkeyCols();
             if (count($keys) > 1) {
                 // FIXME: maybe call pkeyGetClass() ourselves?
                 throw new Exception('Use pkeyGetClass() for compound primary keys');
@@ -67,27 +67,35 @@ class Memcached_DataObject extends Safe_DataObject
      * @param string  $cls       Class to fetch
      * @param string  $keyCol    name of column for key
      * @param array   $keyVals   key values to fetch
-     * @param boolean $skipNulls return only non-null results?
      *
      * @return array Array of objects, in order
      */
-    static function multiGetClass($cls, $keyCol, array $keyVals, $skipNulls=true)
+    static function multiGetClass($cls, $keyCol, array $keyVals)
     {
-        $result = self::pivotGetClass($cls, $keyCol, $keyVals);
+        $obj = new $cls;
 
-        $values = array_values($result);
+        // PHP compatible datatype for settype() below
+        $colType = $obj->columnType($keyCol);
 
-        if ($skipNulls) {
-            $tmp = array();
-            foreach ($values as $value) {
-                if (!empty($value)) {
-                    $tmp[] = $value;
-                }
-            }
-            $values = $tmp;
+        if (!in_array($colType, array('integer', 'int'))) {
+            // This is because I'm afraid to escape strings incorrectly
+            // in the way we use them below in FIND_IN_SET for MariaDB
+            throw new ServerException('Cannot do multiGet on anything but integer columns');
+        }
+
+        $obj->whereAddIn($keyCol, $keyVals, $colType);
+
+        // Since we're inputting straight to a query: format and escape
+        foreach ($keyVals as $key=>$val) {
+            settype($val, $colType);
+            $keyVals[$key] = $obj->escape($val);
         }
 
-        return new ArrayWrapper($values);
+        // FIND_IN_SET will make sure we keep the desired order
+        $obj->orderBy(sprintf("FIND_IN_SET(%s, '%s')", $keyCol, implode(',', $keyVals)));
+        $obj->find();
+
+        return $obj;
     }
 
     /**
@@ -238,7 +246,7 @@ class Memcached_DataObject extends Safe_DataObject
         return $query;
     }
 
-    static function pkeyCols($cls)
+    static function pkeyColsClass($cls)
     {
         $i = new $cls;
         $types = $i->keyTypes();
@@ -271,7 +279,7 @@ class Memcached_DataObject extends Safe_DataObject
         $pkeyMap = array_fill_keys($keyVals, array());
         $result = array_fill_keys($keyVals, array());
 
-        $pkeyCols = self::pkeyCols($cls);
+        $pkeyCols = static::pkeyCols();
 
         $toFetch = array();
         $allPkeys = array();
@@ -453,11 +461,11 @@ class Memcached_DataObject extends Safe_DataObject
         }
 
         global $_DB_DATAOBJECT;
-        if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
+        if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->tableName()."__keys"])) {
             $this->databaseStructure();
 
         }
-        return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
+        return $_DB_DATAOBJECT['INI'][$this->_database][$this->tableName()."__keys"];
     }
 
     function encache()
@@ -642,7 +650,7 @@ class Memcached_DataObject extends Safe_DataObject
             } else {
                 $msg = sprintf("DB query (%0.3fs): %s", $delta, $clean);
             }
-            common_log(LOG_DEBUG, $msg);
+            common_debug($msg);
         }
 
         if ($fail) {
@@ -726,7 +734,7 @@ class Memcached_DataObject extends Safe_DataObject
         return $string;
     }
 
-    // We overload so that 'SET NAMES "utf8"' is called for
+    // We overload so that 'SET NAMES "utf8mb4"' is called for
     // each connection
 
     function _connect()
@@ -776,9 +784,9 @@ class Memcached_DataObject extends Safe_DataObject
                 $conn = $DB->connection;
                 if (!empty($conn)) {
                     if ($DB instanceof DB_mysqli || $DB instanceof MDB2_Driver_mysqli) {
-                        mysqli_set_charset($conn, 'utf8');
+                        mysqli_set_charset($conn, 'utf8mb4');
                     } else if ($DB instanceof DB_mysql || $DB instanceof MDB2_Driver_mysql) {
-                        mysql_set_charset('utf8', $conn);
+                        mysql_set_charset('utf8mb4', $conn);
                     }
                 }
             }
@@ -816,7 +824,7 @@ class Memcached_DataObject extends Safe_DataObject
         global $_DB_DATAOBJECT;
 
         if (empty($_DB_DATAOBJECT['CONFIG'])) {
-            DB_DataObject::_loadConfig();
+            self::_loadConfig();
         }
 
         $options = &$_DB_DATAOBJECT['CONFIG'];
@@ -828,7 +836,7 @@ class Memcached_DataObject extends Safe_DataObject
         if (!$dsn) {
 
             if (!$this->_database) {
-                $this->_database = isset($options["table_{$this->__table}"]) ? $options["table_{$this->__table}"] : null;
+                $this->_database = isset($options["table_{$this->tableName()}"]) ? $options["table_{$this->tableName()}"] : null;
             }
 
             if ($this->_database && !empty($options["database_{$this->_database}"]))  {