--
-- content_item__copy/5
--
create or replace function content_item__copy(
copy__item_id integer,
copy__target_folder_id integer,
copy__creation_user integer,
copy__creation_ip character varying DEFAULT NULL::character varying,
copy__name character varying DEFAULT NULL::character varying
) returns int4 as $$
DECLARE
v_current_folder_id cr_folders.folder_id%TYPE;
v_num_revisions integer;
v_name cr_items.name%TYPE;
v_content_type cr_items.content_type%TYPE;
v_locale cr_items.locale%TYPE;
v_item_id cr_items.item_id%TYPE;
v_revision_id cr_revisions.revision_id%TYPE;
v_is_registered boolean;
v_old_revision_id cr_revisions.revision_id%TYPE;
v_new_revision_id cr_revisions.revision_id%TYPE;
v_old_live_revision_id cr_revisions.revision_id%TYPE;
v_new_live_revision_id cr_revisions.revision_id%TYPE;
v_storage_type cr_items.storage_type%TYPE;
BEGIN
-- call content_folder.copy if the item is a folder
if content_folder__is_folder(copy__item_id) = 't' then
PERFORM content_folder__copy(
copy__item_id,
copy__target_folder_id,
copy__creation_user,
copy__creation_ip,
copy__name
);
-- call content_symlink.copy if the item is a symlink
else if content_symlink__is_symlink(copy__item_id) = 't' then
PERFORM content_symlink__copy(
copy__item_id,
copy__target_folder_id,
copy__creation_user,
copy__creation_ip,
copy__name
);
-- call content_extlink.copy if the item is an url
else if content_extlink__is_extlink(copy__item_id) = 't' then
PERFORM content_extlink__copy(
copy__item_id,
copy__target_folder_id,
copy__creation_user,
copy__creation_ip,
copy__name
);
-- make sure the target folder is really a folder
else if content_folder__is_folder(copy__target_folder_id) = 't' then
select
parent_id
into
v_current_folder_id
from
cr_items
where
item_id = copy__item_id;
select
content_type, name, locale,
coalesce(live_revision, latest_revision), storage_type
into
v_content_type, v_name, v_locale, v_revision_id, v_storage_type
from
cr_items
where
item_id = copy__item_id;
-- copy to a different folder, or allow copy to the same folder
-- with a different name
if copy__target_folder_id != v_current_folder_id or ( v_name != copy__name and copy__name is not null ) then
-- make sure the content type of the item is registered to the folder
v_is_registered := content_folder__is_registered(
copy__target_folder_id,
v_content_type,
'f'
);
if v_is_registered = 't' then
--
-- create the new content item via content_item__new/21
--
v_item_id := content_item__new(
coalesce (copy__name, v_name),
copy__target_folder_id,
null, -- item_id
v_locale,
now(), -- creation_date
copy__creation_user,
null, -- context_id
copy__creation_ip,
'content_item',
v_content_type,
null, -- title
null, -- description
'text/plain', -- mime_type
null, -- nls_language
null, -- text
null, -- data
null, -- relation_tag
'f', -- is_live
v_storage_type,
null, -- package_id
't' -- with_child_rels
);
select
latest_revision, live_revision into v_old_revision_id, v_old_live_revision_id
from
cr_items
where
item_id = copy__item_id;
end if;
-- copy the latest revision (if any) to the new item
if v_old_revision_id is not null then
v_new_revision_id := content_revision__copy (
v_old_revision_id,
null,
v_item_id,
copy__creation_user,
copy__creation_ip
);
end if;
-- copy the live revision (if there is one and it differs from the latest) to the new item
if v_old_live_revision_id is not null then
if v_old_live_revision_id <> v_old_revision_id then
v_new_live_revision_id := content_revision__copy (
v_old_live_revision_id,
null,
v_item_id,
copy__creation_user,
copy__creation_ip
);
else
v_new_live_revision_id := v_new_revision_id;
end if;
end if;
update cr_items set live_revision = v_new_live_revision_id, latest_revision = v_new_revision_id where item_id = v_item_id;
end if;
end if; end if; end if; end if;
return v_item_id;
END;
$$ language plpgsql;