begin; drop FUNCTION if exists content_folder__copy( copy__folder_id integer, copy__target_folder_id integer, copy__creation_user integer, copy__creation_ip varchar ); drop FUNCTION if exists content_folder__copy( copy__folder_id integer, copy__target_folder_id integer, copy__creation_user integer, copy__creation_ip varchar, copy__name varchar ); -- added select define_function_args('content_folder__copy','folder_id,target_folder_id,creation_user,creation_ip;null,name;null,label;null'); -- -- procedure content_folder__copy/6 -- CREATE OR REPLACE FUNCTION content_folder__copy( copy__folder_id integer, copy__target_folder_id integer, copy__creation_user integer, copy__creation_ip varchar default null, copy__name cr_items.name%TYPE default null, copy__label cr_folders.label%TYPE default null ) RETURNS integer AS $$ DECLARE v_valid_folders_p integer; v_current_folder_id cr_folders.folder_id%TYPE; v_name cr_items.name%TYPE; v_label cr_folders.label%TYPE; v_description cr_folders.description%TYPE; v_new_folder_id cr_folders.folder_id%TYPE; v_folder_contents_val record; BEGIN if copy__folder_id = content_item__get_root_folder(null) or copy__folder_id = content_template__get_root_folder() then raise EXCEPTION '-20000: content_folder.copy - Not allowed to copy root folder'; end if; select count(*) into v_valid_folders_p from cr_folders where folder_id = copy__target_folder_id or folder_id = copy__folder_id; if v_valid_folders_p != 2 then raise EXCEPTION '-20000: content_folder.copy - Invalid folder(s)'; end if; if copy__target_folder_id = copy__folder_id then raise EXCEPTION '-20000: content_folder.copy - Cannot copy folder to itself'; end if; if content_folder__is_sub_folder(copy__folder_id, copy__target_folder_id) = 't' then raise EXCEPTION '-20000: content_folder.copy - Destination folder is subfolder'; end if; if content_folder__is_registered(copy__target_folder_id,'content_folder','f') != 't' then raise EXCEPTION '-20000: content_folder.copy - Destination folder does not allow subfolders'; end if; -- get the source folder info select name, label, description, parent_id into v_name, v_label, v_description, v_current_folder_id from cr_items i, cr_folders f where f.folder_id = i.item_id and f.folder_id = copy__folder_id; -- would be better to check if the copy__name already exists in the destination folder. if v_current_folder_id = copy__target_folder_id and (v_name = copy__name or copy__name is null) then raise EXCEPTION '-20000: content_folder.copy - Destination folder is parent folder and folder already exists'; end if; -- create the new folder v_new_folder_id := content_folder__new( coalesce (copy__name, v_name), coalesce (copy__label, v_label), v_description, copy__target_folder_id, copy__target_folder_id, null, now(), copy__creation_user, copy__creation_ip, 't', null ); -- copy attributes of original folder insert into cr_folder_type_map select v_new_folder_id as folder_id, content_type from cr_folder_type_map map where folder_id = copy__folder_id and -- do not register content_type if it is already registered not exists ( select 1 from cr_folder_type_map where folder_id = v_new_folder_id and content_type = map.content_type ) ; -- for each item in the folder, copy it for v_folder_contents_val in select item_id from cr_items where parent_id = copy__folder_id LOOP PERFORM content_item__copy( v_folder_contents_val.item_id, v_new_folder_id, copy__creation_user, copy__creation_ip, null ); end loop; return 0; END; $$ LANGUAGE plpgsql; end;