Mercurial > hg > orthanc
diff OrthancServer/Sources/Database/ResourcesContent.cpp @ 4623:95ffe3b6ef7c db-changes
handling of revisions for metadata
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 16 Apr 2021 17:13:03 +0200 |
parents | d9473bd5ed43 |
children | f0038043fb97 7053502fbf97 |
line wrap: on
line diff
--- a/OrthancServer/Sources/Database/ResourcesContent.cpp Fri Apr 16 10:48:57 2021 +0200 +++ b/OrthancServer/Sources/Database/ResourcesContent.cpp Fri Apr 16 17:13:03 2021 +0200 @@ -35,12 +35,119 @@ #include "ResourcesContent.h" #include "Compatibility/ISetResourcesContent.h" +#include "../ServerToolbox.h" + +#include "../../../OrthancFramework/Sources/DicomFormat/DicomArray.h" +#include "../../../OrthancFramework/Sources/OrthancException.h" #include <cassert> namespace Orthanc { + static void StoreMainDicomTagsInternal(ResourcesContent& target, + int64_t resource, + const DicomMap& tags) + { + DicomArray flattened(tags); + + for (size_t i = 0; i < flattened.GetSize(); i++) + { + const DicomElement& element = flattened.GetElement(i); + const DicomTag& tag = element.GetTag(); + const DicomValue& value = element.GetValue(); + if (!value.IsNull() && + !value.IsBinary()) + { + target.AddMainDicomTag(resource, tag, element.GetValue().GetContent()); + } + } + } + + + static void StoreIdentifiers(ResourcesContent& target, + int64_t resource, + ResourceType level, + const DicomMap& map) + { + const DicomTag* tags; + size_t size; + + ServerToolbox::LoadIdentifiers(tags, size, level); + + for (size_t i = 0; i < size; i++) + { + // The identifiers tags are a subset of the main DICOM tags + assert(DicomMap::IsMainDicomTag(tags[i])); + + const DicomValue* value = map.TestAndGetValue(tags[i]); + if (value != NULL && + !value->IsNull() && + !value->IsBinary()) + { + std::string s = ServerToolbox::NormalizeIdentifier(value->GetContent()); + target.AddIdentifierTag(resource, tags[i], s); + } + } + } + + + void ResourcesContent::AddMetadata(int64_t resourceId, + MetadataType metadata, + const std::string& value) + { + if (isNewResource_) + { + metadata_.push_back(Metadata(resourceId, metadata, value)); + } + else + { + // This would require to handle the incrementation of revision + // numbers in the database backend => only allow setting + // metadata on new resources + throw OrthancException(ErrorCode_NotImplemented); + } + } + + + void ResourcesContent::AddResource(int64_t resource, + ResourceType level, + const DicomMap& dicomSummary) + { + StoreIdentifiers(*this, resource, level, dicomSummary); + + DicomMap tags; + + switch (level) + { + case ResourceType_Patient: + dicomSummary.ExtractPatientInformation(tags); + break; + + case ResourceType_Study: + // Duplicate the patient tags at the study level (new in Orthanc 0.9.5 - db v6) + dicomSummary.ExtractPatientInformation(tags); + StoreMainDicomTagsInternal(*this, resource, tags); + + dicomSummary.ExtractStudyInformation(tags); + break; + + case ResourceType_Series: + dicomSummary.ExtractSeriesInformation(tags); + break; + + case ResourceType_Instance: + dicomSummary.ExtractInstanceInformation(tags); + break; + + default: + throw OrthancException(ErrorCode_InternalError); + } + + StoreMainDicomTagsInternal(*this, resource, tags); + } + + void ResourcesContent::Store(Compatibility::ISetResourcesContent& compatibility) const { for (std::list<TagValue>::const_iterator @@ -59,7 +166,8 @@ for (std::list<Metadata>::const_iterator it = metadata_.begin(); it != metadata_.end(); ++it) { - compatibility.SetMetadata(it->resourceId_, it->metadata_, it->value_); + assert(isNewResource_); + compatibility.SetMetadata(it->resourceId_, it->metadata_, it->value_, 0 /* initial revision number */); } } }