]> source.dussan.org Git - nextcloud-server.git/commitdiff
Prevent error on files scan if metadata exists
authorLouis Chemineau <louis@chmn.me>
Fri, 5 May 2023 10:57:55 +0000 (12:57 +0200)
committerLouis Chemineau <louis@chmn.me>
Tue, 9 May 2023 09:43:56 +0000 (11:43 +0200)
Signed-off-by: Louis Chemineau <louis@chmn.me>
lib/private/Metadata/FileMetadataMapper.php

index 594ac5eafba4824f97b0233ceca1f2659d8c2a4b..003ab13126e882c81ddac9bcb56b6e38de14ad3a 100644 (file)
@@ -60,7 +60,7 @@ class FileMetadataMapper extends QBMapper {
                $qb = $this->db->getQueryBuilder();
                $qb->select('*')
                        ->from($this->getTableName())
-                       ->where($qb->expr()->eq('id', $qb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT_ARRAY)))
+                       ->where($qb->expr()->eq('id', $qb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)))
                        ->andWhere($qb->expr()->eq('group_name', $qb->createNamedParameter($groupName, IQueryBuilder::PARAM_STR)));
 
                return $this->findEntity($qb);
@@ -111,7 +111,7 @@ class FileMetadataMapper extends QBMapper {
        /**
         * Updates an entry in the db from an entity
         *
-        * @param Entity $entity the entity that should be created
+        * @param FileMetadata $entity the entity that should be created
         * @return FileMetadata the saved entity with the set id
         * @throws Exception
         * @throws \InvalidArgumentException if entity has no id
@@ -148,4 +148,30 @@ class FileMetadataMapper extends QBMapper {
 
                return $entity;
        }
+
+       /**
+        * Override the insertOrUpdate as we could be in a transaction in which case we can not afford on error.
+        *
+        * @param FileMetadata $entity the entity that should be created/updated
+        * @return FileMetadata the saved entity with the (new) id
+        * @throws Exception
+        * @throws \InvalidArgumentException if entity has no id
+        */
+       public function insertOrUpdate(Entity $entity): FileMetadata {
+               try {
+                       $existingEntity = $this->findForGroupForFile($entity->getId(), $entity->getGroupName());
+               } catch (\Throwable) {
+                       $existingEntity = null;
+               }
+
+               if ($existingEntity !== null) {
+                       if ($entity->getValue() !== $existingEntity->getValue()) {
+                               return $this->update($entity);
+                       } else {
+                               return $existingEntity;
+                       }
+               } else {
+                       return parent::insertOrUpdate($entity);
+               }
+       }
 }