Merge pull request #37520 from nextcloud/fix/noid/fix-dbal-exception-handling

fix DBAL exception handling in setValues
pull/37559/head
Arthur Schiwon 2023-04-03 11:30:14 +07:00 committed by GitHub
commit 84c76a89ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 9 deletions

@ -40,8 +40,6 @@ use Doctrine\DBAL\Cache\QueryCacheProfile;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Exception\ConstraintViolationException;
use Doctrine\DBAL\Exception\NotNullConstraintViolationException;
use Doctrine\DBAL\Platforms\MySQLPlatform;
use Doctrine\DBAL\Platforms\OraclePlatform;
use Doctrine\DBAL\Platforms\PostgreSQL94Platform;
@ -381,10 +379,10 @@ class Connection extends \Doctrine\DBAL\Connection {
* @param array $values (column name => value)
* @param array $updatePreconditionValues ensure values match preconditions (column name => value)
* @return int number of new rows
* @throws \Doctrine\DBAL\Exception
* @throws \OCP\DB\Exception
* @throws PreConditionNotMetException
*/
public function setValues($table, array $keys, array $values, array $updatePreconditionValues = []) {
public function setValues(string $table, array $keys, array $values, array $updatePreconditionValues = []): int {
try {
$insertQb = $this->getQueryBuilder();
$insertQb->insert($table)
@ -394,9 +392,15 @@ class Connection extends \Doctrine\DBAL\Connection {
}, array_merge($keys, $values))
);
return $insertQb->executeStatement();
} catch (NotNullConstraintViolationException $e) {
throw $e;
} catch (ConstraintViolationException $e) {
} catch (\OCP\DB\Exception $e) {
if (!in_array($e->getReason(), [
\OCP\DB\Exception::REASON_CONSTRAINT_VIOLATION,
\OCP\DB\Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION,
])
) {
throw $e;
}
// value already exists, try update
$updateQb = $this->getQueryBuilder();
$updateQb->update($table);

@ -24,6 +24,9 @@ declare(strict_types=1);
namespace Test\Security;
use OCP\Security\ICredentialsManager;
use OCP\Server;
/**
* @group DB
*/
@ -32,7 +35,7 @@ class CredentialsManagerTest extends \Test\TestCase {
* @dataProvider credentialsProvider
*/
public function testWithDB($userId, $identifier) {
$credentialsManager = \OC::$server->getCredentialsManager();
$credentialsManager = Server::get(ICredentialsManager::class);
$secrets = 'Open Sesame';
@ -45,7 +48,23 @@ class CredentialsManagerTest extends \Test\TestCase {
$this->assertSame(1, $removedRows);
}
public function credentialsProvider() {
/**
* @dataProvider credentialsProvider
*/
public function testUpdate($userId, $identifier): void {
$credentialsManager = Server::get(ICredentialsManager::class);
$secrets = 'Open Sesame';
$secretsRev = strrev($secrets);
$credentialsManager->store($userId, $identifier, $secrets);
$credentialsManager->store($userId, $identifier, $secretsRev);
$received = $credentialsManager->retrieve($userId, $identifier);
$this->assertSame($secretsRev, $received);
}
public function credentialsProvider(): array {
return [
[
'alice',