comparison PostgreSQL/Plugins/SQL/Downgrades/V6.2ToV6.1.sql @ 448:f2427f94d879 pg-transactions

added downgrade script + renames version
author Alain Mazy <am@osimis.io>
date Wed, 17 Jan 2024 16:22:08 +0100
parents
children 392ac133a491
comparison
equal deleted inserted replaced
447:5881e4af5799 448:f2427f94d879
1 -- This file contains an SQL procedure to downgrade from schema 6.2 to 6.1 (version = 6, revision = 1).
2 -- It reinstalls all triggers and temporary tables that have been removed or replaced in 6.2
3
4 -- note: we don't not remove the unique constraints that have been added - they should not
5 -- create any issues.
6
7 -- these constraints were introduced in 6.2
8 ALTER TABLE Resources DROP CONSTRAINT UniquePublicId;
9 ALTER TABLE PatientRecyclingOrder DROP CONSTRAINT UniquePatientId;
10
11 -- the CreateInstance has been replaced in 6.2, reinstall the 6.1
12 DROP FUNCTION CreateInstance;
13 CREATE FUNCTION CreateInstance(
14 IN patient TEXT,
15 IN study TEXT,
16 IN series TEXT,
17 IN instance TEXT,
18 OUT isNewPatient BIGINT,
19 OUT isNewStudy BIGINT,
20 OUT isNewSeries BIGINT,
21 OUT isNewInstance BIGINT,
22 OUT patientKey BIGINT,
23 OUT studyKey BIGINT,
24 OUT seriesKey BIGINT,
25 OUT instanceKey BIGINT) AS $body$
26
27 DECLARE
28 patientSeq BIGINT;
29 countRecycling BIGINT;
30
31 BEGIN
32 SELECT internalId FROM Resources INTO instanceKey WHERE publicId = instance AND resourceType = 3;
33
34 IF NOT (instanceKey IS NULL) THEN
35 -- This instance already exists, stop here
36 isNewInstance := 0;
37 ELSE
38 SELECT internalId FROM Resources INTO patientKey WHERE publicId = patient AND resourceType = 0;
39 SELECT internalId FROM Resources INTO studyKey WHERE publicId = study AND resourceType = 1;
40 SELECT internalId FROM Resources INTO seriesKey WHERE publicId = series AND resourceType = 2;
41
42 IF patientKey IS NULL THEN
43 -- Must create a new patient
44 IF NOT (studyKey IS NULL AND seriesKey IS NULL AND instanceKey IS NULL) THEN
45 RAISE EXCEPTION 'Broken invariant';
46 END IF;
47
48 INSERT INTO Resources VALUES (DEFAULT, 0, patient, NULL) RETURNING internalId INTO patientKey;
49 isNewPatient := 1;
50 ELSE
51 isNewPatient := 0;
52 END IF;
53
54 IF (patientKey IS NULL) THEN
55 RAISE EXCEPTION 'Broken invariant';
56 END IF;
57
58 IF studyKey IS NULL THEN
59 -- Must create a new study
60 IF NOT (seriesKey IS NULL AND instanceKey IS NULL) THEN
61 RAISE EXCEPTION 'Broken invariant';
62 END IF;
63
64 INSERT INTO Resources VALUES (DEFAULT, 1, study, patientKey) RETURNING internalId INTO studyKey;
65 isNewStudy := 1;
66 ELSE
67 isNewStudy := 0;
68 END IF;
69
70 IF (studyKey IS NULL) THEN
71 RAISE EXCEPTION 'Broken invariant';
72 END IF;
73
74 IF seriesKey IS NULL THEN
75 -- Must create a new series
76 IF NOT (instanceKey IS NULL) THEN
77 RAISE EXCEPTION 'Broken invariant';
78 END IF;
79
80 INSERT INTO Resources VALUES (DEFAULT, 2, series, studyKey) RETURNING internalId INTO seriesKey;
81 isNewSeries := 1;
82 ELSE
83 isNewSeries := 0;
84 END IF;
85
86 IF (seriesKey IS NULL OR NOT instanceKey IS NULL) THEN
87 RAISE EXCEPTION 'Broken invariant';
88 END IF;
89
90 INSERT INTO Resources VALUES (DEFAULT, 3, instance, seriesKey) RETURNING internalId INTO instanceKey;
91 isNewInstance := 1;
92
93 -- Move the patient to the end of the recycling order
94 SELECT seq FROM PatientRecyclingOrder WHERE patientId = patientKey INTO patientSeq;
95
96 IF NOT (patientSeq IS NULL) THEN
97 -- The patient is not protected
98 SELECT COUNT(*) FROM (SELECT * FROM PatientRecyclingOrder WHERE seq >= patientSeq LIMIT 2) AS tmp INTO countRecycling;
99 IF countRecycling = 2 THEN
100 -- The patient was not at the end of the recycling order
101 DELETE FROM PatientRecyclingOrder WHERE seq = patientSeq;
102 INSERT INTO PatientRecyclingOrder VALUES(DEFAULT, patientKey);
103 END IF;
104 END IF;
105 END IF;
106 END;
107
108 $body$ LANGUAGE plpgsql;
109
110
111 -- these tables have been deleted in 6.2:
112 CREATE TABLE DeletedFiles(
113 uuid VARCHAR(64) NOT NULL, -- 0
114 fileType INTEGER, -- 1
115 compressedSize BIGINT, -- 2
116 uncompressedSize BIGINT, -- 3
117 compressionType INTEGER, -- 4
118 uncompressedHash VARCHAR(40), -- 5
119 compressedHash VARCHAR(40) -- 6
120 );
121
122 CREATE TABLE RemainingAncestor(
123 resourceType INTEGER NOT NULL,
124 publicId VARCHAR(64) NOT NULL
125 );
126
127 CREATE TABLE DeletedResources(
128 resourceType INTEGER NOT NULL,
129 publicId VARCHAR(64) NOT NULL
130 );
131
132
133 -- this trigger has been removed in 6.2
134 CREATE OR REPLACE FUNCTION CountResourcesTrackerFunc()
135 RETURNS TRIGGER AS $$
136 BEGIN
137 IF TG_OP = 'INSERT' THEN
138 UPDATE GlobalIntegers SET value = value + 1 WHERE key = new.resourceType + 2;
139 RETURN new;
140 ELSIF TG_OP = 'DELETE' THEN
141 UPDATE GlobalIntegers SET value = value - 1 WHERE key = old.resourceType + 2;
142 RETURN old;
143 END IF;
144 END;
145 $$ LANGUAGE plpgsql;
146
147 CREATE TRIGGER CountResourcesTracker
148 AFTER INSERT OR DELETE ON Resources
149 FOR EACH ROW
150 EXECUTE PROCEDURE CountResourcesTrackerFunc();
151
152 -- this trigger was introduced in 6.2, remove it:
153 DROP FUNCTION IF EXISTS InsertOrUpdateMetadata;
154
155 -- reinstall old triggers:
156 CREATE OR REPLACE FUNCTION AttachedFileIncrementSizeFunc()
157 RETURNS TRIGGER AS $body$
158 BEGIN
159 UPDATE GlobalIntegers SET value = value + new.compressedSize WHERE key = 0;
160 UPDATE GlobalIntegers SET value = value + new.uncompressedSize WHERE key = 1;
161 RETURN NULL;
162 END;
163 $body$ LANGUAGE plpgsql;
164
165 CREATE OR REPLACE FUNCTION AttachedFileDecrementSizeFunc()
166 RETURNS TRIGGER AS $body$
167 BEGIN
168 UPDATE GlobalIntegers SET value = value - old.compressedSize WHERE key = 0;
169 UPDATE GlobalIntegers SET value = value - old.uncompressedSize WHERE key = 1;
170 RETURN NULL;
171 END;
172 $body$ LANGUAGE plpgsql;
173
174 DROP TRIGGER AttachedFileIncrementSize ON AttachedFiles;
175 CREATE TRIGGER AttachedFileIncrementSize
176 AFTER INSERT ON AttachedFiles
177 FOR EACH ROW
178 EXECUTE PROCEDURE AttachedFileIncrementSizeFunc();
179
180 DROP TRIGGER AttachedFileDecrementSize ON AttachedFiles;
181 CREATE TRIGGER AttachedFileDecrementSize
182 AFTER DELETE ON AttachedFiles
183 FOR EACH ROW
184 EXECUTE PROCEDURE AttachedFileDecrementSizeFunc();
185
186 -- these functions have been introduced in 6.2:
187 DROP FUNCTION IF EXISTS UpdateStatistics;
188 DROP FUNCTION IF EXISTS UpdateSingleStatistic;
189
190 -- this table has been introduced in 6.2:
191 DROP TABLE IF EXISTS GlobalIntegersChanges;
192
193 -- these functions have been introduced in 6.2:
194 DROP FUNCTION IF EXISTS CreateDeletedFilesTemporaryTable;
195 DROP FUNCTION IF EXISTS DeleteResource;
196
197 -- reinstall this old trigger:
198 CREATE OR REPLACE FUNCTION ResourceDeletedFunc()
199 RETURNS TRIGGER AS $body$
200 BEGIN
201 --RAISE NOTICE 'Delete resource %', old.parentId;
202 INSERT INTO DeletedResources VALUES (old.resourceType, old.publicId);
203
204 -- http://stackoverflow.com/a/11299968/881731
205 IF EXISTS (SELECT 1 FROM Resources WHERE parentId = old.parentId) THEN
206 -- Signal that the deleted resource has a remaining parent
207 INSERT INTO RemainingAncestor
208 SELECT resourceType, publicId FROM Resources WHERE internalId = old.parentId;
209 ELSE
210 -- Delete a parent resource when its unique child is deleted
211 DELETE FROM Resources WHERE internalId = old.parentId;
212 END IF;
213 RETURN NULL;
214 END;
215 $body$ LANGUAGE plpgsql;
216
217 DROP TRIGGER IF EXISTS ResourceDeleted ON Resources;
218 CREATE TRIGGER ResourceDeleted
219 AFTER DELETE ON Resources
220 FOR EACH ROW
221 EXECUTE PROCEDURE ResourceDeletedFunc();
222
223 -- reinstall this old trigger:
224 CREATE OR REPLACE FUNCTION PatientAddedFunc()
225 RETURNS TRIGGER AS $body$
226 BEGIN
227 -- The "0" corresponds to "OrthancPluginResourceType_Patient"
228 IF new.resourceType = 0 THEN
229 INSERT INTO PatientRecyclingOrder VALUES (DEFAULT, new.internalId);
230 END IF;
231 RETURN NULL;
232 END;
233 $body$ LANGUAGE plpgsql;
234
235 DROP TRIGGER IF EXISTS PatientAdded ON Resources;
236 CREATE TRIGGER PatientAdded
237 AFTER INSERT ON Resources
238 FOR EACH ROW
239 EXECUTE PROCEDURE PatientAddedFunc();
240
241
242 -- set the global properties that actually documents the DB version, revision and some of the capabilities
243 -- modify only the ones that have changed
244 DELETE FROM GlobalProperties WHERE property IN (4, 11);
245 INSERT INTO GlobalProperties VALUES (4, 1); -- GlobalProperty_DatabasePatchLevel
246 INSERT INTO GlobalProperties VALUES (11, 2); -- GlobalProperty_HasCreateInstance