-- Move old fs_simple_objects URLs to the content repository, where they
-- belong.
--
-- procedure inline_0/0
--
CREATE OR REPLACE FUNCTION inline_0(
) RETURNS integer AS $$
DECLARE
root record;
folder record;
fs_url record;
new_url_id cr_extlinks.extlink_id%TYPE;
BEGIN
for root in select tree_sortkey
from fs_root_folders, cr_items
where fs_root_folders.folder_id = cr_items.item_id
loop
for folder in select folder_id
from cr_folders, cr_items
where cr_items.tree_sortkey between root.tree_sortkey and tree_right(root.tree_sortkey)
and cr_folders.folder_id = cr_items.item_id
loop
if not content_folder__is_registered(folder.folder_id, 'content_symlink', 't') then
perform content_folder__register_content_type(folder.folder_id, 'content_symlink', 't');
end if;
if not content_folder__is_registered(folder.folder_id, 'content_extlink', 't') then
perform content_folder__register_content_type(folder.folder_id, 'content_extlink', 't');
end if;
end loop;
end loop;
for fs_url in select * from fs_urls_full
loop
new_url_id := content_extlink__new (
null,
fs_url.url,
fs_url.name,
fs_url.description,
fs_url.folder_id,
null,
fs_url.creation_date,
fs_url.creation_user,
fs_url.creation_ip
);
update acs_objects
set last_modified = fs_url.last_modified,
modifying_user = fs_url.modifying_user,
modifying_ip = fs_url.modifying_ip
where object_id = fs_url.object_id;
update acs_permissions
set object_id = new_url_id
where object_id = fs_url.object_id;
perform acs_object__delete(fs_url.object_id);
end loop;
return 0;
end
$$ LANGUAGE plpgsql;
begin;
select inline_0();
drop function inline_0();
drop view fs_objects;
drop view fs_urls_full;
drop table fs_urls;
drop table fs_simple_objects;
end;
create view fs_urls_full
as
select cr_extlinks.extlink_id as url_id,
cr_extlinks.url,
cr_items.parent_id as folder_id,
cr_extlinks.label as name,
cr_extlinks.description,
acs_objects.*
from cr_extlinks,
cr_items,
acs_objects
where cr_extlinks.extlink_id = cr_items.item_id
and cr_items.item_id = acs_objects.object_id;
create view fs_objects
as
select cr_items.item_id as object_id,
cr_items.live_revision,
case
when cr_items.content_type = 'content_folder' then 'folder'
when cr_items.content_type = 'content_extlink' then 'url'
else cr_revisions.mime_type
end as type,
case
when cr_items.content_type = 'content_folder'
then (select count(*)
from cr_items ci2
where ci2.content_type <> 'content_folder'
and ci2.tree_sortkey between cr_items.tree_sortkey and tree_right(cr_items.tree_sortkey))
else cr_revisions.content_length
end as content_size,
case
when cr_items.content_type = 'content_folder' then cr_folders.label
when cr_items.content_type = 'content_extlink' then cr_extlinks.label
else cr_items.name
end as name,
cr_revisions.title as file_upload_name,
acs_objects.last_modified,
cr_extlinks.url,
cr_items.parent_id,
cr_items.name as key,
case
when cr_items.content_type = 'content_folder' then 0
else 1
end as sort_key
from cr_items left join cr_extlinks on (cr_items.item_id = cr_extlinks.extlink_id)
left join cr_folders on (cr_items.item_id = cr_folders.folder_id)
left join cr_revisions on (cr_items.live_revision = cr_revisions.revision_id)
join acs_objects on (cr_items.item_id = acs_objects.object_id);
-- JS: BEFORE DELETE TRIGGER to clean up CR entries (except root folder)
drop function fs_package_items_delete_trig ();
--
-- procedure fs_package_items_delete_trig/0
--
CREATE OR REPLACE FUNCTION fs_package_items_delete_trig(
) RETURNS trigger AS $$
DECLARE
v_rec record;
BEGIN
for v_rec in
-- We want to delete all cr_items entries, starting from the leaves all
-- the way up the root folder (old.folder_id).
select c1.item_id, c1.content_type
from cr_items c1, cr_items c2
where c2.item_id = old.folder_id
and c1.tree_sortkey between c2.tree_sortkey and tree_right(c2.tree_sortkey)
and c1.item_id <> old.folder_id
order by c1.tree_sortkey desc
loop
-- DRB: Why can't we just use object delete here?
-- We delete the item. On delete cascade should take care
-- of deletion of revisions.
if v_rec.content_type = 'file_storage_object'
then
raise notice 'Deleting item_id = %',v_rec.item_id;
PERFORM content_item__delete(v_rec.item_id);
end if;
-- Instead of doing an if-else, we make sure we are deleting a folder.
if v_rec.content_type = 'content_folder'
then
raise notice 'Deleting folder_id = %',v_rec.item_id;
PERFORM content_folder__delete(v_rec.item_id);
end if;
-- Instead of doing an if-else, we make sure we are deleting a folder.
if v_rec.content_type = 'content_symlink'
then
raise notice 'Deleting symlink_id = %',v_rec.item_id;
PERFORM content_symlink__delete(v_rec.item_id);
end if;
-- Instead of doing an if-else, we make sure we are deleting a folder.
if v_rec.content_type = 'content_extlink'
then
raise notice 'Deleting folder_id = %',v_rec.item_id;
PERFORM content_extlink__delete(v_rec.item_id);
end if;
end loop;
-- We need to return something for the trigger to be activated
return old;
END;
$$ LANGUAGE plpgsql;
drop trigger fs_package_items_delete_trig on fs_root_folders;
create trigger fs_package_items_delete_trig before delete
on fs_root_folders for each row
execute procedure fs_package_items_delete_trig ();