-- Upgrade script that converts the Bug Tracker to using the workflow package and the Content Repository
-- for its bugs.
--
-- @author Lars Pind
-- @author Peter Marklund
-- @creation-date 2003-02-13
---- *******
---- ******* Workflow Upgrade START
-- Prior to this sql script being sourced it is assumed that the before-upgrade Tcl callback
-- has setup worklfow instances for the Bug Tracker package type and for all package instances
-- First move all workflow data for each bug into the workflow data model
-- temporary table to map bug tracker comment format to CR mime types
create table temp_format_mime_map (
format text,
mime_type text);
insert into temp_format_mime_map (format, mime_type) values ('html', 'text/html');
insert into temp_format_mime_map (format, mime_type) values ('plain', 'text/plain');
insert into temp_format_mime_map (format, mime_type) values ('pre', 'text/fixed-width');
create or replace function inline_0 ()
returns integer as '
declare
-- Package_id loop
project_rec record;
v_workflow_id integer;
v_open_action_id integer;
-- Bug loop vars
bug_rec record;
v_case_id integer;
v_assignee_role_id integer;
v_submitter_role_id integer;
v_current_state_id integer;
-- Action loop vars
action_rec record;
v_entry_id integer;
v_action_id integer;
v_mime_type text;
begin
for project_rec in select project_id from bt_projects
loop
-- Get the bug workflow id
select workflow_id into v_workflow_id
from workflows
where short_name = ''bug''
and object_id = project_rec.project_id;
if v_workflow_id is null then
raise EXCEPTION ''You must define the workflow before running this upgade script. The workflow is created by the APM Tcl callbacks.'';
end if;
select action_id into v_open_action_id
from workflow_actions
where workflow_id = v_workflow_id
and short_name = ''open'';
for bug_rec in select b.bug_id,
b.status,
b.resolution,
b.assignee,
o.creation_user,
o.creation_date
from bt_bugs b, acs_objects o
where b.bug_id = o.object_id
and b.project_id = project_rec.project_id
loop
-- Create the case
select nextval(''workflow_cases_seq'') into v_case_id;
insert into workflow_cases (case_id, workflow_id, object_id)
values (v_case_id, v_workflow_id, bug_rec.bug_id);
-- Insert the submitter
select role_id into v_submitter_role_id
from workflow_roles
where short_name = ''submitter''
and workflow_id = v_workflow_id;
insert into workflow_case_role_party_map (case_id, role_id, party_id)
values (v_case_id, v_submitter_role_id, bug_rec.creation_user);
-- Insert the assignee
if bug_rec.assignee is not null then
select role_id into v_assignee_role_id
from workflow_roles
where short_name = ''assignee''
and workflow_id = v_workflow_id;
insert into workflow_case_role_party_map (case_id, role_id, party_id)
values (v_case_id, v_assignee_role_id, bug_rec.assignee);
end if;
-- Set the current state
select state_id into v_current_state_id
from workflow_fsm_states
where short_name = bug_rec.status
and workflow_id = v_workflow_id;
insert into workflow_case_fsm (case_id, current_state)
values (v_case_id, v_current_state_id);
for action_rec in select action,
resolution,
actor,
action_date,
comment,
comment_format
from bt_bug_actions
where bug_id = bug_rec.bug_id
loop
select action_id into v_action_id
from workflow_actions
where workflow_id = v_workflow_id
and short_name = action_rec.action;
select mime_type into v_mime_type
from temp_format_mime_map
where format = action_rec.comment_format;
-- Create the case log entry
v_entry_id := workflow_case_log_entry__new (
null,
''workflow_case_log_entry'',
v_case_id,
v_action_id,
action_rec.comment,
v_mime_type,
action_rec.actor,
null);
-- Update the creation date of the case log entry
update acs_objects set creation_date = action_rec.action_date
where object_id = v_entry_id;
-- If this is a resolve action - add the resolution code
if action_rec.action = ''resolve'' then
insert into workflow_case_log_data (entry_id, key, value)
values (v_entry_id, ''resolution'', bug_rec.resolution);
end if;
end loop;
end loop;
end loop;
return 0;
end;' language 'plpgsql';
select inline_0();
drop function inline_0();
drop table temp_format_mime_map;
-- remove the bug-tracker notifications stuff completely
create function inline_0 ()
returns integer as '
declare
v_old_notification_type_id integer;
v_new_notification_type_id integer;
row record;
begin
-- change bug_tracker_project_notif to workflow
select type_id
into v_old_notification_type_id
from notification_types
where short_name = ''bug_tracker_project_notif'';
select type_id
into v_new_notification_type_id
from notification_types
where short_name = ''workflow'';
update notification_requests set type_id = v_new_notification_type_id where type_id = v_old_notification_type_id;
-- change bug_tracker_bug_notif to workflow_case
select type_id
into v_old_notification_type_id
from notification_types
where short_name = ''bug_tracker_bug_notif'';
select type_id
into v_new_notification_type_id
from notification_types
where short_name = ''workflow_case'';
update notification_requests set type_id = v_new_notification_type_id where type_id = v_old_notification_type_id;
for row in select nt.type_id
from notification_types nt
where nt.short_name in (''bug_tracker_project_notif'', ''bug_tracker_bug_notif'')
loop
perform notification_type__delete(row.type_id);
delete from notifications where type_id = row.type_id;
delete from notification_types where type_id = row.type_id;
delete from notification_types_intervals where type_id = row.type_id;
delete from notification_types_del_methods where type_id = row.type_id;
end loop;
return null;
end;' language 'plpgsql';
select inline_0();
drop function inline_0 ();
-- Delete the service contract data
create function bt_service_contract_delete(varchar,varchar)
returns integer as '
declare
p_impl_name alias for $1;
p_impl_short_name alias for $2;
impl_id integer;
v_foo integer;
begin
-- the notification type impl
impl_id := acs_sc_impl__get_id (
''NotificationType'', -- impl_contract_name
p_impl_name -- impl_name
);
PERFORM acs_sc_binding__delete (
''NotificationType'',
p_impl_name
);
v_foo := acs_sc_impl_alias__delete (
''NotificationType'', -- impl_contract_name
p_impl_name, -- impl_name
''GetURL'' -- impl_operation_name
);
v_foo := acs_sc_impl_alias__delete (
''NotificationType'', -- impl_contract_name
p_impl_name, -- impl_name
''ProcessReply'' -- impl_operation_name
);
return 0;
end;
' language 'plpgsql';
-- Drop bug tracker notifications. They are now taken care of by the workflow package
select bt_service_contract_delete('bug_tracker_project_notif_type','bug_tracker_project_notif');
select bt_service_contract_delete('bug_tracker_bug_notif_type','bug_tracker_bug_notif');
drop function bt_service_contract_delete(varchar,varchar);
-- Changed column names
-- comment is a reserved word in Oracle
alter table bt_patch_actions rename column comment to comment_text;
-- Drop sequences not used
drop view bt_bug_number_seq;
drop sequence t_bt_bug_number_seq;
drop view bt_patch_number_seq;
drop sequence t_bt_patch_number_seq;
-- Drop tables no longer used
drop table bt_bug_actions;
-- Drop functions not needed anymore
drop function bt_component__default_assignee(
integer -- component_id
);
drop function bt_bug__status_sort_order(
varchar -- status
);
-- *******
-- ******* CR Upgrade START
-- ******* First move away data from changed tables into temporary tables
create table project_temp as select * from bt_projects;
drop table bt_projects;
create table bt_bugs_temp as select * from bt_bugs;
drop table bt_bugs;
-- ******* START create new tables, indices, and functions
create table bt_projects (
project_id integer not null
constraint bt_projects_apm_packages_fk
references apm_packages(package_id)
on delete cascade
constraint bt_projects_pk
primary key,
description text,
-- short string will be included in the subject line of emails
email_subject_name text,
maintainer integer
constraint bt_projects_maintainer_fk
references users(user_id),
folder_id integer
constraint bt_projects_folder_fk
references cr_folders(folder_id),
root_keyword_id integer
constraint bt_projects_keyword_fk
references cr_keywords(keyword_id)
);
create or replace function bt_project__new(
integer -- package_id
) returns integer
as '
declare
p_package_id alias for $1;
v_count integer;
v_instance_name varchar;
v_creation_user integer;
v_creation_ip varchar;
v_folder_id integer;
v_keyword_id integer;
begin
select count(*)
into v_count
from bt_projects
where project_id = p_package_id;
if v_count > 0 then
return 0;
end if;
-- get instance name for the content folder
select p.instance_name, o.creation_user, o.creation_ip
into v_instance_name, v_creation_user, v_creation_ip
from apm_packages p join acs_objects o on (p.package_id = o.object_id)
where p.package_id = p_package_id;
-- create a root CR folder
v_folder_id := content_folder__new(
''bug_tracker_''||p_package_id, -- name
v_instance_name, -- label
null, -- description
content_item_globals.c_root_folder_id -- parent_bi
);
-- register our content type
PERFORM content_folder__register_content_type (
v_folder_id, -- folder_id
''bt_bug_revision'', -- content_type
''t'' -- include_subtypes
);
-- create the instance root keyword
v_keyword_id := content_keyword__new(
v_instance_name, -- heading
null, -- description
null, -- parent_id
null, -- keyword_id
current_timestamp, -- creation_date
v_creation_user, -- creation_user
v_creation_ip, -- creation_ip
''content_keyword'' -- object_type
);
-- insert the row into bt_projects
insert into bt_projects
(project_id, folder_id, root_keyword_id)
values
(p_package_id, v_folder_id, v_keyword_id);
-- Create a General component to start with
insert into bt_components (component_id, project_id, component_name)
select acs_object_id_seq.nextval, p_package_id, ''General'';
return 0;
end;
' language 'plpgsql';
create or replace function bt_project__delete(
integer -- project_id
) returns integer
as '
declare
p_project_id alias for $1;
v_folder_id integer;
v_root_keyword_id integer;
rec record;
begin
-- get the content folder for this instance
select folder_id, root_keyword_id
into v_folder_id, v_root_keyword_id
from bt_projects
where project_id = p_project_id;
-- This gets done in tcl before we are called ... for now
-- Delete the bugs
-- for rec in select item_id from cr_items where parent_id = v_folder_id
-- loop
-- perform bt_bug__delete(rec.item_id);
-- end loop;
-- Delete the patches
for rec in select patch_id from bt_patches where project_id = p_project_id
loop
perform bt_patch__delete(rec.patch_id);
end loop;
-- delete the content folder
raise notice ''about to delete content_folder.'';
perform content_folder__delete(v_folder_id);
-- delete the projects keywords
perform bt_project__keywords_delete(p_project_id, ''t'');
-- These tables should really be set up to cascade
delete from bt_versions where project_id = p_project_id;
delete from bt_components where project_id = p_project_id;
delete from bt_user_prefs where project_id = p_project_id;
delete from bt_projects where project_id = p_project_id;
return 0;
end;
' language 'plpgsql';
create or replace function bt_project__keywords_delete(
integer, -- project_id
bool -- delete_root_p
) returns integer
as '
declare
p_project_id alias for $1;
p_delete_root_p alias for $1;
v_root_keyword_id integer;
rec record;
begin
-- get the content folder for this instance
select root_keyword_id
into v_root_keyword_id
from bt_projects
where project_id = p_project_id;
-- if we are deleting the root, remove it from the project as well
if p_delete_root_p = 1 then
update bt_projects
set root_keyword_id = null
where project_id = p_project_id;
end if;
-- delete the projects keywords
for rec in
select k2.keyword_id
from cr_keywords k1, cr_keywords k2
where k1.keyword_id = v_root_keyword_id
and k2.tree_sortkey between k1.tree_sortkey and tree_right(k1.tree_sortkey)
order by length(k2.tree_sortkey) desc
loop
if (p_delete_root_p = 1) or (rec.keyword_id != v_root_keyword_id) then
perform content_keyword__delete(rec.keyword_id);
end if;
end loop;
return 0;
end;
' language 'plpgsql';
-- versions and components haven't changed...
create table bt_default_keywords (
project_id integer not null
constraint bt_default_keywords_project_fk
references bt_projects(project_id)
on delete cascade,
parent_id integer not null
constraint bt_default_keyw_parent_keyw_fk
references cr_keywords(keyword_id)
on delete cascade,
keyword_id integer not null
constraint bt_default_keyw_keyword_fk
references cr_keywords(keyword_id)
on delete cascade,
constraint bt_default_keywords_prj_par_un
unique (project_id, parent_id)
);
create index bt_default_keyw_parent_id_idx on bt_default_keywords(parent_id);
create index bt_default_keyw_keyword_id_idx on bt_default_keywords(keyword_id);
-- content_item subtype
create table bt_bugs(
bug_id integer
constraint bt_bug_pk
primary key
constraint bt_bug_bt_bug_fk
references cr_items(item_id)
on delete cascade,
-- this is the only column we really add here
bug_number integer,
-- the comment from the initial action
-- denormalized from a far-fetched workflow join
comment_content text,
comment_format varchar(200),
-- denormalized from cr_items
parent_id integer,
live_revision_id integer,
-- denormalized from cr_revisions.title
summary varchar(1000),
-- denormalized from bt_projects
project_id integer,
-- denormalized from bt_bug_revisions
component_id integer,
resolution varchar(50),
user_agent varchar(500),
found_in_version integer,
fix_for_version integer,
fixed_in_version integer,
-- denormalized from acs_objects
creation_date timestamp,
creation_user integer,
-- constraint
constraint bt_bug_parent_id_bug_number_un
unique (parent_id, bug_number)
);
-- LARS:
-- we need to figure out which ones of these will be used by the query optimizer
create index bt_bugs_proj_id_bug_number_idx on bt_bugs(project_id, bug_number);
create index bt_bugs_bug_number_idx on bt_bugs(bug_number);
create index bt_bugs_proj_id_fix_for_idx on bt_bugs(project_id, fix_for_version);
create index bt_bugs_fix_for_version_idx on bt_bugs(fix_for_version);
create index bt_bugs_proj_id_crea_date_idx on bt_bugs(project_id, creation_date);
create index bt_bugs_creation_date_idx on bt_bugs(creation_date);
-- Update the bug content item object type
update acs_object_types set name_method = null where object_type = 'bt_bug';
-- content_revision specialization
create table bt_bug_revisions (
bug_revision_id integer
constraint bt_bug_rev_pk
primary key
constraint bt_bug_rev_bug_id_fk
references cr_revisions(revision_id)
on delete cascade,
component_id integer
constraint bt_bug_rev_components_fk
references bt_components(component_id),
resolution varchar(50)
constraint bt_bug_rev_resolution_ck
check (resolution is null or
resolution in ('fixed','bydesign','wontfix','postponed','duplicate','norepro','needinfo')),
user_agent varchar(500),
found_in_version integer
constraint bt_bug_rev_found_in_version_fk
references bt_versions(version_id),
fix_for_version integer
constraint bt_bug_rev_fix_for_version_fk
references bt_versions(version_id),
fixed_in_version integer
constraint bt_bug_rev_fixed_in_version_fk
references bt_versions(version_id)
);
-- Create the bug revision content type
select content_type__create_type (
'bt_bug_revision',
'content_revision',
'Bug Revision',
'Bug Revisions',
'btbug_revisions',
'bug_revision_id',
'content_revision.revision_name'
);
select define_function_args ('bt_bug__new','bug_id,bug_number,package_id,component_id,found_in_version,summary,user_agent,comment_content,comment_formt,creation_date,creation_user,creation_ip,item_subtype;bt_bug,content_type;bt_bug_revision');
create or replace function bt_bug__new(
integer, -- bug_id
integer, -- bug_number
integer, -- package_id
integer, -- component_id
integer, -- found_in_version
varchar, -- summary
varchar, -- user_agent
text, -- comment_content
varchar, -- comment_format
timestamp, -- creation_date
integer, -- creation_user
varchar, -- creation_ip
varchar, -- item_subtype
varchar -- content_type
) returns int
as '
declare
p_bug_id alias for $1;
p_bug_number alias for $2;
p_package_id alias for $3;
p_component_id alias for $4;
p_found_in_version alias for $5;
p_summary alias for $6;
p_user_agent alias for $7;
p_comment_content alias for $8;
p_comment_format alias for $9;
p_creation_date alias for $10;
p_creation_user alias for $11;
p_creation_ip alias for $12;
p_item_subtype alias for $13;
p_content_type alias for $14;
v_bug_id integer;
v_revision_id integer;
v_bug_number integer;
v_folder_id integer;
begin
-- get the content folder for this instance
select folder_id
into v_folder_id
from bt_projects
where project_id = p_package_id;
-- get bug_number
if p_bug_number is null then
select coalesce(max(bug_number),0) + 1
into v_bug_number
from bt_bugs
where parent_id = v_folder_id;
else
v_bug_number := p_bug_number;
end if;
-- create the content item
v_bug_id := content_item__new_temp(
v_bug_number, -- name
v_folder_id, -- parent_id
p_bug_id, -- item_id
null, -- locale
p_creation_date, -- creation_date
p_creation_user, -- creation_user
v_folder_id, -- context_id
p_creation_ip, -- creation_ip
p_item_subtype, -- item_subtype
p_content_type, -- content_type
null, -- title
null, -- description
null, -- mime_type
null, -- nls_language
null -- data
);
-- create the item type row
insert into bt_bugs
(bug_id, bug_number, comment_content, comment_format, parent_id, project_id, creation_date, creation_user)
values
(v_bug_id, v_bug_number, p_comment_content, p_comment_format, v_folder_id, p_package_id, p_creation_date, p_creation_user);
-- create the initial revision
v_revision_id := bt_bug_revision__new(
null, -- bug_revision_id
v_bug_id, -- bug_id
p_component_id, -- component_id
p_found_in_version, -- found_in_version
null, -- fix_for_version
null, -- fixed_in_version
null, -- resolution
p_user_agent, -- user_agent
p_summary, -- summary
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip -- creation_ip
);
return v_bug_id;
end;
' language 'plpgsql';
-- A temporary modified version that doesn't create an acs_object
create or replace function content_item__new_temp (varchar,integer,integer,varchar,timestamp with time zone,integer,integer,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar)
returns integer as '
declare
new__name alias for $1;
new__parent_id alias for $2; -- default null
new__item_id alias for $3; -- default null
new__locale alias for $4; -- default null
new__creation_date alias for $5; -- default now()
new__creation_user alias for $6; -- default null
new__context_id alias for $7; -- default null
new__creation_ip alias for $8; -- default null
new__item_subtype alias for $9; -- default ''content_item''
new__content_type alias for $10; -- default ''content_revision''
new__title alias for $11; -- default null
new__description alias for $12; -- default null
new__mime_type alias for $13; -- default ''text/plain''
new__nls_language alias for $14; -- default null
new__text alias for $15; -- default null
new__storage_type alias for $16; -- check in (''text'',''file'')
-- relation_tag alias for $17;
-- is_live alias for $18;
new__relation_tag varchar default null;
new__is_live boolean default ''f'';
v_parent_id cr_items.parent_id%TYPE;
v_parent_type acs_objects.object_type%TYPE;
v_item_id cr_items.item_id%TYPE;
v_revision_id cr_revisions.revision_id%TYPE;
v_title cr_revisions.title%TYPE;
v_rel_id acs_objects.object_id%TYPE;
v_rel_tag cr_child_rels.relation_tag%TYPE;
v_context_id acs_objects.context_id%TYPE;
begin
-- place the item in the context of the pages folder if no
-- context specified
if new__parent_id is null then
v_parent_id := content_item_globals.c_root_folder_id;
else
v_parent_id := new__parent_id;
end if;
-- Determine context_id
if new__context_id is null then
v_context_id := v_parent_id;
else
v_context_id := new__context_id;
end if;
if v_parent_id = 0 or
content_folder__is_folder(v_parent_id) = ''t'' then
if v_parent_id != 0 and
content_folder__is_registered(
v_parent_id, new__content_type, ''f'') = ''f'' then
raise EXCEPTION ''-20000: This items content type % is not registered to this folder %'', new__content_type, v_parent_id;
end if;
else if v_parent_id != 0 then
select object_type into v_parent_type from acs_objects
where object_id = v_parent_id;
if NOT FOUND then
raise EXCEPTION ''-20000: Invalid parent ID % specified in content_item.new'', v_parent_id;
end if;
if content_item__is_subclass(v_parent_type, ''content_item'') = ''t'' and
content_item__is_valid_child(v_parent_id, new__content_type) = ''f'' then
raise EXCEPTION ''-20000: This items content type % is not allowed in this container %'', new__content_type, v_parent_id;
end if;
end if; end if;
-- Create the object
-- No, during upgrade the acs object is already created so skip this step
v_item_id := new__item_id;
-- v_item_id := acs_object__new(
-- new__item_id,
-- new__item_subtype,
-- new__creation_date,
-- new__creation_user,
-- new__creation_ip,
-- v_context_id
-- );
insert into cr_items (
item_id, name, content_type, parent_id, storage_type
) values (
v_item_id, new__name, new__content_type, v_parent_id, new__storage_type
);
-- if the parent is not a folder, insert into cr_child_rels
if v_parent_id != 0 and
content_folder__is_folder(v_parent_id) = ''f'' and
content_item__is_valid_child(v_parent_id, new__content_type) = ''t'' then
v_rel_id := acs_object__new(
null,
''cr_item_child_rel'',
now(),
null,
null,
v_parent_id
);
if new__relation_tag is null then
v_rel_tag := content_item__get_content_type(v_parent_id)
|| ''-'' || new__content_type;
else
v_rel_tag := new__relation_tag;
end if;
insert into cr_child_rels (
rel_id, parent_id, child_id, relation_tag, order_n
) values (
v_rel_id, v_parent_id, v_item_id, v_rel_tag, v_item_id
);
end if;
-- use the name of the item if no title is supplied
if new__title is null then
v_title := new__name;
else
v_title := new__title;
end if;
if new__title is not null or
new__text is not null then
v_revision_id := content_revision__new(
v_title,
new__description,
now(),
new__mime_type,
null,
new__text,
v_item_id,
null,
new__creation_date,
new__creation_user,
new__creation_ip
);
end if;
-- make the revision live if is_live is true
if new__is_live = ''t'' then
PERFORM content_item__set_live_revision(v_revision_id);
end if;
return v_item_id;
end;' language 'plpgsql';
-- A temporary modified version that doesn't create an acs_object
create function content_item__new_temp (varchar,integer,integer,varchar,timestamp with time zone,integer,integer,varchar,varchar,varchar,varchar,varchar,varchar,varchar,integer)
returns integer as '
declare
new__name alias for $1;
new__parent_id alias for $2; -- default null
new__item_id alias for $3; -- default null
new__locale alias for $4; -- default null
new__creation_date alias for $5; -- default now()
new__creation_user alias for $6; -- default null
new__context_id alias for $7; -- default null
new__creation_ip alias for $8; -- default null
new__item_subtype alias for $9; -- default ''content_item''
new__content_type alias for $10; -- default ''content_revision''
new__title alias for $11; -- default null
new__description alias for $12; -- default null
new__mime_type alias for $13; -- default ''text/plain''
new__nls_language alias for $14; -- default null
-- changed to integer for blob_id
new__data alias for $15; -- default null
-- relation_tag alias for $17;
-- is_live alias for $18;
new__relation_tag varchar default null;
new__is_live boolean default ''f'';
v_parent_id cr_items.parent_id%TYPE;
v_parent_type acs_objects.object_type%TYPE;
v_item_id cr_items.item_id%TYPE;
v_revision_id cr_revisions.revision_id%TYPE;
v_title cr_revisions.title%TYPE;
v_rel_id acs_objects.object_id%TYPE;
v_rel_tag cr_child_rels.relation_tag%TYPE;
v_context_id acs_objects.context_id%TYPE;
begin
-- place the item in the context of the pages folder if no
-- context specified
if new__parent_id is null then
v_parent_id := content_item_globals.c_root_folder_id;
else
v_parent_id := new__parent_id;
end if;
-- Determine context_id
if new__context_id is null then
v_context_id := v_parent_id;
else
v_context_id := new__context_id;
end if;
if v_parent_id = 0 or
content_folder__is_folder(v_parent_id) = ''t'' then
if v_parent_id != 0 and
content_folder__is_registered(
v_parent_id, new__content_type, ''f'') = ''f'' then
raise EXCEPTION ''-20000: This items content type % is not registered to this folder %'', new__content_type, v_parent_id;
end if;
else if v_parent_id != 0 then
select object_type into v_parent_type from acs_objects
where object_id = v_parent_id;
if NOT FOUND then
raise EXCEPTION ''-20000: Invalid parent ID % specified in content_item.new'', v_parent_id;
end if;
if content_item__is_subclass(v_parent_type, ''content_item'') = ''t'' and
content_item__is_valid_child(v_parent_id, new__content_type) = ''f'' then
raise EXCEPTION ''-20000: This items content type % is not allowed in this container %'', new__content_type, v_parent_id;
end if;
end if; end if;
-- Create the object
v_item_id := new__item_id;
-- v_item_id := acs_object__new(
-- new__item_id,
-- new__item_subtype,
-- new__creation_date,
-- new__creation_user,
-- new__creation_ip,
-- v_context_id
-- );
insert into cr_items (
item_id, name, content_type, parent_id, storage_type
) values (
v_item_id, new__name, new__content_type, v_parent_id, ''lob''
);
-- if the parent is not a folder, insert into cr_child_rels
if v_parent_id != 0 and
content_folder__is_folder(v_parent_id) = ''f'' and
content_item__is_valid_child(v_parent_id, new__content_type) = ''t'' then
v_rel_id := acs_object__new(
null,
''cr_item_child_rel'',
now(),
null,
null,
v_parent_id
);
if new__relation_tag is null or new__relation_tag = '''' then
v_rel_tag := content_item__get_content_type(v_parent_id)
|| ''-'' || new__content_type;
else
v_rel_tag := new__relation_tag;
end if;
insert into cr_child_rels (
rel_id, parent_id, child_id, relation_tag, order_n
) values (
v_rel_id, v_parent_id, v_item_id, v_rel_tag, v_item_id
);
end if;
-- use the name of the item if no title is supplied
if new__title is null or new__title = '''' then
v_title := new__name;
else
v_title := new__title;
end if;
-- create the revision if data or title or text is not null
-- note that the caller could theoretically specify both text
-- and data, in which case the text is ignored.
if new__data is not null then
v_revision_id := content_revision__new(
v_title,
new__description,
now(),
new__mime_type,
new__nls_language,
new__data,
v_item_id,
null,
new__creation_date,
new__creation_user,
new__creation_ip
);
end if;
-- make the revision live if is_live is true
if new__is_live = ''t'' then
PERFORM content_item__set_live_revision(v_revision_id);
end if;
return v_item_id;
end;' language 'plpgsql';
create or replace function bt_bug__delete(
integer -- bug_id
) returns integer
as '
declare
p_bug_id alias for $1;
v_case_id integer;
rec record;
begin
-- Every bug is associated with a workflow case
select case_id
into v_case_id
from workflow_cases
where object_id = p_bug_id;
perform workflow_case__delete(v_case_id);
-- Every bug may have notifications attached to it
-- and there is one column in the notificaitons datamodel that doesn''t
-- cascade
for rec in select notification_id from notifications
where response_id = p_bug_id loop
perform notification__delete (rec.notification_id);
end loop;
-- unset live & latest revision
-- update cr_items
-- set live_revision = null,
-- latest_revision = null
-- where item_id = p_bug_id;
perform content_item__delete(p_bug_id);
return 0;
end;
' language 'plpgsql';
create or replace function bt_bug_revision__new(
integer, -- bug_revision_id
integer, -- bug_id
integer, -- component_id
integer, -- found_in_version
integer, -- fix_for_version
integer, -- fixed_in_version
varchar, -- resolution
varchar, -- user_agent
varchar, -- summary
timestamp, -- creation_date
integer, -- creation_user
varchar -- creation_ip
) returns int
as '
declare
p_bug_revision_id alias for $1;
p_bug_id alias for $2;
p_component_id alias for $3;
p_found_in_version alias for $4;
p_fix_for_version alias for $5;
p_fixed_in_version alias for $6;
p_resolution alias for $7;
p_user_agent alias for $8;
p_summary alias for $9;
p_creation_date alias for $10;
p_creation_user alias for $11;
p_creation_ip alias for $12;
v_revision_id integer;
begin
-- create the initial revision
v_revision_id := content_revision__new(
p_summary, -- title
null, -- description
now(), -- publish_date
null, -- mime_type
null, -- nls_language
null, -- new_data
p_bug_id, -- item_id
p_bug_revision_id, -- revision_id
p_creation_date, -- creation_date
p_creation_user, -- creation_user
p_creation_ip -- creation_ip
);
-- insert into the bug-specific revision table
insert into bt_bug_revisions
(bug_revision_id, component_id, resolution, user_agent, found_in_version, fix_for_version, fixed_in_version)
values
(v_revision_id, p_component_id, p_resolution, p_user_agent, p_found_in_version, p_fix_for_version, p_fixed_in_version);
-- make this revision live
PERFORM content_item__set_live_revision(v_revision_id);
-- update the cache
update bt_bugs
set live_revision_id = v_revision_id,
summary = p_summary,
component_id = p_component_id,
resolution = p_resolution,
user_agent = p_user_agent,
found_in_version = p_found_in_version,
fix_for_version = p_fix_for_version,
fixed_in_version = p_fixed_in_version
where bug_id = p_bug_id;
return v_revision_id;
end;
' language 'plpgsql';
-- ******* END create new tables, indices, and functions
-- ******* Recreate the project data
create or replace function inline_0 ()
returns integer as '
declare
project_rec record;
begin
for project_rec in select project_id,
description,
email_subject_name,
maintainer
from project_temp
loop
perform bt_project__new (
project_rec.project_id
);
update bt_projects set description = project_rec.description,
email_subject_name = project_rec.email_subject_name,
maintainer = project_rec.maintainer
where project_id = project_rec.project_id;
end loop;
return 0;
end;' language 'plpgsql';
select inline_0();
drop function inline_0();
-- ******* Migrate the severiy and priority codes to CR keywords
create table code_keyword_map_temp (
code_id integer,
-- for bt_priority_codes or bt_severity_codes
keyword_id integer
references cr_keywords
);
-- ******* Migrate bug type to CR keywords
create table bug_type_keyword_map_temp (
project_id integer,
bug_type varchar,
keyword_id integer
references cr_keywords
);
create or replace function inline_0 ()
returns integer as '
declare
project_rec record;
v_keyword_id integer;
v_severity_root integer;
severity_rec record;
v_priority_root integer;
priority_rec record;
v_bug_type_root integer;
begin
for project_rec in
select project_id, root_keyword_id
from bt_projects
loop
-- Create the severity root keyword
v_severity_root := content_keyword__new (
''Severity'',
null,
project_rec.root_keyword_id,
null,
null,
null,
null,
''content_keyword'' -- object_type
);
for severity_rec in
select severity_id,
severity_name,
sort_order
from bt_severity_codes
where project_id = project_rec.project_id
order by sort_order
loop
v_keyword_id := content_keyword__new (
severity_rec.sort_order || '' - '' || severity_rec.severity_name,
null,
v_severity_root,
null,
null,
null,
null,
''content_keyword'' -- object_type
);
insert into code_keyword_map_temp (code_id, keyword_id)
values (severity_rec.severity_id, v_keyword_id);
end loop;
-- Create the priority code root
v_priority_root := content_keyword__new (
''Priority'',
null,
project_rec.root_keyword_id,
null,
null,
null,
null,
''content_keyword'' -- object_type
);
for priority_rec in
select priority_id,
priority_name,
sort_order
from bt_priority_codes
where project_id = project_rec.project_id
order by sort_order
loop
v_keyword_id := content_keyword__new (
priority_rec.sort_order || '' - '' || priority_rec.priority_name,
null,
v_priority_root,
null,
null,
null,
null,
''content_keyword'' -- object_type
);
insert into code_keyword_map_temp (code_id, keyword_id)
values (priority_rec.priority_id, v_keyword_id);
end loop;
-- Create the bug type root
v_bug_type_root := content_keyword__new (
''Bug Type'',
null,
project_rec.root_keyword_id,
null,
null,
null,
null,
''content_keyword'' -- object_type
);
-- Bug Type: Bug
v_keyword_id := content_keyword__new (
''Bug'',
null,
v_bug_type_root,
null,
null,
null,
null,
''content_keyword'' -- object_type
);
insert into bug_type_keyword_map_temp (project_id, bug_type, keyword_id)
values (project_rec.project_id, ''bug'', v_keyword_id);
-- Bug Type: Suggestion
v_keyword_id := content_keyword__new (
''Suggestion'',
null,
v_bug_type_root,
null,
null,
null,
null,
''content_keyword'' -- object_type
);
insert into bug_type_keyword_map_temp (project_id, bug_type, keyword_id)
values (project_rec.project_id, ''suggestion'', v_keyword_id);
-- Bug Type: Todo
v_keyword_id := content_keyword__new (
''Todo'',
null,
v_bug_type_root,
null,
null,
null,
null,
''content_keyword'' -- object_type
);
insert into bug_type_keyword_map_temp (project_id, bug_type, keyword_id)
values (project_rec.project_id, ''todo'', v_keyword_id);
end loop;
return 0;
end;' language 'plpgsql';
select inline_0();
drop function inline_0();
-- ******* START Bug upgrade
-- Create each of the bugs with the new API that creates a content
-- item, an initial revision, and populates the bt_bugs denormalization table
create or replace function inline_0 ()
returns integer as '
declare
-- Project loop
project_rec record;
v_workflow_id integer;
v_open_action_id integer;
-- Bug loop
bug_rec record;
notifications_rec record;
v_state_id integer;
v_item_id integer;
v_new_bug_id integer;
v_severity_id integer;
v_priority_id integer;
v_bug_type_id integer;
v_bug_revision_id integer;
begin
for project_rec in select project_id from bt_projects
loop
-- Get the bug workflow id
select workflow_id into v_workflow_id
from workflows
where short_name = ''bug''
and object_id = project_rec.project_id;
select action_id into v_open_action_id
from workflow_actions
where workflow_id = v_workflow_id
and short_name = ''open'';
for bug_rec in select b.bug_id,
b.bug_number,
b.project_id,
b.component_id,
b.found_in_version,
b.fix_for_version,
b.fixed_in_version,
b.resolution,
b.summary,
b.user_agent,
b.severity,
b.priority,
b.bug_type,
cr.content,
cr.mime_type,
o.creation_user,
o.creation_date,
o.creation_ip
from bt_bugs_temp b,
acs_objects o,
workflow_cases c,
workflow_case_log wcl,
cr_items ci,
cr_revisions cr
where b.bug_id = o.object_id
and b.project_id = project_rec.project_id
and b.bug_id = c.object_id
and c.workflow_id = v_workflow_id
and wcl.case_id = c.case_id
and wcl.action_id = v_open_action_id
and ci.item_id = wcl.entry_id
and cr.revision_id = ci.live_revision
loop
-- Use a modified version of bt_bug__new that doesn''t
-- create a new acs_object
perform bt_bug__new (
bug_rec.bug_id, -- bug_id
bug_rec.bug_number, -- bug_number
bug_rec.project_id, -- package_id
bug_rec.component_id, -- component_id
bug_rec.found_in_version, -- found_in_version
bug_rec.summary, -- summary
bug_rec.user_agent, -- user_agent
bug_rec.content, -- comment_content
bug_rec.mime_type, -- comment_format
bug_rec.creation_date, -- creation_date
bug_rec.creation_user, -- creation_user
bug_rec.creation_ip, -- creation_ip
''bt_bug'', -- item_subtype
''bt_bug_revision'' -- content_type
);
-- Get the revision id
select live_revision
into v_bug_revision_id
from cr_items
where item_id = bug_rec.bug_id;
-- Update with fix_for_version, fixed_in_version, resolution
update bt_bug_revisions
set fix_for_version = bug_rec.fix_for_version,
fixed_in_version = bug_rec.fixed_in_version,
resolution = bug_rec.resolution
where bug_revision_id = v_bug_revision_id;
-- update the cache in the item
update bt_bugs
set fix_for_version = bug_rec.fix_for_version,
fixed_in_version = bug_rec.fixed_in_version,
resolution = bug_rec.resolution
where bug_id = bug_rec.bug_id;
-- Map severity
select keyword_id
into v_severity_id
from code_keyword_map_temp
where code_id = bug_rec.severity;
perform content_keyword__item_assign (
bug_rec.bug_id,
v_severity_id,
null,
bug_rec.creation_user,
bug_rec.creation_ip
);
-- Map priority
select keyword_id
into v_priority_id
from code_keyword_map_temp
where code_id = bug_rec.priority;
perform content_keyword__item_assign (
bug_rec.bug_id,
v_priority_id,
null,
bug_rec.creation_user,
bug_rec.creation_ip
);
-- Map bug type
select keyword_id
into v_bug_type_id
from bug_type_keyword_map_temp
where project_id = bug_rec.project_id
and bug_type = bug_rec.bug_type;
perform content_keyword__item_assign (
bug_rec.bug_id,
v_bug_type_id,
null,
bug_rec.creation_user,
bug_rec.creation_ip
);
end loop;
end loop;
return 0;
end;' language 'plpgsql';
select inline_0();
drop function inline_0();
-- ******* Drop tables no longer used
drop table bt_severity_codes;
drop table bt_priority_codes;
-- ******* Drop temporary upgrade tables
drop table code_keyword_map_temp;
drop table bug_type_keyword_map_temp;
drop table bt_bugs_temp;
drop table project_temp;
-- ******* Drop temporary upgrade functions
--drop function bt_bug__new_temp(
-- integer, -- bug_id
-- integer, -- bug_number
-- integer, -- package_id
-- integer, -- component_id
-- integer, -- found_in_version
-- varchar, -- summary
-- varchar, -- user_agent
-- text, -- comment_content
-- varchar, -- comment_format
-- timestamp, -- creation_date
-- integer, -- creation_user
-- varchar, -- creation_ip
-- varchar, -- item_subtype
-- varchar -- content_type
--);
drop function content_item__new_temp (varchar,integer,integer,varchar,timestamp with time zone,integer,integer,varchar,varchar,varchar,varchar,varchar,varchar,varchar,integer);
drop function content_item__new_temp (varchar,integer,integer,varchar,timestamp with time zone,integer,integer,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar);