Mercurial > hg > orthanc-databases
diff Framework/Plugins/IndexBackend.cpp @ 210:a0c095a4ba7d
all the integration tests pass on SQLite
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 22 Mar 2021 19:36:43 +0100 |
parents | 13a3863df7fa |
children | c2e4a909de0e |
line wrap: on
line diff
--- a/Framework/Plugins/IndexBackend.cpp Fri Mar 19 17:01:38 2021 +0100 +++ b/Framework/Plugins/IndexBackend.cpp Mon Mar 22 19:36:43 2021 +0100 @@ -2091,4 +2091,121 @@ } # endif #endif + + + void IndexBackend::CreateInstanceGeneric(OrthancPluginCreateInstanceResult& result, + const char* hashPatient, + const char* hashStudy, + const char* hashSeries, + const char* hashInstance) + { + // Check out "OrthancServer/Sources/Database/Compatibility/ICreateInstance.cpp" + + { + OrthancPluginResourceType type; + int64_t tmp; + + if (LookupResource(tmp, type, hashInstance)) + { + // The instance already exists + assert(type == OrthancPluginResourceType_Instance); + result.instanceId = tmp; + result.isNewInstance = false; + return; + } + } + + result.instanceId = CreateResource(hashInstance, OrthancPluginResourceType_Instance); + result.isNewInstance = true; + + result.isNewPatient = false; + result.isNewStudy = false; + result.isNewSeries = false; + result.patientId = -1; + result.studyId = -1; + result.seriesId = -1; + + // Detect up to which level the patient/study/series/instance + // hierarchy must be created + + { + OrthancPluginResourceType dummy; + + if (LookupResource(result.seriesId, dummy, hashSeries)) + { + assert(dummy == OrthancPluginResourceType_Series); + // The patient, the study and the series already exist + + bool ok = (LookupResource(result.patientId, dummy, hashPatient) && + LookupResource(result.studyId, dummy, hashStudy)); + (void) ok; // Remove warning about unused variable in release builds + assert(ok); + } + else if (LookupResource(result.studyId, dummy, hashStudy)) + { + assert(dummy == OrthancPluginResourceType_Study); + + // New series: The patient and the study already exist + result.isNewSeries = true; + + bool ok = LookupResource(result.patientId, dummy, hashPatient); + (void) ok; // Remove warning about unused variable in release builds + assert(ok); + } + else if (LookupResource(result.patientId, dummy, hashPatient)) + { + assert(dummy == OrthancPluginResourceType_Patient); + + // New study and series: The patient already exist + result.isNewStudy = true; + result.isNewSeries = true; + } + else + { + // New patient, study and series: Nothing exists + result.isNewPatient = true; + result.isNewStudy = true; + result.isNewSeries = true; + } + } + + // Create the series if needed + if (result.isNewSeries) + { + result.seriesId = CreateResource(hashSeries, OrthancPluginResourceType_Series); + } + + // Create the study if needed + if (result.isNewStudy) + { + result.studyId = CreateResource(hashStudy, OrthancPluginResourceType_Study); + } + + // Create the patient if needed + if (result.isNewPatient) + { + result.patientId = CreateResource(hashPatient, OrthancPluginResourceType_Patient); + } + + // Create the parent-to-child links + AttachChild(result.seriesId, result.instanceId); + + if (result.isNewSeries) + { + AttachChild(result.studyId, result.seriesId); + } + + if (result.isNewStudy) + { + AttachChild(result.patientId, result.studyId); + } + + TagMostRecentPatient(result.patientId); + + // Sanity checks + assert(result.patientId != -1); + assert(result.studyId != -1); + assert(result.seriesId != -1); + assert(result.instanceId != -1); + } }