Index: openacs-4/packages/acs-content-repository/acs-content-repository.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/acs-content-repository.info,v diff -u -r1.31 -r1.32 --- openacs-4/packages/acs-content-repository/acs-content-repository.info 6 Feb 2004 20:02:03 -0000 1.31 +++ openacs-4/packages/acs-content-repository/acs-content-repository.info 18 Feb 2004 11:10:30 -0000 1.32 @@ -7,7 +7,7 @@ t t - + Dan Wickstrom The canonical repository for OpenACS content. 2004-01-21 @@ -17,7 +17,7 @@ other CMS backing functionality. Utilized by Bug Tracker, File Storage, and other packages. - + Index: openacs-4/packages/acs-content-repository/sql/postgresql/content-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/content-create.sql,v diff -u -r1.41 -r1.42 --- openacs-4/packages/acs-content-repository/sql/postgresql/content-create.sql 11 Dec 2003 21:39:46 -0000 1.41 +++ openacs-4/packages/acs-content-repository/sql/postgresql/content-create.sql 18 Feb 2004 11:10:30 -0000 1.42 @@ -271,28 +271,37 @@ create function cr_items_tree_insert_tr () returns opaque as ' declare - v_parent_sk varbit default null; - v_max_value integer; + v_parent_sk varbit default null; + v_max_value integer; + v_parent_id integer; begin - if new.parent_id is null then - select max(tree_leaf_key_to_int(tree_sortkey)) into v_max_value - from cr_items - where parent_id is null; - else - select max(tree_leaf_key_to_int(tree_sortkey)) into v_max_value - from cr_items - where parent_id = new.parent_id; + -- Lars: If the parent is not a cr_item, we treat it as if it was null. + select item_id + into v_parent_id + from cr_items + where item_id = new.parent_id; - select tree_sortkey into v_parent_sk - from cr_items - where item_id = new.parent_id; - end if; + if v_parent_id is null then + -- Lars: Treat all items with a non-cr_item parent as one big pool wrt tree_sortkeys + -- The old algorithm had tree_sortkeys start from zero for each different parent - new.tree_sortkey := tree_next_key(v_parent_sk, v_max_value); + select max(tree_leaf_key_to_int(child.tree_sortkey)) into v_max_value + from cr_items child, + where not exists (select 1 from cr_items parent where parent.item_id = child.parent_id); + else + select max(tree_leaf_key_to_int(tree_sortkey)) into v_max_value + from cr_items + where parent_id = new.parent_id; - return new; + select tree_sortkey into v_parent_sk + from cr_items + where item_id = new.parent_id; + end if; + new.tree_sortkey := tree_next_key(v_parent_sk, v_max_value); + + return new; end;' language 'plpgsql'; create trigger cr_items_tree_insert_tr before insert @@ -326,14 +335,22 @@ clr_keys_p := ''f''; end if; - select parent_id into p_id - from cr_items - where item_id = v_rec.item_id; + -- Lars: If the parent is not a cr_item, we treat it as if it was null. + select parent.item_id + into p_id + from cr_items parent, + cr_items child + where child.item_id = v_rec.item_id + and parent.item_id = chid.parent_id; if p_id is null then + + -- Lars: Treat all items with a non-cr_item parent as one big pool wrt tree_sortkeys + -- The old algorithm had tree_sortkeys start from zero for each different parent + select max(tree_leaf_key_to_int(tree_sortkey)) into v_max_value - from cr_items - where parent_id is null; + from cr_items child + where not exists (select 1 from cr_items parent where parent.item_id = child.parent_id); else select max(tree_leaf_key_to_int(tree_sortkey)) into v_max_value from cr_items Index: openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-5.0.0-5.1.0d1.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-5.0.0-5.1.0d1.sql,v diff -u -r1.4 -r1.5 --- openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-5.0.0-5.1.0d1.sql 12 Feb 2004 17:00:14 -0000 1.4 +++ openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-5.0.0-5.1.0d1.sql 18 Feb 2004 11:10:31 -0000 1.5 @@ -704,3 +704,132 @@ return v_is_content_type; end;' language 'plpgsql' stable; + + + +/***********************************************************************/ +/* Lars: Make trigger handle parent_id's that are not cr_items */ +/***********************************************************************/ + +drop trigger cr_items_tree_insert_tr on cr_items; +drop function cr_items_tree_insert_tr(); + +create function cr_items_tree_insert_tr () returns opaque as ' +declare + v_parent_sk varbit default null; + v_max_value integer; + v_parent_id integer; +begin + -- Lars: If the parent is not a cr_item, we treat it as if it was null. + select item_id + into v_parent_id + from cr_items + where item_id = new.parent_id; + + if v_parent_id is null then + + -- Lars: Treat all items with a non-cr_item parent as one big pool wrt tree_sortkeys + -- The old algorithm had tree_sortkeys start from zero for each different parent + + select max(tree_leaf_key_to_int(child.tree_sortkey)) into v_max_value + from cr_items child, + where not exists (select 1 from cr_items parent where parent.item_id = child.parent_id); + else + select max(tree_leaf_key_to_int(tree_sortkey)) into v_max_value + from cr_items + where parent_id = new.parent_id; + + select tree_sortkey into v_parent_sk + from cr_items + where item_id = new.parent_id; + end if; + + new.tree_sortkey := tree_next_key(v_parent_sk, v_max_value); + + return new; +end;' language 'plpgsql'; + +create trigger cr_items_tree_insert_tr before insert +on cr_items for each row +execute procedure cr_items_tree_insert_tr (); + + + +drop trigger cr_items_tree_update_tr on cr_items; +drop function cr_items_tree_update_tr(); + +create function cr_items_tree_update_tr () returns opaque as ' +declare + v_parent_sk varbit default null; + v_max_value integer; + p_id integer; + v_rec record; + clr_keys_p boolean default ''t''; +begin + if new.item_id = old.item_id and + ((new.parent_id = old.parent_id) or + (new.parent_id is null and old.parent_id is null)) then + + return new; + + end if; + + for v_rec in select item_id + from cr_items + where tree_sortkey between new.tree_sortkey and tree_right(new.tree_sortkey) + order by tree_sortkey + LOOP + if clr_keys_p then + update cr_items set tree_sortkey = null + where tree_sortkey between new.tree_sortkey and tree_right(new.tree_sortkey); + clr_keys_p := ''f''; + end if; + + -- Lars: If the parent is not a cr_item, we treat it as if it was null. + select parent.item_id + into p_id + from cr_items parent, + cr_items child + where child.item_id = v_rec.item_id + and parent.item_id = chid.parent_id; + + if p_id is null then + + -- Lars: Treat all items with a non-cr_item parent as one big pool wrt tree_sortkeys + -- The old algorithm had tree_sortkeys start from zero for each different parent + + select max(tree_leaf_key_to_int(tree_sortkey)) into v_max_value + from cr_items child + where not exists (select 1 from cr_items parent where parent.item_id = child.parent_id); + else + select max(tree_leaf_key_to_int(tree_sortkey)) into v_max_value + from cr_items + where parent_id = p_id; + + select tree_sortkey into v_parent_sk + from cr_items + where item_id = p_id; + end if; + + update cr_items + set tree_sortkey = tree_next_key(v_parent_sk, v_max_value) + where item_id = v_rec.item_id; + + end LOOP; + + return new; + +end;' language 'plpgsql'; + +create trigger cr_items_tree_update_tr after update +on cr_items +for each row +execute procedure cr_items_tree_update_tr (); + + +-- Now update all the existing tree_sortkeys +-- This will cause the entire set of values to be shifted, +-- i.e. it will no longer start at zero, but at max(tree_sortkey)+1. +-- Don't know how to avoid this. +update cr_items set parent_id = parent_id; +