]> source.dussan.org Git - nextcloud-server.git/commitdiff
If the execute method on the mapper receives an assoc array, it binds by value instea...
authorBernhard Posselt <dev@bernhard-posselt.com>
Thu, 19 Mar 2015 13:55:21 +0000 (14:55 +0100)
committerBernhard Posselt <dev@bernhard-posselt.com>
Thu, 19 Mar 2015 16:08:46 +0000 (17:08 +0100)
lib/public/appframework/db/mapper.php
tests/lib/appframework/db/mappertest.php
tests/lib/appframework/db/mappertestutility.php

index aaef0f79d2723b04be9dfede8d4c5e89c38dc6cd..9a5d6e819b93c37db910ac7243b86549f9467b4e 100644 (file)
@@ -184,6 +184,31 @@ abstract class Mapper {
                return $entity;
        }
 
+       /**
+        * Checks if an array is associative
+        * @param array $array
+        * @return bool true if associative
+        */
+       private function isAssocArray(array $array) {
+               return array_values($array) !== $array;
+       }
+
+       /**
+        * Returns the correct PDO constant based on the value type
+        * @param $value
+        * @return PDO constant
+        */
+       private function getPDOType($value) {
+               switch (gettype($value)) {
+                       case 'integer':
+                               return \PDO::PARAM_INT;
+                       case 'boolean':
+                               return \PDO::PARAM_BOOL;
+                       default:
+                               return \PDO::PARAM_STR;
+               }
+       }
+
 
        /**
         * Runs an sql query
@@ -200,26 +225,18 @@ abstract class Mapper {
                        $query = $this->db->prepare($sql, $limit, $offset);
                }
 
-               $index = 1;  // bindParam is 1 indexed
-               foreach($params as $param) {
-
-                       switch (gettype($param)) {
-                               case 'integer':
-                                       $pdoConstant = \PDO::PARAM_INT;
-                                       break;
-
-                               case 'boolean':
-                                       $pdoConstant = \PDO::PARAM_BOOL;
-                                       break;
-
-                               default:
-                                       $pdoConstant = \PDO::PARAM_STR;
-                                       break;
+               if ($this->isAssocArray($params)) {
+                       foreach ($params as $key => $param) {
+                               $pdoConstant = $this->getPDOType($param);
+                               $query->bindValue($key, $param, $pdoConstant);
+                       }
+               } else {
+                       $index = 1;  // bindParam is 1 indexed
+                       foreach ($params as $param) {
+                               $pdoConstant = $this->getPDOType($param);
+                               $query->bindValue($index, $param, $pdoConstant);
+                               $index++;
                        }
-
-                       $query->bindValue($index, $param, $pdoConstant);
-
-                       $index++;
                }
 
                $result = $query->execute();
index 8e585c479bb38ef56c46066b72ce6b72cd730d1e..c8b999ad62cc0943325cf4d4cd92c97643f5b704 100644 (file)
@@ -47,6 +47,7 @@ class ExampleMapper extends Mapper {
        public function findOneEntity($table, $id){ return $this->findEntity($table, $id); }
        public function findAllEntities($table){ return $this->findEntities($table); }
        public function mapRow($row){ return $this->mapRowToEntity($row); }
+       public function execSql($sql, $params){ return $this->execute($sql, $params); }
 }
 
 
@@ -187,6 +188,15 @@ class MapperTest extends MapperTestUtility {
        }
 
 
+       public function testAssocParameters() {
+               $sql = 'test';
+               $params = [':test' => 1, ':a' => 2];
+
+               $this->setMapperResult($sql, $params);
+               $this->mapper->execSql($sql, $params);
+       }
+
+
        public function testUpdate(){
                $sql = 'UPDATE `*PREFIX*table` ' .
                                'SET ' .
index c87ad528c038f952757694f2aab752a1b4df1867..818e4a59b212cb45cdfe6c7f6913f832a817b526 100644 (file)
@@ -56,7 +56,30 @@ abstract class MapperTestUtility extends \Test\TestCase {
                $this->fetchAt = 0;
        }
 
+       /**
+        * Checks if an array is associative
+        * @param array $array
+        * @return bool true if associative
+        */
+       private function isAssocArray(array $array) {
+               return array_values($array) !== $array;
+       }
 
+       /**
+        * Returns the correct PDO constant based on the value type
+        * @param $value
+        * @return PDO constant
+        */
+       private function getPDOType($value) {
+               switch (gettype($value)) {
+                       case 'integer':
+                               return \PDO::PARAM_INT;
+                       case 'boolean':
+                               return \PDO::PARAM_BOOL;
+                       default:
+                               return \PDO::PARAM_STR;
+               }
+       }
 
        /**
         * Create mocks and set expected results for database queries
@@ -117,32 +140,28 @@ abstract class MapperTestUtility extends \Test\TestCase {
                                }
                        ));
 
-               $index = 1;
-               foreach($arguments as $argument) {
-                       switch (gettype($argument)) {
-                               case 'integer':
-                                       $pdoConstant = \PDO::PARAM_INT;
-                                       break;
-
-                               case 'NULL':
-                                       $pdoConstant = \PDO::PARAM_NULL;
-                                       break;
-
-                               case 'boolean':
-                                       $pdoConstant = \PDO::PARAM_BOOL;
-                                       break;
-
-                               default:
-                                       $pdoConstant = \PDO::PARAM_STR;
-                                       break;
+               if ($this->isAssocArray($arguments)) {
+                       foreach($arguments as $key => $argument) {
+                               $pdoConstant = $this->getPDOType($argument);
+                               $this->query->expects($this->at($this->queryAt))
+                                       ->method('bindValue')
+                                       ->with($this->equalTo($key),
+                                               $this->equalTo($argument),
+                                               $this->equalTo($pdoConstant));
+                               $this->queryAt++;
+                       }
+               } else {
+                       $index = 1;
+                       foreach($arguments as $argument) {
+                               $pdoConstant = $this->getPDOType($argument);
+                               $this->query->expects($this->at($this->queryAt))
+                                       ->method('bindValue')
+                                       ->with($this->equalTo($index),
+                                               $this->equalTo($argument),
+                                               $this->equalTo($pdoConstant));
+                               $index++;
+                               $this->queryAt++;
                        }
-                       $this->query->expects($this->at($this->queryAt))
-                               ->method('bindValue')
-                               ->with($this->equalTo($index),
-                                       $this->equalTo($argument),
-                                       $this->equalTo($pdoConstant));
-                       $index++;
-                       $this->queryAt++;
                }
 
                $this->query->expects($this->at($this->queryAt))