--
-- acs_object__check_object_descendants/3
--
create or replace function acs_object__check_object_descendants(
integer,
integer,
integer
) returns bool as $$
declare
object_id alias for $1;
descendant_id alias for $2;
n_generations alias for $3;
result boolean;
obj record;
begin
-- OBJECT_ID is the object we are verifying.
-- DESCENDANT_ID is the current descendant we are tracking.
-- N_GENERATIONS is how far the current DESCENDANT_ID is from
-- OBJECT_ID.
-- This function will verfy that each actualy descendant of
-- OBJECT_ID has a row in the index table. It does not check that
-- there aren't extraneous rows or that the ancestors of OBJECT_ID
-- are maintained correctly.
result := 't';
-- First verify that OBJECT_ID and DESCENDANT_ID are actually in
-- the index.
if acs_object__check_context_index(descendant_id, object_id, n_generations) = 'f' then
result := 'f';
end if;
-- For every child that reports inheriting from OBJECT_ID we need to call
-- ourselves recursively.
for obj in select *
from acs_objects
where context_id = descendant_id
and security_inherit_p = 't' loop
if acs_object__check_object_descendants(object_id, obj.object_id,
n_generations + 1) = 'f' then
result := 'f';
end if;
end loop;
return result;
end;$$ language plpgsql;