-- Support for PostgreSQL 9.x
-- @author Victor Guerra (vguerra@gmail.com)
create or replace function acs_objects_context_id_up_tr () returns trigger as '
declare
pair record;
outer_record record;
inner_record record;
security_context_root integer;
begin
if new.object_id = old.object_id
and ((new.context_id = old.context_id)
or (new.context_id is null and old.context_id is null))
and new.security_inherit_p = old.security_inherit_p then
return new;
end if;
-- Remove my old ancestors from my descendants.
for outer_record in select object_id from acs_object_context_index where
ancestor_id = old.object_id and object_id <> old.object_id loop
for inner_record in select ancestor_id from acs_object_context_index where
object_id = old.object_id and ancestor_id <> old.object_id loop
delete from acs_object_context_index
where object_id = outer_record.object_id
and ancestor_id = inner_record.ancestor_id;
end loop;
end loop;
-- Kill all my old ancestors.
delete from acs_object_context_index
where object_id = old.object_id;
insert into acs_object_context_index
(object_id, ancestor_id, n_generations)
values
(new.object_id, new.object_id, 0);
if new.context_id is not null and new.security_inherit_p = ''t'' then
-- Now insert my new ancestors for my descendants.
for pair in select *
from acs_object_context_index
where ancestor_id = new.object_id
LOOP
insert into acs_object_context_index
(object_id, ancestor_id, n_generations)
select
pair.object_id, ancestor_id,
n_generations + pair.n_generations + 1 as n_generations
from acs_object_context_index
where object_id = new.context_id;
end loop;
else
security_context_root = acs__magic_object_id(''security_context_root'');
if new.object_id != security_context_root then
-- We need to make sure that new.OBJECT_ID and all of its
-- children have security_context_root as an ancestor.
for pair in select *
from acs_object_context_index
where ancestor_id = new.object_id
LOOP
insert into acs_object_context_index
(object_id, ancestor_id, n_generations)
values
(pair.object_id, security_context_root, pair.n_generations + 1);
end loop;
end if;
end if;
return new;
end;' language 'plpgsql';
create or replace function acs_object__get_attribute (integer,varchar)
returns text as '
declare
object_id_in alias for $1;
attribute_name_in alias for $2;
v_table_name varchar(200);
v_column varchar(200);
v_key_sql text;
v_return text;
v_storage text;
v_rec record;
begin
v_storage := acs_object__get_attribute_storage(object_id_in, attribute_name_in);
v_column := acs_object__get_attr_storage_column(v_storage);
v_table_name := acs_object__get_attr_storage_table(v_storage);
v_key_sql := acs_object__get_attr_storage_sql(v_storage);
for v_rec in execute ''select '' || quote_ident(v_column) || ''::text as column_return from '' || quote_ident(v_table_name) || '' where '' || v_key_sql
LOOP
v_return := v_rec.column_return;
exit;
end loop;
if not FOUND then
return null;
end if;
return v_return;
end;' language 'plpgsql' stable;