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
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-content-repository/sql/postgresql/packages-create.sql 25 Mar 2001 02:59:13 -0000 1.1
@@ -0,0 +1,1765 @@
+-- Ensure that the data model is up-to-date before compiling packages
+
+\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
+\i content-symlink.sql
+\i content-extlink.sql
+\i content-folder.sql
+\i content-template.sql
+\i content-keyword.sql
+
+