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;