diff Framework/Plugins/IndexBackend.cpp @ 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 4cd7e45b671e
line wrap: on
line diff
--- a/Framework/Plugins/IndexBackend.cpp	Wed Jan 30 17:05:49 2019 +0100
+++ b/Framework/Plugins/IndexBackend.cpp	Mon Feb 04 16:03:17 2019 +0100
@@ -1739,9 +1739,9 @@
       args.SetUtf8Value(name, tags[i].value);
       
       std::string insert = ("(" + boost::lexical_cast<std::string>(tags[i].resource) + ", " +
-                           boost::lexical_cast<std::string>(tags[i].group) + ", " +
-                           boost::lexical_cast<std::string>(tags[i].element) + ", " +
-                           "${" + name + "})");
+                            boost::lexical_cast<std::string>(tags[i].group) + ", " +
+                            boost::lexical_cast<std::string>(tags[i].element) + ", " +
+                            "${" + name + "})");
 
       if (sql.empty())
       {
@@ -1787,7 +1787,7 @@
       
       std::string insert = ("(" + boost::lexical_cast<std::string>(metadata[i].resource) + ", " +
                             boost::lexical_cast<std::string>(metadata[i].metadata) + ", " +
-                           "${" + name + "})");
+                            "${" + name + "})");
 
       std::string remove = ("(id=" + boost::lexical_cast<std::string>(metadata[i].resource) +
                             " AND type=" + boost::lexical_cast<std::string>(metadata[i].metadata)
@@ -1951,4 +1951,108 @@
       statement.Execute(args);
     }
   }
+
+
+#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
+  bool IndexBackend::LookupResourceAndParent(int64_t& id,
+                                             OrthancPluginResourceType& type,
+                                             std::string& parentPublicId,
+                                             const char* publicId)
+  {
+    DatabaseManager::CachedStatement statement(
+      STATEMENT_FROM_HERE, manager_,
+      "SELECT resource.internalId, resource.resourceType, parent.publicId "
+      "FROM Resources AS resource LEFT JOIN Resources parent ON parent.internalId=resource.parentId "
+      "WHERE resource.publicId=${id}");
+
+    statement.SetParameterType("id", ValueType_Utf8String);
+        
+    Dictionary args;
+    args.SetUtf8Value("id", publicId);
+
+    statement.Execute(args);
+
+    if (statement.IsDone())
+    {
+      return false;
+    }
+    else
+    {
+      if (statement.GetResultFieldsCount() != 3)
+      {
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
+      }
+
+      statement.SetResultFieldType(0, ValueType_Integer64);
+      statement.SetResultFieldType(1, ValueType_Integer64);      
+      statement.SetResultFieldType(2, ValueType_Utf8String);
+
+      id = ReadInteger64(statement, 0);
+      type = static_cast<OrthancPluginResourceType>(ReadInteger32(statement, 1));
+
+      const IValue& value = statement.GetResultField(2);
+      
+      switch (value.GetType())
+      {
+        case ValueType_Null:
+          parentPublicId.clear();
+          break;
+
+        case ValueType_Utf8String:
+          parentPublicId = dynamic_cast<const Utf8StringValue&>(value).GetContent();
+          break;
+
+        default:
+          throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
+      }
+      
+      assert((statement.Next(), statement.IsDone()));
+      return true;
+    }
+  }
+#  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
+  void IndexBackend::GetAllMetadata(std::map<int32_t, std::string>& result,
+                                    int64_t id)
+  {
+    DatabaseManager::CachedStatement statement(
+      STATEMENT_FROM_HERE, manager_,
+      "SELECT type, value FROM Metadata WHERE id=${id}");
+      
+    statement.SetReadOnly(true);
+    statement.SetParameterType("id", ValueType_Integer64);
+
+    Dictionary args;
+    args.SetIntegerValue("id", id);
+
+    statement.Execute(args);
+      
+    result.clear();
+
+    if (!statement.IsDone())
+    {
+      if (statement.GetResultFieldsCount() != 2)
+      {
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
+      }
+      
+      statement.SetResultFieldType(0, ValueType_Integer64);
+      statement.SetResultFieldType(1, ValueType_Utf8String);
+
+      while (!statement.IsDone())
+      {
+        result[ReadInteger32(statement, 0)] = ReadString(statement, 1);
+        statement.Next();
+      }
+    }
+  }
+#  endif
+#endif
 }