Mercurial > hg > orthanc
changeset 7159:c5e867a181e9 default tip
fix storage commitment triggered by c-store
| author | Alain Mazy <am@orthanc.team> |
|---|---|
| date | Fri, 25 Sep 2026 16:07:31 +0200 |
| parents | be63ecbe0bca |
| children | |
| files | OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.h OrthancServer/Sources/StorageCommitmentReports.cpp OrthancServer/Sources/StorageCommitmentReports.h |
| diffstat | 5 files changed, 25 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/OrthancRestApi/OrthancRestModalities.cpp Fri Sep 25 16:07:31 2026 +0200 @@ -2395,7 +2395,7 @@ } else { - std::list<std::string> sopClassUids, sopInstanceUids; + std::vector<std::string> sopClassUids, sopInstanceUids; if (json.isMember(ORTHANC_RESOURCES)) { @@ -2523,17 +2523,7 @@ // Create a "pending" storage commitment report BEFORE the // actual SCU call in order to avoid race conditions std::unique_ptr<StorageCommitmentReports::Report> request(new StorageCommitmentReports::Report(remoteAet)); - - std::list<std::string>::const_iterator itInstanceUid = sopInstanceUids.begin(); - std::list<std::string>::const_iterator itClassUid = sopClassUids.begin(); - - while (itInstanceUid != sopInstanceUids.end() && itClassUid != sopClassUids.end()) - { - request->AddRequestedInstance(*itClassUid, *itInstanceUid); - - ++itInstanceUid; - ++itClassUid; - } + request->AddRequestedInstances(sopClassUids, sopInstanceUids); context.GetStorageCommitmentReports().Store( transactionUid, request.release()); @@ -2543,7 +2533,7 @@ std::vector<std::string> a(sopClassUids.begin(), sopClassUids.end()); std::vector<std::string> b(sopInstanceUids.begin(), sopInstanceUids.end()); - DicomAssociation::RequestStorageCommitment(parameters, transactionUid, a, b); + DicomAssociation::RequestStorageCommitment(parameters, transactionUid, sopClassUids, sopInstanceUids); } Json::Value result = Json::objectValue;
--- a/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.cpp Fri Sep 25 16:07:31 2026 +0200 @@ -91,13 +91,12 @@ // Create a "pending" storage commitment report BEFORE the // actual SCU call in order to avoid race conditions - context_.GetStorageCommitmentReports().Store( - transactionUid_, new StorageCommitmentReports::Report(remoteAet)); + std::unique_ptr<StorageCommitmentReports::Report> request(new StorageCommitmentReports::Report(remoteAet)); + request->AddRequestedInstances(sopClassUids_, sopInstanceUids_); + + context_.GetStorageCommitmentReports().Store(transactionUid_, request.release()); - std::vector<std::string> a(sopClassUids_.begin(), sopClassUids_.end()); - std::vector<std::string> b(sopInstanceUids_.begin(), sopInstanceUids_.end()); - - DicomAssociation::RequestStorageCommitment(parameters_, transactionUid_, a, b); + DicomAssociation::RequestStorageCommitment(parameters_, transactionUid_, sopClassUids_, sopInstanceUids_); } }
--- a/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.h Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/ServerJobs/DicomModalityStoreJob.h Fri Sep 25 16:07:31 2026 +0200 @@ -44,8 +44,8 @@ // For storage commitment std::string transactionUid_; - std::list<std::string> sopInstanceUids_; - std::list<std::string> sopClassUids_; + std::vector<std::string> sopInstanceUids_; + std::vector<std::string> sopClassUids_; void OpenConnection();
--- a/OrthancServer/Sources/StorageCommitmentReports.cpp Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/StorageCommitmentReports.cpp Fri Sep 25 16:07:31 2026 +0200 @@ -41,15 +41,24 @@ } } - void StorageCommitmentReports::Report::AddRequestedInstance(const std::string& sopClassUid, - const std::string& sopInstanceUid) + void StorageCommitmentReports::Report::AddRequestedInstances(const std::vector<std::string>& sopClassesUids, + const std::vector<std::string>& sopInstancesUids) { if (isComplete_) { throw OrthancException(ErrorCode_BadSequenceOfCalls); } - requetsedInstances_[sopInstanceUid] = sopClassUid; + if (sopClassesUids.size() != sopInstancesUids.size()) + { + throw OrthancException(ErrorCode_InternalError, "SOPClassesUIDs & SOPInstancesUIDs size mismatch"); + } + + for (size_t i = 0; i < sopClassesUids.size(); ++i) + { + requetsedInstances_[sopInstancesUids[i]] = sopClassesUids[i]; + } + } @@ -75,7 +84,7 @@ { if (isComplete_) { - throw OrthancException(ErrorCode_BadSequenceOfCalls); + THROW_WITH_FILE_AND_LINE_INFO(ErrorCode_BadSequenceOfCalls); } else {
--- a/OrthancServer/Sources/StorageCommitmentReports.h Thu Sep 24 17:22:41 2026 +0200 +++ b/OrthancServer/Sources/StorageCommitmentReports.h Fri Sep 25 16:07:31 2026 +0200 @@ -78,8 +78,8 @@ void MarkAsComplete(); - void AddRequestedInstance(const std::string& sopClassUid, - const std::string& sopInstanceUid); + void AddRequestedInstances(const std::vector<std::string>& sopClassesUids, + const std::vector<std::string>& sopInstancesUids); void AddSuccess(const std::string& sopClassUid, const std::string& sopInstanceUid);
