Mercurial > hg > orthanc
comparison OrthancServer/Sources/ServerContext.cpp @ 5427:111e21b4f8bc
fix transcoded instance caching
author | Alain Mazy <am@osimis.io> |
---|---|
date | Fri, 17 Nov 2023 08:22:17 +0100 |
parents | c65e036d649b |
children | 4be5f117aa0d |
comparison
equal
deleted
inserted
replaced
5426:c65e036d649b | 5427:111e21b4f8bc |
---|---|
1163 ReadDicomAsJson(result, instancePublicId, ignoreTagLength); | 1163 ReadDicomAsJson(result, instancePublicId, ignoreTagLength); |
1164 } | 1164 } |
1165 | 1165 |
1166 | 1166 |
1167 void ServerContext::ReadDicom(std::string& dicom, | 1167 void ServerContext::ReadDicom(std::string& dicom, |
1168 std::string& attachmentId, | |
1168 const std::string& instancePublicId) | 1169 const std::string& instancePublicId) |
1169 { | 1170 { |
1170 int64_t revision; | 1171 int64_t revision; |
1171 ReadAttachment(dicom, revision, instancePublicId, FileContentType_Dicom, true /* uncompress */); | 1172 ReadAttachment(dicom, revision, attachmentId, instancePublicId, FileContentType_Dicom, true /* uncompress */); |
1173 } | |
1174 | |
1175 | |
1176 void ServerContext::ReadDicom(std::string& dicom, | |
1177 const std::string& instancePublicId) | |
1178 { | |
1179 std::string attachmentId; | |
1180 ReadDicom(dicom, attachmentId, instancePublicId); | |
1172 } | 1181 } |
1173 | 1182 |
1174 void ServerContext::ReadDicomForHeader(std::string& dicom, | 1183 void ServerContext::ReadDicomForHeader(std::string& dicom, |
1175 const std::string& instancePublicId) | 1184 const std::string& instancePublicId) |
1176 { | 1185 { |
1234 } | 1243 } |
1235 | 1244 |
1236 | 1245 |
1237 void ServerContext::ReadAttachment(std::string& result, | 1246 void ServerContext::ReadAttachment(std::string& result, |
1238 int64_t& revision, | 1247 int64_t& revision, |
1248 std::string& attachmentId, | |
1239 const std::string& instancePublicId, | 1249 const std::string& instancePublicId, |
1240 FileContentType content, | 1250 FileContentType content, |
1241 bool uncompressIfNeeded, | 1251 bool uncompressIfNeeded, |
1242 bool skipCache) | 1252 bool skipCache) |
1243 { | 1253 { |
1248 "Unable to read attachment " + EnumerationToString(content) + | 1258 "Unable to read attachment " + EnumerationToString(content) + |
1249 " of instance " + instancePublicId); | 1259 " of instance " + instancePublicId); |
1250 } | 1260 } |
1251 | 1261 |
1252 assert(attachment.GetContentType() == content); | 1262 assert(attachment.GetContentType() == content); |
1253 | 1263 attachmentId = attachment.GetUuid(); |
1264 | |
1254 { | 1265 { |
1255 std::unique_ptr<StorageAccessor> accessor; | 1266 std::unique_ptr<StorageAccessor> accessor; |
1256 | 1267 |
1257 if (skipCache) | 1268 if (skipCache) |
1258 { | 1269 { |
1949 | 1960 |
1950 | 1961 |
1951 bool ServerContext::TranscodeWithCache(std::string& target, | 1962 bool ServerContext::TranscodeWithCache(std::string& target, |
1952 const std::string& source, | 1963 const std::string& source, |
1953 const std::string& sourceInstanceId, | 1964 const std::string& sourceInstanceId, |
1965 const std::string& attachmentId, | |
1954 DicomTransferSyntax targetSyntax) | 1966 DicomTransferSyntax targetSyntax) |
1955 { | 1967 { |
1956 StorageCache::Accessor cacheAccessor(storageCache_); | 1968 StorageCache::Accessor cacheAccessor(storageCache_); |
1957 | 1969 |
1958 if (!cacheAccessor.FetchTranscodedInstance(target, sourceInstanceId, targetSyntax)) | 1970 if (!cacheAccessor.FetchTranscodedInstance(target, attachmentId, targetSyntax)) |
1959 { | 1971 { |
1960 IDicomTranscoder::DicomImage sourceDicom; | 1972 IDicomTranscoder::DicomImage sourceDicom; |
1961 sourceDicom.SetExternalBuffer(source); | 1973 sourceDicom.SetExternalBuffer(source); |
1962 | 1974 |
1963 IDicomTranscoder::DicomImage targetDicom; | 1975 IDicomTranscoder::DicomImage targetDicom; |
1964 std::set<DicomTransferSyntax> syntaxes; | 1976 std::set<DicomTransferSyntax> syntaxes; |
1965 syntaxes.insert(targetSyntax); | 1977 syntaxes.insert(targetSyntax); |
1966 | 1978 |
1967 if (Transcode(targetDicom, sourceDicom, syntaxes, true)) | 1979 if (Transcode(targetDicom, sourceDicom, syntaxes, true)) |
1968 { | 1980 { |
1969 cacheAccessor.AddTranscodedInstance(sourceInstanceId, targetSyntax, reinterpret_cast<const char*>(targetDicom.GetBufferData()), targetDicom.GetBufferSize()); | 1981 cacheAccessor.AddTranscodedInstance(attachmentId, targetSyntax, reinterpret_cast<const char*>(targetDicom.GetBufferData()), targetDicom.GetBufferSize()); |
1970 target = std::string(reinterpret_cast<const char*>(targetDicom.GetBufferData()), targetDicom.GetBufferSize()); | 1982 target = std::string(reinterpret_cast<const char*>(targetDicom.GetBufferData()), targetDicom.GetBufferSize()); |
1971 return true; | 1983 return true; |
1972 } | 1984 } |
1973 | 1985 |
1974 return false; | 1986 return false; |