]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/201.acq.audit-functions.sql
Add history tables, in the acq schema, for acq.purchase_order
[working/Evergreen.git] / Open-ILS / src / sql / Pg / 201.acq.audit-functions.sql
1 /*
2  * Copyright (C) 2004-2008  Georgia Public Library Service
3  * Copyright (C) 2007-2008  Equinox Software, Inc.
4  * Scott McKellar <scott@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 BEGIN;
19
20 CREATE OR REPLACE FUNCTION acq.create_acq_seq     ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
21 BEGIN
22     EXECUTE $$
23         CREATE SEQUENCE acq.$$ || sch || $$_$$ || tbl || $$_pkey_seq;
24     $$;
25         RETURN TRUE;
26 END;
27 $creator$ LANGUAGE 'plpgsql';
28
29 CREATE OR REPLACE FUNCTION acq.create_acq_history ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
30 BEGIN
31     EXECUTE $$
32         CREATE TABLE acq.$$ || sch || $$_$$ || tbl || $$_history (
33             audit_id    BIGINT                          PRIMARY KEY,
34             audit_time  TIMESTAMP WITH TIME ZONE        NOT NULL,
35             audit_action        TEXT                            NOT NULL,
36             LIKE $$ || sch || $$.$$ || tbl || $$
37         );
38     $$;
39         RETURN TRUE;
40 END;
41 $creator$ LANGUAGE 'plpgsql';
42
43 CREATE OR REPLACE FUNCTION acq.create_acq_func    ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
44 BEGIN
45     EXECUTE $$
46         CREATE OR REPLACE FUNCTION acq.audit_$$ || sch || $$_$$ || tbl || $$_func ()
47         RETURNS TRIGGER AS $func$
48         BEGIN
49             INSERT INTO acq.$$ || sch || $$_$$ || tbl || $$_history
50                 SELECT  nextval('acq.$$ || sch || $$_$$ || tbl || $$_pkey_seq'),
51                     now(),
52                     SUBSTR(TG_OP,1,1),
53                     OLD.*;
54             RETURN NULL;
55         END;
56         $func$ LANGUAGE 'plpgsql';
57     $$;
58         RETURN TRUE;
59 END;
60 $creator$ LANGUAGE 'plpgsql';
61
62 CREATE OR REPLACE FUNCTION acq.create_acq_update_trigger ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
63 BEGIN
64     EXECUTE $$
65         CREATE TRIGGER audit_$$ || sch || $$_$$ || tbl || $$_update_trigger
66             AFTER UPDATE OR DELETE ON $$ || sch || $$.$$ || tbl || $$ FOR EACH ROW
67             EXECUTE PROCEDURE acq.audit_$$ || sch || $$_$$ || tbl || $$_func ();
68     $$;
69         RETURN TRUE;
70 END;
71 $creator$ LANGUAGE 'plpgsql';
72
73 CREATE OR REPLACE FUNCTION acq.create_acq_lifecycle     ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
74 BEGIN
75     EXECUTE $$
76         CREATE OR REPLACE VIEW acq.$$ || sch || $$_$$ || tbl || $$_lifecycle AS
77             SELECT      -1, now() as audit_time, '-' as audit_action, *
78               FROM      $$ || sch || $$.$$ || tbl || $$
79                 UNION ALL
80             SELECT      *
81               FROM      acq.$$ || sch || $$_$$ || tbl || $$_history;
82     $$;
83         RETURN TRUE;
84 END;
85 $creator$ LANGUAGE 'plpgsql';
86
87
88 -- The main event
89
90 CREATE OR REPLACE FUNCTION acq.create_acq_auditor ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
91 BEGIN
92     PERFORM acq.create_acq_seq(sch, tbl);
93     PERFORM acq.create_acq_history(sch, tbl);
94     PERFORM acq.create_acq_func(sch, tbl);
95     PERFORM acq.create_acq_update_trigger(sch, tbl);
96     PERFORM acq.create_acq_lifecycle(sch, tbl);
97     RETURN TRUE;
98 END;
99 $creator$ LANGUAGE 'plpgsql';
100
101 SELECT acq.create_acq_auditor ( 'acq', 'purchase_order' );
102 CREATE INDEX acq_po_hist_id_idx            ON acq.acq_purchase_order_history( id );
103
104 SELECT acq.create_acq_auditor ( 'acq', 'lineitem' );
105 CREATE INDEX acq_lineitem_hist_id_idx            ON acq.acq_lineitem_history( id );
106
107 COMMIT;