comparison Framework/Plugins/DatabaseBackendAdapterV4.cpp @ 377:02fe4606f5e4 db-protobuf

simplification
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 29 Mar 2023 07:57:49 +0200
parents 59bba5fbb425
children 9db9e0275ec0
comparison
equal deleted inserted replaced
376:59bba5fbb425 377:02fe4606f5e4
91 91
92 92
93 class Output : public IDatabaseBackendOutput 93 class Output : public IDatabaseBackendOutput
94 { 94 {
95 private: 95 private:
96 Orthanc::DatabasePluginMessages::DeleteAttachment::Response* deleteAttachment_; 96 Orthanc::DatabasePluginMessages::DeleteAttachment::Response* deleteAttachment_;
97 Orthanc::DatabasePluginMessages::DeleteResource::Response* deleteResource_; 97 Orthanc::DatabasePluginMessages::DeleteResource::Response* deleteResource_;
98 Orthanc::DatabasePluginMessages::GetChanges::Response* getChanges_; 98 Orthanc::DatabasePluginMessages::GetChanges::Response* getChanges_;
99 Orthanc::DatabasePluginMessages::GetExportedResources::Response* getExportedResources_; 99 Orthanc::DatabasePluginMessages::GetExportedResources::Response* getExportedResources_;
100 Orthanc::DatabasePluginMessages::GetLastChange::Response* getLastChange_; 100 Orthanc::DatabasePluginMessages::GetLastChange::Response* getLastChange_;
101 Orthanc::DatabasePluginMessages::GetLastExportedResource::Response* getLastExportedResource_;
102 Orthanc::DatabasePluginMessages::GetMainDicomTags::Response* getMainDicomTags_;
101 103
102 void Clear() 104 void Clear()
103 { 105 {
104 deleteAttachment_ = NULL; 106 deleteAttachment_ = NULL;
105 deleteResource_ = NULL; 107 deleteResource_ = NULL;
106 getChanges_ = NULL; 108 getChanges_ = NULL;
107 getExportedResources_ = NULL; 109 getExportedResources_ = NULL;
108 getLastChange_ = NULL; 110 getLastChange_ = NULL;
111 getLastExportedResource_ = NULL;
109 } 112 }
110 113
111 public: 114 public:
112 Output(Orthanc::DatabasePluginMessages::DeleteAttachment::Response& deleteAttachment) 115 Output(Orthanc::DatabasePluginMessages::DeleteAttachment::Response& deleteAttachment)
113 { 116 {
135 138
136 Output(Orthanc::DatabasePluginMessages::GetLastChange::Response& getLastChange) 139 Output(Orthanc::DatabasePluginMessages::GetLastChange::Response& getLastChange)
137 { 140 {
138 Clear(); 141 Clear();
139 getLastChange_ = &getLastChange; 142 getLastChange_ = &getLastChange;
143 }
144
145 Output(Orthanc::DatabasePluginMessages::GetLastExportedResource::Response& getLastExportedResource)
146 {
147 Clear();
148 getLastExportedResource_ = &getLastExportedResource;
149 }
150
151 Output(Orthanc::DatabasePluginMessages::GetMainDicomTags::Response& getMainDicomTags)
152 {
153 Clear();
154 getMainDicomTags_ = &getMainDicomTags;
140 } 155 }
141 156
142 virtual void SignalDeletedAttachment(const std::string& uuid, 157 virtual void SignalDeletedAttachment(const std::string& uuid,
143 int32_t contentType, 158 int32_t contentType,
144 uint64_t uncompressedSize, 159 uint64_t uncompressedSize,
260 275
261 virtual void AnswerDicomTag(uint16_t group, 276 virtual void AnswerDicomTag(uint16_t group,
262 uint16_t element, 277 uint16_t element,
263 const std::string& value) ORTHANC_OVERRIDE 278 const std::string& value) ORTHANC_OVERRIDE
264 { 279 {
265 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); 280 if (getMainDicomTags_ != NULL)
281 {
282 Orthanc::DatabasePluginMessages::GetMainDicomTags_Response_Tag* tag = getMainDicomTags_->add_tags();
283 tag->set_key((static_cast<uint32_t>(group) << 16) + static_cast<uint32_t>(element));
284 tag->set_value(value);
285 }
286 else
287 {
288 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
289 }
266 } 290 }
267 291
268 virtual void AnswerExportedResource(int64_t seq, 292 virtual void AnswerExportedResource(int64_t seq,
269 OrthancPluginResourceType resourceType, 293 OrthancPluginResourceType resourceType,
270 const std::string& publicId, 294 const std::string& publicId,
273 const std::string& patientId, 297 const std::string& patientId,
274 const std::string& studyInstanceUid, 298 const std::string& studyInstanceUid,
275 const std::string& seriesInstanceUid, 299 const std::string& seriesInstanceUid,
276 const std::string& sopInstanceUid) ORTHANC_OVERRIDE 300 const std::string& sopInstanceUid) ORTHANC_OVERRIDE
277 { 301 {
302 Orthanc::DatabasePluginMessages::ExportedResource* resource;
303
278 if (getExportedResources_ != NULL) 304 if (getExportedResources_ != NULL)
279 { 305 {
280 Orthanc::DatabasePluginMessages::ExportedResource* resource = getExportedResources_->add_resources(); 306 resource = getExportedResources_->add_resources();
281 resource->set_seq(seq); 307 }
282 resource->set_resource_type(Convert(resourceType)); 308 else if (getLastExportedResource_ != NULL)
283 resource->set_public_id(publicId); 309 {
284 resource->set_modality(modality); 310 if (getLastExportedResource_->exists())
285 resource->set_date(date); 311 {
286 resource->set_patient_id(patientId); 312 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
287 resource->set_study_instance_uid(studyInstanceUid); 313 }
288 resource->set_series_instance_uid(seriesInstanceUid); 314
289 resource->set_sop_instance_uid(sopInstanceUid); 315 getLastExportedResource_->set_exists(true);
316 resource = getLastExportedResource_->mutable_resource();
290 } 317 }
291 else 318 else
292 { 319 {
293 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); 320 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
294 } 321 }
322
323 resource->set_seq(seq);
324 resource->set_resource_type(Convert(resourceType));
325 resource->set_public_id(publicId);
326 resource->set_modality(modality);
327 resource->set_date(date);
328 resource->set_patient_id(patientId);
329 resource->set_study_instance_uid(studyInstanceUid);
330 resource->set_series_instance_uid(seriesInstanceUid);
331 resource->set_sop_instance_uid(sopInstanceUid);
295 } 332 }
296 333
297 virtual void AnswerMatchingResource(const std::string& resourceId) ORTHANC_OVERRIDE 334 virtual void AnswerMatchingResource(const std::string& resourceId) ORTHANC_OVERRIDE
298 { 335 {
299 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); 336 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
377 } 414 }
378 415
379 416
380 static void ProcessTransactionOperation(Orthanc::DatabasePluginMessages::TransactionResponse& response, 417 static void ProcessTransactionOperation(Orthanc::DatabasePluginMessages::TransactionResponse& response,
381 const Orthanc::DatabasePluginMessages::TransactionRequest& request, 418 const Orthanc::DatabasePluginMessages::TransactionRequest& request,
382 IndexConnectionsPool::Accessor& transaction) 419 IndexBackend& backend,
420 DatabaseManager& manager)
383 { 421 {
384 switch (request.operation()) 422 switch (request.operation())
385 { 423 {
386 case Orthanc::DatabasePluginMessages::OPERATION_ROLLBACK: 424 case Orthanc::DatabasePluginMessages::OPERATION_ROLLBACK:
387 { 425 {
388 transaction.GetManager().RollbackTransaction(); 426 manager.RollbackTransaction();
389 break; 427 break;
390 } 428 }
391 429
392 case Orthanc::DatabasePluginMessages::OPERATION_COMMIT: 430 case Orthanc::DatabasePluginMessages::OPERATION_COMMIT:
393 { 431 {
394 transaction.GetManager().CommitTransaction(); 432 manager.CommitTransaction();
395 break; 433 break;
396 } 434 }
397 435
398 case Orthanc::DatabasePluginMessages::OPERATION_ADD_ATTACHMENT: 436 case Orthanc::DatabasePluginMessages::OPERATION_ADD_ATTACHMENT:
399 { 437 {
404 attachment.uncompressedHash = request.add_attachment().attachment().uncompressed_hash().c_str(); 442 attachment.uncompressedHash = request.add_attachment().attachment().uncompressed_hash().c_str();
405 attachment.compressionType = request.add_attachment().attachment().compression_type(); 443 attachment.compressionType = request.add_attachment().attachment().compression_type();
406 attachment.compressedSize = request.add_attachment().attachment().compressed_size(); 444 attachment.compressedSize = request.add_attachment().attachment().compressed_size();
407 attachment.compressedHash = request.add_attachment().attachment().compressed_hash().c_str(); 445 attachment.compressedHash = request.add_attachment().attachment().compressed_hash().c_str();
408 446
409 transaction.GetBackend().AddAttachment(transaction.GetManager(), request.add_attachment().id(), attachment, 447 backend.AddAttachment(manager, request.add_attachment().id(), attachment, request.add_attachment().revision());
410 request.add_attachment().revision());
411 break; 448 break;
412 } 449 }
413 450
414 case Orthanc::DatabasePluginMessages::OPERATION_CLEAR_CHANGES: 451 case Orthanc::DatabasePluginMessages::OPERATION_CLEAR_CHANGES:
415 { 452 {
416 transaction.GetBackend().ClearChanges(transaction.GetManager()); 453 backend.ClearChanges(manager);
417 break; 454 break;
418 } 455 }
419 456
420 case Orthanc::DatabasePluginMessages::OPERATION_CLEAR_EXPORTED_RESOURCES: 457 case Orthanc::DatabasePluginMessages::OPERATION_CLEAR_EXPORTED_RESOURCES:
421 { 458 {
422 transaction.GetBackend().ClearExportedResources(transaction.GetManager()); 459 backend.ClearExportedResources(manager);
423 break; 460 break;
424 } 461 }
425 462
426 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_ATTACHMENT: 463 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_ATTACHMENT:
427 { 464 {
428 Output output(*response.mutable_delete_attachment()); 465 Output output(*response.mutable_delete_attachment());
429 transaction.GetBackend().DeleteAttachment( 466 backend.DeleteAttachment(output, manager, request.delete_attachment().id(), request.delete_attachment().type());
430 output, transaction.GetManager(), request.delete_attachment().id(), request.delete_attachment().type());
431 break; 467 break;
432 } 468 }
433 469
434 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_METADATA: 470 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_METADATA:
435 { 471 {
436 transaction.GetBackend().DeleteMetadata( 472 backend.DeleteMetadata(manager, request.delete_metadata().id(), request.delete_metadata().type());
437 transaction.GetManager(), request.delete_metadata().id(), request.delete_metadata().type());
438 break; 473 break;
439 } 474 }
440 475
441 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_RESOURCE: 476 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_RESOURCE:
442 { 477 {
443 response.mutable_delete_resource()->set_is_remaining_ancestor(false); 478 response.mutable_delete_resource()->set_is_remaining_ancestor(false);
444 479
445 Output output(*response.mutable_delete_resource()); 480 Output output(*response.mutable_delete_resource());
446 transaction.GetBackend().DeleteResource(output, transaction.GetManager(), request.delete_resource().id()); 481 backend.DeleteResource(output, manager, request.delete_resource().id());
447 break; 482 break;
448 } 483 }
449 484
450 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_METADATA: 485 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_METADATA:
451 { 486 {
452 typedef std::map<int32_t, std::string> Values; 487 typedef std::map<int32_t, std::string> Values;
453 488
454 Values values; 489 Values values;
455 transaction.GetBackend().GetAllMetadata(values, transaction.GetManager(), request.get_all_metadata().id()); 490 backend.GetAllMetadata(values, manager, request.get_all_metadata().id());
456 491
457 for (Values::const_iterator it = values.begin(); it != values.end(); ++it) 492 for (Values::const_iterator it = values.begin(); it != values.end(); ++it)
458 { 493 {
459 Orthanc::DatabasePluginMessages::GetAllMetadata_Response_Metadata* metadata = response.mutable_get_all_metadata()->add_metadata(); 494 Orthanc::DatabasePluginMessages::GetAllMetadata_Response_Metadata* metadata =
495 response.mutable_get_all_metadata()->add_metadata();
460 metadata->set_type(it->first); 496 metadata->set_type(it->first);
461 metadata->set_value(it->second); 497 metadata->set_value(it->second);
462 } 498 }
463 499
464 break; 500 break;
465 } 501 }
466 502
467 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_PUBLIC_IDS: 503 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_PUBLIC_IDS:
468 { 504 {
469 std::list<std::string> values; 505 std::list<std::string> values;
470 transaction.GetBackend().GetAllPublicIds(values, transaction.GetManager(), Convert(request.get_all_public_ids().resource_type())); 506 backend.GetAllPublicIds(values, manager, Convert(request.get_all_public_ids().resource_type()));
471 507
472 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) 508 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it)
473 { 509 {
474 response.mutable_get_all_public_ids()->add_ids(*it); 510 response.mutable_get_all_public_ids()->add_ids(*it);
475 } 511 }
478 } 514 }
479 515
480 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_PUBLIC_IDS_WITH_LIMITS: 516 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_PUBLIC_IDS_WITH_LIMITS:
481 { 517 {
482 std::list<std::string> values; 518 std::list<std::string> values;
483 transaction.GetBackend().GetAllPublicIds(values, transaction.GetManager(), 519 backend.GetAllPublicIds(values, manager, Convert(request.get_all_public_ids_with_limits().resource_type()),
484 Convert(request.get_all_public_ids_with_limits().resource_type()), 520 request.get_all_public_ids_with_limits().since(),
485 request.get_all_public_ids_with_limits().since(), 521 request.get_all_public_ids_with_limits().limit());
486 request.get_all_public_ids_with_limits().limit());
487 522
488 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) 523 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it)
489 { 524 {
490 response.mutable_get_all_public_ids_with_limits()->add_ids(*it); 525 response.mutable_get_all_public_ids_with_limits()->add_ids(*it);
491 } 526 }
496 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHANGES: 531 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHANGES:
497 { 532 {
498 Output output(*response.mutable_get_changes()); 533 Output output(*response.mutable_get_changes());
499 534
500 bool done; 535 bool done;
501 transaction.GetBackend().GetChanges(output, done, transaction.GetManager(), 536 backend.GetChanges(output, done, manager, request.get_changes().since(), request.get_changes().limit());
502 request.get_changes().since(),
503 request.get_changes().limit());
504 537
505 response.mutable_get_changes()->set_done(done); 538 response.mutable_get_changes()->set_done(done);
506 break; 539 break;
507 } 540 }
508 541
509 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHILDREN_INTERNAL_ID: 542 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHILDREN_INTERNAL_ID:
510 { 543 {
511 std::list<int64_t> values; 544 std::list<int64_t> values;
512 transaction.GetBackend().GetChildrenInternalId(values, transaction.GetManager(), request.get_children_internal_id().id()); 545 backend.GetChildrenInternalId(values, manager, request.get_children_internal_id().id());
513 546
514 for (std::list<int64_t>::const_iterator it = values.begin(); it != values.end(); ++it) 547 for (std::list<int64_t>::const_iterator it = values.begin(); it != values.end(); ++it)
515 { 548 {
516 response.mutable_get_children_internal_id()->add_ids(*it); 549 response.mutable_get_children_internal_id()->add_ids(*it);
517 } 550 }
520 } 553 }
521 554
522 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHILDREN_PUBLIC_ID: 555 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHILDREN_PUBLIC_ID:
523 { 556 {
524 std::list<std::string> values; 557 std::list<std::string> values;
525 transaction.GetBackend().GetChildrenPublicId(values, transaction.GetManager(), request.get_children_public_id().id()); 558 backend.GetChildrenPublicId(values, manager, request.get_children_public_id().id());
526 559
527 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) 560 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it)
528 { 561 {
529 response.mutable_get_children_public_id()->add_ids(*it); 562 response.mutable_get_children_public_id()->add_ids(*it);
530 } 563 }
535 case Orthanc::DatabasePluginMessages::OPERATION_GET_EXPORTED_RESOURCES: 568 case Orthanc::DatabasePluginMessages::OPERATION_GET_EXPORTED_RESOURCES:
536 { 569 {
537 Output output(*response.mutable_get_exported_resources()); 570 Output output(*response.mutable_get_exported_resources());
538 571
539 bool done; 572 bool done;
540 transaction.GetBackend().GetExportedResources(output, done, transaction.GetManager(), 573 backend.GetExportedResources(output, done, manager, request.get_exported_resources().since(),
541 request.get_exported_resources().since(), 574 request.get_exported_resources().limit());
542 request.get_exported_resources().limit());
543 575
544 response.mutable_get_exported_resources()->set_done(done); 576 response.mutable_get_exported_resources()->set_done(done);
545 break; 577 break;
546 } 578 }
547 579
548 case Orthanc::DatabasePluginMessages::OPERATION_GET_LAST_CHANGE: 580 case Orthanc::DatabasePluginMessages::OPERATION_GET_LAST_CHANGE:
549 { 581 {
550 response.mutable_get_last_change()->set_exists(false); 582 response.mutable_get_last_change()->set_exists(false);
551 583
552 Output output(*response.mutable_get_last_change()); 584 Output output(*response.mutable_get_last_change());
553 transaction.GetBackend().GetLastChange(output, transaction.GetManager()); 585 backend.GetLastChange(output, manager);
554 break; 586 break;
555 } 587 }
556 588
589 case Orthanc::DatabasePluginMessages::OPERATION_GET_LAST_EXPORTED_RESOURCE:
590 {
591 response.mutable_get_last_exported_resource()->set_exists(false);
592
593 Output output(*response.mutable_get_last_exported_resource());
594 backend.GetLastExportedResource(output, manager);
595 break;
596 }
597
598 case Orthanc::DatabasePluginMessages::OPERATION_GET_MAIN_DICOM_TAGS:
599 {
600 Output output(*response.mutable_get_main_dicom_tags());
601 backend.GetMainDicomTags(output, manager, request.get_main_dicom_tags().id());
602 break;
603 }
604
605 case Orthanc::DatabasePluginMessages::OPERATION_GET_PUBLIC_ID:
606 {
607 const std::string id = backend.GetPublicId(manager, request.get_public_id().id());
608 response.mutable_get_public_id()->set_id(id);
609 break;
610 }
611
612 case Orthanc::DatabasePluginMessages::OPERATION_GET_RESOURCES_COUNT:
613 {
614 OrthancPluginResourceType type = Convert(request.get_resources_count().type());
615 uint64_t count = backend.GetResourcesCount(manager, type);
616 response.mutable_get_resources_count()->set_count(count);
617 break;
618 }
619
620 case Orthanc::DatabasePluginMessages::OPERATION_GET_RESOURCE_TYPE:
621 {
622 OrthancPluginResourceType type = backend.GetResourceType(manager, request.get_public_id().id());
623 response.mutable_get_resource_type()->set_type(Convert(type));
624 break;
625 }
626
627 case Orthanc::DatabasePluginMessages::OPERATION_GET_TOTAL_COMPRESSED_SIZE:
628 {
629 response.mutable_get_total_compressed_size()->set_size(backend.GetTotalCompressedSize(manager));
630 break;
631 }
632
633 case Orthanc::DatabasePluginMessages::OPERATION_GET_TOTAL_UNCOMPRESSED_SIZE:
634 {
635 response.mutable_get_total_uncompressed_size()->set_size(backend.GetTotalUncompressedSize(manager));
636 break;
637 }
638
557 default: 639 default:
558 LOG(ERROR) << "Not implemented transaction operation from protobuf: " << request.operation(); 640 LOG(ERROR) << "Not implemented transaction operation from protobuf: " << request.operation();
559 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); 641 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
560 } 642 }
561 } 643 }
592 break; 674 break;
593 675
594 case Orthanc::DatabasePluginMessages::REQUEST_TRANSACTION: 676 case Orthanc::DatabasePluginMessages::REQUEST_TRANSACTION:
595 { 677 {
596 IndexConnectionsPool::Accessor& transaction = *reinterpret_cast<IndexConnectionsPool::Accessor*>(request.transaction_request().transaction()); 678 IndexConnectionsPool::Accessor& transaction = *reinterpret_cast<IndexConnectionsPool::Accessor*>(request.transaction_request().transaction());
597 ProcessTransactionOperation(*response.mutable_transaction_response(), request.transaction_request(), transaction); 679 ProcessTransactionOperation(*response.mutable_transaction_response(), request.transaction_request(),
680 transaction.GetBackend(), transaction.GetManager());
598 break; 681 break;
599 } 682 }
600 683
601 default: 684 default:
602 LOG(ERROR) << "Not implemented request type from protobuf: " << request.type(); 685 LOG(ERROR) << "Not implemented request type from protobuf: " << request.type();