-- etp-create.sql
-- @author Luke Pond (dlpond@pobox.com)
-- @creation-date 2001-05-31
--
create sequence t_etp_auto_page_number_seq;
create view etp_auto_page_number_seq as
select nextval('t_etp_auto_page_number_seq') as nextval;
select define_function_args('etp__get_attribute_value','object_id,attribute_id');
--
-- procedure etp__get_attribute_value/2
--
CREATE OR REPLACE FUNCTION etp__get_attribute_value(
p_object_id integer,
p_attribute_id integer
) RETURNS varchar AS $$
DECLARE
v_value varchar;
BEGIN
select attr_value
into v_value
from acs_attribute_values
where object_id = p_object_id
and attribute_id = p_attribute_id;
if not found then
v_value := '';
end if;
return v_value;
END;
$$ LANGUAGE plpgsql;
--
-- procedure etp__create_page/4
--
CREATE OR REPLACE FUNCTION etp__create_page(
p_package_id integer,
p_name varchar,
p_title varchar,
p_content_type varchar -- default null -> use content_revision
) RETURNS integer AS $$
DECLARE
v_item_id integer;
v_revision_id integer;
v_folder_id integer;
BEGIN
v_item_id := acs_object__new(null, 'content_item', now(), null, null, p_package_id);
v_folder_id := etp__get_folder_id(p_package_id);
-- due to a change in acs_object__delete we can reference the actual
-- object type we want
-- using this we can more easily search, but we will have to create a service
-- contract for each custom content type
-- we define a default etp_page_revision and service contract to go with it
-- make sure to subtype from etp_page_revision for any custom types
-- 2003-01-12 DaveB
insert into cr_items (
item_id, parent_id, name, content_type
) values (
v_item_id, v_folder_id, p_name, p_content_type
);
v_revision_id := acs_object__new(null, p_content_type, now(), null, null, v_item_id);
insert into cr_revisions (revision_id, item_id, title,
publish_date, mime_type)
values (v_revision_id, v_item_id, p_title, now(), 'text/enhanced');
update cr_items set live_revision = v_revision_id
where item_id = v_item_id;
return 1;
END;
$$ LANGUAGE plpgsql;
select define_function_args('etp__create_page','item_id,package_id,name,title,content_type;null');
--
-- procedure etp__create_page/5
--
CREATE OR REPLACE FUNCTION etp__create_page(
p_item_id integer,
p_package_id integer,
p_name varchar,
p_title varchar,
p_content_type varchar -- default null -> use content_revision
) RETURNS integer AS $$
DECLARE
v_item_id integer;
v_revision_id integer;
v_folder_id integer;
BEGIN
if p_item_id is null then
v_item_id := acs_object__new(null, 'content_item', now(), null, null, p_package_id);
else
v_item_id := acs_object__new(p_item_id, 'content_item', now(), null, null, p_package_id);
end if;
v_folder_id := etp__get_folder_id(p_package_id);
-- due to a change in acs_object__delete we can reference the actual
-- object type we want
-- using this we can more easily search, but we will have to create a service
-- contract for each custom content type
-- we define a default etp_page_revision and service contract to go with it
-- make sure to subtype from etp_page_revision for any custom types
-- 2003-01-12 DaveB
insert into cr_items (
item_id, parent_id, name, content_type
) values (
v_item_id, v_folder_id, p_name, p_content_type
);
v_revision_id := acs_object__new(null, p_content_type, now(), null, null, v_item_id);
insert into cr_revisions (revision_id, item_id, title,
publish_date, mime_type)
values (v_revision_id, v_item_id, p_title, now(), 'text/enhanced');
update cr_items set live_revision = v_revision_id
where item_id = v_item_id;
return 1;
END;
$$ LANGUAGE plpgsql;
select define_function_args('etp__create_extlink','item_id;null,package_id,url,title,description');
--
-- procedure etp__create_extlink/5
--
CREATE OR REPLACE FUNCTION etp__create_extlink(
p_item_id integer,
p_package_id integer,
p_url varchar,
p_title varchar,
p_description varchar
) RETURNS integer AS $$
DECLARE
v_item_id integer;
v_folder_id integer;
BEGIN
v_item_id := acs_object__new(p_item_id, 'content_extlink');
v_folder_id := etp__get_folder_id(p_package_id);
insert into cr_items (
item_id, parent_id, name, content_type
) values (
v_item_id, v_folder_id, 'extlink ' || nextval('t_etp_auto_page_number_seq'), 'content_extlink'
);
insert into cr_extlinks
(extlink_id, url, label, description)
values
(v_item_id, p_url, p_title, p_description);
return 1;
END;
$$ LANGUAGE plpgsql;
--
-- procedure etp__create_extlink/4
--
CREATE OR REPLACE FUNCTION etp__create_extlink(
p_package_id integer,
p_url varchar,
p_title varchar,
p_description varchar
) RETURNS integer AS $$
DECLARE
v_item_id integer;
v_folder_id integer;
BEGIN
return etp__create_extlink(null::integer, p_package_id, p_url, p_title, p_description);
END;
$$ LANGUAGE plpgsql;
select define_function_args('etp__create_symlink','package_id,target_id');
--
-- procedure etp__create_symlink/2
--
CREATE OR REPLACE FUNCTION etp__create_symlink(
p_package_id integer,
p_target_id integer
) RETURNS integer AS $$
DECLARE
v_item_id integer;
v_folder_id integer;
BEGIN
v_item_id := acs_object__new(null, 'content_symlink');
v_folder_id := etp__get_folder_id(p_package_id);
insert into cr_items (
item_id, parent_id, name, content_type
) values (
v_item_id, v_folder_id, 'symlink ' || nextval('t_etp_auto_page_number_seq'), 'content_symlink'
);
insert into cr_symlinks
(symlink_id, target_id)
values
(v_item_id, p_target_id);
return 1;
END;
$$ LANGUAGE plpgsql;
--
-- procedure etp__create_new_revision/3
--
CREATE OR REPLACE FUNCTION etp__create_new_revision(
p_package_id integer,
p_name varchar,
p_user_id integer
) RETURNS integer AS $$
DECLARE
v_revision_id integer;
v_item_id integer;
v_new_revision_id integer;
v_content_type varchar;
BEGIN
select max(r.revision_id)
into v_revision_id
from cr_revisions r, cr_items i
where i.name = p_name
and i.parent_id = etp__get_folder_id(p_package_id)
and r.item_id = i.item_id;
select item_id
into v_item_id
from cr_revisions
where revision_id = v_revision_id;
select object_type
into v_content_type
from acs_objects
where object_id = v_revision_id;
-- cannot use acs_object__new because it creates attributes with their
-- default values, which is not what we want.
select nextval('t_acs_object_id_seq')
into v_new_revision_id from dual;
insert into acs_objects (object_id, object_type, creation_date, creation_user, context_id)
values (v_new_revision_id, v_content_type, now(), p_user_id, v_item_id);
insert into cr_revisions (revision_id, item_id, title, description, content, mime_type)
select v_new_revision_id, item_id, title, description, content, mime_type
from cr_revisions r
where r.revision_id = v_revision_id;
-- copy extended attributes to the new revision, if there are any
insert into acs_attribute_values (object_id, attribute_id, attr_value)
select v_new_revision_id as object_id, attribute_id, attr_value
from acs_attribute_values
where object_id = v_revision_id;
return 1;
END;
$$ LANGUAGE plpgsql;
select define_function_args('etp__create_new_revision','package_id,name,user_id,revision_id');
--
-- procedure etp__create_new_revision/4
--
CREATE OR REPLACE FUNCTION etp__create_new_revision(
p_package_id integer,
p_name varchar,
p_user_id integer,
p_revision_id integer
) RETURNS integer AS $$
DECLARE
v_revision_id integer;
v_item_id integer;
v_content_type varchar;
BEGIN
select max(r.revision_id)
into v_revision_id
from cr_revisions r, cr_items i
where i.name = p_name
and i.parent_id = etp__get_folder_id(p_package_id)
and r.item_id = i.item_id;
select item_id
into v_item_id
from cr_revisions
where revision_id = v_revision_id;
select object_type
into v_content_type
from acs_objects
where object_id = v_revision_id;
-- cannot use acs_object__new because it creates attributes with their
-- default values, which is not what we want.
insert into acs_objects (object_id, object_type, creation_date, creation_user, context_id)
values (p_revision_id, v_content_type, now(), p_user_id, v_item_id);
insert into cr_revisions (revision_id, item_id, title, description, content, mime_type)
select p_revision_id, item_id, title, description, content, mime_type
from cr_revisions r
where r.revision_id = v_revision_id;
-- copy extended attributes to the new revision, if there are any
insert into acs_attribute_values (object_id, attribute_id, attr_value)
select p_revision_id as object_id, attribute_id, attr_value
from acs_attribute_values
where object_id = v_revision_id;
return 1;
END;
$$ LANGUAGE plpgsql;
select define_function_args('etp__get_folder_id','package_id');
--
-- procedure etp__get_folder_id/1
--
CREATE OR REPLACE FUNCTION etp__get_folder_id(
p_package_id integer
) RETURNS integer AS $$
DECLARE
v_folder_id integer;
v_parent_id integer;
BEGIN
select folder_id into v_folder_id
from cr_folders
where package_id = p_package_id;
if not found then
select parent_id into v_parent_id
from site_nodes
where object_id = p_package_id;
if found and v_parent_id is null then
v_folder_id := content_item__get_root_folder(null);
else
-- This is probably an ETP app instance that
-- was created through the Site Map; by returning
-- 0 we ensure the get_page_attributes query will
-- fail and index.vuh will redirect to etp-setup-2.
v_folder_id := 0;
end if;
end if;
return v_folder_id;
END;
$$ LANGUAGE plpgsql;
select define_function_args('etp__get_relative_url','item_id,name');
--
-- procedure etp__get_relative_url/2
--
CREATE OR REPLACE FUNCTION etp__get_relative_url(
p_item_id integer,
p_name varchar
) RETURNS varchar AS $$
DECLARE
v_item_id integer;
v_url varchar;
v_object_type varchar;
v_link_rec record;
BEGIN
select object_type into v_object_type
from acs_objects
where object_id = p_item_id;
if v_object_type = 'content_item' then
return p_name;
end if;
if v_object_type = 'content_folder' then
select s.name || '/' into v_url
from cr_folders f, site_nodes s
where f.folder_id = p_item_id
and s.object_id = f.package_id;
return v_url;
end if;
if v_object_type = 'content_extlink' then
select url into v_url
from cr_extlinks
where extlink_id = p_item_id;
return v_url;
end if;
if v_object_type = 'content_symlink' then
select target_id into v_item_id
from cr_symlinks
where symlink_id = p_item_id;
select f.package_id, i.name
into v_link_rec
from cr_items i, cr_folders f
where i.item_id = v_item_id
and i.parent_id = f.folder_id;
select site_node__url(s.node_id) into v_url
from site_nodes s
where s.object_id = v_link_rec.package_id;
return v_url || v_link_rec.name;
end if;
return null;
END;
$$ LANGUAGE plpgsql;
select define_function_args('etp__get_title','item_id,revision_title');
--
-- procedure etp__get_title/2
--
CREATE OR REPLACE FUNCTION etp__get_title(
p_item_id integer,
p_revision_title varchar
) RETURNS varchar AS $$
DECLARE
v_item_id integer;
v_title varchar;
v_object_type varchar;
BEGIN
if p_revision_title is not null then
return p_revision_title;
end if;
select object_type from acs_objects into v_object_type
where object_id = p_item_id;
if v_object_type = 'content_folder' then
select r.title
into v_title
from cr_items i, cr_revisions r
where i.parent_id = p_item_id
and i.name = 'index'
and i.live_revision = r.revision_id;
return v_title;
end if;
if v_object_type = 'content_extlink' then
select label into v_title
from cr_extlinks
where extlink_id = p_item_id;
return v_title;
end if;
if v_object_type = 'content_symlink' then
select target_id into v_item_id
from cr_symlinks
where symlink_id = p_item_id;
return etp__get_title(v_item_id, null);
end if;
if v_object_type = 'content_item' then
select r.title into v_title
from cr_items i, cr_revisions r
where i.item_id = v_item_id
and i.live_revision = r.revision_id;
return v_title;
end if;
return null;
END;
$$ LANGUAGE plpgsql;
select define_function_args('etp__get_description','item_id,revision_description');
--
-- procedure etp__get_description/2
--
CREATE OR REPLACE FUNCTION etp__get_description(
p_item_id integer,
p_revision_description varchar
) RETURNS varchar AS $$
DECLARE
v_item_id integer;
v_description varchar;
v_object_type varchar;
BEGIN
if p_revision_description is not null then
return p_revision_description;
end if;
select object_type from acs_objects into v_object_type
where object_id = p_item_id;
if v_object_type = 'content_folder' then
select r.description
into v_description
from cr_items i, cr_revisions r
where i.parent_id = p_item_id
and i.name = 'index'
and i.live_revision = r.revision_id
and i.item_id = r.item_id;
return v_description;
end if;
if v_object_type = 'content_extlink' then
select description into v_description
from cr_extlinks
where extlink_id = p_item_id;
return v_description;
end if;
if v_object_type = 'content_symlink' then
select target_id into v_item_id
from cr_symlinks
where symlink_id = p_item_id;
return etp__get_description(v_item_id, null);
end if;
if v_object_type = 'content_item' then
select r.description into v_description
from cr_items i, cr_revisions r
where i.item_id = v_item_id
and i.live_revision = r.revision_id;
return v_description;
end if;
return null;
END;
$$ LANGUAGE plpgsql;
-- create a folder with magic folder_id of -400 where we
-- will put all deleted content items so they'll be recoverable.
CREATE OR REPLACE FUNCTION inline_1(
) RETURNS integer AS $$
DECLARE
v_folder_id integer;
BEGIN
select folder_id into v_folder_id from cr_folders where folder_id = -400;
if not found then
perform content_folder__new (
'trash',
'Trash',
'Deleted content items get put here',
0,
null,
-400,
now(),
null,
null
);
end if;
return 0;
END;
$$ LANGUAGE plpgsql;
select inline_1 ();
drop function inline_1 ();
-- create a default content_type etp_page_revision
-- DaveB
-- this references a non-existent table
-- which I might have to change...
select content_type__create_type (
'etp_page_revision', -- content_type
'content_revision', -- supertype
'ETP managed page', -- pretty_name
'ETP managed pages', -- pretty_plural
'etp_page_revisions', -- table_name
'etp_page_revision_id', -- id_column
'content_revision__revision_name' -- name_method
);
-- Include the search service contract implementation (olah)
\i edit-this-page-sc-create.sql