changeset 5841:57ab63fe9108 find-refactoring

tools/find: Limit and Since are now forbidden when filtering on DICOM tags that are not stored in DB
author Alain Mazy <am@orthanc.team>
date Thu, 24 Oct 2024 15:08:43 +0200
parents b24b61331566
children 08e47734328e
files NEWS OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp
diffstat 2 files changed, 11 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Mon Oct 21 18:24:09 2024 +0200
+++ b/NEWS	Thu Oct 24 15:08:43 2024 +0200
@@ -43,6 +43,8 @@
     resource (e.g: Metadata, Children, ...)
 * With DB backend with "HasExtendedFind" support, a new /tools/count-resources API route
   is similar to tools/find but only returns the number of resources matching the criteria.
+* With DB backend with "HasExtendedFind" support, usage of 'Limit' and 'Since in /tools/find
+  is not allowed if your query includes filtering on DICOM tags that are not stored in DB.
 
 
 Maintenance
--- a/OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp	Mon Oct 21 18:24:09 2024 +0200
+++ b/OrthancServer/Sources/OrthancRestApi/OrthancRestResources.cpp	Thu Oct 24 15:08:43 2024 +0200
@@ -3465,6 +3465,8 @@
 
       ResourceFinder finder(level, responseContent);
 
+      DatabaseLookup dicomTagLookup;
+
       { // common query code
         bool caseSensitive = false;
         if (request.isMember(KEY_CASE_SENSITIVE))
@@ -3473,7 +3475,6 @@
         }
 
         { // DICOM Tag query
-          DatabaseLookup dicomTagLookup;
 
           Json::Value::Members members = request[KEY_QUERY].getMemberNames();
           for (size_t i = 0; i < members.size(); i++)
@@ -3601,6 +3602,13 @@
 
         finder.SetDatabaseLimits(context.GetDatabaseLimits(level));
 
+        if ((request.isMember(KEY_LIMIT) || request.isMember(KEY_SINCE)) &&
+          !dicomTagLookup.HasOnlyMainDicomTags())
+        {
+            throw OrthancException(ErrorCode_BadRequest,
+                                  "Unable to use " + std::string(KEY_LIMIT) + " or " + std::string(KEY_SINCE) + " in tools/find when querying tags that are not stored as MainDicomTags in the Database");
+        }
+
         if (request.isMember(KEY_LIMIT))
         {
           int64_t tmp = request[KEY_LIMIT].asInt64();