-- added select define_function_args('category_tree__copy','source_tree,dest_tree,creation_user,creation_ip'); -- -- procedure category_tree__copy/4 -- CREATE OR REPLACE FUNCTION category_tree__copy( p_source_tree integer, p_dest_tree integer, p_creation_user integer, p_creation_ip varchar ) RETURNS integer AS $$ DECLARE v_new_left_ind integer; v_category_id integer; source record; BEGIN select coalesce(max(right_ind),0) into v_new_left_ind from categories where tree_id = p_dest_tree; for source in (select category_id, parent_id, left_ind, right_ind from categories where tree_id = p_source_tree) loop v_category_id := acs_object__new ( null, 'category', -- object_type now(), -- creation_date p_creation_user, -- creation_user p_creation_ip, -- creation_ip p_dest_tree -- context_id ); insert into categories (category_id, tree_id, parent_id, left_ind, right_ind) values (v_category_id, p_dest_tree, source.parent_id, source.left_ind + v_new_left_ind, source.right_ind + v_new_left_ind); end loop; -- correct parent_ids update categories set parent_id = (select t.category_id from categories s, categories t where s.category_id = categories.parent_id and t.tree_id = p_dest_tree and s.left_ind + v_new_left_ind = t.left_ind) where tree_id = p_dest_tree; -- copy all translations insert into category_translations (category_id, locale, name, description) (select ct.category_id, t.locale, t.name, t.description from category_translations t, categories cs, categories ct where ct.tree_id = p_dest_tree and cs.tree_id = p_source_tree and cs.left_ind + v_new_left_ind = ct.left_ind and t.category_id = cs.category_id); -- for debugging reasons perform category_tree__check_nested_ind(p_dest_tree); return 0; END; $$ LANGUAGE plpgsql;