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)