select define_function_args('cmp_pg_version','p__version');
CREATE or REPLACE function cmp_pg_version(
p__version varchar
) RETURNS integer AS $$
DECLARE
pg_version integer[];
user_pg_version integer[];
index integer;
ret_val integer;
i integer;
BEGIN
ret_val = 0;
user_pg_version := string_to_array(trim(p__version),'.')::int[];
select string_to_array(setting, '.')::int[] into pg_version from pg_settings where name = 'server_version';
for index in array_length(user_pg_version, 1) + 1..array_length(pg_version, 1) loop
user_pg_version[index] := 0;
end loop;
index := 1;
while (index <= array_length(pg_version, 1) and ret_val = 0) loop
if user_pg_version[index] > pg_version[index] then
ret_val := -1;
elsif user_pg_version[index] < pg_version[index] then
ret_val := 1;
end if;
index := index + 1;
end loop;
return ret_val;
END;
$$ LANGUAGE plpgsql;
create function inline_0()
returns integer as $inline_0$
begin
IF cmp_pg_version('8.4') >= 0 THEN
-- recursive permissions functions - START
--
-- procedure acs_permission__permission_p/3
--
CREATE OR REPLACE FUNCTION acs_permission__permission_p(
permission_p__object_id integer,
permission_p__party_id integer,
permission_p__privilege varchar
) RETURNS boolean AS $$
DECLARE
exists_p boolean;
BEGIN
return exists (With RECURSIVE object_context(object_id, context_id) AS (
select permission_p__object_id, permission_p__object_id
from acs_objects
where object_id = permission_p__object_id
union all
select ao.object_id,
case when (ao.security_inherit_p = 'f' or ao.context_id is null)
then acs__magic_object_id('security_context_root') else ao.context_id end
from object_context oc, acs_objects ao
where ao.object_id = oc.context_id
and ao.object_id != acs__magic_object_id('security_context_root')
), privilege_ancestors(privilege, child_privilege) AS (
select permission_p__privilege, permission_p__privilege
union all
select aph.privilege, aph.child_privilege
from privilege_ancestors pa join acs_privilege_hierarchy aph
on aph.child_privilege = pa.privilege
) select
1
from
acs_permissions p
join party_approved_member_map pap on pap.party_id = p.grantee_id
join privilege_ancestors pa on pa.privilege = p.privilege
join object_context oc on p.object_id = oc.context_id
where pap.member_id = permission_p__party_id
);
END;
$$ LANGUAGE plpgsql stable;
-- for tsearch
PERFORM define_function_args('acs_permission__permission_p_recursive_array','a_objects,a_party_id,a_privilege');
CREATE OR REPLACE FUNCTION acs_permission__permission_p_recursive_array(
permission_p__objects integer[],
permission_p__party_id integer,
permission_p__privilege varchar
) RETURNS table (object_id integer, orig_object_id integer) as $$
BEGIN
return query With RECURSIVE object_context(obj_id, context_id, orig_obj_id) AS (
select unnest(permission_p__objects), unnest(permission_p__objects), unnest(permission_p__objects)
union all
select ao.object_id,
case when (ao.security_inherit_p = 'f' or ao.context_id is null)
then acs__magic_object_id('security_context_root') else ao.context_id END,
oc.orig_obj_id
from object_context oc, acs_objects ao
where ao.object_id = oc.context_id
and ao.object_id != acs__magic_object_id('security_context_root')
), privilege_ancestors(privilege, child_privilege) AS (
select permission_p__privilege, permission_p__privilege
union all
select aph.privilege, aph.child_privilege
from privilege_ancestors pa join acs_privilege_hierarchy aph
on aph.child_privilege = pa.privilege
) select
p.object_id, oc.orig_obj_id
from
acs_permissions p
join party_approved_member_map pap on pap.party_id = p.grantee_id
join privilege_ancestors pa on pa.privilege = p.privilege
join object_context oc on p.object_id = oc.context_id
where pap.member_id = permission_p__party_id
;
END;
$$ LANGUAGE plpgsql stable;
CREATE OR REPLACE FUNCTION site_node__url(
url__node_id integer
) RETURNS varchar AS $$
BEGIN
return ( With RECURSIVE site_nodes_recursion(parent_id, path, directory_p, node_id) as (
select parent_id, ARRAY[name || case when directory_p then '/' else ' ' end]::text[] as path, directory_p, node_id
from site_nodes where node_id = url__node_id
UNION ALL
select sn.parent_id, sn.name::text || snr.path , sn.directory_p, snr.parent_id
from site_nodes sn join site_nodes_recursion snr on sn.node_id = snr.parent_id
where snr.parent_id is not null
) select array_to_string(path,'/') from site_nodes_recursion where parent_id is null
);
END;
$$ LANGUAGE plpgsql;
-- recursive permissions functions END
END IF;
return null;
end;
$inline_0$ LANGUAGE plpgsql;
select inline_0();
drop function inline_0();