]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/900.audit-functions.sql
New table: actor.usr_saved_search
[working/Evergreen.git] / Open-ILS / src / sql / Pg / 900.audit-functions.sql
1 /*
2  * Copyright (C) 2004-2008  Georgia Public Library Service
3  * Copyright (C) 2007-2008  Equinox Software, Inc.
4  * Mike Rylander <miker@esilibrary.com> 
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17
18 DROP SCHEMA IF EXISTS auditor CASCADE;
19
20 BEGIN;
21
22 CREATE SCHEMA auditor;
23
24 CREATE FUNCTION auditor.create_auditor_seq     ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
25 BEGIN
26     EXECUTE $$
27         CREATE SEQUENCE auditor.$$ || sch || $$_$$ || tbl || $$_pkey_seq;
28     $$;
29         RETURN TRUE;
30 END;
31 $creator$ LANGUAGE 'plpgsql';
32
33 CREATE FUNCTION auditor.create_auditor_history ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
34 BEGIN
35     EXECUTE $$
36         CREATE TABLE auditor.$$ || sch || $$_$$ || tbl || $$_history (
37             audit_id    BIGINT                          PRIMARY KEY,
38             audit_time  TIMESTAMP WITH TIME ZONE        NOT NULL,
39             audit_action        TEXT                            NOT NULL,
40             LIKE $$ || sch || $$.$$ || tbl || $$
41         );
42     $$;
43         RETURN TRUE;
44 END;
45 $creator$ LANGUAGE 'plpgsql';
46
47 CREATE FUNCTION auditor.create_auditor_func    ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
48 BEGIN
49     EXECUTE $$
50         CREATE FUNCTION auditor.audit_$$ || sch || $$_$$ || tbl || $$_func ()
51         RETURNS TRIGGER AS $func$
52         BEGIN
53             INSERT INTO auditor.$$ || sch || $$_$$ || tbl || $$_history
54                 SELECT  nextval('auditor.$$ || sch || $$_$$ || tbl || $$_pkey_seq'),
55                     now(),
56                     SUBSTR(TG_OP,1,1),
57                     OLD.*;
58             RETURN NULL;
59         END;
60         $func$ LANGUAGE 'plpgsql';
61     $$;
62         RETURN TRUE;
63 END;
64 $creator$ LANGUAGE 'plpgsql';
65
66 CREATE FUNCTION auditor.create_auditor_update_trigger ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
67 BEGIN
68     EXECUTE $$
69         CREATE TRIGGER audit_$$ || sch || $$_$$ || tbl || $$_update_trigger
70             AFTER UPDATE OR DELETE ON $$ || sch || $$.$$ || tbl || $$ FOR EACH ROW
71             EXECUTE PROCEDURE auditor.audit_$$ || sch || $$_$$ || tbl || $$_func ();
72     $$;
73         RETURN TRUE;
74 END;
75 $creator$ LANGUAGE 'plpgsql';
76
77 CREATE FUNCTION auditor.create_auditor_lifecycle     ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
78 BEGIN
79     EXECUTE $$
80         CREATE VIEW auditor.$$ || sch || $$_$$ || tbl || $$_lifecycle AS
81             SELECT      -1, now() as audit_time, '-' as audit_action, *
82               FROM      $$ || sch || $$.$$ || tbl || $$
83                 UNION ALL
84             SELECT      *
85               FROM      auditor.$$ || sch || $$_$$ || tbl || $$_history;
86     $$;
87         RETURN TRUE;
88 END;
89 $creator$ LANGUAGE 'plpgsql';
90
91
92 -- The main event
93
94 CREATE FUNCTION auditor.create_auditor ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
95 BEGIN
96     PERFORM auditor.create_auditor_seq(sch, tbl);
97     PERFORM auditor.create_auditor_history(sch, tbl);
98     PERFORM auditor.create_auditor_func(sch, tbl);
99     PERFORM auditor.create_auditor_update_trigger(sch, tbl);
100     PERFORM auditor.create_auditor_lifecycle(sch, tbl);
101     RETURN TRUE;
102 END;
103 $creator$ LANGUAGE 'plpgsql';
104
105 COMMIT;
106