-- -- The Categories Package -- -- @author Timo Hentschel (timo@timohentschel.de) -- @author Michael Steigman (michael@steigman.net) -- @creation-date 2003-04-16 -- -- added select define_function_args('category_tree__new','tree_id,locale,tree_name,description,site_wide_p,creation_date,creation_user,creation_ip,context_id'); -- -- procedure category_tree__new/9 -- CREATE OR REPLACE FUNCTION category_tree__new( p_tree_id integer, p_locale varchar, p_tree_name varchar, p_description varchar, p_site_wide_p boolean, p_creation_date timestamp with time zone, p_creation_user integer, p_creation_ip varchar, p_context_id integer ) RETURNS integer AS $$ DECLARE v_tree_id integer; BEGIN v_tree_id := acs_object__new ( p_tree_id, -- object_id 'category_tree', -- object_type p_creation_date, -- creation_date p_creation_user, -- creation_user p_creation_ip, -- creation_ip p_context_id, -- context_id p_tree_name, -- title null -- package_id ); insert into category_trees (tree_id, site_wide_p) values (v_tree_id, p_site_wide_p); perform acs_permission__grant_permission ( v_tree_id, -- object_id p_creation_user, -- grantee_id 'category_tree_read' -- privilege ); perform acs_permission__grant_permission ( v_tree_id, -- object_id p_creation_user, -- grantee_id 'category_tree_write' -- privilege ); perform acs_permission__grant_permission ( v_tree_id, -- object_id p_creation_user, -- grantee_id 'category_tree_grant_permissions' -- privilege ); insert into category_tree_translations (tree_id, locale, name, description) values (v_tree_id, p_locale, p_tree_name, p_description); return v_tree_id; END; $$ LANGUAGE plpgsql; -- added select define_function_args('category_tree__new_translation','tree_id,locale,tree_name,description,modifying_date,modifying_user,modifying_ip'); -- -- procedure category_tree__new_translation/7 -- CREATE OR REPLACE FUNCTION category_tree__new_translation( p_tree_id integer, p_locale varchar, p_tree_name varchar, p_description varchar, p_modifying_date timestamp with time zone, p_modifying_user integer, p_modifying_ip varchar ) RETURNS integer AS $$ DECLARE BEGIN insert into category_tree_translations (tree_id, locale, name, description) values (p_tree_id, p_locale, p_tree_name, p_description); update acs_objects set last_modified = p_modifying_date, modifying_user = p_modifying_user, modifying_ip = p_modifying_ip where object_id = p_tree_id; return 0; END; $$ LANGUAGE plpgsql; -- added select define_function_args('category_tree__del','tree_id'); -- -- procedure category_tree__del/1 -- CREATE OR REPLACE FUNCTION category_tree__del( p_tree_id integer ) RETURNS integer AS $$ DECLARE BEGIN delete from category_tree_map where tree_id = p_tree_id; delete from category_object_map where category_id in (select category_id from categories where tree_id = p_tree_id); delete from category_translations where category_id in (select category_id from categories where tree_id = p_tree_id); delete from categories where tree_id = p_tree_id; delete from acs_objects where context_id = p_tree_id; delete from acs_permissions where object_id = p_tree_id; delete from category_tree_translations where tree_id = p_tree_id; delete from category_trees where tree_id = p_tree_id; perform acs_object__delete(p_tree_id); return 0; END; $$ LANGUAGE plpgsql; -- added select define_function_args('category_tree__edit','tree_id,locale,tree_name,description,site_wide_p,modifying_date,modifying_user,modifying_ip'); -- -- procedure category_tree__edit/8 -- CREATE OR REPLACE FUNCTION category_tree__edit( p_tree_id integer, p_locale varchar, p_tree_name varchar, p_description varchar, p_site_wide_p boolean, p_modifying_date timestamp with time zone, p_modifying_user integer, p_modifying_ip varchar ) RETURNS integer AS $$ DECLARE BEGIN update category_trees set site_wide_p = p_site_wide_p where tree_id = p_tree_id; update category_tree_translations set name = p_tree_name, description = p_description where tree_id = p_tree_id and locale = p_locale; update acs_objects set last_modified = p_modifying_date, modifying_user = p_modifying_user, modifying_ip = p_modifying_ip where object_id = p_tree_id; return 0; END; $$ LANGUAGE plpgsql; -- 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; -- added select define_function_args('category_tree__map','object_id,tree_id,subtree_category_id,assign_single_p,require_category_p,widget'); -- -- procedure category_tree__map/6 -- CREATE OR REPLACE FUNCTION category_tree__map( p_object_id integer, p_tree_id integer, p_subtree_category_id integer, p_assign_single_p boolean, p_require_category_p boolean, p_widget varchar ) RETURNS integer AS $$ DECLARE v_map_count integer; BEGIN select count(*) into v_map_count from category_tree_map where object_id = p_object_id and tree_id = p_tree_id; if v_map_count = 0 then insert into category_tree_map (tree_id, subtree_category_id, object_id, assign_single_p, require_category_p, widget) values (p_tree_id, p_subtree_category_id, p_object_id, p_assign_single_p, p_require_category_p, p_widget); end if; return 0; END; $$ LANGUAGE plpgsql; -- added select define_function_args('category_tree__unmap','object_id,tree_id'); -- -- procedure category_tree__unmap/2 -- CREATE OR REPLACE FUNCTION category_tree__unmap( p_object_id integer, p_tree_id integer ) RETURNS integer AS $$ DECLARE BEGIN delete from category_tree_map where object_id = p_object_id and tree_id = p_tree_id; return 0; END; $$ LANGUAGE plpgsql; -- added select define_function_args('category_tree__name','tree_id'); -- -- procedure category_tree__name/1 -- CREATE OR REPLACE FUNCTION category_tree__name( p_tree_id integer ) RETURNS varchar AS $$ DECLARE v_name varchar; BEGIN select name into v_name from category_tree_translations where tree_id = p_tree_id and locale = 'en_US'; return v_name; END; $$ LANGUAGE plpgsql; -- added select define_function_args('category_tree__check_nested_ind','tree_id'); -- -- procedure category_tree__check_nested_ind/1 -- CREATE OR REPLACE FUNCTION category_tree__check_nested_ind( p_tree_id integer ) RETURNS integer AS $$ DECLARE v_negative numeric; v_order numeric; v_parent numeric; BEGIN select count(*) into v_negative from categories where tree_id = p_tree_id and (left_ind < 1 or right_ind < 1); if v_negative > 0 then raise EXCEPTION '-20001: negative index not allowed!'; end if; select count(*) into v_order from categories where tree_id = p_tree_id and left_ind >= right_ind; if v_order > 0 then raise EXCEPTION '-20002: right index must be greater than left index!'; end if; select count(*) into v_parent from categories parent, categories child where parent.tree_id = p_tree_id and child.tree_id = parent.tree_id and (parent.left_ind >= child.left_ind or parent.right_ind <= child.right_ind) and child.parent_id = parent.category_id; if v_parent > 0 then raise EXCEPTION '-20003: child index must be between parent index!'; end if; return 0; END; $$ LANGUAGE plpgsql;