Mercurial > hg > orthanc-databases
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); }