-- packages/bookmarks/sql/postgresql/upgrade/upgrade-4.1.1b-4.6.sql
--
-- @author Vinod Kurup (vinod@kurup.com)
-- @creation_date 2002-10-08
--
-- $Id: upgrade-4.1.1b-4.6.sql,v 1.2 2002/11/30 17:26:45 jeffd Exp $
CREATE OR REPLACE FUNCTION bookmark__delete (integer)
RETURNS integer AS '
DECLARE
p_bookmark_id ALIAS FOR $1; -- in bm_bookmarks.bookmark_id%TYPE,
c_bookmark_id_tree RECORD;
c_bookmark_id_one_level RECORD;
BEGIN
FOR c_bookmark_id_tree IN
select bm.bookmark_id,
(select case when count(*)=0 then 1 else 0 end from
bm_bookmarks where parent_id = bm.bookmark_id) as is_leaf_p
from bm_bookmarks bm, bm_bookmarks bm2
where bm2.bookmark_id = p_bookmark_id
and bm.tree_sortkey between bm2.tree_sortkey and tree_right(bm2.tree_sortkey)
order by tree_level(bm.tree_sortkey) desc, is_leaf_p desc, bm.tree_sortkey
LOOP
-- DRB: This query is insane in both its PG and Oracle versions but I do not
-- have time to improve it at the moment ...
FOR c_bookmark_id_one_level IN
select bookmark_id
from bm_bookmarks bm_outer
where parent_id =
(
select parent_id from bm_bookmarks where bookmark_id = c_bookmark_id_tree.bookmark_id
)
and not exists
(
select 1 from bm_bookmarks where parent_id = bm_outer.bookmark_id
)
and bm_outer.bookmark_id in
(
select bm.bookmark_id from bm_bookmarks bm, bm_bookmarks bm2
where bm2.bookmark_id = p_bookmark_id
and bm.tree_sortkey between bm2.tree_sortkey and tree_right(bm2.tree_sortkey)
order by bm.tree_sortkey
)
LOOP
delete from acs_permissions where object_id = c_bookmark_id_one_level.bookmark_id;
delete from bm_in_closed_p where bookmark_id = c_bookmark_id_one_level.bookmark_id;
delete from bm_bookmarks where bookmark_id = c_bookmark_id_one_level.bookmark_id;
perform acs_object__delete(c_bookmark_id_one_level.bookmark_id);
END LOOP;
END LOOP;
RETURN 0;
END;
' LANGUAGE 'plpgsql';