From 40fdff5b8073f370daf347f24d9d95d111e62b96 Mon Sep 17 00:00:00 2001 From: Christoph Wurst <christoph@winzerhof-wurst.at> Date: Thu, 6 Sep 2018 08:46:18 +0200 Subject: [PATCH] Add QBMapper::insertOrUpdate() This allows elegant upserts where the entity ID is provided (e.g. by an external system) and when that data is fed into our database multiple times. Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at> --- lib/public/AppFramework/Db/QBMapper.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/public/AppFramework/Db/QBMapper.php b/lib/public/AppFramework/Db/QBMapper.php index a9b38732a30..b8ebd379b4d 100644 --- a/lib/public/AppFramework/Db/QBMapper.php +++ b/lib/public/AppFramework/Db/QBMapper.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace OCP\AppFramework\Db; +use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; @@ -123,7 +124,23 @@ abstract class QBMapper { return $entity; } - + /** + * Tries to creates a new entry in the db from an entity and + * updates an existing entry if duplicate keys are detected + * by the database + * + * @param Entity $entity the entity that should be created/updated + * @return Entity the saved entity with the (new) id + * @since 15.0.0 + * @suppress SqlInjectionChecker + */ + public function insertOrUpdate(Entity $entity): Entity { + try { + return $this->insert($entity); + } catch (UniqueConstraintViolationException $ex) { + return $this->update($entity); + } + } /** * Updates an entry in the db from an entity -- GitLab