# HG changeset patch # User Sebastien Jodogne # Date 1586273744 -7200 # Node ID 023b2a9f3aa140939179703e3a876c74fb5dcf43 # Parent aaaa442bfe39f125f8520accd44f99cb51dbc3ea new enum: StoreInstanceMode diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -227,7 +227,7 @@ toStore.SetParsedDicomFile(dicom); ServerContext& context = OrthancRestApi::GetContext(call); - StoreStatus status = context.Store(id, toStore); + StoreStatus status = context.Store(id, toStore, StoreInstanceMode_Default); if (status == StoreStatus_Failure) { diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/OrthancRestApi/OrthancRestApi.cpp --- a/OrthancServer/OrthancRestApi/OrthancRestApi.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/OrthancRestApi/OrthancRestApi.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -139,7 +139,7 @@ toStore.SetBuffer(dicom); std::string publicId; - StoreStatus status = context.Store(publicId, toStore); + StoreStatus status = context.Store(publicId, toStore, StoreInstanceMode_Default); OrthancRestApi::GetApi(call).AnswerStoredInstance(call, toStore, status); } diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/ServerContext.cpp --- a/OrthancServer/ServerContext.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/ServerContext.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -340,8 +340,28 @@ StoreStatus ServerContext::Store(std::string& resultPublicId, - DicomInstanceToStore& dicom) + DicomInstanceToStore& dicom, + StoreInstanceMode mode) { + bool overwrite; + switch (mode) + { + case StoreInstanceMode_Default: + overwrite = overwriteInstances_; + break; + + case StoreInstanceMode_OverwriteDuplicate: + overwrite = true; + break; + + case StoreInstanceMode_IgnoreDuplicate: + overwrite = false; + break; + + default: + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + try { MetricsRegistry::Timer timer(GetMetricsRegistry(), "orthanc_store_dicom_duration_ms"); @@ -406,7 +426,7 @@ typedef std::map InstanceMetadata; InstanceMetadata instanceMetadata; StoreStatus status = index_.Store( - instanceMetadata, dicom, attachments, overwriteInstances_); + instanceMetadata, dicom, attachments, overwrite); // Only keep the metadata for the "instance" level dicom.GetMetadata().clear(); diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/ServerContext.h --- a/OrthancServer/ServerContext.h Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/ServerContext.h Tue Apr 07 17:35:44 2020 +0200 @@ -276,7 +276,8 @@ size_t size); StoreStatus Store(std::string& resultPublicId, - DicomInstanceToStore& dicom); + DicomInstanceToStore& dicom, + StoreInstanceMode mode); void AnswerAttachment(RestApiOutput& output, const std::string& resourceId, diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/ServerEnumerations.h --- a/OrthancServer/ServerEnumerations.h Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/ServerEnumerations.h Tue Apr 07 17:35:44 2020 +0200 @@ -90,6 +90,13 @@ FindStorageAccessMode_DiskOnLookupAndAnswer }; + enum StoreInstanceMode + { + StoreInstanceMode_Default, + StoreInstanceMode_OverwriteDuplicate, + StoreInstanceMode_IgnoreDuplicate + }; + /** * WARNING: Do not change the explicit values in the enumerations diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/ServerJobs/MergeStudyJob.cpp --- a/OrthancServer/ServerJobs/MergeStudyJob.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/ServerJobs/MergeStudyJob.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -145,7 +145,8 @@ toStore.SetParsedDicomFile(*modified); std::string modifiedInstance; - if (context_.Store(modifiedInstance, toStore) != StoreStatus_Success) + if (context_.Store(modifiedInstance, toStore, + StoreInstanceMode_Default) != StoreStatus_Success) { LOG(ERROR) << "Error while storing a modified instance " << instance; return false; diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/ServerJobs/Operations/ModifyInstanceOperation.cpp --- a/OrthancServer/ServerJobs/Operations/ModifyInstanceOperation.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/ServerJobs/Operations/ModifyInstanceOperation.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -114,7 +114,7 @@ toStore.AddMetadata(ResourceType_Instance, MetadataType_ModifiedFrom, instance.GetId()); std::string modifiedId; - context_.Store(modifiedId, toStore); + context_.Store(modifiedId, toStore, StoreInstanceMode_Default); // Only chain with other commands if this command succeeds outputs.Append(new DicomInstanceOperationValue(instance.GetServerContext(), modifiedId)); diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/ServerJobs/ResourceModificationJob.cpp --- a/OrthancServer/ServerJobs/ResourceModificationJob.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/ServerJobs/ResourceModificationJob.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -211,7 +211,8 @@ **/ std::string modifiedInstance; - if (context_.Store(modifiedInstance, toStore) != StoreStatus_Success) + if (context_.Store(modifiedInstance, toStore, + StoreInstanceMode_Default) != StoreStatus_Success) { throw OrthancException(ErrorCode_CannotStoreInstance, "Error while storing a modified instance " + instance); diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/ServerJobs/SplitStudyJob.cpp --- a/OrthancServer/ServerJobs/SplitStudyJob.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/ServerJobs/SplitStudyJob.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -138,7 +138,8 @@ toStore.SetParsedDicomFile(*modified); std::string modifiedInstance; - if (context_.Store(modifiedInstance, toStore) != StoreStatus_Success) + if (context_.Store(modifiedInstance, toStore, + StoreInstanceMode_Default) != StoreStatus_Success) { LOG(ERROR) << "Error while storing a modified instance " << instance; return false; diff -r aaaa442bfe39 -r 023b2a9f3aa1 OrthancServer/main.cpp --- a/OrthancServer/main.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/OrthancServer/main.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -87,7 +87,7 @@ toStore.SetJson(dicomJson); std::string id; - context_.Store(id, toStore); + context_.Store(id, toStore, StoreInstanceMode_Default); } } }; diff -r aaaa442bfe39 -r 023b2a9f3aa1 UnitTestsSources/MultiThreadingTests.cpp --- a/UnitTestsSources/MultiThreadingTests.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/UnitTestsSources/MultiThreadingTests.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -1316,7 +1316,7 @@ DicomInstanceToStore toStore; toStore.SetParsedDicomFile(dicom); - return (context_->Store(id, toStore) == StoreStatus_Success); + return (context_->Store(id, toStore, StoreInstanceMode_Default) == StoreStatus_Success); } }; } diff -r aaaa442bfe39 -r 023b2a9f3aa1 UnitTestsSources/ServerIndexTests.cpp --- a/UnitTestsSources/ServerIndexTests.cpp Tue Apr 07 14:03:33 2020 +0200 +++ b/UnitTestsSources/ServerIndexTests.cpp Tue Apr 07 17:35:44 2020 +0200 @@ -820,7 +820,7 @@ ASSERT_EQ(id, toStore.GetHasher().HashInstance()); std::string id2; - ASSERT_EQ(StoreStatus_Success, context.Store(id2, toStore)); + ASSERT_EQ(StoreStatus_Success, context.Store(id2, toStore, StoreInstanceMode_Default)); ASSERT_EQ(id, id2); } @@ -855,7 +855,8 @@ toStore.SetOrigin(DicomInstanceOrigin::FromPlugins()); std::string id2; - ASSERT_EQ(overwrite ? StoreStatus_Success : StoreStatus_AlreadyStored, context.Store(id2, toStore)); + ASSERT_EQ(overwrite ? StoreStatus_Success : StoreStatus_AlreadyStored, + context.Store(id2, toStore, StoreInstanceMode_Default)); ASSERT_EQ(id, id2); }