@@ -563,22 +563,21 @@ fun Application.main() {
563
563
}
564
564
}
565
565
566
- delete(" /${EVENT_ENTITY_API_NAME } " ) { // TODO batches to speed up
566
+ delete(" /${EVENT_ENTITY_API_NAME } " ) {
567
567
val roles = call.principal<WithRoles >()?.roles!!
568
568
if (! roles.isAdmin) {
569
569
call.respond(HttpStatusCode .Unauthorized , " Only user with Admin role can delete events" )
570
570
return @delete
571
571
}
572
572
var connEMD: Connection ? = null
573
- var deletedCount = 0
574
573
try {
575
574
// Here, we only care about reference to event, other event data is optional and is ignored, if passed
576
575
val events = call.receive<Array <EventReprForDelete >>()
577
576
connEMD = newEMDConnection(config, this .context)
578
577
connEMD!! .autoCommit = false
579
578
val storageMap = getStorageMap(connEMD!! )
579
+ val fileData = mutableMapOf<Pair <Byte , String >, Int > ()
580
580
events.forEach { event ->
581
- println (" Deleting event: $event " )
582
581
val storage_name = event.reference.storage_name
583
582
val storage_id = storageMap.str_to_id[storage_name]
584
583
if (storage_id == null ) {
@@ -589,35 +588,44 @@ fun Application.main() {
589
588
return @delete
590
589
}
591
590
val file_path = event.reference.file_path
592
- val file_guid: Int
593
- val res = connEMD!! .createStatement().executeQuery(
594
- """ SELECT file_guid FROM file_ WHERE storage_id = $storage_id AND file_path = '$file_path '"""
595
- )
596
- if (res.next()) {
597
- file_guid = res.getInt(" file_guid" )
598
- println (" File GUID = $file_guid " )
599
- } else { // no such file
600
- call.respond(
601
- HttpStatusCode .NotFound ,
602
- " Error: file_guid not found for event ${event.str()} "
591
+ if (Pair (storage_id, file_path) !in fileData) {
592
+ val res = connEMD!! .createStatement().executeQuery(
593
+ """ SELECT file_guid FROM file_ WHERE storage_id = $storage_id AND file_path = '$file_path '"""
603
594
)
604
- return @delete
595
+ if (res.next()) {
596
+ val file_guid: Int = res.getInt(" file_guid" )
597
+ println (" File GUID ($storage_id , $file_path ) = $file_guid " )
598
+ fileData[Pair (storage_id, file_path)] = file_guid
599
+ } else { // no such file
600
+ call.respond(
601
+ HttpStatusCode .NotFound ,
602
+ " Error: file_guid not found for event ${event.str()} "
603
+ )
604
+ return @delete
605
+ }
605
606
}
607
+ }
608
+ val stmt = connEMD!! .createStatement()
609
+ events.forEach { event ->
610
+ println (" Deleting event: $event " )
611
+ val storage_id = storageMap.str_to_id[event.reference.storage_name]
612
+ val file_guid = fileData[Pair (storage_id, event.reference.file_path)]
606
613
val query = """
607
614
DELETE FROM ${page.db_table_name}
608
615
WHERE (("file_guid" = $file_guid AND "event_number" = ${event.reference.event_number} ));
609
616
""" .trimIndent()
610
617
println (query)
611
- val intRes = connEMD!! .createStatement().executeUpdate(query)
612
- if (intRes == 1 ) {
613
- deletedCount++
614
- } else {
615
- call.respond(
616
- HttpStatusCode .NotFound ,
617
- " Error: event (${event.str()} ) not found"
618
- )
619
- return @delete
620
- }
618
+ stmt.addBatch(query)
619
+ }
620
+ val res = stmt.executeBatch()
621
+ val deletedCount = res.sum()
622
+ if (deletedCount != events.size) {
623
+ call.respond(
624
+ HttpStatusCode .NotFound ,
625
+ " Error: could not find some of the events to delete, aborting transaction.\n " +
626
+ " The first missing event was ${events[res.indexOfFirst { it == 0 }].str()} "
627
+ )
628
+ return @delete
621
629
}
622
630
connEMD!! .commit()
623
631
call.respond(HttpStatusCode .OK , " Success: $deletedCount event(s) were deleted" )
0 commit comments