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,