diff MySQL/Plugins/MySQLIndex.cpp @ 424:95c413106a66 improve-delete

Introduced a procedure to delete resources (to be tested)
author Alain Mazy <am@osimis.io>
date Wed, 13 Sep 2023 13:32:54 +0200
parents 91124cc8a8c7
children f4244c7e2725
line wrap: on
line diff
--- a/MySQL/Plugins/MySQLIndex.cpp	Mon Aug 14 10:16:53 2023 +0200
+++ b/MySQL/Plugins/MySQLIndex.cpp	Wed Sep 13 13:32:54 2023 +0200
@@ -317,7 +317,27 @@
         t.Commit();
       }
 
-      if (revision != 7)
+      if (revision == 7)
+      {
+        DatabaseManager::Transaction t(manager, TransactionType_ReadWrite);
+        
+        // Install the "CreateInstance" extension
+        std::string query;
+        
+        Orthanc::EmbeddedResources::GetFileResource
+          (query, Orthanc::EmbeddedResources::MYSQL_DELETE_RESOURCES);
+
+        // Need to escape arobases: Don't use "t.GetDatabaseTransaction().ExecuteMultiLines()" here
+        db.ExecuteMultiLines(query, true);
+        
+        revision = 8;
+        SetGlobalIntegerProperty(manager, MISSING_SERVER_IDENTIFIER, Orthanc::GlobalProperty_DatabasePatchLevel, revision);
+
+        t.Commit();
+      }
+
+
+      if (revision != 8)
       {
         LOG(ERROR) << "MySQL plugin is incompatible with database schema revision: " << revision;
         throw Orthanc::OrthancException(Orthanc::ErrorCode_Database);        
@@ -453,29 +473,43 @@
       }
     }
 
-    {
-      DatabaseManager::CachedStatement dropTemporaryTable(
-        STATEMENT_FROM_HERE, manager,
-        "DROP TEMPORARY TABLE IF EXISTS DeletedResources");
-      dropTemporaryTable.Execute();
-    }
+    // {
+    //   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 internalId FROM DeletedResources)");
+    //   deleteHierarchy.Execute();
+    // }
+
 
     {
-      DatabaseManager::CachedStatement lookupResourcesToDelete(
+      DatabaseManager::CachedStatement deleteResources(
         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);
+        "CALL DeleteResources(${id})");
+
+      deleteResources.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 internalId FROM DeletedResources)");
-      deleteHierarchy.Execute();
+    
+      deleteResources.Execute(args);
     }
 
     SignalDeletedResources(output, manager);