--
-- forums_message__delete_thread/1
--
create or replace function forums_message__delete_thread(
integer
) returns int4 as $$
declare
p_message_id alias for $1;
v_forum_id forums_messages.forum_id%TYPE;
v_sortkey forums_messages.tree_sortkey%TYPE;
v_message RECORD;
begin
select forum_id, tree_sortkey
into v_forum_id, v_sortkey
from forums_messages
where message_id = p_message_id;
-- if it is already deleted
if v_forum_id is null
then return 0;
end if;
-- delete all children
-- order by tree_sortkey desc to guarantee
-- that we never delete a parent before its child
-- sortkeys are beautiful
for v_message in select *
from forums_messages
where forum_id = v_forum_id
and tree_sortkey between tree_left(v_sortkey) and tree_right(v_sortkey)
order by tree_sortkey desc
loop
-- Avoid the count bookkeeping down in forums_message__delete
perform forums_message__delete(v_message.message_id);
end loop;
-- delete the message itself
perform forums_message__delete(p_message_id);
return 0;
end;$$ language plpgsql;