summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-03-15 16:03:55 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2016-03-15 16:03:55 +0100
commit27760ae54e3e28a894ebb610c859fbd3bb8682cc (patch)
tree0d0179862bbe1b67bfbc7320eaa5bd7c2b9d3421
parent7b06dd485d6c878e1e99b5482f6b481426b17745 (diff)
parent1b2f1cc2720682b253891a03c05e225cc7ca8882 (diff)
downloadnextcloud-server-27760ae54e3e28a894ebb610c859fbd3bb8682cc.tar.gz
nextcloud-server-27760ae54e3e28a894ebb610c859fbd3bb8682cc.zip
Merge pull request #23164 from owncloud/db-connection-precondition-fix
Prevent certain DBs throwing exceptions on same-value updates
-rw-r--r--lib/private/db/connection.php2
-rw-r--r--tests/lib/db/connection.php30
2 files changed, 25 insertions, 7 deletions
diff --git a/lib/private/db/connection.php b/lib/private/db/connection.php
index 584904e6370..7904fab0726 100644
--- a/lib/private/db/connection.php
+++ b/lib/private/db/connection.php
@@ -293,7 +293,7 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection {
$updateQb->where($where);
$affected = $updateQb->execute();
- if ($affected === 0) {
+ if ($affected === 0 && !empty($updatePreconditionValues)) {
throw new PreconditionNotMetException();
}
diff --git a/tests/lib/db/connection.php b/tests/lib/db/connection.php
index b10b1a322a9..62d0a77ca1f 100644
--- a/tests/lib/db/connection.php
+++ b/tests/lib/db/connection.php
@@ -47,6 +47,11 @@ class Connection extends \Test\TestCase {
$this->connection = \OC::$server->getDatabaseConnection();
}
+ public function tearDown() {
+ parent::tearDown();
+ $this->connection->dropTable('table');
+ }
+
/**
* @param string $table
*/
@@ -86,6 +91,7 @@ class Connection extends \Test\TestCase {
* @depends testTableExists
*/
public function testDropTable() {
+ $this->makeTestTable();
$this->assertTableExist('table');
$this->connection->dropTable('table');
$this->assertTableNotExist('table');
@@ -111,8 +117,6 @@ class Connection extends \Test\TestCase {
]);
$this->assertEquals('foo', $this->getTextValueByIntergerField(1));
-
- $this->connection->dropTable('table');
}
public function testSetValuesOverWrite() {
@@ -131,8 +135,6 @@ class Connection extends \Test\TestCase {
]);
$this->assertEquals('bar', $this->getTextValueByIntergerField(1));
-
- $this->connection->dropTable('table');
}
public function testSetValuesOverWritePrecondition() {
@@ -154,8 +156,6 @@ class Connection extends \Test\TestCase {
]);
$this->assertEquals('bar', $this->getTextValueByIntergerField(1));
-
- $this->connection->dropTable('table');
}
/**
@@ -179,4 +179,22 @@ class Connection extends \Test\TestCase {
'booleanfield' => false
]);
}
+
+ public function testSetValuesSameNoError() {
+ $this->makeTestTable();
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'foo',
+ 'clobfield' => 'not_null'
+ ]);
+
+ // this will result in 'no affected rows' on certain optimizing DBs
+ // ensure the PreConditionNotMetException isn't thrown
+ $this->connection->setValues('table', [
+ 'integerfield' => 1
+ ], [
+ 'textfield' => 'foo'
+ ]);
+ }
}