Mercurial > hg > orthanc-databases
diff Framework/Plugins/OrthancCppDatabasePlugin.h @ 117:ca0ecd412988 OrthancMySQL-2.0
Implementation of new extensions: LookupResourceAndParent and GetAllMetadata
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 04 Feb 2019 16:03:17 +0100 |
parents | eb08ec14fb04 |
children | 260fc55f10cd 3424a54ca2ee |
line wrap: on
line diff
--- a/Framework/Plugins/OrthancCppDatabasePlugin.h Wed Jan 30 17:05:49 2019 +0100 +++ b/Framework/Plugins/OrthancCppDatabasePlugin.h Mon Feb 04 16:03:17 2019 +0100 @@ -82,7 +82,8 @@ AllowedAnswers_DicomTag, AllowedAnswers_ExportedResource, AllowedAnswers_MatchingResource, - AllowedAnswers_String + AllowedAnswers_String, + AllowedAnswers_Metadata }; OrthancPluginContext* context_; @@ -534,6 +535,23 @@ virtual int64_t GetLastChangeIndex() = 0; virtual void TagMostRecentPatient(int64_t patientId) = 0; + +#if defined(ORTHANC_PLUGINS_VERSION_IS_ABOVE) // Macro introduced in 1.3.1 +# if ORTHANC_PLUGINS_VERSION_IS_ABOVE(1, 5, 4) + // NB: "parentPublicId" must be cleared if the resource has no parent + virtual bool LookupResourceAndParent(int64_t& id, + OrthancPluginResourceType& type, + std::string& parentPublicId, + const char* publicId) = 0; +# endif +#endif + +#if defined(ORTHANC_PLUGINS_VERSION_IS_ABOVE) // Macro introduced in 1.3.1 +# if ORTHANC_PLUGINS_VERSION_IS_ABOVE(1, 5, 4) + virtual void GetAllMetadata(std::map<int32_t, std::string>& result, + int64_t id) = 0; +# endif +#endif }; @@ -1650,6 +1668,77 @@ } +#if defined(ORTHANC_PLUGINS_VERSION_IS_ABOVE) // Macro introduced in 1.3.1 +# if ORTHANC_PLUGINS_VERSION_IS_ABOVE(1, 5, 4) + // New primitive since Orthanc 1.5.4 + static OrthancPluginErrorCode GetAllMetadata(OrthancPluginDatabaseContext* context, + void* payload, + int64_t resourceId) + { + IDatabaseBackend* backend = reinterpret_cast<IDatabaseBackend*>(payload); + backend->GetOutput().SetAllowedAnswers(DatabaseBackendOutput::AllowedAnswers_Metadata); + + try + { + std::map<int32_t, std::string> result; + backend->GetAllMetadata(result, resourceId); + + for (std::map<int32_t, std::string>::const_iterator + it = result.begin(); it != result.end(); ++it) + { + OrthancPluginDatabaseAnswerMetadata(backend->GetOutput().context_, + backend->GetOutput().database_, + resourceId, it->first, it->second.c_str()); + } + + return OrthancPluginErrorCode_Success; + } + ORTHANC_PLUGINS_DATABASE_CATCH + } +# endif +#endif + + +#if defined(ORTHANC_PLUGINS_VERSION_IS_ABOVE) // Macro introduced in 1.3.1 +# if ORTHANC_PLUGINS_VERSION_IS_ABOVE(1, 5, 4) + // New primitive since Orthanc 1.5.4 + static OrthancPluginErrorCode LookupResourceAndParent(OrthancPluginDatabaseContext* context, + uint8_t* isExisting, + int64_t* id, + OrthancPluginResourceType* type, + void* payload, + const char* publicId) + { + IDatabaseBackend* backend = reinterpret_cast<IDatabaseBackend*>(payload); + backend->GetOutput().SetAllowedAnswers(DatabaseBackendOutput::AllowedAnswers_String); + + try + { + std::string parent; + if (backend->LookupResourceAndParent(*id, *type, parent, publicId)) + { + *isExisting = 1; + + if (!parent.empty()) + { + OrthancPluginDatabaseAnswerString(backend->GetOutput().context_, + backend->GetOutput().database_, + parent.c_str()); + } + } + else + { + *isExisting = 0; + } + + return OrthancPluginErrorCode_Success; + } + ORTHANC_PLUGINS_DATABASE_CATCH + } +# endif +#endif + + public: /** * Register a custom database back-end written in C++. @@ -1741,11 +1830,18 @@ { extensions.createInstance = CreateInstance; // Fast creation of resources } - - performanceWarning = false; #endif - if (performanceWarning) +#if defined(ORTHANC_PLUGINS_VERSION_IS_ABOVE) // Macro introduced in 1.3.1 +# if ORTHANC_PLUGINS_VERSION_IS_ABOVE(1, 5, 4) + // Optimizations brought by Orthanc 1.5.4 + extensions.lookupResourceAndParent = LookupResourceAndParent; + extensions.getAllMetadata = GetAllMetadata; + performanceWarning = false; +# endif +#endif + + if (performanceWarning) { char info[1024]; sprintf(info,