-- -- acs_group__new/1 -- create or replace function acs_group__new( character varying ) returns int4 as $$ declare gname alias for $1; begin return acs_group__new(null, 'group', now(), null, null, null, null, gname, null, null); end;$$ language plpgsql; -- -- acs_group__new/10 -- create or replace function acs_group__new( integer, character varying, timestamp with time zone, integer, character varying, character varying, character varying, character varying, character varying, integer ) returns int4 as $$ declare new__group_id alias for $1; -- default null new__object_type alias for $2; -- default 'group' new__creation_date alias for $3; -- default now() new__creation_user alias for $4; -- default null new__creation_ip alias for $5; -- default null new__email alias for $6; -- default null new__url alias for $7; -- default null new__group_name alias for $8; new__join_policy alias for $9; -- default null new__context_id alias for $10; -- default null v_group_id groups.group_id%TYPE; v_group_type_exists_p integer; v_join_policy groups.join_policy%TYPE; begin v_group_id := party__new(new__group_id, new__object_type, new__creation_date, new__creation_user, new__creation_ip, new__email, new__url, new__context_id); v_join_policy := new__join_policy; -- if join policy was not specified, select the default based on group type if v_join_policy is null or v_join_policy = '' then select count(*) into v_group_type_exists_p from group_types where group_type = new__object_type; if v_group_type_exists_p = 1 then select default_join_policy into v_join_policy from group_types where group_type = new__object_type; else v_join_policy := 'open'; end if; end if; update acs_objects set title = new__group_name where object_id = v_group_id; insert into groups (group_id, group_name, join_policy) values (v_group_id, new__group_name, v_join_policy); -- setup the permissible relationship types for this group -- DRB: we have to call nextval() directly because the select may -- return more than one row. The sequence hack will only compute -- one nextval value causing the insert to fail ("may" in PG, which -- is actually broken. It should ALWAYS return exactly one value for -- the view. In PG it may or may not depending on the optimizer's -- mood. PG group seems uninterested in acknowledging the fact that -- this is a bug) insert into group_rels (group_rel_id, group_id, rel_type) select nextval('t_acs_object_id_seq'), v_group_id, rels.rel_type from ( select distinct g.rel_type from group_type_rels g, ( select parent.object_type as parent_type from acs_object_types child, acs_object_types parent where child.object_type <> parent.object_type and child.tree_sortkey between parent.tree_sortkey and tree_right(parent.tree_sortkey) and child.object_type = new__object_type order by parent.tree_sortkey desc) types where g.group_type = types.parent_type and not exists ( select 1 from group_rels where group_rels.group_id = v_group_id and group_rels.rel_type = g.rel_type) ) rels; return v_group_id; end;$$ language plpgsql;