diff Framework/Plugins/IndexBackend.cpp @ 256:e184dcadf163

handling of revisions in metadata
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 16 Apr 2021 17:13:33 +0200
parents d663d9e44f8d
children 34e2b93a7ac1
line wrap: on
line diff
--- a/Framework/Plugins/IndexBackend.cpp	Wed Apr 14 17:57:08 2021 +0200
+++ b/Framework/Plugins/IndexBackend.cpp	Fri Apr 16 17:13:33 2021 +0200
@@ -446,7 +446,7 @@
     SignalDeletedFiles(output, manager);
   }
 
-    
+
   void IndexBackend::DeleteMetadata(DatabaseManager& manager,
                                     int64_t id,
                                     int32_t metadataType)
@@ -465,7 +465,7 @@
     statement.Execute(args);
   }
 
-    
+
   void IndexBackend::DeleteResource(IDatabaseBackendOutput& output,
                                     DatabaseManager& manager,
                                     int64_t id)
@@ -1256,31 +1256,60 @@
 
     
   bool IndexBackend::LookupMetadata(std::string& target /*out*/,
+                                    int64_t& revision /*out*/,
                                     DatabaseManager& manager,
                                     int64_t id,
                                     int32_t metadataType)
   {
-    DatabaseManager::CachedStatement statement(
-      STATEMENT_FROM_HERE, manager,
-      "SELECT value FROM Metadata WHERE id=${id} and type=${type}");
+    std::unique_ptr<DatabaseManager::CachedStatement> statement;
+
+    switch (manager.GetDialect())
+    {
+      case Dialect_MySQL:
+      case Dialect_PostgreSQL:
+        statement.reset(new DatabaseManager::CachedStatement(
+                          STATEMENT_FROM_HERE, manager,
+                          "SELECT value FROM Metadata WHERE id=${id} and type=${type}"));
+        break;
 
-    statement.SetReadOnly(true);
-    statement.SetParameterType("id", ValueType_Integer64);
-    statement.SetParameterType("type", ValueType_Integer64);
+      case Dialect_SQLite:
+        statement.reset(new DatabaseManager::CachedStatement(
+                          STATEMENT_FROM_HERE, manager,
+                          "SELECT value, revision FROM Metadata WHERE id=${id} and type=${type}"));
+        break;
+
+      default:
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
+    }
+    
+    
+    statement->SetReadOnly(true);
+    statement->SetParameterType("id", ValueType_Integer64);
+    statement->SetParameterType("type", ValueType_Integer64);
 
     Dictionary args;
     args.SetIntegerValue("id", id);
     args.SetIntegerValue("type", metadataType);
 
-    statement.Execute(args);
+    statement->Execute(args);
 
-    if (statement.IsDone())
+    if (statement->IsDone())
     {
       return false;
     }
     else
     {
-      target = ReadString(statement, 0);
+      target = ReadString(*statement, 0);
+
+      if (manager.GetDialect() == Dialect_SQLite)
+      {
+        revision = ReadInteger64(*statement, 1);
+      }
+      else
+      {
+        revision = 0;  // TODO - REVISIONS
+      }
+      
       return true;
     }
   } 
@@ -1560,27 +1589,31 @@
   void IndexBackend::SetMetadata(DatabaseManager& manager,
                                  int64_t id,
                                  int32_t metadataType,
-                                 const char* value)
+                                 const char* value,
+                                 int64_t revision)
   {
     if (manager.GetDialect() == Dialect_SQLite)
     {
       DatabaseManager::CachedStatement statement(
         STATEMENT_FROM_HERE, manager,
-        "INSERT OR REPLACE INTO Metadata VALUES (${id}, ${type}, ${value})");
+        "INSERT OR REPLACE INTO Metadata VALUES (${id}, ${type}, ${value}, ${revision})");
         
       statement.SetParameterType("id", ValueType_Integer64);
       statement.SetParameterType("type", ValueType_Integer64);
       statement.SetParameterType("value", ValueType_Utf8String);
+      statement.SetParameterType("revision", ValueType_Integer64);
         
       Dictionary args;
       args.SetIntegerValue("id", id);
       args.SetIntegerValue("type", metadataType);
       args.SetUtf8Value("value", value);
+      args.SetIntegerValue("revision", revision);
         
       statement.Execute(args);
     }
     else
     {
+      // TODO - REVISIONS
       {
         DatabaseManager::CachedStatement statement(
           STATEMENT_FROM_HERE, manager,
@@ -2048,10 +2081,16 @@
       std::string name = "m" + boost::lexical_cast<std::string>(i);
 
       args.SetUtf8Value(name, metadata[i].value);
+
+      std::string revisionSuffix;
+      if (manager.GetDialect() == Dialect_SQLite)
+      {
+        revisionSuffix = ", 0";  // TODO - REVISIONS
+      }
       
       std::string insert = ("(" + boost::lexical_cast<std::string>(metadata[i].resource) + ", " +
                             boost::lexical_cast<std::string>(metadata[i].metadata) + ", " +
-                            "${" + name + "})");
+                            "${" + name + "}" + revisionSuffix + ")");
 
       std::string remove = ("(id=" + boost::lexical_cast<std::string>(metadata[i].resource) +
                             " AND type=" + boost::lexical_cast<std::string>(metadata[i].metadata)
@@ -2121,7 +2160,7 @@
 
     ExecuteSetResourcesContentTags(manager, "MainDicomTags", "t",
                                    countMainDicomTags, mainDicomTags);
-
+    
     ExecuteSetResourcesContentMetadata(manager, countMetadata, metadata);
   }
 #endif