diff OrthancServer/Sources/ServerContext.cpp @ 5464:38f1d06875ad pg-transactions

delete attachment in case of same instance being uploaded multiple times at the same time
author Alain Mazy <am@osimis.io>
date Tue, 12 Dec 2023 17:20:10 +0100
parents 9ffd6d18daf3
children 4dd50c4b985a
line wrap: on
line diff
--- a/OrthancServer/Sources/ServerContext.cpp	Fri Dec 08 10:27:24 2023 +0100
+++ b/OrthancServer/Sources/ServerContext.cpp	Tue Dec 12 17:20:10 2023 +0100
@@ -710,9 +710,29 @@
 
       typedef std::map<MetadataType, std::string>  InstanceMetadata;
       InstanceMetadata  instanceMetadata;
-      result.SetStatus(index_.Store(
-        instanceMetadata, summary, attachments, dicom.GetMetadata(), dicom.GetOrigin(), overwrite,
-        hasTransferSyntax, transferSyntax, hasPixelDataOffset, pixelDataOffset, pixelDataVR, isReconstruct));
+
+      try 
+      {
+        result.SetStatus(index_.Store(
+          instanceMetadata, summary, attachments, dicom.GetMetadata(), dicom.GetOrigin(), overwrite,
+          hasTransferSyntax, transferSyntax, hasPixelDataOffset, pixelDataOffset, pixelDataVR, isReconstruct));
+      }
+      catch (OrthancException& ex)
+      {
+        if (ex.GetErrorCode() == ErrorCode_DuplicateResource)
+        {
+          LOG(WARNING) << "Duplicate instance, deleting the attachments";
+
+          accessor.Remove(dicomInfo);
+
+          if (dicomUntilPixelData.IsValid())
+          {
+            accessor.Remove(dicomUntilPixelData);
+          }
+
+          throw;
+        }
+      }
 
       // Only keep the metadata for the "instance" level
       dicom.ClearMetadata();