Mercurial > hg > orthanc
diff OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp @ 5044:6fed78e13233
Refactored DicomMap to handle sequences when needed
author | Alain Mazy <am@osimis.io> |
---|---|
date | Tue, 28 Jun 2022 17:45:09 +0200 |
parents | ec5c203a97ea |
children | e95fadefeb72 |
line wrap: on
line diff
--- a/OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp Mon Jun 27 15:22:19 2022 +0200 +++ b/OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp Tue Jun 28 17:45:09 2022 +0200 @@ -881,7 +881,7 @@ Toolbox::ReadJson(jsonMetadata, serializedSequences); assert(jsonMetadata["Version"].asInt() == 1); - target.sequences_.Deserialize(jsonMetadata["Sequences"]); + target.tags_.FromDicomAsJson(jsonMetadata["Sequences"], true /* append */, true /* parseSequences */); } // check if we have access to all requestedTags or if we must get tags from parents @@ -2629,6 +2629,28 @@ } + static void GetMainDicomSequenceMetadataContent(std::string& result, + const DicomMap& dicomSummary, + ResourceType level) + { + DicomMap levelSummary; + DicomMap levelSequences; + + dicomSummary.ExtractResourceInformation(levelSummary, level); + levelSummary.ExtractSequences(levelSequences); + + if (levelSequences.GetSize() > 0) + { + Json::Value jsonMetadata; + jsonMetadata["Version"] = 1; + jsonMetadata["Sequences"] = Json::objectValue; + FromDcmtkBridge::ToJson(jsonMetadata["Sequences"], levelSequences, DicomToJsonFormat_Full); + + Toolbox::WriteFastJson(result, jsonMetadata); + } + } + + void StatelessDatabaseOperations::ReconstructInstance(const ParsedDicomFile& dicom) { class Operations : public IReadWriteOperations @@ -2657,6 +2679,25 @@ } } + static void SetMainDicomSequenceMetadata(ReadWriteTransaction& transaction, + int64_t instance, + const DicomMap& dicomSummary, + ResourceType level) + { + std::string serialized; + GetMainDicomSequenceMetadataContent(serialized, dicomSummary, level); + + if (!serialized.empty()) + { + ReplaceMetadata(transaction, instance, MetadataType_MainDicomSequences, serialized); + } + else + { + transaction.DeleteMetadata(instance, MetadataType_MainDicomSequences); + } + + } + public: explicit Operations(const ParsedDicomFile& dicom) { @@ -2704,6 +2745,11 @@ ReplaceMetadata(transaction, study, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Study)); // New in Orthanc 1.11.0 ReplaceMetadata(transaction, series, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Series)); // New in Orthanc 1.11.0 ReplaceMetadata(transaction, instance, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Instance)); // New in Orthanc 1.11.0 + + SetMainDicomSequenceMetadata(transaction, patient, summary_, ResourceType_Patient); + SetMainDicomSequenceMetadata(transaction, study, summary_, ResourceType_Study); + SetMainDicomSequenceMetadata(transaction, series, summary_, ResourceType_Series); + SetMainDicomSequenceMetadata(transaction, instance, summary_, ResourceType_Instance); } if (hasTransferSyntax_) @@ -2852,7 +2898,6 @@ StoreStatus StatelessDatabaseOperations::Store(std::map<MetadataType, std::string>& instanceMetadata, const DicomMap& dicomSummary, - const DicomSequencesMap& sequencesToStore, const Attachments& attachments, const MetadataMap& metadata, const DicomInstanceOrigin& origin, @@ -2871,7 +2916,6 @@ StoreStatus storeStatus_; std::map<MetadataType, std::string>& instanceMetadata_; const DicomMap& dicomSummary_; - const DicomSequencesMap& sequencesToStore_; const Attachments& attachments_; const MetadataMap& metadata_; const DicomInstanceOrigin& origin_; @@ -2904,32 +2948,17 @@ } static void SetMainDicomSequenceMetadata(ResourcesContent& content, - int64_t resource, - const DicomSequencesMap& sequencesToStore, // all sequences for all levels ! - ResourceType level) + int64_t resource, + const DicomMap& dicomSummary, + ResourceType level) { - if (sequencesToStore.GetSize() > 0) + std::string serialized; + GetMainDicomSequenceMetadataContent(serialized, dicomSummary, level); + + if (!serialized.empty()) { - const std::set<DicomTag>& levelTags = DicomMap::GetMainDicomTags(level); - std::set<DicomTag> levelSequences; - DicomMap::ExtractSequences(levelSequences, levelTags); - - if (levelSequences.size() == 0) - { - return; - } - - Json::Value jsonMetadata; - jsonMetadata["Version"] = 1; - jsonMetadata["Sequences"] = Json::objectValue; - sequencesToStore.Serialize(jsonMetadata["Sequences"], levelSequences); - - std::string serialized; - Toolbox::WriteFastJson(serialized, jsonMetadata); - content.AddMetadata(resource, MetadataType_MainDicomSequences, serialized); } - } static bool ComputeExpectedNumberOfInstances(int64_t& target, @@ -2989,7 +3018,6 @@ public: Operations(std::map<MetadataType, std::string>& instanceMetadata, const DicomMap& dicomSummary, - const DicomSequencesMap& sequencesToStore, const Attachments& attachments, const MetadataMap& metadata, const DicomInstanceOrigin& origin, @@ -3004,7 +3032,6 @@ storeStatus_(StoreStatus_Failure), instanceMetadata_(instanceMetadata), dicomSummary_(dicomSummary), - sequencesToStore_(sequencesToStore), attachments_(attachments), metadata_(metadata), origin_(origin), @@ -3155,27 +3182,27 @@ content.AddResource(instanceId, ResourceType_Instance, dicomSummary_); SetInstanceMetadata(content, instanceMetadata_, instanceId, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Instance)); // New in Orthanc 1.11.0 - SetMainDicomSequenceMetadata(content, instanceId, sequencesToStore_, ResourceType_Instance); // new in Orthanc 1.11.1 + SetMainDicomSequenceMetadata(content, instanceId, dicomSummary_, ResourceType_Instance); // new in Orthanc 1.11.1 if (status.isNewSeries_) { content.AddResource(status.seriesId_, ResourceType_Series, dicomSummary_); content.AddMetadata(status.seriesId_, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Series)); // New in Orthanc 1.11.0 - SetMainDicomSequenceMetadata(content, status.seriesId_, sequencesToStore_, ResourceType_Series); // new in Orthanc 1.11.1 + SetMainDicomSequenceMetadata(content, status.seriesId_, dicomSummary_, ResourceType_Series); // new in Orthanc 1.11.1 } if (status.isNewStudy_) { content.AddResource(status.studyId_, ResourceType_Study, dicomSummary_); content.AddMetadata(status.studyId_, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Study)); // New in Orthanc 1.11.0 - SetMainDicomSequenceMetadata(content, status.studyId_, sequencesToStore_, ResourceType_Study); // new in Orthanc 1.11.1 + SetMainDicomSequenceMetadata(content, status.studyId_, dicomSummary_, ResourceType_Study); // new in Orthanc 1.11.1 } if (status.isNewPatient_) { content.AddResource(status.patientId_, ResourceType_Patient, dicomSummary_); content.AddMetadata(status.patientId_, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Patient)); // New in Orthanc 1.11.0 - SetMainDicomSequenceMetadata(content, status.patientId_, sequencesToStore_, ResourceType_Patient); // new in Orthanc 1.11.1 + SetMainDicomSequenceMetadata(content, status.patientId_, dicomSummary_, ResourceType_Patient); // new in Orthanc 1.11.1 } // Attach the auto-computed metadata for the patient/study/series levels @@ -3320,7 +3347,7 @@ }; - Operations operations(instanceMetadata, dicomSummary, sequencesToStore, attachments, metadata, origin, + Operations operations(instanceMetadata, dicomSummary, attachments, metadata, origin, overwrite, hasTransferSyntax, transferSyntax, hasPixelDataOffset, pixelDataOffset, maximumStorageSize, maximumPatients, isReconstruct); Apply(operations);