-- Makes the delete proc also delete grantee acs_permission records to avoid integrity violations
create or replace function acs_object__delete (integer)
returns integer as '
declare
delete__object_id alias for $1;
obj_type record;
begin
-- Delete dynamic/generic attributes
delete from acs_attribute_values where object_id = delete__object_id;
-- Delete direct permissions records.
delete from acs_permissions
where object_id = delete__object_id
or grantee_id = delete__object_id;
-- select table_name, id_column
-- from acs_object_types
-- start with object_type = (select object_type
-- from acs_objects o
-- where o.object_id = delete__object_id)
-- connect by object_type = prior supertype
-- There was a gratuitous join against the objects table here,
-- probably a leftover from when this was a join, and not a subquery.
-- Functionally, this was working, but time taken was O(n) where n is the
-- number of objects. OUCH. Fixed. (ben)
for obj_type
in select o2.table_name, o2.id_column
from acs_object_types o1, acs_object_types o2
where o1.object_type = (select object_type
from acs_objects o
where o.object_id = delete__object_id)
and o1.tree_sortkey between o2.tree_sortkey and tree_right(o2.tree_sortkey)
order by o2.tree_sortkey desc
loop
-- Delete from the table.
-- DRB: I removed the quote_ident calls that DanW originally included
-- because the table names appear to be stored in upper case. Quoting
-- causes them to not match the actual lower or potentially mixed-case
-- table names. We will just forbid squirrely names that include quotes.
-- daveB
-- ETP is creating a new object, but not a table, although it does specify a
-- table name, so we need to check if the table exists. Wp-slim does this too
if table_exists(obj_type.table_name) then
execute ''delete from '' || obj_type.table_name ||
'' where '' || obj_type.id_column || '' = '' || delete__object_id;
end if;
end loop;
return 0;
end;' language 'plpgsql';