--
-- The DO statement is used to allow this script to be run multiple
-- times without raising exceptions
--
DO $$
DECLARE
v_found boolean;
BEGIN
--
-- Was the column already renamed?
--
SELECT exists(
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'party_approved_member_map' and column_name = 'originating_rel_id'
) INTO v_found;
if v_found IS FALSE then
--
-- Use a better name for attribute "tag" in party_approved_member_map
--
alter table party_approved_member_map rename tag to originating_rel_id;
--
-- Create an "identity relationship"
--
perform acs_object__new(-10, 'relationship') from dual;
insert into acs_rels (rel_id, rel_type, object_id_one, object_id_two) values (-10, 'relationship', 0, 0);
end if;
END$$;
--
-- Use the new identity relation instead of value "0"
--
update party_approved_member_map
set originating_rel_id = -10
where originating_rel_id = 0;
--
-- Make sure, there are no leftovers in the old "tag" attribute, which
-- did not have a foreign key defined
--
delete from party_approved_member_map
where originating_rel_id in
(select originating_rel_id from party_approved_member_map
except select rel_id from acs_rels);
--
-- Add a foreign key ...
-- ... and let the script run multiple times...
--
ALTER TABLE party_approved_member_map
DROP CONSTRAINT IF EXISTS party_member_rel_id_fk;
ALTER TABLE party_approved_member_map
ADD CONSTRAINT party_member_rel_id_fk foreign key (originating_rel_id)
references acs_rels on delete cascade;
DO $$
DECLARE
v_found boolean;
BEGIN
--
-- Was the index already created?
--
SELECT exists(
SELECT relname from pg_class
WHERE relname ='party_member_party_idx'
) into v_found;
if v_found IS FALSE then
--
-- speed up referential integrity
--
create index party_member_party_idx on party_approved_member_map(party_id);
create index party_member_originating_idx on party_approved_member_map(originating_rel_id);
end if;
END$$;
--
-- Redefine the stored procedures/functions referring to the attribute
-- "tag".
--
--
-- procedure party_approved_member__add_one/3
--
CREATE OR REPLACE FUNCTION party_approved_member__add_one(
p_party_id integer,
p_member_id integer,
p_rel_id integer
) RETURNS integer AS $$
DECLARE
BEGIN
insert into party_approved_member_map
(party_id, member_id, originating_rel_id)
values
(p_party_id, p_member_id, p_rel_id);
return 1;
END;
$$ LANGUAGE plpgsql;
--
-- procedure party_approved_member__remove_one/3
--
CREATE OR REPLACE FUNCTION party_approved_member__remove_one(
p_party_id integer,
p_member_id integer,
p_rel_id integer
) RETURNS integer AS $$
DECLARE
BEGIN
delete from party_approved_member_map
where party_id = p_party_id
and member_id = p_member_id
and originating_rel_id = p_rel_id;
return 1;
END;
$$ LANGUAGE plpgsql;
-- Triggers to maintain party_approved_member_map when parties are created or
-- destroyed. These don't call the above helper functions because we're just
-- creating the identity row for the party.
CREATE OR REPLACE FUNCTION parties_in_tr () RETURNS trigger AS $$
BEGIN
insert into party_approved_member_map
(party_id, member_id, originating_rel_id)
values
(new.party_id, new.party_id, -10);
return new;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION rel_segments_in_tr () RETURNS trigger AS $$
BEGIN
insert into party_approved_member_map
(party_id, member_id, originating_rel_id)
select new.segment_id, element_id, rel_id
from group_element_index
where group_id = new.group_id
and rel_type = new.rel_type;
return new;
END;
$$ LANGUAGE plpgsql;
--
-- Improve get_func_definition() to return SQL function/procedure
-- definitions with argument names and defaults
--
--
-- procedure get_func_definition/2
--
CREATE OR REPLACE FUNCTION get_func_definition(
fname varchar,
args oidvector
) RETURNS text AS $PROC$
DECLARE
v_funcdef text default '';
v_args varchar;
v_nargs integer;
v_src text;
v_rettype varchar;
BEGIN
select pg_get_function_arguments(oid), pronargs, prosrc, -- was number_src(prosrc)
(select typname from pg_type where oid = p.prorettype::integer)
into v_args, v_nargs, v_src, v_rettype
from pg_proc p
where proname = fname::name
and proargtypes = args;
v_funcdef :=
E'--\n-- ' || fname || '/' || v_nargs || E'\n--'
|| E'\ncreate or replace function ' || fname || E'(\n '
|| replace(v_args, ', ', E',\n ')
|| E'\n) returns ' || v_rettype
|| E' as $$\n' || v_src || '$$ language plpgsql;';
return v_funcdef;
END;
$PROC$ LANGUAGE plpgsql stable strict;