Prevent certain DBs throwing exceptions on same-value updates

A PreconditionNotMetException must only be thrown if explicit
preconditions are specified for setValues(), not if the value is merely
the same as was already in the DB.
This commit is contained in:
Robin McCorkell 2016-03-11 17:22:29 +00:00 committed by Arthur Schiwon
parent d54106dada
commit aa91d50d04
2 changed files with 25 additions and 7 deletions

View File

@ -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();
}

View File

@ -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'
]);
}
}