From: Mikael Nordfeldth <mmn@hethane.se>
Date: Sun, 1 Jun 2014 22:13:54 +0000 (+0200)
Subject: ArrayWrapper no longer returned from multiGetClass
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=49188e826cb069146c7a7e4dc7ea969e2b01d32a;p=quix0rs-gnu-social.git

ArrayWrapper no longer returned from multiGetClass

multiGetClass uses FIND_IN_SET for ordering, which is pretty MariaDB specific.
---

diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php
index 445b29e77c..2bd9581cf6 100644
--- a/classes/Memcached_DataObject.php
+++ b/classes/Memcached_DataObject.php
@@ -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, for settype(), datatype
+        $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;
     }
 
     /**