]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0140.schema.acq-audit-funcs.sql
LP#1917826: tweaks to data update
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0140.schema.acq-audit-funcs.sql
1 BEGIN;
2
3 INSERT INTO config.upgrade_log (version) VALUES ('0140'); -- Scott McKellar
4
5 CREATE OR REPLACE FUNCTION acq.create_acq_seq     ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
6 BEGIN
7     EXECUTE $$
8         CREATE SEQUENCE acq.$$ || sch || $$_$$ || tbl || $$_pkey_seq;
9     $$;
10         RETURN TRUE;
11 END;
12 $creator$ LANGUAGE 'plpgsql';
13
14 CREATE OR REPLACE FUNCTION acq.create_acq_history ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
15 BEGIN
16     EXECUTE $$
17         CREATE TABLE acq.$$ || sch || $$_$$ || tbl || $$_history (
18             audit_id    BIGINT                          PRIMARY KEY,
19             audit_time  TIMESTAMP WITH TIME ZONE        NOT NULL,
20             audit_action        TEXT                            NOT NULL,
21             LIKE $$ || sch || $$.$$ || tbl || $$
22         );
23     $$;
24         RETURN TRUE;
25 END;
26 $creator$ LANGUAGE 'plpgsql';
27
28 CREATE OR REPLACE FUNCTION acq.create_acq_func    ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
29 BEGIN
30     EXECUTE $$
31         CREATE OR REPLACE FUNCTION acq.audit_$$ || sch || $$_$$ || tbl || $$_func ()
32         RETURNS TRIGGER AS $func$
33         BEGIN
34             INSERT INTO acq.$$ || sch || $$_$$ || tbl || $$_history
35                 SELECT  nextval('acq.$$ || sch || $$_$$ || tbl || $$_pkey_seq'),
36                     now(),
37                     SUBSTR(TG_OP,1,1),
38                     OLD.*;
39             RETURN NULL;
40         END;
41         $func$ LANGUAGE 'plpgsql';
42     $$;
43         RETURN TRUE;
44 END;
45 $creator$ LANGUAGE 'plpgsql';
46
47 CREATE OR REPLACE FUNCTION acq.create_acq_update_trigger ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
48 BEGIN
49     EXECUTE $$
50         CREATE TRIGGER audit_$$ || sch || $$_$$ || tbl || $$_update_trigger
51             AFTER UPDATE OR DELETE ON $$ || sch || $$.$$ || tbl || $$ FOR EACH ROW
52             EXECUTE PROCEDURE acq.audit_$$ || sch || $$_$$ || tbl || $$_func ();
53     $$;
54         RETURN TRUE;
55 END;
56 $creator$ LANGUAGE 'plpgsql';
57
58 CREATE OR REPLACE FUNCTION acq.create_acq_lifecycle     ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
59 BEGIN
60     EXECUTE $$
61         CREATE OR REPLACE VIEW acq.$$ || sch || $$_$$ || tbl || $$_lifecycle AS
62             SELECT      -1, now() as audit_time, '-' as audit_action, *
63               FROM      $$ || sch || $$.$$ || tbl || $$
64                 UNION ALL
65             SELECT      *
66               FROM      acq.$$ || sch || $$_$$ || tbl || $$_history;
67     $$;
68         RETURN TRUE;
69 END;
70 $creator$ LANGUAGE 'plpgsql';
71
72
73 -- The main event
74
75 CREATE OR REPLACE FUNCTION acq.create_acq_auditor ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
76 BEGIN
77     PERFORM acq.create_acq_seq(sch, tbl);
78     PERFORM acq.create_acq_history(sch, tbl);
79     PERFORM acq.create_acq_func(sch, tbl);
80     PERFORM acq.create_acq_update_trigger(sch, tbl);
81     PERFORM acq.create_acq_lifecycle(sch, tbl);
82     RETURN TRUE;
83 END;
84 $creator$ LANGUAGE 'plpgsql';
85
86 SELECT acq.create_acq_auditor ( 'acq', 'purchase_order' );
87 CREATE INDEX acq_po_hist_id_idx            ON acq.acq_purchase_order_history( id );
88
89 SELECT acq.create_acq_auditor ( 'acq', 'lineitem' );
90 CREATE INDEX acq_lineitem_hist_id_idx            ON acq.acq_lineitem_history( id );
91
92 COMMIT;