1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
DROP PROCEDURE IF EXISTS CreateInstance;
CREATE PROCEDURE CreateInstance(
IN patient TEXT,
IN study TEXT,
IN series TEXT,
IN instance TEXT,
OUT isNewPatient BOOLEAN,
OUT isNewStudy BOOLEAN,
OUT isNewSeries BOOLEAN,
OUT isNewInstance BOOLEAN,
OUT patientKey BIGINT,
OUT studyKey BIGINT,
OUT seriesKey BIGINT,
OUT instanceKey BIGINT)
BEGIN
DECLARE recyclingSeq BIGINT@
SELECT internalId INTO instanceKey FROM Resources WHERE publicId = instance AND resourceType = 3@
IF NOT instanceKey IS NULL THEN
-- This instance already exists, stop here
SELECT 0 INTO isNewInstance@
ELSE
SELECT internalId INTO patientKey FROM Resources WHERE publicId = patient AND resourceType = 0@
SELECT internalId INTO studyKey FROM Resources WHERE publicId = study AND resourceType = 1@
SELECT internalId INTO seriesKey FROM Resources WHERE publicId = series AND resourceType = 2@
IF patientKey IS NULL THEN
-- Must create a new patient
IF NOT (studyKey IS NULL AND seriesKey IS NULL AND instanceKey IS NULL) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Broken invariant 1'@
END IF@
INSERT INTO Resources VALUES (DEFAULT, 0, patient, NULL)@
SELECT LAST_INSERT_ID() INTO patientKey@
SELECT 1 INTO isNewPatient@
ELSE
SELECT 0 INTO isNewPatient@
END IF@
IF patientKey IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Broken invariant 2'@
END IF@
IF studyKey IS NULL THEN
-- Must create a new study
IF NOT (seriesKey IS NULL AND instanceKey IS NULL) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Broken invariant 3'@
END IF@
INSERT INTO Resources VALUES (DEFAULT, 1, study, patientKey)@
SELECT LAST_INSERT_ID() INTO studyKey@
SELECT 1 INTO isNewStudy@
ELSE
SELECT 0 INTO isNewStudy@
END IF@
IF studyKey IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Broken invariant 4'@
END IF@
IF seriesKey IS NULL THEN
-- Must create a new series
IF NOT (instanceKey IS NULL) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Broken invariant 5'@
END IF@
INSERT INTO Resources VALUES (DEFAULT, 2, series, studyKey)@
SELECT LAST_INSERT_ID() INTO seriesKey@
SELECT 1 INTO isNewSeries@
ELSE
SELECT 0 INTO isNewSeries@
END IF@
IF (seriesKey IS NULL OR NOT instanceKey IS NULL) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Broken invariant 6'@
END IF@
INSERT INTO Resources VALUES (DEFAULT, 3, instance, seriesKey)@
SELECT LAST_INSERT_ID() INTO instanceKey@
SELECT 1 INTO isNewInstance@
-- Move the patient to the end of the recycling order
IF NOT isNewPatient THEN
SELECT seq FROM PatientRecyclingOrder WHERE patientId = patientKey INTO recyclingSeq@
IF NOT recyclingSeq IS NULL THEN
-- The patient is not protected
DELETE FROM PatientRecyclingOrder WHERE seq = recyclingSeq@
INSERT INTO PatientRecyclingOrder VALUES (DEFAULT, patientKey)@
END IF@
END IF@
END IF@
END;
|