]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0526.schema.upgrade-dep-tracking.sql
f8cf55e3d6c701a462cb7939b89587fc911a672c
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0526.schema.upgrade-dep-tracking.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0526'); --miker
4
5 CREATE TABLE config.db_patch_dependencies (
6   db_patch      TEXT PRIMARY KEY,
7   supersedes    TEXT[],
8   deprecates    TEXT[],
9   CONSTRAINT supersede_once EXCLUDE USING GIST ( supersedes WITH && ),
10   CONSTRAINT deprecate_once EXCLUDE USING GIST ( deprecates WITH && )
11 );
12
13 ALTER TABLE config.upgrade_log
14     ADD COLUMN applied_to TEXT;
15
16 -- List applied db patches that are deprecated by (and block the application of) my_db_patch
17 CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecates ( my_db_patch TEXT ) RETURNS SETOF TEXT AS $$
18     SELECT  DISTINCT l.version
19       FROM  config.upgrade_log l
20             JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.deprecates)
21       WHERE d.db_patch = my_db_patch 
22 $$ LANGUAGE SQL;
23
24 -- List applied db patches that are superseded by (and block the application of) my_db_patch
25 CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_supersedes ( my_db_patch TEXT ) RETURNS SETOF TEXT AS $$
26     SELECT  DISTINCT l.version
27       FROM  config.upgrade_log l
28             JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.supersedes)
29       WHERE d.db_patch = my_db_patch 
30 $$ LANGUAGE SQL;
31
32 -- List applied db patches that deprecates (and block the application of) my_db_patch
33 CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_superseded ( my_db_patch TEXT ) RETURNS TEXT AS $$
34     SELECT  db_patch
35       FROM  config.db_patch_dependencies
36       WHERE my_db_patch::TEXT[] && deprecates 
37 $$ LANGUAGE SQL;
38
39 -- List applied db patches that supersedes (and block the application of) my_db_patch
40 CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_superseded ( my_db_patch TEXT ) RETURNS TEXT AS $$
41     SELECT  db_patch
42       FROM  config.db_patch_dependencies
43       WHERE my_db_patch::TEXT[] && supersedes 
44 $$ LANGUAGE SQL;
45
46 -- Make sure that no deprecated or superseded db patches are currently applied
47 CREATE OR REPLACE FUNCTION evergreen.upgrade_verify_no_dep_conflicts ( my_db_patch TEXT ) RETURNS BOOL AS $$
48     SELECT  COUNT(*) = 0
49       FROM  (SELECT * FROM evergreen.upgrade_list_applied_deprecates( my_db_patch )
50                 UNION
51              SELECT * FROM evergreen.upgrade_list_applied_supersedes( my_db_patch )
52                 UNION
53              SELECT * FROM evergreen.upgrade_list_applied_deprecated( my_db_patch )
54                 UNION
55              SELECT * FROM evergreen.upgrade_list_applied_superseded( my_db_patch ))x
56 $$ LANGUAGE SQL;
57
58 -- Raise an exception if there are, in fact, dep/sup confilct
59 CREATE OR REPLACE FUNCTION evergreen.upgrade_deps_block_check ( my_db_patch TEXT, my_applied_to TEXT ) RETURNS BOOL AS $$
60 BEGIN
61     IF NOT evergreen.upgrade_verify_no_dep_conflicts( my_db_patch ) THEN
62         RAISE EXCEPTION '
63 Upgrade script % can not be applied:
64   applied deprecated scripts %
65   applied superseded scripts %
66   deprecated by %
67   superseded by %',
68             my_db_patch,
69             ARRAY_ACUM(evergreen.upgrade_list_applied_deprecates(my_db_patch)),
70             ARRAY_ACUM(evergreen.upgrade_list_applied_supersedes(my_db_patch)),
71             evergreen.upgrade_list_applied_deprecated(my_db_patch),
72             evergreen.upgrade_list_applied_superseded(my_db_patch);
73     END IF;
74
75     INSERT INTO config.upgrade_log (version, applied_to) VALUES (my_db_patch, my_applied_to);
76     RETURN TRUE;
77 END;
78 $$ LANGUAGE SQL;
79
80 COMMIT;