Index: openacs-4/contrib/packages/survey/sql/oracle/upgrade/survey-upgrade-0.2-0.3d1.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/survey/sql/oracle/upgrade/Attic/survey-upgrade-0.2-0.3d1.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/survey/sql/oracle/upgrade/survey-upgrade-0.2-0.3d1.sql 8 Oct 2003 15:54:14 -0000 1.1
@@ -0,0 +1,172 @@
+--
+-- constructor for a survey_response
+--
+
+create or replace package survey_response
+as
+ function new (
+ response_id in survey_responses.response_id %TYPE default null,
+ survey_id in survey_responses.survey_id%TYPE default null,
+ title in survey_responses.title%TYPE default null,
+ notify_on_comment_p in survey_responses.notify_on_comment_p%TYPE default 'f',
+ object_type in acs_objects.object_type%TYPE default 'survey_response',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null,
+ initial_response_id in survey_responses.initial_response_id%TYPE default null
+ ) return acs_objects.object_id%TYPE;
+
+ function initial_response_id (
+ response_id in survey_responses.response_id%TYPE
+ ) return survey_responses.response_id%TYPE;
+
+ function initial_user_id (
+ response_id in survey_responses.response_id%TYPE
+ ) return acs_objects.creation_user%TYPE;
+
+ procedure remove (
+ response_id in survey_responses.response_id%TYPE
+ );
+
+ procedure del (
+ response_id in survey_responses.response_id%TYPE
+ );
+
+ function boolean_answer (
+ answer varchar,
+ question_id survey_questions.question_id%TYPE
+ ) return varchar;
+
+end survey_response;
+/
+show errors
+
+
+create or replace package body survey_response
+as
+ function new (
+ response_id in survey_responses.response_id %TYPE default null,
+ survey_id in survey_responses.survey_id%TYPE default null,
+ title in survey_responses.title%TYPE default null,
+ notify_on_comment_p in survey_responses.notify_on_comment_p%TYPE default 'f',
+ object_type in acs_objects.object_type%TYPE default 'survey_response',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null,
+ initial_response_id in survey_responses.initial_response_id%TYPE default null
+ ) return acs_objects.object_id%TYPE
+ is
+ v_response_id survey_responses.response_id%TYPE;
+ begin
+ v_response_id := acs_object.new (
+ object_id => response_id,
+ object_type => object_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+ insert into survey_responses (response_id, survey_id, title, notify_on_comment_p, initial_response_id)
+ values
+ (v_response_id, new.survey_id, new.title, new.notify_on_comment_p, new.initial_response_id);
+ return v_response_id;
+ end new;
+
+ function initial_response_id (
+ response_id in survey_responses.response_id%TYPE
+ ) return survey_responses.response_id%TYPE
+ is
+ v_initial_response_id survey_responses.response_id%TYPE;
+ begin
+ select initial_response_id into v_initial_response_id
+ from survey_responses where
+ response_id = initial_response_id.response_id;
+ if v_initial_response_id is NULL then
+ v_initial_response_id := initial_response_id.response_id;
+ end if;
+ return v_initial_response_id;
+ end initial_response_id;
+
+ function initial_user_id (
+ response_id in survey_responses.response_id%TYPE
+ ) return acs_objects.creation_user%TYPE
+ is
+ v_user_id acs_objects.creation_user%TYPE;
+ begin
+ select creation_user into v_user_id
+ from acs_objects
+ where object_id = survey_response.initial_response_id(initial_user_id.response_id);
+ return v_user_id;
+ end initial_user_id;
+
+ procedure remove (
+ response_id in survey_responses.response_id%TYPE
+ ) is
+ v_response_row survey_responses%ROWTYPE;
+ begin
+ for v_response_row in (select response_id from survey_responses
+ where initial_response_id=remove.response_id) loop
+ survey_response.del(v_response_row.response_id);
+ end loop;
+
+ survey_response.del(remove.response_id);
+ end remove;
+
+ procedure del (
+ response_id in survey_responses.response_id%TYPE
+ )
+ is
+ v_question_response_row survey_question_responses%ROWTYPE;
+ begin
+ for v_question_response_row in (
+ select item_id
+ from survey_question_responses, cr_revisions
+ where response_id=del.response_id
+ and attachment_answer=revision_id)
+ loop
+ content_item.del(v_question_response_row.item_id);
+ end loop;
+
+ delete from survey_question_responses
+ where response_id=del.response_id;
+ delete from survey_responses
+ where response_id=del.response_id;
+ acs_object.del(del.response_id);
+ end del;
+
+ function boolean_answer (
+ answer varchar,
+ question_id survey_questions.question_id%TYPE
+ ) return varchar
+ is
+ v_answer varchar(100);
+ v_presentation_options survey_questions.presentation_options%TYPE;
+ v_split_pos integer;
+ begin
+
+ if answer is NOT NULL then
+ select presentation_options into v_presentation_options
+ from survey_questions where question_id=boolean_answer.question_id;
+
+ v_split_pos:= instr(v_presentation_options, '/');
+
+ if answer = 't' then
+ v_answer:=substr(v_presentation_options, 1, v_split_pos -1 );
+ end if;
+ if answer = 'f' then
+ v_answer:=substr(v_presentation_options, v_split_pos + 1 );
+ end if;
+
+ else
+ v_answer := '';
+ end if;
+ return v_answer;
+ end boolean_answer;
+
+end survey_response;
+/
+show errors
+
+
Index: openacs-4/packages/acs-content-repository/sql/oracle/upgrade/upgrade-4.7d6-5.0d1.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/oracle/upgrade/upgrade-4.7d6-5.0d1.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-content-repository/sql/oracle/upgrade/upgrade-4.7d6-5.0d1.sql 8 Oct 2003 15:56:23 -0000 1.1
@@ -0,0 +1,5764 @@
+-- Data model to support content repository of the ArsDigita
+-- Community System
+
+-- Copyright (C) 1999-2000 ArsDigita Corporation
+-- Author: Karl Goldstein (karlg@arsdigita.com)
+
+-- $Id: upgrade-4.7d6-5.0d1.sql,v 1.1 2003/10/08 15:56:23 mohanp Exp $
+
+-- This is free software distributed under the terms of the GNU Public
+-- License. Full text of the license is available from the GNU Project:
+-- http://www.fsf.org/copyleft/gpl.html
+
+create or replace package body content_extlink
+as
+
+function new (
+ name in cr_items.name%TYPE default null,
+ url in cr_extlinks.url%TYPE,
+ label in cr_extlinks.label%TYPE default null,
+ description in cr_extlinks.description%TYPE default null,
+ parent_id in cr_items.parent_id%TYPE,
+ extlink_id in cr_extlinks.extlink_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_extlinks.extlink_id%TYPE is
+
+ v_extlink_id cr_extlinks.extlink_id%TYPE;
+ v_label cr_extlinks.label%TYPE;
+ v_name cr_items.name%TYPE;
+
+begin
+
+ if label is null then
+ v_label := url;
+ else
+ v_label := label;
+ end if;
+
+ if name is null then
+ select acs_object_id_seq.nextval into v_extlink_id from dual;
+ v_name := 'link' || v_extlink_id;
+ else
+ v_name := name;
+ end if;
+
+ v_extlink_id := content_item.new(
+ item_id => content_extlink.new.extlink_id,
+ name => v_name,
+ content_type => 'content_extlink',
+ creation_date => content_extlink.new.creation_date,
+ creation_user => content_extlink.new.creation_user,
+ creation_ip => content_extlink.new.creation_ip,
+ parent_id => content_extlink.new.parent_id
+ );
+
+ insert into cr_extlinks
+ (extlink_id, url, label, description)
+ values
+ (v_extlink_id, content_extlink.new.url, v_label,
+ content_extlink.new.description);
+
+ return v_extlink_id;
+
+end new;
+
+procedure del (
+ extlink_id in cr_extlinks.extlink_id%TYPE
+) is
+begin
+
+ delete from cr_extlinks
+ where extlink_id = content_extlink.del.extlink_id;
+
+ content_item.del(content_extlink.del.extlink_id);
+
+end del;
+
+function is_extlink (
+ item_id in cr_items.item_id%TYPE
+) return char
+is
+ v_extlink_p integer := 0;
+begin
+
+ select
+ count(1) into v_extlink_p
+ from
+ cr_extlinks
+ where
+ extlink_id = is_extlink.item_id;
+
+ if v_extlink_p = 1 then
+ return 't';
+ else
+ return 'f';
+ end if;
+
+end is_extlink;
+
+procedure copy (
+ extlink_id in cr_extlinks.extlink_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) is
+ v_current_folder_id cr_folders.folder_id%TYPE;
+ v_name cr_items.name%TYPE;
+ v_url cr_extlinks.url%TYPE;
+ v_label cr_extlinks.label%TYPE;
+ v_description cr_extlinks.description%TYPE;
+ v_extlink_id cr_extlinks.extlink_id%TYPE;
+begin
+
+ 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.extlink_id;
+
+ -- can't copy to the same folder
+ if copy.target_folder_id ^= v_current_folder_id then
+
+ select
+ i.name, e.url, e.label, e.description
+ into
+ v_name, v_url, v_label, v_description
+ from
+ cr_extlinks e, cr_items i
+ where
+ e.extlink_id = i.item_id
+ and
+ e.extlink_id = copy.extlink_id;
+
+ if content_folder.is_registered(copy.target_folder_id, 'content_extlink') = 't' then
+
+ v_extlink_id := content_extlink.new(
+ parent_id => copy.target_folder_id,
+ name => v_name,
+ label => v_label,
+ description => v_description,
+ url => v_url,
+ creation_user => copy.creation_user,
+ creation_ip => copy.creation_ip
+ );
+
+ end if;
+ end if;
+ end if;
+end copy;
+
+end content_extlink;
+/
+show errors
+
+-- Data model to support content repository of the ArsDigita Community
+-- System
+
+-- Copyright (C) 1999-2000 ArsDigita Corporation
+-- Author: Karl Goldstein (karlg@arsdigita.com)
+
+-- $Id: upgrade-4.7d6-5.0d1.sql,v 1.1 2003/10/08 15:56:23 mohanp Exp $
+
+-- This is free software distributed under the terms of the GNU Public
+-- License. Full text of the license is available from the GNU Project:
+-- http://www.fsf.org/copyleft/gpl.html
+
+create or replace package body content_folder
+as
+
+function new (
+ name in cr_items.name%TYPE,
+ label in cr_folders.label%TYPE,
+ description in cr_folders.description%TYPE default null,
+ parent_id in cr_items.parent_id%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null,
+ folder_id in cr_folders.folder_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_folders.folder_id%TYPE is
+ v_folder_id cr_folders.folder_id%TYPE;
+ v_context_id acs_objects.context_id%TYPE;
+begin
+
+ -- set the context_id
+ if content_folder.new.context_id is null then
+ v_context_id := content_folder.new.parent_id;
+ else
+ v_context_id := content_folder.new.context_id;
+ end if;
+
+ -- parent_id = 0 means that this is a mount point
+ if parent_id ^= 0 and
+ content_folder.is_registered(parent_id,'content_folder') = 'f' then
+
+ raise_application_error(-20000,
+ 'This folder does not allow subfolders to be created');
+ else
+
+ v_folder_id := content_item.new(
+ item_id => folder_id,
+ name => name,
+ item_subtype => 'content_folder',
+ content_type => 'content_folder',
+ context_id => v_context_id,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ parent_id => parent_id
+ );
+
+ insert into cr_folders (
+ folder_id, label, description
+ ) values (
+ v_folder_id, label, description
+ );
+
+ -- inherit the attributes of the parent folder
+ if content_folder.new.parent_id is not null then
+
+ insert into cr_folder_type_map (
+ folder_id, content_type
+ ) select
+ v_folder_id, content_type
+ from
+ cr_folder_type_map
+ where
+ folder_id = content_folder.new.parent_id;
+ end if;
+
+ -- update the child flag on the parent
+ update cr_folders set has_child_folders = 't'
+ where folder_id = content_folder.new.parent_id;
+
+ return v_folder_id;
+ end if;
+
+end new;
+
+
+procedure del (
+ folder_id in cr_folders.folder_id%TYPE
+) is
+
+ v_count integer;
+ v_parent_id integer;
+
+begin
+
+ -- check if the folder contains any items
+
+ select count(*) into v_count from cr_items where parent_id = folder_id;
+
+ if v_count > 0 then
+ raise_application_error(-20000,
+ 'Folder ID ' || folder_id || ' (' || content_item.get_path(folder_id) ||
+ ') cannot be deleted because it is not empty.');
+ end if;
+
+ content_folder.unregister_content_type(
+ folder_id => content_folder.del.folder_id,
+ content_type => 'content_revision',
+ include_subtypes => 't' );
+
+ delete from cr_folder_type_map
+ where folder_id = content_folder.del.folder_id;
+
+ select parent_id into v_parent_id from cr_items
+ where item_id = content_folder.del.folder_id;
+
+ content_item.del(folder_id);
+
+ -- check if any folders are left in the parent
+ update cr_folders set has_child_folders = 'f'
+ where folder_id = v_parent_id and not exists (
+ select 1 from cr_items
+ where parent_id = v_parent_id and content_type = 'content_folder');
+
+end del;
+
+-- renames a folder, making sure the new name is not already in use
+procedure rename (
+ folder_id in cr_folders.folder_id%TYPE,
+ name in cr_items.name%TYPE default null,
+ label in cr_folders.label%TYPE default null,
+ description in cr_folders.description%TYPE default null
+) is
+ v_name_already_exists_p integer := 0;
+begin
+
+ if name is not null then
+ content_item.rename(folder_id, name);
+ end if;
+
+ if label is not null and description is not null then
+
+ update cr_folders
+ set label = label,
+ description = description
+ where folder_id = folder_id;
+
+ elsif label is not null and description is null then
+
+ update cr_folders
+ set label = label
+ where folder_id = folder_id;
+
+ end if;
+
+end rename;
+
+
+-- 1) make sure we are not moving the folder to an invalid location:
+-- a. destination folder exists
+-- b. folder is not the webroot (folder_id = -1)
+-- c. destination folder is not the same as the folder
+-- d. destination folder is not a subfolder
+-- 2) make sure subfolders are allowed in the target_folder
+-- 3) update the parent_id for the folder
+
+procedure move (
+ folder_id in cr_folders.folder_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE
+) is
+ v_source_folder_id integer;
+ v_valid_folders_p integer := 0;
+begin
+
+ select
+ count(*)
+ into
+ v_valid_folders_p
+ from
+ cr_folders
+ where
+ folder_id = move.target_folder_id
+ or
+ folder_id = move.folder_id;
+
+ if v_valid_folders_p ^= 2 then
+ raise_application_error(-20000,
+ 'content_folder.move - Not valid folder(s)');
+ end if;
+
+ if folder_id = content_item.get_root_folder or
+ folder_id = content_template.get_root_folder then
+ raise_application_error( -20000,
+ 'content_folder.move - Cannot move root folder');
+ end if;
+
+ if target_folder_id = folder_id then
+ raise_application_error(-20000,
+ 'content_folder.move - Cannot move a folder to itself');
+ end if;
+
+ if is_sub_folder(folder_id, target_folder_id) = 't' then
+ raise_application_error(-20000,
+ 'content_folder.move - Destination folder is subfolder');
+ end if;
+
+ if is_registered(target_folder_id,'content_folder') ^= 't' then
+ raise_application_error(-20000,
+ 'content_folder.move - Destination folder does not allow subfolders');
+ end if;
+
+ select parent_id into v_source_folder_id from cr_items
+ where item_id = move.folder_id;
+
+ -- update the parent_id for the folder
+ update cr_items
+ set parent_id = move.target_folder_id
+ where item_id = move.folder_id;
+
+ -- update the has_child_folders flags
+
+ -- update the source
+ update cr_folders set has_child_folders = 'f'
+ where folder_id = v_source_folder_id and not exists (
+ select 1 from cr_items
+ where parent_id = v_source_folder_id
+ and content_type = 'content_folder');
+
+ -- update the destination
+ update cr_folders set has_child_folders = 't'
+ where folder_id = target_folder_id;
+
+end move;
+
+-- * make sure that subfolders are allowed in this folder
+-- * creates new folder in the target folder with the same attributes
+-- as the old one
+-- * copies all contents of folder to the new one
+procedure copy (
+ folder_id in cr_folders.folder_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) is
+ v_valid_folders_p integer := 0;
+ v_current_folder_id cr_folders.folder_id%TYPE;
+ v_name cr_items.name%TYPE;
+ v_label cr_folders.label%TYPE;
+ v_description cr_folders.description%TYPE;
+ v_new_folder_id cr_folders.folder_id%TYPE;
+
+ -- cursor: items in the folder
+ cursor c_folder_contents_cur is
+ select
+ item_id
+ from
+ cr_items
+ where
+ parent_id = copy.folder_id;
+
+begin
+
+ select
+ count(*)
+ into
+ v_valid_folders_p
+ from
+ cr_folders
+ where
+ folder_id = copy.target_folder_id
+ or
+ folder_id = copy.folder_id;
+
+ select
+ parent_id
+ into
+ v_current_folder_id
+ from
+ cr_items
+ where
+ item_id = copy.folder_id;
+
+ if folder_id = content_item.get_root_folder or folder_id = content_template.get_root_folder or target_folder_id = folder_id or v_current_folder_id = target_folder_id then
+ v_valid_folders_p := 0;
+ end if;
+
+ if v_valid_folders_p = 2 then
+ if is_sub_folder(folder_id, target_folder_id) ^= 't' then
+
+ -- get the source folder info
+ select
+ name, label, description
+ into
+ v_name, v_label, v_description
+ from
+ cr_items i, cr_folders f
+ where
+ f.folder_id = i.item_id
+ and
+ f.folder_id = copy.folder_id;
+
+ -- create the new folder
+ v_new_folder_id := content_folder.new(
+ parent_id => copy.target_folder_id,
+ name => v_name,
+ label => v_label,
+ description => v_description,
+ creation_user => copy.creation_user,
+ creation_ip => copy.creation_ip
+ );
+
+ -- copy attributes of original folder
+ insert into cr_folder_type_map (
+ folder_id, content_type
+ ) select
+ v_new_folder_id, content_type
+ from
+ cr_folder_type_map map
+ where
+ folder_id = copy.folder_id
+ and
+ -- do not register content_type if it is already registered
+ not exists ( select 1 from cr_folder_type_map
+ where folder_id = v_new_folder_id
+ and content_type = map.content_type ) ;
+
+ -- for each item in the folder, copy it
+ for v_folder_contents_val in c_folder_contents_cur loop
+
+ content_item.copy(
+ item_id => v_folder_contents_val.item_id,
+ target_folder_id => v_new_folder_id,
+ creation_user => copy.creation_user,
+ creation_ip => copy.creation_ip
+ );
+
+ end loop;
+
+ end if;
+ end if;
+end copy;
+
+
+
+
+
+-- returns 1 if the item_id passed in is a folder
+function is_folder (
+ item_id in cr_items.item_id%TYPE
+) return char is
+
+ v_folder_p varchar2(1) := 'f';
+
+begin
+
+ select 't' into v_folder_p from cr_folders
+ where folder_id = item_id;
+
+ return v_folder_p;
+
+exception
+ when NO_DATA_FOUND then
+ return 'f';
+
+end is_folder;
+
+-- target_folder_id is the possible sub folder
+function is_sub_folder (
+ folder_id in cr_folders.folder_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE
+) return char
+is
+ cursor c_tree_cur is
+ select
+ parent_id
+ from
+ cr_items
+ connect by
+ prior parent_id = item_id
+ start with
+ item_id = target_folder_id;
+
+ v_parent_id integer := 0;
+ v_sub_folder_p char := 'f';
+
+begin
+
+ if folder_id = content_item.get_root_folder or
+ folder_id = content_template.get_root_folder then
+ v_sub_folder_p := 't';
+ end if;
+
+ -- Get the parents
+ open c_tree_cur;
+ while v_parent_id <> folder_id loop
+ fetch c_tree_cur into v_parent_id;
+ exit when c_tree_cur%NOTFOUND;
+ end loop;
+ close c_tree_cur;
+
+ if v_parent_id ^= 0 then
+ v_sub_folder_p := 't';
+ end if;
+
+ return v_sub_folder_p;
+
+end is_sub_folder;
+
+function is_empty (
+ folder_id in cr_folders.folder_id%TYPE
+) return varchar2
+is
+ v_return varchar2(1);
+begin
+
+ select
+ decode( count(*), 0, 't', 'f' ) into v_return
+ from
+ cr_items
+ where
+ parent_id = is_empty.folder_id;
+
+ return v_return;
+end is_empty;
+
+
+procedure register_content_type (
+ folder_id in cr_folders.folder_id%TYPE,
+ content_type in cr_folder_type_map.content_type%TYPE,
+ include_subtypes in varchar2 default 'f'
+) is
+
+ v_is_registered varchar2(100);
+
+begin
+
+ if register_content_type.include_subtypes = 'f' then
+
+ v_is_registered := is_registered(
+ folder_id => register_content_type.folder_id,
+ content_type => register_content_type.content_type,
+ include_subtypes => 'f' );
+
+ if v_is_registered = 'f' then
+
+ insert into cr_folder_type_map (
+ folder_id, content_type
+ ) values (
+ register_content_type.folder_id,
+ register_content_type.content_type
+ );
+
+ end if;
+
+ else
+
+ insert into cr_folder_type_map (
+ folder_id, content_type
+ ) select
+ register_content_type.folder_id, object_type
+ from
+ acs_object_types
+ where
+ object_type ^= 'acs_object'
+ and
+ not exists (select 1 from cr_folder_type_map
+ where folder_id = register_content_type.folder_id
+ and content_type = acs_object_types.object_type)
+ connect by
+ prior object_type = supertype
+ start with
+ object_type = register_content_type.content_type;
+
+ end if;
+
+end register_content_type;
+
+procedure unregister_content_type (
+ folder_id in cr_folders.folder_id%TYPE,
+ content_type in cr_folder_type_map.content_type%TYPE,
+ include_subtypes in varchar2 default 'f'
+) is
+begin
+
+ if unregister_content_type.include_subtypes = 'f' then
+ delete from cr_folder_type_map
+ where folder_id = unregister_content_type.folder_id
+ and content_type = unregister_content_type.content_type;
+ else
+ delete from cr_folder_type_map
+ where folder_id = unregister_content_type.folder_id
+ and content_type in (select object_type
+ from acs_object_types
+ where object_type ^= 'acs_object'
+ connect by prior object_type = supertype
+ start with
+ object_type = unregister_content_type.content_type);
+
+ end if;
+
+end unregister_content_type;
+
+
+
+
+function is_registered (
+ folder_id in cr_folders.folder_id%TYPE,
+ content_type in cr_folder_type_map.content_type%TYPE,
+ include_subtypes in varchar2 default 'f'
+) return varchar2
+is
+ v_is_registered integer;
+ cursor c_subtype_cur is
+ select
+ object_type
+ from
+ acs_object_types
+ where
+ object_type ^= 'acs_object'
+ connect by
+ prior object_type = supertype
+ start with
+ object_type = is_registered.content_type;
+
+begin
+
+ if is_registered.include_subtypes = 'f' then
+ select
+ count(1)
+ into
+ v_is_registered
+ from
+ cr_folder_type_map
+ where
+ folder_id = is_registered.folder_id
+ and
+ content_type = is_registered.content_type;
+
+ else
+
+ v_is_registered := 1;
+ for v_subtype_val in c_subtype_cur loop
+ if is_registered(is_registered.folder_id,
+ v_subtype_val.object_type, 'f') = 'f' then
+ v_is_registered := 0;
+ end if;
+ end loop;
+ end if;
+
+ if v_is_registered = 0 then
+ return 'f';
+ else
+ return 't';
+ end if;
+
+end is_registered;
+
+function get_label (
+ folder_id in cr_folders.folder_id%TYPE
+) return cr_folders.label%TYPE
+is
+ v_label cr_folders.label%TYPE;
+begin
+
+ select
+ label into v_label
+ from
+ cr_folders
+ where
+ folder_id = get_label.folder_id;
+
+ return v_label;
+end get_label;
+
+
+function get_index_page (
+ folder_id in cr_folders.folder_id%TYPE
+) return cr_items.item_id%TYPE
+is
+ v_folder_id cr_folders.folder_id%TYPE;
+ v_index_page_id cr_items.item_id%TYPE;
+begin
+
+ -- if the folder is a symlink, resolve it
+ if content_symlink.is_symlink( get_index_page.folder_id ) = 't' then
+ v_folder_id := content_symlink.resolve( get_index_page.folder_id );
+ else
+ v_folder_id := get_index_page.folder_id;
+ end if;
+
+ select
+ item_id into v_index_page_id
+ from
+ cr_items
+ where
+ parent_id = v_folder_id
+ and
+ name = 'index'
+ and
+ content_item.is_subclass(
+ content_item.get_content_type( content_symlink.resolve(item_id) ),
+ 'content_folder') = 'f'
+ and
+ content_item.is_subclass(
+ content_item.get_content_type( content_symlink.resolve(item_id) ),
+ 'content_template') = 'f';
+
+ return v_index_page_id;
+
+exception when no_data_found then
+ return null;
+end get_index_page;
+
+function is_root (
+ folder_id in cr_folders.folder_id%TYPE
+) return char is
+ v_is_root char(1);
+begin
+
+ select decode(parent_id, 0, 't', 'f') into v_is_root
+ from cr_items where item_id = is_root.folder_id;
+
+ return v_is_root;
+end is_root;
+
+end content_folder;
+/
+show errors
+
+-- Data model to support content repository of the ArsDigita
+-- Publishing System
+
+-- Copyright (C) 1999-2000 ArsDigita Corporation
+-- Author: Hiro Iwashima (iwashima@mit.edu)
+
+-- $Id: upgrade-4.7d6-5.0d1.sql,v 1.1 2003/10/08 15:56:23 mohanp Exp $
+
+-- This is free software distributed under the terms of the GNU Public
+-- License. Full text of the license is available from the GNU Project:
+-- http://www.fsf.org/copyleft/gpl.html
+
+
+create or replace package image
+as
+ --/**
+ -- Creates a new image
+ -- Binary file stored in file-system
+ --*/
+ function new (
+ name in cr_items.name%TYPE,
+ parent_id in cr_items.parent_id%TYPE default null,
+ item_id in acs_objects.object_id%TYPE default null,
+ revision_id in acs_objects.object_id%TYPE default null,
+ content_type in acs_object_types.object_type%TYPE default 'image',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ locale in cr_items.locale%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null,
+ title in cr_revisions.title%TYPE default null,
+ description in cr_revisions.description%TYPE default null,
+ mime_type in cr_revisions.mime_type%TYPE default null,
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ relation_tag in cr_child_rels.relation_tag%TYPE default null,
+ is_live in char default 'f',
+ publish_date in cr_revisions.publish_date%TYPE default sysdate,
+ data in cr_revisions.content%TYPE default null,
+ filename in cr_revisions.filename%TYPE default null,
+ height in images.height%TYPE default null,
+ width in images.width%TYPE default null,
+ file_size in cr_revisions.content_length%TYPE default null,
+ storage_type in cr_items.storage_type%TYPE default 'file'
+ ) return cr_items.item_id%TYPE;
+
+ function new_revision (
+ item_id in acs_objects.object_id%TYPE default null,
+ revision_id in acs_objects.object_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ title in cr_revisions.title%TYPE default null,
+ description in cr_revisions.description%TYPE default null,
+ mime_type in cr_revisions.mime_type%TYPE default null,
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ is_live in char default 'f',
+ publish_date in cr_revisions.publish_date%TYPE default sysdate,
+ data in cr_revisions.content%TYPE default null,
+ filename in cr_revisions.filename%TYPE default null,
+ height in images.height%TYPE default null,
+ width in images.width%TYPE default null,
+ file_size in cr_revisions.content_length%TYPE default null
+ ) return cr_revisions.revision_id%TYPE;
+
+ --/**
+ -- Deletes a single revision of image
+ -- Schedules binary file for deletion.
+ -- File delete sweep checks to see if no other images are using binary prior to deleting
+ --*/
+ procedure delete_revision (
+ revision_id in cr_revisions.revision_id%TYPE
+ );
+
+ --/**
+ -- Deletes a image and all revisions
+ -- Schedules binary files for deletion.
+ --
+ -- Be careful, cannot be undone (easily)
+ --*/
+ procedure del (
+ item_id in cr_items.item_id%TYPE
+ );
+
+end image;
+/
+show errors;
+
+create or replace package body image
+as
+ function new (
+ name in cr_items.name%TYPE,
+ parent_id in cr_items.parent_id%TYPE default null,
+ item_id in acs_objects.object_id%TYPE default null,
+ revision_id in acs_objects.object_id%TYPE default null,
+ content_type in acs_object_types.object_type%TYPE default 'image',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ locale in cr_items.locale%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null,
+ title in cr_revisions.title%TYPE default null,
+ description in cr_revisions.description%TYPE default null,
+ mime_type in cr_revisions.mime_type%TYPE default null,
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ relation_tag in cr_child_rels.relation_tag%TYPE default null,
+ is_live in char default 'f',
+ publish_date in cr_revisions.publish_date%TYPE default sysdate,
+ data in cr_revisions.content%TYPE default null,
+ filename in cr_revisions.filename%TYPE default null,
+ height in images.height%TYPE default null,
+ width in images.width%TYPE default null,
+ file_size in cr_revisions.content_length%TYPE default null,
+ storage_type in cr_items.storage_type%TYPE default 'file'
+ ) return cr_items.item_id%TYPE
+ is
+ v_item_id cr_items.item_id%TYPE;
+ v_revision_id cr_revisions.revision_id%TYPE;
+ begin
+
+ v_item_id := content_item.new (
+ name => name,
+ item_id => item_id,
+ parent_id => parent_id,
+ relation_tag => relation_tag,
+ content_type => content_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ locale => locale,
+ context_id => context_id,
+ storage_type => storage_type
+ );
+
+ v_revision_id := content_revision.new (
+ title => title,
+ description => description,
+ item_id => v_item_id,
+ revision_id => revision_id,
+ publish_date => publish_date,
+ mime_type => mime_type,
+ nls_language => nls_language,
+ data => data,
+ filename => filename,
+ creation_date => sysdate,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert into images
+ (image_id, height, width)
+ values
+ (v_revision_id, height, width);
+
+ -- update revision with image file info
+ update cr_revisions
+ set content_length = file_size
+ where revision_id = v_revision_id;
+
+ -- is_live => 't' not used as part of content_item.new
+ -- because content_item.new does not let developer specify revision_id,
+ -- revision_id is determined in advance
+
+ if is_live = 't' then
+ content_item.set_live_revision (
+ revision_id => v_revision_id
+ );
+ end if;
+
+ return v_item_id;
+ end new;
+
+ function new_revision (
+ item_id in acs_objects.object_id%TYPE default null,
+ revision_id in acs_objects.object_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ title in cr_revisions.title%TYPE default null,
+ description in cr_revisions.description%TYPE default null,
+ mime_type in cr_revisions.mime_type%TYPE default null,
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ is_live in char default 'f',
+ publish_date in cr_revisions.publish_date%TYPE default sysdate,
+ data in cr_revisions.content%TYPE default null,
+ filename in cr_revisions.filename%TYPE default null,
+ height in images.height%TYPE default null,
+ width in images.width%TYPE default null,
+ file_size in cr_revisions.content_length%TYPE default null
+ ) return cr_revisions.revision_id%TYPE
+ is
+ v_revision_id cr_revisions.revision_id%TYPE;
+
+ begin
+ v_revision_id := content_revision.new (
+ title => title,
+ description => description,
+ item_id => item_id,
+ revision_id => revision_id,
+ publish_date => publish_date,
+ mime_type => mime_type,
+ nls_language => nls_language,
+ data => data,
+ filename => filename,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert into images
+ (image_id, height, width)
+ values
+ (v_revision_id, height, width);
+
+ -- update revision with image file info
+ update cr_revisions
+ set content_length = file_size
+ where revision_id = v_revision_id;
+
+ -- is_live => 't' not used as part of content_item.new
+ -- because content_item.new does not let developer specify revision_id,
+ -- revision_id is determined in advance
+
+ if is_live = 't' then
+ content_item.set_live_revision (
+ revision_id => v_revision_id
+ );
+ end if;
+
+ return v_revision_id;
+ end new_revision;
+
+ procedure delete_revision (
+ revision_id in cr_revisions.revision_id%TYPE
+ )
+ is
+ v_content cr_files_to_delete.path%TYPE default null;
+ begin
+ content_revision.del (
+ revision_id => revision_id
+ );
+ end delete_revision;
+
+ procedure del (
+ item_id in cr_items.item_id%TYPE
+ )
+ is
+
+ cursor image_revision_cur is
+ select
+ revision_id
+ from
+ cr_revisions
+ where
+ item_id = image.del.item_id
+ order by revision_id asc;
+
+ -- order by used in cursur so latest revision will be deleted last
+ -- save resetting latest revision multiple times during delete process
+
+ begin
+ for v_revision_val in image_revision_cur loop
+ image.delete_revision (
+ revision_id => v_revision_val.revision_id
+ );
+ end loop;
+
+ content_item.del (
+ item_id => item_id
+ );
+ end del;
+
+end image;
+/
+show errors;
+
+-- Data model to support content repository of the ArsDigita
+-- Community System
+
+-- Copyright (C) 1999-2000 ArsDigita Corporation
+-- Author: Karl Goldstein (karlg@arsdigita.com)
+
+-- $Id: upgrade-4.7d6-5.0d1.sql,v 1.1 2003/10/08 15:56:23 mohanp Exp $
+
+-- This is free software distributed under the terms of the GNU Public
+-- License. Full text of the license is available from the GNU Project:
+-- http://www.fsf.org/copyleft/gpl.html
+set serveroutput on size 1000000 format wrapped
+
+create or replace package body content_item
+as
+
+function get_root_folder (
+ item_id in cr_items.item_id%TYPE default null
+) return cr_folders.folder_id%TYPE is
+
+ v_folder_id cr_folders.folder_id%TYPE;
+
+begin
+
+ if item_id is NULL then
+
+ v_folder_id := c_root_folder_id;
+
+ else
+
+ select
+ item_id into v_folder_id
+ from
+ cr_items
+ where
+ parent_id = 0
+ connect by
+ prior parent_id = item_id
+ start with
+ item_id = get_root_folder.item_id;
+
+ end if;
+
+ return v_folder_id;
+
+exception
+ when NO_DATA_FOUND then
+ raise_application_error(-20000,
+ 'Could not find a root folder for item ID ' || item_id || '. ' ||
+ 'Either the item does not exist or its parent value is corrupted.');
+end get_root_folder;
+
+function new (
+ name in cr_items.name%TYPE,
+ parent_id in cr_items.parent_id%TYPE default null,
+ item_id in acs_objects.object_id%TYPE default null,
+ locale in cr_items.locale%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ context_id in acs_objects.context_id%TYPE
+ default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ item_subtype in acs_object_types.object_type%TYPE
+ default 'content_item',
+ content_type in acs_object_types.object_type%TYPE
+ default 'content_revision',
+ title in cr_revisions.title%TYPE default null,
+ description in cr_revisions.description%TYPE default null,
+ mime_type in cr_revisions.mime_type%TYPE default 'text/plain',
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ text in varchar2 default null,
+ data in cr_revisions.content%TYPE default null,
+ relation_tag in cr_child_rels.relation_tag%TYPE default null,
+ is_live in char default 'f',
+ storage_type in cr_items.storage_type%TYPE default 'lob'
+) return cr_items.item_id%TYPE
+is
+ 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;
+ v_storage_type cr_items.storage_type%TYPE;
+begin
+
+ -- if content_item.is_subclass(item_subtype,'content_item') = 'f' then
+ -- raise_application_error(-20000, 'The object_type ' || item_subtype ||
+ -- ' does not inherit from content_item.');
+ -- end if;
+
+ -- place the item in the context of the pages folder if no
+ -- context specified
+
+ if storage_type = 'text' then
+ v_storage_type := 'lob';
+ else
+ v_storage_type := storage_type;
+ end if;
+
+ if parent_id is null then
+ v_parent_id := c_root_folder_id;
+ else
+ v_parent_id := parent_id;
+ end if;
+
+ -- Determine context_id
+ if context_id is null then
+ v_context_id := v_parent_id;
+ else
+ v_context_id := 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, content_item.new.content_type, 'f') = 'f' then
+
+ raise_application_error(-20000,
+ 'This item''s content type ' || content_item.new.content_type ||
+ ' is not registered to this folder ' || v_parent_id);
+
+ end if;
+
+ elsif v_parent_id ^= 0 then
+
+ begin
+
+ -- Figure out the relation_tag to use
+ if content_item.new.relation_tag is null then
+ v_rel_tag := content_item.get_content_type(v_parent_id)
+ || '-' || content_item.new.content_type;
+ else
+ v_rel_tag := content_item.new.relation_tag;
+ end if;
+
+ select object_type into v_parent_type from acs_objects
+ where object_id = v_parent_id;
+
+ if is_subclass(v_parent_type, 'content_item') = 't' and
+ is_valid_child(v_parent_id, content_item.new.content_type, v_rel_tag) = 'f' then
+
+ raise_application_error(-20000,
+ 'This item''s content type ' || content_item.new.content_type ||
+ ' is not allowed in this container ' || v_parent_id);
+
+ end if;
+
+ exception when NO_DATA_FOUND then
+
+ raise_application_error(-20000,
+ 'Invalid parent ID ' || v_parent_id ||
+ ' specified in content_item.new');
+
+ end;
+
+ end if;
+
+ -- Create the object
+
+ v_item_id := acs_object.new(
+ object_id => content_item.new.item_id,
+ object_type => content_item.new.item_subtype,
+ context_id => v_context_id,
+ creation_date => content_item.new.creation_date,
+ creation_user => content_item.new.creation_user,
+ creation_ip => content_item.new.creation_ip
+ );
+
+ -- Turn off security inheritance if there is no security context
+ --if context_id is null then
+ -- update acs_objects set security_inherit_p = 'f'
+ -- where object_id = v_item_id;
+ --end if;
+
+ insert into cr_items (
+ item_id, name, content_type, parent_id, storage_type
+ ) values (
+ v_item_id, content_item.new.name,
+ content_item.new.content_type, v_parent_id, v_storage_type
+ );
+
+ -- if the parent is not a folder, insert into cr_child_rels
+ -- We checked above before creating the object that it is a valid rel
+ if v_parent_id ^= 0 and
+ content_folder.is_folder(v_parent_id) = 'f' then
+
+ v_rel_id := acs_object.new(
+ object_type => 'cr_item_child_rel',
+ context_id => v_parent_id
+ );
+
+ 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 content_item.new.title is null then
+ v_title := content_item.new.name;
+ else
+ v_title := content_item.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 content_item.new.data is not null then
+
+ v_revision_id := content_revision.new(
+ item_id => v_item_id,
+ title => v_title,
+ description => content_item.new.description,
+ data => content_item.new.data,
+ mime_type => content_item.new.mime_type,
+ creation_date => content_item.new.creation_date,
+ creation_user => content_item.new.creation_user,
+ creation_ip => content_item.new.creation_ip,
+ nls_language => content_item.new.nls_language
+ );
+
+ elsif content_item.new.title is not null or
+ content_item.new.text is not null then
+
+ v_revision_id := content_revision.new(
+ item_id => v_item_id,
+ title => v_title,
+ description => content_item.new.description,
+ text => content_item.new.text,
+ mime_type => content_item.new.mime_type,
+ creation_date => content_item.new.creation_date,
+ creation_user => content_item.new.creation_user,
+ creation_ip => content_item.new.creation_ip
+ );
+
+ end if;
+
+ -- make the revision live if is_live is 't'
+ if content_item.new.is_live = 't' then
+ content_item.set_live_revision(v_revision_id);
+ end if;
+
+ -- Have the new item inherit the permission of the parent item
+ -- if no security context was specified
+ --if parent_id is not null and context_id is null then
+ -- content_permission.inherit_permissions (
+ -- parent_id, v_item_id, creation_user
+ -- );
+ --end if;
+
+ return v_item_id;
+end new;
+
+function is_published (
+ item_id in cr_items.item_id%TYPE
+) return char
+is
+ v_is_published char(1);
+begin
+
+ select
+ 't' into v_is_published
+ from
+ cr_items
+ where
+ live_revision is not null
+ and
+ publish_status = 'live'
+ and
+ item_id = is_published.item_id;
+
+ return v_is_published;
+ exception
+ when NO_DATA_FOUND then
+ return 'f';
+end is_published;
+
+function is_publishable (
+ item_id in cr_items.item_id%TYPE
+) return char
+is
+ v_child_count integer;
+ v_rel_count integer;
+ v_template_id cr_templates.template_id%TYPE;
+
+ -- get the child types registered to this content type
+ cursor c_child_types is
+ select
+ child_type, min_n, max_n
+ from
+ cr_type_children
+ where
+ parent_type = content_item.get_content_type( is_publishable.item_id );
+
+ -- get the relation types registered to this content type
+ cursor c_rel_types is
+ select
+ target_type, min_n, max_n
+ from
+ cr_type_relations
+ where
+ content_type = content_item.get_content_type( is_publishable.item_id );
+
+ -- get the publishing workflows associated with this content item
+ -- there should only be 1 if CMS exists, otherwise 0
+ -- cursor c_pub_wf is
+ -- select
+ -- case_id, state
+ -- from
+ -- wf_cases
+ -- where
+ -- workflow_key = 'publishing_wf'
+ -- and
+ -- object_id = is_publishable.item_id;
+
+begin
+
+ -- validate children
+ -- make sure the # of children of each type fall between min_n and max_n
+ for v_child_type in c_child_types loop
+ select
+ count(rel_id) into v_child_count
+ from
+ cr_child_rels
+ where
+ parent_id = is_publishable.item_id
+ and
+ content_item.get_content_type( child_id ) = v_child_type.child_type;
+
+ -- make sure # of children is in range
+ if v_child_type.min_n is not null
+ and v_child_count < v_child_type.min_n then
+ return 'f';
+ end if;
+ if v_child_type.max_n is not null
+ and v_child_count > v_child_type.max_n then
+ return 'f';
+ end if;
+
+ end loop;
+
+
+ -- validate relations
+ -- make sure the # of ext links of each type fall between min_n and max_n
+ for v_rel_type in c_rel_types loop
+ select
+ count(rel_id) into v_rel_count
+ from
+ cr_item_rels i, acs_objects o
+ where
+ i.related_object_id = o.object_id
+ and
+ i.item_id = is_publishable.item_id
+ and
+ nvl(content_item.get_content_type(o.object_id),o.object_type) = v_rel_type.target_type;
+
+ -- make sure # of object relations is in range
+ if v_rel_type.min_n is not null
+ and v_rel_count < v_rel_type.min_n then
+ return 'f';
+ end if;
+ if v_rel_type.max_n is not null
+ and v_rel_count > v_rel_type.max_n then
+ return 'f';
+ end if;
+ end loop;
+
+ -- validate publishing workflows
+ -- make sure any 'publishing_wf' associated with this item are finished
+ -- KG: logic is wrong here. Only the latest workflow matters, and even
+ -- that is a little problematic because more than one workflow may be
+ -- open on an item. In addition, this should be moved to CMS.
+
+ -- Removed this as having workflow stuff in the CR is just plain wrong.
+ -- DanW, Aug 25th, 2001.
+
+ -- for v_pub_wf in c_pub_wf loop
+ -- if v_pub_wf.state ^= 'finished' then
+ -- return 'f';
+ -- end if;
+ -- end loop;
+
+ return 't';
+ exception
+ when NO_DATA_FOUND then
+ return 'f';
+end is_publishable;
+
+function is_valid_child (
+ item_id in cr_items.item_id%TYPE,
+ content_type in acs_object_types.object_type%TYPE,
+ relation_tag in cr_child_rels.relation_tag%TYPE default null
+) return char
+is
+ v_is_valid_child char(1);
+ v_max_children cr_type_children.max_n%TYPE;
+ v_n_children integer;
+begin
+
+ v_is_valid_child := 'f';
+
+ -- first check if content_type is a registered child_type
+ begin
+ select
+ sum(max_n) into v_max_children
+ from
+ cr_type_children
+ where
+ parent_type = content_item.get_content_type( is_valid_child.item_id )
+ and
+ child_type = is_valid_child.content_type
+ and
+ (is_valid_child.relation_tag is null
+ or is_valid_child.relation_tag = relation_tag);
+
+ exception
+ when NO_DATA_FOUND then
+ return 'f';
+ end;
+
+ -- if the max is null then infinite number is allowed
+ if v_max_children is null then
+ return 't';
+ end if;
+
+ -- next check if there are already max_n children of that content type
+ select
+ count(rel_id) into v_n_children
+ from
+ cr_child_rels
+ where
+ parent_id = is_valid_child.item_id
+ and
+ content_item.get_content_type( child_id ) = is_valid_child.content_type
+ and
+ (is_valid_child.relation_tag is null
+ or is_valid_child.relation_tag = relation_tag);
+
+ if v_n_children < v_max_children then
+ v_is_valid_child := 't';
+ end if;
+
+ return v_is_valid_child;
+ exception
+ when NO_DATA_FOUND then
+ return 'f';
+end is_valid_child;
+
+/* delete a content item
+ 1) delete all associated workflows
+ 2) delete all symlinks associated with this object
+ 3) delete any revisions for this item
+ 4) unregister template relations
+ 5) delete all permissions associated with this item
+ 6) delete keyword associations
+ 7) delete all associated comments */
+procedure del (
+ item_id in cr_items.item_id%TYPE
+) is
+
+-- cursor c_wf_cases_cur is
+-- select
+-- case_id
+-- from
+-- wf_cases
+-- where
+-- object_id = item_id;
+
+ cursor c_symlink_cur is
+ select
+ symlink_id
+ from
+ cr_symlinks
+ where
+ target_id = content_item.del.item_id;
+
+ cursor c_revision_cur is
+ select
+ revision_id
+ from
+ cr_revisions
+ where
+ item_id = content_item.del.item_id;
+
+ cursor c_rel_cur is
+ select
+ rel_id
+ from
+ cr_item_rels
+ where
+ item_id = content_item.del.item_id
+ or
+ related_object_id = content_item.del.item_id;
+
+ cursor c_child_cur is
+ select
+ rel_id
+ from
+ cr_child_rels
+ where
+ child_id = content_item.del.item_id;
+
+ cursor c_parent_cur is
+ select
+ rel_id, child_id
+ from
+ cr_child_rels
+ where
+ parent_id = content_item.del.item_id;
+
+ -- this is strictly for debugging
+ -- cursor c_error_cur is
+ -- select
+ -- object_id, object_type
+ -- from
+ -- acs_objects
+ -- where
+ -- context_id = content_item.delete.item_id;
+
+begin
+
+ -- Removed this as having workflow stuff in the CR is just plain wrong.
+ -- DanW, Aug 25th, 2001.
+
+ -- dbms_output.put_line('Deleting associated workflows...');
+ -- 1) delete all workflow cases associated with this item
+ -- for v_wf_cases_val in c_wf_cases_cur loop
+ -- workflow_case.delete(v_wf_cases_val.case_id);
+ -- end loop;
+
+ dbms_output.put_line('Deleting symlinks...');
+ -- 2) delete all symlinks to this item
+ for v_symlink_val in c_symlink_cur loop
+ content_symlink.del(v_symlink_val.symlink_id);
+ end loop;
+
+ dbms_output.put_line('Unscheduling item...');
+ delete from cr_release_periods
+ where item_id = content_item.del.item_id;
+
+ dbms_output.put_line('Deleting associated revisions...');
+ -- 3) delete all revisions of this item
+ delete from cr_item_publish_audit
+ where item_id = content_item.del.item_id;
+ for v_revision_val in c_revision_cur loop
+ content_revision.del(v_revision_val.revision_id);
+ end loop;
+
+ dbms_output.put_line('Deleting associated item templates...');
+ -- 4) unregister all templates to this item
+ delete from cr_item_template_map
+ where item_id = content_item.del.item_id;
+
+ dbms_output.put_line('Deleting item relationships...');
+ -- Delete all relations on this item
+ for v_rel_val in c_rel_cur loop
+ acs_rel.del(v_rel_val.rel_id);
+ end loop;
+
+ dbms_output.put_line('Deleting child relationships...');
+ for v_rel_val in c_child_cur loop
+ acs_rel.del(v_rel_val.rel_id);
+ end loop;
+
+ dbms_output.put_line('Deleting parent relationships...');
+ for v_rel_val in c_parent_cur loop
+ acs_rel.del(v_rel_val.rel_id);
+ content_item.del(v_rel_val.child_id);
+ end loop;
+
+ dbms_output.put_line('Deleting associated permissions...');
+ -- 5) delete associated permissions
+ delete from acs_permissions
+ where object_id = content_item.del.item_id;
+
+ dbms_output.put_line('Deleting keyword associations...');
+ -- 6) delete keyword associations
+ delete from cr_item_keyword_map
+ where item_id = content_item.del.item_id;
+
+ dbms_output.put_line('Deleting associated comments...');
+ -- 7) delete associated comments
+ journal_entry.delete_for_object( content_item.del.item_id );
+
+ -- context_id debugging loop
+ --for v_error_val in c_error_cur loop
+ -- dbms_output.put_line('ID=' || v_error_val.object_id || ' TYPE='
+ -- || v_error_val.object_type);
+ --end loop;
+
+ dbms_output.put_line('Deleting content item...');
+ acs_object.del(content_item.del.item_id);
+
+end del;
+
+
+procedure rename (
+ item_id in cr_items.item_id%TYPE,
+ name in cr_items.name%TYPE
+) is
+ cursor exists_cur is
+ select
+ item_id
+ from
+ cr_items
+ where
+ name = name
+ and
+ parent_id = (select
+ parent_id
+ from
+ cr_items
+ where
+ item_id = item_id);
+
+ exists_id integer;
+begin
+
+ open exists_cur;
+ fetch exists_cur into exists_id;
+
+ if exists_cur%NOTFOUND then
+ close exists_cur;
+ update cr_items
+ set name = name
+ where item_id = item_id;
+ else
+ close exists_cur;
+ if exists_id <> item_id then
+ raise_application_error(-20000,
+ 'An item with the name ' || name ||
+ ' already exists in this directory.');
+ end if;
+ end if;
+
+end rename;
+
+function get_id (
+ item_path in varchar2,
+ root_folder_id in cr_items.item_id%TYPE default c_root_folder_id,
+ resolve_index in char default 'f'
+) return cr_items.item_id%TYPE is
+
+ v_item_path varchar2(4000);
+ v_root_folder_id cr_items.item_id%TYPE;
+ parent_id integer;
+ child_id integer;
+ start_pos integer := 1;
+ end_pos integer;
+ counter integer := 0;
+ item_name varchar2(200);
+
+begin
+
+ v_root_folder_id := nvl(root_folder_id, c_root_folder_id);
+
+ -- If the request path is the root, then just return the root folder
+ if item_path = '/' then
+ return v_root_folder_id;
+ end if;
+
+ -- Remove leading, trailing spaces, leading slashes
+ v_item_path := rtrim(ltrim(trim(item_path), '/'), '/');
+
+ parent_id := v_root_folder_id;
+
+ -- if parent_id is a symlink, resolve it
+ parent_id := content_symlink.resolve(parent_id);
+
+ loop
+
+ end_pos := instr(v_item_path, '/', start_pos);
+
+ if end_pos = 0 then
+ item_name := substr(v_item_path, start_pos);
+ else
+ item_name := substr(v_item_path, start_pos, end_pos - start_pos);
+ end if;
+
+ select
+ item_id into child_id
+ from
+ cr_items
+ where
+ parent_id = get_id.parent_id
+ and
+ name = item_name;
+
+ exit when end_pos = 0;
+
+ parent_id := child_id;
+
+ -- if parent_id is a symlink, resolve it
+ parent_id := content_symlink.resolve(parent_id);
+
+ start_pos := end_pos + 1;
+
+ end loop;
+
+ if get_id.resolve_index = 't' then
+
+ -- if the item is a folder and has an index page, then return
+
+ if content_folder.is_folder( child_id ) = 't' and
+ content_folder.get_index_page( child_id ) is not null then
+
+ child_id := content_folder.get_index_page( child_id );
+
+ end if;
+
+ end if;
+
+ return child_id;
+
+exception
+ when NO_DATA_FOUND then
+ return null;
+end get_id;
+
+function get_path (
+ item_id in cr_items.item_id%TYPE,
+ root_folder_id in cr_items.item_id%TYPE default null
+) return varchar2
+is
+
+ cursor c_abs_cur is
+ select
+ name, parent_id, level as tree_level
+ from
+ cr_items
+ where
+ parent_id <> 0
+ connect by
+ prior parent_id = item_id
+ start with
+ item_id = get_path.item_id
+ order by
+ tree_level desc;
+
+ v_count integer;
+ v_name varchar2(400);
+ v_parent_id integer := 0;
+ v_tree_level integer;
+
+ v_resolved_root_id integer;
+
+ cursor c_rel_cur is
+ select
+ parent_id, level as tree_level
+ from
+ cr_items
+ where
+ parent_id <> 0
+ connect by
+ prior parent_id = item_id
+ start with
+ item_id = v_resolved_root_id
+ order by
+ tree_level desc;
+
+ v_rel_parent_id integer := 0;
+ v_rel_tree_level integer := 0;
+
+ v_path varchar2(4000) := '';
+
+begin
+
+ -- check that the item exists
+ select count(*) into v_count from cr_items where item_id = get_path.item_id;
+
+ if v_count = 0 then
+ raise_application_error(-20000, 'Invalid item ID: ' || item_id);
+ end if;
+
+ -- begin walking down the path to the item (from the repository root)
+ open c_abs_cur;
+
+ -- if the root folder is not null then prepare for a relative path
+
+ if root_folder_id is not null then
+
+ -- if root_folder_id is a symlink, resolve it (child items will point
+ -- to the actual folder, not the symlink)
+
+ v_resolved_root_id := content_symlink.resolve(root_folder_id);
+
+ -- begin walking down the path to the root folder. Discard
+ -- elements of the item path as long as they are the same as the root
+ -- folder
+
+ open c_rel_cur;
+
+ while v_parent_id = v_rel_parent_id loop
+ fetch c_abs_cur into v_name, v_parent_id, v_tree_level;
+ fetch c_rel_cur into v_rel_parent_id, v_rel_tree_level;
+ exit when c_abs_cur%NOTFOUND or c_rel_cur%NOTFOUND;
+ end loop;
+
+ -- walk the remainder of the relative path, add a '..' for each
+ -- additional step
+
+ loop
+ exit when c_rel_cur%NOTFOUND;
+ v_path := v_path || '../';
+ fetch c_rel_cur into v_rel_parent_id, v_rel_tree_level;
+ end loop;
+ close c_rel_cur;
+
+ -- an item relative to itself is '../item'
+ if v_resolved_root_id = item_id then
+ v_path := '../';
+ end if;
+
+ else
+
+ -- this is an absolute path so prepend a '/'
+ v_path := '/';
+
+ -- prime the pump to be consistent with relative path execution plan
+ fetch c_abs_cur into v_name, v_parent_id, v_tree_level;
+
+ end if;
+
+ -- loop over the remainder of the absolute path
+
+ loop
+
+ v_path := v_path || v_name;
+
+ fetch c_abs_cur into v_name, v_parent_id, v_tree_level;
+
+ exit when c_abs_cur%NOTFOUND;
+
+ v_path := v_path || '/';
+
+ end loop;
+ close c_abs_cur;
+
+ return v_path;
+
+end get_path;
+
+
+function get_virtual_path (
+ item_id in cr_items.item_id%TYPE,
+ root_folder_id in cr_items.item_id%TYPE default c_root_folder_id
+) return varchar2
+is
+ v_path varchar2(4000);
+ v_item_id cr_items.item_id%TYPE;
+ v_is_folder char(1);
+ v_index cr_items.item_id%TYPE;
+begin
+
+ -- first resolve the item
+ v_item_id := content_symlink.resolve( get_virtual_path.item_id );
+
+ v_is_folder := content_folder.is_folder( v_item_id );
+ v_index := content_folder.get_index_page( v_item_id );
+
+ -- if the folder has an index page
+ if v_is_folder = 't' and v_index is not null then
+ v_path := content_item.get_path( content_symlink.resolve( v_index ));
+ else
+ v_path := content_item.get_path( v_item_id );
+ end if;
+
+ return v_path;
+ exception
+ when NO_DATA_FOUND then
+ return null;
+end get_virtual_path;
+
+
+
+procedure write_to_file (
+ item_id in cr_items.item_id%TYPE,
+ root_path in varchar2
+)is
+
+ blob_loc cr_revisions.content%TYPE;
+ v_revision cr_items.live_revision%TYPE;
+
+begin
+
+ v_revision := get_live_revision(item_id);
+ select content into blob_loc from cr_revisions
+ where revision_id = v_revision;
+
+ blob_to_file(root_path || get_path(item_id), blob_loc);
+
+exception when no_data_found then
+
+ raise_application_error(-20000, 'No live revision for content item' ||
+ item_id || ' in content_item.write_to_file.');
+
+end write_to_file;
+
+procedure register_template (
+ item_id in cr_items.item_id%TYPE,
+ template_id in cr_templates.template_id%TYPE,
+ use_context in cr_item_template_map.use_context%TYPE
+) is
+
+begin
+
+ -- register template if it is not already registered
+ insert into cr_item_template_map (
+ template_id, item_id, use_context
+ ) select
+ register_template.template_id,
+ register_template.item_id,
+ register_template.use_context
+ from
+ dual
+ where
+ not exists ( select 1
+ from
+ cr_item_template_map
+ where
+ item_id = register_template.item_id
+ and
+ template_id = register_template.template_id
+ and
+ use_context = register_template.use_context );
+
+end register_template;
+
+procedure unregister_template (
+ item_id in cr_items.item_id%TYPE,
+ template_id in cr_templates.template_id%TYPE default null,
+ use_context in cr_item_template_map.use_context%TYPE default null
+) is
+
+begin
+
+ if use_context is null and template_id is null then
+
+ delete from cr_item_template_map
+ where item_id = unregister_template.item_id;
+
+ elsif use_context is null then
+
+ delete from cr_item_template_map
+ where template_id = unregister_template.template_id
+ and item_id = unregister_template.item_id;
+
+ elsif template_id is null then
+
+ delete from cr_item_template_map
+ where item_id = unregister_template.item_id
+ and use_context = unregister_template.use_context;
+
+ else
+
+ delete from cr_item_template_map
+ where template_id = unregister_template.template_id
+ and item_id = unregister_template.item_id
+ and use_context = unregister_template.use_context;
+
+ end if;
+
+end unregister_template;
+
+function get_template (
+ item_id in cr_items.item_id%TYPE,
+ use_context in cr_item_template_map.use_context%TYPE
+) return cr_templates.template_id%TYPE is
+
+ v_template_id cr_templates.template_id%TYPE;
+ v_content_type cr_items.content_type%TYPE;
+
+ cursor item_cur is
+ select
+ template_id
+ from
+ cr_item_template_map
+ where
+ item_id = get_template.item_id
+ and
+ use_context = get_template.use_context;
+
+begin
+
+ -- look for a template assigned specifically to this item
+ open item_cur;
+ fetch item_cur into v_template_id;
+
+ -- otherwise get the default for the content type
+ if item_cur%NOTFOUND then
+ select
+ m.template_id
+ into
+ v_template_id
+ from
+ cr_items i, cr_type_template_map m
+ where
+ i.item_id = get_template.item_id
+ and
+ i.content_type = m.content_type
+ and
+ m.use_context = get_template.use_context
+ and
+ m.is_default = 't';
+ end if;
+ close item_cur;
+
+ return v_template_id;
+
+exception
+ when NO_DATA_FOUND then
+ if item_cur%ISOPEN then
+ close item_cur;
+ end if;
+ return null;
+end get_template;
+
+-- Return the object type of this item
+
+function get_content_type (
+ item_id in cr_items.item_id%TYPE
+) return cr_items.content_type%TYPE is
+ v_content_type cr_items.content_type%TYPE;
+begin
+
+ select
+ content_type into v_content_type
+ from
+ cr_items
+ where
+ item_id = get_content_type.item_id;
+
+ return v_content_type;
+exception
+ when NO_DATA_FOUND then
+ return null;
+end get_content_type;
+
+function get_live_revision (
+ item_id in cr_items.item_id%TYPE
+) return cr_revisions.revision_id%TYPE is
+
+ v_revision_id acs_objects.object_id%TYPE;
+
+begin
+
+ select
+ live_revision into v_revision_id
+ from
+ cr_items
+ where
+ item_id = get_live_revision.item_id;
+
+ return v_revision_id;
+
+exception
+ when NO_DATA_FOUND then
+ return null;
+end get_live_revision;
+
+procedure set_live_revision (
+ revision_id in cr_revisions.revision_id%TYPE,
+ publish_status in cr_items.publish_status%TYPE default 'ready'
+) is
+begin
+
+ update
+ cr_items
+ set
+ live_revision = set_live_revision.revision_id,
+ publish_status = set_live_revision.publish_status
+ where
+ item_id = (select
+ item_id
+ from
+ cr_revisions
+ where
+ revision_id = set_live_revision.revision_id);
+
+ update
+ cr_revisions
+ set
+ publish_date = sysdate
+ where
+ revision_id = set_live_revision.revision_id;
+
+end set_live_revision;
+
+
+procedure unset_live_revision (
+ item_id in cr_items.item_id%TYPE
+) is
+begin
+
+ update
+ cr_items
+ set
+ live_revision = NULL
+ where
+ item_id = unset_live_revision.item_id;
+
+ -- if an items publish status is "live", change it to "ready"
+ update
+ cr_items
+ set
+ publish_status = 'production'
+ where
+ publish_status = 'live'
+ and
+ item_id = unset_live_revision.item_id;
+
+
+end unset_live_revision;
+
+
+procedure set_release_period (
+ item_id in cr_items.item_id%TYPE,
+ start_when date default null,
+ end_when date default null
+) is
+
+ v_count integer;
+
+begin
+
+ select decode(count(*),0,0,1) into v_count from cr_release_periods
+ where item_id = set_release_period.item_id;
+
+ if v_count = 0 then
+
+ insert into cr_release_periods (
+ item_id, start_when, end_when
+ ) values (
+ item_id, start_when, end_when
+ );
+
+ else
+
+ update cr_release_periods
+ set start_when = set_release_period.start_when,
+ end_when = set_release_period.end_when
+ where
+ item_id = set_release_period.item_id;
+
+ end if;
+
+end set_release_period;
+
+
+function get_revision_count (
+ item_id in cr_items.item_id%TYPE
+) return number is
+
+ v_count integer;
+
+begin
+
+ select
+ count(*) into v_count
+ from
+ cr_revisions
+ where
+ item_id = get_revision_count.item_id;
+
+ return v_count;
+
+end get_revision_count;
+
+function get_context (
+ item_id in cr_items.item_id%TYPE
+) return acs_objects.context_id%TYPE is
+
+ v_context_id acs_objects.context_id%TYPE;
+
+begin
+
+ select
+ context_id
+ into
+ v_context_id
+ from
+ acs_objects
+ where
+ object_id = get_context.item_id;
+
+ return v_context_id;
+
+exception when no_data_found then
+
+ raise_application_error(-20000, 'Content item ' || item_id ||
+ ' does not exist in content_item.get_context');
+
+
+end get_context;
+
+-- 1) make sure we are not moving the item to an invalid location:
+-- that is, the destination folder exists and is a valid folder
+-- 2) make sure the content type of the content item is registered
+-- to the target folder
+-- 3) update the parent_id for the item
+procedure move (
+ item_id in cr_items.item_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE
+) is
+begin
+
+ if content_folder.is_folder(item_id) = 't' then
+ content_folder.move(item_id, target_folder_id);
+ elsif content_folder.is_folder(target_folder_id) = 't' then
+
+
+ if content_folder.is_registered( move.target_folder_id,
+ get_content_type( move.item_id )) = 't' and
+ content_folder.is_registered( move.target_folder_id,
+ get_content_type( content_symlink.resolve( move.item_id)),'f') = 't'
+ then
+
+ -- update the parent_id for the item
+ update cr_items
+ set parent_id = move.target_folder_id
+ where item_id = move.item_id;
+ end if;
+
+ end if;
+end move;
+
+procedure copy (
+ item_id in cr_items.item_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) is
+
+ copy_id cr_items.item_id%TYPE;
+
+begin
+
+ copy_id := copy2(item_id, target_folder_id, creation_user, creation_ip);
+
+end copy;
+
+-- copy a content item to a target folder
+-- 1) make sure we are not copying the item to an invalid location:
+-- that is, the destination folder exists, is a valid folder,
+-- and is not the current folder
+-- 2) make sure the content type of the content item is registered
+-- with the current folder
+-- 3) create a new item with no revisions in the target folder
+-- 4) copy the latest revision from the original item to the new item (if any)
+
+function copy2 (
+ item_id in cr_items.item_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_items.item_id%TYPE is
+ 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 char(1);
+ v_old_revision_id cr_revisions.revision_id%TYPE;
+ v_new_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(copy2.item_id) = 't' then
+ content_folder.copy(
+ folder_id => copy2.item_id,
+ target_folder_id => copy2.target_folder_id,
+ creation_user => copy2.creation_user,
+ creation_ip => copy2.creation_ip
+ );
+ -- call content_symlink.copy if the item is a symlink
+ elsif content_symlink.is_symlink(copy2.item_id) = 't' then
+ content_symlink.copy(
+ symlink_id => copy2.item_id,
+ target_folder_id => copy2.target_folder_id,
+ creation_user => copy2.creation_user,
+ creation_ip => copy2.creation_ip
+ );
+ -- call content_extlink.copy if the item is a extlink
+ elsif content_extlink.is_extlink(copy2.item_id) = 't' then
+ content_extlink.copy(
+ extlink_id => copy2.item_id,
+ target_folder_id => copy2.target_folder_id,
+ creation_user => copy2.creation_user,
+ creation_ip => copy2.creation_ip
+ );
+ -- make sure the target folder is really a folder
+ elsif content_folder.is_folder(copy2.target_folder_id) = 't' then
+
+ select
+ parent_id
+ into
+ v_current_folder_id
+ from
+ cr_items
+ where
+ item_id = copy2.item_id;
+
+ -- can't copy to the same folder
+ if copy2.target_folder_id ^= v_current_folder_id then
+
+ select
+ content_type, name, locale,
+ nvl(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 = copy2.item_id;
+
+ -- make sure the content type of the item is registered to the folder
+ v_is_registered := content_folder.is_registered(
+ folder_id => copy2.target_folder_id,
+ content_type => v_content_type,
+ include_subtypes => 'f'
+ );
+
+ if v_is_registered = 't' then
+ -- create the new content item
+ v_item_id := content_item.new(
+ parent_id => copy2.target_folder_id,
+ name => v_name,
+ locale => v_locale,
+ content_type => v_content_type,
+ creation_user => copy2.creation_user,
+ creation_ip => copy2.creation_ip,
+ storage_type => v_storage_type
+ );
+
+ -- get the latest revision of the old item
+ select
+ latest_revision into v_old_revision_id
+ from
+ cr_items
+ where
+ item_id = copy2.item_id;
+
+ -- 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 (
+ revision_id => v_old_revision_id,
+ target_item_id => v_item_id,
+ creation_user => copy2.creation_user,
+ creation_ip => copy2.creation_ip
+ );
+ end if;
+ end if;
+
+
+ end if;
+ end if;
+
+ return v_item_id;
+
+end copy2;
+
+-- get the latest revision for an item
+function get_latest_revision (
+ item_id in cr_items.item_id%TYPE
+) return cr_revisions.revision_id%TYPE is
+ v_revision_id integer;
+
+ cursor c_revision_cur is
+ select
+ r.revision_id
+ from
+ cr_revisions r, acs_objects o
+ where
+ r.revision_id = o.object_id
+ and
+ r.item_id = get_latest_revision.item_id
+ order by
+ o.creation_date desc;
+begin
+
+ if item_id is null then
+ return null;
+ end if;
+
+ open c_revision_cur;
+ fetch c_revision_cur into v_revision_id;
+ if c_revision_cur%NOTFOUND then
+ close c_revision_cur;
+ return null;
+ end if;
+ close c_revision_cur;
+ return v_revision_id;
+
+exception
+ when NO_DATA_FOUND then
+ if c_revision_cur%ISOPEN then
+ close c_revision_cur;
+ end if;
+ return null;
+end get_latest_revision;
+
+
+
+function get_best_revision (
+ item_id in cr_items.item_id%TYPE
+) return cr_revisions.revision_id%TYPE
+is
+ v_revision_id cr_revisions.revision_id%TYPE;
+begin
+
+ select
+ NVL (live_revision, latest_revision )
+ into
+ v_revision_id
+ from
+ cr_items
+ where
+ item_id = get_best_revision.item_id;
+
+ return v_revision_id;
+exception
+ when NO_DATA_FOUND then
+ return null;
+end get_best_revision;
+
+
+
+function get_title (
+ item_id in cr_items.item_id%TYPE,
+ is_live in char default 'f'
+) return cr_revisions.title%TYPE is
+
+ v_title cr_revisions.title%TYPE;
+ v_content_type cr_items.content_type%TYPE;
+
+begin
+
+ select content_type into v_content_type from cr_items
+ where item_id = get_title.item_id;
+
+ if v_content_type = 'content_folder' then
+ select label into v_title from cr_folders
+ where folder_id = get_title.item_id;
+ elsif v_content_type = 'content_symlink' then
+ select label into v_title from cr_symlinks
+ where symlink_id = get_title.item_id;
+ else
+ if is_live ^= 'f' then
+ select
+ title into v_title
+ from
+ cr_revisions r, cr_items i
+ where
+ i.item_id = get_title.item_id
+ and
+ r.revision_id = i.live_revision;
+ else
+ select
+ title into v_title
+ from
+ cr_revisions r, cr_items i
+ where
+ i.item_id = get_title.item_id
+ and
+ r.revision_id = i.latest_revision;
+ end if;
+ end if;
+
+ return v_title;
+
+end get_title;
+
+function get_publish_date (
+ item_id in cr_items.item_id%TYPE,
+ is_live in char default 'f'
+) return cr_revisions.publish_date%TYPE
+is
+ v_revision_id cr_revisions.revision_id%TYPE;
+ v_publish_date cr_revisions.publish_date%TYPE;
+begin
+
+ if is_live ^= 'f' then
+ select
+ publish_date into v_publish_date
+ from
+ cr_revisions r, cr_items i
+ where
+ i.item_id = get_publish_date.item_id
+ and
+ r.revision_id = i.live_revision;
+ else
+ select
+ publish_date into v_publish_date
+ from
+ cr_revisions r, cr_items i
+ where
+ i.item_id = get_publish_date.item_id
+ and
+ r.revision_id = i.latest_revision;
+ end if;
+
+ return v_publish_date;
+
+exception when no_data_found then
+ return null;
+end get_publish_date;
+
+function is_subclass (
+ object_type in acs_object_types.object_type%TYPE,
+ supertype in acs_object_types.supertype%TYPE
+) return char is
+
+ v_subclass_p char;
+
+ cursor c_inherit_cur is
+ select
+ object_type
+ from
+ acs_object_types
+ connect by
+ prior object_type = supertype
+ start with
+ object_type = is_subclass.supertype;
+
+begin
+
+ v_subclass_p := 'f';
+
+ for v_inherit_val in c_inherit_cur loop
+ if v_inherit_val.object_type = is_subclass.object_type then
+ v_subclass_p := 't';
+ end if;
+ end loop;
+
+ return v_subclass_p;
+
+end is_subclass;
+
+function relate (
+ item_id in cr_items.item_id%TYPE,
+ object_id in acs_objects.object_id%TYPE,
+ relation_tag in cr_type_relations.relation_tag%TYPE default 'generic',
+ order_n in cr_item_rels.order_n%TYPE default null,
+ relation_type in acs_object_types.object_type%TYPE default 'cr_item_rel'
+) return cr_item_rels.rel_id%TYPE
+is
+ v_content_type cr_items.content_type%TYPE;
+ v_object_type acs_objects.object_type%TYPE;
+ v_is_valid integer;
+ v_rel_id integer;
+ v_exists integer;
+ v_order_n cr_item_rels.order_n%TYPE;
+begin
+
+ -- check the relationship is valid
+ v_content_type := content_item.get_content_type ( relate.item_id );
+ v_object_type := content_item.get_content_type ( relate.object_id );
+
+ select
+ decode( count(1),0,0,1) into v_is_valid
+ from
+ cr_type_relations
+ where
+ content_item.is_subclass( v_object_type, target_type ) = 't'
+ and
+ content_item.is_subclass( v_content_type, content_type ) = 't';
+
+ if v_is_valid = 0 then
+ raise_application_error(-20000,
+ 'There is no registered relation type matching this item relation.');
+ end if;
+
+ if relate.item_id ^= relate.object_id then
+ -- check that these two items are not related already
+ --dbms_output.put_line( 'checking if the items are already related...');
+ begin
+ select
+ rel_id, 1 as v_exists into v_rel_id, v_exists
+ from
+ cr_item_rels
+ where
+ item_id = relate.item_id
+ and
+ related_object_id = relate.object_id
+ and
+ relation_tag = relate.relation_tag;
+ exception when no_data_found then
+ v_exists := 0;
+ end;
+
+
+ -- if order_n is null, use rel_id (the order the item was related)
+ if relate.order_n is null then
+ v_order_n := v_rel_id;
+ else
+ v_order_n := relate.order_n;
+ end if;
+
+
+ -- if relationship does not exist, create it
+ if v_exists <> 1 then
+ --dbms_output.put_line( 'creating new relationship...');
+ v_rel_id := acs_object.new(
+ object_type => relation_type,
+ context_id => item_id
+ );
+ insert into cr_item_rels (
+ rel_id, item_id, related_object_id, order_n, relation_tag
+ ) values (
+ v_rel_id, item_id, object_id, v_order_n, relation_tag
+ );
+
+ -- if relationship already exists, update it
+ else
+ --dbms_output.put_line( 'updating existing relationship...');
+ update cr_item_rels set
+ relation_tag = relate.relation_tag,
+ order_n = v_order_n
+ where
+ rel_id = v_rel_id;
+ end if;
+
+ end if;
+ return v_rel_id;
+end relate;
+
+
+procedure unrelate (
+ rel_id in cr_item_rels.rel_id%TYPE
+) is
+begin
+
+ -- delete the relation object
+ acs_rel.del( unrelate.rel_id );
+
+ -- delete the row from the cr_item_rels table
+ delete from cr_item_rels where rel_id = unrelate.rel_id;
+
+end unrelate;
+
+function is_index_page (
+ item_id in cr_items.item_id%TYPE,
+ folder_id in cr_folders.folder_id%TYPE
+) return varchar2
+is
+begin
+ if content_folder.get_index_page(folder_id) = item_id then
+ return 't';
+ else
+ return 'f';
+ end if;
+end is_index_page;
+
+
+
+function get_parent_folder (
+ item_id in cr_items.item_id%TYPE
+) return cr_folders.folder_id%TYPE
+is
+ v_folder_id cr_folders.folder_id%TYPE;
+ v_parent_folder_p char(1);
+begin
+ v_parent_folder_p := 'f';
+
+ while v_parent_folder_p = 'f' loop
+
+ select
+ parent_id, content_folder.is_folder( parent_id )
+ into
+ v_folder_id, v_parent_folder_p
+ from
+ cr_items
+ where
+ item_id = get_parent_folder.item_id;
+
+ end loop;
+
+ return v_folder_id;
+ exception
+ when NO_DATA_FOUND then
+ return null;
+end get_parent_folder;
+
+end content_item;
+/
+show errors
+
+-- Data model to support content repository of the ArsDigita
+-- Community System
+
+-- Copyright (C) 1999-2000 ArsDigita Corporation
+-- Author: Stanislav Freidin (sfreidin@arsdigita.com)
+
+-- This is free software distributed under the terms of the GNU Public
+-- License. Full text of the license is available from the GNU Project:
+-- http://www.fsf.org/copyleft/gpl.html
+
+create or replace package body content_keyword
+as
+
+function get_heading (
+ keyword_id in cr_keywords.keyword_id%TYPE
+) return varchar2
+is
+ v_heading varchar2(4000);
+begin
+
+ select heading into v_heading from cr_keywords
+ where keyword_id = content_keyword.get_heading.keyword_id;
+
+ return v_heading;
+end get_heading;
+
+function get_description (
+ keyword_id in cr_keywords.keyword_id%TYPE
+) return varchar2
+is
+ v_description varchar2(4000);
+begin
+
+ select description into v_description from cr_keywords
+ where keyword_id = content_keyword.get_description.keyword_id;
+
+ return v_description;
+end get_description;
+
+procedure set_heading (
+ keyword_id in cr_keywords.keyword_id%TYPE,
+ heading in cr_keywords.heading%TYPE
+)
+is
+begin
+
+ update cr_keywords set
+ heading = set_heading.heading
+ where
+ keyword_id = set_heading.keyword_id;
+
+end set_heading;
+
+procedure set_description (
+ keyword_id in cr_keywords.keyword_id%TYPE,
+ description in cr_keywords.description%TYPE
+)
+is
+begin
+
+ update cr_keywords set
+ description = set_description.description
+ where
+ keyword_id = set_description.keyword_id;
+end set_description;
+
+function is_leaf (
+ keyword_id in cr_keywords.keyword_id%TYPE
+) return varchar2
+is
+ v_leaf varchar2(1);
+
+ cursor c_leaf_cur is
+ select
+ 'f'
+ from
+ cr_keywords k
+ where
+ k.parent_id = is_leaf.keyword_id;
+
+begin
+
+ open c_leaf_cur;
+ fetch c_leaf_cur into v_leaf;
+ if c_leaf_cur%NOTFOUND then
+ v_leaf := 't';
+ end if;
+ close c_leaf_cur;
+
+ return v_leaf;
+end is_leaf;
+
+function new (
+ heading in cr_keywords.heading%TYPE,
+ description in cr_keywords.description%TYPE default null,
+ parent_id in cr_keywords.parent_id%TYPE default null,
+ keyword_id in cr_keywords.keyword_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ object_type in acs_object_types.object_type%TYPE default 'content_keyword'
+) return cr_keywords.keyword_id%TYPE
+is
+ v_id integer;
+begin
+
+ v_id := acs_object.new (object_id => keyword_id,
+ context_id => parent_id,
+ object_type => object_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip);
+
+ insert into cr_keywords
+ (heading, description, keyword_id, parent_id)
+ values
+ (heading, description, v_id, parent_id);
+
+ return v_id;
+end new;
+
+procedure del (
+ keyword_id in cr_keywords.keyword_id%TYPE
+)
+is
+ v_item_id integer;
+ cursor c_rel_cur is
+ select item_id from cr_item_keyword_map
+ where keyword_id = content_keyword.del.keyword_id;
+begin
+
+ open c_rel_cur;
+ loop
+ fetch c_rel_cur into v_item_id;
+ exit when c_rel_cur%NOTFOUND;
+ item_unassign(v_item_id, content_keyword.del.keyword_id);
+ end loop;
+ close c_rel_cur;
+
+ acs_object.del(keyword_id);
+end del;
+
+procedure item_assign (
+ item_id in cr_items.item_id%TYPE,
+ keyword_id in cr_keywords.keyword_id%TYPE,
+ context_id in acs_objects.context_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+)
+is
+ v_dummy integer;
+begin
+
+ -- Do nothing if the keyword is assigned already
+ select decode(count(*),0,0,1) into v_dummy from dual
+ where exists (select 1 from cr_item_keyword_map
+ where item_id=item_assign.item_id
+ and keyword_id=item_assign.keyword_id);
+
+ if v_dummy > 0 then
+ -- previous assignment exists
+ return;
+ end if;
+
+ insert into cr_item_keyword_map (
+ item_id, keyword_id
+ ) values (
+ item_id, keyword_id
+ );
+
+end item_assign;
+
+procedure item_unassign (
+ item_id in cr_items.item_id%TYPE,
+ keyword_id in cr_keywords.keyword_id%TYPE
+) is
+begin
+
+ delete from cr_item_keyword_map
+ where item_id = item_unassign.item_id
+ and keyword_id = item_unassign.keyword_id;
+
+end item_unassign;
+
+function is_assigned (
+ item_id in cr_items.item_id%TYPE,
+ keyword_id in cr_keywords.keyword_id%TYPE,
+ recurse in varchar2 default 'none'
+) return varchar2
+is
+ v_ret varchar2(1);
+begin
+
+ -- Look for an exact match
+ if recurse = 'none' then
+ declare
+ begin
+ select 't' into v_ret from cr_item_keyword_map
+ where item_id = is_assigned.item_id
+ and keyword_id = is_assigned.keyword_id;
+ return 't';
+ exception when no_data_found then
+ return 'f';
+ end;
+ end if;
+
+ -- Look from specific to general
+ if recurse = 'up' then
+ begin
+ select 't' into v_ret from dual where exists (select 1 from
+ (select keyword_id from cr_keywords
+ connect by parent_id = prior keyword_id
+ start with keyword_id = is_assigned.keyword_id
+ ) t, cr_item_keyword_map m
+ where
+ t.keyword_id = m.keyword_id
+ and
+ m.item_id = is_assigned.item_id);
+
+ return 't';
+
+ exception when no_data_found then
+ return 'f';
+ end;
+ end if;
+
+ if recurse = 'down' then
+ begin
+ select 't' into v_ret from dual where exists ( select 1 from
+ (select keyword_id from cr_keywords
+ connect by prior parent_id = keyword_id
+ start with keyword_id = is_assigned.keyword_id
+ ) t, cr_item_keyword_map m
+ where
+ t.keyword_id = m.keyword_id
+ and
+ m.item_id = is_assigned.item_id);
+
+ return 't';
+
+ exception when no_data_found then
+ return 'f';
+ end;
+ end if;
+
+ -- Tried none, up and down - must be an invalid parameter
+ raise_application_error (-20000, 'The recurse parameter to ' ||
+ 'content_keyword.is_assigned should be ''none'', ''up'' or ''down''.');
+
+end is_assigned;
+
+function get_path (
+ keyword_id in cr_keywords.keyword_id%TYPE
+) return varchar2
+is
+ v_path varchar2(4000) := '';
+ v_is_found varchar2(1) := 'f';
+
+ cursor c_keyword_cur is
+ select
+ heading
+ from (
+ select
+ heading, level as tree_level
+ from cr_keywords
+ connect by prior parent_id = keyword_id
+ start with keyword_id = get_path.keyword_id
+ )
+ order by
+ tree_level desc;
+
+ v_heading cr_keywords.heading%TYPE;
+begin
+
+ open c_keyword_cur;
+ loop
+ fetch c_keyword_cur into v_heading;
+ exit when c_keyword_cur%NOTFOUND;
+ v_is_found := 't';
+ v_path := v_path || '/' || v_heading;
+ end loop;
+ close c_keyword_cur;
+
+ if v_is_found = 'f' then
+ return null;
+ else
+ return v_path;
+ end if;
+end get_path;
+
+end content_keyword;
+/
+show errors
+
+
+-- Data model to support content repository of the ArsDigita
+-- Community System
+
+-- Copyright (C) 1999-2000 ArsDigita Corporation
+-- Author: Karl Goldstein (karlg@arsdigita.com)
+
+-- $Id: upgrade-4.7d6-5.0d1.sql,v 1.1 2003/10/08 15:56:23 mohanp Exp $
+
+-- This is free software distributed under the terms of the GNU Public
+-- License. Full text of the license is available from the GNU Project:
+-- http://www.fsf.org/copyleft/gpl.html
+
+create or replace package body content_revision
+as
+
+function new (
+ title in cr_revisions.title%TYPE,
+ description in cr_revisions.description%TYPE default null,
+ publish_date in cr_revisions.publish_date%TYPE default sysdate,
+ mime_type in cr_revisions.mime_type%TYPE default 'text/plain',
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ data in cr_revisions.content%TYPE,
+ item_id in cr_items.item_id%TYPE,
+ revision_id in cr_revisions.revision_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ filename in cr_revisions.filename%TYPE default null
+
+) return cr_revisions.revision_id%TYPE is
+
+ v_revision_id integer;
+ v_content_type acs_object_types.object_type%TYPE;
+
+begin
+
+ v_content_type := content_item.get_content_type(item_id);
+
+ v_revision_id := acs_object.new(
+ object_id => revision_id,
+ object_type => v_content_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => item_id
+ );
+
+ insert into cr_revisions (
+ revision_id, title, description, mime_type, publish_date,
+ nls_language, content, item_id, filename
+ ) values (
+ v_revision_id, title, description, mime_type, publish_date,
+ nls_language, data, item_id, filename
+ );
+
+ return v_revision_id;
+
+end new;
+
+function new (
+ title in cr_revisions.title%TYPE,
+ description in cr_revisions.description%TYPE default null,
+ publish_date in cr_revisions.publish_date%TYPE default sysdate,
+ mime_type in cr_revisions.mime_type%TYPE default 'text/plain',
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ text in varchar2 default null,
+ item_id in cr_items.item_id%TYPE,
+ revision_id in cr_revisions.revision_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_revisions.revision_id%TYPE is
+
+ v_revision_id integer;
+ blob_loc cr_revisions.content%TYPE;
+
+begin
+
+ blob_loc := empty_blob();
+
+ v_revision_id := content_revision.new(
+ title => title,
+ description => description,
+ publish_date => publish_date,
+ mime_type => mime_type,
+ nls_language => nls_language,
+ data => blob_loc,
+ item_id => item_id,
+ revision_id => revision_id,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ select
+ content into blob_loc
+ from
+ cr_revisions
+ where
+ revision_id = v_revision_id
+ for update;
+
+ string_to_blob(text, blob_loc);
+
+ return v_revision_id;
+
+end new;
+
+procedure copy_attributes (
+ content_type in acs_object_types.object_type%TYPE,
+ revision_id in cr_revisions.revision_id%TYPE,
+ copy_id in cr_revisions.revision_id%TYPE
+) is
+
+ v_table_name acs_object_types.table_name%TYPE;
+ v_id_column acs_object_types.id_column%TYPE;
+
+ cursor attr_cur is
+ select
+ attribute_name
+ from
+ acs_attributes
+ where
+ object_type = copy_attributes.content_type;
+
+ cols varchar2(2000) := '';
+
+begin
+
+ select table_name, id_column into v_table_name, v_id_column
+ from acs_object_types where object_type = copy_attributes.content_type;
+
+ for attr_rec in attr_cur loop
+ cols := cols || ', ' || attr_rec.attribute_name;
+ end loop;
+
+ execute immediate 'insert into ' || v_table_name ||
+ ' ( ' || v_id_column || cols || ' ) ( select ' || copy_id || cols ||
+ ' from ' || v_table_name || ' where ' || v_id_column || ' = ' ||
+ revision_id || ')';
+
+end copy_attributes;
+
+function copy (
+ revision_id in cr_revisions.revision_id%TYPE,
+ copy_id in cr_revisions.revision_id%TYPE default null,
+ target_item_id in cr_items.item_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_revisions.revision_id%TYPE
+is
+ v_copy_id cr_revisions.revision_id%TYPE;
+ v_target_item_id cr_items.item_id%TYPE;
+
+ -- get the content_type and supertypes
+ cursor type_cur is
+ select
+ object_type
+ from
+ acs_object_types
+ where
+ object_type ^= 'acs_object'
+ and
+ object_type ^= 'content_revision'
+ connect by
+ prior supertype = object_type
+ start with
+ object_type = (
+ select object_type from acs_objects where object_id = copy.revision_id
+ )
+ order by
+ level desc;
+
+begin
+ -- use the specified item_id or the item_id of the original revision
+ -- if none is specified
+ if target_item_id is null then
+ select item_id into v_target_item_id from cr_revisions
+ where revision_id = copy.revision_id;
+ else
+ v_target_item_id := target_item_id;
+ end if;
+
+ -- use the copy_id or generate a new copy_id if none is specified
+ -- the copy_id is a revision_id
+ if copy_id is null then
+ select acs_object_id_seq.nextval into v_copy_id from dual;
+ else
+ v_copy_id := copy_id;
+ end if;
+
+ -- create the basic object
+ insert into acs_objects (
+ object_id, object_type, context_id, security_inherit_p,
+ creation_user, creation_date, creation_ip,
+ last_modified, modifying_user, modifying_ip
+ ) ( select
+ v_copy_id, object_type, context_id, security_inherit_p,
+ copy.creation_user, sysdate, copy.creation_ip,
+ sysdate, copy.creation_user, copy.creation_ip from
+ acs_objects where object_id = copy.revision_id
+ );
+
+ -- create the basic revision (using v_target_item_id)
+ insert into cr_revisions (
+ revision_id, title, description, publish_date, mime_type,
+ nls_language, content, item_id
+ ) ( select
+ v_copy_id, title, description, publish_date, mime_type, nls_language,
+ content, v_target_item_id
+ from
+ cr_revisions
+ where
+ revision_id = copy.revision_id
+ );
+
+ -- iterate over the ancestor types and copy attributes
+ for type_rec in type_cur loop
+ copy_attributes(type_rec.object_type, copy.revision_id, v_copy_id);
+ end loop;
+
+ return v_copy_id;
+end copy;
+
+procedure del (
+ revision_id in cr_revisions.revision_id%TYPE
+) is
+ v_item_id cr_items.item_id%TYPE;
+ v_latest_revision cr_revisions.revision_id%TYPE;
+ v_live_revision cr_revisions.revision_id%TYPE;
+
+begin
+
+ -- Get item id and latest/live revisions
+ select item_id into v_item_id from cr_revisions
+ where revision_id = content_revision.del.revision_id;
+
+ select
+ latest_revision, live_revision
+ into
+ v_latest_revision, v_live_revision
+ from
+ cr_items
+ where
+ item_id = v_item_id;
+
+ -- Recalculate latest revision
+ if v_latest_revision = content_revision.del.revision_id then
+ declare
+ cursor c_revision_cur is
+ select r.revision_id from cr_revisions r, acs_objects o
+ where o.object_id = r.revision_id
+ and r.item_id = v_item_id
+ and r.revision_id <> content_revision.del.revision_id
+ order by o.creation_date desc;
+ begin
+ open c_revision_cur;
+ fetch c_revision_cur into v_latest_revision;
+ if c_revision_cur%NOTFOUND then
+ v_latest_revision := null;
+ end if;
+ close c_revision_cur;
+
+ update cr_items set latest_revision = v_latest_revision
+ where item_id = v_item_id;
+ end;
+ end if;
+
+ -- Clear live revision
+ if v_live_revision = content_revision.del.revision_id then
+ update cr_items set live_revision = null
+ where item_id = v_item_id;
+ end if;
+
+ -- Clear the audit
+ delete from cr_item_publish_audit
+ where old_revision = content_revision.del.revision_id
+ or new_revision = content_revision.del.revision_id;
+
+ -- Delete the revision
+ acs_object.del(revision_id);
+
+end del;
+
+function get_number (
+ revision_id in cr_revisions.revision_id%TYPE
+) return number is
+
+ cursor rev_cur is
+ select
+ revision_id
+ from
+ cr_revisions r, acs_objects o
+ where
+ item_id = (select item_id from cr_revisions
+ where revision_id = get_number.revision_id)
+ and
+ o.object_id = r.revision_id
+ order by
+ o.creation_date;
+
+ v_number integer;
+ v_revision cr_revisions.revision_id%TYPE;
+
+begin
+
+ open rev_cur;
+ loop
+
+ fetch rev_cur into v_revision;
+
+ if v_revision = get_number.revision_id then
+ v_number := rev_cur%ROWCOUNT;
+ exit;
+ end if;
+
+ end loop;
+ close rev_cur;
+
+ return v_number;
+
+end get_number;
+
+function revision_name(
+ revision_id IN cr_revisions.revision_id%TYPE
+) return varchar2 is
+
+ v_text varchar2(500);
+ v_sql varchar2(500);
+
+begin
+
+ v_sql := 'select ''Revision '' || content_revision.get_number(r.revision_id) || '' of '' || (select count(*) from cr_revisions where item_id = r.item_id) || '' for item: '' || content_item.get_title(item_id)
+ from cr_revisions r
+ where r.revision_id = ' || revision_name.revision_id;
+
+ execute immediate v_sql into v_text;
+
+ return v_text;
+
+end revision_name;
+
+procedure index_attributes(
+ revision_id IN cr_revisions.revision_id%TYPE
+) is
+
+ clob_loc clob;
+ v_revision_id cr_revisions.revision_id%TYPE;
+
+begin
+
+ insert into cr_revision_attributes (
+ revision_id, attributes
+ ) values (
+ revision_id, empty_clob()
+ ) returning attributes into clob_loc;
+
+ v_revision_id := write_xml(revision_id, clob_loc);
+
+end index_attributes;
+
+function import_xml (
+ item_id IN cr_items.item_id%TYPE,
+ revision_id IN cr_revisions.revision_id%TYPE,
+ doc_id IN number
+) return cr_revisions.revision_id%TYPE is
+
+ clob_loc clob;
+ v_revision_id cr_revisions.revision_id%TYPE;
+
+begin
+
+ select doc into clob_loc from cr_xml_docs where doc_id = import_xml.doc_id;
+ v_revision_id := read_xml(item_id, revision_id, clob_loc);
+
+ return v_revision_id;
+
+end import_xml;
+
+function export_xml (
+ revision_id IN cr_revisions.revision_id%TYPE
+) return cr_xml_docs.doc_id%TYPE is
+
+ clob_loc clob;
+ v_doc_id cr_xml_docs.doc_id%TYPE;
+ v_revision_id cr_revisions.revision_id%TYPE;
+
+begin
+
+ insert into cr_xml_docs (doc_id, doc)
+ values (cr_xml_doc_seq.nextval, empty_clob())
+ returning doc_id, doc into v_doc_id, clob_loc;
+
+ v_revision_id := write_xml(revision_id, clob_loc);
+
+ return v_doc_id;
+
+end export_xml;
+
+procedure to_html (
+ revision_id IN cr_revisions.revision_id%TYPE
+) is
+
+ tmp_clob clob;
+ blob_loc blob;
+
+begin
+
+ ctx_doc.filter('cr_doc_filter_index', revision_id, tmp_clob, false);
+
+ select
+ content into blob_loc
+ from
+ cr_revisions
+ where
+ revision_id = to_html.revision_id
+ for update;
+
+ clob_to_blob(tmp_clob, blob_loc);
+
+ dbms_lob.freetemporary(tmp_clob);
+
+end to_html;
+
+function is_live (
+ revision_id in cr_revisions.revision_id%TYPE
+) return varchar2
+is
+ v_ret varchar2(1);
+begin
+
+ select 't' into v_ret from cr_items
+ where live_revision = is_live.revision_id;
+
+ return v_ret;
+
+exception when no_data_found then
+ return 'f';
+end is_live;
+
+function is_latest (
+ revision_id in cr_revisions.revision_id%TYPE
+) return varchar2
+is
+ v_ret varchar2(1);
+begin
+
+ select 't' into v_ret from cr_items
+ where latest_revision = is_latest.revision_id;
+
+ return v_ret;
+
+exception when no_data_found then
+ return 'f';
+end is_latest;
+
+procedure to_temporary_clob (
+ revision_id in cr_revisions.revision_id%TYPE
+) is
+ b blob;
+ c clob;
+
+begin
+
+ insert into cr_content_text (
+ revision_id, content
+ ) values (
+ revision_id, empty_clob()
+ ) returning content into c;
+
+ select content into b from cr_revisions
+ where revision_id = to_temporary_clob.revision_id;
+
+ blob_to_clob(b, c);
+
+end to_temporary_clob;
+
+
+
+
+-- revision_id is the revision with the content that is to be copied
+procedure content_copy (
+ revision_id in cr_revisions.revision_id%TYPE,
+ revision_id_dest in cr_revisions.revision_id%TYPE default null
+) is
+ v_item_id cr_items.item_id%TYPE;
+ v_content_length integer;
+ v_revision_id_dest cr_revisions.revision_id%TYPE;
+ v_filename cr_revisions.filename%TYPE;
+ v_content blob;
+begin
+
+ select
+ content_length, item_id
+ into
+ v_content_length, v_item_id
+ from
+ cr_revisions
+ where
+ revision_id = content_copy.revision_id;
+
+ -- get the destination revision
+ if content_copy.revision_id_dest is null then
+ select
+ latest_revision into v_revision_id_dest
+ from
+ cr_items
+ where
+ item_id = v_item_id;
+ else
+ v_revision_id_dest := content_copy.revision_id_dest;
+ end if;
+
+
+ -- only copy the content if the source content is not null
+ if v_content_length is not null and v_content_length > 0 then
+
+ /* The internal LOB types - BLOB, CLOB, and NCLOB - use copy semantics, as
+ opposed to the reference semantics which apply to BFILEs.
+ When a BLOB, CLOB, or NCLOB is copied from one row to another row in
+ the same table or in a different table, the actual LOB value is
+ copied, not just the LOB locator. */
+
+ select
+ filename, content_length
+ into
+ v_filename, v_content_length
+ from
+ cr_revisions
+ where
+ revision_id = content_copy.revision_id;
+
+ -- need to update the file name after the copy,
+ -- if this content item is in CR file storage. The file name is based
+ -- off of the item_id and revision_id and it will be invalid for the
+ -- copied revision.
+
+ update cr_revisions
+ set content = (select content from cr_revisions where revision_id = content_copy.revision_id),
+ filename = v_filename,
+ content_length = v_content_length
+ where revision_id = v_revision_id_dest;
+ end if;
+
+end content_copy;
+
+
+
+end content_revision;
+/
+show errors
+
+-- Data model to support content repository of the ArsDigita
+-- Community System
+
+-- Copyright (C) 1999-2000 ArsDigita Corporation
+-- Author: Karl Goldstein (karlg@arsdigita.com)
+
+-- $Id: upgrade-4.7d6-5.0d1.sql,v 1.1 2003/10/08 15:56:23 mohanp Exp $
+
+-- This is free software distributed under the terms of the GNU Public
+-- License. Full text of the license is available from the GNU Project:
+-- http://www.fsf.org/copyleft/gpl.html
+
+create or replace package body content_symlink
+as
+
+function new (
+ name in cr_items.name%TYPE default null,
+ label in cr_symlinks.label%TYPE default null,
+ target_id in cr_items.item_id%TYPE,
+ parent_id in cr_items.parent_id%TYPE,
+ symlink_id in cr_symlinks.symlink_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_symlinks.symlink_id%TYPE is
+ v_symlink_id cr_symlinks.symlink_id%TYPE;
+ v_name cr_items.name%TYPE;
+ v_label cr_symlinks.label%TYPE;
+begin
+
+ -- SOME CHECKS --
+
+ -- 1) check that the target is now a symlink
+ if content_symlink.is_symlink( target_id ) = 't' then
+ raise_application_error(-20000,
+ 'Cannot create a symlink to a symlink ' || target_id);
+ end if;
+
+ -- 2) check that the parent is a folder
+ if content_folder.is_folder(parent_id) = 'f' then
+ raise_application_error(-20000,
+ 'The parent is not a folder');
+ end if;
+
+ -- 3) check that parent folder supports symlinks
+ if content_folder.is_registered(parent_id,'content_symlink') = 'f' then
+ raise_application_error(-20000,
+ 'This folder does not allow symlinks to be created');
+ end if;
+
+ -- 4) check that the content folder supports the target item's content type
+ if content_folder.is_registered(
+ parent_id,content_item.get_content_type(target_id)) = 'f' then
+
+ raise_application_error(-20000,
+ 'This folder does not allow symlinks to items of type ' ||
+ content_item.get_content_type(target_id) || ' to be created');
+ end if;
+
+ -- PASSED ALL CHECKS --
+
+
+
+ -- Select default name if the name is null
+ begin
+ if name is null then
+ select
+ 'symlink_to_' || name into v_name
+ from
+ cr_items
+ where
+ item_id = target_id;
+
+ else
+ v_name := name;
+ end if;
+ exception when no_data_found then
+ v_name := null;
+ end;
+
+ -- Select default label if the label is null
+ if content_symlink.new.label is null then
+ v_label := 'Symlink to ' || v_name;
+ else
+ v_label := content_symlink.new.label;
+ end if;
+
+ v_symlink_id := content_item.new(
+ item_id => content_symlink.new.symlink_id,
+ name => v_name,
+ content_type => 'content_symlink',
+ creation_date => content_symlink.new.creation_date,
+ creation_user => content_symlink.new.creation_user,
+ creation_ip => content_symlink.new.creation_ip,
+ parent_id => content_symlink.new.parent_id
+ );
+
+ insert into cr_symlinks
+ (symlink_id, target_id, label)
+ values
+ (v_symlink_id, content_symlink.new.target_id, v_label);
+
+ return v_symlink_id;
+
+end new;
+
+
+procedure del (
+ symlink_id in cr_symlinks.symlink_id%TYPE
+) is
+begin
+
+ delete from cr_symlinks
+ where symlink_id = content_symlink.del.symlink_id;
+
+ content_item.del(content_symlink.del.symlink_id);
+end del;
+
+
+
+function is_symlink (
+ item_id in cr_items.item_id%TYPE
+) return char
+is
+ v_symlink_p integer := 0;
+begin
+
+
+ select
+ count(*) into v_symlink_p
+ from
+ cr_symlinks
+ where
+ symlink_id = is_symlink.item_id;
+
+ if v_symlink_p = 1 then
+ return 't';
+ else
+ return 'f';
+ end if;
+
+end is_symlink;
+
+
+procedure copy (
+ symlink_id in cr_symlinks.symlink_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) is
+ v_current_folder_id cr_folders.folder_id%TYPE;
+ v_name cr_items.name%TYPE;
+ v_target_id cr_items.item_id%TYPE;
+ v_label cr_symlinks.label%TYPE;
+ v_symlink_id cr_symlinks.symlink_id%TYPE;
+begin
+
+ 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.symlink_id;
+
+ -- can't copy to the same folder
+ if copy.target_folder_id ^= v_current_folder_id then
+
+ select
+ i.name, content_symlink.resolve(i.item_id), s.label
+ into
+ v_name, v_target_id, v_label
+ from
+ cr_symlinks s, cr_items i
+ where
+ s.symlink_id = i.item_id
+ and
+ s.symlink_id = copy.symlink_id;
+
+
+ if content_folder.is_registered(copy.target_folder_id,
+ 'content_symlink') = 't' then
+ if content_folder.is_registered(copy.target_folder_id,
+ content_item.get_content_type(resolve(copy.symlink_id))) = 't' then
+
+ v_symlink_id := content_symlink.new(
+ parent_id => copy.target_folder_id,
+ name => v_name,
+ label => v_label,
+ target_id => v_target_id,
+ creation_user => copy.creation_user,
+ creation_ip => copy.creation_ip
+ );
+
+
+ end if;
+ end if;
+ end if;
+ end if;
+end copy;
+
+
+function resolve (
+ item_id in cr_items.item_id%TYPE
+) return cr_items.item_id%TYPE
+is
+ v_target_id cr_items.item_id%TYPE;
+begin
+
+ select
+ target_id into v_target_id
+ from
+ cr_symlinks
+ where
+ symlink_id = resolve.item_id;
+
+ return v_target_id;
+
+exception when no_data_found then
+ return resolve.item_id;
+end resolve;
+
+
+function resolve_content_type (
+ item_id in cr_items.item_id%TYPE
+) return cr_items.content_type%TYPE
+is
+ v_content_type cr_items.content_type%TYPE;
+begin
+
+ select
+ content_item.get_content_type( target_id ) into v_content_type
+ from
+ cr_symlinks
+ where
+ symlink_id = resolve_content_type.item_id;
+
+ return v_content_type;
+ exception
+ when NO_DATA_FOUND then
+ return null;
+end resolve_content_type;
+
+end content_symlink;
+/
+show errors
+
+-- Data model to support content repository of the ArsDigita Community
+-- System
+
+-- Copyright (C) 1999-2000 ArsDigita Corporation
+-- Author: Karl Goldstein (karlg@arsdigita.com)
+
+-- $Id: upgrade-4.7d6-5.0d1.sql,v 1.1 2003/10/08 15:56:23 mohanp Exp $
+
+-- This is free software distributed under the terms of the GNU Public
+-- License. Full text of the license is available from the GNU Project:
+-- http://www.fsf.org/copyleft/gpl.html
+
+create or replace package body content_template
+as
+
+function get_root_folder
+return cr_folders.folder_id%TYPE
+is
+begin
+ return c_root_folder_id;
+end get_root_folder;
+
+function new (
+ name in cr_items.name%TYPE,
+ text in varchar2 default null,
+ parent_id in cr_items.parent_id%TYPE default null,
+ is_live in char default 't',
+ template_id in cr_templates.template_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_templates.template_id%TYPE
+is
+
+ v_template_id cr_templates.template_id%TYPE;
+ v_parent_id cr_items.parent_id%TYPE;
+
+begin
+
+ if parent_id is null then
+ v_parent_id := c_root_folder_id;
+ else
+ v_parent_id := parent_id;
+ end if;
+
+ -- make sure we're allowed to create a template in this folder
+ if content_folder.is_folder(parent_id) = 't' and
+ content_folder.is_registered(parent_id,'content_template') = 'f' then
+
+ raise_application_error(-20000,
+ 'This folder does not allow templates to be created');
+
+ else
+ v_template_id := content_item.new (
+ item_id => content_template.new.template_id,
+ name => content_template.new.name,
+ text => content_template.new.text,
+ parent_id => v_parent_id,
+ content_type => 'content_template',
+ is_live => content_template.new.is_live,
+ creation_date => content_template.new.creation_date,
+ creation_user => content_template.new.creation_user,
+ creation_ip => content_template.new.creation_ip
+ );
+
+ insert into cr_templates (
+ template_id
+ ) values (
+ v_template_id
+ );
+
+ return v_template_id;
+ end if;
+end new;
+
+-- delete all template relations
+procedure del (
+ template_id in cr_templates.template_id%TYPE
+) is
+begin
+
+ delete from cr_type_template_map
+ where template_id = content_template.del.template_id;
+
+ delete from cr_item_template_map
+ where template_id = content_template.del.template_id;
+
+ delete from cr_templates
+ where template_id = content_template.del.template_id;
+
+ content_item.del(content_template.del.template_id);
+
+end del;
+
+function is_template (
+ template_id in cr_templates.template_id%TYPE
+) return varchar2
+is
+ v_ret varchar2(1);
+begin
+
+ select 't' into v_ret from cr_templates
+ where template_id = is_template.template_id;
+
+ return v_ret;
+
+exception when no_data_found then
+ return 'f';
+end is_template;
+
+function get_path (
+ template_id in cr_templates.template_id%TYPE,
+ root_folder_id in cr_folders.folder_id%TYPE default c_root_folder_id
+) return varchar2 is
+
+begin
+
+ return content_item.get_path(template_id, root_folder_id);
+
+end get_path;
+
+end content_template;
+/
+show errors
+
+
+create or replace package content_type AUTHID CURRENT_USER as
+--/** This package is used to manipulate content types and attributes
+--
+--*/
+
+procedure create_type (
+ --/** Create a new content type. Automatically create the attribute table
+ -- for the type if the table does not already exist.
+ -- @author Karl Goldstein
+ -- @param content_type The name of the new type
+ -- @param supertype The supertype, defaults to content_revision
+ -- @param pretty_name Pretty name for the type, singular
+ -- @param pretty_plural Pretty name for the type, plural
+ -- @param table_name The name for the attribute table, defaults to
+ -- the name of the supertype
+ -- @param id_column The primary key for the table, defaults to 'XXX'
+ -- @param name_method As in acs_object_type.create_type
+ -- @see {acs_object_type.create_type}
+ --*/
+ content_type in acs_object_types.object_type%TYPE,
+ supertype in acs_object_types.object_type%TYPE
+ default 'content_revision',
+ pretty_name in acs_object_types.pretty_name%TYPE,
+ pretty_plural in acs_object_types.pretty_plural%TYPE,
+ table_name in acs_object_types.table_name%TYPE default null,
+ id_column in acs_object_types.id_column%TYPE default 'XXX',
+ name_method in acs_object_types.name_method%TYPE default null
+);
+
+procedure drop_type (
+ --/** First drops all attributes related to a specific type, then drops type
+ -- the given type.
+ -- @author Simon Huynh
+ -- @param content_type The content type to be dropped
+ -- @param drop_children_p If 't', then the sub-types
+ -- of the given content type and their associated tables
+ -- are also dropped.
+ --*/
+ content_type in acs_object_types.object_type%TYPE,
+ drop_children_p in char default 'f',
+ drop_table_p in char default 'f'
+
+);
+
+
+function create_attribute (
+ --/** Create a new attribute for the specified type. Automatically create
+ -- the column for the attribute if the column does not already exist.
+ -- @author Karl Goldstein
+ -- @param content_type The name of the type to alter
+ -- @param attribute_name The name of the attribute to create
+ -- @param pretty_name Pretty name for the new attribute, singular
+ -- @param pretty_plural Pretty name for the new attribute, plural
+ -- @param default_value The default value for the attribute, defaults to null
+ -- @return The id of the newly created attribute
+ -- @see {acs_object_type.create_attribute}, {content_type.create_type}
+ --*/
+ content_type in acs_attributes.object_type%TYPE,
+ attribute_name in acs_attributes.attribute_name%TYPE,
+ datatype in acs_attributes.datatype%TYPE,
+ pretty_name in acs_attributes.pretty_name%TYPE,
+ pretty_plural in acs_attributes.pretty_plural%TYPE default null,
+ sort_order in acs_attributes.sort_order%TYPE default null,
+ default_value in acs_attributes.default_value%TYPE default null,
+ column_spec in varchar2 default 'varchar2(4000)'
+) return acs_attributes.attribute_id%TYPE;
+
+procedure drop_attribute (
+ --/** Drop an existing attribute. If you are using CMS, make sure to
+ -- call cm_form_widget.unregister_attribute_widget before calling
+ -- this function.
+ -- @author Karl Goldstein
+ -- @param content_type The name of the type to alter
+ -- @param attribute_name The name of the attribute to drop
+ -- @param drop_column If 't', will also alter the table and remove
+ -- the column where the attribute is stored. The default is 'f'
+ -- (leaves the table untouched).
+ -- @see {acs_object.drop_attribute}, {content_type.create_attribute},
+ -- {cm_form_widget.unregister_attribute_widget}
+ --*/
+ content_type in acs_attributes.object_type%TYPE,
+ attribute_name in acs_attributes.attribute_name%TYPE,
+ drop_column in varchar2 default 'f'
+);
+
+procedure register_template (
+ --/** Register a template for the content type. This template may be used
+ -- to render all items of that type.
+ -- @author Karl Goldstein
+ -- @param content_type The type for which the template is to be registered
+ -- @param template_id The ID of the template to register
+ -- @param use_context The context in which the template is appropriate, such
+ -- as 'admin' or 'public'
+ -- @param is_default If 't', this template becomes the default template for
+ -- the type, default is 'f'.
+ -- @see {content_item.register_template}, {content_item.unregister_template},
+ -- {content_item.get_template}, {content_type.unregister_template},
+ -- {content_type.set_default_template}, {content_type.get_template}
+ --*/
+ content_type in cr_type_template_map.content_type%TYPE,
+ template_id in cr_templates.template_id%TYPE,
+ use_context in cr_type_template_map.use_context%TYPE,
+ is_default in cr_type_template_map.is_default%TYPE default 'f'
+);
+
+procedure set_default_template (
+ --/** Make the registered template a default template. The default template
+ -- will be used to render all items of the type for which no individual
+ -- template is registered.
+ -- @author Karl Goldstein
+ -- @param content_type The type for which the template is to be made default
+ -- @param template_id The ID of the template to make default
+ -- @param use_context The context in which the template is appropriate, such
+ -- as 'admin' or 'public'
+ -- @see {content_item.register_template}, {content_item.unregister_template},
+ -- {content_item.get_template}, {content_type.unregister_template},
+ -- {content_type.register_template}, {content_type.get_template}
+ --*/
+ content_type in cr_type_template_map.content_type%TYPE,
+ template_id in cr_templates.template_id%TYPE,
+ use_context in cr_type_template_map.use_context%TYPE
+);
+
+function get_template (
+ --/** Retrieve the appropriate template for rendering items of the specified type.
+ -- @author Karl Goldstein
+ -- @param content_type The type for which the template is to be retrieved
+ -- @param use_context The context in which the template is appropriate, such
+ -- as 'admin' or 'public'
+ -- @return The ID of the template to use
+ -- @see {content_item.register_template}, {content_item.unregister_template},
+ -- {content_item.get_template}, {content_type.unregister_template},
+ -- {content_type.register_template}, {content_type.set_default_template}
+ --*/
+ content_type in cr_type_template_map.content_type%TYPE,
+ use_context in cr_type_template_map.use_context%TYPE
+) return cr_templates.template_id%TYPE;
+
+procedure unregister_template (
+ --/** Unregister a template. If the unregistered template was the default template,
+ -- the content_type can no longer be rendered in the use_context,
+ -- @author Karl Goldstein
+ -- @param content_type The type for which the template is to be unregistered
+ -- @param template_id The ID of the template to unregister
+ -- @param use_context The context in which the template is to be unregistered
+ -- @see {content_item.register_template}, {content_item.unregister_template},
+ -- {content_item.get_template}, {content_type.set_default_template},
+ -- {content_type.register_template}, {content_type.get_template}
+ --*/
+ content_type in cr_type_template_map.content_type%TYPE default null,
+ template_id in cr_templates.template_id%TYPE,
+ use_context in cr_type_template_map.use_context%TYPE default null
+);
+
+procedure refresh_view (
+ --/** Create a view for the type which joins all attributes of the type,
+ -- including the inherited attributes. The view is named
+ -- "
X"
+ -- Called by create_attribute and create_type.
+ -- @author Karl Goldstein
+ -- @param content_type The type for which the view is to be created.
+ -- @see {content_type.create_type}
+ --*/
+ content_type in cr_type_template_map.content_type%TYPE
+);
+
+procedure register_relation_type (
+ --/** Register a relationship between a content type and another object
+ -- type. This may then be used by the content_item.is_valid_relation
+ -- function to validate any relationship between an item and another
+ -- object.
+ -- @author Karl Goldstein
+ -- @param content_type The type of the item from which the relationship
+ -- originated.
+ -- @param target_type The type of the item to which the relationship
+ -- is targeted.
+ -- @param relation_tag A simple token used to identify a set of
+ -- relations.
+ -- @param min_n The minimun number of relationships of this type
+ -- which an item must have to go live.
+ -- @param max_n The minimun number of relationships of this type
+ -- which an item must have to go live.
+ -- @see {content_type.unregister_relation_type}
+ --*/
+ content_type in cr_type_relations.content_type%TYPE,
+ target_type in cr_type_relations.target_type%TYPE,
+ relation_tag in cr_type_relations.relation_tag%TYPE default 'generic',
+ min_n in integer default 0,
+ max_n in integer default null
+);
+
+procedure unregister_relation_type (
+ --/** Unregister a relationship between a content type and another object
+ -- type.
+ -- @author Karl Goldstein
+ -- @param content_type The type of the item from which the relationship
+ -- originated.
+ -- @param target_type The type of the item to which the relationship
+ -- is targeted.
+ -- @param relation_tag A simple token used to identify a set of
+ -- relations.
+ -- @see {content_type.register_relation_type}
+ --*/
+ content_type in cr_type_relations.content_type%TYPE,
+ target_type in cr_type_relations.target_type%TYPE,
+ relation_tag in cr_type_relations.relation_tag%TYPE default null
+);
+
+procedure register_child_type (
+ --/** Register a parent-child relationship between a content type
+ -- and another object
+ -- type. This may then be used by the content_item.is_valid_relation
+ -- function to validate the relationship between an item and a potential
+ -- child.
+ -- @author Karl Goldstein
+ -- @param content_type The type of the item from which the relationship
+ -- originated.
+ -- @param child_type The type of the child item.
+ -- @param relation_tag A simple token used to identify a set of
+ -- relations.
+ -- @param min_n The minimun number of parent-child
+ -- relationships of this type
+ -- which an item must have to go live.
+ -- @param max_n The minimun number of relationships of this type
+ -- which an item must have to go live.
+ -- @see {content_type.register_relation_type}, {content_type.register_child_type}
+ --*/
+ parent_type in cr_type_children.parent_type%TYPE,
+ child_type in cr_type_children.child_type%TYPE,
+ relation_tag in cr_type_children.relation_tag%TYPE default 'generic',
+ min_n in integer default 0,
+ max_n in integer default null
+);
+
+procedure unregister_child_type (
+ --/** Register a parent-child relationship between a content type
+ -- and another object
+ -- type. This may then be used by the content_item.is_valid_relation
+ -- function to validate the relationship between an item and a potential
+ -- child.
+ -- @author Karl Goldstein
+ -- @param parent_type The type of the parent item.
+ -- @param child_type The type of the child item.
+ -- @param relation_tag A simple token used to identify a set of
+ -- relations.
+ -- @see {content_type.register_relation_type}, {content_type.register_child_type}
+ --*/
+ parent_type in cr_type_children.parent_type%TYPE,
+ child_type in cr_type_children.child_type%TYPE,
+ relation_tag in cr_type_children.relation_tag%TYPE default null
+);
+
+procedure register_mime_type (
+ content_type in cr_content_mime_type_map.content_type%TYPE,
+ mime_type in cr_content_mime_type_map.mime_type%TYPE
+);
+
+procedure unregister_mime_type (
+ content_type in cr_content_mime_type_map.content_type%TYPE,
+ mime_type in cr_content_mime_type_map.mime_type%TYPE
+);
+
+function is_content_type (
+ object_type in acs_object_types.object_type%TYPE
+) return char;
+
+procedure rotate_template (
+ --/** Sets the default template for a content type and registers all the
+ -- previously existing items of that content type to the original
+ -- template
+ -- @author Michael Pih
+ -- @param template_id The template that will become the default
+ -- registered template for the specified content type and use context
+ -- @param v_content_type The content type
+ -- @param use_context The context in which the template will be used
+ --*/
+ template_id in cr_templates.template_id%TYPE,
+ v_content_type in cr_items.content_type%TYPE,
+ use_context in cr_type_template_map.use_context%TYPE
+);
+
+
+end content_type;
+/
+show errors;
+
+create or replace package content_item
+as
+
+--/**
+--Content items store the overview of the content published on a
+--website. The actual content is stored in content revisions. It is
+--implemented this way so that there can be mulitple versions of the
+--actual content while the main idea remains constant. For example: If
+--there is a review for the movie "Terminator," there will exist a
+--content item by the name "terminator" with all the right parameters
+--(supertype, parent, etc), there will also exist at least one content
+--revision pointing to this item with the actual review content.
+--@see {content_revision}, {content_folder}
+--*/
+
+c_root_folder_id constant integer := -100;
+
+function get_root_folder (
+ item_id in cr_items.item_id%TYPE default null
+) return cr_folders.folder_id%TYPE;
+
+function new (
+ --/** Creates a new content item. If the data, title or text
+ -- parameters are specified, also creates a revision for the item.
+ -- @author Karl Goldstein
+ -- @param name The name for the item, must be URL-encoded.
+ -- If an item with this name already exists under the specified
+ -- parent item, an error is thrown
+ -- @param parent_id The parent of this item, defaults to null
+ -- @param item_id The id of the new item. A new id will be allocated if this
+ -- parameter is null
+ -- @param locale The locale for this item, for use with Intermedia search
+ -- @param item_subtype The type of the new item, defaults to 'content_item'
+ -- This parameter is used to support inheritance, so that
+ -- subclasses of content_item can call this function
+ -- to initialize the parent class
+ -- @param content_type The content type for the item, defaults to
+ -- 'content_revision'. Only objects of this type
+ -- may be used as revisions for the item
+ -- @param title The user-readable title for the item, defaults to the item's
+ -- name
+ -- @param description A short description for the item (4000 characters maximum)
+ -- @param mime_type The file type of the item, defaults to 'text/plain'
+ -- @param nls_language The language for the item, used for Intermedia search
+ -- @param text The text content of the new revision, 4000 charcters maximum.
+ -- Cannot be specified simultaneously with the data
+ -- parameter
+ -- @param data The blob content of the new revision. Cannot be specified
+ -- simultaneously with the text parameter
+ -- @param relation_tag If a parent-child relationship is registered
+ -- for these content types, use this tag to
+ -- describe the parent-child relationship. Defaults
+ -- to 'parent content type'-'child content type'
+ -- @param is_live If 't', the new revision will become live
+ -- @param context_id Security context id, as in acs_object.new
+ -- If null, defaults to parent_id, and copies permissions
+ -- from the parent into the current item
+ -- @param storage_type in ('lob','file'). Indicates how content is to be stored.
+ -- 'file' content is stored externally in the file system.
+ -- @param others As in acs_object.new
+ -- @return The id of the newly created item
+ -- @see {acs_object.new}
+ --*/
+ name in cr_items.name%TYPE,
+ parent_id in cr_items.parent_id%TYPE default null,
+ item_id in acs_objects.object_id%TYPE default null,
+ locale in cr_items.locale%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ context_id in acs_objects.context_id%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ item_subtype in acs_object_types.object_type%TYPE
+ default 'content_item',
+ content_type in acs_object_types.object_type%TYPE
+ default 'content_revision',
+ title in cr_revisions.title%TYPE default null,
+ description in cr_revisions.description%TYPE default null,
+ mime_type in cr_revisions.mime_type%TYPE default 'text/plain',
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ text in varchar2 default null,
+ data in cr_revisions.content%TYPE default null,
+ relation_tag in cr_child_rels.relation_tag%TYPE default null,
+ is_live in char default 'f',
+ storage_type in cr_items.storage_type%TYPE default 'lob'
+) return cr_items.item_id%TYPE;
+
+
+function is_published (
+ --/** Determins whether an item is published or not.
+ -- @author Michael Pih
+ -- @param item_id The item ID
+ -- @return 't' if the item is published, 'f' otherwise
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return char;
+
+
+function is_publishable (
+ --/** Determines if an item is publishable. Publishable items must
+ -- meet the following criteria:
+ -- 1) for each child type, the item has n children, min_n < n < max_n
+ -- 2) for each relation type, the item has n relations, min_n < n < max_n
+ -- 3) any 'publishing_wf' workflows are finished
+ -- @author Michael Pih
+ -- @param item_id The item ID
+ -- @return 't' if the item is publishable in it's present state,
+ -- Otherwise, returns 'f'
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return char;
+
+
+
+function is_valid_child (
+ --/** Determines if an item would be a valid child of another item by
+ -- checking if the parent allows children of the would-be child's
+ -- content type and if the parent already has n_max children of
+ -- that content type.
+ -- @author Michael Pih
+ -- @param item_id The item ID of the potential parent
+ -- @param content_type The content type of the potential child item
+ -- @return 't' if the item would be a valid child, 'f' otherwise
+ --*/
+
+ item_id in cr_items.item_id%TYPE,
+ content_type in acs_object_types.object_type%TYPE,
+ relation_tag in cr_child_rels.relation_tag%TYPE default null
+) return char;
+
+procedure del (
+ --/** Deletes the specified content item, along with any revisions, symlinks,
+ -- workflows, associated templates, associated keywords,
+ -- child and item relationships for the item. Use with caution - this
+ -- operation cannot be undone.
+ -- @author Karl Goldstein
+ -- @param item_id The id of the item to delete
+ -- @see {acs_object.delete}
+ --*/
+ item_id in cr_items.item_id%TYPE
+);
+
+procedure rename (
+ --/** Renames the item. If an item with the specified name already exists
+ -- under this item's parent, an error is thrown
+ -- @author Karl Goldstein
+ -- @param item_id The id of the item to rename
+ -- @param name The new name for the item, must be URL-encoded
+ -- @see {content_item.new}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ name in cr_items.name%TYPE
+);
+
+function get_id (
+ --/** Takes in a path, such as "/tv/programs/star_trek/episode_203"
+ -- and returns the id of the item with this path. Note: URLs are abstract (no
+ -- extensions are allowed in content item names and extensions are stripped when
+ -- looking up content items)
+ -- @author Karl Goldstein
+ -- @param item_path The path to be resolved
+ -- @param root_folder_id Starts path resolution from this folder. Defaults to
+ -- the root of the sitemap
+ -- @param resolve_index Boolean flag indicating whether to return the
+ -- id of the index page for folders (if one
+ -- exists). Defaults to 'f'.
+ -- @return The id of the item with the given path, or null if no such item exists
+ -- @see {content_item.get_path}
+ --*/
+ item_path in varchar2,
+ root_folder_id in cr_items.item_id%TYPE default c_root_folder_id,
+ resolve_index in char default 'f'
+) return cr_items.item_id%TYPE;
+
+function get_path (
+ --/** Retrieves the full path to an item, in the form of
+ -- "/tv/programs/star_trek/episode_203"
+ -- @author Karl Goldstein
+ -- @param item_id The item for which the path is to be retrieved
+ -- @param root_folder_id Starts path resolution from this folder.
+ -- Defaults to the root of the sitemap
+ -- @return The path to the item
+ -- @see {content_item.get_id}, {content_item.write_to_file}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ root_folder_id in cr_items.item_id%TYPE default null
+) return varchar2;
+
+function get_virtual_path (
+ --/** Retrieves the virtual path to an item, in the form of
+ -- "/tv/programs/star_trek/episode_203"
+ -- @author Michael Pih
+ -- @param item_id The item for which the path is to be retrieved
+ -- @param root_folder_id Starts path resolution from this folder.
+ -- Defaults to the root of the sitemap
+ -- @return The virtual path to the item
+ -- @see {content_item.get_id}, {content_item.write_to_file}, {content_item.get_path}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ root_folder_id in cr_items.item_id%TYPE default c_root_folder_id
+) return varchar2;
+
+procedure write_to_file (
+ --/** Writes the content of the live revision of this item to a file,
+ -- creating all the neccessary directories in the process
+ -- @author Karl Goldstein
+ -- @param item_id The item to be written to a file
+ -- @param root_path The path in the filesystem to which the root of the
+ -- sitemap corresponds
+ -- @see {content_item.get_path}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ root_path in varchar2
+);
+
+procedure register_template (
+ --/** Registers a template which will be used to render this item.
+ -- @author Karl Goldstein
+ -- @param item_id The item for which the template will be registered
+ -- @param template_id The template to be registered
+ -- @param use_context The context in which the template is appropriate, such
+ -- as 'admin' or 'public'
+ -- @see {content_type.register_template}, {content_item.unregister_template},
+ -- {content_item.get_template}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ template_id in cr_templates.template_id%TYPE,
+ use_context in cr_item_template_map.use_context%TYPE
+);
+
+procedure unregister_template (
+ --/** Unregisters a template which will be used to render this item.
+ -- @author Karl Goldstein
+ -- @param item_id The item for which the template will be unregistered
+ -- @param template_id The template to be registered
+ -- @param use_context The context in which the template is appropriate, such
+ -- as 'admin' or 'public'
+ -- @see {content_type.register_template}, {content_item.register_template},
+ -- {content_item.get_template}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ template_id in cr_templates.template_id%TYPE default null,
+ use_context in cr_item_template_map.use_context%TYPE default null
+);
+
+function get_template (
+ --/** Retrieves the template which should be used to render this item. If no template
+ -- is registered to specifically render the item in the given context, the
+ -- default template for the item's type is returned.
+ -- @author Karl Goldstein
+ -- @param item_id The item for which the template will be unregistered
+ -- @param use_context The context in the item is to be rendered, such
+ -- as 'admin' or 'public'
+ -- @return The id of the registered template, or null if no template could be
+ -- found
+ -- @see {content_type.register_template}, {content_item.register_template},
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ use_context in cr_item_template_map.use_context%TYPE
+) return cr_templates.template_id%TYPE;
+
+function get_live_revision (
+ --/** Retrieves the id of the live revision for the item
+ -- @param item_id The item for which the live revision is to be retrieved
+ -- @return The id of the live revision for this item, or null if no live revision
+ -- exists
+ -- @see {content_item.set_live_revision}, {content_item.get_latest_revision}
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return cr_revisions.revision_id%TYPE;
+
+procedure set_live_revision (
+ --/** Make the specified revision the live revision for the item
+ -- @author Karl Goldstein
+ -- @param revision_id The id of the revision which is to become live
+ -- for its corresponding item
+ -- @see {content_item.get_live_revision}
+ --*/
+ revision_id in cr_revisions.revision_id%TYPE,
+ publish_status in cr_items.publish_status%TYPE default 'ready'
+);
+
+
+procedure unset_live_revision (
+ --/** Set the live revision to null for the item
+ -- @author Michael Pih
+ -- @param item_id The id of the item for which to unset the live revision
+ -- @see {content_item.set_live_revision}
+ item_id in cr_items.item_id%TYPE
+);
+
+procedure set_release_period (
+ --/** Sets the release period for the item. This information may be
+ -- used by applications to update the publishing status of items
+ -- at periodic intervals.
+ -- @author Karl Goldstein
+ -- @param item_id The id the item.
+ -- @param start_when The time and date when the item should be released.
+ -- @param end_when The time and date when the item should be expired.
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ start_when date default null,
+ end_when date default null
+);
+
+
+function get_revision_count (
+ --/** Return the total count of revisions for this item
+ -- @author Karl Goldstein
+ -- @param item_id The id the item
+ -- @return The number of revisions for this item
+ -- @see {content_revision.new}
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return number;
+
+-- Return the object type of this item
+function get_content_type (
+ --/** Retrieve the content type of this item. Only objects of this type may be
+ -- used as revisions for the item.
+ -- @author Karl Goldstein
+ -- @param item_id The item for which the content type is to be retrieved
+ -- @return The content type of the item
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return cr_items.content_type%TYPE;
+
+function get_context (
+ --/** Retrieve the parent of the given item
+ -- @author Karl Goldstein
+ -- @param item_id The item for which the parent is to be retrieved
+ -- @return The id of the parent for this item
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return acs_objects.context_id%TYPE;
+
+procedure move (
+ --/** Move the specified item to a different folder. If the target folder does
+ -- not exist, or if the folder already contains an item with the same name
+ -- as the given item, an error will be thrown.
+ -- @author Karl Goldstein
+ -- @param item_id The item to be moved
+ -- @param target_folder_id The new folder for the item
+ -- @see {content_item.new}, {content_folder.new}, {content_item.copy}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE
+);
+
+procedure copy (
+ --/** Copies the item to a new location, creating an identical item with
+ -- an identical latest revision (if any). If the target folder does
+ -- not exist, or if the folder already contains an item with the same name
+ -- as the given item, an error will be thrown.
+ -- @author Karl Goldstein, Michael Pih
+ -- @param item_id The item to be copied
+ -- @param target_folder_id The folder where the item is to be copied
+ -- @param creation_user The user_id of the creator
+ -- @param creation_ip The IP address of the creator
+ -- @see {content_item.new}, {content_folder.new}, {content_item.move}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+);
+
+function copy2 (
+ --/** Copies the item to a new location, creating an identical item with
+ -- an identical latest revision (if any). If the target folder does
+ -- not exist, or if the folder already contains an item with the same name
+ -- as the given item, an error will be thrown.
+ -- @author Karl Goldstein, Michael Pih
+ -- @param item_id The item to be copied
+ -- @param target_folder_id The folder where the item is to be copied
+ -- @param creation_user The user_id of the creator
+ -- @param creation_ip The IP address of the creator
+ -- @return The item ID of the new copy.
+ -- @see {content_item.new}, {content_folder.new}, {content_item.move}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_items.item_id%TYPE;
+
+-- get the latest revision for an item
+function get_latest_revision (
+ --/** Retrieves the id of the latest revision for the item (as opposed to the live
+ -- revision)
+ -- @author Karl Goldstein
+ -- @param item_id The item for which the latest revision is to be retrieved
+ -- @return The id of the latest revision for this item, or null if no revisions
+ -- exist
+ -- @see {content_item.get_live_revision}
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return cr_revisions.revision_id%TYPE;
+
+
+function get_best_revision (
+ --/** Retrieves the id of the live revision for the item if one exists,
+ -- otherwise retrieves the id of the latest revision if one exists.
+ -- revision)
+ -- @author Michael Pih
+ -- @param item_id The item for which the revision is to be retrieved
+ -- @return The id of the live or latest revision for this item,
+ -- or null if no revisions exist
+ -- @see {content_item.get_live_revision}, {content_item.get_latest_revision}
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return cr_revisions.revision_id%TYPE;
+
+function get_title (
+ --/** Retrieves the title for the item, using either the latest or the live revision.
+ -- If the specified item is in fact a folder, return the folder's label.
+ -- In addition, this function will automatically resolve symlinks.
+ -- @author Karl Goldstein
+ -- @param item_id The item for which the title is to be retrieved
+ -- @param is_live If 't', use the live revision to get the title. Otherwise,
+ -- use the latest revision. The default is 'f'
+ -- @return The title of the item
+ -- @see {content_item.get_live_revision}, {content_item.get_latest_revision},
+ -- {content_symlink.resolve}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ is_live in char default 'f'
+) return cr_revisions.title%TYPE;
+
+function get_publish_date (
+ --/** Retrieves the publish date for the item
+ -- @author Karl Goldstein
+ -- @param item_id The item for which the publish date is to be retrieved
+ -- @param is_live If 't', use the live revision for the item. Otherwise, use
+ -- the latest revision. The default is 'f'
+ -- @return The publish date for the item, or null if the item has no revisions
+ -- @see {content_item.get_live_revision}, {content_item.get_latest_revision},
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ is_live in char default 'f'
+) return cr_revisions.publish_date%TYPE;
+
+function is_subclass (
+ --/** Determines if one type is a subclass of another. A class is always a subclass of
+ -- itself.
+ -- @author Karl Goldstein
+ -- @param object_type The child class
+ -- @param supertype The superclass
+ -- @return 't' if the child class is a subclass of the superclass, 'f' otherwise
+ -- @see {acs_object_type.create_type}
+ --*/
+ object_type in acs_object_types.object_type%TYPE,
+ supertype in acs_object_types.supertype%TYPE
+) return char;
+
+function relate (
+ --/** Relates two content items
+ -- @author Karl Goldstein
+ -- @param item_id The item id
+ -- @param object_id The item id of the related object
+ -- @param relation_tag A tag to help identify the relation type,
+ -- defaults to 'generic'
+ -- @param order_n The order of this object among other objects
+ -- of the same relation type, defaults to null.
+ -- @param relation_type The object type of the relation, defaults to
+ -- 'cr_item_rel'
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ object_id in acs_objects.object_id%TYPE,
+ relation_tag in cr_type_relations.relation_tag%TYPE default 'generic',
+ order_n in cr_item_rels.order_n%TYPE default null,
+ relation_type in acs_object_types.object_type%TYPE default 'cr_item_rel'
+) return cr_item_rels.rel_id%TYPE;
+
+
+procedure unrelate (
+ --/** Delete the item relationship between two items
+ -- @author Michael Pih
+ -- @param rel_id The relationship id
+ -- @see {content_item.relate}
+ --*/
+ rel_id in cr_item_rels.rel_id%TYPE
+);
+
+function is_index_page (
+ --/** Determine if the item is an index page for the specified folder.
+ -- The item is an index page for the folder if it exists in the
+ -- folder and its item name is "index".
+ -- @author Karl Goldstein
+ -- @param item_id The item id
+ -- @param folder_id The folder id
+ -- @return 't' if the item is an index page for the specified
+ -- folder, 'f' otherwise
+ -- @see {content_folder.get_index_page}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ folder_id in cr_folders.folder_id%TYPE
+) return varchar2;
+
+
+function get_parent_folder (
+ --/** Get the parent folder.
+ -- @author Michael Pih
+ -- @param item_id The item id
+ -- @return the folder_id of the parent folder, null otherwise
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return cr_folders.folder_id%TYPE;
+
+end content_item;
+/
+show errors
+
+
+create or replace package content_revision
+as
+
+function new (
+ --/** Create a new revision for an item.
+ -- @author Karl Goldstein
+ -- @param title The revised title for the item
+ -- @param description A short description of this revision, 4000 characters maximum
+ -- @param publish_date Publication date.
+ -- @param mime_type The revised mime type of the item, defaults to 'text/plain'
+ -- @param nls_language The revised language of the item, for use with Intermedia searching
+ -- @param data The blob which contains the body of the revision
+ -- @param item_id The id of the item being revised
+ -- @param revision_id The id of the new revision. A new id will be allocated by default
+ -- @param creation_date As in acs_object.new
+ -- @param creation_ip As in acs_object.new
+ -- @param creation_user As in acs_object.new
+ -- @return The id of the newly created revision
+ -- @see {acs_object.new}, {content_item.new}
+ --*/
+ title in cr_revisions.title%TYPE,
+ description in cr_revisions.description%TYPE default null,
+ publish_date in cr_revisions.publish_date%TYPE default sysdate,
+ mime_type in cr_revisions.mime_type%TYPE default 'text/plain',
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ data in cr_revisions.content%TYPE,
+ item_id in cr_items.item_id%TYPE,
+ revision_id in cr_revisions.revision_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ filename in cr_revisions.filename%TYPE default null
+) return cr_revisions.revision_id%TYPE;
+
+function new (
+ title in cr_revisions.title%TYPE,
+ description in cr_revisions.description%TYPE default null,
+ publish_date in cr_revisions.publish_date%TYPE default sysdate,
+ mime_type in cr_revisions.mime_type%TYPE default 'text/plain',
+ nls_language in cr_revisions.nls_language%TYPE default null,
+ text in varchar2 default null,
+ item_id in cr_items.item_id%TYPE,
+ revision_id in cr_revisions.revision_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_revisions.revision_id%TYPE;
+
+function copy (
+ --/** Creates a new copy of a revision, including all attributes and content
+ -- and content, returning the ID of the new revision
+ -- @author Karl Goldstein, Michael Pih
+ -- @param revision_id The id of the revision to copy
+ -- @param copy_id The id of the new copy (default null)
+ -- @param target_item_id The id of the item which will own the copied revision. If null, the item that holds the original revision will own the copied revision. Defaults to null.
+ -- @param creation_user The id of the creation user
+ -- @param creation_ip The IP address of the creation user (default null)
+ -- @return The id of the new revision
+ -- @see {content_revision.new}
+ --*/
+ revision_id in cr_revisions.revision_id%TYPE,
+ copy_id in cr_revisions.revision_id%TYPE default null,
+ target_item_id in cr_items.item_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_revisions.revision_id%TYPE;
+
+procedure del (
+ --/** Deletes the revision.
+ -- @author Karl Goldstein
+ -- @param revision_id The id of the revision to delete
+ -- @see {content_revision.new}, {acs_object.delete}
+ --*/
+ revision_id in cr_revisions.revision_id%TYPE
+);
+
+function get_number (
+ --/** Return the revision number of the specified revision, according to
+ -- the chronological
+ -- order in which revisions have been added for this item.
+ -- @author Karl Goldstein
+ -- @param revision_id The id the revision
+ -- @return The number of the revision
+ -- @see {content_revision.new}
+ --*/
+ revision_id in cr_revisions.revision_id%TYPE
+) return number;
+
+function revision_name (
+ --/** Return a pretty string 'revision x of y'
+ --*/
+ revision_id in cr_revisions.revision_id%TYPE
+) return varchar2;
+
+procedure index_attributes(
+ --/** Generates an XML document for insertion into cr_revision_attributes,
+ -- which is indexed by Intermedia for searching attributes.
+ -- @author Karl Goldstein
+ -- @param revision_id The id of the revision to index
+ -- @see {content_revision.new}
+ --*/
+ revision_id IN cr_revisions.revision_id%TYPE
+);
+
+function export_xml (
+ revision_id IN cr_revisions.revision_id%TYPE
+) return cr_xml_docs.doc_id%TYPE;
+
+function write_xml (
+ revision_id IN number,
+ clob_loc IN clob
+) return number as language
+ java
+name
+ 'com.arsdigita.content.XMLExchange.exportRevision(
+ java.lang.Integer, oracle.sql.CLOB
+ ) return int';
+
+function import_xml (
+ item_id IN cr_items.item_id%TYPE,
+ revision_id IN cr_revisions.revision_id%TYPE,
+ doc_id IN number
+) return cr_revisions.revision_id%TYPE;
+
+function read_xml (
+ item_id IN number,
+ revision_id IN number,
+ clob_loc IN clob
+) return number as language
+ java
+name
+ 'com.arsdigita.content.XMLExchange.importRevision(
+ java.lang.Integer, java.lang.Integer, oracle.sql.CLOB
+ ) return int';
+
+procedure to_html (
+ --/** Converts a revision uploaded as a binary document to html
+ -- @author Karl Goldstein
+ -- @param revision_id The id of the revision to index
+ --*/
+ revision_id IN cr_revisions.revision_id%TYPE
+);
+
+procedure replace(
+ revision_id number, search varchar2, replace varchar2)
+as language
+ java
+name
+ 'com.arsdigita.content.Regexp.replace(
+ int, java.lang.String, java.lang.String
+ )';
+
+function is_live (
+ -- /** Determine if the revision is live
+ -- @author Karl Goldstein, Stanislav Freidin
+ -- @param revision_id The id of the revision to check
+ -- @return 't' if the revision is live, 'f' otherwise
+ -- @see {content_revision.is_latest}
+ --*/
+ revision_id in cr_revisions.revision_id%TYPE
+) return varchar2;
+
+function is_latest (
+ -- /** Determine if the revision is the latest revision
+ -- @author Karl Goldstein, Stanislav Freidin
+ -- @param revision_id The id of the revision to check
+ -- @return 't' if the revision is the latest revision for its item, 'f' otherwise
+ -- @see {content_revision.is_live}
+ --*/
+ revision_id in cr_revisions.revision_id%TYPE
+) return varchar2;
+
+procedure to_temporary_clob (
+ revision_id in cr_revisions.revision_id%TYPE
+);
+
+procedure content_copy (
+ -- /** Copies the content of the specified revision to the content
+ -- of another revision
+ -- @author Michael Pih
+ -- @param revision_id The id of the revision with the content to be copied
+ -- @param revision_id The id of the revision to be updated, defaults to the
+ -- latest revision of the item with which the source revision is
+ -- associated.
+ --*/
+ revision_id in cr_revisions.revision_id%TYPE,
+ revision_id_dest in cr_revisions.revision_id%TYPE default null
+);
+
+end content_revision;
+/
+show errors
+
+create or replace package content_symlink
+as
+
+function new (
+ --/** Create a new symlink, linking two items
+ -- @author Karl Goldstein
+ -- @param name The name for the new symlink, defaults to the name of the
+ -- target item
+ -- @param label The label of the symlink, defaults to 'Symlinke to '
+ -- @param target_id The item which the symlink will point to
+ -- @param parent_id The parent folder for the symlink. This must actually be a folder
+ -- and not a generic content item.
+ -- @param symlink_id The id of the new symlink. A new id will be allocated by default
+ -- @param creation_date As in acs_object.new
+ -- @param creation_ip As in acs_object.new
+ -- @param creation_user As in acs_object.new
+ -- @return The id of the newly created symlink
+ -- @see {acs_object.new}, {content_item.new}, {content_symlink.resolve}
+ --*/
+ name in cr_items.name%TYPE default null,
+ label in cr_symlinks.label%TYPE default null,
+ target_id in cr_items.item_id%TYPE,
+ parent_id in cr_items.parent_id%TYPE,
+ symlink_id in cr_symlinks.symlink_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_symlinks.symlink_id%TYPE;
+
+
+procedure del (
+ --/** Deletes the symlink
+ -- @author Karl Goldstein
+ -- @param symlink_id The id of the symlink to delete
+ -- @see {content_symlink.new}, {acs_object.delete}
+ --*/
+ symlink_id in cr_symlinks.symlink_id%TYPE
+);
+
+
+procedure copy (
+ --/** Copies the symlink itself to another folder, without resolving the symlink
+ -- @author Karl Goldstein
+ -- @param symlink_id The id of the symlink to copy
+ -- @param target_folder_id The id of the folder where the symlink is to be copied
+ -- @param creation_user The id of the creation user
+ -- @param creation_ip The IP address of the creation user (defualt null)
+ -- @see {content_symlink.new}, {content_item.copy}
+ --*/
+ symlink_id in cr_symlinks.symlink_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+);
+
+function is_symlink (
+ --/** Determines if the item is a symlink
+ -- @author Karl Goldstein
+ -- @param item_id The item id
+ -- @return 't' if the item is a symlink, 'f' otherwise
+ -- @see {content_symlink.new}, {content_symlink.resolve}
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return char;
+
+
+function resolve (
+ --/** Resolves the symlink and returns the target item id.
+ -- @author Karl Goldstein
+ -- @param item_id The item id to be resolved
+ -- @return The target item of the symlink, or the original item id if
+ -- the item is not in fact a symlink
+ -- @see {content_symlink.new}, {content_symlink.is_symlink}
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return cr_items.item_id%TYPE;
+
+
+function resolve_content_type (
+ --/** Gets the content type of the target item.
+ -- @author Michael Pih
+ -- @param item_id The item id to be resolved
+ -- @return The content type of the symlink target, otherwise null.
+ -- the item is not in fact a symlink
+ -- @see {content_symlink.resolve}
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return cr_items.content_type%TYPE;
+
+
+end content_symlink;
+/
+show errors
+
+create or replace package content_extlink
+as
+
+function new (
+ --/** Create a new extlink, an item pointing to an off-site resource
+ -- @author Karl Goldstein
+ -- @param name The name for the new extlink, defaults to the name of the
+ -- target item
+ -- @param url The URL of the item
+ -- @param label The text label or title of the item
+ -- @param description A brief description of the item
+ -- @param parent_id The parent folder for the extlink. This must actually be a folder
+ -- and not a generic content item.
+ -- @param extlink_id The id of the new extlink. A new id will be allocated by default
+ -- @param creation_date As in acs_object.new
+ -- @param creation_ip As in acs_object.new
+ -- @param creation_user As in acs_object.new
+ -- @return The id of the newly created extlink
+ -- @see {acs_object.new}, {content_item.new}, {content_extlink.resolve}
+ --*/
+ name in cr_items.name%TYPE default null,
+ url in cr_extlinks.url%TYPE,
+ label in cr_extlinks.label%TYPE default null,
+ description in cr_extlinks.description%TYPE default null,
+ parent_id in cr_items.parent_id%TYPE,
+ extlink_id in cr_extlinks.extlink_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_extlinks.extlink_id%TYPE;
+
+
+procedure del (
+ --/** Deletes the extlink
+ -- @author Karl Goldstein
+ -- @param extlink_id The id of the extlink to delete
+ -- @see {content_extlink.new}, {acs_object.delete}
+ --*/
+ extlink_id in cr_extlinks.extlink_id%TYPE
+);
+
+
+function is_extlink (
+ --/** Determines if the item is a extlink
+ -- @author Karl Goldstein
+ -- @param item_id The item id
+ -- @return 't' if the item is a extlink, 'f' otherwise
+ -- @see {content_extlink.new}, {content_extlink.resolve}
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return char;
+
+procedure copy (
+ extlink_id in cr_extlinks.extlink_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+);
+
+end content_extlink;
+/
+show errors
+
+create or replace package content_folder
+as
+
+function new (
+ --/** Create a new folder
+ -- @author Karl Goldstein
+ -- @param label The label for the folder
+ -- @param description A short description of the folder, 4000 characters maximum
+ -- @param parent_id The parent of the folder
+ -- @param folder_id The id of the new folder. A new id will be allocated by default
+ -- @param context_id The context id. The parent id will be used as the default context
+ -- @param creation_date As in acs_object.new
+ -- @param creation_ip As in acs_object.new
+ -- @param creation_user As in acs_object.new
+ -- @return The id of the newly created folder
+ -- @see {acs_object.new}, {content_item.new}
+ --*/
+ name in cr_items.name%TYPE,
+ label in cr_folders.label%TYPE,
+ description in cr_folders.description%TYPE default null,
+ parent_id in cr_items.parent_id%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null,
+ folder_id in cr_folders.folder_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_folders.folder_id%TYPE;
+
+procedure del (
+ --/** Delete a folder. An error is thrown if the folder is not empty
+ -- @author Karl Goldstein
+ -- @param folder_id The id of the folder to delete
+ -- @see {acs_object.delete}, {content_item.delete}
+ --*/
+ folder_id in cr_folders.folder_id%TYPE
+);
+
+procedure rename (
+ --/** Change the name, label and/or description of the folder
+ -- @author Karl Goldstein
+ -- @param folder_id The id of the folder to modify
+ -- @param name The new name for the folder. An error will be thrown if
+ -- an item with this name already exists under this folder's
+ -- parent. If this parameter is null, the old name will be preserved
+ -- @param label The new label for the folder. The old label will be preserved if
+ -- this parameter is null
+ -- @param label The new description for the folder. The old description
+ -- will be preserved if this parameter is null
+ -- @see {content_folder.new}
+ --*/
+ folder_id in cr_folders.folder_id%TYPE,
+ name in cr_items.name%TYPE default null,
+ label in cr_folders.label%TYPE default null,
+ description in cr_folders.description%TYPE default null
+);
+
+procedure move (
+ --/** Recursively move the folder and all items in into a new location.
+ -- An error is thrown if either of the parameters is not a folder.
+ -- The root folder of the sitemap and the root folder of the
+ -- templates cannot be moved.
+ -- @author Karl Goldstein
+ -- @param folder_id The id of the folder to move
+ -- @param target_folder_id The destination folder
+ -- @see {content_folder.new}, {content_folder.copy}
+ --*/
+ folder_id in cr_folders.folder_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE
+);
+
+procedure copy (
+ --/** Recursively copy the folder and all items in into a new location.
+ -- An error is thrown if either of the parameters is not a folder.
+ -- The root folder of the sitemap and the root folder of the
+ -- templates cannot be copied
+ -- @author Karl Goldstein
+ -- @param folder_id The id of the folder to copy
+ -- @param target_folder_id The destination folder
+ -- @param creation_user The id of the creation user
+ -- @param creation_ip The IP address of the creation user (defaults to null)
+ -- @see {content_folder.new}, {content_folder.copy}
+ --*/
+ folder_id in cr_folders.folder_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE,
+ creation_user in acs_objects.creation_user%TYPE,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+);
+
+function is_folder (
+ --/** Determine if the item is a folder
+ -- @author Karl Goldstein
+ -- @param item_id The item id
+ -- @return 't' if the item is a folder, 'f' otherwise
+ -- @see {content_folder.new}, {content_folder.is_sub_folder}
+ --*/
+ item_id in cr_items.item_id%TYPE
+) return char;
+
+function is_sub_folder (
+ --/** Determine if the item target_folder_id is a subfolder of
+ -- the item folder_id
+ -- @author Karl Goldstein
+ -- @param folder_id The superfolder id
+ -- @param target_folder_id The subfolder id
+ -- @return 't' if the item target_folder_id is a subfolder of
+ -- the item folder_id, 'f' otherwise
+ -- @see {content_folder.is_folder}
+ --*/
+ folder_id in cr_folders.folder_id%TYPE,
+ target_folder_id in cr_folders.folder_id%TYPE
+) return char;
+
+function is_empty (
+ --/** Determine if the folder is empty
+ -- @author Karl Goldstein
+ -- @param folder_id The folder id
+ -- @return 't' if the folder contains no subfolders or items, 'f' otherwise
+ -- @see {content_folder.is_folder}
+ --*/
+ folder_id in cr_folders.folder_id%TYPE
+) return varchar2;
+
+function is_root (
+ --/** Determine whether the folder is a root (has a parent_id of 0)
+ -- @author Karl Goldstein
+ -- @param folder_id The folder ID
+ -- @return 't' if the folder is a root or 'f' otherwise
+ --*/
+ folder_id in cr_folders.folder_id%TYPE
+) return char;
+
+procedure register_content_type (
+ --/** Register a content type to the folder, if it is not already registered.
+ -- Only items of the registered type(s) may be added to the folder.
+ -- @author Karl Goldstein
+ -- @param folder_id The folder id
+ -- @param content_type The content type to be registered
+ -- @see {content_folder.unregister_content_type},
+ -- {content_folder.is_registered}
+ --*/
+ folder_id in cr_folders.folder_id%TYPE,
+ content_type in cr_folder_type_map.content_type%TYPE,
+ include_subtypes in varchar2 default 'f'
+);
+
+procedure unregister_content_type (
+ --/** Unregister a content type from the folder, if it has been registered.
+ -- Only items of the registered type(s) may be added to the folder.
+ -- If the folder already contains items of the type to be unregistered, the
+ -- items remain in the folder.
+ -- @author Karl Goldstein
+ -- @param folder_id The folder id
+ -- @param content_type The content type to be unregistered
+ -- @param include_subtypes If 't', all subtypes of content_type will be
+ -- unregistered as well
+ -- @see {content_folder.register_content_type}, {content_folder.is_registered}
+ --*/
+ folder_id in cr_folders.folder_id%TYPE,
+ content_type in cr_folder_type_map.content_type%TYPE,
+ include_subtypes in varchar2 default 'f'
+);
+
+-- change this to is_type_registered
+function is_registered (
+ --/** Determines if a content type is registered to the folder
+ -- Only items of the registered type(s) may be added to the folder.
+ -- @author Karl Goldstein
+ -- @param folder_id The folder id
+ -- @param content_type The content type to be checked
+ -- @param include_subtypes If 't', all subtypes of the content_type
+ -- will be checked, returning 't' if all of them are registered. If 'f',
+ -- only an exact match with content_type will be
+ -- performed.
+ -- @return 't' if the type is registered to this folder, 'f' otherwise
+ -- @see {content_folder.register_content_type}, {content_folder.unregister_content_type},
+ --*/
+ folder_id in cr_folders.folder_id%TYPE,
+ content_type in cr_folder_type_map.content_type%TYPE,
+ include_subtypes in varchar2 default 'f'
+) return varchar2;
+
+
+function get_label (
+ --/** Returns the label for the folder. This function is the default name method
+ -- for the folder object.
+ -- @author Karl Goldstein
+ -- @param folder_id The folder id
+ -- @return The folder's label
+ -- @see {acs_object_type.create_type}, the docs for the name_method parameter
+ --*/
+ folder_id in cr_folders.folder_id%TYPE
+) return cr_folders.label%TYPE;
+
+
+function get_index_page (
+ --/** Returns the item ID of the index page of the folder, null otherwise
+ -- @author Michael Pih
+ -- @param folder_id The folder id
+ -- @return The item ID of the index page
+ --*/
+ folder_id in cr_folders.folder_id%TYPE
+) return cr_items.item_id%TYPE;
+
+
+
+end content_folder;
+/
+show errors
+
+
+
+create or replace package content_template
+as
+
+c_root_folder_id constant integer := -200;
+
+function get_root_folder return cr_folders.folder_id%TYPE;
+
+function new (
+ --/** Creates a new content template which can be used to render content items.
+ -- @author Karl Goldstein
+ -- @param name The name for the template, must be a valid UNIX-like filename.
+ -- If a template with this name already exists under the specified
+ -- parent item, an error is thrown
+ -- @param text The body of the .adp template itself, defaults to null
+ -- @param parent_id The parent of this item, defaults to null
+ -- @param is_live The should the revision be set live, defaults to 't'. Requires
+ -- that text is not null or there will be no revision to begin with
+ -- @param template_id The id of the new template. A new id will be allocated if this
+ -- parameter is null
+ -- @param creation_date As in acs_object.new
+ -- @param creation_ip As in acs_object.new
+ -- @param creation_user As in acs_object.new
+ -- @return The id of the newly created template
+ -- @see {acs_object.new}, {content_item.new}, {content_item.register_template},
+ -- {content_type.register_template}
+ --*/
+ name in cr_items.name%TYPE,
+ text in varchar2 default null,
+ parent_id in cr_items.parent_id%TYPE default null,
+ is_live in char default 't',
+ template_id in cr_templates.template_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+) return cr_templates.template_id%TYPE;
+
+procedure del (
+ --/** Deletes the specified template, and unregisters the template from
+ -- all content types and content items.
+ -- Use with caution - this operation cannot be undone.
+ -- @author Karl Goldstein
+ -- @param template_id The id of the template to delete
+ -- @see {acs_object.delete}, {content_item.unregister_template},
+ -- {content_type.unregister_template},
+ --*/
+ template_id in cr_templates.template_id%TYPE
+);
+
+function is_template (
+ --/** Determine if an item is a template.
+ -- @author Karl Goldstein
+ -- @param item_id The item id
+ -- @return 't' if the item is a template, 'f' otherwise
+ -- @see {content_template.new}
+ --*/
+ template_id in cr_templates.template_id%TYPE
+) return varchar2;
+
+function get_path (
+ --/** Retrieves the full path to the template, as described in content_item.get_path
+ -- @author Karl Goldstein
+ -- @param template_id The id of the template for which the path is to
+ -- be retrieved
+ -- @param root_folder_id Starts path resolution at this folder
+ -- @return The path to the template, starting with the specified root folder
+ -- @see {content_item.get_path}
+ --*/
+ template_id in cr_templates.template_id%TYPE,
+ root_folder_id in cr_folders.folder_id%TYPE default c_root_folder_id
+) return varchar2;
+
+end content_template;
+/
+show errors
+
+create or replace package content_keyword
+as
+
+function new (
+ --/** Creates a new keyword (also known as "subject category").
+ -- @author Karl Goldstein
+ -- @param heading The heading for the new keyword
+ -- @param description The description for the new keyword
+ -- @param parent_id The parent of this keyword, defaults to null.
+ -- @param keyword_id The id of the new keyword. A new id will be allocated if this
+ -- parameter is null
+ -- @param object_type The type for the new keyword, defaults to 'content_keyword'.
+ -- This parameter may be used by subclasses of
+ -- content_keyword to initialize the superclass.
+ -- @param creation_date As in acs_object.new
+ -- @param creation_ip As in acs_object.new
+ -- @param creation_user As in acs_object.new
+ -- @return The id of the newly created keyword
+ -- @see {acs_object.new}, {content_item.new}, {content_keyword.item_assign},
+ -- {content_keyword.delete}
+ --*/
+ heading in cr_keywords.heading%TYPE,
+ description in cr_keywords.description%TYPE default null,
+ parent_id in cr_keywords.parent_id%TYPE default null,
+ keyword_id in cr_keywords.keyword_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE
+ default sysdate,
+ creation_user in acs_objects.creation_user%TYPE
+ default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ object_type in acs_object_types.object_type%TYPE default 'content_keyword'
+) return cr_keywords.keyword_id%TYPE;
+
+procedure del (
+ --/** Deletes the specified keyword, which must be a leaf. Unassigns the
+ -- keyword from all content items. Use with caution - this
+ -- operation cannot be undone.
+ -- @author Karl Goldstein
+ -- @param keyword_id The id of the keyword to be deleted
+ -- @see {acs_object.delete}, {content_keyword.item_unassign}
+ --*/
+ keyword_id in cr_keywords.keyword_id%TYPE
+);
+
+function get_heading (
+ --/** Retrieves the heading of the content keyword
+ -- @author Karl Goldstein
+ -- @param keyword_id The keyword id
+ -- @return The heading for the specified keyword
+ -- @see {content_keyword.set_heading}, {content_keyword.get_description}
+ --*/
+ keyword_id in cr_keywords.keyword_id%TYPE
+) return varchar2;
+
+function get_description (
+ --/** Retrieves the description of the content keyword
+ -- @author Karl Goldstein
+ -- @param keyword_id The keyword id
+ -- @return The description for the specified keyword
+ -- @see {content_keyword.get_heading}, {content_keyword.set_description}
+ --*/
+ keyword_id in cr_keywords.keyword_id%TYPE
+) return varchar2;
+
+procedure set_heading (
+ --/** Sets a new heading for the keyword
+ -- @author Karl Goldstein
+ -- @param keyword_id The keyword id
+ -- @param heading The new heading
+ -- @see {content_keyword.get_heading}, {content_keyword.set_description}
+ --*/
+ keyword_id in cr_keywords.keyword_id%TYPE,
+ heading in cr_keywords.heading%TYPE
+);
+
+procedure set_description (
+ --/** Sets a new description for the keyword
+ -- @author Karl Goldstein
+ -- @param keyword_id The keyword id
+ -- @param description The new description
+ -- @see {content_keyword.set_heading}, {content_keyword.get_description}
+ --*/
+ keyword_id in cr_keywords.keyword_id%TYPE,
+ description in cr_keywords.description%TYPE
+);
+
+function is_leaf (
+ --/** Determines if the keyword has no sub-keywords associated with it
+ -- @author Karl Goldstein
+ -- @param keyword_id The keyword id
+ -- @return 't' if the keyword has no descendants, 'f' otherwise
+ -- @see {content_keyword.new}
+ --*/
+ keyword_id in cr_keywords.keyword_id%TYPE
+) return varchar2;
+
+procedure item_assign (
+ --/** Assigns this keyword to a content item, creating a relationship between them
+ -- @author Karl Goldstein
+ -- @param item_id The item to be assigned to
+ -- @param keyword_id The keyword to be assigned
+ -- @param context_id As in acs_rel.new, deprecated
+ -- @param creation_ip As in acs_rel.new, deprecated
+ -- @param creation_user As in acs_rel.new, deprecated
+ -- @see {acs_rel.new}, {content_keyword.item_unassign}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ keyword_id in cr_keywords.keyword_id%TYPE,
+ context_id in acs_objects.context_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+);
+
+procedure item_unassign (
+ --/** Unassigns this keyword to a content item, removing a relationship between them
+ -- @author Karl Goldstein
+ -- @param item_id The item to be unassigned from
+ -- @param keyword_id The keyword to be unassigned
+ -- @see {acs_rel.delete}, {content_keyword.item_assign}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ keyword_id in cr_keywords.keyword_id%TYPE
+);
+
+function is_assigned (
+ --/** Determines if the keyword is assigned to the item
+ -- @author Karl Goldstein
+ -- @param item_id The item id
+ -- @param keyword_id The keyword id to be checked for assignment
+ -- @param recurse Specifies if the keyword search is
+ -- recursive. May be set to one of the following
+ -- values:
+ -- - none: Not recursive. Look for an exact match.
+ -- - up: Recursive from specific to general. A search for
+ -- "attack dogs" will also match "dogs", "animals", "mammals", etc.
+ -- - down: Recursive from general to specific. A search for
+ -- "mammals" will also match "dogs", "attack dogs", "cats", "siamese cats",
+ -- etc.
+ -- @return 't' if the keyword may be matched to an item, 'f' otherwise
+ -- @see {content_keyword.item_assign}
+ --*/
+ item_id in cr_items.item_id%TYPE,
+ keyword_id in cr_keywords.keyword_id%TYPE,
+ recurse in varchar2 default 'none'
+) return varchar2;
+
+function get_path (
+ --/** Retreives a path to the keyword/subject category, with the most general
+ -- category at the root of the path
+ -- @author Karl Goldstein
+ -- @param keyword_id The keyword id
+ -- @return The path to the keyword, or null if no such keyword exists
+ -- @see {content_keyword.new}
+ --*/
+ keyword_id in cr_keywords.keyword_id%TYPE
+) return varchar2;
+
+end content_keyword;
+/
+show errors
+
+
+
+
+create or replace package content_permission
+is
+
+ procedure inherit_permissions (
+ --/** Make the child object inherit all of the permissions of the parent
+ -- object. Typically, this function is called whenever a new object
+ -- is created under a given parent
+ -- @author Karl Goldstein
+ -- @param parent_object_id The parent object id
+ -- @param child_object_id The child object id
+ -- @see {content_permission.grant}, {acs_permission.grant_permission}
+ --*/
+ parent_object_id in acs_objects.object_id%TYPE,
+ child_object_id in acs_objects.object_id%TYPE,
+ child_creator_id in parties.party_id%TYPE default null
+ );
+
+ function has_grant_authority (
+ --/** Determine if the user may grant a certain permission to another
+ -- user. The permission may only be granted if the user has
+ -- the permission himself and posesses the cm_perm access, or if the
+ -- user posesses the cm_perm_admin access.
+ -- @author Karl Goldstein
+ -- @param object_id The object whose permissions are to be changed
+ -- @param holder_id The person who is attempting to grant the permissions
+ -- @param privilege The privilege to be granted
+ -- @return 't' if the donation is possible, 'f' otherwise
+ -- @see {content_permission.grant_permission}, {content_permission.is_has_revoke_authority},
+ -- {acs_permission.grant_permission}
+ --*/
+ object_id in acs_objects.object_id%TYPE,
+ holder_id in parties.party_id%TYPE,
+ privilege in acs_privileges.privilege%TYPE
+ ) return varchar2;
+
+ procedure grant_permission_h (
+ --/** This is a helper function for content_permission.grant_permission and
+ -- should not be called individually.
+ -- Grants a permission and revokes all descendants of the permission, since
+ -- they are no longer relevant.
+ -- @author Karl Goldstein
+ -- @param object_id The object whose permissions are to be changed
+ -- @param grantee_id The person who should gain the parent privilege
+ -- @param privilege The parent privilege to be granted
+ -- @see {content_permission.grant_permission}
+ --*/
+ object_id in acs_objects.object_id%TYPE,
+ grantee_id in parties.party_id%TYPE,
+ privilege in acs_privileges.privilege%TYPE
+ );
+
+ procedure grant_permission (
+ --/** Grant the specified privilege to another user. If the donation is
+ -- not possible, the procedure does nothing.
+ -- @author Karl Goldstein
+ -- @param object_id The object whose permissions are to be changed
+ -- @param holder_id The person who is attempting to grant the permissions
+ -- @param privilege The privilege to be granted
+ -- @param recepient_id The person who will gain the privilege
+ -- @param is_recursive If 't', applies the donation recursively to
+ -- all child objects of the object (equivalent to UNIX's chmod -r).
+ -- If 'f', only affects the objects itself.
+ -- @see {content_permission.has_grant_authority}, {content_permission.revoke_permission},
+ -- {acs_permission.grant_permission}
+ --*/
+ object_id in acs_objects.object_id%TYPE,
+ holder_id in parties.party_id%TYPE,
+ privilege in acs_privileges.privilege%TYPE,
+ recepient_id in parties.party_id%TYPE,
+ is_recursive in varchar2 default 'f',
+ object_type in acs_objects.object_type%TYPE default 'content_item'
+ );
+
+ function has_revoke_authority (
+ --/** Determine if the user may take a certain permission away from another
+ -- user. The permission may only be revoked if the user has
+ -- the permission himself and posesses the cm_perm access, while the
+ -- other user does not, or if the user posesses the cm_perm_admin access.
+ -- @author Karl Goldstein
+ -- @param object_id The object whose permissions are to be changed
+ -- @param holder_id The person who is attempting to revoke the permissions
+ -- @param privilege The privilege to be revoked
+ -- @param revokee_id The user from whom the privilege is to be taken away
+ -- @return 't' if it is possible to revoke the privilege, 'f' otherwise
+ -- @see {content_permission.has_grant_authority}, {content_permission.revoke_permission},
+ -- {acs_permission.revoke_permission}
+ --*/
+ object_id in acs_objects.object_id%TYPE,
+ holder_id in parties.party_id%TYPE,
+ privilege in acs_privileges.privilege%TYPE,
+ revokee_id in parties.party_id%TYPE
+ ) return varchar2;
+
+ procedure revoke_permission_h (
+ --/** This is a helper function for content_permission.revoke_permission and
+ -- should not be called individually.
+ -- Revokes a permission but grants all child permissions to the holder, to
+ -- ensure that the permission is not permanently lost
+ -- @author Karl Goldstein
+ -- @param object_id The object whose permissions are to be changed
+ -- @param revokee_id The person who should lose the parent permission
+ -- @param privilege The parent privilege to be revoked
+ -- @see {content_permission.revoke_permission}
+ --*/
+ object_id in acs_objects.object_id%TYPE,
+ revokee_id in parties.party_id%TYPE,
+ privilege in acs_privileges.privilege%TYPE
+ );
+
+ procedure revoke_permission (
+ --/** Take the specified privilege away from another user. If the operation is
+ -- not possible, the procedure does nothing.
+ -- @author Karl Goldstein
+ -- @param object_id The object whose permissions are to be changed
+ -- @param holder_id The person who is attempting to revoke the permissions
+ -- @param privilege The privilege to be revoked
+ -- @param recepient_id The person who will lose the privilege
+ -- @param is_recursive If 't', applies the operation recursively to
+ -- all child objects of the object (equivalent to UNIX's chmod -r).
+ -- If 'f', only affects the objects itself.
+ -- @see {content_permission.grant_permission}, {content_permission.has_revoke_authority},
+ -- {acs_permission.revoke_permission}
+ --*/
+ object_id in acs_objects.object_id%TYPE,
+ holder_id in parties.party_id%TYPE,
+ privilege in acs_privileges.privilege%TYPE,
+ revokee_id in parties.party_id%TYPE,
+ is_recursive in varchar2 default 'f',
+ object_type in acs_objects.object_type%TYPE default 'content_item'
+ );
+
+ function permission_p (
+ --/** Determine if the user has the specified permission on the specified
+ -- object. Does NOT check objects recursively: that is, if the user has
+ -- the permission on the parent object, he does not automatically gain
+ -- the permission on all the child objects.
+ -- @author Karl Goldstein
+ -- @param object_id The object whose permissions are to be checked
+ -- @param holder_id The person whose permissions are to be examined
+ -- @param privilege The privilege to be checked
+ -- @return 't' if the user has the specified permission on the object,
+ -- 'f' otherwise
+ -- @see {content_permission.grant_permission}, {content_permission.revoke_permission},
+ -- {acs_permission.permission_p}
+ --*/
+ object_id in acs_objects.object_id%TYPE,
+ holder_id in parties.party_id%TYPE,
+ privilege in acs_privileges.privilege%TYPE
+ ) return varchar2;
+
+ function cm_admin_exists
+ -- /** Determine if there exists a user who has administrative
+ -- privileges on the entire content repository.
+ -- @author Stanislav Freidin
+ -- @return 't' if an administrator exists, 'f' otherwise
+ -- @see {content_permission.grant_permission}
+ return varchar2;
+
+end content_permission;
+/
+show errors
+
+
+
Index: openacs-4/packages/dotlrn/sql/oracle/upgrade/upgrade-1.0-1.0d1.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/oracle/upgrade/Attic/upgrade-1.0-1.0d1.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/dotlrn/sql/oracle/upgrade/upgrade-1.0-1.0d1.sql 8 Oct 2003 16:03:58 -0000 1.1
@@ -0,0 +1,1762 @@
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+--
+-- Create the Admin package
+--
+-- @author yon@openforce.net
+-- @version $Id: upgrade-1.0-1.0d1.sql,v 1.1 2003/10/08 16:03:58 mohanp Exp $
+--
+
+create or replace package dotlrn_admin_profile_rel
+as
+ function new (
+ rel_id in dotlrn_admin_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_admin_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_admin_profile_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors
+
+create or replace package body dotlrn_admin_profile_rel
+as
+ function new (
+ rel_id in dotlrn_admin_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_admin_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_user_profile_rels.rel_id%TYPE;
+ v_group_id groups.group_id%TYPE;
+ begin
+ if group_id is null then
+ select min(group_id)
+ into v_group_id
+ from profiled_groups
+ where profile_provider = (select min(impl_id)
+ from acs_sc_impls
+ where impl_name = 'dotlrn_admin_profile_provider');
+ else
+ v_group_id := group_id;
+ end if;
+
+ v_rel_id := dotlrn_user_profile_rel.new(
+ rel_id => rel_id,
+ user_id => user_id,
+ portal_id => portal_id,
+ theme_id => theme_id,
+ id => id,
+ rel_type => rel_type,
+ group_id => v_group_id,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_admin_profile_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_admin_profile_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_admin_profile_rels
+ where rel_id = dotlrn_admin_profile_rel.del.rel_id;
+
+ dotlrn_user_profile_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+--
+-- create the dotLRN classes model
+--
+-- @author Ben Adida (ben@openforce.net)
+-- @author yon (yon@openforce.net)
+-- @creation-date 2001-08-18
+-- @version $Id: upgrade-1.0-1.0d1.sql,v 1.1 2003/10/08 16:03:58 mohanp Exp $
+--
+
+create or replace package dotlrn_department
+is
+ function new (
+ department_key in dotlrn_departments.department_key%TYPE,
+ pretty_name in dotlrn_community_types.pretty_name%TYPE,
+ pretty_plural in acs_object_types.pretty_plural%TYPE default null,
+ description in dotlrn_community_types.description%TYPE,
+ package_id in dotlrn_community_types.package_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_departments.department_key%TYPE;
+
+ procedure del (
+ department_key in dotlrn_departments.department_key%TYPE
+ );
+end;
+/
+show errors
+
+create or replace package body dotlrn_department
+is
+ function new (
+ department_key in dotlrn_departments.department_key%TYPE,
+ pretty_name in dotlrn_community_types.pretty_name%TYPE,
+ pretty_plural in acs_object_types.pretty_plural%TYPE default null,
+ description in dotlrn_community_types.description%TYPE,
+ package_id in dotlrn_community_types.package_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_departments.department_key%TYPE
+ is
+ v_department_key dotlrn_departments.department_key%TYPE;
+ begin
+ v_department_key := dotlrn_community_type.new (
+ community_type => department_key,
+ parent_type => 'dotlrn_class_instance',
+ pretty_name => pretty_name,
+ pretty_plural => pretty_plural,
+ description => description,
+ package_id => package_id,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ insert
+ into dotlrn_departments
+ (department_key) values (v_department_key);
+
+ return v_department_key;
+ end;
+
+ procedure del (
+ department_key in dotlrn_departments.department_key%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_departments
+ where department_key = department_key;
+
+ dotlrn_community_type.del(department_key);
+ end;
+end;
+/
+show errors
+
+create or replace package dotlrn_class
+is
+ function new (
+ class_key in dotlrn_classes.class_key%TYPE,
+ department_key in dotlrn_departments.department_key%TYPE,
+ pretty_name in dotlrn_community_types.pretty_name%TYPE,
+ pretty_plural in acs_object_types.pretty_plural%TYPE default null,
+ description in dotlrn_community_types.description%TYPE,
+ package_id in dotlrn_community_types.package_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_classes.class_key%TYPE;
+
+ procedure del (
+ class_key in dotlrn_classes.class_key%TYPE
+ );
+end;
+/
+show errors
+
+create or replace package body dotlrn_class
+is
+ function new (
+ class_key in dotlrn_classes.class_key%TYPE,
+ department_key in dotlrn_departments.department_key%TYPE,
+ pretty_name in dotlrn_community_types.pretty_name%TYPE,
+ pretty_plural in acs_object_types.pretty_plural%TYPE default null,
+ description in dotlrn_community_types.description%TYPE,
+ package_id in dotlrn_community_types.package_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_classes.class_key%TYPE
+ is
+ v_class_key dotlrn_classes.class_key%TYPE;
+ begin
+ v_class_key := dotlrn_community_type.new (
+ community_type => class_key,
+ parent_type => department_key,
+ pretty_name => pretty_name,
+ pretty_plural => pretty_plural,
+ description => description,
+ package_id => package_id,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ insert
+ into dotlrn_classes
+ (class_key, department_key) values (v_class_key, department_key);
+
+ return v_class_key;
+ end;
+
+ procedure del (
+ class_key in dotlrn_classes.class_key%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_classes
+ where class_key = class_key;
+
+ dotlrn_community_type.del(class_key);
+ end;
+end;
+/
+show errors
+
+create or replace package dotlrn_class_instance
+is
+ function new (
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE default null,
+ class_key in dotlrn_class_instances.class_key%TYPE,
+ term_id in dotlrn_class_instances.term_id%TYPE,
+ community_key in dotlrn_communities_all.community_key%TYPE,
+ pretty_name in dotlrn_communities_all.pretty_name%TYPE,
+ description in dotlrn_communities_all.description%TYPE,
+ package_id in dotlrn_communities_all.package_id%TYPE default null,
+ portal_id in dotlrn_communities_all.portal_id%TYPE default null,
+ non_member_portal_id in dotlrn_communities_all.non_member_portal_id%TYPE default null,
+ join_policy in groups.join_policy%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_class_instances.class_instance_id%TYPE;
+
+ procedure del (
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE
+ );
+end;
+/
+show errors
+
+create or replace package body dotlrn_class_instance
+is
+ function new (
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE default null,
+ class_key in dotlrn_class_instances.class_key%TYPE,
+ term_id in dotlrn_class_instances.term_id%TYPE,
+ community_key in dotlrn_communities_all.community_key%TYPE,
+ pretty_name in dotlrn_communities_all.pretty_name%TYPE,
+ description in dotlrn_communities_all.description%TYPE,
+ package_id in dotlrn_communities_all.package_id%TYPE default null,
+ portal_id in dotlrn_communities_all.portal_id%TYPE default null,
+ non_member_portal_id in dotlrn_communities_all.non_member_portal_id%TYPE default null,
+ join_policy in groups.join_policy%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_class_instances.class_instance_id%TYPE
+ is
+ v_class_instance_id dotlrn_class_instances.class_instance_id%TYPE;
+ begin
+ v_class_instance_id := dotlrn_community.new (
+ community_id => class_instance_id,
+ community_type => class_key,
+ community_key => community_key,
+ pretty_name => pretty_name,
+ description => description,
+ package_id => package_id,
+ portal_id => portal_id,
+ non_member_portal_id => non_member_portal_id,
+ join_policy => join_policy,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ insert
+ into dotlrn_class_instances
+ (class_instance_id, class_key, term_id)
+ values
+ (v_class_instance_id, class_key, term_id);
+
+ return v_class_instance_id;
+ end;
+
+ procedure del (
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_class_instances
+ where class_instance_id= class_instance_id;
+
+ dotlrn_community.del(community_id => class_instance_id);
+ end;
+end;
+/
+show errors
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+
+--
+-- create dotLRN clubs model
+--
+-- @author yon (yon@openforce.net)
+-- @creation-date August 18th, 2001
+-- @version $Id: upgrade-1.0-1.0d1.sql,v 1.1 2003/10/08 16:03:58 mohanp Exp $
+--
+
+create or replace package dotlrn_club
+is
+ function new (
+ club_id in dotlrn_clubs.club_id%TYPE default null,
+ community_key in dotlrn_communities_all.community_key%TYPE,
+ pretty_name in dotlrn_communities_all.pretty_name%TYPE,
+ description in dotlrn_communities_all.description%TYPE,
+ package_id in dotlrn_communities_all.package_id%TYPE default null,
+ portal_id in dotlrn_communities_all.portal_id%TYPE default null,
+ non_member_portal_id in dotlrn_communities_all.non_member_portal_id%TYPE default null,
+ join_policy in groups.join_policy%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_clubs.club_id%TYPE;
+
+ procedure del (
+ club_id in dotlrn_clubs.club_id%TYPE
+ );
+end;
+/
+show errors
+
+create or replace package body dotlrn_club
+is
+ function new (
+ club_id in dotlrn_clubs.club_id%TYPE default null,
+ community_key in dotlrn_communities_all.community_key%TYPE,
+ pretty_name in dotlrn_communities_all.pretty_name%TYPE,
+ description in dotlrn_communities_all.description%TYPE,
+ package_id in dotlrn_communities_all.package_id%TYPE default null,
+ portal_id in dotlrn_communities_all.portal_id%TYPE default null,
+ non_member_portal_id in dotlrn_communities_all.non_member_portal_id%TYPE default null,
+ join_policy in groups.join_policy%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_clubs.club_id%TYPE
+ is
+ v_club_id integer;
+ begin
+ v_club_id := dotlrn_community.new(
+ community_id => club_id,
+ community_type => 'dotlrn_club',
+ community_key => community_key,
+ pretty_name => pretty_name,
+ description => description,
+ package_id => package_id,
+ portal_id => portal_id,
+ non_member_portal_id => non_member_portal_id,
+ join_policy => join_policy,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ insert
+ into dotlrn_clubs (club_id)
+ values (v_club_id);
+
+ return v_club_id;
+ end;
+
+ procedure del (
+ club_id in dotlrn_clubs.club_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_clubs
+ where club_id = dotlrn_club.del.club_id;
+
+ dotlrn_community.del(community_id => club_id);
+ end;
+end;
+/
+show errors
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+create or replace package dotlrn_community_type
+is
+ function new (
+ community_type in dotlrn_community_types.community_type%TYPE,
+ parent_type in dotlrn_community_types.supertype%TYPE default 'dotlrn_community',
+ pretty_name in dotlrn_community_types.pretty_name%TYPE,
+ pretty_plural in dotlrn_community_types.pretty_name%TYPE default null,
+ description in dotlrn_community_types.description%TYPE,
+ package_id in dotlrn_community_types.package_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_community_types.community_type%TYPE;
+
+ procedure del (
+ community_type in dotlrn_community_types.community_type%TYPE
+ );
+
+ function name (
+ community_type in dotlrn_community_types.community_type%TYPE
+ ) return varchar;
+end;
+/
+show errors
+
+create or replace package body dotlrn_community_type
+is
+ function new (
+ community_type in dotlrn_community_types.community_type%TYPE,
+ parent_type in dotlrn_community_types.supertype%TYPE default 'dotlrn_community',
+ pretty_name in dotlrn_community_types.pretty_name%TYPE,
+ pretty_plural in dotlrn_community_types.pretty_name%TYPE default null,
+ description in dotlrn_community_types.description%TYPE,
+ package_id in dotlrn_community_types.package_id%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_community_types.community_type%TYPE
+ is
+ v_parent_object_type acs_object_types.object_type%TYPE;
+ v_unique_name acs_objects.object_id%TYPE;
+ begin
+ if parent_type is null then
+ v_parent_object_type:= 'group';
+ else
+ v_parent_object_type:= parent_type;
+ end if;
+
+ select acs_object_id_seq.nextval
+ into v_unique_name
+ from dual;
+
+ acs_object_type.create_type (
+ supertype => v_parent_object_type,
+ object_type => dotlrn_community_type.new.community_type,
+ pretty_name => dotlrn_community_type.new.community_type,
+ pretty_plural => dotlrn_community_type.new.community_type,
+ table_name => v_unique_name,
+ id_column => v_unique_name,
+ package_name => v_unique_name,
+ name_method => 'acs_group.name'
+ );
+
+ insert
+ into group_types
+ (group_type, default_join_policy)
+ values
+ (dotlrn_community_type.new.community_type, 'closed');
+
+ insert
+ into dotlrn_community_types
+ (community_type,
+ pretty_name,
+ description,
+ package_id,
+ supertype)
+ values
+ (dotlrn_community_type.new.community_type,
+ dotlrn_community_type.new.pretty_name,
+ dotlrn_community_type.new.description,
+ dotlrn_community_type.new.package_id,
+ dotlrn_community_type.new.parent_type);
+
+ return community_type;
+ end;
+
+ procedure del (
+ community_type in dotlrn_community_types.community_type%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_community_types
+ where community_type = dotlrn_community_type.del.community_type;
+
+ delete
+ from group_types
+ where group_types.group_type = dotlrn_community_type.del.community_type;
+
+ acs_object_type.drop_type(dotlrn_community_type.del.community_type);
+ end;
+
+ function name (
+ community_type in dotlrn_community_types.community_type%TYPE
+ ) return varchar
+ is
+ v_name dotlrn_community_types.pretty_name%TYPE;
+ begin
+ select dotlrn_community_types.pretty_name
+ into v_name
+ from dotlrn_community_types
+ where dotlrn_community_types.community_type = dotlrn_community_type.name.community_type;
+
+ return v_name;
+ end;
+end;
+/
+show errors
+
+create or replace package dotlrn_community
+is
+
+ function new (
+ community_id in dotlrn_communities_all.community_id%TYPE default null,
+ parent_community_id in dotlrn_communities_all.parent_community_id%TYPE default null,
+ community_type in dotlrn_communities_all.community_type%TYPE,
+ community_key in dotlrn_communities_all.community_key%TYPE,
+ pretty_name in dotlrn_communities_all.pretty_name%TYPE,
+ description in dotlrn_communities_all.description%TYPE,
+ archived_p in dotlrn_communities_all.archived_p%TYPE default 'f',
+ portal_id in dotlrn_communities_all.portal_id%TYPE default null,
+ non_member_portal_id in dotlrn_communities_all.non_member_portal_id%TYPE default null,
+ package_id in dotlrn_communities_all.package_id%TYPE default null,
+ join_policy in groups.join_policy%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_communities_all.community_id%TYPE;
+
+ procedure set_active_dates (
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ start_date in dotlrn_communities_all.active_start_date%TYPE,
+ end_date in dotlrn_communities_all.active_end_date%TYPE
+ );
+
+ procedure del (
+ community_id in dotlrn_communities_all.community_id%TYPE
+ );
+
+ function name (
+ community_id in dotlrn_communities_all.community_id%TYPE
+ ) return varchar;
+
+ function member_p (
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ party_id in parties.party_id%TYPE
+ ) return char;
+
+ function admin_p (
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ party_id in parties.party_id%TYPE
+ ) return char;
+
+ function url (
+ community_id in dotlrn_communities_all.community_id%TYPE
+ ) return varchar2;
+
+ function has_subcomm_p (
+ community_id in dotlrn_communities_all.community_id%TYPE
+ ) return char;
+
+end dotlrn_community;
+/
+show errors
+
+create or replace package body dotlrn_community
+as
+
+ function new (
+ community_id in dotlrn_communities_all.community_id%TYPE default null,
+ parent_community_id in dotlrn_communities_all.parent_community_id%TYPE default null,
+ community_type in dotlrn_communities_all.community_type%TYPE,
+ community_key in dotlrn_communities_all.community_key%TYPE,
+ pretty_name in dotlrn_communities_all.pretty_name%TYPE,
+ description in dotlrn_communities_all.description%TYPE,
+ archived_p in dotlrn_communities_all.archived_p%TYPE default 'f',
+ portal_id in dotlrn_communities_all.portal_id%TYPE default null,
+ non_member_portal_id in dotlrn_communities_all.non_member_portal_id%TYPE default null,
+ package_id in dotlrn_communities_all.package_id%TYPE default null,
+ join_policy in groups.join_policy%TYPE default null,
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return dotlrn_communities_all.community_id%TYPE
+ is
+ c_id integer;
+ begin
+ c_id := acs_group.new (
+ context_id => dotlrn_community.new.context_id,
+ group_id => dotlrn_community.new.community_id,
+ object_type => dotlrn_community.new.community_type,
+ creation_date => dotlrn_community.new.creation_date,
+ creation_user => dotlrn_community.new.creation_user,
+ creation_ip => dotlrn_community.new.creation_ip,
+ group_name => dotlrn_community.new.community_key,
+ join_policy => dotlrn_community.new.join_policy
+ );
+
+ insert into dotlrn_communities_all
+ (community_id,
+ parent_community_id,
+ community_type,
+ community_key,
+ pretty_name,
+ description,
+ package_id,
+ archived_p,
+ portal_id,
+ non_member_portal_id)
+ values
+ (c_id,
+ dotlrn_community.new.parent_community_id,
+ dotlrn_community.new.community_type,
+ dotlrn_community.new.community_key,
+ dotlrn_community.new.pretty_name,
+ dotlrn_community.new.description,
+ dotlrn_community.new.package_id,
+ dotlrn_community.new.archived_p,
+ dotlrn_community.new.portal_id,
+ dotlrn_community.new.non_member_portal_id);
+
+ return c_id;
+ end;
+
+ procedure set_active_dates (
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ start_date in dotlrn_communities_all.active_start_date%TYPE,
+ end_date in dotlrn_communities_all.active_end_date%TYPE
+ )
+ is
+ begin
+ update dotlrn_communities_all
+ set active_start_date = dotlrn_community.set_active_dates.start_date,
+ active_end_date = dotlrn_community.set_active_dates.end_date
+ where dotlrn_communities_all.community_id = dotlrn_community.set_active_dates.community_id;
+ end;
+
+ procedure del (
+ community_id in dotlrn_communities_all.community_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_communities_all
+ where dotlrn_communities_all.community_id = dotlrn_community.del.community_id;
+
+ acs_group.del(dotlrn_community.del.community_id);
+ end;
+
+ function name (
+ community_id in dotlrn_communities_all.community_id%TYPE
+ ) return varchar
+ is
+ begin
+ return acs_group.name(dotlrn_community.name.community_id);
+ end;
+
+ function member_p (
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ party_id in parties.party_id%TYPE
+ ) return char
+ is
+ v_member_p char(1);
+ begin
+ select decode(count(*), 0, 'f', 't')
+ into v_member_p
+ from dual
+ where exists (select 1
+ from dotlrn_member_rels_approved
+ where dotlrn_member_rels_approved.user_id = dotlrn_community.member_p.party_id
+ and dotlrn_member_rels_approved.community_id = dotlrn_community.member_p.community_id);
+
+ return v_member_p;
+ end;
+
+ function admin_p (
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ party_id in parties.party_id%TYPE
+ ) return char
+ is
+ v_rv char(1);
+ begin
+ select decode(
+ acs_permission.permission_p(dotlrn_community.admin_p.community_id, dotlrn_community.admin_p.party_id, 'dotlrn_admin_community'),
+ 'f',
+ acs_permission.permission_p(dotlrn_community.admin_p.community_id, dotlrn_community.admin_p.party_id, 'admin'),
+ 't'
+ ) into v_rv
+ from dual;
+
+ return v_rv;
+ end;
+
+ function url (
+ community_id in dotlrn_communities_all.community_id%TYPE
+ ) return varchar2
+ is
+ v_node_id site_nodes.node_id%TYPE;
+ begin
+ select site_nodes.node_id into v_node_id
+ from dotlrn_communities_all,
+ site_nodes
+ where dotlrn_communities_all.community_id = dotlrn_community.url.community_id
+ and site_nodes.object_id = dotlrn_communities_all.package_id;
+
+ return site_node.url(v_node_id);
+
+ exception
+ when no_data_found then
+ return '';
+ end;
+
+ function has_subcomm_p (
+ community_id in dotlrn_communities_all.community_id%TYPE
+ ) return char
+ is
+ v_rv char(1);
+ begin
+ select decode(count(*), 0, 'f', 't')
+ into v_rv
+ from dual
+ where exists (select 1
+ from dotlrn_communities_all
+ where dotlrn_communities_all.parent_community_id = dotlrn_community.has_subcomm_p.community_id);
+ return v_rv;
+ end;
+
+end;
+/
+show errors
+
+
+create or replace package dotlrn_member_rel
+is
+
+ function new (
+ rel_id in dotlrn_member_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_member_rel',
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_member_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_member_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors;
+
+create or replace package body dotlrn_member_rel
+is
+
+ function new (
+ rel_id in dotlrn_member_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_member_rel',
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_member_rels.rel_id%TYPE
+ is
+ v_rel_id membership_rels.rel_id%TYPE;
+ begin
+ v_rel_id:= membership_rel.new(
+ rel_id => rel_id,
+ rel_type => rel_type,
+ object_id_one => community_id,
+ object_id_two => user_id,
+ member_state => dotlrn_member_rel.new.member_state,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_member_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_member_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_member_rels
+ where rel_id = dotlrn_member_rel.del.rel_id;
+
+ membership_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors;
+
+create or replace package dotlrn_admin_rel
+is
+
+ function new (
+ rel_id in dotlrn_admin_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_admin_rel',
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_admin_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_admin_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors;
+
+create or replace package body dotlrn_admin_rel
+is
+
+ function new (
+ rel_id in dotlrn_admin_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_admin_rel',
+ community_id in dotlrn_communities_all.community_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_admin_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_admin_rels.rel_id%TYPE;
+ begin
+ v_rel_id:= dotlrn_member_rel.new(
+ rel_id => rel_id,
+ rel_type => rel_type,
+ community_id => community_id,
+ user_id => user_id,
+ member_state => dotlrn_admin_rel.new.member_state,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_admin_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_admin_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_admin_rels
+ where rel_id = dotlrn_admin_rel.del.rel_id;
+
+ dotlrn_member_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors;
+
+create or replace package dotlrn_student_rel
+is
+
+ function new (
+ rel_id in dotlrn_student_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_student_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_student_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_student_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors;
+
+create or replace package body dotlrn_student_rel
+is
+
+ function new (
+ rel_id in dotlrn_student_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_student_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_student_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_student_rels.rel_id%TYPE;
+ begin
+ v_rel_id:= dotlrn_member_rel.new(
+ rel_id => rel_id,
+ rel_type => rel_type,
+ community_id => class_instance_id,
+ user_id => user_id,
+ member_state => dotlrn_student_rel.new.member_state,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_student_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_student_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_student_rels
+ where rel_id = dotlrn_student_rel.del.rel_id;
+
+ dotlrn_member_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors;
+
+create or replace package dotlrn_ta_rel
+is
+
+ function new (
+ rel_id in dotlrn_ta_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_ta_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_ta_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_ta_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors;
+
+create or replace package body dotlrn_ta_rel
+is
+
+ function new (
+ rel_id in dotlrn_ta_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_ta_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_ta_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_ta_rels.rel_id%TYPE;
+ begin
+ v_rel_id:= dotlrn_admin_rel.new(
+ rel_id => rel_id,
+ rel_type => rel_type,
+ community_id => class_instance_id,
+ user_id => user_id,
+ member_state => dotlrn_ta_rel.new.member_state,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_ta_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_ta_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_ta_rels
+ where rel_id = dotlrn_ta_rel.del.rel_id;
+
+ dotlrn_admin_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors;
+
+create or replace package dotlrn_ca_rel
+is
+
+ function new (
+ rel_id in dotlrn_ca_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_ca_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_ca_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_ca_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors;
+
+create or replace package body dotlrn_ca_rel
+is
+
+ function new (
+ rel_id in dotlrn_ca_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_ca_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_ca_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_ca_rels.rel_id%TYPE;
+ begin
+ v_rel_id:= dotlrn_admin_rel.new(
+ rel_id => rel_id,
+ rel_type => rel_type,
+ community_id => class_instance_id,
+ user_id => user_id,
+ member_state => dotlrn_ca_rel.new.member_state,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_ca_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_ca_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_ca_rels
+ where rel_id = dotlrn_ca_rel.del.rel_id;
+
+ dotlrn_admin_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors;
+
+create or replace package dotlrn_cadmin_rel
+is
+
+ function new (
+ rel_id in dotlrn_cadmin_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_cadmin_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_cadmin_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_cadmin_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors;
+
+create or replace package body dotlrn_cadmin_rel
+is
+
+ function new (
+ rel_id in dotlrn_cadmin_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_cadmin_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_cadmin_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_cadmin_rels.rel_id%TYPE;
+ begin
+ v_rel_id:= dotlrn_admin_rel.new(
+ rel_id => rel_id,
+ rel_type => rel_type,
+ community_id => class_instance_id,
+ user_id => user_id,
+ member_state => dotlrn_cadmin_rel.new.member_state,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_cadmin_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_cadmin_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_cadmin_rels
+ where rel_id = dotlrn_cadmin_rel.del.rel_id;
+
+ dotlrn_admin_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors;
+
+create or replace package dotlrn_instructor_rel
+is
+
+ function new (
+ rel_id in dotlrn_instructor_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_instructor_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_instructor_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_instructor_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors;
+
+create or replace package body dotlrn_instructor_rel
+is
+
+ function new (
+ rel_id in dotlrn_instructor_rels.rel_id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_instructor_rel',
+ class_instance_id in dotlrn_class_instances.class_instance_id%TYPE,
+ user_id in users.user_id%TYPE,
+ member_state in membership_rels.member_state%TYPE default 'approved',
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_instructor_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_instructor_rels.rel_id%TYPE;
+ begin
+ v_rel_id:= dotlrn_admin_rel.new(
+ rel_id => rel_id,
+ rel_type => rel_type,
+ community_id => class_instance_id,
+ user_id => user_id,
+ member_state => dotlrn_instructor_rel.new.member_state,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_instructor_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_instructor_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_instructor_rels
+ where rel_id = dotlrn_instructor_rel.del.rel_id;
+
+ dotlrn_admin_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors;
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+--
+-- Create the External package
+--
+-- @author yon@openforce.net
+-- @version $Id: upgrade-1.0-1.0d1.sql,v 1.1 2003/10/08 16:03:58 mohanp Exp $
+--
+
+create or replace package dotlrn_external_profile_rel
+as
+ function new (
+ rel_id in dotlrn_external_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_external_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_external_profile_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors
+
+create or replace package body dotlrn_external_profile_rel
+as
+ function new (
+ rel_id in dotlrn_external_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_external_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_user_profile_rels.rel_id%TYPE;
+ v_group_id groups.group_id%TYPE;
+ begin
+ if group_id is null then
+ select min(group_id)
+ into v_group_id
+ from profiled_groups
+ where profile_provider = (select min(impl_id)
+ from acs_sc_impls
+ where impl_name = 'dotlrn_external_profile_provider');
+ else
+ v_group_id := group_id;
+ end if;
+
+ v_rel_id := dotlrn_user_profile_rel.new(
+ rel_id => rel_id,
+ user_id => user_id,
+ portal_id => portal_id,
+ theme_id => theme_id,
+ id => id,
+ rel_type => rel_type,
+ group_id => v_group_id,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_external_profile_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_external_profile_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_external_profile_rels
+ where rel_id = dotlrn_external_profile_rel.del.rel_id;
+
+ dotlrn_user_profile_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+--
+-- Create the Professor package
+--
+-- @author yon@openforce.net
+-- @version $Id: upgrade-1.0-1.0d1.sql,v 1.1 2003/10/08 16:03:58 mohanp Exp $
+--
+
+create or replace package dotlrn_professor_profile_rel
+as
+ function new (
+ rel_id in dotlrn_professor_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_professor_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_professor_profile_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors
+
+create or replace package body dotlrn_professor_profile_rel
+as
+ function new (
+ rel_id in dotlrn_professor_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_professor_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_user_profile_rels.rel_id%TYPE;
+ v_group_id groups.group_id%TYPE;
+ begin
+ if group_id is null then
+ select min(group_id)
+ into v_group_id
+ from profiled_groups
+ where profile_provider = (select min(impl_id)
+ from acs_sc_impls
+ where impl_name = 'dotlrn_professor_profile_provider');
+ else
+ v_group_id := group_id;
+ end if;
+
+ v_rel_id := dotlrn_user_profile_rel.new(
+ rel_id => rel_id,
+ user_id => user_id,
+ portal_id => portal_id,
+ theme_id => theme_id,
+ id => id,
+ rel_type => rel_type,
+ group_id => v_group_id,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_professor_profile_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_professor_profile_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_professor_profile_rels
+ where rel_id = dotlrn_professor_profile_rel.del.rel_id;
+
+ dotlrn_user_profile_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+--
+-- Create the Student package
+--
+-- @author yon@openforce.net
+-- @version $Id: upgrade-1.0-1.0d1.sql,v 1.1 2003/10/08 16:03:58 mohanp Exp $
+--
+
+create or replace package dotlrn_student_profile_rel
+as
+ function new (
+ rel_id in dotlrn_student_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_student_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_student_profile_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors
+
+create or replace package body dotlrn_student_profile_rel
+as
+ function new (
+ rel_id in dotlrn_student_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_student_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE
+ is
+ v_rel_id dotlrn_user_profile_rels.rel_id%TYPE;
+ v_group_id groups.group_id%TYPE;
+ begin
+ if group_id is null then
+ select min(group_id)
+ into v_group_id
+ from profiled_groups
+ where profile_provider = (select min(impl_id)
+ from acs_sc_impls
+ where impl_name = 'dotlrn_student_profile_provider');
+ else
+ v_group_id := group_id;
+ end if;
+
+ v_rel_id := dotlrn_user_profile_rel.new(
+ rel_id => rel_id,
+ user_id => user_id,
+ portal_id => portal_id,
+ theme_id => theme_id,
+ id => id,
+ rel_type => rel_type,
+ group_id => v_group_id,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_student_profile_rels
+ (rel_id)
+ values
+ (v_rel_id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_student_profile_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_student_profile_rels
+ where rel_id = dotlrn_student_profile_rel.del.rel_id;
+
+ dotlrn_user_profile_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+--
+-- Create the User Profile package
+--
+-- @author yon@openforce.net
+-- @version $Id: upgrade-1.0-1.0d1.sql,v 1.1 2003/10/08 16:03:58 mohanp Exp $
+--
+
+create or replace package dotlrn_user_profile_rel
+as
+ function new (
+ rel_id in dotlrn_user_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_user_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE;
+
+ procedure del (
+ rel_id in dotlrn_user_profile_rels.rel_id%TYPE
+ );
+
+end;
+/
+show errors
+
+create or replace package body dotlrn_user_profile_rel
+as
+ function new (
+ rel_id in dotlrn_user_profile_rels.rel_id%TYPE default null,
+ user_id in users.user_id%TYPE,
+ portal_id in dotlrn_user_profile_rels.portal_id%TYPE,
+ theme_id in dotlrn_user_profile_rels.theme_id%TYPE default null,
+ id in dotlrn_user_profile_rels.id%TYPE default null,
+ rel_type in acs_rels.rel_type%TYPE default 'dotlrn_user_profile_rel',
+ group_id in groups.group_id%TYPE default null,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null
+ ) return dotlrn_user_profile_rels.rel_id%TYPE
+ is
+ v_rel_id user_profile_rels.rel_id%TYPE;
+ v_group_id groups.group_id%TYPE;
+ begin
+ if group_id is null then
+ select min(group_id)
+ into v_group_id
+ from profiled_groups
+ where profile_provider = (select min(impl_id)
+ from acs_sc_impls
+ where impl_name = 'dotlrn_user_profile_provider');
+ else
+ v_group_id := group_id;
+ end if;
+
+ v_rel_id := user_profile_rel.new(
+ rel_id => rel_id,
+ rel_type => rel_type,
+ group_id => v_group_id,
+ user_id => user_id,
+ creation_user => creation_user,
+ creation_ip => creation_ip
+ );
+
+ insert
+ into dotlrn_user_profile_rels
+ (rel_id, portal_id, theme_id, id)
+ values
+ (v_rel_id, portal_id, theme_id, id);
+
+ return v_rel_id;
+ end;
+
+ procedure del (
+ rel_id in dotlrn_user_profile_rels.rel_id%TYPE
+ )
+ is
+ begin
+ delete
+ from dotlrn_user_profile_rels
+ where rel_id = dotlrn_user_profile_rel.del.rel_id;
+
+ user_profile_rel.del(rel_id);
+ end;
+
+end;
+/
+show errors
Index: openacs-4/packages/new-portal/sql/oracle/upgrade/upgrade-0.1a-0.2d1.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/new-portal/sql/oracle/upgrade/upgrade-0.1a-0.2d1.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/new-portal/sql/oracle/upgrade/upgrade-0.1a-0.2d1.sql 8 Oct 2003 16:03:58 -0000 1.1
@@ -0,0 +1,593 @@
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+--
+-- The New Portal Package
+-- copyright 2001, MIT
+-- distributed under the GNU GPL v2
+--
+-- @author Arjun Sanyal (arjun@openforce.net)
+-- @version $Id: upgrade-0.1a-0.2d1.sql,v 1.1 2003/10/08 16:03:58 mohanp Exp $
+--
+
+create or replace package portal_page
+as
+
+ function new (
+ page_id in portal_pages.page_id%TYPE default null,
+ pretty_name in portal_pages.pretty_name%TYPE default 'Untitled Page',
+ portal_id in portal_pages.portal_id%TYPE,
+ layout_id in portal_pages.layout_id%TYPE default null,
+ object_type in acs_object_types.object_type%TYPE default 'portal_page',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portal_pages.page_id%TYPE;
+
+ procedure del (
+ page_id in portal_pages.page_id%TYPE
+ );
+
+end portal_page;
+/
+show errors
+
+create or replace package body portal_page
+as
+
+ function new (
+ page_id in portal_pages.page_id%TYPE default null,
+ pretty_name in portal_pages.pretty_name%TYPE default 'Untitled Page',
+ portal_id in portal_pages.portal_id%TYPE,
+ layout_id in portal_pages.layout_id%TYPE default null,
+ object_type in acs_object_types.object_type%TYPE default 'portal_page',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portal_pages.page_id%TYPE
+ is
+ v_page_id portal_pages.page_id%TYPE;
+ v_layout_id portal_pages.layout_id%TYPE;
+ v_sort_key portal_pages.sort_key%TYPE;
+ begin
+
+ v_page_id := acs_object.new(
+ object_type => object_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ if layout_id is null then
+ select min(layout_id)
+ into v_layout_id
+ from portal_layouts;
+ else
+ v_layout_id := layout_id;
+ end if;
+
+ select nvl(max(sort_key) + 1, 0)
+ into v_sort_key
+ from portal_pages
+ where portal_id = portal_page.new.portal_id;
+
+ insert into portal_pages
+ (page_id, pretty_name, portal_id, layout_id, sort_key)
+ values
+ (v_page_id, pretty_name, portal_id, v_layout_id, v_sort_key);
+
+ return v_page_id;
+
+ end new;
+
+ procedure del (
+ page_id in portal_pages.page_id%TYPE
+ )
+ is
+ v_portal_id portal_pages.portal_id%TYPE;
+ v_sort_key portal_pages.sort_key%TYPE;
+ v_curr_sort_key portal_pages.sort_key%TYPE;
+ v_page_count_from_0 integer;
+ begin
+
+ -- IMPORTANT: sort keys MUST be an unbroken sequence from 0 to max(sort_key)
+
+ select portal_id, sort_key
+ into v_portal_id, v_sort_key
+ from portal_pages
+ where page_id = portal_page.del.page_id;
+
+ select (count(*) - 1)
+ into v_page_count_from_0
+ from portal_pages
+ where portal_id = v_portal_id;
+
+ for i in 0 .. v_page_count_from_0 loop
+
+ if i = v_sort_key then
+
+ delete
+ from portal_pages
+ where page_id = portal_page.del.page_id;
+
+ elsif i > v_sort_key then
+
+ update portal_pages
+ set sort_key = -1
+ where sort_key = i;
+
+ update portal_pages
+ set sort_key = i - 1
+ where sort_key = -1;
+
+ end if;
+
+ end loop;
+
+ acs_object.del(page_id);
+
+ end del;
+
+end portal_page;
+/
+show errors
+
+create or replace package portal
+as
+
+ function new (
+ portal_id in portals.portal_id%TYPE default null,
+ name in portals.name%TYPE default 'Untitled',
+ theme_id in portals.theme_id%TYPE default null,
+ layout_id in portal_layouts.layout_id%TYPE default null,
+ template_id in portals.template_id%TYPE default null,
+ default_page_name in portal_pages.pretty_name%TYPE default 'Main Page',
+ object_type in acs_object_types.object_type%TYPE default 'portal',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portals.portal_id%TYPE;
+
+ procedure del (
+ portal_id in portals.portal_id%TYPE
+ );
+end portal;
+/
+show errors
+
+create or replace package body portal
+as
+ function new (
+ portal_id in portals.portal_id%TYPE default null,
+ name in portals.name%TYPE default 'Untitled',
+ theme_id in portals.theme_id%TYPE default null,
+ layout_id in portal_layouts.layout_id%TYPE default null,
+ template_id in portals.template_id%TYPE default null,
+ default_page_name in portal_pages.pretty_name%TYPE default 'Main Page',
+ object_type in acs_object_types.object_type%TYPE default 'portal',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portals.portal_id%TYPE
+ is
+ v_portal_id portals.portal_id%TYPE;
+ v_theme_id portals.theme_id%TYPE;
+ v_layout_id portal_layouts.layout_id%TYPE;
+ v_page_id portal_pages.page_id%TYPE;
+ v_new_element_id portal_element_map.element_id%TYPE;
+ v_new_parameter_id portal_element_parameters.parameter_id%TYPE;
+ begin
+
+ v_portal_id := acs_object.new(
+ object_id => portal_id,
+ object_type => object_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ if template_id is null then
+
+ if portal.new.theme_id is null then
+ select max(theme_id)
+ into v_theme_id
+ from portal_element_themes;
+ else
+ v_theme_id := portal.new.theme_id;
+ end if;
+
+ if layout_id is null then
+ select min(layout_id)
+ into v_layout_id
+ from portal_layouts;
+ else
+ v_layout_id := portal.new.layout_id;
+ end if;
+
+ insert
+ into portals
+ (portal_id, name, theme_id)
+ values
+ (v_portal_id, name, v_theme_id);
+
+ -- now insert the default page
+ v_page_id := portal_page.new (
+ portal_id => v_portal_id,
+ pretty_name => default_page_name,
+ layout_id => v_layout_id,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ else
+
+ -- we have a portal as our template. copy it's theme, pages, layouts,
+ -- elements, and element params.
+ select theme_id
+ into v_theme_id
+ from portals
+ where portal_id = portal.new.template_id;
+
+ insert
+ into portals
+ (portal_id, name, theme_id, template_id)
+ values
+ (v_portal_id, name, v_theme_id, portal.new.template_id);
+
+ -- now insert the pages from the portal template
+ for page in (select *
+ from portal_pages
+ where portal_id = portal.new.template_id)
+ loop
+
+ v_page_id := portal_page.new(
+ portal_id => v_portal_id,
+ pretty_name => page.pretty_name,
+ layout_id => page.layout_id
+ );
+
+ -- now get the elements on the template's page and put them on the new page
+ for element in (select *
+ from portal_element_map
+ where page_id = page.page_id)
+ loop
+
+ select acs_object_id_seq.nextval
+ into v_new_element_id
+ from dual;
+
+ insert
+ into portal_element_map
+ (element_id, name, pretty_name, page_id, datasource_id, region, state, sort_key)
+ select v_new_element_id, name, pretty_name, v_page_id, datasource_id, region, state, sort_key
+ from portal_element_map pem
+ where pem.element_id = element.element_id;
+
+ -- now for the element's params
+ for param in (select *
+ from portal_element_parameters
+ where element_id = element.element_id)
+ loop
+
+ select acs_object_id_seq.nextval
+ into v_new_parameter_id
+ from dual;
+
+ insert
+ into portal_element_parameters
+ (parameter_id, element_id, config_required_p, configured_p, key, value)
+ select v_new_parameter_id, v_new_element_id, config_required_p, configured_p, key, value
+ from portal_element_parameters
+ where parameter_id = param.parameter_id;
+
+ end loop;
+
+ end loop;
+
+ end loop;
+
+ end if;
+
+ return v_portal_id;
+
+ end new;
+
+ procedure del (
+ portal_id in portals.portal_id%TYPE
+ )
+ is
+ begin
+
+ for page in (select page_id
+ from portal_pages
+ where portal_id = portal.del.portal_id
+ order by sort_key desc)
+ loop
+ portal_page.del(page_id => page.page_id);
+ end loop;
+
+ acs_object.del(portal_id);
+
+ end del;
+
+end portal;
+/
+show errors
+
+create or replace package portal_element_theme
+as
+ function new (
+ theme_id in portal_element_themes.theme_id%TYPE default null,
+ name in portal_element_themes.name%TYPE,
+ description in portal_element_themes.description%TYPE default null,
+ filename in portal_element_themes.filename%TYPE,
+ resource_dir in portal_element_themes.resource_dir%TYPE,
+ object_type in acs_object_types.object_type%TYPE default 'portal_element_theme',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portal_element_themes.theme_id%TYPE;
+
+ procedure del (
+ theme_id in portal_element_themes.theme_id%TYPE
+ );
+
+end portal_element_theme;
+/
+show errors
+
+create or replace package body portal_element_theme
+as
+ function new (
+ theme_id in portal_element_themes.theme_id%TYPE default null,
+ name in portal_element_themes.name%TYPE,
+ description in portal_element_themes.description%TYPE default null,
+ filename in portal_element_themes.filename%TYPE,
+ resource_dir in portal_element_themes.resource_dir%TYPE,
+ object_type in acs_object_types.object_type%TYPE default 'portal_element_theme',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portal_element_themes.theme_id%TYPE
+ is
+ v_theme_id portal_element_themes.theme_id%TYPE;
+ begin
+
+ v_theme_id := acs_object.new(
+ object_id => theme_id,
+ object_type => object_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ insert
+ into portal_element_themes
+ (theme_id, name, description, filename, resource_dir)
+ values
+ (v_theme_id, name, description, filename, resource_dir);
+
+ return v_theme_id;
+
+ end new;
+
+ procedure del (
+ theme_id in portal_element_themes.theme_id%TYPE
+ )
+ is
+ begin
+ acs_object.del(theme_id);
+ end del;
+
+end portal_element_theme;
+/
+show errors
+
+create or replace package portal_layout
+as
+
+ function new (
+ layout_id in portal_layouts.layout_id%TYPE default null,
+ name in portal_layouts.name%TYPE,
+ description in portal_layouts.description%TYPE default null,
+ filename in portal_layouts.filename%TYPE,
+ resource_dir in portal_layouts.resource_dir%TYPE,
+ object_type in acs_object_types.object_type%TYPE default 'portal_layout',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portal_layouts.layout_id%TYPE;
+
+ procedure del (
+ layout_id in portal_layouts.layout_id%TYPE
+ );
+
+ procedure add_region (
+ layout_id in portal_supported_regions.layout_id%TYPE,
+ region in portal_supported_regions.region%TYPE,
+ immutable_p in portal_supported_regions.immutable_p%TYPE default 'f'
+ );
+
+end portal_layout;
+/
+show errors
+
+create or replace package body portal_layout
+as
+ function new (
+ layout_id in portal_layouts.layout_id%TYPE default null,
+ name in portal_layouts.name%TYPE,
+ description in portal_layouts.description%TYPE default null,
+ filename in portal_layouts.filename%TYPE,
+ resource_dir in portal_layouts.resource_dir%TYPE,
+ object_type in acs_object_types.object_type%TYPE default 'portal_layout',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portal_layouts.layout_id%TYPE
+ is
+ v_layout_id portal_layouts.layout_id%TYPE;
+ begin
+
+ v_layout_id := acs_object.new(
+ object_id => layout_id,
+ object_type => object_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ insert into portal_layouts
+ (layout_id, name, description, filename, resource_dir)
+ values
+ (v_layout_id, name, description, filename, resource_dir);
+
+ return v_layout_id;
+
+ end new;
+
+ procedure del (
+ layout_id in portal_layouts.layout_id%TYPE
+ )
+ is
+ begin
+ acs_object.del(layout_id);
+ end del;
+
+ procedure add_region (
+ layout_id in portal_supported_regions.layout_id%TYPE,
+ region in portal_supported_regions.region%TYPE,
+ immutable_p in portal_supported_regions.immutable_p%TYPE default 'f'
+ )
+ is
+ begin
+ insert
+ into portal_supported_regions
+ (layout_id, region, immutable_p)
+ values (layout_id, region, immutable_p);
+ end add_region;
+
+end portal_layout;
+/
+show errors
+
+create or replace package portal_datasource
+as
+
+ function new (
+ datasource_id in portal_datasources.datasource_id%TYPE default null,
+ name in portal_datasources.name%TYPE default null,
+ description in portal_datasources.description%TYPE default null,
+ object_type in acs_object_types.object_type%TYPE default 'portal_datasource',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portal_datasources.datasource_id%TYPE;
+
+ procedure del (
+ datasource_id in portal_datasources.datasource_id%TYPE
+ );
+
+ procedure set_def_param (
+ datasource_id in portal_datasource_def_params.datasource_id%TYPE,
+ config_required_p in portal_datasource_def_params.config_required_p%TYPE default null,
+ configured_p in portal_datasource_def_params.configured_p%TYPE default null,
+ key in portal_datasource_def_params.key%TYPE,
+ value in portal_datasource_def_params.value%TYPE default null
+ );
+
+end portal_datasource;
+/
+show errors
+
+create or replace package body portal_datasource
+as
+
+ function new (
+ datasource_id in portal_datasources.datasource_id%TYPE default null,
+ name in portal_datasources.name%TYPE default null,
+ description in portal_datasources.description%TYPE default null,
+ object_type in acs_object_types.object_type%TYPE default 'portal_datasource',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return portal_datasources.datasource_id%TYPE
+ is
+ v_datasource_id portal_datasources.datasource_id%TYPE;
+ begin
+
+ v_datasource_id := acs_object.new(
+ object_id => datasource_id,
+ object_type => object_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ insert into portal_datasources
+ (datasource_id, name, description)
+ values
+ (v_datasource_id, name, description);
+
+ return v_datasource_id;
+
+ end new;
+
+ procedure del (
+ datasource_id in portal_datasources.datasource_id%TYPE
+ )
+ is
+ begin
+ acs_object.del(datasource_id);
+ end del;
+
+ procedure set_def_param (
+ datasource_id in portal_datasource_def_params.datasource_id%TYPE,
+ config_required_p in portal_datasource_def_params.config_required_p%TYPE default null,
+ configured_p in portal_datasource_def_params.configured_p%TYPE default null,
+ key in portal_datasource_def_params.key%TYPE,
+ value in portal_datasource_def_params.value%TYPE default null
+ )
+ is
+ begin
+
+ insert into portal_datasource_def_params
+ (parameter_id, datasource_id, config_required_p, configured_p, key, value)
+ values
+ (acs_object_id_seq.nextval, datasource_id, config_required_p, configured_p, key, value);
+
+ end set_def_param;
+
+end portal_datasource;
+/
+show errors
Index: openacs-4/packages/static-portlet/sql/oracle/upgrade/upgrade-0.1a-0.2a.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/static-portlet/sql/oracle/upgrade/upgrade-0.1a-0.2a.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/static-portlet/sql/oracle/upgrade/upgrade-0.1a-0.2a.sql 8 Oct 2003 16:03:58 -0000 1.1
@@ -0,0 +1,96 @@
+--
+-- Copyright (C) 2001, 2002 MIT
+--
+-- This file is part of dotLRN.
+--
+-- dotLRN is free software; you can redistribute it and/or modify it under the
+-- terms of the GNU General Public License as published by the Free Software
+-- Foundation; either version 2 of the License, or (at your option) any later
+-- version.
+--
+-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+-- details.
+--
+
+--
+-- static-core.sql
+--
+-- arjun@openforce.net
+--
+-- The core DM and API for static portal content
+--
+-- $Id: upgrade-0.1a-0.2a.sql,v 1.1 2003/10/08 16:03:58 mohanp Exp $
+--
+
+--
+-- API
+--
+
+create or replace package static_portal_content_item
+as
+ function new (
+ package_id in static_portal_content.package_id%TYPE default null,
+ pretty_name in static_portal_content.pretty_name%TYPE default null,
+ content in static_portal_content.content%TYPE default null,
+ object_type in acs_objects.object_type%TYPE default 'static_portal_content',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return acs_objects.object_id%TYPE;
+
+ procedure del (
+ content_id in static_portal_content.content_id%TYPE
+ );
+
+end static_portal_content_item;
+/
+show errors
+
+create or replace package body static_portal_content_item
+as
+ function new (
+ package_id in static_portal_content.package_id%TYPE default null,
+ pretty_name in static_portal_content.pretty_name%TYPE default null,
+ content in static_portal_content.content%TYPE default null,
+ object_type in acs_objects.object_type%TYPE default 'static_portal_content',
+ creation_date in acs_objects.creation_date%TYPE default sysdate,
+ creation_user in acs_objects.creation_user%TYPE default null,
+ creation_ip in acs_objects.creation_ip%TYPE default null,
+ context_id in acs_objects.context_id%TYPE default null
+ ) return acs_objects.object_id%TYPE
+ is
+ v_content_id static_portal_content.content_id%TYPE;
+ begin
+ v_content_id := acs_object.new (
+ object_type => object_type,
+ creation_date => creation_date,
+ creation_user => creation_user,
+ creation_ip => creation_ip,
+ context_id => context_id
+ );
+
+ insert into static_portal_content
+ (content_id, package_id, pretty_name, content)
+ values
+ (v_content_id, new.package_id, new.pretty_name, new.content);
+
+ return v_content_id;
+ end new;
+
+ procedure del (
+ content_id in static_portal_content.content_id%TYPE
+ )
+ is
+ begin
+ delete from static_portal_content where content_id = content_id;
+
+ acs_object.del(content_id);
+ end del;
+
+end static_portal_content_item;
+/
+show errors
+