# HG changeset patch # User Sebastien Jodogne # Date 1680549285 -7200 # Node ID 3a61fd50f8046746ec6d0e2597b7916d29aa45c8 # Parent d0f7c742d3970c79a5a204a2fd155421278d3aff starting refactoring ExpandedResource diff -r d0f7c742d397 -r 3a61fd50f804 OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp --- a/OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp Mon Apr 03 20:53:14 2023 +0200 +++ b/OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp Mon Apr 03 21:14:45 2023 +0200 @@ -715,10 +715,10 @@ const std::string& publicId, ResourceType level, const std::set& requestedTags, - ExpandResourceDbFlags expandFlags) + ExpandResourceFlags expandFlags) { class Operations : public ReadOnlyOperationsT6< - bool&, ExpandedResource&, const std::string&, ResourceType, const std::set&, ExpandResourceDbFlags> + bool&, ExpandedResource&, const std::string&, ResourceType, const std::set&, ExpandResourceFlags> { private: @@ -778,7 +778,7 @@ else { ExpandedResource& target = tuple.get<1>(); - ExpandResourceDbFlags expandFlags = tuple.get<5>(); + ExpandResourceFlags expandFlags = tuple.get<5>(); // Set information about the parent resource (if it exists) if (type == ResourceType_Patient) @@ -798,16 +798,15 @@ target.parentId_ = parent; } - target.type_ = type; - target.id_ = tuple.get<2>(); - - if (expandFlags & ExpandResourceDbFlags_IncludeChildren) + target.SetResource(type, tuple.get<2>()); + + if (expandFlags & ExpandResourceFlags_IncludeChildren) { // List the children resources transaction.GetChildrenPublicId(target.childrenIds_, internalId); } - if (expandFlags & ExpandResourceDbFlags_IncludeMetadata) + if (expandFlags & ExpandResourceFlags_IncludeMetadata) { // Extract the metadata transaction.GetAllMetadata(target.metadata_, internalId); @@ -869,10 +868,10 @@ LookupStringMetadata(target.mainDicomTagsSignature_, target.metadata_, MetadataType_MainDicomTagsSignature); } - if (expandFlags & ExpandResourceDbFlags_IncludeMainDicomTags) + if (expandFlags & ExpandResourceFlags_IncludeMainDicomTags) { // read all tags from DB - transaction.GetMainDicomTags(target.tags_, internalId); + transaction.GetMainDicomTags(target.GetMainDicomTags(), internalId); // read all main sequences from DB std::string serializedSequences; @@ -882,7 +881,7 @@ Toolbox::ReadJson(jsonMetadata, serializedSequences); assert(jsonMetadata["Version"].asInt() == 1); - target.tags_.FromDicomAsJson(jsonMetadata["Sequences"], true /* append */, true /* parseSequences */); + target.GetMainDicomTags().FromDicomAsJson(jsonMetadata["Sequences"], true /* append */, true /* parseSequences */); } // check if we have access to all requestedTags or if we must get tags from parents @@ -895,7 +894,7 @@ FromDcmtkBridge::ParseListOfTags(savedMainDicomTags, target.mainDicomTagsSignature_); // read parent main dicom tags as long as we have not gathered all requested tags - ResourceType currentLevel = target.type_; + ResourceType currentLevel = target.GetLevel(); int64_t currentInternalId = internalId; Toolbox::GetMissingsFromSet(target.missingRequestedTags_, requestedTags, savedMainDicomTags); @@ -931,7 +930,7 @@ DicomMap parentTags; transaction.GetMainDicomTags(parentTags, currentParentId); - target.tags_.Merge(parentTags); + target.GetMainDicomTags().Merge(parentTags); } currentInternalId = currentParentId; @@ -939,7 +938,7 @@ } } - if (expandFlags & ExpandResourceDbFlags_IncludeLabels) + if (expandFlags & ExpandResourceFlags_IncludeLabels) { transaction.ListLabels(target.labels_, internalId); } diff -r d0f7c742d397 -r 3a61fd50f804 OrthancServer/Sources/Database/StatelessDatabaseOperations.h --- a/OrthancServer/Sources/Database/StatelessDatabaseOperations.h Mon Apr 03 20:53:14 2023 +0200 +++ b/OrthancServer/Sources/Database/StatelessDatabaseOperations.h Mon Apr 03 21:14:45 2023 +0200 @@ -37,15 +37,18 @@ class ParsedDicomFile; struct ServerIndexChange; - struct ExpandedResource : public boost::noncopyable + class ExpandedResource : public boost::noncopyable { + private: std::string id_; - DicomMap tags_; // all main tags and main sequences from DB + ResourceType level_; + DicomMap tags_; // all main tags and main sequences from DB + + public: std::string mainDicomTagsSignature_; std::string parentId_; std::list childrenIds_; std::map metadata_; - ResourceType type_; std::string anonymizedFrom_; std::string modifiedFrom_; std::string lastUpdate_; @@ -65,20 +68,48 @@ // New in Orthanc 1.12.0 std::set labels_; + + public: + void SetResource(ResourceType level, + const std::string& id) + { + level_ = level; + id_ = id; + } + + const std::string& GetPublicId() const + { + return id_; + } + + ResourceType GetLevel() const + { + return level_; + } + + DicomMap& GetMainDicomTags() + { + return tags_; + } + + const DicomMap& GetMainDicomTags() const + { + return tags_; + } }; - enum ExpandResourceDbFlags + enum ExpandResourceFlags { - ExpandResourceDbFlags_None = 0, - ExpandResourceDbFlags_IncludeMetadata = (1 << 0), - ExpandResourceDbFlags_IncludeChildren = (1 << 1), - ExpandResourceDbFlags_IncludeMainDicomTags = (1 << 2), - ExpandResourceDbFlags_IncludeLabels = (1 << 3), + ExpandResourceFlags_None = 0, + ExpandResourceFlags_IncludeMetadata = (1 << 0), + ExpandResourceFlags_IncludeChildren = (1 << 1), + ExpandResourceFlags_IncludeMainDicomTags = (1 << 2), + ExpandResourceFlags_IncludeLabels = (1 << 3), - ExpandResourceDbFlags_Default = (ExpandResourceDbFlags_IncludeMetadata | - ExpandResourceDbFlags_IncludeChildren | - ExpandResourceDbFlags_IncludeMainDicomTags | - ExpandResourceDbFlags_IncludeLabels) + ExpandResourceFlags_Default = (ExpandResourceFlags_IncludeMetadata | + ExpandResourceFlags_IncludeChildren | + ExpandResourceFlags_IncludeMainDicomTags | + ExpandResourceFlags_IncludeLabels) }; class StatelessDatabaseOperations : public boost::noncopyable @@ -534,7 +565,7 @@ const std::string& publicId, ResourceType level, const std::set& requestedTags, - ExpandResourceDbFlags expandFlags); + ExpandResourceFlags expandFlags); void GetAllMetadata(std::map& target, const std::string& publicId, diff -r d0f7c742d397 -r 3a61fd50f804 OrthancServer/Sources/OrthancFindRequestHandler.cpp --- a/OrthancServer/Sources/OrthancFindRequestHandler.cpp Mon Apr 03 20:53:14 2023 +0200 +++ b/OrthancServer/Sources/OrthancFindRequestHandler.cpp Mon Apr 03 21:14:45 2023 +0200 @@ -59,7 +59,8 @@ requestedTags.erase(DICOM_TAG_QUERY_RETRIEVE_LEVEL); // this is not part of the answer // reuse ExpandResource to get missing tags and computed tags (ModalitiesInStudy ...). This code is therefore shared between C-Find, tools/find, list-resources and QIDO-RS - context.ExpandResource(resource, publicId, mainDicomTags, instanceId, dicomAsJson, level, requestedTags, ExpandResourceDbFlags_IncludeMainDicomTags, allowStorageAccess); + context.ExpandResource(resource, publicId, mainDicomTags, instanceId, dicomAsJson, + level, requestedTags, ExpandResourceFlags_IncludeMainDicomTags, allowStorageAccess); DicomMap result; @@ -84,7 +85,7 @@ else { const DicomTag& tag = query.GetElement(i).GetTag(); - const DicomValue* value = resource.tags_.TestAndGetValue(tag); + const DicomValue* value = resource.GetMainDicomTags().TestAndGetValue(tag); if (value != NULL && !value->IsNull() && diff -r d0f7c742d397 -r 3a61fd50f804 OrthancServer/Sources/ServerContext.cpp --- a/OrthancServer/Sources/ServerContext.cpp Mon Apr 03 20:53:14 2023 +0200 +++ b/OrthancServer/Sources/ServerContext.cpp Mon Apr 03 21:14:45 2023 +0200 @@ -1543,7 +1543,7 @@ ComputeStudyTags(resource, *this, resources[i], requestedTags); std::vector modalities; - Toolbox::TokenizeString(modalities, resource.tags_.GetValue(DICOM_TAG_MODALITIES_IN_STUDY).GetContent(), '\\'); + Toolbox::TokenizeString(modalities, resource.GetMainDicomTags().GetValue(DICOM_TAG_MODALITIES_IN_STUDY).GetContent(), '\\'); bool hasAtLeastOneModalityMatching = false; for (size_t m = 0; m < modalities.size(); m++) { @@ -1552,7 +1552,7 @@ isMatch = isMatch && hasAtLeastOneModalityMatching; // copy the value of ModalitiesInStudy such that it can be reused to build the answer - allMainDicomTagsFromDB.SetValue(DICOM_TAG_MODALITIES_IN_STUDY, resource.tags_.GetValue(DICOM_TAG_MODALITIES_IN_STUDY)); + allMainDicomTagsFromDB.SetValue(DICOM_TAG_MODALITIES_IN_STUDY, resource.GetMainDicomTags().GetValue(DICOM_TAG_MODALITIES_IN_STUDY)); } if (isMatch) @@ -1991,10 +1991,10 @@ { target = Json::objectValue; - target["Type"] = GetResourceTypeText(resource.type_, false, true); - target["ID"] = resource.id_; + target["Type"] = GetResourceTypeText(resource.GetLevel(), false, true); + target["ID"] = resource.GetPublicId(); - switch (resource.type_) + switch (resource.GetLevel()) { case ResourceType_Patient: break; @@ -2015,7 +2015,7 @@ throw OrthancException(ErrorCode_InternalError); } - switch (resource.type_) + switch (resource.GetLevel()) { case ResourceType_Patient: case ResourceType_Study: @@ -2029,11 +2029,11 @@ c.append(*it); } - if (resource.type_ == ResourceType_Patient) + if (resource.GetLevel() == ResourceType_Patient) { target["Studies"] = c; } - else if (resource.type_ == ResourceType_Study) + else if (resource.GetLevel() == ResourceType_Study) { target["Series"] = c; } @@ -2051,7 +2051,7 @@ throw OrthancException(ErrorCode_InternalError); } - switch (resource.type_) + switch (resource.GetLevel()) { case ResourceType_Patient: case ResourceType_Study: @@ -2100,9 +2100,9 @@ target["ModifiedFrom"] = resource.modifiedFrom_; } - if (resource.type_ == ResourceType_Patient || - resource.type_ == ResourceType_Study || - resource.type_ == ResourceType_Series) + if (resource.GetLevel() == ResourceType_Patient || + resource.GetLevel() == ResourceType_Study || + resource.GetLevel() == ResourceType_Series) { target["IsStable"] = resource.isStable_; @@ -2118,15 +2118,15 @@ static const char* const PATIENT_MAIN_DICOM_TAGS = "PatientMainDicomTags"; DicomMap mainDicomTags; - resource.tags_.ExtractResourceInformation(mainDicomTags, resource.type_); + resource.GetMainDicomTags().ExtractResourceInformation(mainDicomTags, resource.GetLevel()); target[MAIN_DICOM_TAGS] = Json::objectValue; FromDcmtkBridge::ToJson(target[MAIN_DICOM_TAGS], mainDicomTags, format); - if (resource.type_ == ResourceType_Study) + if (resource.GetLevel() == ResourceType_Study) { DicomMap patientMainDicomTags; - resource.tags_.ExtractPatientInformation(patientMainDicomTags); + resource.GetMainDicomTags().ExtractPatientInformation(patientMainDicomTags); target[PATIENT_MAIN_DICOM_TAGS] = Json::objectValue; FromDcmtkBridge::ToJson(target[PATIENT_MAIN_DICOM_TAGS], patientMainDicomTags, format); @@ -2137,7 +2137,7 @@ static const char* const REQUESTED_TAGS = "RequestedTags"; DicomMap tags; - resource.tags_.ExtractTags(tags, requestedTags); + resource.GetMainDicomTags().ExtractTags(tags, requestedTags); target[REQUESTED_TAGS] = Json::objectValue; FromDcmtkBridge::ToJson(target[REQUESTED_TAGS], tags, format); @@ -2164,7 +2164,7 @@ { if (requestedTags.count(DICOM_TAG_INSTANCE_AVAILABILITY) > 0) { - resource.tags_.SetValue(DICOM_TAG_INSTANCE_AVAILABILITY, "ONLINE", false); + resource.GetMainDicomTags().SetValue(DICOM_TAG_INSTANCE_AVAILABILITY, "ONLINE", false); resource.missingRequestedTags_.erase(DICOM_TAG_INSTANCE_AVAILABILITY); } } @@ -2182,7 +2182,7 @@ index.GetChildren(instances, seriesPublicId); - resource.tags_.SetValue(DICOM_TAG_NUMBER_OF_SERIES_RELATED_INSTANCES, + resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_SERIES_RELATED_INSTANCES, boost::lexical_cast(instances.size()), false); resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_SERIES_RELATED_INSTANCES); } @@ -2227,13 +2227,13 @@ std::string modalities; Toolbox::JoinStrings(modalities, values, "\\"); - resource.tags_.SetValue(DICOM_TAG_MODALITIES_IN_STUDY, modalities, false); + resource.GetMainDicomTags().SetValue(DICOM_TAG_MODALITIES_IN_STUDY, modalities, false); resource.missingRequestedTags_.erase(DICOM_TAG_MODALITIES_IN_STUDY); } if (hasNbRelatedSeries) { - resource.tags_.SetValue(DICOM_TAG_NUMBER_OF_STUDY_RELATED_SERIES, + resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_STUDY_RELATED_SERIES, boost::lexical_cast(series.size()), false); resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_STUDY_RELATED_SERIES); } @@ -2251,7 +2251,7 @@ if (hasNbRelatedInstances) { - resource.tags_.SetValue(DICOM_TAG_NUMBER_OF_STUDY_RELATED_INSTANCES, + resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_STUDY_RELATED_INSTANCES, boost::lexical_cast(instances.size()), false); resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_STUDY_RELATED_INSTANCES); } @@ -2275,7 +2275,7 @@ { std::string sopClassUids; Toolbox::JoinStrings(sopClassUids, values, "\\"); - resource.tags_.SetValue(DICOM_TAG_SOP_CLASSES_IN_STUDY, sopClassUids, false); + resource.GetMainDicomTags().SetValue(DICOM_TAG_SOP_CLASSES_IN_STUDY, sopClassUids, false); } resource.missingRequestedTags_.erase(DICOM_TAG_SOP_CLASSES_IN_STUDY); @@ -2302,7 +2302,7 @@ if (hasNbRelatedStudies) { - resource.tags_.SetValue(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_STUDIES, + resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_STUDIES, boost::lexical_cast(studies.size()), false); resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_STUDIES); } @@ -2319,7 +2319,7 @@ if (hasNbRelatedSeries) { - resource.tags_.SetValue(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_SERIES, + resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_SERIES, boost::lexical_cast(series.size()), false); resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_SERIES); } @@ -2335,7 +2335,7 @@ instances.splice(instances.end(), thisInstancesIds); } - resource.tags_.SetValue(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES, + resource.GetMainDicomTags().SetValue(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES, boost::lexical_cast(instances.size()), false); resource.missingRequestedTags_.erase(DICOM_TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES); } @@ -2399,7 +2399,7 @@ { ExpandedResource resource; - if (ExpandResource(resource, publicId, mainDicomTags, instanceId, dicomAsJson, level, requestedTags, ExpandResourceDbFlags_Default, allowStorageAccess)) + if (ExpandResource(resource, publicId, mainDicomTags, instanceId, dicomAsJson, level, requestedTags, ExpandResourceFlags_Default, allowStorageAccess)) { SerializeExpandedResource(target, resource, format, requestedTags); return true; @@ -2415,57 +2415,63 @@ const Json::Value* dicomAsJson, // optional: the dicom-as-json for the resource (if already available) ResourceType level, const std::set& requestedTags, - ExpandResourceDbFlags expandFlags, + ExpandResourceFlags expandFlags, bool allowStorageAccess) { // first try to get the tags from what is already available - if ((expandFlags & ExpandResourceDbFlags_IncludeMainDicomTags) - && (mainDicomTags.GetSize() > 0) - && (dicomAsJson != NULL)) + if ((expandFlags & ExpandResourceFlags_IncludeMainDicomTags) && + mainDicomTags.GetSize() > 0 && + dicomAsJson != NULL) { - resource.tags_.Merge(mainDicomTags); + resource.GetMainDicomTags().Merge(mainDicomTags); if (dicomAsJson->isObject()) { - resource.tags_.FromDicomAsJson(*dicomAsJson); + resource.GetMainDicomTags().FromDicomAsJson(*dicomAsJson); } std::set retrievedTags; std::set missingTags; - resource.tags_.GetTags(retrievedTags); + resource.GetMainDicomTags().GetTags(retrievedTags); Toolbox::GetMissingsFromSet(missingTags, requestedTags, retrievedTags); // if all possible tags have been read, no need to get them from DB anymore if (missingTags.size() == 0 || DicomMap::HasOnlyComputedTags(missingTags)) { - expandFlags = static_cast(expandFlags & ~ExpandResourceDbFlags_IncludeMainDicomTags); + expandFlags = static_cast(expandFlags & ~ExpandResourceFlags_IncludeMainDicomTags); } - if (missingTags.size() == 0 && expandFlags == ExpandResourceDbFlags_None) // we have already retrieved anything we need + if (missingTags.size() == 0 && expandFlags == ExpandResourceFlags_None) // we have already retrieved anything we need { return true; } } - if (expandFlags != ExpandResourceDbFlags_None - && GetIndex().ExpandResource(resource, publicId, level, requestedTags, static_cast(expandFlags | ExpandResourceDbFlags_IncludeMetadata))) // we always need the metadata to get the mainDicomTagsSignature + if (expandFlags != ExpandResourceFlags_None && + GetIndex().ExpandResource(resource, publicId, level, requestedTags, + static_cast(expandFlags | ExpandResourceFlags_IncludeMetadata))) // we always need the metadata to get the mainDicomTagsSignature { // check the main dicom tags list has not changed since the resource was stored - if (resource.mainDicomTagsSignature_ != DicomMap::GetMainDicomTagsSignature(resource.type_)) + if (resource.mainDicomTagsSignature_ != DicomMap::GetMainDicomTagsSignature(resource.GetLevel())) { OrthancConfiguration::ReaderLock lock; if (lock.GetConfiguration().IsWarningEnabled(Warnings_002_InconsistentDicomTagsInDb)) { - LOG(WARNING) << "W002: " << Orthanc::GetResourceTypeText(resource.type_, false , false) << " has been stored with another version of Main Dicom Tags list, you should POST to /" << Orthanc::GetResourceTypeText(resource.type_, true, false) << "/" << resource.id_ << "/reconstruct to update the list of tags saved in DB. Some MainDicomTags might be missing from this answer."; + LOG(WARNING) << "W002: " << Orthanc::GetResourceTypeText(resource.GetLevel(), false , false) + << " has been stored with another version of Main Dicom Tags list, you should POST to /" + << Orthanc::GetResourceTypeText(resource.GetLevel(), true, false) + << "/" << resource.GetPublicId() + << "/reconstruct to update the list of tags saved in DB. Some MainDicomTags might be missing from this answer."; } } // possibly merge missing requested tags from dicom-as-json - if (allowStorageAccess - && !resource.missingRequestedTags_.empty() && !DicomMap::HasOnlyComputedTags(resource.missingRequestedTags_)) + if (allowStorageAccess && + !resource.missingRequestedTags_.empty() && + !DicomMap::HasOnlyComputedTags(resource.missingRequestedTags_)) { OrthancConfiguration::ReaderLock lock; if (lock.GetConfiguration().IsWarningEnabled(Warnings_001_TagsBeingReadFromStorage)) @@ -2483,7 +2489,9 @@ std::string missings; FromDcmtkBridge::FormatListOfTags(missings, missingTags); - LOG(WARNING) << "W001: Accessing Dicom tags from storage when accessing " << Orthanc::GetResourceTypeText(resource.type_, false , false) << " : " << missings; + LOG(WARNING) << "W001: Accessing Dicom tags from storage when accessing " + << Orthanc::GetResourceTypeText(resource.GetLevel(), false, false) + << " : " << missings; } @@ -2519,7 +2527,7 @@ tagsFromJson.FromDicomAsJson(*dicomAsJson, false /* append */, true /* parseSequences*/); } - resource.tags_.Merge(tagsFromJson); + resource.GetMainDicomTags().Merge(tagsFromJson); } // compute the requested tags diff -r d0f7c742d397 -r 3a61fd50f804 OrthancServer/Sources/ServerContext.h --- a/OrthancServer/Sources/ServerContext.h Mon Apr 03 20:53:14 2023 +0200 +++ b/OrthancServer/Sources/ServerContext.h Mon Apr 03 21:14:45 2023 +0200 @@ -585,7 +585,7 @@ const Json::Value* dicomAsJson, // optional: the dicom-as-json for the resource ResourceType level, const std::set& requestedTags, - ExpandResourceDbFlags expandFlags, + ExpandResourceFlags expandFlags, bool allowStorageAccess); FindStorageAccessMode GetFindStorageAccessMode() const diff -r d0f7c742d397 -r 3a61fd50f804 OrthancServer/Sources/ServerJobs/ResourceModificationJob.cpp --- a/OrthancServer/Sources/ServerJobs/ResourceModificationJob.cpp Mon Apr 03 20:53:14 2023 +0200 +++ b/OrthancServer/Sources/ServerJobs/ResourceModificationJob.cpp Mon Apr 03 21:14:45 2023 +0200 @@ -675,9 +675,12 @@ replacePatientMainDicomTags |= DicomMap::IsMainDicomTag(*it, ResourceType_Patient); } - if ((modificationLevel == ResourceType_Study || modificationLevel == ResourceType_Patient) - && !modification_->IsReplaced(DICOM_TAG_PATIENT_ID) - && modification_->IsKept(DICOM_TAG_STUDY_INSTANCE_UID) && modification_->IsKept(DICOM_TAG_SERIES_INSTANCE_UID) && modification_->IsKept(DICOM_TAG_SOP_INSTANCE_UID)) + if ((modificationLevel == ResourceType_Study || + modificationLevel == ResourceType_Patient) && + !modification_->IsReplaced(DICOM_TAG_PATIENT_ID) && + modification_->IsKept(DICOM_TAG_STUDY_INSTANCE_UID) && + modification_->IsKept(DICOM_TAG_SERIES_INSTANCE_UID) && + modification_->IsKept(DICOM_TAG_SOP_INSTANCE_UID)) { // if we keep the SOPInstanceUID, it very likely means that we are modifying existing resources 'in place' @@ -715,9 +718,9 @@ else { ExpandedResource originalStudy; - if (GetContext().GetIndex().ExpandResource(originalStudy, *studyId, ResourceType_Study, emptyRequestedTags, ExpandResourceDbFlags_IncludeMainDicomTags)) + if (GetContext().GetIndex().ExpandResource(originalStudy, *studyId, ResourceType_Study, emptyRequestedTags, ExpandResourceFlags_IncludeMainDicomTags)) { - targetPatientId = originalStudy.tags_.GetStringValue(DICOM_TAG_PATIENT_ID, "", false); + targetPatientId = originalStudy.GetMainDicomTags().GetStringValue(DICOM_TAG_PATIENT_ID, "", false); } else { @@ -734,7 +737,7 @@ { ExpandedResource targetPatient; - if (GetContext().GetIndex().ExpandResource(targetPatient, lookupPatientResult[0], ResourceType_Patient, emptyRequestedTags, static_cast(ExpandResourceDbFlags_IncludeMainDicomTags | ExpandResourceDbFlags_IncludeChildren))) + if (GetContext().GetIndex().ExpandResource(targetPatient, lookupPatientResult[0], ResourceType_Patient, emptyRequestedTags, static_cast(ExpandResourceFlags_IncludeMainDicomTags | ExpandResourceFlags_IncludeChildren))) { const std::list childrenIds = targetPatient.childrenIds_; bool targetPatientHasOtherStudies = childrenIds.size() > 1; @@ -747,7 +750,7 @@ { // this is allowed if all patient replacedTags do match the target patient tags DicomMap targetPatientTags; - targetPatient.tags_.ExtractPatientInformation(targetPatientTags); + targetPatient.GetMainDicomTags().ExtractPatientInformation(targetPatientTags); std::set mainPatientTags; DicomMap::GetMainDicomTags(mainPatientTags, ResourceType_Patient); @@ -755,9 +758,9 @@ for (std::set::const_iterator mainPatientTag = mainPatientTags.begin(); mainPatientTag != mainPatientTags.end(); ++mainPatientTag) { - if (targetPatientTags.HasTag(*mainPatientTag) - && (!modification_->IsReplaced(*mainPatientTag) - || modification_->GetReplacementAsString(*mainPatientTag) != targetPatientTags.GetStringValue(*mainPatientTag, "", false))) + if (targetPatientTags.HasTag(*mainPatientTag) && + (!modification_->IsReplaced(*mainPatientTag) || + modification_->GetReplacementAsString(*mainPatientTag) != targetPatientTags.GetStringValue(*mainPatientTag, "", false))) { throw OrthancException(ErrorCode_BadRequest, std::string("Trying to change patient tags in a study. The Patient already exists and has other studies. All the 'Replace' tags should match the existing patient main dicom tags. Try using /patients/../modify instead to modify the patient. Failing tag: ") + mainPatientTag->Format()); } @@ -769,8 +772,7 @@ } } } - } - + } } } }