Index: openacs-4/packages/acs-bootstrap-installer/installer/install-data-model.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-bootstrap-installer/installer/Attic/install-data-model.tcl,v
diff -u -N -r1.5.4.1 -r1.5.4.2
--- openacs-4/packages/acs-bootstrap-installer/installer/install-data-model.tcl 5 Mar 2003 14:41:49 -0000 1.5.4.1
+++ openacs-4/packages/acs-bootstrap-installer/installer/install-data-model.tcl 20 Mar 2003 22:09:52 -0000 1.5.4.2
@@ -72,7 +72,7 @@
-This might really take a few minutes, depending on your machine. Have a cup of coffee or beer or whatever and be patient. Thanks.
+This might really take a few minutes, depending on your machine. Please be patient. Thanks.
Index: openacs-4/packages/acs-content-repository/acs-content-repository.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/acs-content-repository.info,v
diff -u -N -r1.17.2.5 -r1.17.2.6
--- openacs-4/packages/acs-content-repository/acs-content-repository.info 5 Mar 2003 14:49:00 -0000 1.17.2.5
+++ openacs-4/packages/acs-content-repository/acs-content-repository.info 20 Mar 2003 22:10:07 -0000 1.17.2.6
@@ -6,168 +6,24 @@
ACS Content Repository Services
t
t
-
-
-
- oracle
- postgresql
-
+
+
Karl Goldstein
Dan Wickstrom
A canonical repository for all OpenACS content.
2002-10-27
OpenACS
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
Index: openacs-4/packages/acs-content-repository/sql/oracle/content-extlink.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/oracle/content-extlink.sql,v
diff -u -N -r1.1 -r1.1.4.1
--- openacs-4/packages/acs-content-repository/sql/oracle/content-extlink.sql 24 Mar 2001 22:00:48 -0000 1.1
+++ openacs-4/packages/acs-content-repository/sql/oracle/content-extlink.sql 20 Mar 2003 22:10:27 -0000 1.1.4.1
@@ -100,8 +100,62 @@
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
-
Index: openacs-4/packages/acs-content-repository/sql/oracle/content-item.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/oracle/content-item.sql,v
diff -u -N -r1.10.2.1 -r1.10.2.2
--- openacs-4/packages/acs-content-repository/sql/oracle/content-item.sql 27 Feb 2003 13:45:29 -0000 1.10.2.1
+++ openacs-4/packages/acs-content-repository/sql/oracle/content-item.sql 20 Mar 2003 22:10:27 -0000 1.10.2.2
@@ -1286,6 +1286,14 @@
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
Index: openacs-4/packages/acs-content-repository/sql/oracle/packages-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/oracle/packages-create.sql,v
diff -u -N -r1.7 -r1.7.2.1
--- openacs-4/packages/acs-content-repository/sql/oracle/packages-create.sql 25 May 2002 14:30:02 -0000 1.7
+++ openacs-4/packages/acs-content-repository/sql/oracle/packages-create.sql 20 Mar 2003 22:10:27 -0000 1.7.2.1
@@ -1142,6 +1142,12 @@
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;
/
Index: openacs-4/packages/acs-content-repository/sql/oracle/upgrade/upgrade-4.6.4-4.6.5.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/oracle/upgrade/upgrade-4.6.4-4.6.5.sql,v
diff -u -N
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-content-repository/sql/oracle/upgrade/upgrade-4.6.4-4.6.5.sql 20 Mar 2003 22:10:53 -0000 1.1.2.1
@@ -0,0 +1,1908 @@
+
+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 delete (
+ --/** 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
+
+-- 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.6.4-4.6.5.sql,v 1.1.2.1 2003/03/20 22:10:53 donb 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 delete (
+ extlink_id in cr_extlinks.extlink_id%TYPE
+) is
+begin
+
+ delete from cr_extlinks
+ where extlink_id = content_extlink.delete.extlink_id;
+
+ content_item.delete(content_extlink.delete.extlink_id);
+
+end delete;
+
+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
+
+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
+
+ 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) = '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
+ if v_parent_id ^= 0 and
+ content_folder.is_folder(v_parent_id) = 'f' and
+ content_item.is_valid_child(v_parent_id,
+ content_item.new.content_type) = 't' then
+
+ v_rel_id := acs_object.new(
+ object_type => 'cr_item_child_rel',
+ context_id => v_parent_id
+ );
+
+ 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;
+
+ 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
+) 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;
+
+ 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;
+
+ 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 delete (
+ 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.delete.item_id;
+
+ cursor c_revision_cur is
+ select
+ revision_id
+ from
+ cr_revisions
+ where
+ item_id = content_item.delete.item_id;
+
+ cursor c_rel_cur is
+ select
+ rel_id
+ from
+ cr_item_rels
+ where
+ item_id = content_item.delete.item_id
+ or
+ related_object_id = content_item.delete.item_id;
+
+ cursor c_child_cur is
+ select
+ rel_id
+ from
+ cr_child_rels
+ where
+ child_id = content_item.delete.item_id;
+
+ cursor c_parent_cur is
+ select
+ rel_id, child_id
+ from
+ cr_child_rels
+ where
+ parent_id = content_item.delete.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.delete(v_symlink_val.symlink_id);
+ end loop;
+
+ dbms_output.put_line('Unscheduling item...');
+ delete from cr_release_periods
+ where item_id = content_item.delete.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.delete.item_id;
+ for v_revision_val in c_revision_cur loop
+ content_revision.delete(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.delete.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.delete(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.delete(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.delete(v_rel_val.rel_id);
+ content_item.delete(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.delete.item_id;
+
+ dbms_output.put_line('Deleting keyword associations...');
+ -- 6) delete keyword associations
+ delete from cr_item_keyword_map
+ where item_id = content_item.delete.item_id;
+
+ dbms_output.put_line('Deleting associated comments...');
+ -- 7) delete associated comments
+ journal_entry.delete_for_object( content_item.delete.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.delete(content_item.delete.item_id);
+
+end delete;
+
+
+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 = rename.name
+ and
+ parent_id = (select
+ parent_id
+ from
+ cr_items
+ where
+ item_id = rename.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 = rename.name
+ where item_id = rename.item_id;
+ else
+ close exists_cur;
+ if exists_id <> rename.item_id then
+ raise_application_error(-20000,
+ 'An item with the name ' || rename.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.delete( 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
Index: openacs-4/packages/acs-content-repository/sql/postgresql/content-extlink.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/content-extlink.sql,v
diff -u -N -r1.7.4.2 -r1.7.4.3
--- openacs-4/packages/acs-content-repository/sql/postgresql/content-extlink.sql 1 Mar 2003 21:21:20 -0000 1.7.4.2
+++ openacs-4/packages/acs-content-repository/sql/postgresql/content-extlink.sql 20 Mar 2003 22:11:07 -0000 1.7.4.3
@@ -10,8 +10,6 @@
-- 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
--- function new
create function content_extlink__new (varchar,varchar,varchar,varchar,integer,integer,timestamptz,integer,varchar)
returns integer as '
declare
@@ -70,8 +68,6 @@
end;' language 'plpgsql';
-
--- procedure delete
create function content_extlink__delete (integer)
returns integer as '
declare
@@ -87,7 +83,6 @@
end;' language 'plpgsql';
--- function is_extlink
create function content_extlink__is_extlink (integer)
returns boolean as '
declare
@@ -106,8 +101,66 @@
end;' language 'plpgsql';
+create function content_extlink__copy (integer,integer,integer,varchar)
+returns integer as '
+declare
+ copy__extlink_id alias for $1;
+ copy__target_folder_id alias for $2;
+ copy__creation_user alias for $3;
+ copy__creation_ip alias for $4; -- default null
+ v_current_folder_id cr_folders.folder_id%TYPE;
+ v_name cr_items.name%TYPE;
+ v_url cr_extlinks.url%TYPE;
+ v_description cr_extlinks.description%TYPE;
+ v_label cr_extlinks.label%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;
--- show errors
+ -- can''t copy to the same folder
+ if copy__target_folder_id != v_current_folder_id then
+ select
+ i.name, e.url, e.description, e.label
+ into
+ v_name, v_url, v_description, v_label
+ 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'',''f'') = ''t'' then
+
+ v_extlink_id := content_extlink__new(
+ v_name,
+ v_url,
+ v_label,
+ v_description,
+ copy__target_folder_id,
+ null,
+ current_timestamp,
+ copy__creation_user,
+ copy__creation_ip
+ );
+
+ end if;
+ end if;
+ end if;
+
+ return 0;
+end;' language 'plpgsql';
+
+
+
Index: openacs-4/packages/acs-content-repository/sql/postgresql/content-item.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/content-item.sql,v
diff -u -N -r1.39.2.3 -r1.39.2.4
--- openacs-4/packages/acs-content-repository/sql/postgresql/content-item.sql 1 Mar 2003 21:21:20 -0000 1.39.2.3
+++ openacs-4/packages/acs-content-repository/sql/postgresql/content-item.sql 20 Mar 2003 22:11:07 -0000 1.39.2.4
@@ -26,17 +26,6 @@
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;
-
select i2.item_id into v_folder_id
from cr_items i1, cr_items i2
where i2.parent_id = 0
@@ -52,8 +41,6 @@
end;' language 'plpgsql';
-
--- function new
create function content_item__new (varchar,integer,integer,varchar,timestamptz,integer,integer,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar)
returns integer as '
declare
@@ -73,8 +60,6 @@
new__nls_language alias for $14; -- default null
new__text alias for $15; -- default null
new__storage_type alias for $16; -- check in (''text'',''file'')
--- relation_tag alias for $17;
--- is_live alias for $18;
new__relation_tag varchar default null;
new__is_live boolean default ''f'';
@@ -231,8 +216,6 @@
new__nls_language alias for $14; -- default null
-- changed to integer for blob_id
new__data alias for $15; -- default null
--- relation_tag alias for $17;
--- is_live alias for $18;
new__relation_tag varchar default null;
new__is_live boolean default ''f'';
@@ -577,7 +560,6 @@
end;' language 'plpgsql';
--- function is_published
create function content_item__is_published (integer)
returns boolean as '
declare
@@ -598,7 +580,6 @@
end;' language 'plpgsql';
--- function is_publishable
create function content_item__is_publishable (integer)
returns boolean as '
declare
@@ -706,7 +687,6 @@
end;' language 'plpgsql';
--- function is_valid_child
create function content_item__is_valid_child (integer,varchar)
returns boolean as '
declare
@@ -769,7 +749,7 @@
5) delete all permissions associated with this item
6) delete keyword associations
7) delete all associated comments */
--- procedure delete
+
create function content_item__delete (integer)
returns integer as '
declare
@@ -895,7 +875,6 @@
end;' language 'plpgsql';
--- procedure rename
create function content_item__rename (integer,varchar)
returns integer as '
declare
@@ -931,7 +910,6 @@
return 0;
end;' language 'plpgsql';
--- function get_id
create function content_item__get_id (varchar,integer,boolean)
returns integer as '
declare
@@ -1013,10 +991,6 @@
return child_id;
--- exception
--- when NO_DATA_FOUND then
--- return null;
-
end;' language 'plpgsql';
create sequence content_item_gp_session_id;
@@ -1284,7 +1258,6 @@
end;' language 'plpgsql';
--- function get_virtual_path
create function content_item__get_virtual_path (integer,integer)
returns varchar as '
declare
@@ -1310,14 +1283,10 @@
end if;
return v_path;
--- exception
--- when NO_DATA_FOUND then
--- return null;
end;' language 'plpgsql';
--- procedure write_to_file
create function content_item__write_to_file (integer,varchar)
returns integer as '
declare
@@ -1345,7 +1314,6 @@
end;' language 'plpgsql';
--- procedure register_template
create function content_item__register_template (integer,integer,varchar)
returns integer as '
declare
@@ -1378,7 +1346,6 @@
end;' language 'plpgsql';
--- procedure unregister_template
create function content_item__unregister_template (integer,integer,varchar)
returns integer as '
declare
@@ -1419,7 +1386,6 @@
end;' language 'plpgsql';
--- function get_template
create function content_item__get_template (integer,varchar)
returns integer as '
declare
@@ -1467,7 +1433,6 @@
end;' language 'plpgsql';
--- function get_content_type
create function content_item__get_content_type (integer)
returns varchar as '
declare
@@ -1491,7 +1456,6 @@
end;' language 'plpgsql';
--- function get_live_revision
create function content_item__get_live_revision (integer)
returns integer as '
declare
@@ -1544,7 +1508,6 @@
return 0;
end;' language 'plpgsql';
--- procedure set_live_revision
create function content_item__set_live_revision (integer,varchar)
returns integer as '
declare
@@ -1576,7 +1539,6 @@
end;' language 'plpgsql';
--- procedure unset_live_revision
create function content_item__unset_live_revision (integer)
returns integer as '
declare
@@ -1604,7 +1566,6 @@
end;' language 'plpgsql';
--- procedure set_release_period
create function content_item__set_release_period (integer, timestamptz, timestamptz)
returns integer as '
declare
@@ -1637,7 +1598,6 @@
end;' language 'plpgsql';
--- function get_revision_count
create function content_item__get_revision_count (integer)
returns integer as '
declare
@@ -1657,7 +1617,6 @@
end;' language 'plpgsql';
--- function get_context
create function content_item__get_context (integer)
returns integer as '
declare
@@ -1689,7 +1648,6 @@
-- to the target folder
-- 3) update the parent_id for the item
--- procedure move
create function content_item__move (integer,integer)
returns integer as '
declare
@@ -1722,7 +1680,6 @@
end;' language 'plpgsql';
--- procedure copy
create function content_item__copy (integer,integer,integer,varchar)
returns integer as '
declare
@@ -1747,7 +1704,6 @@
-- 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
create function content_item__copy2 (integer,integer,integer,varchar)
returns integer as '
declare
@@ -1784,6 +1740,14 @@
copy2__creation_user,
copy2__creation_ip
);
+ -- call content_extlink.copy if the item is an url
+ else if content_extlink__is_extlink(copy2__item_id) = ''t'' then
+ PERFORM content_extlink__copy(
+ copy2__item_id,
+ copy2__target_folder_id,
+ copy2__creation_user,
+ copy2__creation_ip
+ );
-- make sure the target folder is really a folder
else if content_folder__is_folder(copy2__target_folder_id) = ''t'' then
@@ -1859,14 +1823,13 @@
end if;
- end if; end if; end if;
+ end if; end if; end if; end if;
return v_item_id;
end;' language 'plpgsql';
--- function get_latest_revision
create function content_item__get_latest_revision (integer)
returns integer as '
declare
@@ -1899,7 +1862,6 @@
end;' language 'plpgsql' with (isstrict);
--- function get_best_revision
create function content_item__get_best_revision (integer)
returns integer as '
declare
@@ -1925,7 +1887,6 @@
end;' language 'plpgsql';
--- function get_title
create function content_item__get_title (integer,boolean)
returns varchar as '
declare
@@ -1982,7 +1943,6 @@
end;' language 'plpgsql';
--- function get_publish_date
create function content_item__get_publish_date (integer,boolean)
returns timestamptz as '
declare
@@ -2021,7 +1981,6 @@
end;' language 'plpgsql';
--- function is_subclass
create function content_item__is_subclass (varchar,varchar)
returns boolean as '
declare
@@ -2033,15 +1992,6 @@
v_subclass_p := ''f'';
--- select
--- object_type
--- from
--- acs_object_types
--- connect by
--- prior object_type = supertype
--- start with
--- object_type = is_subclass__supertype
-
for v_inherit_val in select o.object_type
from acs_object_types o, acs_object_types o2
where o2.object_type = is_subclass__supertype
@@ -2058,7 +2008,6 @@
end;' language 'plpgsql';
--- function relate
create function content_item__relate (integer,integer,varchar,integer,varchar)
returns integer as '
declare
@@ -2154,7 +2103,6 @@
end;' language 'plpgsql';
--- procedure unrelate
create function content_item__unrelate (integer)
returns integer as '
declare
@@ -2171,7 +2119,6 @@
end;' language 'plpgsql';
--- function is_index_page
create function content_item__is_index_page (integer,integer)
returns boolean as '
declare
@@ -2187,7 +2134,6 @@
end;' language 'plpgsql';
--- function get_parent_folder
create function content_item__get_parent_folder (integer)
returns integer as '
declare
@@ -2217,7 +2163,6 @@
end;' language 'plpgsql';
--- show errors
-- Trigger to maintain context_id in acs_objects
@@ -2235,7 +2180,6 @@
create trigger cr_items_update_tr after update on cr_items
for each row execute procedure cr_items_update_tr ();
--- show errors
-- Trigger to maintain publication audit trail
create function cr_items_publish_update_tr () returns opaque as '
@@ -2261,6 +2205,3 @@
create trigger cr_items_publish_update_tr before update on cr_items
for each row execute procedure cr_items_publish_update_tr ();
--- show errors
-
-
Index: openacs-4/packages/acs-content-repository/sql/postgresql/packages-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/packages-create.sql,v
diff -u -N -r1.4 -r1.4.2.1
--- openacs-4/packages/acs-content-repository/sql/postgresql/packages-create.sql 25 May 2002 14:30:02 -0000 1.4
+++ openacs-4/packages/acs-content-repository/sql/postgresql/packages-create.sql 20 Mar 2003 22:11:07 -0000 1.4.2.1
@@ -3,1755 +3,6 @@
-- \i content-util.sql
\i content-update.sql
--- 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,
--- 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 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'
--- ) 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
--- ) return char;
---
--- procedure delete (
--- --/** 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
--- ) 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 '',
--- 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 delete (
--- --/** 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;
---
--- 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 delete (
--- --/** 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 delete (
--- --/** 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;
---
---
--- 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 delete (
--- --/** 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 parent_id The parent of this item, defaults to null
--- -- @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,
--- parent_id in cr_items.parent_id%TYPE default null,
--- 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 delete (
--- --/** 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 delete (
--- --/** 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
-
\i content-type.sql
\i content-item.sql
\i content-revision.sql
Index: openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-4.6.4-4.6.5.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-4.6.4-4.6.5.sql,v
diff -u -N
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-4.6.4-4.6.5.sql 20 Mar 2003 22:11:21 -0000 1.1.2.1
@@ -0,0 +1,186 @@
+create or replace function content_item__copy2 (integer,integer,integer,varchar)
+returns integer as '
+declare
+ copy2__item_id alias for $1;
+ copy2__target_folder_id alias for $2;
+ copy2__creation_user alias for $3;
+ copy2__creation_ip alias for $4; -- default null
+ 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 boolean;
+ 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
+ PERFORM content_folder__copy(
+ copy2__item_id,
+ copy2__target_folder_id,
+ copy2__creation_user,
+ copy2__creation_ip
+ );
+ -- call content_symlink.copy if the item is a symlink
+ else if content_symlink__is_symlink(copy2__item_id) = ''t'' then
+ PERFORM content_symlink__copy(
+ copy2__item_id,
+ copy2__target_folder_id,
+ copy2__creation_user,
+ copy2__creation_ip
+ );
+ -- call content_extlink.copy if the item is an url
+ else if content_extlink__is_extlink(copy2__item_id) = ''t'' then
+ PERFORM content_extlink__copy(
+ copy2__item_id,
+ copy2__target_folder_id,
+ copy2__creation_user,
+ copy2__creation_ip
+ );
+ -- make sure the target folder is really a folder
+ else if 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,
+ coalesce(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(
+ copy2__target_folder_id,
+ v_content_type,
+ ''f''
+ );
+
+ if v_is_registered = ''t'' then
+ -- create the new content item
+ v_item_id := content_item__new(
+ v_name,
+ copy2__target_folder_id,
+ null,
+ v_locale,
+ now(),
+ copy2__creation_user,
+ null,
+ copy2__creation_ip,
+ ''content_item'',
+ v_content_type,
+ null,
+ null,
+ ''text/plain'',
+ null,
+ null,
+ 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 (
+ v_old_revision_id,
+ null,
+ v_item_id,
+ copy2__creation_user,
+ copy2__creation_ip
+ );
+ end if;
+ end if;
+
+
+ end if;
+ end if; end if; end if; end if;
+
+ return v_item_id;
+
+end;' language 'plpgsql';
+
+create or replace function content_extlink__copy (integer,integer,integer,varchar)
+returns integer as '
+declare
+ copy__extlink_id alias for $1;
+ copy__target_folder_id alias for $2;
+ copy__creation_user alias for $3;
+ copy__creation_ip alias for $4; -- default null
+ v_current_folder_id cr_folders.folder_id%TYPE;
+ v_name cr_items.name%TYPE;
+ v_url cr_extlinks.url%TYPE;
+ v_description cr_extlinks.description%TYPE;
+ v_label cr_extlinks.label%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.description, e.label
+ into
+ v_name, v_url, v_description, v_label
+ 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'',''f'') = ''t'' then
+
+ v_extlink_id := content_extlink__new(
+ v_name,
+ v_url,
+ v_label,
+ v_description,
+ copy__target_folder_id,
+ null,
+ current_timestamp,
+ copy__creation_user,
+ copy__creation_ip
+ );
+
+ end if;
+ end if;
+ end if;
+
+ return 0;
+end;' language 'plpgsql';
+
Index: openacs-4/packages/acs-content-repository/tcl/extlink-procs-oracle.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/tcl/Attic/extlink-procs-oracle.xql,v
diff -u -N
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-content-repository/tcl/extlink-procs-oracle.xql 20 Mar 2003 22:11:36 -0000 1.1.2.1
@@ -0,0 +1,56 @@
+
+
+ oracle8.1.6
+
+
+
+
+ begin
+ :1 := content_extlink.new (
+ name => :name,
+ url => :url,
+ label => :label,
+ description => :description,
+ parent_id => :parent_id,
+ extlink_id => :extlink_id,
+ creation_user => :creation_user,
+ creation_ip => :creation_ip
+ );
+ end;
+
+
+
+
+
+
+
+ update acs_objects
+ set last_modified = sysdate,
+ modifying_user = :modifying_user,
+ modifying_ip = :modifying_ip
+ where object_id = :extlink_id
+
+
+
+
+
+
+
+ begin
+ content_extlink.delete (
+ extlink_id => :extlink_id
+ );
+ end;
+
+
+
+
+
+
+
+ select content_extlink.is_extlink (item => :item_id);
+
+
+
+
+
Index: openacs-4/packages/acs-content-repository/tcl/extlink-procs-postgresql.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/tcl/Attic/extlink-procs-postgresql.xql,v
diff -u -N
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-content-repository/tcl/extlink-procs-postgresql.xql 20 Mar 2003 22:11:36 -0000 1.1.2.1
@@ -0,0 +1,55 @@
+
+
+ postgresql7.1
+
+
+
+
+ select content_extlink__new (
+ :name,
+ :url,
+ :label,
+ :description,
+ :parent_id,
+ :extlink_id,
+ current_timestamp,
+ :creation_user,
+ :creation_ip
+ );
+
+
+
+
+
+
+
+ update acs_objects
+ set last_modified = current_timestamp,
+ modifying_user = :modifying_user,
+ modifying_ip = :modifying_ip
+ where object_id = :extlink_id
+
+
+
+
+
+
+
+ select content_extlink__delete (
+ :extlink_id
+ );
+
+
+
+
+
+
+
+ select content_extlink__is_extlink (
+ :item_id
+ );
+
+
+
+
+
Index: openacs-4/packages/acs-content-repository/tcl/extlink-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/tcl/Attic/extlink-procs.tcl,v
diff -u -N
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-content-repository/tcl/extlink-procs.tcl 20 Mar 2003 22:11:36 -0000 1.1.2.1
@@ -0,0 +1,89 @@
+ad_library {
+
+ Manage external links in the content repository
+
+ @author Don Baccus (dhogaza@pacifier.com)
+ @cvs-d $Id: extlink-procs.tcl,v 1.1.2.1 2003/03/20 22:11:36 donb Exp $
+
+}
+
+namespace eval content_extlink {}
+
+ad_proc content_extlink::new {
+ {-extlink_id ""}
+ -url:required
+ -parent_id:required
+ {-name ""}
+ {-label ""}
+ {-description ""}
+} {
+
+ Create a new external link.
+
+ @extlink_id Optional pre-assigned object_id for the link
+ @url The URL of the external resource
+ @parent_id The folder that will contain this extlink
+ @name Name to assign the object (defaults to "link extlink_id")
+ @label Label for the extlink (defaults to the URL)
+ @description An extended description of the link (defaults to NULL)
+
+} {
+
+ set creation_user [ad_conn user_id]
+ set creation_ip [ad_conn peeraddr]
+
+ return [db_exec_plsql extlink_new {}]
+
+}
+
+ad_proc content_extlink::edit {
+ -extlink_id:required
+ -url:required
+ -label:required
+ -description:required
+} {
+
+ Edit an existing external link. The parameters are required because it
+ is assumed that the caller will be pulling the existing values out of
+ the database before editing them.
+
+ @extlink_id Optional pre-assigned object_id for the link
+ @url The URL of the external resource
+ @label Label for the extlink (defaults to the URL)
+ @description An extended description of the link (defaults to NULL)
+
+} {
+
+ set modifying_user [ad_conn user_id]
+ set modifying_ip [ad_conn peeraddr]
+
+ db_transaction {
+ db_dml extlink_update_object {}
+ db_dml extlink_update_extlink {}
+ }
+
+}
+
+ad_proc content_extlink::delete {
+ -extlink_id:required
+} {
+
+ Delete an external link.
+
+ @extlink_id The object id of the link to delete
+
+} {
+ db_exec_plsql extlink_delete {}
+}
+
+ad_proc content_extlink::extlink_p {
+ -item_id:required
+} {
+
+ Returns true if the given item is an external link.
+
+ @extlink_id The object id of the item to check.
+
+} {
+ return [db_string extlink_check {}]
+}
Index: openacs-4/packages/acs-content-repository/tcl/extlink-procs.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/tcl/Attic/extlink-procs.xql,v
diff -u -N
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-content-repository/tcl/extlink-procs.xql 20 Mar 2003 22:11:36 -0000 1.1.2.1
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ update cr_extlinks
+ set url = :url,
+ label = :label,
+ description = :description
+ where extlink_id = :extlink_id
+
+
+
+
+
Index: openacs-4/packages/acs-content-repository/tcl/item-procs-oracle.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/tcl/Attic/item-procs-oracle.xql,v
diff -u -N -r1.1 -r1.1.4.1
--- openacs-4/packages/acs-content-repository/tcl/item-procs-oracle.xql 17 Sep 2001 05:16:40 -0000 1.1
+++ openacs-4/packages/acs-content-repository/tcl/item-procs-oracle.xql 20 Mar 2003 22:11:36 -0000 1.1.4.1
@@ -39,4 +39,19 @@
+
+
+
+ begin
+ content_item.copy(
+ item_id => :item_id,
+ target_folder_id => :target_folder_id,
+ creation_user => :creation_user,
+ creation_ip => :creation_ip
+ );
+ end;
+
+
+
+
Index: openacs-4/packages/acs-content-repository/tcl/item-procs-postgresql.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/tcl/Attic/item-procs-postgresql.xql,v
diff -u -N -r1.1 -r1.1.4.1
--- openacs-4/packages/acs-content-repository/tcl/item-procs-postgresql.xql 17 Sep 2001 05:16:40 -0000 1.1
+++ openacs-4/packages/acs-content-repository/tcl/item-procs-postgresql.xql 20 Mar 2003 22:11:36 -0000 1.1.4.1
@@ -40,4 +40,18 @@
+
+
+
+ select content_item__copy(
+ :item_id,
+ :target_folder_id,
+ :creation_user,
+ :creation_ip
+ )
+
+
+
+
+
Index: openacs-4/packages/acs-content-repository/tcl/item-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/tcl/Attic/item-procs.tcl,v
diff -u -N -r1.5.2.1 -r1.5.2.2
--- openacs-4/packages/acs-content-repository/tcl/item-procs.tcl 19 Feb 2003 13:38:29 -0000 1.5.2.1
+++ openacs-4/packages/acs-content-repository/tcl/item-procs.tcl 20 Mar 2003 22:11:36 -0000 1.5.2.2
@@ -263,3 +263,25 @@
return $file_url
}
+
+ad_proc item::copy {
+ -item_id:required
+ -target_folder_id:required
+} {
+
+ Copy the given item.
+
+ @param item_id The content item to copy
+ @param target_folder_id The folder which will hold the new copy
+
+} {
+
+ set creation_user [ad_conn user_id]
+ set creation_ip [ad_conn peeraddr]
+
+ db_exec_plsql copy_item {}
+
+}
+
+} {
+
Index: openacs-4/packages/attachments/attachments.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/attachments/attachments.info,v
diff -u -N -r1.7.2.2 -r1.7.2.3
--- openacs-4/packages/attachments/attachments.info 3 Feb 2003 16:38:31 -0000 1.7.2.2
+++ openacs-4/packages/attachments/attachments.info 20 Mar 2003 22:11:54 -0000 1.7.2.3
@@ -7,7 +7,7 @@
f
t
-
+
oracle
postgresql
@@ -18,8 +18,8 @@
OpenForce, Inc.
Attachments
-
-
+
+
Index: openacs-4/packages/attachments/www/go-to-attachment.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/attachments/www/go-to-attachment.tcl,v
diff -u -N -r1.2.2.1 -r1.2.2.2
--- openacs-4/packages/attachments/www/go-to-attachment.tcl 12 Dec 2002 00:23:52 -0000 1.2.2.1
+++ openacs-4/packages/attachments/www/go-to-attachment.tcl 20 Mar 2003 22:12:18 -0000 1.2.2.2
@@ -18,9 +18,8 @@
}
switch $object_type {
- fs_url {
- set url [db_string select_url {}]
- ad_returnredirect $url
+ content_extlink {
+ ad_returnredirect [db_string select_url {}]
ad_script_abort
return
}
Index: openacs-4/packages/attachments/www/go-to-attachment.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/attachments/www/go-to-attachment.xql,v
diff -u -N -r1.1.2.1 -r1.1.2.2
--- openacs-4/packages/attachments/www/go-to-attachment.xql 12 Dec 2002 00:23:52 -0000 1.1.2.1
+++ openacs-4/packages/attachments/www/go-to-attachment.xql 20 Mar 2003 22:12:18 -0000 1.1.2.2
@@ -2,25 +2,22 @@
-
-select
-object_type
-from attachments, acs_objects
-where
-attachments.object_id = :object_id and
-attachments.item_id = :attachment_id and
-attachments.item_id = acs_objects.object_id
-
+
+ select object_type
+ from attachments, acs_objects
+ where
+ attachments.object_id = :object_id and
+ attachments.item_id = :attachment_id and
+ attachments.item_id = acs_objects.object_id
+
-
-select
-url
-from fs_urls
-where
-url_id = :attachment_id
-
+
+ select url
+ from cr_extlinks
+ where extlink_id = :attachment_id
+
Index: openacs-4/packages/attachments/www/simple-add-2.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/attachments/www/simple-add-2.tcl,v
diff -u -N -r1.1 -r1.1.2.1
--- openacs-4/packages/attachments/www/simple-add-2.tcl 2 Jul 2002 04:18:54 -0000 1.1
+++ openacs-4/packages/attachments/www/simple-add-2.tcl 20 Mar 2003 22:12:18 -0000 1.1.2.1
@@ -24,11 +24,11 @@
ad_require_permission $folder_id write
db_transaction {
- # Create the URL (for now)
- set url_id [fs::url_new -url $url -name $title -description $description -folder_id $folder_id]
- # Attach the URL
- attachments::attach -object_id $object_id -attachment_id $url_id
+ # Create and attach the URL
+ attachments::attach -object_id $object_id \
+ -attachment_id [content_simple::new -url $url -label $title -description $description -parent_id $folder_id]
+
}
ad_returnredirect "$return_url"
Index: openacs-4/packages/attachments/www/simple-add.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/attachments/www/simple-add.tcl,v
diff -u -N -r1.4 -r1.4.2.1
--- openacs-4/packages/attachments/www/simple-add.tcl 17 Sep 2002 21:08:38 -0000 1.4
+++ openacs-4/packages/attachments/www/simple-add.tcl 20 Mar 2003 22:12:18 -0000 1.4.2.1
@@ -30,18 +30,14 @@
# set templating datasources
-set pretty_name [fs::simple_get_type_pretty_name -type $type]
-if {[empty_string_p $pretty_name]} {
- return -code error "No such type"
-}
+set pretty_name "URL"
set context {{Attach URL}}
set fs_context_bar [fs_context_bar_list -final "Add $pretty_name" $folder_id]
# Should probably generate the item_id and version_id now for
# double-click protection
-
# if title isn't passed in ignore lock_title_p
if {[empty_string_p $title]} {
set lock_title_p 0
Index: openacs-4/packages/file-storage/file-storage.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/file-storage.info,v
diff -u -N -r1.17.2.4 -r1.17.2.5
--- openacs-4/packages/file-storage/file-storage.info 20 Mar 2003 14:47:21 -0000 1.17.2.4
+++ openacs-4/packages/file-storage/file-storage.info 20 Mar 2003 22:12:32 -0000 1.17.2.5
@@ -6,159 +6,30 @@
File Storage Areas
f
f
-
-
-
- oracle
- postgresql
-
+
+
Jowell S. Sabino
This application allows users to collaboratively maintain documents on the web server
2002-10-27
OpenACS
Now allows storage of files on the filesystem or database.
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
Index: openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql,v
diff -u -N -r1.4 -r1.4.2.1
--- openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql 17 Sep 2002 21:03:24 -0000 1.4
+++ openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql 20 Mar 2003 22:12:50 -0000 1.4.2.1
@@ -246,6 +246,7 @@
-- allow child items to be added
content_folder.register_content_type(v_folder_id,'content_revision','t');
content_folder.register_content_type(v_folder_id,'content_folder','t');
+ content_folder.register_content_type(v_folder_id,'content_extlink','t');
-- set up default permissions
acs_permission.grant_permission(
@@ -612,6 +613,12 @@
't' -- include_subtypes
);
+ content_folder.register_content_type(
+ v_folder_id, -- folder_id
+ 'content_extlink', -- content_type
+ 't' -- include_subtypes
+ );
+
-- Give the creator admin privileges on the folder
acs_permission.grant_permission(
v_folder_id, -- object_id
Index: openacs-4/packages/file-storage/sql/oracle/file-storage-simple-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/Attic/file-storage-simple-create.sql,v
diff -u -N
--- openacs-4/packages/file-storage/sql/oracle/file-storage-simple-create.sql 17 Jul 2002 20:09:47 -0000 1.4
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,62 +0,0 @@
-
---
--- File Storage NonVersioned (Simple) Objects
---
--- This is to get away from the CR pain when dealing with file-storage of
--- "other" objects
---
--- @author Ben Adida (ben@openforce)
--- @creation-date 01 April 2002
--- @cvs-id $Id: file-storage-simple-create.sql,v 1.4 2002/07/17 20:09:47 yon Exp $
---
-
-
--- Non-versioned objects
-create table fs_simple_objects (
- object_id integer
- constraint fs_simp_obj_id_fk
- references acs_objects(object_id)
- constraint fs_simple_objects_pk
- primary key,
- folder_id integer
- constraint fs_simp_folder_id_fk
- references cr_folders,
- name varchar(250) not null,
- description varchar(4000)
-);
-
-create index fs_so_folder_id_idx on fs_simple_objects (folder_id);
-
-create table fs_urls (
- url_id integer
- constraint fs_url_url_id_fk
- references fs_simple_objects(object_id)
- constraint fs_urls_pk
- primary key,
- url varchar(250) not null
-);
-
-begin
- -- stuff for non-versioned file-storage objects
- acs_object_type.create_type (
- supertype => 'acs_object',
- object_type => 'fs_simple_object',
- pretty_name => 'File Storage Simple Object',
- pretty_plural => 'File Storage Simple Objects',
- table_name => 'fs_simple_objects',
- id_column => 'object_id',
- name_method => 'fs_simple_object.name'
- );
-
- -- links
- acs_object_type.create_type (
- supertype => 'fs_simple_object',
- object_type => 'fs_url',
- pretty_name => 'File Storage URL',
- pretty_plural => 'File Storage URLs',
- table_name => 'fs_urls',
- id_column => 'url_id'
- );
-end;
-/
-show errors;
Index: openacs-4/packages/file-storage/sql/oracle/file-storage-simple-package-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/Attic/file-storage-simple-package-create.sql,v
diff -u -N
--- openacs-4/packages/file-storage/sql/oracle/file-storage-simple-package-create.sql 17 Jul 2002 20:09:47 -0000 1.5
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,220 +0,0 @@
-
---
--- File Storage NonVersioned (simple) Objects
---
--- This is to get away from the CR pain when dealing with file-storage of
--- "other" objects
---
--- @author Ben Adida (ben@openforce)
--- @creation-date 01 April 2002
--- @cvs-id $Id: file-storage-simple-package-create.sql,v 1.5 2002/07/17 20:09:47 yon Exp $
---
-
-create or replace package fs_simple_object
-as
-
- function new (
- object_id in fs_simple_objects.object_id%TYPE default NULL,
- object_type in acs_objects.object_type%TYPE default 'fs_simple_object',
- folder_id in fs_simple_objects.folder_id%TYPE,
- name in fs_simple_objects.name%TYPE,
- description in fs_simple_objects.description%TYPE,
- creation_date in acs_objects.creation_date%TYPE default sysdate,
- creation_user in acs_objects.creation_user%TYPE,
- creation_ip in acs_objects.creation_ip%TYPE,
- context_id in acs_objects.context_id%TYPE
- ) return fs_simple_objects.object_id%TYPE;
-
- procedure delete (
- object_id in fs_simple_objects.object_id%TYPE
- );
-
- function name (
- object_id in fs_simple_objects.object_id%TYPE
- ) return fs_simple_objects.name%TYPE;
-
-end fs_simple_object;
-/
-show errors
-
-create or replace package body fs_simple_object
-as
-
- function new (
- object_id in fs_simple_objects.object_id%TYPE default NULL,
- object_type in acs_objects.object_type%TYPE default 'fs_simple_object',
- folder_id in fs_simple_objects.folder_id%TYPE,
- name in fs_simple_objects.name%TYPE,
- description in fs_simple_objects.description%TYPE,
- creation_date in acs_objects.creation_date%TYPE default sysdate,
- creation_user in acs_objects.creation_user%TYPE,
- creation_ip in acs_objects.creation_ip%TYPE,
- context_id in acs_objects.context_id%TYPE
- ) return fs_simple_objects.object_id%TYPE
- is
- v_object_id acs_objects.object_id%TYPE;
- begin
- v_object_id:= acs_object.new (
- object_id => object_id,
- object_type => object_type,
- creation_date => creation_date,
- creation_user => creation_user,
- creation_ip => creation_ip,
- context_id => context_id
- );
-
- insert into fs_simple_objects
- (object_id, folder_id, name, description) values
- (v_object_id, folder_id, name, description);
-
- acs_object.update_last_modified(fs_simple_object.new.folder_id);
-
- return v_object_id;
- end new;
-
- procedure delete (
- object_id in fs_simple_objects.object_id%TYPE
- )
- is
- begin
- acs_object.delete(object_id);
- end delete;
-
- function name (
- object_id in fs_simple_objects.object_id%TYPE
- ) return fs_simple_objects.name%TYPE
- is
- v_name fs_simple_objects.name%TYPE;
- begin
- select name
- into v_name
- from fs_simple_objects
- where object_id = fs_simple_object.name.object_id;
-
- return v_name;
- end name;
-
-end fs_simple_object;
-/
-show errors
-
-create or replace package fs_url
-as
-
- function new (
- url_id in fs_urls.url_id%TYPE default NULL,
- object_type in acs_objects.object_type%TYPE default 'fs_url',
- url in fs_urls.url%TYPE,
- folder_id in fs_simple_objects.folder_id%TYPE,
- name in fs_simple_objects.name%TYPE,
- description in fs_simple_objects.description%TYPE,
- creation_date in acs_objects.creation_date%TYPE default sysdate,
- creation_user in acs_objects.creation_user%TYPE,
- creation_ip in acs_objects.creation_ip%TYPE,
- context_id in acs_objects.context_id%TYPE
- ) return fs_urls.url_id%TYPE;
-
- procedure delete (
- url_id in fs_urls.url_id%TYPE
- );
-
- function copy (
- url_id in fs_urls.url_id%TYPE,
- target_folder_id in fs_simple_objects.folder_id%TYPE
- ) return fs_urls.url_id%TYPE;
-
-end fs_url;
-/
-show errors
-
-create or replace package body fs_url
-as
-
- function new (
- url_id in fs_urls.url_id%TYPE default NULL,
- object_type in acs_objects.object_type%TYPE default 'fs_url',
- url in fs_urls.url%TYPE,
- folder_id in fs_simple_objects.folder_id%TYPE,
- name in fs_simple_objects.name%TYPE,
- description in fs_simple_objects.description%TYPE,
- creation_date in acs_objects.creation_date%TYPE default sysdate,
- creation_user in acs_objects.creation_user%TYPE,
- creation_ip in acs_objects.creation_ip%TYPE,
- context_id in acs_objects.context_id%TYPE
- ) return fs_urls.url_id%TYPE
- is
- v_url_id fs_simple_objects.object_id%TYPE;
- begin
- v_url_id:= fs_simple_object.new (
- object_id => url_id,
- object_type => object_type,
- folder_id => folder_id,
- name => name,
- description => description,
- creation_date => creation_date,
- creation_user => creation_user,
- creation_ip => creation_ip,
- context_id => context_id
- );
-
- insert into fs_urls
- (url_id, url) values
- (v_url_id, url);
-
- return v_url_id;
- end new;
-
- procedure delete (
- url_id in fs_urls.url_id%TYPE
- )
- is
- begin
- delete from fs_urls where url_id= fs_url.delete.url_id;
-
- fs_simple_object.delete(url_id);
- end delete;
-
- function copy (
- url_id in fs_urls.url_id%TYPE,
- target_folder_id in fs_simple_objects.folder_id%TYPE
- ) return fs_urls.url_id%TYPE
- is
- v_new_url_id fs_urls.url_id%TYPE;
- v_url fs_urls.url%TYPE;
- v_name fs_simple_objects.name%TYPE;
- v_description fs_simple_objects.description%TYPE;
- v_creation_user acs_objects.creation_user%TYPE;
- v_creation_ip acs_objects.creation_ip%TYPE;
- begin
-
- select url
- into v_url
- from fs_urls
- where url_id = copy.url_id;
-
- select name, description
- into v_name, v_description
- from fs_simple_objects
- where object_id = copy.url_id;
-
- select creation_user, creation_ip
- into v_creation_user, v_creation_ip
- from acs_objects
- where object_id = copy.url_id;
-
- v_new_url_id := fs_url.new(
- url => v_url,
- folder_id => copy.target_folder_id,
- name => v_name,
- description => v_description,
- creation_user => v_creation_user,
- creation_ip => v_creation_ip,
- context_id => copy.target_folder_id
- );
-
- return v_new_url_id;
- end copy;
-
-end fs_url;
-/
-show errors
Index: openacs-4/packages/file-storage/sql/oracle/file-storage-views-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/file-storage-views-create.sql,v
diff -u -N -r1.5.2.1 -r1.5.2.2
--- openacs-4/packages/file-storage/sql/oracle/file-storage-views-create.sql 17 Feb 2003 20:31:19 -0000 1.5.2.1
+++ openacs-4/packages/file-storage/sql/oracle/file-storage-views-create.sql 20 Mar 2003 22:12:50 -0000 1.5.2.2
@@ -8,23 +8,18 @@
create or replace view fs_urls_full
as
- select fs_urls.url_id,
- fs_urls.url,
- fs_simple_objects.folder_id,
- fs_simple_objects.name,
- fs_simple_objects.description,
+ select cr_extlinks.extlink_id as url_id,
+ cr_extlinks.url,
+ cr_items.parent_id as folder_id,
+ cr_extlinks.label as name,
+ cr_extlinks.description,
acs_objects.*
- from fs_urls,
- fs_simple_objects,
+ from cr_extlinks,
+ cr_items,
acs_objects
- where fs_urls.url_id = fs_simple_objects.object_id
- and fs_simple_objects.object_id = acs_objects.object_id;
+ where cr_extlinks.extlink_id = cr_items.item_id
+ and cr_items.item_id = acs_objects.object_id;
--- DRB: note that content size is incorrect as it does not include
--- URLs. The fix for this: get rid of OF's fucked-up fs_simple_objects
--- and use the URLs in the content repository that were so kindly
--- implemented for us by Ars Digita in the first place ...
-
create or replace view fs_folders
as
select cr_folders.folder_id,
@@ -64,44 +59,38 @@
create or replace view fs_objects
as
- select fs_folders.folder_id as object_id,
- 0 as live_revision,
- 'folder' as type,
- fs_folders.content_size,
- fs_folders.name,
- '' as file_upload_name,
- fs_folders.last_modified,
- '' as url,
- fs_folders.parent_id,
- fs_folders.key,
- 0 as sort_key
- from fs_folders
- union all
- select fs_files.file_id as object_id,
- fs_files.live_revision,
- fs_files.type,
- fs_files.content_size,
- fs_files.name,
- fs_files.file_upload_name,
- fs_files.last_modified,
- '' as url,
- fs_files.parent_id,
- fs_files.key,
- 1 as sort_key
- from fs_files
- union all
- select fs_urls_full.url_id as object_id,
- 0 as live_revision,
- 'url' as type,
- 0 as content_size,
- fs_urls_full.name,
- fs_urls_full.name as file_upload_name,
- fs_urls_full.last_modified,
- fs_urls_full.url,
- fs_urls_full.folder_id as parent_id,
- fs_urls_full.url as key,
- 1 as sort_key
- from fs_urls_full;
-
-
-
+ select cr_items.item_id as object_id,
+ cr_items.live_revision,
+ case
+ when cr_items.content_type = 'content_folder' then 'folder'
+ when cr_items.content_type = 'content_extlink' then 'url'
+ else cr_revisions.mime_type
+ end as type,
+ case
+ when cr_items.content_type = 'content_folder'
+ then (select count(*)
+ from cr_items ci
+ where ci.content_type <> 'content_folder'
+ connect by prior ci.item_id = ci.parent_id
+ start with ci.item_id = cr_folders.folder_id)
+ else 0
+ end as content_size,
+ case
+ when cr_items.content_type = 'content_folder' then cr_folders.label
+ when cr_items.content_type = 'content_extlink' then cr_extlinks.label
+ else cr_items.name
+ end as name,
+ cr_revisions.title as file_upload_name,
+ acs_objects.last_modified,
+ cr_extlinks.url,
+ cr_items.parent_id,
+ cr_items.name as key,
+ case
+ when cr_items.content_type = 'content_folder' then 0
+ else 1
+ end as sort_key
+ from cr_items, cr_extlinks, cr_folders, cr_revisions, acs_objects
+ where cr_items.item_id = cr_extlinks.extlink_id(+)
+ and cr_items.item_id = cr_folders.folder_id(+)
+ and cr_items.item_id = acs_objects.object_id
+ and cr_items.live_revision = cr_revisions.revision_id(+);
Index: openacs-4/packages/file-storage/sql/oracle/upgrade/upgrade-4.6.1-4.6.2.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/upgrade/upgrade-4.6.1-4.6.2.sql,v
diff -u -N
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/file-storage/sql/oracle/upgrade/upgrade-4.6.1-4.6.2.sql 20 Mar 2003 22:13:03 -0000 1.1.2.1
@@ -0,0 +1,97 @@
+-- Move old fs_simple_objects URLs to the content repository, where they
+-- belong.
+
+declare
+ new_url_id cr_extlinks.extlink_id%TYPE;
+begin
+
+ for fs_url in (select * from fs_urls_full)
+ loop
+
+ if content_folder.is_registered(fs_url.folder_id, 'content_extlink') = 'f' then
+ content_folder.register_content_type(fs_url.folder_id, 'content_extlink');
+ end if;
+
+ new_url_id := content_extlink.new (
+ url => fs_url.url,
+ label => fs_url.name,
+ description => fs_url.description,
+ parent_id => fs_url.folder_id,
+ extlink_id => null,
+ creation_date => fs_url.creation_date,
+ creation_user => fs_url.creation_user,
+ creation_ip => fs_url.creation_ip
+ );
+
+ update acs_objects
+ set last_modified = fs_url.last_modified,
+ modifying_user = fs_url.modifying_user,
+ modifying_ip = fs_url.modifying_ip
+ where object_id = fs_url.object_id;
+
+ update acs_permissions
+ set object_id = new_url_id
+ where object_id = fs_url.object_id;
+
+ acs_object.delete(fs_url.object_id);
+
+ end loop;
+
+end;
+/
+show errors;
+
+drop table fs_urls;
+drop table fs_simple_objects;
+
+create or replace view fs_urls_full
+as
+ select cr_extlinks.extlink_id as url_id,
+ cr_extlinks.url,
+ cr_items.parent_id as folder_id,
+ cr_extlinks.label as name,
+ cr_extlinks.description,
+ acs_objects.*
+ from cr_extlinks,
+ cr_items,
+ acs_objects
+ where cr_extlinks.extlink_id = cr_items.item_id
+ and cr_items.item_id = acs_objects.object_id;
+
+create or replace view fs_objects
+as
+ select cr_items.item_id as object_id,
+ cr_items.live_revision,
+ case
+ when cr_items.content_type = 'content_folder' then 'folder'
+ when cr_items.content_type = 'content_extlink' then 'url'
+ else cr_revisions.mime_type
+ end as type,
+ case
+ when cr_items.content_type = 'content_folder'
+ then (select count(*)
+ from cr_items ci
+ where ci.content_type <> 'content_folder'
+ connect by prior ci.item_id = ci.parent_id
+ start with ci.item_id = cr_folders.folder_id)
+ else 0
+ end as content_size,
+ case
+ when cr_items.content_type = 'content_folder' then cr_folders.label
+ when cr_items.content_type = 'content_extlink' then cr_extlinks.label
+ else cr_items.name
+ end as name,
+ cr_revisions.title as file_upload_name,
+ acs_objects.last_modified,
+ cr_extlinks.url,
+ cr_items.parent_id,
+ cr_items.name as key,
+ case
+ when cr_items.content_type = 'content_folder' then 0
+ else 1
+ end as sort_key
+ from cr_items, cr_extlinks, cr_folders, cr_revisions, acs_objects
+ where cr_items.item_id = cr_extlinks.extlink_id(+)
+ and cr_items.item_id = cr_folders.folder_id(+)
+ and cr_items.item_id = acs_objects.object_id
+ and cr_items.live_revision = cr_revisions.revision_id(+);
Index: openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql,v
diff -u -N -r1.8 -r1.8.2.1
--- openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql 18 Sep 2002 06:03:29 -0000 1.8
+++ openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql 20 Mar 2003 22:13:19 -0000 1.8.2.1
@@ -131,6 +131,11 @@
''content_folder'', -- content_types
''t'' -- include_subtypes
);
+ PERFORM content_folder__register_content_type(
+ v_folder_id, -- folder_id
+ ''content_extlink'', -- content_types
+ ''t'' -- include_subtypes
+ );
-- set up default permissions
PERFORM acs_permission__grant_permission (
@@ -637,6 +642,12 @@
''t'' -- include_subtypes (default)
);
+ PERFORM content_folder__register_content_type(
+ v_folder_id, -- folder_id
+ ''content_extlink'', -- content_types
+ ''t'' -- include_subtypes
+ );
+
-- Give the creator admin privileges on the folder
PERFORM acs_permission__grant_permission (
v_folder_id, -- object_id
Index: openacs-4/packages/file-storage/sql/postgresql/file-storage-simple-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/Attic/file-storage-simple-create.sql,v
diff -u -N
--- openacs-4/packages/file-storage/sql/postgresql/file-storage-simple-create.sql 17 Jul 2002 20:09:47 -0000 1.3
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,64 +0,0 @@
-
---
--- File Storage NonVersioned (Simple) Objects
---
--- This is to get away from the CR pain when dealing with file-storage of
--- "other" objects
---
--- @author Ben Adida (ben@openforce)
--- @creation-date 01 April 2002
--- @cvs-id $Id: file-storage-simple-create.sql,v 1.3 2002/07/17 20:09:47 yon Exp $
---
-
-
--- Non-versioned objects
-create table fs_simple_objects (
- object_id integer
- constraint fs_simp_obj_id_fk
- references acs_objects(object_id)
- constraint fs_simp_obj_id_pk
- primary key,
- folder_id integer
- constraint fs_simp_folder_id_fk
- references cr_folders(folder_id),
- name varchar(250) not null,
- description varchar(4000)
-);
-
-
-create table fs_urls (
- url_id integer
- constraint fs_url_url_id_fk
- references fs_simple_objects(object_id)
- constraint fs_url_url_id_pk
- primary key,
- url varchar(250) not null
-);
-
--- stuff for non-versioned file-storage objects
-select acs_object_type__create_type (
- 'fs_simple_object',
- 'File Storage Simple Object',
- 'File Storage Simple Objects',
- 'acs_object',
- 'fs_simple_objects',
- 'object_id',
- NULL,
- 'f',
- NULL,
- 'fs_simple_object.name'
-);
-
--- links
-select acs_object_type__create_type (
- 'fs_url',
- 'File Storage URL',
- 'File Storage URLs',
- 'fs_simple_object',
- 'fs_urls',
- 'url_id',
- NULL,
- 'f',
- NULL,
- NULL
-);
Index: openacs-4/packages/file-storage/sql/postgresql/file-storage-simple-package-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/Attic/file-storage-simple-package-create.sql,v
diff -u -N
--- openacs-4/packages/file-storage/sql/postgresql/file-storage-simple-package-create.sql 2 Mar 2003 22:44:34 -0000 1.8.2.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,183 +0,0 @@
-
---
--- File Storage NonVersioned (simple) Objects
---
--- This is to get away from the CR pain when dealing with file-storage of
--- "other" objects
---
--- @author Ben Adida (ben@openforce)
--- @creation-date 01 April 2002
--- @cvs-id $Id: file-storage-simple-package-create.sql,v 1.8.2.2 2003/03/02 22:44:34 donb Exp $
---
-
-select define_function_args('fs_simple_object__new','object_id,object_type,fs_simple_object,folder_id,name,description,creation_date,creation_user,creation_ip,context_id');
-
-create function fs_simple_object__new(integer,varchar,integer,varchar,varchar,timestamptz,integer,varchar,integer)
-returns integer as '
-DECLARE
- p_object_id alias for $1;
- p_object_type alias for $2;
- p_folder_id alias for $3;
- p_name alias for $4;
- p_description alias for $5;
- p_creation_date alias for $6;
- p_creation_user alias for $7;
- p_creation_ip alias for $8;
- p_context_id alias for $9;
- v_object_id integer;
-BEGIN
- v_object_id:= acs_object__new (
- p_object_id,
- p_object_type,
- p_creation_date,
- p_creation_user,
- p_creation_ip,
- p_context_id
- );
-
- insert into fs_simple_objects
- (object_id, folder_id, name, description) values
- (v_object_id, p_folder_id, p_name, p_description);
-
- PERFORM acs_object__update_last_modified(p_folder_id);
-
- return v_object_id;
-
-END;
-' language 'plpgsql';
-
-select define_function_args('fs_simple_object__delete','object_id');
-
-create function fs_simple_object__delete(integer)
-returns integer as '
-DECLARE
- p_object_id alias for $1;
-BEGIN
- PERFORM acs_object__delete(p_object_id);
-
- return 0;
-END;
-' language 'plpgsql';
-
-select define_function_args('fs_simple_object__name', 'object_id');
-
-create function fs_simple_object__name(integer)
-returns integer as '
-declare
- p_object_id alias for $1;
-begin
- return name
- from fs_simple_objects
- where object_id = p_object_id;
-end;
-' language 'plpgsql';
-
-select define_function_args('fs_url__new','url_id,object_type;fs_url,url,folder_id,name,description,creation_date,creation_user,creation_ip,context_id');
-
-select define_function_args('fs_url__delete','url_id');
-
-select define_function_args('fs_url__copy','url_id;target_object_id');
-
-create function fs_url__new(integer,varchar,varchar,integer,varchar,varchar,timestamptz,integer,varchar,integer)
-returns integer as '
-DECLARE
- p_url_id alias for $1;
- p_object_type alias for $2;
- p_url alias for $3;
- p_folder_id alias for $4;
- p_name alias for $5;
- p_description alias for $6;
- p_creation_date alias for $7;
- p_creation_user alias for $8;
- p_creation_ip alias for $9;
- p_context_id alias for $10;
- v_url_id integer;
-BEGIN
- v_url_id:= fs_simple_object__new (
- p_url_id,
- p_object_type,
- p_folder_id,
- p_name,
- p_description,
- p_creation_date,
- p_creation_user,
- p_creation_ip,
- p_context_id
- );
-
- insert into fs_urls
- (url_id, url) values
- (v_url_id, p_url);
-
- return v_url_id;
-END;
-' language 'plpgsql';
-
-
-create function fs_url__delete(integer)
-returns integer as '
-DECLARE
- p_url_id alias for $1;
-BEGIN
- delete from fs_urls where url_id= p_url_id;
-
- PERFORM fs_simple_object__delete(p_url_id);
-
- return 0;
-END;
-' language 'plpgsql';
-
-
-create function fs_url__copy(integer,integer)
-returns integer as '
-DECLARE
- p_url_id alias for $1;
- p_target_folder_id alias for $2;
- v_new_url_id integer;
- v_url varchar;
- v_name varchar;
- v_description varchar;
- v_creation_user integer;
- v_creation_ip varchar;
-BEGIN
- select url
- into v_url
- from fs_urls
- where url_id = p_url_id;
-
- select name
- into v_name
- from fs_simple_objects
- where object_id = p_url_id;
-
- select description
- into v_description
- from fs_simple_objects
- where object_id = p_url_id;
-
- select creation_user
- into v_creation_user
- from acs_objects
- where object_id = p_url_id;
-
- select creation_ip
- into v_creation_ip
- from acs_objects
- where object_id = p_url_id;
-
- v_new_url_id:= fs_url__new (
- NULL,
- ''fs_url'',
- v_url,
- p_target_folder_id,
- v_name,
- v_description,
- NULL,
- v_creation_user,
- v_creation_ip,
- p_target_folder_id
- );
-
- return v_new_url_id;
-END;
-' language 'plpgsql';
Index: openacs-4/packages/file-storage/sql/postgresql/file-storage-views-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/file-storage-views-create.sql,v
diff -u -N -r1.6.2.2 -r1.6.2.3
--- openacs-4/packages/file-storage/sql/postgresql/file-storage-views-create.sql 18 Feb 2003 01:45:06 -0000 1.6.2.2
+++ openacs-4/packages/file-storage/sql/postgresql/file-storage-views-create.sql 20 Mar 2003 22:13:19 -0000 1.6.2.3
@@ -8,17 +8,17 @@
create view fs_urls_full
as
- select fs_urls.url_id,
- fs_urls.url,
- fs_simple_objects.folder_id,
- fs_simple_objects.name,
- fs_simple_objects.description,
+ select cr_extlinks.extlink_id as url_id,
+ cr_extlinks.url,
+ cr_items.parent_id as folder_id,
+ cr_extlinks.label as name,
+ cr_extlinks.description,
acs_objects.*
- from fs_urls,
- fs_simple_objects,
+ from cr_extlinks,
+ cr_items,
acs_objects
- where fs_urls.url_id = fs_simple_objects.object_id
- and fs_simple_objects.object_id = acs_objects.object_id;
+ where cr_extlinks.extlink_id = cr_items.item_id
+ and cr_items.item_id = acs_objects.object_id;
create view fs_folders
as
@@ -37,7 +37,6 @@
where cr_folders.folder_id = ci.item_id
and cr_folders.folder_id = acs_objects.object_id;
-
create view fs_files
as
select cr_revisions.item_id as file_id,
@@ -57,46 +56,38 @@
and cr_items.content_type = 'file_storage_object'
and cr_revisions.revision_id = acs_objects.object_id;
--- DRB: Simple advice: don't use this view in PostgreSQL because, unlike in Oracle, it is
--- *never* optimized ...
-
create view fs_objects
as
- select fs_folders.folder_id as object_id,
- 0 as live_revision,
- 'folder' as type,
- fs_folders.content_size,
- fs_folders.name,
- '' as file_upload_name,
- fs_folders.last_modified,
- '' as url,
- fs_folders.parent_id,
- fs_folders.key,
- 0 as sort_key
- from fs_folders
- union all
- select fs_files.file_id as object_id,
- fs_files.live_revision,
- fs_files.type,
- fs_files.content_size,
- fs_files.name,
- fs_files.file_upload_name,
- fs_files.last_modified,
- '' as url,
- fs_files.parent_id,
- fs_files.key,
- 1 as sort_key
- from fs_files
- union all
- select fs_urls_full.url_id as object_id,
- 0 as live_revision,
- 'url' as type,
- 0 as content_size,
- fs_urls_full.name,
- fs_urls_full.name as file_upload_name,
- fs_urls_full.last_modified,
- fs_urls_full.url,
- fs_urls_full.folder_id as parent_id,
- fs_urls_full.url as key,
- 1 as sort_key
- from fs_urls_full;
+ select cr_items.item_id as object_id,
+ cr_items.live_revision,
+ case
+ when cr_items.content_type = 'content_folder' then 'folder'
+ when cr_items.content_type = 'content_extlink' then 'url'
+ else cr_revisions.mime_type
+ end as type,
+ case
+ when cr_items.content_type = 'content_folder'
+ then (select count(*)
+ from cr_items ci2
+ where ci2.content_type <> 'content_folder'
+ and ci2.tree_sortkey between cr_items.tree_sortkey and tree_right(cr_items.tree_sortkey))
+ else 0
+ end as content_size,
+ case
+ when cr_items.content_type = 'content_folder' then cr_folders.label
+ when cr_items.content_type = 'content_extlink' then cr_extlinks.label
+ else cr_items.name
+ end as name,
+ cr_revisions.title as file_upload_name,
+ acs_objects.last_modified,
+ cr_extlinks.url,
+ cr_items.parent_id,
+ cr_items.name as key,
+ case
+ when cr_items.content_type = 'content_folder' then 0
+ else 1
+ end as sort_key
+ from cr_items left join cr_extlinks on (cr_items.item_id = cr_extlinks.extlink_id)
+ left join cr_folders on (cr_items.item_id = cr_folders.folder_id)
+ left join cr_revisions on (cr_items.live_revision = cr_revisions.revision_id)
+ join acs_objects on (cr_items.item_id = acs_objects.object_id);
Index: openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6.1-4.6.2.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6.1-4.6.2.sql,v
diff -u -N
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6.1-4.6.2.sql 20 Mar 2003 22:13:46 -0000 1.1.2.1
@@ -0,0 +1,104 @@
+-- Move old fs_simple_objects URLs to the content repository, where they
+-- belong.
+
+create or replace function inline_0() returns integer as '
+declare
+ fs_url record;
+ new_url_id cr_extlinks.extlink_id%TYPE;
+begin
+
+ for fs_url in select * from fs_urls_full
+ loop
+
+ if not content_folder__is_registered(fs_url.folder_id, ''content_extlink'', ''t'') then
+ perform content_folder__register_content_type(fs_url.folder_id, ''content_extlink'', ''t'');
+ end if;
+
+ new_url_id := content_extlink__new (
+ null,
+ fs_url.url,
+ fs_url.name,
+ fs_url.description,
+ fs_url.folder_id,
+ null,
+ fs_url.creation_date,
+ fs_url.creation_user,
+ fs_url.creation_ip
+ );
+
+ update acs_objects
+ set last_modified = fs_url.last_modified,
+ modifying_user = fs_url.modifying_user,
+ modifying_ip = fs_url.modifying_ip
+ where object_id = fs_url.object_id;
+
+ update acs_permissions
+ set object_id = new_url_id
+ where object_id = fs_url.object_id;
+
+ perform acs_object__delete(fs_url.object_id);
+
+ end loop;
+
+ return 0;
+
+end' language 'plpgsql';
+
+begin;
+ select inline_0();
+ drop function inline_0();
+ drop view fs_objects;
+ drop view fs_urls_full;
+ drop table fs_urls;
+ drop table fs_simple_objects;
+end;
+
+create view fs_urls_full
+as
+ select cr_extlinks.extlink_id as url_id,
+ cr_extlinks.url,
+ cr_items.parent_id as folder_id,
+ cr_extlinks.label as name,
+ cr_extlinks.description,
+ acs_objects.*
+ from cr_extlinks,
+ cr_items,
+ acs_objects
+ where cr_extlinks.extlink_id = cr_items.item_id
+ and cr_items.item_id = acs_objects.object_id;
+
+create view fs_objects
+as
+ select cr_items.item_id as object_id,
+ cr_items.live_revision,
+ case
+ when cr_items.content_type = 'content_folder' then 'folder'
+ when cr_items.content_type = 'content_extlink' then 'url'
+ else cr_revisions.mime_type
+ end as type,
+ case
+ when cr_items.content_type = 'content_folder'
+ then (select count(*)
+ from cr_items ci2
+ where ci2.content_type <> 'content_folder'
+ and ci2.tree_sortkey between cr_items.tree_sortkey and tree_right(cr_items.tree_sortkey))
+ else 0
+ end as content_size,
+ case
+ when cr_items.content_type = 'content_folder' then cr_folders.label
+ when cr_items.content_type = 'content_extlink' then cr_extlinks.label
+ else cr_items.name
+ end as name,
+ cr_revisions.title as file_upload_name,
+ acs_objects.last_modified,
+ cr_extlinks.url,
+ cr_items.parent_id,
+ cr_items.name as key,
+ case
+ when cr_items.content_type = 'content_folder' then 0
+ else 1
+ end as sort_key
+ from cr_items left join cr_extlinks on (cr_items.item_id = cr_extlinks.extlink_id)
+ left join cr_folders on (cr_items.item_id = cr_folders.folder_id)
+ left join cr_revisions on (cr_items.live_revision = cr_revisions.revision_id)
+ join acs_objects on (cr_items.item_id = acs_objects.object_id);
Index: openacs-4/packages/file-storage/tcl/file-storage-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/file-storage-procs.tcl,v
diff -u -N -r1.25.2.3 -r1.25.2.4
--- openacs-4/packages/file-storage/tcl/file-storage-procs.tcl 18 Feb 2003 01:45:42 -0000 1.25.2.3
+++ openacs-4/packages/file-storage/tcl/file-storage-procs.tcl 20 Mar 2003 22:13:59 -0000 1.25.2.4
@@ -322,10 +322,6 @@
} {
Return a list the object_ids contained by a file storage folder.
- This would be trivial if it weren't for the fact that we need to UNION ALL
- with the gawddamned fs_simple_objects Open Force forced upon us and which
- will be removed as soon as I (DRB) find the time to write upgrade scripts.
-
@param folder_id The folder for which to retrieve contents
@param user_id The viewer of the contents (to make sure they have
permission)
@@ -410,7 +406,7 @@
if {[string equal folder $type]} {
set result [publish_folder_to_file_system -folder_id $object_id -path $path -folder_name $name -user_id $user_id]
} elseif {[string equal url $type]} {
- set result [publish_simple_object_to_file_system -object_id $object_id -path $path -file_name $file_name]
+ set result [publish_url -object_id $object_id -path $path -file_name $file_name]
} else {
set result [publish_versioned_object_to_file_system -object_id $object_id -path $path]
}
@@ -449,29 +445,9 @@
return $dir
}
- ad_proc -public publish_simple_object_to_file_system {
+ ad_proc -public publish_url_to_file_system {
{-object_id:required}
{-path ""}
- {-file_name:required}
- } {
- publish a simple object to the file system; you must implement a proc
- named 'fs::publish_simple__to_file_system', where is the
- fs_simple_object type that you create, for each new simple file storage
- object you create.
- } {
- if {[empty_string_p $path]} {
- set path [ns_tmpnam]
- file mkdir $path
- }
-
- set object [db_list_of_ns_sets select_object_info {}]
-
- return [publish_simple_[ns_set get $object type]_to_file_system -object $object -path $path -file_name $file_name]
- }
-
- ad_proc -public publish_simple_url_to_file_system {
- {-object:required}
- {-path ""}
{-file_name ""}
} {
publish a url object to the file system
@@ -481,15 +457,15 @@
file mkdir $path
}
- set object [lindex $object 0]
+ db_1row select_object_metadata {}
if {[empty_string_p $file_name]} {
- set file_name [ns_set get $object name]
+ set file_name $label
}
set file_name [remove_special_file_system_characters -string $file_name]
set fp [open [file join ${path} ${file_name}] w]
- puts $fp [ns_set get $object url]
+ puts $fp url
close $fp
return [file join ${path} ${file_name}]
Index: openacs-4/packages/file-storage/tcl/file-storage-procs.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/file-storage-procs.xql,v
diff -u -N -r1.10.2.3 -r1.10.2.4
--- openacs-4/packages/file-storage/tcl/file-storage-procs.xql 7 Mar 2003 00:11:52 -0000 1.10.2.3
+++ openacs-4/packages/file-storage/tcl/file-storage-procs.xql 20 Mar 2003 22:13:59 -0000 1.10.2.4
@@ -57,21 +57,15 @@
- select *
- from (select cr_items.item_id as object_id,
- cr_items.name
- from cr_items
- where cr_items.parent_id = :folder_id
- union all
- select fs_simple_objects.object_id,
- fs_simple_objects.name
- from fs_simple_objects
- where fs_simple_objects.folder_id = :folder_id) contents
- where exists (select 1
- from acs_object_party_privilege_map m
- where m.object_id = contents.object_id
- and m.party_id = :user_id
- and m.privilege = 'read')
+ select cr_items.item_id as object_id,
+ cr_items.name
+ from cr_items
+ where cr_items.parent_id = :folder_id
+ and exists (select 1
+ from acs_object_party_privilege_map m
+ where m.object_id = cr_items.item_id
+ and m.party_id = :user_id
+ and m.privilege = 'read')
@@ -92,11 +86,11 @@
-
+
- select fs_objects.*
- from fs_objects
- where fs_objects.object_id = :object_id
+ select fs_urls_full.*
+ from fs_urls_full
+ where fs_urls_full.object_id = :object_id
Index: openacs-4/packages/file-storage/tcl/fs-simple-procs-oracle.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/Attic/fs-simple-procs-oracle.xql,v
diff -u -N
--- openacs-4/packages/file-storage/tcl/fs-simple-procs-oracle.xql 29 May 2002 23:02:19 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,27 +0,0 @@
-
-
-
- oracle8.1.6
-
-
-
- declare
- begin
- fs_simple_object.delete(:object_id);
- end;
-
-
-
-
-
- declare
- begin
- :1 := fs_url.copy(
- url_id => :url_id,
- target_folder_id => :target_folder_id
- );
- end;
-
-
-
-
Index: openacs-4/packages/file-storage/tcl/fs-simple-procs-postgresql.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/Attic/fs-simple-procs-postgresql.xql,v
diff -u -N
--- openacs-4/packages/file-storage/tcl/fs-simple-procs-postgresql.xql 29 May 2002 23:02:19 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,17 +0,0 @@
-
-
-
- postgresql7.1
-
-
-
- select fs_simple_object__delete(:object_id);
-
-
-
-
-
-
-
-
-
Index: openacs-4/packages/file-storage/tcl/fs-simple-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/Attic/fs-simple-procs.tcl,v
diff -u -N
--- openacs-4/packages/file-storage/tcl/fs-simple-procs.tcl 10 Sep 2002 22:22:55 -0000 1.4
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,93 +0,0 @@
-ad_library {
- TCL library for the file-storage system (v.4)
- extensions for non-versioned (simple) items
-
- @author Ben Adida (ben@openforce.net)
- @creation-date 01 April 2002
- @cvs-id $Id: fs-simple-procs.tcl,v 1.4 2002/09/10 22:22:55 jeffd Exp $
-}
-
-namespace eval fs {
-
- ad_proc -public simple_get_types {} {
- return {
- {fs_url "url"}
- }
- }
-
- ad_proc -public simple_get_type_pretty_name {
- {-type:required}
- } {
- set lst [simple_get_types]
- foreach item $lst {
- if {$type == [lindex $item 0]} {
- return [lindex $item 1]
- }
- }
-
- return ""
- }
-
- ad_proc -public url_new {
- {-url_id ""}
- {-name:required}
- {-description ""}
- {-url:required}
- {-folder_id:required}
- } {
- Create a new URL
- } {
- # Context
- set context_id $folder_id
-
- set extra_vars [ns_set create]
- oacs_util::vars_to_ns_set -ns_set $extra_vars -var_list {url_id name url folder_id description context_id}
-
- # Instantiate and return
- set url_id [package_instantiate_object -extra_vars $extra_vars fs_url]
- return $url_id
- }
-
- ad_proc -public url_edit {
- {-url_id:required}
- {-name:required}
- {-description ""}
- {-url:required}
- } {
- # Perform the update
- db_transaction {
- db_dml update_simple {}
- db_dml update_url {}
- }
- }
-
- ad_proc -public simple_object_move {
- {-object_id:required}
- {-folder_id:required}
- } {
- # Update the location
- db_dml update_folder{}
- }
-
- ad_proc -public simple_delete {
- {-object_id:required}
- } {
- # delete the item
- db_exec_plsql delete_item {}
- }
-
- ad_proc -public simple_p {
- {-object_id:required}
- } {
- # is this thing a simple fs object?
- return [db_string simple_check {}]
- }
- ad_proc -public url_copy {
- {-url_id:required}
- {-target_folder_id:required}
- } {
- # is this thing a simple fs object?
- return [db_exec_plsql copy {}]
- }
-
-}
Index: openacs-4/packages/file-storage/tcl/fs-simple-procs.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/Attic/fs-simple-procs.xql,v
diff -u -N
--- openacs-4/packages/file-storage/tcl/fs-simple-procs.xql 29 May 2002 23:02:19 -0000 1.2
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,37 +0,0 @@
-
-
-
-
-
-update fs_simple_objects set
-name= :name,
-description= :description
-where object_id= :url_id
-
-
-
-
-
-update fs_urls set
-url= :url
-where url_id= :url_id
-
-
-
-
-
-update fs_simple_objects set
-folder_id= :folder_id
-where url_id= :url_id
-
-
-
-
-
-select case when count(*) = 0 then 0 else 1 end
-from fs_simple_objects
-where object_id = :object_id
-
-
-
-
Index: openacs-4/packages/file-storage/www/folder-chunk-postgresql.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/folder-chunk-postgresql.xql,v
diff -u -N -r1.1.2.6 -r1.1.2.7
--- openacs-4/packages/file-storage/www/folder-chunk-postgresql.xql 18 Mar 2003 01:44:01 -0000 1.1.2.6
+++ openacs-4/packages/file-storage/www/folder-chunk-postgresql.xql 20 Mar 2003 22:14:12 -0000 1.1.2.7
@@ -14,69 +14,24 @@
fs_objects.url,
fs_objects.sort_key,
fs_objects.file_upload_name,
- case when fs_objects.last_modified >= (now() - interval '$n_past_days days') then 1 else 0 end as new_p,
- delete_p,
- write_p
- from
- (select fs_folders.folder_id as object_id,
- 0 as live_revision,
- 'folder' as type,
- fs_folders.content_size,
- fs_folders.name,
- '' as file_upload_name,
- fs_folders.last_modified,
- '' as url,
- fs_folders.parent_id,
- cast('f' as bool) as write_p,
- cast('f' as bool) as delete_p,
- 0 as sort_key
- from fs_folders
- where fs_folders.parent_id = :folder_id
- and exists (select 1
- from acs_object_party_privilege_map m
- where m.object_id = fs_folders.folder_id
- and m.party_id = :viewing_user_id
- and m.privilege = 'read')
- union all
- select fs_files.file_id as object_id,
- fs_files.live_revision,
- fs_files.type,
- fs_files.content_size,
- fs_files.name,
- fs_files.file_upload_name,
- fs_files.last_modified,
- '' as url,
- fs_files.parent_id,
- cast('f' as bool) as write_p,
- cast('f' as bool) as delete_p,
- 1 as sort_key
- from fs_files
- where fs_files.parent_id = :folder_id
- and exists (select 1
- from acs_object_party_privilege_map m
- where m.object_id = fs_files.file_id
- and m.party_id = :viewing_user_id
- and m.privilege = 'read')
- union all
- select fs_urls_full.url_id as object_id,
- 0 as live_revision,
- 'url' as type,
- 0 as content_size,
- fs_urls_full.name,
- fs_urls_full.name as file_upload_name,
- fs_urls_full.last_modified,
- fs_urls_full.url,
- fs_urls_full.folder_id as parent_id,
- acs_permission__permission_p(fs_urls_full.url_id, :viewing_user_id, 'write') as write_p,
- acs_permission__permission_p(fs_urls_full.url_id, :viewing_user_id, 'delete') as delete_p,
- 1 as sort_key
- from fs_urls_full
- where fs_urls_full.folder_id = :folder_id
- and exists (select 1
- from acs_object_party_privilege_map m
- where m.object_id = fs_urls_full.url_id
- and m.party_id = :viewing_user_id
- and m.privilege = 'read')) as fs_objects
+ case when fs_objects.last_modified >= (now() - cast('$n_past_days days' as interval)) then 1 else 0 end as new_p,
+ case
+ when type = 'url'
+ then acs_permission__permission_p(fs_objects.object_id, :viewing_user_id, 'delete')
+ else 't'
+ end as delete_p,
+ case
+ when type = 'url'
+ then acs_permission__permission_p(fs_objects.object_id, :viewing_user_id, 'write')
+ else 't'
+ end as write_p
+ from fs_objects
+ where fs_objects.parent_id = :folder_id
+ and exists (select 1
+ from acs_object_party_privilege_map m
+ where m.object_id = fs_objects.object_id
+ and m.party_id = :viewing_user_id
+ and m.privilege = 'read')
order by fs_objects.sort_key, fs_objects.name
Index: openacs-4/packages/file-storage/www/simple-add-2.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/simple-add-2.tcl,v
diff -u -N -r1.2 -r1.2.2.1
--- openacs-4/packages/file-storage/www/simple-add-2.tcl 27 Apr 2002 17:00:16 -0000 1.2
+++ openacs-4/packages/file-storage/www/simple-add-2.tcl 20 Mar 2003 22:14:12 -0000 1.2.2.1
@@ -21,7 +21,6 @@
# Check for write permission on this folder
ad_require_permission $folder_id write
-# Create the URL (for now)
-set url_id [fs::url_new -url $url -name $title -description $description -folder_id $folder_id]
+content_extlink::new -url $url -label $title -description $description -parent_id $folder_id
ad_returnredirect "?folder_id=$folder_id"
Index: openacs-4/packages/file-storage/www/simple-add.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/simple-add.adp,v
diff -u -N -r1.4 -r1.4.2.1
--- openacs-4/packages/file-storage/www/simple-add.adp 6 Sep 2002 21:50:38 -0000 1.4
+++ openacs-4/packages/file-storage/www/simple-add.adp 20 Mar 2003 22:14:12 -0000 1.4.2.1
@@ -4,7 +4,7 @@