-- -- acs_object__check_object_ancestors/3 -- create or replace function acs_object__check_object_ancestors( integer, integer, integer ) returns bool as $$ declare check_object_ancestors__object_id alias for $1; check_object_ancestors__ancestor_id alias for $2; check_object_ancestors__n_generations alias for $3; check_object_ancestors__context_id acs_objects.context_id%TYPE; check_object_ancestors__security_inherit_p acs_objects.security_inherit_p%TYPE; n_rows integer; n_gens integer; result boolean; begin -- OBJECT_ID is the object we are verifying -- ANCESTOR_ID is the current ancestor we are tracking -- N_GENERATIONS is how far ancestor_id is from object_id -- Note that this function is only supposed to verify that the -- index contains each ancestor for OBJECT_ID. It doesn''t -- guarantee that there aren''t extraneous rows or that -- OBJECT_ID''s children are contained in the index. That is -- verified by seperate functions. result := 't'; -- Grab the context and security_inherit_p flag of the current -- ancestor''s parent. select context_id, security_inherit_p into check_object_ancestors__context_id, check_object_ancestors__security_inherit_p from acs_objects where object_id = check_object_ancestors__ancestor_id; if check_object_ancestors__ancestor_id = 0 then if check_object_ancestors__context_id is null then result := 't'; else -- This can be a constraint, can''t it? PERFORM acs_log__error('acs_object.check_representation', 'Object 0 doesn''t have a null context_id'); result := 'f'; end if; else if check_object_ancestors__context_id is null or check_object_ancestors__security_inherit_p = 'f' THEN check_object_ancestors__context_id := 0; end if; if acs_object__check_context_index(check_object_ancestors__object_id, check_object_ancestors__ancestor_id, check_object_ancestors__n_generations) = 'f' then result := 'f'; end if; if acs_object__check_object_ancestors(check_object_ancestors__object_id, check_object_ancestors__context_id, check_object_ancestors__n_generations + 1) = 'f' then result := 'f'; end if; end if; return result; end;$$ language plpgsql;