Mercurial > hg > orthanc-databases
comparison 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 |
comparison
equal
deleted
inserted
replaced
306:544e0c943b40 | 307:8de3a1ecac11 |
---|---|
365 | 365 |
366 bool done = false; | 366 bool done = false; |
367 | 367 |
368 while (!done) | 368 while (!done) |
369 { | 369 { |
370 bool hasSibling = false; | |
371 int64_t parentId; | |
372 | |
370 { | 373 { |
371 DatabaseManager::CachedStatement lookupSiblings( | 374 DatabaseManager::CachedStatement lookupSiblings( |
372 STATEMENT_FROM_HERE, manager, | 375 STATEMENT_FROM_HERE, manager, |
373 "SELECT parentId FROM Resources " | 376 "SELECT parentId FROM Resources " |
374 "WHERE parentId = (SELECT parentId FROM Resources WHERE internalId=${id});"); | 377 "WHERE parentId = (SELECT parentId FROM Resources WHERE internalId=${id});"); |
385 // "id" is a root node | 388 // "id" is a root node |
386 done = true; | 389 done = true; |
387 } | 390 } |
388 else | 391 else |
389 { | 392 { |
390 int64_t parentId = lookupSiblings.ReadInteger64(0); | 393 parentId = lookupSiblings.ReadInteger64(0); |
391 lookupSiblings.Next(); | 394 lookupSiblings.Next(); |
392 | 395 |
393 if (lookupSiblings.IsDone()) | 396 if (lookupSiblings.IsDone()) |
394 { | 397 { |
395 // "id" has no sibling node, recursively remove | 398 // "id" has no sibling node, recursively remove |
398 } | 401 } |
399 else | 402 else |
400 { | 403 { |
401 // "id" has at least one sibling node: the parent node is the remaining ancestor | 404 // "id" has at least one sibling node: the parent node is the remaining ancestor |
402 done = true; | 405 done = true; |
403 | 406 hasSibling = true; |
404 DatabaseManager::CachedStatement parent( | |
405 STATEMENT_FROM_HERE, manager, | |
406 "SELECT publicId, resourceType FROM Resources WHERE internalId=${id};"); | |
407 | |
408 parent.SetParameterType("id", ValueType_Integer64); | |
409 | |
410 Dictionary args2; | |
411 args2.SetIntegerValue("id", parentId); | |
412 | |
413 parent.Execute(args2); | |
414 | |
415 output.SignalRemainingAncestor( | |
416 parent.ReadString(0), | |
417 static_cast<OrthancPluginResourceType>(parent.ReadInteger32(1))); | |
418 } | 407 } |
419 } | 408 } |
420 } | 409 } |
421 } | 410 |
422 | 411 if (hasSibling) |
423 { | 412 { |
424 DatabaseManager::CachedStatement deleteHierarchy( | 413 // This cannot be executed in the same scope as another |
425 STATEMENT_FROM_HERE, manager, | 414 // DatabaseManager::CachedStatement |
426 "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);"); | 415 |
427 | 416 DatabaseManager::CachedStatement parent( |
428 deleteHierarchy.SetParameterType("id", ValueType_Integer64); | 417 STATEMENT_FROM_HERE, manager, |
429 | 418 "SELECT publicId, resourceType FROM Resources WHERE internalId=${id};"); |
419 | |
420 parent.SetParameterType("id", ValueType_Integer64); | |
421 | |
422 Dictionary args2; | |
423 args2.SetIntegerValue("id", parentId); | |
424 | |
425 parent.Execute(args2); | |
426 | |
427 output.SignalRemainingAncestor( | |
428 parent.ReadString(0), | |
429 static_cast<OrthancPluginResourceType>(parent.ReadInteger32(1))); | |
430 } | |
431 } | |
432 | |
433 { | |
434 DatabaseManager::CachedStatement dropTemporaryTable( | |
435 STATEMENT_FROM_HERE, manager, | |
436 "DROP TEMPORARY TABLE IF EXISTS DeletedResources"); | |
437 dropTemporaryTable.Execute(); | |
438 } | |
439 | |
440 { | |
441 DatabaseManager::CachedStatement lookupResourcesToDelete( | |
442 STATEMENT_FROM_HERE, manager, | |
443 "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"); | |
444 lookupResourcesToDelete.SetParameterType("id", ValueType_Integer64); | |
445 | |
430 Dictionary args; | 446 Dictionary args; |
431 args.SetIntegerValue("id", id); | 447 args.SetIntegerValue("id", id); |
432 | 448 lookupResourcesToDelete.Execute(args); |
433 deleteHierarchy.Execute(args); | 449 } |
434 } | 450 |
435 | 451 { |
452 DatabaseManager::CachedStatement deleteHierarchy( | |
453 STATEMENT_FROM_HERE, manager, | |
454 "DELETE FROM Resources WHERE internalId IN (SELECT internalId FROM DeletedResources)"); | |
455 deleteHierarchy.Execute(); | |
456 } | |
457 | |
458 SignalDeletedResources(output, manager); | |
436 SignalDeletedFiles(output, manager); | 459 SignalDeletedFiles(output, manager); |
437 } | 460 } |
438 | 461 |
439 | 462 |
440 int64_t MySQLIndex::GetLastChangeIndex(DatabaseManager& manager) | 463 int64_t MySQLIndex::GetLastChangeIndex(DatabaseManager& manager) |