DB patch supersede/deprecate logic repairs; unit tests
authorBill Erickson <berick@esilibrary.com>
Thu, 19 Dec 2013 15:27:26 +0000 (10:27 -0500)
committerMike Rylander <mrylander@gmail.com>
Tue, 18 Feb 2014 17:56:58 +0000 (12:56 -0500)
* Fix some thinkos in the various DB functions for calculating
  supersedes/deprecation logic.

* Added a pgtap test

Signed-off-by: Bill Erickson <berick@esilibrary.com>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/t/db_patch_dep_checks.pg [new file with mode: 0644]
Open-ILS/src/sql/Pg/upgrade/XXXX.schema.deprecate-supersede-check-repairs.sql [new file with mode: 0644]

index 28a8b6c..6c16e9b 100644 (file)
@@ -74,7 +74,7 @@ DECLARE
     fld     TEXT;
     cnt     INT;
 BEGIN
-    fld := TG_ARGV[1];
+    fld := TG_ARGV[0];
     EXECUTE 'SELECT COUNT(*) FROM '|| TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME ||' WHERE '|| fld ||' && ($1).'|| fld INTO cnt USING NEW;
     IF cnt > 0 THEN
         RAISE EXCEPTION 'Cannot insert duplicate array into field % of table %', fld, TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME;
@@ -853,7 +853,7 @@ $f$ LANGUAGE PLPGSQL;
 CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecates ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
     SELECT  DISTINCT l.version
       FROM  config.upgrade_log l
-            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.deprecates)
+            JOIN config.db_patch_dependencies d ON (l.version = ANY(d.deprecates))
       WHERE d.db_patch = $1
 $$ LANGUAGE SQL;
 
@@ -861,7 +861,7 @@ $$ LANGUAGE SQL;
 CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_supersedes ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
     SELECT  DISTINCT l.version
       FROM  config.upgrade_log l
-            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.supersedes)
+            JOIN config.db_patch_dependencies d ON (l.version = ANY(d.supersedes))
       WHERE d.db_patch = $1
 $$ LANGUAGE SQL;
 
@@ -907,8 +907,8 @@ Upgrade script % can not be applied:
   deprecated by %
   superseded by %',
             my_db_patch,
-            ARRAY_AGG(evergreen.upgrade_list_applied_deprecates(my_db_patch)),
-            ARRAY_AGG(evergreen.upgrade_list_applied_supersedes(my_db_patch)),
+            (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_deprecates(my_db_patch)),
+            (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_supersedes(my_db_patch)),
             evergreen.upgrade_list_applied_deprecated(my_db_patch),
             evergreen.upgrade_list_applied_superseded(my_db_patch);
     END IF;
diff --git a/Open-ILS/src/sql/Pg/t/db_patch_dep_checks.pg b/Open-ILS/src/sql/Pg/t/db_patch_dep_checks.pg
new file mode 100644 (file)
index 0000000..57c5085
--- /dev/null
@@ -0,0 +1,36 @@
+BEGIN;
+
+SELECT plan(5);
+
+INSERT INTO config.db_patch_dependencies (db_patch, supersedes, deprecates)
+    VALUES
+        ('AAAE', '{AAAD}', '{}'),
+        ('AAAF', '{}', '{AAAC,AAAB}');
+
+-- AAAB is deprecated by AAAF
+SELECT is(evergreen.upgrade_list_applied_deprecated('AAAB'), 'AAAF', 'deprecated');
+
+-- AAAC is deprecated by AAAF
+SELECT is(evergreen.upgrade_list_applied_deprecated('AAAC'), 'AAAF', 'deprecated');
+
+-- AAAD is superseded by AAAE
+SELECT is(evergreen.upgrade_list_applied_superseded('AAAD'), 'AAAE', 'superseded');
+
+-- add some applied versions
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('AAAB', 'AAAA');
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('AAAC', 'AAAB');
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('AAAD', 'AAAC');
+
+-- AAAE supersedes AAAD
+SELECT is(
+    (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_supersedes('AAAE')),
+    '{AAAD}'
+);
+
+-- AAAF deprecates AAAB, AAAC
+SELECT is(
+    (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_deprecates('AAAF')),
+    '{AAAB,AAAC}'
+);
+
+ROLLBACK;
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.deprecate-supersede-check-repairs.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.deprecate-supersede-check-repairs.sql
new file mode 100644 (file)
index 0000000..10326de
--- /dev/null
@@ -0,0 +1,58 @@
+
+CREATE OR REPLACE FUNCTION evergreen.array_overlap_check (/* field */) RETURNS TRIGGER AS $$
+DECLARE
+    fld     TEXT;
+    cnt     INT;
+BEGIN
+    fld := TG_ARGV[0];
+    EXECUTE 'SELECT COUNT(*) FROM '|| TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME ||' WHERE '|| fld ||' && ($1).'|| fld INTO cnt USING NEW;
+    IF cnt > 0 THEN
+        RAISE EXCEPTION 'Cannot insert duplicate array into field % of table %', fld, TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME;
+    END IF;
+    RETURN NEW;
+END;
+$$ LANGUAGE PLPGSQL;
+
+
+CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecates ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
+    SELECT  DISTINCT l.version
+      FROM  config.upgrade_log l
+            JOIN config.db_patch_dependencies d ON (l.version = ANY(d.deprecates))
+      WHERE d.db_patch = $1
+$$ LANGUAGE SQL;
+
+-- List applied db patches that are superseded by (and block the application of) my_db_patch
+CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_supersedes ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
+    SELECT  DISTINCT l.version
+      FROM  config.upgrade_log l
+            JOIN config.db_patch_dependencies d ON (l.version = ANY(d.supersedes))
+      WHERE d.db_patch = $1
+$$ LANGUAGE SQL;
+
+
+CREATE OR REPLACE FUNCTION evergreen.upgrade_deps_block_check ( my_db_patch TEXT, my_applied_to TEXT ) RETURNS BOOL AS $$
+DECLARE 
+    deprecates TEXT;
+    supersedes TEXT;
+BEGIN
+    IF NOT evergreen.upgrade_verify_no_dep_conflicts( my_db_patch ) THEN
+        SELECT  STRING_AGG(patch, ', ') INTO deprecates FROM evergreen.upgrade_list_applied_deprecates(my_db_patch);
+        SELECT  STRING_AGG(patch, ', ') INTO supersedes FROM evergreen.upgrade_list_applied_supersedes(my_db_patch);
+        RAISE EXCEPTION '
+Upgrade script % can not be applied:
+  applied deprecated scripts %
+  applied superseded scripts %
+  deprecated by %
+  superseded by %',
+            my_db_patch,
+            (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_deprecates(my_db_patch)),
+            (SELECT ARRAY_AGG(patch) FROM evergreen.upgrade_list_applied_supersedes(my_db_patch)),
+            evergreen.upgrade_list_applied_deprecated(my_db_patch),
+            evergreen.upgrade_list_applied_superseded(my_db_patch);
+    END IF;
+
+    INSERT INTO config.upgrade_log (version, applied_to) VALUES (my_db_patch, my_applied_to);
+    RETURN TRUE;
+END;
+$$ LANGUAGE PLPGSQL;
+