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:
parent
d54106dada
commit
aa91d50d04
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue