]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/XXXX.schema.deprecate-supersede-check-repairs.sql
DB patch supersede/deprecate logic repairs; unit tests
[working/Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / XXXX.schema.deprecate-supersede-check-repairs.sql
1
2 CREATE OR REPLACE FUNCTION evergreen.array_overlap_check (/* field */) RETURNS TRIGGER AS $$
3 DECLARE
4     fld     TEXT;
5     cnt     INT;
6 BEGIN
7     fld := TG_ARGV[0];
8     EXECUTE 'SELECT COUNT(*) FROM '|| TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME ||' WHERE '|| fld ||' && ($1).'|| fld INTO cnt USING NEW;
9     IF cnt > 0 THEN
10         RAISE EXCEPTION 'Cannot insert duplicate array into field % of table %', fld, TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME;
11     END IF;
12     RETURN NEW;
13 END;
14 $$ LANGUAGE PLPGSQL;
15
16
17 CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecates ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
18     SELECT  DISTINCT l.version
19       FROM  config.upgrade_log l
20             JOIN config.db_patch_dependencies d ON (l.version = ANY(d.deprecates))
21       WHERE d.db_patch = $1
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 evergreen.patch AS $$
26     SELECT  DISTINCT l.version
27       FROM  config.upgrade_log l
28             JOIN config.db_patch_dependencies d ON (l.version = ANY(d.supersedes))
29       WHERE d.db_patch = $1
30 $$ LANGUAGE SQL;
31
32
33 CREATE OR REPLACE FUNCTION evergreen.upgrade_deps_block_check ( my_db_patch TEXT, my_applied_to TEXT ) RETURNS BOOL AS $$
34 DECLARE 
35     deprecates TEXT;
36     supersedes TEXT;
37 BEGIN
38     IF NOT evergreen.upgrade_verify_no_dep_conflicts( my_db_patch ) THEN
39         SELECT  STRING_AGG(patch, ', ') INTO deprecates FROM evergreen.upgrade_list_applied_deprecates(my_db_patch);
40         SELECT  STRING_AGG(patch, ', ') INTO supersedes FROM evergreen.upgrade_list_applied_supersedes(my_db_patch);
41         RAISE EXCEPTION '
42 Upgrade script % can not be applied:
43   applied deprecated scripts %
44   applied superseded scripts %
45   deprecated by %
46   superseded by %',
47             my_db_patch,
48             (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_deprecates(my_db_patch)),
49             (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_supersedes(my_db_patch)),
50             evergreen.upgrade_list_applied_deprecated(my_db_patch),
51             evergreen.upgrade_list_applied_superseded(my_db_patch);
52     END IF;
53
54     INSERT INTO config.upgrade_log (version, applied_to) VALUES (my_db_patch, my_applied_to);
55     RETURN TRUE;
56 END;
57 $$ LANGUAGE PLPGSQL;
58