diff MySQL/Plugins/MySQLIndex.cpp @ 307:8de3a1ecac11

MySQL: Added missing calls to OrthancPluginDatabaseSignalDeletedResource()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 12 Jul 2021 16:53:28 +0200
parents 87f0e29a1dc1
children eb0b04c10bc4
line wrap: on
line diff
--- a/MySQL/Plugins/MySQLIndex.cpp	Mon Jul 12 12:03:33 2021 +0200
+++ b/MySQL/Plugins/MySQLIndex.cpp	Mon Jul 12 16:53:28 2021 +0200
@@ -367,6 +367,9 @@
 
     while (!done)
     {
+      bool hasSibling = false;
+      int64_t parentId;
+      
       {
         DatabaseManager::CachedStatement lookupSiblings(
           STATEMENT_FROM_HERE, manager,
@@ -387,7 +390,7 @@
         }
         else
         {
-          int64_t parentId = lookupSiblings.ReadInteger64(0);
+          parentId = lookupSiblings.ReadInteger64(0);
           lookupSiblings.Next();
 
           if (lookupSiblings.IsDone())
@@ -400,39 +403,59 @@
           {
             // "id" has at least one sibling node: the parent node is the remaining ancestor
             done = true;
-
-            DatabaseManager::CachedStatement parent(
-              STATEMENT_FROM_HERE, manager,
-              "SELECT publicId, resourceType FROM Resources WHERE internalId=${id};");
-            
-            parent.SetParameterType("id", ValueType_Integer64);
-
-            Dictionary args2;
-            args2.SetIntegerValue("id", parentId);
-    
-            parent.Execute(args2);
-
-            output.SignalRemainingAncestor(
-              parent.ReadString(0),
-              static_cast<OrthancPluginResourceType>(parent.ReadInteger32(1)));
+            hasSibling = true;
           }
         }
       }
+
+      if (hasSibling)
+      {
+        // This cannot be executed in the same scope as another
+        // DatabaseManager::CachedStatement
+        
+        DatabaseManager::CachedStatement parent(
+          STATEMENT_FROM_HERE, manager,
+          "SELECT publicId, resourceType FROM Resources WHERE internalId=${id};");
+        
+        parent.SetParameterType("id", ValueType_Integer64);
+        
+        Dictionary args2;
+        args2.SetIntegerValue("id", parentId);
+        
+        parent.Execute(args2);
+        
+        output.SignalRemainingAncestor(
+          parent.ReadString(0),
+          static_cast<OrthancPluginResourceType>(parent.ReadInteger32(1)));
+      }
+    }
+
+    {
+      DatabaseManager::CachedStatement dropTemporaryTable(
+        STATEMENT_FROM_HERE, manager,
+        "DROP TEMPORARY TABLE IF EXISTS DeletedResources");
+      dropTemporaryTable.Execute();
+    }
+
+    {
+      DatabaseManager::CachedStatement lookupResourcesToDelete(
+        STATEMENT_FROM_HERE, manager,
+        "CREATE TEMPORARY TABLE DeletedResources SELECT * FROM (SELECT internalId, resourceType, publicId FROM Resources WHERE internalId=${id} OR parentId=${id} OR parentId IN (SELECT internalId FROM Resources WHERE parentId=${id}) OR parentId IN (SELECT internalId FROM Resources WHERE parentId IN (SELECT internalId FROM Resources WHERE parentId=${id}))) AS t");
+      lookupResourcesToDelete.SetParameterType("id", ValueType_Integer64);
+
+      Dictionary args;
+      args.SetIntegerValue("id", id);
+      lookupResourcesToDelete.Execute(args);
     }
 
     {
       DatabaseManager::CachedStatement deleteHierarchy(
         STATEMENT_FROM_HERE, manager,
-        "DELETE FROM Resources WHERE internalId IN (SELECT * FROM (SELECT internalId FROM Resources WHERE internalId=${id} OR parentId=${id} OR parentId IN (SELECT internalId FROM Resources WHERE parentId=${id}) OR parentId IN (SELECT internalId FROM Resources WHERE parentId IN (SELECT internalId FROM Resources WHERE parentId=${id}))) as t);");
-      
-      deleteHierarchy.SetParameterType("id", ValueType_Integer64);
-      
-      Dictionary args;
-      args.SetIntegerValue("id", id);
-    
-      deleteHierarchy.Execute(args);
+        "DELETE FROM Resources WHERE internalId IN (SELECT internalId FROM DeletedResources)");
+      deleteHierarchy.Execute();
     }
 
+    SignalDeletedResources(output, manager);
     SignalDeletedFiles(output, manager);
   }