-tablename = TD["table_name"]
-event = TD["event"]
-
-if tablename != 'override':
- return None
-
-if event != 'UPDATE':
- # We only care about UPDATE event here
- return None
-
-# Deal with some pathologically stupid cases we ignore
-if (TD['new']['package'] != TD['old']['package']) or \
- (TD['new']['type'] != TD['old']['type']) or \
- (TD['new']['suite'] != TD['old']['suite']):
- return None
-
-package = TD['old']['package']
-
-# Get the priority, component and section out
-if TD['new']['priority'] == TD['old']['priority']:
- priority = None
-else:
- priority_row = plpy.execute(plpy.prepare("SELECT priority FROM priority WHERE id = $1", ["int"]), [TD['new']['priority']])
- if len(priority_row) != 1:
- plpy.warning('Could not find priority for id %s' % TD['new']['priority'])
- return None
- priority = priority_row[0]['priority']
-
-if TD['new']['component'] == TD['old']['component']:
- component = None
-else:
- component_row = plpy.execute(plpy.prepare("SELECT name AS component FROM component WHERE id = $1", ["int"]), [TD['new']['component']])
- if len(component_row) != 1:
- plpy.warning('Could not find component for id %s' % TD['new']['component'])
- return None
- component = component_row[0]['component']
-
-if TD['new']['section'] == TD['old']['section']:
- section = None
-else:
- section_row = plpy.execute(plpy.prepare("SELECT section FROM section WHERE id = $1", ["int"]), [TD['new']['section']])
- if len(section_row) != 1:
- plpy.warning('Could not find section for id %s' % TD['new']['section'])
- return None
- section = section_row[0]['section']
-
-# Find out if we're doing src or binary overrides
-src_override_types = plpy.execute(plpy.prepare("SELECT id FROM override_type WHERE type = 'dsc'"), [])
-if len(src_override_types) != 1:
- return None
-src_override_id = src_override_types[0]['id']
-
-if TD['old']['type'] == src_override_id:
- # Doing a src_association link
- ## Find all of the relevant suites to work on
- for suite_row in plpy.execute(plpy.prepare('''SELECT source.version, suite_name
- FROM source
- LEFT JOIN src_associations ON (source.id = src_associations.source)
- LEFT JOIN suite ON (suite.id = src_associations.suite)
- WHERE source.source = $1
- AND suite = $2''', ["text", "int"]), [package, TD['new']['suite']]):
- # INSERT one row per affected source package
- plpy.execute(plpy.prepare("INSERT INTO audit.package_changes (package, version, architecture, suite, event, priority, component, section) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
- ["text", "text", "text", "text", "text", "text", "text", "text"]),
- [package, suite_row['version'], 'source', suite_row['suite_name'],
- 'U', priority, component, section])
-else:
- # Doing a bin_association link; Find all of the relevant suites to work on
- for suite_row in plpy.execute(plpy.prepare('''SELECT binaries.version, arch_string, suite_name
- FROM binaries
- LEFT JOIN bin_associations ON (binaries.id = bin_associations.bin)
- LEFT JOIN architecture ON (architecture.id = binaries.architecture)
- LEFT JOIN suite ON (suite.id = bin_associations.suite)
- WHERE package = $1
- AND suite = $2''', ["text", "int"]), [package, TD['new']['suite']]):
- # INSERT one row per affected binary
- plpy.execute(plpy.prepare("INSERT INTO audit.package_changes (package, version, architecture, suite, event, priority, component, section) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)",
- ["text", "text", "text", "text", "text", "text", "text", "text"]),
- [package, suite_row['version'], suite_row['arch_string'], suite_row['suite_name'],
- 'U', priority, component, section])
-
-$$ LANGUAGE plpythonu VOLATILE SECURITY DEFINER;
-""")
+DECLARE
+ v_src_override_id override_type.id%TYPE;
+
+ v_priority audit.package_changes.priority%TYPE := NULL;
+ v_component audit.package_changes.component%TYPE := NULL;
+ v_section audit.package_changes.section%TYPE := NULL;
+BEGIN
+
+ IF TG_TABLE_NAME != 'override' THEN
+ RAISE EXCEPTION 'trigger called for invalid table (%)', TG_TABLE_NAME;
+ END IF;
+ IF TG_OP != 'UPDATE' THEN
+ RAISE EXCEPTION 'trigger called for invalid event (%)', TG_OP;
+ END IF;
+
+ IF OLD.package != NEW.package OR OLD.type != NEW.type OR OLD.suite != NEW.suite THEN
+ RETURN NEW;
+ END IF;
+
+ IF OLD.priority != NEW.priority THEN
+ SELECT priority INTO STRICT v_priority FROM priority WHERE id = NEW.priority;
+ END IF;
+
+ IF OLD.component != NEW.component THEN
+ SELECT name INTO STRICT v_component FROM component WHERE id = NEW.component;
+ END IF;
+
+ IF OLD.section != NEW.section THEN
+ SELECT section INTO STRICT v_section FROM section WHERE id = NEW.section;
+ END IF;
+
+ -- Find out if we're doing src or binary overrides
+ SELECT id INTO STRICT v_src_override_id FROM override_type WHERE type = 'dsc';
+ IF OLD.type = v_src_override_id THEN
+ -- Doing a src_association link
+ INSERT INTO audit.package_changes
+ (package, version, architecture, suite, event, priority, component, section)
+ SELECT NEW.package, source.version, 'source', suite.suite_name, 'U', v_priority, v_component, v_section
+ FROM source
+ JOIN src_associations ON (source.id = src_associations.source)
+ JOIN suite ON (suite.id = src_associations.suite)
+ WHERE source.source = NEW.package AND src_associations.suite = NEW.suite;
+ ELSE
+ -- Doing a bin_association link
+ INSERT INTO audit.package_changes
+ (package, version, architecture, suite, event, priority, component, section)
+ SELECT NEW.package, binaries.version, architecture.arch_string, suite.suite_name, 'U', v_priority, v_component, v_section
+ FROM binaries
+ JOIN bin_associations ON (binaries.id = bin_associations.bin)
+ JOIN architecture ON (architecture.id = binaries.architecture)
+ JOIN suite ON (suite.id = bin_associations.suite)
+ WHERE binaries.package = NEW.package AND bin_associations.suite = NEW.suite;
+ END IF;
+
+ RETURN NEW;
+END;
+$$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER""");