Skip to content

Commit e88740d

Browse files
authored
Merge pull request #61950 from nextcloud/carl/catch-unique-exception
fix(preview): Handle unique constraints violation exception
2 parents 30eaf07 + 7629df9 commit e88740d

2 files changed

Lines changed: 41 additions & 1 deletion

File tree

lib/private/Preview/Db/PreviewMapper.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
use DateInterval;
1313
use DateTimeImmutable;
14+
use OCP\AppFramework\Db\DoesNotExistException;
1415
use OCP\AppFramework\Db\Entity;
1516
use OCP\AppFramework\Db\QBMapper;
1617
use OCP\DB\Exception;
@@ -235,4 +236,19 @@ public function getPreviewsForMimeTypes(array $mimeTypes): \Generator {
235236
));
236237
return $this->yieldEntities($qb);
237238
}
239+
240+
public function getPreviewForSpecification(array $parameters): ?Preview {
241+
$qb = $this->db->getQueryBuilder();
242+
$this->joinLocation($qb);
243+
244+
foreach ($parameters as $key => $value) {
245+
$qb->andWhere($qb->expr()->eq($key, $qb->createNamedParameter($value)));
246+
}
247+
248+
try {
249+
return $this->findEntity($qb);
250+
} catch (DoesNotExistException) {
251+
return null;
252+
}
253+
}
238254
}

lib/private/Preview/Generator.php

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,30 @@ public function savePreview(Preview $previewEntry, IImage $preview): Preview {
587587
}
588588
$previewEntry->setSize($size);
589589
$previewEntry->generateId();
590-
return $this->previewMapper->insert($previewEntry);
590+
try {
591+
return $this->previewMapper->insert($previewEntry);
592+
} catch (DBException $e) {
593+
if ($e->getReason() !== DBException::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
594+
throw $e;
595+
}
596+
597+
$this->storageFactory->deletePreview($previewEntry);
598+
599+
$this->logger->debug('Generating a preview but one already exists.', ['exception' => $e]);
600+
601+
$preview = $this->previewMapper->getPreviewForSpecification([
602+
'file_id' => $previewEntry->getFileId(),
603+
'width' => $previewEntry->getWidth(),
604+
'height' => $previewEntry->getHeight(),
605+
'mimetype_id' => $previewEntry->getMimetypeId(),
606+
'cropped' => $previewEntry->isCropped(),
607+
'version_id' => $previewEntry->getVersion() ?? '-1',
608+
]);
609+
610+
if ($preview === null) {
611+
throw new \RuntimeException('Unable to save a preview because it already exists but fetching it again yield nothing');
612+
}
613+
return $preview;
614+
}
591615
}
592616
}

0 commit comments

Comments
 (0)