Mercurial > hg > orthanc
comparison OrthancServer/Sources/Database/StatelessDatabaseOperations.cpp @ 5558:c1ed59a5bdc2
new LimitToThisLevelMainDicomTags reconstruct mode + * Housekeeper plugin: Added an option LimitMainDicomTagsReconstructLevel
author | Alain Mazy <am@orthanc.team> |
---|---|
date | Fri, 19 Apr 2024 11:27:39 +0200 |
parents | 9a431368801b |
children | 738f80622e91 b2a97dfd719f |
comparison
equal
deleted
inserted
replaced
5557:87c0fbc8f457 | 5558:c1ed59a5bdc2 |
---|---|
2762 Toolbox::WriteFastJson(result, jsonMetadata); | 2762 Toolbox::WriteFastJson(result, jsonMetadata); |
2763 } | 2763 } |
2764 } | 2764 } |
2765 | 2765 |
2766 | 2766 |
2767 void StatelessDatabaseOperations::ReconstructInstance(const ParsedDicomFile& dicom) | 2767 void StatelessDatabaseOperations::ReconstructInstance(const ParsedDicomFile& dicom, bool limitToThisLevelDicomTags, ResourceType limitToLevel) |
2768 { | 2768 { |
2769 class Operations : public IReadWriteOperations | 2769 class Operations : public IReadWriteOperations |
2770 { | 2770 { |
2771 private: | 2771 private: |
2772 DicomMap summary_; | 2772 DicomMap summary_; |
2773 std::unique_ptr<DicomInstanceHasher> hasher_; | 2773 std::unique_ptr<DicomInstanceHasher> hasher_; |
2774 bool limitToThisLevelDicomTags_; | |
2775 ResourceType limitToLevel_; | |
2774 bool hasTransferSyntax_; | 2776 bool hasTransferSyntax_; |
2775 DicomTransferSyntax transferSyntax_; | 2777 DicomTransferSyntax transferSyntax_; |
2776 | 2778 |
2777 static void ReplaceMetadata(ReadWriteTransaction& transaction, | 2779 static void ReplaceMetadata(ReadWriteTransaction& transaction, |
2778 int64_t instance, | 2780 int64_t instance, |
2810 } | 2812 } |
2811 | 2813 |
2812 } | 2814 } |
2813 | 2815 |
2814 public: | 2816 public: |
2815 explicit Operations(const ParsedDicomFile& dicom) | 2817 explicit Operations(const ParsedDicomFile& dicom, bool limitToThisLevelDicomTags, ResourceType limitToLevel) |
2818 : limitToThisLevelDicomTags_(limitToThisLevelDicomTags), | |
2819 limitToLevel_(limitToLevel) | |
2816 { | 2820 { |
2817 OrthancConfiguration::DefaultExtractDicomSummary(summary_, dicom); | 2821 OrthancConfiguration::DefaultExtractDicomSummary(summary_, dicom); |
2818 hasher_.reset(new DicomInstanceHasher(summary_)); | 2822 hasher_.reset(new DicomInstanceHasher(summary_)); |
2819 hasTransferSyntax_ = dicom.LookupTransferSyntax(transferSyntax_); | 2823 hasTransferSyntax_ = dicom.LookupTransferSyntax(transferSyntax_); |
2820 } | 2824 } |
2838 instance == -1) | 2842 instance == -1) |
2839 { | 2843 { |
2840 throw OrthancException(ErrorCode_InternalError); | 2844 throw OrthancException(ErrorCode_InternalError); |
2841 } | 2845 } |
2842 | 2846 |
2843 transaction.ClearMainDicomTags(patient); | 2847 if (limitToThisLevelDicomTags_) |
2844 transaction.ClearMainDicomTags(study); | |
2845 transaction.ClearMainDicomTags(series); | |
2846 transaction.ClearMainDicomTags(instance); | |
2847 | |
2848 { | 2848 { |
2849 ResourcesContent content(false /* prevent the setting of metadata */); | 2849 ResourcesContent content(false /* prevent the setting of metadata */); |
2850 content.AddResource(patient, ResourceType_Patient, summary_); | 2850 int64_t resource = -1; |
2851 content.AddResource(study, ResourceType_Study, summary_); | 2851 if (limitToLevel_ == ResourceType_Patient) |
2852 content.AddResource(series, ResourceType_Series, summary_); | 2852 { |
2853 content.AddResource(instance, ResourceType_Instance, summary_); | 2853 resource = patient; |
2854 | 2854 } |
2855 else if (limitToLevel_ == ResourceType_Study) | |
2856 { | |
2857 resource = study; | |
2858 } | |
2859 else if (limitToLevel_ == ResourceType_Series) | |
2860 { | |
2861 resource = series; | |
2862 } | |
2863 else if (limitToLevel_ == ResourceType_Instance) | |
2864 { | |
2865 resource = instance; | |
2866 } | |
2867 | |
2868 transaction.ClearMainDicomTags(resource); | |
2869 content.AddResource(resource, limitToLevel_, summary_); | |
2855 transaction.SetResourcesContent(content); | 2870 transaction.SetResourcesContent(content); |
2856 | 2871 ReplaceMetadata(transaction, resource, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(limitToLevel_)); |
2857 ReplaceMetadata(transaction, patient, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Patient)); // New in Orthanc 1.11.0 | 2872 } |
2858 ReplaceMetadata(transaction, study, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Study)); // New in Orthanc 1.11.0 | 2873 else |
2859 ReplaceMetadata(transaction, series, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Series)); // New in Orthanc 1.11.0 | 2874 { |
2860 ReplaceMetadata(transaction, instance, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Instance)); // New in Orthanc 1.11.0 | 2875 transaction.ClearMainDicomTags(patient); |
2861 | 2876 transaction.ClearMainDicomTags(study); |
2862 SetMainDicomSequenceMetadata(transaction, patient, summary_, ResourceType_Patient); | 2877 transaction.ClearMainDicomTags(series); |
2863 SetMainDicomSequenceMetadata(transaction, study, summary_, ResourceType_Study); | 2878 transaction.ClearMainDicomTags(instance); |
2864 SetMainDicomSequenceMetadata(transaction, series, summary_, ResourceType_Series); | 2879 |
2865 SetMainDicomSequenceMetadata(transaction, instance, summary_, ResourceType_Instance); | 2880 { |
2866 } | 2881 ResourcesContent content(false /* prevent the setting of metadata */); |
2867 | 2882 content.AddResource(patient, ResourceType_Patient, summary_); |
2868 if (hasTransferSyntax_) | 2883 content.AddResource(study, ResourceType_Study, summary_); |
2869 { | 2884 content.AddResource(series, ResourceType_Series, summary_); |
2870 ReplaceMetadata(transaction, instance, MetadataType_Instance_TransferSyntax, GetTransferSyntaxUid(transferSyntax_)); | 2885 content.AddResource(instance, ResourceType_Instance, summary_); |
2871 } | 2886 |
2872 | 2887 transaction.SetResourcesContent(content); |
2873 const DicomValue* value; | 2888 |
2874 if ((value = summary_.TestAndGetValue(DICOM_TAG_SOP_CLASS_UID)) != NULL && | 2889 ReplaceMetadata(transaction, patient, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Patient)); // New in Orthanc 1.11.0 |
2875 !value->IsNull() && | 2890 ReplaceMetadata(transaction, study, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Study)); // New in Orthanc 1.11.0 |
2876 !value->IsBinary()) | 2891 ReplaceMetadata(transaction, series, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Series)); // New in Orthanc 1.11.0 |
2877 { | 2892 ReplaceMetadata(transaction, instance, MetadataType_MainDicomTagsSignature, DicomMap::GetMainDicomTagsSignature(ResourceType_Instance)); // New in Orthanc 1.11.0 |
2878 ReplaceMetadata(transaction, instance, MetadataType_Instance_SopClassUid, value->GetContent()); | 2893 |
2879 } | 2894 SetMainDicomSequenceMetadata(transaction, patient, summary_, ResourceType_Patient); |
2880 | 2895 SetMainDicomSequenceMetadata(transaction, study, summary_, ResourceType_Study); |
2881 } | 2896 SetMainDicomSequenceMetadata(transaction, series, summary_, ResourceType_Series); |
2882 }; | 2897 SetMainDicomSequenceMetadata(transaction, instance, summary_, ResourceType_Instance); |
2883 | 2898 } |
2884 Operations operations(dicom); | 2899 |
2900 if (hasTransferSyntax_) | |
2901 { | |
2902 ReplaceMetadata(transaction, instance, MetadataType_Instance_TransferSyntax, GetTransferSyntaxUid(transferSyntax_)); | |
2903 } | |
2904 | |
2905 const DicomValue* value; | |
2906 if ((value = summary_.TestAndGetValue(DICOM_TAG_SOP_CLASS_UID)) != NULL && | |
2907 !value->IsNull() && | |
2908 !value->IsBinary()) | |
2909 { | |
2910 ReplaceMetadata(transaction, instance, MetadataType_Instance_SopClassUid, value->GetContent()); | |
2911 } | |
2912 } | |
2913 } | |
2914 }; | |
2915 | |
2916 Operations operations(dicom, limitToThisLevelDicomTags, limitToLevel); | |
2885 Apply(operations); | 2917 Apply(operations); |
2886 } | 2918 } |
2887 | 2919 |
2888 | 2920 |
2889 bool StatelessDatabaseOperations::ReadWriteTransaction::HasReachedMaxStorageSize(uint64_t maximumStorageSize, | 2921 bool StatelessDatabaseOperations::ReadWriteTransaction::HasReachedMaxStorageSize(uint64_t maximumStorageSize, |