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