]> source.dussan.org Git - nextcloud-server.git/commitdiff
Make MySQL return "number of found rows" instead of number of "affected rows".
authorAndreas Fischer <bantu@owncloud.com>
Wed, 16 Jul 2014 12:35:47 +0000 (14:35 +0200)
committerAndreas Fischer <bantu@owncloud.com>
Wed, 16 Jul 2014 12:35:47 +0000 (14:35 +0200)
lib/private/db/connectionfactory.php
tests/lib/db.php

index 8f852cf7127287f4e164f8eaee229bc54b3080e3..c132a2321cdab2ae1caaa3a5b7f15d56b9481187 100644 (file)
@@ -60,7 +60,13 @@ class ConnectionFactory {
                if (!isset($this->defaultConnectionParams[$normalizedType])) {
                        throw new \InvalidArgumentException("Unsupported type: $type");
                }
-               return $this->defaultConnectionParams[$normalizedType];
+               $result = $this->defaultConnectionParams[$normalizedType];
+               if ($normalizedType === 'mysql' && defined('\PDO::MYSQL_ATTR_FOUND_ROWS')) {
+                       $result['driverOptions'] = array(
+                               \PDO::MYSQL_ATTR_FOUND_ROWS => true,
+                       );
+               }
+               return $result;
        }
 
        /**
index 2fca67b56383bd84d28f1ed4107e9872b8d760d4..4b1a474c4efa5ab7d1d1c205b150b8c51af36e71 100644 (file)
@@ -200,4 +200,45 @@ class Test_DB extends PHPUnit_Framework_TestCase {
                }
        }
 
+       public function testUpdateAffectedRowsNoMatch() {
+               $this->insertCardData('fullname1', 'uri1');
+               // The WHERE clause does not match any rows
+               $this->assertSame(0, $this->updateCardData('fullname3', 'uri2'));
+       }
+
+       public function testUpdateAffectedRowsDifferent() {
+               $this->insertCardData('fullname1', 'uri1');
+               // The WHERE clause matches a single row and the value we are updating
+               // is different from the one already present.
+               $this->assertSame(1, $this->updateCardData('fullname1', 'uri2'));
+       }
+
+       public function testUpdateAffectedRowsSame() {
+               $this->insertCardData('fullname1', 'uri1');
+               // The WHERE clause matches a single row and the value we are updating
+               // to is the same as the one already present. MySQL reports 0 here when
+               // the PDO::MYSQL_ATTR_FOUND_ROWS flag is not specified.
+               $this->assertSame(1, $this->updateCardData('fullname1', 'uri1'));
+       }
+
+       public function testUpdateAffectedRowsMultiple() {
+               $this->insertCardData('fullname1', 'uri1');
+               $this->insertCardData('fullname2', 'uri2');
+               // The WHERE clause matches two rows. One row contains a value that
+               // needs to be updated, the other one already contains the value we are
+               // updating to. MySQL reports 1 here when the PDO::MYSQL_ATTR_FOUND_ROWS
+               // flag is not specified.
+               $query = OC_DB::prepare("UPDATE `*PREFIX*{$this->table2}` SET `uri` = ?");
+               $this->assertSame(2, $query->execute(array('uri1')));
+       }
+
+       protected function insertCardData($fullname, $uri) {
+               $query = OC_DB::prepare("INSERT INTO `*PREFIX*{$this->table2}` (`fullname`, `uri`, `carddata`) VALUES (?, ?, ?)");
+               $this->assertSame(1, $query->execute(array($fullname, $uri, uniqid())));
+       }
+
+       protected function updateCardData($fullname, $uri) {
+               $query = OC_DB::prepare("UPDATE `*PREFIX*{$this->table2}` SET `uri` = ? WHERE `fullname` = ?");
+               return $query->execute(array($uri, $fullname));
+       }
 }