Package dak :: Package dakdb :: Module update91
[hide private]
[frames] | no frames]

Source Code for Module dak.dakdb.update91

  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  # This program is free software; you can redistribute it and/or modify 
 10  # it under the terms of the GNU General Public License as published by 
 11  # the Free Software Foundation; either version 2 of the License, or 
 12  # (at your option) any later version. 
 13   
 14  # This program is distributed in the hope that it will be useful, 
 15  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 16  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 17  # GNU General Public License for more details. 
 18   
 19  # You should have received a copy of the GNU General Public License 
 20  # along with this program; if not, write to the Free Software 
 21  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 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   
88 -def do_update(self):
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