--
-- packages/acs-messaging/sql/acs-messaging-packages.sql
--
-- @author John Prevost <jmp@arsdigita.com>
-- @author Phong Nguyen <phong@arsdigita.com>
-- @author Jon Griffin <jon@jongriffin.com>
-- @creation-date 2000-08-27
-- @cvs-id $Id: acs-messaging-packages.sql,v 1.21.2.1 2021/02/24 03:31:15 gustafn Exp $
--
-- updated for OpenACS by Jon Griffin
--
-- added
select define_function_args('acs_message__edit','message_id,title;null,description;null,mime_type;text/plain,text;null,data;null,creation_date;sysdate,creation_user;null,creation_ip;null,is_live;t');
--
-- procedure acs_message__edit/10
--
CREATE OR REPLACE FUNCTION acs_message__edit(
p_message_id integer,
p_title varchar, -- default null
p_description varchar, -- default null
p_mime_type varchar, -- default 'text/plain'
p_text text, -- default null
p_data integer, -- default null
p_creation_date timestamptz, -- default sysdate
p_creation_user integer, -- default null
p_creation_ip varchar, -- default null
p_is_live boolean -- default 't'
) RETURNS integer AS $$
DECLARE
v_revision_id cr_revisions.revision_id%TYPE;
BEGIN
-- create a new revision using whichever call is appropriate
if p_data is not null then
-- need to take care of blob?
v_revision_id := content_revision__new (
p_title, -- title
p_description, -- description
now(), -- publish_date
p_mime_type, -- mime_type
null, -- nls_language
p_data, -- data
p_message_id, -- item_id
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip -- creation_ip
);
else if p_title is not null or p_text is not null then
v_revision_id := content_revision__new (
p_title, -- title
p_description, -- description
now(), -- publish_date
p_mime_type, -- mime_type
null, -- nls_language
p_text, -- text
p_message_id, -- item_id
null, -- revision_id
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
null, -- content_length
null -- package_id
);
end if;
end if;
-- test for auto approval of revision
if p_is_live then
perform content_item__set_live_revision(v_revision_id);
end if;
return v_revision_id;
END;
$$ LANGUAGE plpgsql;
----------------
-- MAJOR NOTE OF NON-COMPLIANCE
-- I am exercising my rights as the porter here!
-- I can only use 16 parameters so I am changing one
-- creation_date will default to sysdate and not be a parameter
-- possibly another function can be made to change that
-- although I really don't see much need for this.
-- Jon Griffin 05-21-2001
----------------
-- added
select define_function_args('acs_message__new','message_id,reply_to,sent_date,sender,rfc822_id,title,description,mime_type,text,data,parent_id,context_id,creation_user,creation_ip,object_type,is_live,package_id');
--
-- procedure acs_message__new/17
--
CREATE OR REPLACE FUNCTION acs_message__new(
p_message_id integer, --default null,
p_reply_to integer, --default null,
p_sent_date timestamptz, --default sysdate,
p_sender integer, --default null,
p_rfc822_id varchar, --default null,
p_title varchar, --default null,
p_description varchar, --default null,
p_mime_type varchar, --default 'text/plain',
p_text text, --default null,
p_data integer, --default null,
p_parent_id integer, --default 0,
p_context_id integer,
p_creation_user integer, --default null,
p_creation_ip varchar, --default null,
p_object_type varchar, --default 'acs_message',
p_is_live boolean, --default 't'
p_package_id integer default null
) RETURNS integer AS $$
DECLARE
p_creation_date timestamptz := current_timestamp; -- alias for $13 --default sysdate,
v_message_id acs_messages.message_id%TYPE;
v_revision_id cr_revisions.revision_id%TYPE;
BEGIN
-- -- generate a message id now so we can get an rfc822 message-id
-- if p_message_id is null then
-- select nextval('t_acs_object_id_seq') into v_message_id;
-- else
-- v_message_id := p_message_id;
-- end if;
-- -- need to make this mandatory also - jg
-- -- this needs to be fixed up, but Oracle doesn't give us a way
-- -- to get the FQDN
-- -- vk: get SystemURL parameter and use it to extract domain name
-- select apm__get_value(package_id, 'SystemURL') into v_system_url
-- from apm_packages where package_key='acs-kernel';
-- v_idx := position('http://' in v_system_url);
-- v_domain_name := trim (substr(v_system_url, v_idx + 7));
-- if p_rfc822_id is null then
-- v_rfc822_id := current_date || '.' || v_message_id || '@' ||
-- v_domain_name || '.hate';
-- else
-- v_rfc822_id := p_rfc822_id;
-- end if;
-- Antonio Pisano 2016-09-20
-- rfc822_id MUST come from the tcl, no more
-- sql tricks to retrieve one if missing.
-- Motivations:
-- 1) duplication. We have same logics in acs_mail_lite::generate_message_id
-- 2) what if SystemURL is https?
-- 3) empty SystemURL would break General Comments
if p_rfc822_id is null then
RAISE null_value_not_allowed;
end if;
v_message_id := content_item__new (
p_rfc822_id, -- 1 name
p_parent_id, -- 2 parent_id
p_message_id, -- 3 item_id
null, -- 4 locale
p_creation_date, -- 5 creation_date
p_creation_user, -- 6 creation_user
p_context_id, -- 7 context_id
p_creation_ip, -- 8 creation_ip
p_object_type, -- 9 item_subtype
'acs_message_revision', -- 10 content_type
null, -- 11 title
null, -- 12 description
'text/plain', -- 13 mime_type
null, -- 14 nls_language
null, -- 15 text
null, -- 16 data
null, -- 17 relation_tag
'f', -- 18 is_live
'text', -- 19 storage_type
p_package_id, -- 20 package_id
't' -- 21 with_child_rels
);
insert into acs_messages
(message_id, reply_to, sent_date, sender, rfc822_id)
values
(v_message_id, p_reply_to, p_sent_date, p_sender, p_rfc822_id);
-- create an initial revision for the new message
v_revision_id := acs_message__edit (
v_message_id, -- message_id
p_title, -- title
p_description, -- description
p_mime_type, -- mime_type
p_text, -- text
p_data, -- data
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_is_live -- is_live
);
return v_message_id;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__delete','message_id');
--
-- procedure acs_message__delete/1
--
CREATE OR REPLACE FUNCTION acs_message__delete(
p_message_id integer
) RETURNS integer AS $$
DECLARE
BEGIN
delete from acs_messages where message_id = p_message_id;
perform content_item__delete(p_message_id);
return 1;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__message_p','message_id');
--
-- procedure acs_message__message_p/1
--
CREATE OR REPLACE FUNCTION acs_message__message_p(
p_message_id integer
) RETURNS boolean AS $$
DECLARE
v_check_message_id integer;
BEGIN
select count(message_id) into v_check_message_id
from acs_messages where message_id = p_message_id;
if v_check_message_id <> 0 then
return 't';
else
return 'f';
end if;
END;
$$ LANGUAGE plpgsql stable;
-- added
--
-- procedure acs_message__send/4
--
CREATE OR REPLACE FUNCTION acs_message__send(
p_message_id integer,
p_to_address varchar,
p_grouping_id integer, -- default null
p_wait_until timestamptz -- default sysdate
) RETURNS integer AS $$
DECLARE
v_wait_until timestamptz;
BEGIN
v_wait_until := coalesce(p_wait_until, current_timestamp);
insert into acs_messages_outgoing
(message_id, to_address, grouping_id, wait_until)
values
(p_message_id, p_to_address, p_grouping_id, v_wait_until);
return 1;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__send','message_id,recipient_id,grouping_id;null,wait_until;sysdate');
--
-- procedure acs_message__send/4
--
CREATE OR REPLACE FUNCTION acs_message__send(
p_message_id integer,
p_recipient_id integer,
p_grouping_id integer, -- default null
p_wait_until timestamptz -- default sysdate
) RETURNS integer AS $$
DECLARE
v_wait_until timestamptz;
BEGIN
v_wait_until := coalesce (p_wait_until, current_timestamp);
insert into acs_messages_outgoing
(message_id, to_address, grouping_id, wait_until)
select p_message_id, p.email, p_grouping_id, v_wait_until
from parties p
where p.party_id = p_recipient_id;
return 1;
END;
$$ LANGUAGE plpgsql;
-- Ported to take advantage of tree_sortkey column by DLP
-- added
select define_function_args('acs_message__first_ancestor','message_id');
--
-- procedure acs_message__first_ancestor/1
--
CREATE OR REPLACE FUNCTION acs_message__first_ancestor(
p_message_id integer
) RETURNS integer AS $$
DECLARE
v_message_id acs_messages.message_id%TYPE;
v_ancestor_sk varbit;
BEGIN
select tree_ancestor_key(tree_sortkey, 1) into v_ancestor_sk
from acs_messages
where message_id = p_message_id;
select message_id into v_message_id
from acs_messages
where tree_sortkey = v_ancestor_sk;
return v_message_id;
END;
$$ LANGUAGE plpgsql stable strict;
-- ACHTUNG! WARNING! ACHTUNG! WARNING! ACHTUNG! WARNING! --
-- Developers: Please don't depend on the following functionality
-- to remain in the same place. Chances are very good these
-- functions will migrate to another PL/SQL package or be replaced
-- by direct calls to CR code in the near future.
select define_function_args('acs_message__new_file','message_id,file_id;null,file_name,title;null,description;null,mime_type;text/plain,data;null,creation_date;sysdate,creation_user;null,creation_ip;null,is_live;t,storage_type;file,package_id;null');
--
-- procedure acs_message__new_file/13
--
CREATE OR REPLACE FUNCTION acs_message__new_file(
p_message_id integer,
p_file_id integer, -- default null
p_file_name varchar,
p_title varchar, -- default null
p_description text, -- default null
p_mime_type varchar, -- default 'text/plain'
p_data integer, -- default null
p_creation_date timestamptz, -- default sysdate
p_creation_user integer, -- default null
p_creation_ip varchar, -- default null
p_is_live boolean, -- default 't'
p_storage_type cr_items.storage_type%TYPE, -- default 'file'
p_package_id integer default null
) RETURNS integer AS $$
DECLARE
v_file_id cr_items.item_id%TYPE;
v_revision_id cr_revisions.revision_id%TYPE;
BEGIN
v_file_id := content_item__new (
p_file_name, -- name
p_message_id, -- parent_id
p_file_id, -- item_id
null, -- locale
p_creation_date, -- creation_date
p_creation_user, -- creation_user
null, -- context_id
p_creation_ip, -- creation_ip
'content_item', -- item_subtype
'content_revision', -- content_type
null, -- title
null, -- description
'text/plain', -- mime_type
null, -- nls_language
null, -- text
null, -- data
null, -- relation_tag
false, -- is_live
p_storage_type, -- storage_type
p_package_id, -- package_id
true -- with_child_rels
);
-- create an initial revision for the new attachment
v_revision_id := acs_message__edit_file (
v_file_id, -- file_id
p_title, -- title
p_description, -- description
p_mime_type, -- mime_type
p_data, -- data
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_is_live -- is_live
);
return v_file_id;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__edit_file','file_id,title;null,description;null,mime_type;text/plain,data;null,creation_date;sysdate,creation_user;null,creation_ip;null,is_live;t');
--
-- procedure acs_message__edit_file/9
--
CREATE OR REPLACE FUNCTION acs_message__edit_file(
p_file_id integer,
p_title varchar, -- default null
p_description text, -- default null
p_mime_type varchar, -- default 'text/plain'
p_data integer, -- default null
p_creation_date timestamptz, -- default sysdate
p_creation_user integer, -- default null
p_creation_ip varchar, -- default null
p_is_live boolean -- default 't'
) RETURNS integer AS $$
DECLARE
v_revision_id cr_revisions.revision_id%TYPE;
BEGIN
v_revision_id := content_revision__new (
p_title, -- title
p_description,
current_timestamp,
p_mime_type, -- mime_type
NULL,
p_data, -- data
p_file_id, -- item_id
NULL,
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip -- creation_ip
);
-- test for auto approval of revision
if p_is_live then
perform content_item__set_live_revision(v_revision_id);
end if;
return v_revision_id;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__delete_file','file_id');
--
-- procedure acs_message__delete_file/1
--
CREATE OR REPLACE FUNCTION acs_message__delete_file(
p_file_id integer
) RETURNS integer AS $$
DECLARE
BEGIN
perform content_item__delete(p_file_id);
return 1;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__new_image','message_id,image_id;null,file_name,title;null,description;null,mime_type;text/plain,data;null,width;null,height;null,creation_date;sysdate,creation_user;null,creation_ip;null,is_live;t,storage_type;file,package_id;null');
--
-- procedure acs_message__new_image/15
--
CREATE OR REPLACE FUNCTION acs_message__new_image(
p_message_id integer,
p_image_id integer, -- default null
p_file_name varchar,
p_title varchar, -- default null
p_description text, -- default null
p_mime_type varchar, -- default 'text/plain'
p_data integer, -- default null
p_width integer, -- default null
p_height integer, -- default null
p_creation_date timestamptz, -- default sysdate
p_creation_user integer, -- default null
p_creation_ip varchar, -- default null
p_is_live boolean, -- default 't'
p_storage_type cr_items.storage_type%TYPE, -- default 'file'
p_package_id integer default null
) RETURNS integer AS $$
DECLARE
v_image_id cr_items.item_id%TYPE;
v_revision_id cr_revisions.revision_id%TYPE;
BEGIN
v_image_id := content_item__new (
p_file_name, -- name
p_message_id, -- parent_id
p_image_id, -- item_id
null, -- locale
p_creation_date, -- creation_date
p_creation_user, -- creation_user
null, -- context_id
p_creation_ip, -- creation_ip
'content_item', -- item_subtype
'content_revision', -- content_type
null, -- title
null, -- description
'text/plain', -- mime_type
null, -- nls_language
null, -- text
p_storage_type, -- storage_type
p_package_id -- package_id
);
-- create an initial revision for the new attachment
v_revision_id := acs_message__edit_image (
v_image_id, -- image_id
p_title, -- title
p_description, -- description
p_mime_type, -- mime_type
p_data, -- data
p_width, -- width
p_height, -- height
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_is_live -- is_live
);
return v_image_id;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__edit_image','image_id,title;null,description;null,mime_type;text/plain,data;null,width;null,height;null,creation_date;sysdate,creation_user;null,creation_ip;null,is_live;t');
--
-- procedure acs_message__edit_image/11
--
CREATE OR REPLACE FUNCTION acs_message__edit_image(
p_image_id integer,
p_title varchar, -- default null
p_description text, -- default null
p_mime_type varchar, -- default 'text/plain'
p_data integer, -- default null
p_width integer, -- default null
p_height integer, -- default null
p_creation_date timestamptz, -- default sysdate
p_creation_user integer, -- default null
p_creation_ip varchar, -- default null
p_is_live boolean -- default 't'
) RETURNS integer AS $$
DECLARE
v_revision_id cr_revisions.revision_id%TYPE;
BEGIN
-- not sure which __new to use
v_revision_id := content_revision__new (
p_title, -- title
NULL, -- description
current_timestamp, -- publish_date
p_mime_type, -- mime_type
NULL, -- nls_language
p_data, -- data
p_image_id, -- item_id
NULL, -- revision_id
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip -- creation_ip
);
-- insert new width and height values
-- XXX fix after image.new exists
insert into images
(image_id, width, height)
values
(v_revision_id, p_width, p_height);
-- test for auto approval of revision
if p_is_live then
perform content_item__set_live_revision(v_revision_id);
end if;
return v_revision_id;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__delete_image','image_id');
--
-- procedure acs_message__delete_image/1
--
CREATE OR REPLACE FUNCTION acs_message__delete_image(
p_image_id integer
) RETURNS integer AS $$
DECLARE
BEGIN
perform image__delete(p_image_id);
return 0;
END;
$$ LANGUAGE plpgsql;
-- XXX should just call content_extlink.new
-- added
select define_function_args('acs_message__new_extlink','name;null,extlink_id;null,url,label;null,description;null,parent_id,creation_date;sysdate,creation_user;null,creation_ip;null,package_id;null');
--
-- procedure acs_message__new_extlink/10
--
CREATE OR REPLACE FUNCTION acs_message__new_extlink(
p_name varchar, -- default null
p_extlink_id integer, -- default null
p_url varchar,
p_label varchar, -- default null
p_description text, -- default null
p_parent_id integer,
p_creation_date timestamptz, -- default sysdate
p_creation_user integer, -- default null
p_creation_ip varchar, -- default null
p_package_id integer -- default null
) RETURNS integer AS $$
DECLARE
v_extlink_id cr_extlinks.extlink_id%TYPE;
BEGIN
v_extlink_id := content_extlink__new (
p_name, -- name
p_url, -- url
p_label, -- label
p_description, -- description
p_parent_id, -- parent_id
p_extlink_id, -- extlink_id
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip, -- creation_ip
p_package_id
);
return v_extlink_id;
END;
$$ LANGUAGE plpgsql;
--
-- procedure acs_message__new_extlink/9
--
CREATE OR REPLACE FUNCTION acs_message__new_extlink(
p_name varchar, -- default null
p_extlink_id integer, -- default null
p_url varchar,
p_label varchar, -- default null
p_description text, -- default null
p_parent_id integer,
p_creation_date timestamptz, -- default sysdate
p_creation_user integer, -- default null
p_creation_ip varchar -- default null
) RETURNS integer AS $$
DECLARE
BEGIN
return acs_message__new_extlink (p_name,
p_extlink_id,
p_url,
p_label,
p_description,
p_parent_id,
p_creation_date,
p_creation_user,
p_creation_ip,
null
);
END;
$$ LANGUAGE plpgsql;
-- XXX should just edit extlink
-- added
select define_function_args('acs_message__edit_extlink','extlink_id,url,label;null,description');
--
-- procedure acs_message__edit_extlink/4
--
CREATE OR REPLACE FUNCTION acs_message__edit_extlink(
p_extlink_id integer,
p_url varchar,
p_label varchar, -- default null
p_description text -- default null
) RETURNS integer AS $$
DECLARE
v_is_extlink boolean;
BEGIN
v_is_extlink := content_extlink__is_extlink(p_extlink_id);
if v_is_extlink = 't' then
update cr_extlinks
set url = p_url,
label = p_label,
description = p_description
where extlink_id = p_extlink_id;
end if;
return 0;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__delete_extlink','extlink_id');
--
-- procedure acs_message__delete_extlink/1
--
CREATE OR REPLACE FUNCTION acs_message__delete_extlink(
p_extlink_id integer
) RETURNS integer AS $$
DECLARE
BEGIN
perform content_extlink__delete(p_extlink_id);
return 0;
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('acs_message__name','message_id');
--
-- procedure acs_message__name/1
--
CREATE OR REPLACE FUNCTION acs_message__name(
p_message_id integer
) RETURNS varchar AS $$
DECLARE
v_message_name cr_revisions.title%TYPE;
BEGIN
select title into v_message_name
from acs_messages_all
where message_id = p_message_id;
return v_message_name;
END;
$$ LANGUAGE plpgsql stable strict;