1 """
2 per-queue NEW comments and permissions
3
4 @contact: Debian FTP Master <ftpmaster@debian.org>
5 @copyright: 2012 Ansgar Burchardt <ansgar@debian.org>
6 @license: GNU General Public License version 2 or later
7 """
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import psycopg2
26
27 from daklib.dak_exceptions import DBUpdateError
28
29 statements = [
30 """
31 ALTER TABLE new_comments
32 ADD COLUMN policy_queue_id INTEGER REFERENCES policy_queue(id)
33 """,
34 """
35 UPDATE new_comments
36 SET policy_queue_id = (SELECT id FROM policy_queue WHERE queue_name = 'new')
37 """,
38 """
39 ALTER TABLE new_comments ALTER COLUMN policy_queue_id SET NOT NULL
40 """,
41 """
42 CREATE OR REPLACE FUNCTION trigger_check_policy_queue_permission() RETURNS TRIGGER
43 SET search_path = public, pg_temp
44 LANGUAGE plpgsql
45 AS $$
46 DECLARE
47 v_row RECORD;
48 v_suite_id suite.id%TYPE;
49 v_policy_queue_name policy_queue.queue_name%TYPE;
50 BEGIN
51
52 CASE TG_OP
53 WHEN 'INSERT', 'UPDATE' THEN
54 v_row := NEW;
55 WHEN 'DELETE' THEN
56 v_row := OLD;
57 ELSE
58 RAISE EXCEPTION 'Unexpected TG_OP (%)', TG_OP;
59 END CASE;
60
61 IF TG_OP = 'UPDATE' AND OLD.policy_queue_id != NEW.policy_queue_id THEN
62 RAISE EXCEPTION 'Cannot change policy_queue_id';
63 END IF;
64
65 SELECT suite_id, queue_name INTO STRICT v_suite_id, v_policy_queue_name
66 FROM policy_queue WHERE id = v_row.policy_queue_id;
67 IF NOT has_suite_permission(TG_OP, v_suite_id) THEN
68 RAISE EXCEPTION 'Not allowed to % in %', TG_OP, v_policy_queue_name;
69 END IF;
70
71 RETURN v_row;
72
73 END;
74 $$
75 """,
76 """
77 CREATE CONSTRAINT TRIGGER trigger_new_comments_permission
78 AFTER INSERT OR UPDATE OR DELETE
79 ON new_comments
80 FOR EACH ROW
81 EXECUTE PROCEDURE trigger_check_policy_queue_permission()
82 """,
83 ]
84
85
86
87
89 print(__doc__)
90 try:
91 c = self.db.cursor()
92
93 for stmt in statements:
94 c.execute(stmt)
95
96 c.execute("UPDATE config SET value = '91' WHERE name = 'db_revision'")
97 self.db.commit()
98
99 except psycopg2.ProgrammingError as msg:
100 self.db.rollback()
101 raise DBUpdateError(
102 "Unable to apply sick update 91, rollback issued. Error message: {0}".format(
103 msg
104 )
105 )
106