Merge pull request #23309 from owncloud/backport-23164-stable9

[stable9] Prevent certain DBs throwing exceptions on same-value updates
This commit is contained in:
Thomas Müller 2016-03-17 20:52:11 +01:00
commit 382b18e85e
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'
]);
}
}