]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/sql/Pg/upgrade/0087.schema.audit_functions_atomized.sql
LP#980296: Void Lost Fines if copy claims returned.
[Evergreen.git] / Open-ILS / src / sql / Pg / upgrade / 0087.schema.audit_functions_atomized.sql
1 /*
2  * Copyright (C) 2009 Equinox Software, Inc.
3  * Joe Atzberger
4  *
5  * Released under GNU General Public License version 2
6  */
7
8 BEGIN;
9
10 INSERT INTO config.upgrade_log (version) VALUES ('0087'); -- atz
11
12 CREATE FUNCTION auditor.create_auditor_seq     ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
13 BEGIN
14     EXECUTE $$
15         CREATE SEQUENCE auditor.$$ || sch || $$_$$ || tbl || $$_pkey_seq;
16     $$;
17         RETURN TRUE;
18 END;
19 $creator$ LANGUAGE 'plpgsql';
20
21 CREATE FUNCTION auditor.create_auditor_history ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
22 BEGIN
23     EXECUTE $$
24         CREATE TABLE auditor.$$ || sch || $$_$$ || tbl || $$_history (
25             audit_id    BIGINT                          PRIMARY KEY,
26             audit_time  TIMESTAMP WITH TIME ZONE        NOT NULL,
27             audit_action        TEXT                            NOT NULL,
28             LIKE $$ || sch || $$.$$ || tbl || $$
29         );
30     $$;
31         RETURN TRUE;
32 END;
33 $creator$ LANGUAGE 'plpgsql';
34
35 CREATE FUNCTION auditor.create_auditor_func    ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
36 BEGIN
37     EXECUTE $$
38         CREATE FUNCTION auditor.audit_$$ || sch || $$_$$ || tbl || $$_func ()
39         RETURNS TRIGGER AS $func$
40         BEGIN
41             INSERT INTO auditor.$$ || sch || $$_$$ || tbl || $$_history
42                 SELECT  nextval('auditor.$$ || sch || $$_$$ || tbl || $$_pkey_seq'),
43                     now(),
44                     SUBSTR(TG_OP,1,1),
45                     OLD.*;
46             RETURN NULL;
47         END;
48         $func$ LANGUAGE 'plpgsql';
49     $$;
50     RETURN TRUE;
51 END;
52 $creator$ LANGUAGE 'plpgsql';
53
54 CREATE FUNCTION auditor.create_auditor_update_trigger ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
55 BEGIN
56     EXECUTE $$
57         CREATE TRIGGER audit_$$ || sch || $$_$$ || tbl || $$_update_trigger
58             AFTER UPDATE OR DELETE ON $$ || sch || $$.$$ || tbl || $$ FOR EACH ROW
59             EXECUTE PROCEDURE auditor.audit_$$ || sch || $$_$$ || tbl || $$_func ();
60     $$;
61         RETURN TRUE;
62 END;
63 $creator$ LANGUAGE 'plpgsql';
64
65 CREATE FUNCTION auditor.create_auditor_lifecycle     ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
66 BEGIN
67     EXECUTE $$
68         CREATE VIEW auditor.$$ || sch || $$_$$ || tbl || $$_lifecycle AS
69             SELECT      -1, now() as audit_time, '-' as audit_action, *
70               FROM      $$ || sch || $$.$$ || tbl || $$
71                 UNION ALL
72             SELECT      *
73               FROM      auditor.$$ || sch || $$_$$ || tbl || $$_history;
74     $$;
75         RETURN TRUE;
76 END;
77 $creator$ LANGUAGE 'plpgsql';
78
79 DROP FUNCTION IF EXISTS auditor.create_auditor (TEXT, TEXT); -- Besides this line and the 0087 INSERT, the rest of this file is 900.audit-functions.sql
80
81 -- The main event
82
83 CREATE FUNCTION auditor.create_auditor ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
84 BEGIN
85     PERFORM auditor.create_auditor_seq(sch, tbl);
86     PERFORM auditor.create_auditor_history(sch, tbl);
87     PERFORM auditor.create_auditor_func(sch, tbl);
88     PERFORM auditor.create_auditor_update_trigger(sch, tbl);
89     PERFORM auditor.create_auditor_lifecycle(sch, tbl);
90         RETURN TRUE;
91 END;
92 $creator$ LANGUAGE 'plpgsql';
93
94 COMMIT;
95