--
-- content_folder__del/2
--
create or replace function content_folder__del(
integer,
boolean
) returns int4 as $$
declare
delete__folder_id alias for $1;
p_cascade_p alias for $2; -- default 'f'
v_count integer;
v_child_row record;
v_parent_id integer;
v_path varchar;
v_folder_sortkey varbit;
begin
if p_cascade_p = 'f' then
select count(*) into v_count from cr_items
where parent_id = delete__folder_id;
-- check if the folder contains any items
if v_count > 0 then
v_path := content_item__get_path(delete__folder_id, null);
raise EXCEPTION '-20000: Folder ID % (%) cannot be deleted because it is not empty.', delete__folder_id, v_path;
end if;
else
-- delete children
select into v_folder_sortkey tree_sortkey
from cr_items where item_id=delete__folder_id;
for v_child_row in select
item_id, tree_sortkey, name
from cr_items
where tree_sortkey between v_folder_sortkey and tree_right(v_folder_sortkey)
and tree_sortkey != v_folder_sortkey
order by tree_sortkey desc
loop
if content_folder__is_folder(v_child_row.item_id) then
perform content_folder__delete(v_child_row.item_id);
else
perform content_item__delete(v_child_row.item_id);
end if;
end loop;
end if;
PERFORM content_folder__unregister_content_type(
delete__folder_id,
'content_revision',
't'
);
delete from cr_folder_type_map
where folder_id = delete__folder_id;
select parent_id into v_parent_id from cr_items
where item_id = delete__folder_id;
raise notice 'deleteing folder %',delete__folder_id;
PERFORM content_item__delete(delete__folder_id);
-- check if any folders are left in the parent
update cr_folders set has_child_folders = 'f'
where folder_id = v_parent_id and not exists (
select 1 from cr_items
where parent_id = v_parent_id and content_type = 'content_folder');
return 0;
end;$$ language plpgsql;