Commit 19ef00e3 authored by Frank Bergmann's avatar Frank Bergmann

- OpenACS 5.9

parent 5ba754ff
......@@ -2,15 +2,15 @@
<!-- Generated by the OpenACS Package Manager -->
<package key="acs-content-repository" url="http://openacs.org/repository/apm/packages/acs-content-repository/" type="apm_service">
<package-name>Content Repository</package-name>
<pretty-plural>Content Repository Services</pretty-plural>
<package-name>ACS Content Repository</package-name>
<pretty-plural>ACS Content Repository Services</pretty-plural>
<initial-install-p>t</initial-install-p>
<singleton-p>t</singleton-p>
<version name="5.10.0d1" url="http://openacs.org/repository/download/apm/acs-content-repository-5.10.0d1.apm">
<version name="5.9.0" url="http://openacs.org/repository/download/apm/acs-content-repository-5.9.0.apm">
<owner url="http://openacs.org">OpenACS</owner>
<summary>The canonical repository for OpenACS content.</summary>
<release-date>2015-05-03</release-date>
<release-date>2015-10-04</release-date>
<vendor url="http://openacs.org">OpenACS</vendor>
<description format="text/html">Provides the API for creating and managing user generated content including
full support for versioning, rendering content to the filesystem, folders and composite content items, and
......@@ -19,10 +19,10 @@
<license>GPL</license>
<maturity>3</maturity>
<provides url="acs-content-repository" version="5.10.0d1"/>
<requires url="acs-kernel" version="5.10.0d1"/>
<requires url="acs-service-contract" version="5.10.0d1"/>
<requires url="search" version="5.10.0d1"/>
<provides url="acs-content-repository" version="5.9.0"/>
<requires url="acs-kernel" version="5.9.0"/>
<requires url="acs-service-contract" version="5.9.0"/>
<requires url="search" version="5.9.0"/>
<callbacks>
<callback type="after-upgrade" proc="content::apm::after_upgrade"/>
......
......@@ -117,7 +117,7 @@ insert into cr_mime_types (label,mime_type,file_extension) values ( 'Image - WAP
insert into cr_mime_types (label,mime_type,file_extension) values ( 'Image - CMU Raster' , 'image/x-cmu-raster' , 'ras' );
insert into cr_mime_types (label,mime_type,file_extension) values ( 'Image - Flexible Image Transport', 'image/x-fits' , 'fit' );
insert into cr_mime_types (label,mime_type,file_extension) values ( 'Image - Macromedia Freehand' , 'image/x-freehand' , 'fh' );
insert into cr_mime_types (label,mime_type,file_extension) values ( 'Image - SVG' , 'image/xml+svg' , 'svg' );
insert into cr_mime_types (label,mime_type,file_extension) values ( 'Image - SVG' , 'image/svg+xml' , 'svg' );
insert into cr_mime_types (label,mime_type,file_extension) values ( 'Image - PhotoCD' , 'image/x-photo-cd' , 'pcd' );
insert into cr_mime_types (label,mime_type,file_extension) values ( 'Image - Mac pict' , 'image/x-pict' , 'pict' );
insert into cr_mime_types (label,mime_type,file_extension) values ( 'Image - PNM' , 'image/x-portable-anymap' , 'pnm' );
......@@ -400,7 +400,7 @@ insert into cr_extension_mime_type_map (extension, mime_type) values ( 'stl','ap
insert into cr_extension_mime_type_map (extension, mime_type) values ( 'stm','audio/x-mod' );
insert into cr_extension_mime_type_map (extension, mime_type) values ( 'sv4cpio','application/x-sv4cpio' );
insert into cr_extension_mime_type_map (extension, mime_type) values ( 'sv4crc','application/x-sv4crc' );
insert into cr_extension_mime_type_map (extension, mime_type) values ( 'svg','image/xml+svg');
insert into cr_extension_mime_type_map (extension, mime_type) values ( 'svg','image/svg+xml');
insert into cr_extension_mime_type_map (extension, mime_type) values ( 'swf','application/x-shockwave-flash' );
insert into cr_extension_mime_type_map (extension, mime_type) values ( 't','application/x-troff' );
insert into cr_extension_mime_type_map (extension, mime_type) values ( 'tar','application/x-tar' );
......
......@@ -507,10 +507,10 @@ comment on column cr_revisions.nls_language is '
for multi-lingual searching in Intermedia.
';
alter table cr_items add constraint cr_items_live_fk
alter table cr_items add constraint cr_items_live_revision_fk
foreign key (live_revision) references cr_revisions(revision_id) on delete set null;
alter table cr_items add constraint cr_items_latest_fk
alter table cr_items add constraint cr_items_latest_revision_fk
foreign key (latest_revision) references cr_revisions(revision_id) on delete set null;
......
This diff is collapsed.
......@@ -147,7 +147,7 @@ BEGIN
execute 'alter table cr_items add
latest_revision integer
constraint cr_items_latest_fk
constraint cr_items_latest_revision_fk
references cr_revisions';
execute 'update cr_items
......
......@@ -18,10 +18,12 @@ DROP FUNCTION IF EXISTS cr_folder_ins_up_ri_trg();
--
-- Handle latest_revision and live_revision via foreign keys
--
--
ALTER TABLE cr_items DROP CONSTRAINT IF EXISTS cr_items_latest_fk;
ALTER TABLE cr_items ADD CONSTRAINT cr_items_latest_fk
FOREIGN KEY (latest_revision) REFERENCES cr_revisions(revision_id);
ALTER TABLE cr_items DROP CONSTRAINT IF EXISTS cr_items_live_fk;
ALTER TABLE cr_items ADD CONSTRAINT cr_items_live_fk
FOREIGN KEY (live_revision) REFERENCES cr_revisions(revision_id);
......
......@@ -26,38 +26,38 @@
-- constraints from acs-content-repository/sql/postgresql/content-revision.sql
ALTER TABLE cr_item_publish_audit DROP CONSTRAINT cr_item_publish_audit_orev_fk;
ALTER TABLE cr_item_publish_audit DROP CONSTRAINT IF EXISTS cr_item_publish_audit_orev_fk;
ALTER TABLE cr_item_publish_audit ADD CONSTRAINT cr_item_publish_audit_orev_fk
FOREIGN KEY (old_revision) REFERENCES cr_revisions(revision_id) ON DELETE CASCADE;
ALTER TABLE cr_item_publish_audit DROP CONSTRAINT cr_item_publish_audit_nrev_fk;
ALTER TABLE cr_item_publish_audit DROP CONSTRAINT IF EXISTS cr_item_publish_audit_nrev_fk;
ALTER TABLE cr_item_publish_audit ADD CONSTRAINT cr_item_publish_audit_nrev_fk
FOREIGN KEY (new_revision) REFERENCES cr_revisions(revision_id) ON DELETE CASCADE;
-- constraints from acs-content-repository/sql/postgresql/content-item.sql
ALTER TABLE cr_release_periods DROP CONSTRAINT cr_release_periods_item_id_fk;
ALTER TABLE cr_release_periods DROP CONSTRAINT IF EXISTS cr_release_periods_item_id_fk;
ALTER TABLE cr_release_periods ADD CONSTRAINT cr_release_periods_item_id_fk
FOREIGN KEY (item_id) REFERENCES cr_items(item_id) ON DELETE CASCADE;
ALTER TABLE cr_item_publish_audit DROP CONSTRAINT cr_item_publish_audit_item_fk;
ALTER TABLE cr_item_publish_audit DROP CONSTRAINT IF EXISTS cr_item_publish_audit_item_fk;
ALTER TABLE cr_item_publish_audit ADD CONSTRAINT cr_item_publish_audit_item_fk
FOREIGN KEY (item_id) REFERENCES cr_items(item_id) ON DELETE CASCADE;
ALTER TABLE cr_item_template_map DROP CONSTRAINT cr_item_template_map_item_fk;
ALTER TABLE cr_item_template_map DROP CONSTRAINT IF EXISTS cr_item_template_map_item_fk;
ALTER TABLE cr_item_template_map ADD CONSTRAINT cr_item_template_map_item_fk
FOREIGN KEY (item_id) REFERENCES cr_items(item_id) ON DELETE CASCADE;
ALTER TABLE cr_item_keyword_map DROP CONSTRAINT cr_item_keyword_map_item_id_fk;
ALTER TABLE cr_item_keyword_map DROP CONSTRAINT IF EXISTS cr_item_keyword_map_item_id_fk;
ALTER TABLE cr_item_keyword_map ADD CONSTRAINT cr_item_keyword_map_item_id_fk
FOREIGN KEY (item_id) REFERENCES cr_items(item_id) ON DELETE CASCADE;
ALTER TABLE cr_items DROP CONSTRAINT cr_items_latest_fk;
ALTER TABLE cr_items DROP CONSTRAINT IF EXISTS cr_items_latest_fk;
ALTER TABLE cr_items ADD CONSTRAINT cr_items_latest_fk
FOREIGN KEY (latest_revision) REFERENCES cr_revisions(revision_id) on delete set null;
ALTER TABLE cr_items DROP CONSTRAINT cr_items_live_fk;
ALTER TABLE cr_items DROP CONSTRAINT IF EXISTS cr_items_live_fk;
ALTER TABLE cr_items ADD CONSTRAINT cr_items_live_fk
FOREIGN KEY (live_revision) REFERENCES cr_revisions(revision_id) on delete set null;
......
......@@ -53,3 +53,9 @@ ad_proc -public -callback subsite::parameter_changed -impl acs-content-repositor
ns_log Debug "subsite::parameter_changed -impl acs-content-repository don't care about $parameter"
}
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -51,3 +51,9 @@ if {![nsv_exists CR_LOCATIONS CR_FILES]} {
##
cr_scan_mime_types
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -42,3 +42,9 @@ ad_proc -public content::apm::after_upgrade {
}
}
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -117,3 +117,9 @@ ad_proc -public content::extlink::name {
} {
return [db_string get {}]
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -337,3 +337,9 @@ ad_proc content::folder::get_folder_from_package_not_cached {
} {
return [db_string get_folder_id "select folder_id from cr_folders where package_id=:package_id"]
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
nsv_set mutex cr_file_creation [ns_mutex create oacs:cr_file_creation]
exec touch [cr_fs_path]/file-creation.log
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -184,3 +184,9 @@ ad_proc -public content::permission::revoke_permission_h {
[list privilege $privilege ] \
] content_permission revoke_permission_h]
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -481,3 +481,9 @@ ad_proc -public content::revision::get_cr_file_path {
return [cr_fs_path $storage_area_key]${filename}
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -119,3 +119,9 @@ ad_proc -public content::symlink::resolve_content_type {
[list item_id $item_id ] \
] content_symlink resolve_content_type]
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -102,3 +102,9 @@ ad_proc -public content::template::is_template {
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -397,3 +397,9 @@ ad_proc -public content::type::content_type_p_not_cached {
} {
return [db_string content_type_p "" -default 0]
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -210,3 +210,9 @@ namespace eval doc {
}
}
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -110,3 +110,9 @@ ad_proc -deprecated content_extlink::extlink_name {
} {
return [db_string extlink_name {}]
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -326,3 +326,9 @@ ad_proc -public content::deploy { url_stub } {
template::util::write_file $output_path $output
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -20,3 +20,9 @@ ad_proc -public -deprecated folder::delete {
} {
db_exec_plsql delete_folder {}
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -431,3 +431,9 @@ ad_proc -private image::resize_existing_images {
}
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -692,3 +692,9 @@ ad_proc -public -deprecated item::delete {
::content::item::delete -item_id $item_id
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -130,6 +130,8 @@ ad_proc -public -deprecated cr::keyword::item_get_assigned {
If parent_id is supplied, only keywords that are children of
parent_id are listed.
@see content::keyword::item_get_assigned
} {
if {[info exists parent_id]} {
......@@ -163,3 +165,9 @@ ad_proc -public -deprecated cr::keyword::get_children {
return [content::keyword::get_children -parent_id $parent_id]
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -1108,3 +1108,9 @@ ad_proc -public publish::write_content { revision_id args } {
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -430,3 +430,9 @@ ad_proc -public cr_create_mime_type {
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -149,3 +149,9 @@ ad_proc content_search__search_ids {
return $result(ids)
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -134,3 +134,9 @@ ad_proc -public -deprecated content_symlink::resolve_content_type {
return [db_exec_plsql resolve_content_type ""]
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -41,3 +41,9 @@ aa_register_case -cats {smoke api} acs_content_repository_trivial_smoke_test {
# would test that delete works but there's no relevant function in the API
}
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -67,4 +67,9 @@ aa_register_case content_folder {
aa_true "Parent is not subfolder of child" [string equal "f" $is_subfolder]
}
}
\ No newline at end of file
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -266,3 +266,9 @@ aa_register_case content_item {
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -36,4 +36,9 @@ aa_register_case content_keyword {
aa_true "Keyword deleted" \
[string equal [db_string confirm_delete "" -default ""] ""]
}
}
\ No newline at end of file
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -132,3 +132,9 @@ aa_register_case -cats db cr_item_search_triggers {
}
}
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -38,3 +38,9 @@ db_multirow -extend {action action_url} extensions get_extensions {} {
set action_url [export_vars -base "unmap" {mime_type extension return_url}]
set action "Unmap"
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -97,3 +97,9 @@ if { $extension_p } {
}
set context [list $doc(title)]
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -45,3 +45,9 @@ ad_form -name extension_new -export {return_url} -cancel_url $return_url -form {
ad_script_abort
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -42,3 +42,9 @@ ad_form -name mime_type_new -export {return_url} -cancel_url $return_url -form {
ad_script_abort
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -17,3 +17,9 @@ if { $return_url eq "" } {
db_dml extension_unmap {}
ad_returnredirect $return_url
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -2,10 +2,12 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Package: content}</property>
<property name="doc(title)">Package: content</property>
<master>
<body>
<h2>content</h2><p>
<a href="../index.html">Content Repository</a> : content</p><hr><ul><li>Function content.blob_to_string</li></ul><table cellpadding="3" cellspacing="0" border="0">
<h2>content</h2>
<p>
<a href="../index">Content Repository</a> : content</p>
<hr>
<ul><li>Function content.blob_to_string</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
function blob_to_string(
blob_loc blob) return varchar2
......@@ -17,7 +19,9 @@ name
) return java.lang.String';
</tt></pre></td></tr>
</table><ul><li>Procedure content.blob_to_file</li></ul><table cellpadding="3" cellspacing="0" border="0">
</table>
<ul><li>Procedure content.blob_to_file</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
procedure blob_to_file(
s varchar2, blob_loc blob)
......@@ -29,7 +33,9 @@ name
)';
</tt></pre></td></tr>
</table><ul><li>Procedure content.string_to_blob</li></ul><table cellpadding="3" cellspacing="0" border="0">
</table>
<ul><li>Procedure content.string_to_blob</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
procedure string_to_blob(
s varchar2, blob_loc blob)
......@@ -41,7 +47,9 @@ name
)';
</tt></pre></td></tr>
</table><ul><li>Procedure content.string_to_blob_size</li></ul><table cellpadding="3" cellspacing="0" border="0">
</table>
<ul><li>Procedure content.string_to_blob_size</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
procedure string_to_blob_size(
s varchar2, blob_loc blob, blob_size number)
......@@ -53,6 +61,6 @@ name
)';
</tt></pre></td></tr>
</table><p>Last Modified: $Id: content.html,v 1.1.1.1 2001/03/13 22:59:26
</table>
<p>Last Modified: $&zwnj;Id: content.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $</p>
</body>
......@@ -2,21 +2,32 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Package: content_extlink}</property>
<property name="doc(title)">Package: content_extlink</property>
<master>
<body>
<h2>content_extlink</h2><p>
<a href="../index.html">Content Repository</a> :
content_extlink</p><hr><ul>
<h2>content_extlink</h2>
<p>
<a href="../index">Content Repository</a> :
content_extlink</p>
<hr>
<ul>
<li><a href="#overview">Overview</a></li><li><a href="#related">Related Objects</a></li><li><a href="#api">API</a></li>
</ul><p> </p><h3><a name="overview">Overview</a></h3><p>External links are references to content pages on other web
</ul>
<p> </p>
<h3><a name="overview">Overview</a></h3>
<p>External links are references to content pages on other web
sites. They provide the basis for maintaining a hierarchy of
"bookmarks" that may be managed in a manner analogous to other
content items. In particular, external links may be tagged with
keywords and related to the site's own content items.</p><p> </p><h3><a name="related">Related Objects</a></h3>
keywords and related to the site's own content items.</p>
<p> </p>
<h3><a name="related">Related Objects</a></h3>
See also: {content_item }
<p> </p><h3><a name="api">API</a></h3><ul><li>
<p> </p>
<h3><a name="api">API</a></h3>
<ul><li>
<font size="+1">Function:</font>
content_extlink.is_extlink</li></ul><p>Determines if the item is a extlink</p><table cellpadding="3" cellspacing="0" border="0">
content_extlink.is_extlink</li></ul>
<p>Determines if the item is a extlink</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -31,9 +42,13 @@ function is_extlink (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_extlink.new, content_extlink.resolve</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Function:</font> content_extlink.new</li></ul><p>Create a new extlink, an item pointing to an off-site
resource</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font> content_extlink.new</li></ul>
<p>Create a new extlink, an item pointing to an off-site
resource</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -82,8 +97,12 @@ function new (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>acs_object.new, content_item.new, content_extlink.resolve</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Procedure:</font> content_extlink.delete</li></ul><p>Deletes the extlink</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font> content_extlink.delete</li></ul>
<p>Deletes the extlink</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1"><tr>
......@@ -96,7 +115,8 @@ procedure delete (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_extlink.new, acs_object.delete</td>
</tr>
</table><p> </p>
Last Modified: $Id: extlink.html,v 1.1.1.1 2001/03/13 22:59:26 ben
</table>
<p> </p>
Last Modified: $&zwnj;Id: extlink.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
</body>
This diff is collapsed.
This diff is collapsed.
......@@ -2,19 +2,30 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Package: content_keyword}</property>
<property name="doc(title)">Package: content_keyword</property>
<master>
<body>
<h2>content_keyword</h2><p>
<a href="../index.html">Content Repository</a> :
content_keyword</p><hr><ul>
<h2>content_keyword</h2>
<p>
<a href="../index">Content Repository</a> :
content_keyword</p>
<hr>
<ul>
<li><a href="#overview">Overview</a></li><li><a href="#related">Related Objects</a></li><li><a href="#api">API</a></li>
</ul><p> </p><h3><a name="overview">Overview</a></h3><p>Keyword cassify a content_item. For example: If you have some
</ul>
<p> </p>
<h3><a name="overview">Overview</a></h3>
<p>Keyword cassify a content_item. For example: If you have some
press releases about dogs. You might want assigning the Keyword dog
to every single content_item.</p><p> </p><h3><a name="related">Related Objects</a></h3>
to every single content_item.</p>
<p> </p>
<h3><a name="related">Related Objects</a></h3>
See also: content_item
<p> </p><h3><a name="api">API</a></h3><ul><li>
<p> </p>
<h3><a name="api">API</a></h3>
<ul><li>
<font size="+1">Function:</font>
content_keyword.get_description</li></ul><p>Retrieves the description of the content keyword</p><table cellpadding="3" cellspacing="0" border="0">
content_keyword.get_description</li></ul>
<p>Retrieves the description of the content keyword</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -30,9 +41,13 @@ function get_description (
<th align="left" valign="top">See Also:</th><td>content_keyword.get_heading,
content_keyword.set_description</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_keyword.get_heading</li></ul><p>Retrieves the heading of the content keyword</p><table cellpadding="3" cellspacing="0" border="0">
content_keyword.get_heading</li></ul>
<p>Retrieves the heading of the content keyword</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -48,9 +63,13 @@ function get_heading (
<th align="left" valign="top">See Also:</th><td>content_keyword.set_heading,
content_keyword.get_description</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Function:</font> content_keyword.get_path</li></ul><p>Retreives a path to the keyword/subject category, with the most
general category at the root of the path</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font> content_keyword.get_path</li></ul>
<p>Retreives a path to the keyword/subject category, with the most
general category at the root of the path</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -66,9 +85,13 @@ function get_path (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_keyword.new</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_keyword.is_assigned</li></ul><p>Determines if the keyword is assigned to the item</p><table cellpadding="3" cellspacing="0" border="0">
content_keyword.is_assigned</li></ul>
<p>Determines if the keyword is assigned to the item</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -104,9 +127,13 @@ function is_assigned (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_keyword.item_assign</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Function:</font> content_keyword.is_leaf</li></ul><p>Determines if the keyword has no sub-keywords associated with
it</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font> content_keyword.is_leaf</li></ul>
<p>Determines if the keyword has no sub-keywords associated with
it</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -122,8 +149,12 @@ function is_leaf (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_keyword.new</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Function:</font> content_keyword.new</li></ul><p>Creates a new keyword (also known as "subject category").</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font> content_keyword.new</li></ul>
<p>Creates a new keyword (also known as "subject category").</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -170,10 +201,14 @@ function new (
<th align="left" valign="top">See Also:</th><td>acs_object.new, content_item.new, content_keyword.item_assign,
content_keyword.delete</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Procedure:</font> content_keyword.delete</li></ul><p>Deletes the specified keyword, which must be a leaf. Unassigns
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font> content_keyword.delete</li></ul>
<p>Deletes the specified keyword, which must be a leaf. Unassigns
the keyword from all content items. Use with caution - this
operation cannot be undone.</p><table cellpadding="3" cellspacing="0" border="0">
operation cannot be undone.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1"><tr>
......@@ -186,10 +221,14 @@ procedure delete (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>acs_object.delete, content_keyword.item_unassign</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_keyword.item_assign</li></ul><p>Assigns this keyword to a content item, creating a relationship
between them</p><table cellpadding="3" cellspacing="0" border="0">
content_keyword.item_assign</li></ul>
<p>Assigns this keyword to a content item, creating a relationship
between them</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -216,10 +255,14 @@ procedure item_assign (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>acs_rel.new, content_keyword.item_unassign</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_keyword.item_unassign</li></ul><p>Unassigns this keyword to a content item, removing a
relationship between them</p><table cellpadding="3" cellspacing="0" border="0">
content_keyword.item_unassign</li></ul>
<p>Unassigns this keyword to a content item, removing a
relationship between them</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -237,9 +280,13 @@ procedure item_unassign (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>acs_rel.delete, content_keyword.item_assign</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_keyword.set_description</li></ul><p>Sets a new description for the keyword</p><table cellpadding="3" cellspacing="0" border="0">
content_keyword.set_description</li></ul>
<p>Sets a new description for the keyword</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -258,9 +305,13 @@ procedure set_description (
<th align="left" valign="top">See Also:</th><td>content_keyword.set_heading,
content_keyword.get_description</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_keyword.set_heading</li></ul><p>Sets a new heading for the keyword</p><table cellpadding="3" cellspacing="0" border="0">
content_keyword.set_heading</li></ul>
<p>Sets a new heading for the keyword</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -279,7 +330,8 @@ procedure set_heading (
<th align="left" valign="top">See Also:</th><td>content_keyword.get_heading,
content_keyword.set_description</td>
</tr>
</table><p> </p>
Last Modified: $Id: keyword.html,v 1.1.1.1 2001/03/13 22:59:26 ben
</table>
<p> </p>
Last Modified: $&zwnj;Id: keyword.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
</body>
......@@ -2,22 +2,33 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Package: content_permission}</property>
<property name="doc(title)">Package: content_permission</property>
<master>
<body>
<h2>content_permission</h2><p>
<a href="../index.html">Content Repository</a> :
content_permission</p><hr><ul>
<h2>content_permission</h2>
<p>
<a href="../index">Content Repository</a> :
content_permission</p>
<hr>
<ul>
<li><a href="#overview">Overview</a></li><li><a href="#related">Related Objects</a></li><li><a href="#api">API</a></li>
</ul><p> </p><h3><a name="overview">Overview</a></h3><p>Permissions can be set to allow certain users certain things. -
</ul>
<p> </p>
<h3><a name="overview">Overview</a></h3>
<p>Permissions can be set to allow certain users certain things. -
They can be compared with the Unix filesystem permission: read,
write ...</p><p> </p><h3><a name="related">Related Objects</a></h3>
write ...</p>
<p> </p>
<h3><a name="related">Related Objects</a></h3>
See also: {content_item }
<p> </p><h3><a name="api">API</a></h3><ul><li>
<p> </p>
<h3><a name="api">API</a></h3>
<ul><li>
<font size="+1">Function:</font>
content_permission.has_grant_authority</li></ul><p>Determine if the user may grant a certain permission to another
content_permission.has_grant_authority</li></ul>
<p>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.</p><table cellpadding="3" cellspacing="0" border="0">
posesses the cm_perm_admin access.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -43,13 +54,17 @@ otherwise</td>
content_permission.is_has_revoke_authority,
acs_permission.grant_permission</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_permission.has_revoke_authority</li></ul><p>Determine if the user may take a certain permission away from
content_permission.has_revoke_authority</li></ul>
<p>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.</p><table cellpadding="3" cellspacing="0" border="0">
access.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -78,12 +93,16 @@ otherwise</td>
content_permission.revoke_permission,
acs_permission.revoke_permission</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_permission.permission_p</li></ul><p>Determine if the user has the specified permission on the
content_permission.permission_p</li></ul>
<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.</p><table cellpadding="3" cellspacing="0" border="0">
automatically gain the permission on all the child objects.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -109,12 +128,17 @@ the object, 'f' otherwise</td>
content_permission.revoke_permission,
acs_permission.permission_p</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_permission.grant_permission</li></ul><p>This is a helper function for
content_permission.grant_permission</li></ul>
<p>This is a helper function for
content_permission.grant_permission and should not be called
individually.</p><p>Grants a permission and revokes all descendants of the
permission, since they are no longer relevant.</p><table cellpadding="3" cellspacing="0" border="0">
individually.</p>
<p>Grants a permission and revokes all descendants of the
permission, since they are no longer relevant.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -135,12 +159,17 @@ permission, since they are no longer relevant.</p><table cellpadding="3" cellspa
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_permission.grant_permission</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_permission.grant_permission_h</li></ul><p>This is a helper function for
content_permission.grant_permission_h</li></ul>
<p>This is a helper function for
content_permission.grant_permission and should not be called
individually.</p><p>Grants a permission and revokes all descendants of the
permission, since they are no longer relevant.</p><table cellpadding="3" cellspacing="0" border="0">
individually.</p>
<p>Grants a permission and revokes all descendants of the
permission, since they are no longer relevant.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -161,11 +190,15 @@ permission, since they are no longer relevant.</p><table cellpadding="3" cellspa
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_permission.grant_permission</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_permission.inherit_permissions</li></ul><p>Make the child object inherit all of the permissions of the
content_permission.inherit_permissions</li></ul>
<p>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</p><table cellpadding="3" cellspacing="0" border="0">
object is created under a given parent</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -184,12 +217,17 @@ object is created under a given parent</p><table cellpadding="3" cellspacing="0"
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_permission.grant, acs_permission.grant_permission</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_permission.revoke_permission</li></ul><p>This is a helper function for
content_permission.revoke_permission</li></ul>
<p>This is a helper function for
content_permission.revoke_permission and should not be called
individually.</p><p>Revokes a permission but grants all child permissions to the
holder, to ensure that the permission is not permanently lost</p><table cellpadding="3" cellspacing="0" border="0">
individually.</p>
<p>Revokes a permission but grants all child permissions to the
holder, to ensure that the permission is not permanently lost</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -210,12 +248,17 @@ holder, to ensure that the permission is not permanently lost</p><table cellpadd
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_permission.revoke_permission</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_permission.revoke_permission_h</li></ul><p>This is a helper function for
content_permission.revoke_permission_h</li></ul>
<p>This is a helper function for
content_permission.revoke_permission and should not be called
individually.</p><p>Revokes a permission but grants all child permissions to the
holder, to ensure that the permission is not permanently lost</p><table cellpadding="3" cellspacing="0" border="0">
individually.</p>
<p>Revokes a permission but grants all child permissions to the
holder, to ensure that the permission is not permanently lost</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -236,7 +279,8 @@ holder, to ensure that the permission is not permanently lost</p><table cellpadd
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_permission.revoke_permission</td>
</tr>
</table><p> </p>
Last Modified: $Id: permission.html,v 1.1.1.1 2001/03/13 22:59:26
</table>
<p> </p>
Last Modified: $&zwnj;Id: permission.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $
</body>
......@@ -2,21 +2,32 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Package: content_revision}</property>
<property name="doc(title)">Package: content_revision</property>
<master>
<body>
<h2>content_revision</h2><p>
<a href="../index.html">Content Repository</a> :
content_revision</p><hr><ul>
<h2>content_revision</h2>
<p>
<a href="../index">Content Repository</a> :
content_revision</p>
<hr>
<ul>
<li><a href="#overview">Overview</a></li><li><a href="#related">Related Objects</a></li><li><a href="#api">API</a></li>
</ul><p> </p><h3><a name="overview">Overview</a></h3><p>Content revisions contain the data for content items. There is a
</ul>
<p> </p>
<h3><a name="overview">Overview</a></h3>
<p>Content revisions contain the data for content items. There is a
many to one relationship between content revisions and content
items. There is at most one "live" revision for every content item
though. For example, there may be 5 revisions of the review for the
movie "Terminator," yet only one of these may be live on the
website at a given time.</p><p> </p><h3><a name="related">Related Objects</a></h3>
website at a given time.</p>
<p> </p>
<h3><a name="related">Related Objects</a></h3>
See also: {content_item }
<p> </p><h3><a name="api">API</a></h3><ul><li>
<font size="+1">Function:</font> content_revision.copy</li></ul><p>Creates a new copy of an attribute, including all attributes</p><table cellpadding="3" cellspacing="0" border="0">
<p> </p>
<h3><a name="api">API</a></h3>
<ul><li>
<font size="+1">Function:</font> content_revision.copy</li></ul>
<p>Creates a new copy of an attribute, including all attributes</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1"><tr>
......@@ -30,20 +41,27 @@ function copy (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_revision.new</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_revision.export_xml</li></ul><table cellpadding="3" cellspacing="0" border="0">
content_revision.export_xml</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
function export_xml (
revision_id IN cr_revisions.revision_id%TYPE
) return cr_xml_docs.doc_id%TYPE;
</tt></pre></td></tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_revision.get_number</li></ul><p>Return the revision number of the specified revision, according
content_revision.get_number</li></ul>
<p>Return the revision number of the specified revision, according
to the chronological order in which revisions have been added for
this item.</p><table cellpadding="3" cellspacing="0" border="0">
this item.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -58,9 +76,12 @@ function get_number (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_revision.new</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_revision.import_xml</li></ul><table cellpadding="3" cellspacing="0" border="0">
content_revision.import_xml</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
function import_xml (
item_id IN cr_items.item_id%TYPE,
......@@ -69,8 +90,12 @@ function import_xml (
) return cr_revisions.revision_id%TYPE;
</tt></pre></td></tr>
</table><p> </p><ul><li>
<font size="+1">Function:</font> content_revision.new</li></ul><p>Create a new revision for an item.</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font> content_revision.new</li></ul>
<p>Create a new revision for an item.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -126,8 +151,11 @@ function new (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>acs_object.new, content_item.new</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Function:</font> content_revision.read_xml</li></ul><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font> content_revision.read_xml</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
function read_xml (
item_id IN number,
......@@ -141,9 +169,12 @@ name
) return int';
</tt></pre></td></tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_revision.write_xml</li></ul><table cellpadding="3" cellspacing="0" border="0">
content_revision.write_xml</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
function write_xml (
revision_id IN number,
......@@ -156,8 +187,12 @@ name
) return int';
</tt></pre></td></tr>
</table><p> </p><ul><li>
<font size="+1">Procedure:</font> content_revision.delete</li></ul><p>Deletes the revision.</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font> content_revision.delete</li></ul>
<p>Deletes the revision.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1"><tr>
......@@ -170,11 +205,15 @@ procedure delete (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_revision.new, acs_object.delete</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font>
content_revision.index_attributes</li></ul><p>Generates an XML document for insertion into
content_revision.index_attributes</li></ul>
<p>Generates an XML document for insertion into
cr_revision_attributes, which is indexed by Intermedia for
searching attributes.</p><table cellpadding="3" cellspacing="0" border="0">
searching attributes.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1"><tr>
......@@ -187,8 +226,11 @@ procedure index_attributes(
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_revision.new</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Procedure:</font> content_revision.replace</li></ul><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font> content_revision.replace</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
procedure replace(
revision_id number, search varchar2, replace varchar2)
......@@ -200,8 +242,12 @@ name
)';
</tt></pre></td></tr>
</table><p> </p><ul><li>
<font size="+1">Procedure:</font> content_revision.to_html</li></ul><p>Converts a revision uploaded as a binary document to html</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font> content_revision.to_html</li></ul>
<p>Converts a revision uploaded as a binary document to html</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1"><tr>
......@@ -212,7 +258,8 @@ procedure to_html (
);
</tt></pre></td></tr>
</table><p> </p>
Last Modified: $Id: revision.html,v 1.1.1.1 2001/03/13 22:59:26 ben
</table>
<p> </p>
Last Modified: $&zwnj;Id: revision.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
</body>
......@@ -2,18 +2,29 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Package: content_symlink}</property>
<property name="doc(title)">Package: content_symlink</property>
<master>
<body>
<h2>content_symlink</h2><p>
<a href="../index.html">Content Repository</a> :
content_symlink</p><hr><ul>
<h2>content_symlink</h2>
<p>
<a href="../index">Content Repository</a> :
content_symlink</p>
<hr>
<ul>
<li><a href="#overview">Overview</a></li><li><a href="#related">Related Objects</a></li><li><a href="#api">API</a></li>
</ul><p> </p><h3><a name="overview">Overview</a></h3><p>Symlinks are pointers to items within the content repository.
They are simply used to create links between content items.</p><p> </p><h3><a name="related">Related Objects</a></h3>
</ul>
<p> </p>
<h3><a name="overview">Overview</a></h3>
<p>Symlinks are pointers to items within the content repository.
They are simply used to create links between content items.</p>
<p> </p>
<h3><a name="related">Related Objects</a></h3>
See also: content_item, content_folder
<p> </p><h3><a name="api">API</a></h3><ul><li>
<p> </p>
<h3><a name="api">API</a></h3>
<ul><li>
<font size="+1">Function:</font>
content_symlink.is_symlink</li></ul><p>Determines if the item is a symlink</p><table cellpadding="3" cellspacing="0" border="0">
content_symlink.is_symlink</li></ul>
<p>Determines if the item is a symlink</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -28,8 +39,12 @@ function is_symlink (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_symlink.new, content_symlink.resolve</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Function:</font> content_symlink.new</li></ul><p>Create a new symlink, linking two items</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font> content_symlink.new</li></ul>
<p>Create a new symlink, linking two items</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -76,8 +91,12 @@ function new (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>acs_object.new, content_item.new, content_symlink.resolve</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Function:</font> content_symlink.resolve</li></ul><p>Resolves the symlink and returns the target item id.</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font> content_symlink.resolve</li></ul>
<p>Resolves the symlink and returns the target item id.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -93,9 +112,13 @@ function resolve (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_symlink.new, content_symlink.is_symlink</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_symlink.resolve_content_type</li></ul><p>Gets the content type of the target item.</p><table cellpadding="3" cellspacing="0" border="0">
content_symlink.resolve_content_type</li></ul>
<p>Gets the content type of the target item.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Michael Pih</td>
</tr><tr>
......@@ -111,9 +134,13 @@ function resolve_content_type (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_symlink.resolve</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Procedure:</font> content_symlink.copy</li></ul><p>Copies the symlink itself to another folder, without resolving
the symlink</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font> content_symlink.copy</li></ul>
<p>Copies the symlink itself to another folder, without resolving
the symlink</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1">
......@@ -131,8 +158,12 @@ procedure copy (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_symlink.new, content_item.copy</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Procedure:</font> content_symlink.delete</li></ul><p>Deletes the symlink</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font> content_symlink.delete</li></ul>
<p>Deletes the symlink</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1"><tr>
......@@ -145,7 +176,8 @@ procedure delete (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_symlink.new, acs_object.delete</td>
</tr>
</table><p> </p>
Last Modified: $Id: symlink.html,v 1.1.1.1.28.1 2014/09/16 20:43:09
gustafn Exp $
</body>
</table>
<p> </p>
Last Modified: $&zwnj;Id: symlink.html,v 1.2 2014/10/27 16:39:14 victorg
Exp $
......@@ -2,21 +2,32 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Package: content_template}</property>
<property name="doc(title)">Package: content_template</property>
<master>
<body>
<h2>content_template</h2><p>
<a href="../index.html">Content Repository</a> :
content_template</p><hr><ul>
<h2>content_template</h2>
<p>
<a href="../index">Content Repository</a> :
content_template</p>
<hr>
<ul>
<li><a href="#overview">Overview</a></li><li><a href="#related">Related Objects</a></li><li><a href="#api">API</a></li>
</ul><p> </p><h3><a name="overview">Overview</a></h3><p>Templates are a special class of text objects that are used for
</ul>
<p> </p>
<h3><a name="overview">Overview</a></h3>
<p>Templates are a special class of text objects that are used for
specifying the layout of a content item. They may be mapped to
content types, meaning that every item of that type will display
using that template unless a specific item overrides the default by
mapping to a template itself.</p><p> </p><h3><a name="related">Related Objects</a></h3>
mapping to a template itself.</p>
<p> </p>
<h3><a name="related">Related Objects</a></h3>
See also: content_item, content_folder
<p> </p><h3><a name="api">API</a></h3><ul><li>
<font size="+1">Function:</font> content_template.get_path</li></ul><p>Retrieves the full path to the template, as described in
content_item.get_path</p><table cellpadding="3" cellspacing="0" border="0">
<p> </p>
<h3><a name="api">API</a></h3>
<ul><li>
<font size="+1">Function:</font> content_template.get_path</li></ul>
<p>Retrieves the full path to the template, as described in
content_item.get_path</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -38,16 +49,23 @@ function get_path (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_item.get_path</td>
</tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_template.get_root_folder</li></ul><table cellpadding="3" cellspacing="0" border="0">
content_template.get_root_folder</li></ul>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><i>Not yet documented</i></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
function get_root_folder return cr_folders.folder_id%TYPE;
</tt></pre></td></tr>
</table><p> </p><ul><li>
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font>
content_template.is_template</li></ul><p>Determine if an item is a template.</p><table cellpadding="3" cellspacing="0" border="0">
content_template.is_template</li></ul>
<p>Determine if an item is a template.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -62,9 +80,13 @@ function is_template (
</tt></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_template.new</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Function:</font> content_template.new</li></ul><p>Creates a new content template which can be used to render
content items.</p><table cellpadding="3" cellspacing="0" border="0">
</table>
<p> </p>
<ul><li>
<font size="+1">Function:</font> content_template.new</li></ul>
<p>Creates a new content template which can be used to render
content items.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -105,10 +127,14 @@ function new (
<th align="left" valign="top">See Also:</th><td>acs_object.new, content_item.new,
content_item.register_template, content_type.register_template</td>
</tr>
</table><p> </p><ul><li>
<font size="+1">Procedure:</font> content_template.delete</li></ul><p>Deletes the specified template, and unregisters the template
</table>
<p> </p>
<ul><li>
<font size="+1">Procedure:</font> content_template.delete</li></ul>
<p>Deletes the specified template, and unregisters the template
from all content types and content items. Use with caution - this
operation cannot be undone.</p><table cellpadding="3" cellspacing="0" border="0">
operation cannot be undone.</p>
<table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><blockquote><table border="0" cellpadding="0" cellspacing="1"><tr>
......@@ -122,7 +148,8 @@ procedure delete (
<th align="left" valign="top">See Also:</th><td>acs_object.delete, content_item.unregister_template,
content_type.unregister_template,</td>
</tr>
</table><p> </p>
Last Modified: $Id: template.html,v 1.1.1.1 2001/03/13 22:59:26 ben
</table>
<p> </p>
Last Modified: $&zwnj;Id: template.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
</body>
This diff is collapsed.
......@@ -2,16 +2,21 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Content Repository Design}</property>
<property name="doc(title)">Content Repository Design</property>
<master>
<body>
<h2>Content Repository Design</h2><h3>I. Essentials</h3><ul><li><a href="requirements">Feature Requirements
Document</a></li></ul><h3>II. Introduction</h3><p>Serving <em>content</em> is a basic function of any web site.
Common types of content include:</p><ul>
<h2>Content Repository Design</h2>
<h3>I. Essentials</h3>
<ul><li><a href="requirements">Feature Requirements
Document</a></li></ul>
<h3>II. Introduction</h3>
<p>Serving <em>content</em> is a basic function of any web site.
Common types of content include:</p>
<ul>
<li>Journal articles and stories</li><li>Documentation</li><li>News reports</li><li>Product reviews</li><li>Press releases</li><li>Message board postings</li><li>Photographs</li>
</ul><p>Note that the definition of content is not limited to what is
</ul>
<p>Note that the definition of content is not limited to what is
produced by the publisher. User-contributed content such as
reviews, comments, or message board postings may come to dominate
active community sites.</p><p>Regardless of its type or origin, it is often useful for
active community sites.</p>
<p>Regardless of its type or origin, it is often useful for
developers, publishers and users to handle all content in a
consistent fashion. Developers benefit because they can base all
their content-driven applications on a single core API, thereby
......@@ -20,28 +25,36 @@ Publishers benefit because they can subject all types of content to
the same management and production practices, including access
control, workflow, categorization and syndication. Users benefit
because they can enjoy a single interface for searching, browsing
and managing their own contributions.</p><p>The content repository itself is intended <em>only</em> as a
and managing their own contributions.</p>
<p>The content repository itself is intended <em>only</em> as a
common substrate for developing content-driven applications. It
provides the developer with a core set of content-related
services:</p><ul>
services:</p>
<ul>
<li>Defining arbitrary content types.</li><li>Common storage of content items (each item consists of a text
or binary data with additional attributes as specified by the
content type).</li><li>Establishing relationships among items of any type.</li><li>Versioning</li><li>Consistent interaction with other services included in the ACS
core, including permissions, workflow and object
relationships.</li><li>Categorization</li><li>Searching</li>
</ul><p>As a substrate layer, the content repository is not intended to
</ul>
<p>As a substrate layer, the content repository is not intended to
ever have its own administrative or user interface. ACS modules and
custom applications built on the repository remain responsible for
implementing an appropriate interface. (Note that the ACS Content
Management System provides a general interface for interacting with
the content repository).</p><h3>III. Historical Considerations</h3><p>The content repository was originally developed in the Spring of
the content repository).</p>
<h3>III. Historical Considerations</h3>
<p>The content repository was originally developed in the Spring of
2000 as a standalone data model. It was based on an earlier custom
system developed for an ArsDigita client. Many of the principle
design features of the original data model were also reflected in
the ACS Objects system implemented in the ACS 4.0 core. The content
repository was subsequently rewritten as an extension of ACS
Objects.</p><h3>V. Design Tradeoffs</h3><p>The content repository is a direct extension of the core ACS
Object Model. As such the same design tradeoffs apply.</p><p>The content repository stores all revisions of all content items
Objects.</p>
<h3>V. Design Tradeoffs</h3>
<p>The content repository is a direct extension of the core ACS
Object Model. As such the same design tradeoffs apply.</p>
<p>The content repository stores all revisions of all content items
in a single table, rather than maintaining separate tables for
"live" and other revisions. The single-table approach dramatically
simplifies most operations on the repository, including adding
......@@ -56,11 +69,16 @@ numbers of infrequently accessed working drafts. The impact of this
arrangement is minimized by storing the actual content data in a
separate tablespace (preferably on a separate disk) from the actual
revisions table, reducing its size and allows the database server
to scan and read it more efficiently.</p><h3>VI. Further Reading</h3><p>The <a href="object-model">Object Model</a> provides a
to scan and read it more efficiently.</p>
<h3>VI. Further Reading</h3>
<p>The <a href="object-model">Object Model</a> provides a
graphic overview of the the how the content repository is designed.
The model links to pages of the API Guide that describe individual
objects. The Developer Guide describes how to address common
development tasks using the content repository.</p><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last Modified: $Id: design.html,v 1.1.1.1 2001/03/13 22:59:26 ben
development tasks using the content repository.</p>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last Modified: $&zwnj;Id: design.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
</body>
......@@ -2,6 +2,5 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {}</property>
<property name="doc(title)"></property>
<master>
<body><p>Last Modified: $Id: access-control.html,v 1.1.1.1 2001/03/13
22:59:26 ben Exp $</p></body>
<p>Last Modified: $&zwnj;Id: access-control.html,v 1.1.1.1 2001/03/13
22:59:26 ben Exp $</p>
......@@ -2,39 +2,51 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Content Repository Developer Guide: HTML Conversion}</property>
<property name="doc(title)">Content Repository Developer Guide: HTML Conversion</property>
<master>
<body>
<h2>Converting Binary Documents to HTML</h2><p>The content repository uses the INSO libraries included with
<h2>Converting Binary Documents to HTML</h2>
<p>The content repository uses the INSO libraries included with
Intermedia to support conversion of binary files such as Microsoft
Word documents to HTML. This document describes how to make this
conversion be part of the item creation or editing process, such
that the content is always stored in the repository as HTML.</p><p>
that the content is always stored in the repository as HTML.</p>
<p>
<b>Note:</b> Because temporary tables and LOB storage are used
during the conversion process, the entire process described here
must be performed within the context of a single transaction.</p><h3>Create the Revision</h3><p>The first step is to create the revision that will be associated
must be performed within the context of a single transaction.</p>
<h3>Create the Revision</h3>
<p>The first step is to create the revision that will be associated
with the converted document, and obtain the corresponding ID. The
<tt>content</tt> column for the revision must be initialized with
an empty blob object:</p><pre>
an empty blob object:</p>
<pre>
revision_id := content_revision.new(item_id =&gt; :item_id,
revision_id =&gt; :revision_id,
data =&gt; empty_blob(),
title =&gt; 'My Word Document',
...);
</pre><h3>Uploading Binary Files</h3><p>The next step in the process is to upload the binary file into
</pre>
<h3>Uploading Binary Files</h3>
<p>The next step in the process is to upload the binary file into
the temporary table <tt>cr_doc_filter</tt>. This may be done using
any standard technique for uploading a binary file, such as an
image. The temporary table has only two columns; one is a BLOB to
store the document itself, and one is the revision ID.</p><h3>Converting the Document</h3><p>Once the revision has been created and the file has been
store the document itself, and one is the revision ID.</p>
<h3>Converting the Document</h3>
<p>Once the revision has been created and the file has been
uploaded, the file may be converted to HTML and written into the
empty blob associated with the revision. This is done with the
<tt>to_html</tt> procedure in the <tt>content_revision</tt>
package:</p><pre>
package:</p>
<pre>
begin
content_revision.to_html(:revision_id);
end;
/
</pre><p>Once the transaction is committed, the uploaded document is
automatically deleted from the <tt>cr_doc_filter</tt> table.</p><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last Modified: $Id: convert.html,v 1.1.1.1 2001/03/13 22:59:26 ben
</pre>
<p>Once the transaction is committed, the uploaded document is
automatically deleted from the <tt>cr_doc_filter</tt> table.</p>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last Modified: $&zwnj;Id: convert.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
</body>
......@@ -4,11 +4,11 @@ Items}</property>
<property name="doc(title)">Content Repository Developer Guide: Organizing Content
Items</property>
<master>
<body>
<h2>Organizing Content Items</h2><p>The content repository organizes content items in a hierarchical
<h2>Organizing Content Items</h2>
<p>The content repository organizes content items in a hierarchical
structure similar to a file system. You manage content items in the
repository using the same basic operations as in a file system:</p><ul>
repository using the same basic operations as in a file system:</p>
<ul>
<li>A freshly installed content repository consists of a single
"root" folder (analogous to the root directory <tt>/</tt> in UNIX
or an empty partition in Windows or MacOS).</li><li>You organize items by creating subfolders under the root.</li><li>You can move or copy items from one folder to another.</li><li>You can create "links" or "shortcuts" for items to make them
......@@ -16,7 +16,8 @@ accessible from within other directories.</li><li>Each item has a "file name" an
determined by its location on a particular branch of the repository
tree. For example, the path to an item named <tt>widget</tt> in the
folder <tt>products</tt> would be <tt>/products/widget</tt>.</li>
</ul><p>The content repository adds an additional twist to a traditional
</ul>
<p>The content repository adds an additional twist to a traditional
filesystem: <em>any</em> content item, not just a folder, may serve
as a container for any number of other content items. For example,
imagine a book consisting of a preface, a number of chapters and a
......@@ -24,14 +25,20 @@ bibliography (which in turn may have any number of entries). The
book itself is a content item, in that it has attributes
(publisher, ISBN number, publication date, synopsis, etc.)
associated with it. It also is the logical container for all its
components.</p><p>It is important to note that folders are simply a special
components.</p>
<p>It is important to note that folders are simply a special
subtype of content item. The content repository's representation of
a parent-child relationship between a folder and the items it
contains is no different from the relationship between a book and
its chapters. Folders may be thought of simply as generic
containers for grouping items that are not necessarily part of a
greater whole.</p><h3>An Example</h3><p>Consider a simple repository structure with the following
contents:</p><img src="organization.gif" height="360" width="440" border="1"><p>Note the following:</p><ul>
greater whole.</p>
<h3>An Example</h3>
<p>Consider a simple repository structure with the following
contents:</p>
<img src="organization.gif" height="360" width="440" border="1">
<p>Note the following:</p>
<ul>
<li>The root folder of the content repository has a special ID
which is returned by the function
<tt>content_item.get_root_folder</tt>.</li><li>Regular content items such as <tt>index</tt> and <tt>about</tt>
......@@ -41,17 +48,21 @@ path to the photo is <tt>/about/photo</tt>. Internally, the photo's
<tt>item_id</tt> of the "About Us" page.</li><li>The "Press" folder contains two items. Internally, the
<tt>parent_id</tt> of the "Press Index" and "Release One" items are
set to the <tt>item_id</tt> of the "Press" folder.</li>
</ul><p>Note that the same effective organization could have been
</ul>
<p>Note that the same effective organization could have been
achieved by creating the "Press Index" item under the root, and
having press releases as its children. Using the folder approach
may have the following advantages:</p><ul>
may have the following advantages:</p>
<ul>
<li>Content management systems can take advantage of the folder
structure to implement an intuitive user interface analagous to
familiar desktop tools (Windows Explorer, MacOS Finder, etc.).</li><li>You can use the content repository API to constraint the type
of content that a folder may contain (except for the index page).
For example, it is possible to limit the contents of the "Press"
folder to items of type "Press Release." See the <a href="../api/folder.html">Content Folder</a> API for more details.</li>
</ul><h3>Using your own root</h3><p>By default, the content repository has one root folder for
folder to items of type "Press Release." See the <a href="../api/folder">Content Folder</a> API for more details.</li>
</ul>
<h3>Using your own root</h3>
<p>By default, the content repository has one root folder for
content items and one for templates. In some situations, that is
not enough. For example, a package that can be instantiated several
times might wish to store the content for each instance in its own
......@@ -59,10 +70,12 @@ content root. Creating your own content (and template) root also
has the advantage that you will not accidentally access another
package's content nor will another package access your content. Not
that that could do any harm, because you have secured all your
content through appropriate permissions.</p><p>We only talk about creating content roots from here on —
content through appropriate permissions.</p>
<p>We only talk about creating content roots from here on —
creating template roots is completely analogous. You create your
own content root by calling <tt>content_folder.new</tt> in
PL/SQL:</p><pre>
PL/SQL:</p>
<pre>
declare
v_my_content_root integer;
begin
......@@ -74,20 +87,26 @@ begin
-- Store v_my_content_root in a safe place
end;
/
</pre><p>The important point is that you have to pass in <tt>0</tt> for
</pre>
<p>The important point is that you have to pass in <tt>0</tt> for
the <tt>parent_id</tt>. This <tt>parent_id</tt> is special in that
it indicates folders with no parent.</p><p>The content repository does not keep track of who created what
it indicates folders with no parent.</p>
<p>The content repository does not keep track of who created what
root folders. You have to do that yourself. In the above example,
you need to store the value <tt>v_my_content_root</tt> somewhere,
for example a table that is specific for your package, otherwise
you won't have a reliable way of accessing your new content
root.</p><p>With multiple content roots, there can be many items with
root.</p>
<p>With multiple content roots, there can be many items with
<tt>item_path</tt><tt>'/news/article'</tt> and you need to tell
the content repository which root you are talking about. For
example, to retrieve content through <tt>content_item.get_id</tt>,
you pass the id of your content root as the <tt>root_folder_id</tt>
parameter to specify the content root under which the
<tt>item_path</tt> should be resolved.</p><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last Modified: $Id: file-system.html,v 1.1.1.1 2001/03/13 22:59:26
<tt>item_path</tt> should be resolved.</p>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last Modified: $&zwnj;Id: file-system.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $
</body>
......@@ -4,25 +4,31 @@ Items}</property>
<property name="doc(title)">Content Repository Developer Guide: Creating Content
Items</property>
<master>
<body>
<h2>Creating Content Items</h2><h3>Use the Content Item API to create the item</h3><p>Content items are initialized using the
<h2>Creating Content Items</h2>
<h3>Use the Content Item API to create the item</h3>
<p>Content items are initialized using the
<tt>content_item.new</tt> function. A name is the only parameter
required to create an item:</p><pre>
required to create an item:</p>
<pre>
item_id := content_item.new( name =&gt; 'my_item' );
</pre><p>The name represents the tail of the URL for that content item.
</pre>
<p>The name represents the tail of the URL for that content item.
In most cases you will want to create items in a particular context
with the repository hierarchy:</p><pre>
with the repository hierarchy:</p>
<pre>
item_id := content_item.new(
name =&gt; 'my_item',
parent_id =&gt; :parent_id
);
</pre><p>The parent ID must be another content item, or a subclass of
content item such as a folder.</p><p>The <tt>content_item.new</tt> function accepts a number of other
</pre>
<p>The parent ID must be another content item, or a subclass of
content item such as a folder.</p>
<p>The <tt>content_item.new</tt> function accepts a number of other
optional parameters. The standard <tt>creation_date</tt>,
<tt>creation_user</tt> and <tt>creation_ip</tt> should be specified
for auditing purposes. You can also create the initial revision and
publish text items in a single step:</p><pre>
publish text items in a single step:</p>
<pre>
item_id := content_item.new(
name =&gt; 'my_item',
parent_id =&gt; :parent_id,
......@@ -31,14 +37,20 @@ item_id := content_item.new(
Here comes a car...uh oh! The End',
is_live =&gt; 't'
);
</pre><p>If either the title or text are not null, the function will
</pre>
<p>If either the title or text are not null, the function will
create the first revision of the item. It will also mark the item
as live if the <tt>is_live</tt> parameter is true. The alternative
to this one step method is to create a content item and then add a
revision using the Content Revision API.</p><h3>Publishing a content item</h3><p>If a content item has at least one revision, then it can be
revision using the Content Revision API.</p>
<h3>Publishing a content item</h3>
<p>If a content item has at least one revision, then it can be
published by calling the <tt>content_item.set_live_revision</tt>
procedure, which takes as input a <tt>revision_id</tt>:</p><pre>
procedure, which takes as input a <tt>revision_id</tt>:</p>
<pre>
content_item.set_live_revision( revision_id =&gt; :revision_id );
</pre><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><p>Last Modified: $Id: items.html,v 1.1.1.1 2001/03/13 22:59:26 ben
</pre>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<p>Last Modified: $&zwnj;Id: items.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $</p>
</body>
......@@ -4,9 +4,10 @@
<property name="doc(title)">Content Repository Developer Guide: Subject Keywords
(Categories)</property>
<master>
<body>
<h2>Subject Keywords (Categories)</h2><hr><h3>Overview</h3><p>
<h2>Subject Keywords (Categories)</h2>
<hr>
<h3>Overview</h3>
<p>
<em>Subject Keywords</em> are used to implement categorization
for the Content Management system. A Subject Keyword is a small
label, such as "Oracle Documentation" or "My Favorite Foods", which
......@@ -16,22 +17,29 @@ assigning the Subject Keyword "My Favorite Foods" to the content
items "Potstickers", "Strawberries" and "Ice Cream" would indicate
that all the three items belong in the same category - namely, the
category of the user's favorite foods. The actual physical location
of these items within the repository is irrelevant.</p><p>Subject Keywords may be nested to provide more detailed control
of these items within the repository is irrelevant.</p>
<p>Subject Keywords may be nested to provide more detailed control
over categorization; for example, "My Favorite Foods" may be
further subdivided into "Healthy" and "Unhealthy". Subject Keywords
which have descendants are referred to as "<em>Subject
Categories</em>".</p><h3>Data Model</h3><p>The <tt>content_keyword</tt> object type is used to represent
Categories</em>".</p>
<h3>Data Model</h3>
<p>The <tt>content_keyword</tt> object type is used to represent
Subject Keywords (see <tt>content_keyword.sql</tt>) The
<tt>content_keyword</tt> type inherits from
<tt>acs_object</tt>:</p><pre>
<tt>acs_object</tt>:</p>
<pre>
acs_object_type.create_type ( supertype =&gt; 'acs_object', object_type
=&gt; 'content_keyword', pretty_name =&gt; 'Content Keyword',
pretty_plural =&gt; 'Content Keywords', table_name =&gt; 'cr_keywords',
id_column =&gt; 'keyword_id', name_method =&gt; 'acs_object.default_name'
);
</pre>
In addition, the <tt>cr_keywords</tt> table (see
<tt>content-create.sql</tt>) contains extended attributes of
In addition, the <tt>cr_keywords</tt>
table (see
<tt>content-create.sql</tt>
) contains extended attributes of
Subject Keywords:
<pre>
create table cr_keywords (
......@@ -44,7 +52,9 @@ create table cr_keywords (
description varchar2(4000)
);
</pre>
In <tt>content-keyword.sql</tt>:
In <tt>content-keyword.sql</tt>
:
<pre>
attr_id := acs_attribute.create_attribute (
object_type =&gt; 'acs_object',
......@@ -61,11 +71,14 @@ attr_id := acs_attribute.create_attribute (
pretty_name =&gt; 'Description',
pretty_plural =&gt; 'Descriptions'
);
</pre><p>Thus, each Subject Keyword has a <tt>heading</tt>, which is a
</pre>
<p>Thus, each Subject Keyword has a <tt>heading</tt>, which is a
user-readable heading for the keyword, and a <tt>description</tt>,
which is a somewhat longer description of the keyword.</p><p>The <tt>cr_item_keyword_map</tt> table (see
which is a somewhat longer description of the keyword.</p>
<p>The <tt>cr_item_keyword_map</tt> table (see
<tt>content-create.sql</tt>) is used to relate content items to
keywords:</p><pre>
keywords:</p>
<pre>
create table cr_item_keyword_map (
item_id integer
constraint cr_item_keyword_map_item_fk
......@@ -80,10 +93,13 @@ create table cr_item_keyword_map (
constraint cr_item_keyword_map_pk
primary key (item_id, keyword_id)
);
</pre><h3><a href="/api-doc/procs-file-view?path=packages/acs-content-repository/tcl/content-keyword-procs.tcl">
API Access</a></h3><p>The API used to access and modify content keywords are outlined
</pre>
<h3><a href="/api-doc/procs-file-view?path=packages/acs-content-repository/tcl/content-keyword-procs.tcl">
API Access</a></h3>
<p>The API used to access and modify content keywords are outlined
below. The function names are links that will take you to a more
detailed description of the function and its parameters.</p><table border="1" cellpadding="4" cellspacing="0">
detailed description of the function and its parameters.</p>
<table border="1" cellpadding="4" cellspacing="0">
<tr>
<th>Function/Procedure</th><th>Purpose</th><th>Description</th>
</tr><tr>
......@@ -127,4 +143,3 @@ Category is assigned to the item. For example, a query whether
</td>
</tr>
</table>
</body>
......@@ -4,38 +4,45 @@ Relationships}</property>
<property name="doc(title)">Content Repository Developer Guide: Object
Relationships</property>
<master>
<body>
<h2>Object Relationships</h2><p>Many applications of the content repository require that content
<h2>Object Relationships</h2>
<p>Many applications of the content repository require that content
items be related to each other as well as to other classes of
objects. Examples include:</p><ul>
objects. Examples include:</p>
<ul>
<li>News stories may be linked to other stories on the same
topic.</li><li>An article may be linked to any number of photos or charts that
are embedded in the article.</li><li>A long article is divided into multiple sections, each of which
is intended for separate display.</li><li>Product reviews are linked to specific products.</li><li>User portraits are linked to specific users.</li>
</ul><p>The ACS kernel provides a standard, highly flexible data model
</ul>
<p>The ACS kernel provides a standard, highly flexible data model
and API for relating objects to other objects. If you have a highly
specific problem and are developing your own user interface on the
content repository, you can use the ACS relationships framework
directly. The relationship framework in the content repository
itself is simply intended as a convenience for handling common
relationship situations involving content items.</p><h3>Parent-Child Relationships</h3><p>In many cases one content item may serve as a natural container
relationship situations involving content items.</p>
<h3>Parent-Child Relationships</h3>
<p>In many cases one content item may serve as a natural container
for another item. An article divided into sections, or a news story
with an associated photo are one example of this. These
"parent-child" relationships are handled by the basic hierarchical
organization of the content repository. Every item has a parent
item, represented internally by the <tt>parent_id</tt> column in
the <tt>cr_items</tt> table.</p><p>It is often desirable to constrain the number and content type
the <tt>cr_items</tt> table.</p>
<p>It is often desirable to constrain the number and content type
of child items. For example, the specifications for a news story
may only allow for a single photo. A structured report may have
exactly three sections. Furthermore, it may be necessary to
classify or identify child items of the same type. Clearly the
sections of a report would have a logical order in which they would
need to be presented to the user. The layout for a photo album may
have a special position for a "featured" photo.</p><table border="0" width="100%"><tr>
have a special position for a "featured" photo.</p>
<table border="0" width="100%"><tr>
<td align="center"><img src="article.gif" border="1"></td><td align="center"><img src="photo.gif" border="1"></td>
</tr></table><p>The content repository accomodates these situations in the
following ways:</p><ul>
</tr></table>
<p>The content repository accomodates these situations in the
following ways:</p>
<ul>
<li>An API procedure, <tt>content_type.register_child_type</tt>,
may be used to specify the minimum and maximum number of children
of a particular content type that an item may have. You may
......@@ -53,17 +60,22 @@ used to characterize the parent-child relationship. Parent-child
relationships are themselves treated as ACS Objects, so this table
may be extended with additional attributes as required by the
developer.</li>
</ul><p>Note that there is no currently no explicit API to "add a
</ul>
<p>Note that there is no currently no explicit API to "add a
child." You specify the parent of an item upon creating it. You can
use the API procedure <tt>content_item.move</tt> to change the
parent of an item.</p><h3>Item-Object Relationships</h3><p>In addition to the relationships to their parents and children
parent of an item.</p>
<h3>Item-Object Relationships</h3>
<p>In addition to the relationships to their parents and children
in the content repository hierarchy, content items may be linked to
any number of other objects in the system. This may include
products, users or content items on related subjects.</p><p>The same need to constrain the possibilities for an item-object
products, users or content items on related subjects.</p>
<p>The same need to constrain the possibilities for an item-object
relationship, as described above for parents and children, also
apply to items and objects in general. The content repository
provides a data model and API for managing these constraints that
parallels what is provided for parent-child relationships:</p><ul>
parallels what is provided for parent-child relationships:</p>
<ul>
<li>An API procedure, <tt>content_type.register_relation_type</tt>,
may be used to specify the minimum and maximum number of relations
with a particular object type that an item may have. There is no
......@@ -83,11 +95,16 @@ used to characterize the item-object relationship. Item-object
relationships are themselves treated as ACS Objects, so this table
may be extended with additional attributes as required by the
developer.</li>
</ul><h3>Extending Parent-Child and Item-Object Relationships</h3><p>The simple relation mechanisms described above may not be
</ul>
<h3>Extending Parent-Child and Item-Object Relationships</h3>
<p>The simple relation mechanisms described above may not be
sufficient for some applications. However, because both
relationships defined by the content repository are
<em>themselves</em> objects, you have the option to extend their
types as you would for any other ACS object.</p><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last modified: <tt>$Id: object-relationships.html,v 1.1.1.1
types as you would for any other ACS object.</p>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last modified: <tt>$&zwnj;Id: object-relationships.html,v 1.1.1.1
2001/03/13 22:59:26 ben Exp $</tt>
</body>
......@@ -4,25 +4,31 @@ Content}</property>
<property name="doc(title)">Content Repository Developer Guide: Publishing
Content</property>
<master>
<body>
<h2>Publishing Content</h2><p>The content repository does not place any restrictions on the
<h2>Publishing Content</h2>
<p>The content repository does not place any restrictions on the
methods employed for delivering content via a public server
infrastructure. Applications are free to query the repository and
process the data in any way desired.</p><p>Although there are no restrictions on publishing methodology,
process the data in any way desired.</p>
<p>Although there are no restrictions on publishing methodology,
the repository API is intended to facilitate generic template-based
publication, regardless of the specific presentation layer used.
The following diagram illustrates the steps typically involved in
such a publication process:</p><img src="flow.gif" border="1"><p>In general, there is an initial <em>resolution</em> step in
such a publication process:</p>
<img src="flow.gif" border="1">
<p>In general, there is an initial <em>resolution</em> step in
which the server must identify the appropriate content item and
then decide which template to actually parse. Following that is an
<em>execution</em> step, during which setup tasks associated with
the template are performed. Finally, the <em>merging</em> step
combines the data and layout into a rendered page.</p><h3>Matching URLs to Content Items</h3><p>The primary mechanism for matching URLs to Content Items are
combines the data and layout into a rendered page.</p>
<h3>Matching URLs to Content Items</h3>
<p>The primary mechanism for matching URLs to Content Items are
<em>virtual URL handlers</em>, <tt>.vuh</tt> files. An explanation
of virtual URL handlers can be found in the tutorial on the
<a href="/doc/request-processor">Request Processor</a>.</p><p>Here is an example <tt>index.vuh</tt> file that you can adapt to
your own purposes:</p><pre>
<a href="/doc/request-processor">Request Processor</a>.</p>
<p>Here is an example <tt>index.vuh</tt> file that you can adapt to
your own purposes:</p>
<pre>
# Get the paths
set the_url [ad_conn path_info]
......@@ -44,14 +50,17 @@ if { [content::init the_url the_root $content_root $template_root] } {
} else {
ns_returnnotfound
}
</pre><p>The <tt>content_root</tt> and <tt>template_root</tt> parameters
</pre>
<p>The <tt>content_root</tt> and <tt>template_root</tt> parameters
select the content and template root folders. In the example, they
are just the default roots that the content repository initializes
on installation. If you want to store your content completely
independent from that of other packages, you can initialize your
own content root and pass that folder's ID on to
<tt>content::init</tt>.</p><p>To publish content through URLs that are underneath
<tt>/mycontent</tt> you need to do the following:</p><ol>
<tt>content::init</tt>.</p>
<p>To publish content through URLs that are underneath
<tt>/mycontent</tt> you need to do the following:</p>
<ol>
<li>Create a directory <tt>mycontent</tt> in your server's page
root and an <tt>index.vuh</tt> file in that directory.</li><li>Adapt the <tt>set content_root ...</tt> and <tt>set
template_root ..</tt> statements in the example above so that they
......@@ -60,11 +69,16 @@ want to publish content from.</li><li>Change the <tt>set the_url ...</tt> statem
variable <tt>the_url</tt> contains the absolute path to the content
item you wish to serve from your (or the default) content
root.</li>
</ol><p>If you use the example <tt>index.vuh</tt> file above unaltered
</ol>
<p>If you use the example <tt>index.vuh</tt> file above unaltered
for requests to <tt>my_content</tt>, a request for
<tt>http://yourserver/mycontent/news/articles/42</tt> would request
the content item <tt>/news/articles/42</tt> from the content
repository on the default content root folder.</p><h3>Matching Content Items to Templates</h3><h3>Querying Content</h3><h3>Querying Attributes</h3><p>When you create a new content type or add an attribute to an
repository on the default content root folder.</p>
<h3>Matching Content Items to Templates</h3>
<h3>Querying Content</h3>
<h3>Querying Attributes</h3>
<p>When you create a new content type or add an attribute to an
existing content type, a view is created (or recreated) that joins
the attribute tables for the entire chain of inheritance for that
content type. The view always has the same name as the attribute
......@@ -73,24 +87,34 @@ from the table itself (for example, if the attribute table for
<b>Press Releases</b> is <tt>press_releases</tt>, then the view
will be named <tt>press_releasesx</tt>. Querying this view is a
convenient means of accessing any attribute associated with a
content item.</p><p>As a shortcut, the item's template may call
content item.</p>
<p>As a shortcut, the item's template may call
<tt>content::get_content</tt> in its Tcl file in order to
automatically retrieve the current item's attributes. The
attributes will be placed in a onerow datasource called
<tt>content</tt> . The template may then call
<tt>template::util::array_to_vars content</tt> in order to convert
the onerow datasource to local variables.</p><p>In addition to the "x" view, the Content Repository creates an
the onerow datasource to local variables.</p>
<p>In addition to the "x" view, the Content Repository creates an
"i" view, which simplifies the creation of new revisions. The "i"
view has the same name as the content table, with "i" appended at
the end. You may insert into the view as if it was a normal table;
the insert trigger on the view takes care of inserting the actual
values into the content tables.</p><h3>Querying Additional Data</h3><p>Templates often display more than simple content attributes.
values into the content tables.</p>
<h3>Querying Additional Data</h3>
<p>Templates often display more than simple content attributes.
Additional queries may be necessary to obtain data about related
objects not described directly in attribute tables. The setup code
associated with a template typically performs these queries after
the initial query for any needed attributes.</p><h3>Merging Data with Templates</h3><h3>Returning Output</h3><ol>
the initial query for any needed attributes.</p>
<h3>Merging Data with Templates</h3>
<h3>Returning Output</h3>
<ol>
<li>Write to the file system</li><li>Service public requests directly</li>
</ol><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last Modified: $Id: publish.html,v 1.4 2013/04/12 16:12:56 gustafn
</ol>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last Modified: $&zwnj;Id: publish.html,v 1.4 2013/04/12 16:12:56 gustafn
Exp $
</body>
......@@ -4,10 +4,10 @@ Revisions}</property>
<property name="doc(title)">Content Repository Developer Guide: Creating Content
Revisions</property>
<master>
<body>
<h2>Creating Content Revisions</h2><p>At a basic level, creating a new revision of a content item
involves the following steps:</p><ol>
<h2>Creating Content Revisions</h2>
<p>At a basic level, creating a new revision of a content item
involves the following steps:</p>
<ol>
<li>Insert a row in the <tt>acs_objects</tt> table to create the
object.</li><li>Insert a corresponding row in the <tt>cr_revisions</tt> table
with the basic attributes for the revision.</li><li>Write the content data into the <tt>content</tt> BLOB column of
......@@ -17,24 +17,30 @@ the content type is <b>Basic Item</b> or an immediate subtype
thereof.</li><li>Insert a corresponding row into the attribute table of the
content type of the item. This is not applicable if the content
type is <b>Basic Item</b>.</li>
</ol><h3>Use the Content Revision API to create a revision</h3><p>Content revisions are initialized using the
</ol>
<h3>Use the Content Revision API to create a revision</h3>
<p>Content revisions are initialized using the
<tt>content_revision.new</tt> function. The only parameters
required to create the revision are a title, a content item ID, and
some text:</p><pre>
some text:</p>
<pre>
revision_id := content_revision.new(
title =&gt; 'A Revision',
item_id =&gt; :item_id,
text =&gt; 'Once upon a time Goldilocks crossed the street.
Here comes a car...uh oh! The End'
);
</pre><p>The <tt>item_id</tt> parameter is ID of the content item with
which the revision is associated.</p><p>The <tt>content_item.new</tt> function accepts a number of other
</pre>
<p>The <tt>item_id</tt> parameter is ID of the content item with
which the revision is associated.</p>
<p>The <tt>content_item.new</tt> function accepts a number of other
optional parameters: <tt>description</tt>, <tt>mime_type</tt>, and
<tt>publish_date</tt>. The standard <tt>creation_date</tt>,
<tt>creation_user</tt>, and <tt>creation_ip</tt> should be
specified for auditing purposes. Instead of the <tt>text</tt>
parameter, this function can be called with a <tt>data</tt>
parameter, in which <tt>data</tt> is a blob:</p><pre>
parameter, in which <tt>data</tt> is a blob:</p>
<pre>
revision_id := content_revision.new(
title =&gt; 'A Revision',
description =&gt; 'A Description of a revision',
......@@ -46,17 +52,21 @@ revision_id := content_revision.new(
creation_user =&gt; :user_id,
creation_ip =&gt; :ip_address
);
</pre><h3>Insert additional attributes</h3><p>Given that there is no way (AFAIK) to pass variable parameters
</pre>
<h3>Insert additional attributes</h3>
<p>Given that there is no way (AFAIK) to pass variable parameters
to a PL/SQL function, there is no way to make
<tt>content_revision.new</tt> generic enough to support submission
of the attributes for all different content types. This leaves you
with three alternatives:</p><ol>
with three alternatives:</p>
<ol>
<li>Call <tt>content_revision.new</tt> followed by manual DML
statements to write data into the content BLOB and insert
attributes.</li><li>Write a PL/SQL package for each of your content types, which
encapsulates the above code.</li><li>Create revisions by inserting into the attribute view for each
content type.</li>
</ol><p>The last option is made possible by an <tt>instead of
</ol>
<p>The last option is made possible by an <tt>instead of
insert</tt> trigger on the attribute view for each content type.
(An <em>attribute view</em> joins together the storage tables for
the ancestors of each content type, including <tt>acs_objects</tt>
......@@ -68,32 +78,44 @@ code to create or replace the trigger is automatically generated
and executed with each call to
<tt>content_type.create_attribute</tt>. The trigger makes it
possible to create complete revisions with a single insert
statement:</p><pre>
statement:</p>
<pre>
insert into cr_revisionsx (
item_id, revision_id, title
) values (
18, 19, 'All About Revisions'
);
</pre><p>Because a special trigger is generated for each content type
</pre>
<p>Because a special trigger is generated for each content type
that includes insert statements for all inherited tables, revisions
with extended attributes may be created in the same fashion:</p><pre>
with extended attributes may be created in the same fashion:</p>
<pre>
insert into cr_imagesx (
item_id, revision_id, title, height, width
) values (
18, 19, 'A Nice Drawing', 300, 400
);
</pre><h3>Inserting content via file or text upload</h3><h3>Selecting a live revision</h3><p>The live revision of a content item can be obtained with the
<tt>content_item.get_live_revision</tt> function:</p><pre>
</pre>
<h3>Inserting content via file or text upload</h3>
<h3>Selecting a live revision</h3>
<p>The live revision of a content item can be obtained with the
<tt>content_item.get_live_revision</tt> function:</p>
<pre>
live_revision_id := content_item.get_live_revision(
item_id =&gt; :item_id
);
</pre><p>The <tt>item_id</tt> identifies the content item with which the
revision is associated.</p><p>Likewise, the most recent revision of a content item can be
</pre>
<p>The <tt>item_id</tt> identifies the content item with which the
revision is associated.</p>
<p>Likewise, the most recent revision of a content item can be
obtained with the <tt>content_item.get_latest_revision</tt>
function:</p><pre>
function:</p>
<pre>
latest_revision_id := content_item.get_latest_revision(
item_id =&gt; :item_id
);
</pre><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><p>Last Modified: $Id: revisions.html,v 1.1.1.1 2001/03/13 22:59:26
</pre>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<p>Last Modified: $&zwnj;Id: revisions.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $</p>
</body>
......@@ -2,28 +2,33 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Content Repository Developer Guide: Search}</property>
<property name="doc(title)">Content Repository Developer Guide: Search</property>
<master>
<body>
<h2>Search</h2><p>The content repository provides a consistent sitewide interface
<h2>Search</h2>
<p>The content repository provides a consistent sitewide interface
for searching content. It uses Intermedia to index the
<tt>content</tt> column of <tt>cr_revisions</tt>) as well as all
the attribute columns for each content type.</p><h3>Searching Content</h3><p>The <tt>content</tt> column in <tt>cr_revisions</tt> may contain
the attribute columns for each content type.</p>
<h3>Searching Content</h3>
<p>The <tt>content</tt> column in <tt>cr_revisions</tt> may contain
data in any text or binary format. To accomodate searches across
multiple file types, the content repository uses an Intermedia
index with the INSO filtering option. The INSO filter automatically
detects the the file type of a binary object, and extracts text
from it for indexing. Most common file types are supported,
including PDF and Microsoft Word, and Excel and PowerPoint.</p><p>Searching for content requires the same syntax as any text
index:</p><pre>
including PDF and Microsoft Word, and Excel and PowerPoint.</p>
<p>Searching for content requires the same syntax as any text
index:</p>
<pre>
select
score(1), revision_id, item_id
from
cr_revisions r
where
contains(content, 'company', 1) &gt; 0
</pre><p>The above query may be useful for an administrative interface
</pre>
<p>The above query may be useful for an administrative interface
where you wish to search across all revisions, but in most cases
you only want to search live revisions:</p><pre>
you only want to search live revisions:</p>
<pre>
select
score(1), revision_id, item_id, content_item.get_path(item_id) url, title
from
......@@ -32,11 +37,15 @@ where
contains(content, 'company', 1) &gt; 0
and
revision_id = content_item.get_live_revision(item_id)
</pre><p>The URL and title may be used to construct a hyperlink directly
to the item.</p><p>You may implement any number of variants on this basic query to
</pre>
<p>The URL and title may be used to construct a hyperlink directly
to the item.</p>
<p>You may implement any number of variants on this basic query to
place additional constraints on the results, such as publication
date, content type, subject heading or a particular attribute (see
below).</p><p>Some limitations of the current implementation include:</p><ul>
below).</p>
<p>Some limitations of the current implementation include:</p>
<ul>
<li>Multilingual searches are not enabled by default. You may
enable them for one more languages by setting the appropriate
Intermedia preferences when creating
......@@ -47,10 +56,14 @@ probably a limitation of <tt>content_item.get_path</tt>: it should
be possible to specify an arbitrary function to return the path for
items of a particular content type, with
<tt>content_item.get_path</tt> as the default.</li>
</ul><h3>Searching Attributes</h3><p>This task is primarily handled to two Intermedia indices:</p><p>Providing a generic mechanism for searching attributes is
</ul>
<h3>Searching Attributes</h3>
<p>This task is primarily handled to two Intermedia indices:</p>
<p>Providing a generic mechanism for searching attributes is
complicated by the fact that the attributes for each content type
are different. The content repository takes advantage of the XML
features in Oracle 8.1.6 to address this:</p><ol>
features in Oracle 8.1.6 to address this:</p>
<ol>
<li><p>After creating a new revision and inserting attributes into the
storage table for the content type and all its ancestors, you must
execute the <tt>content_revision.index_attributes</tt> procedure.
......@@ -63,15 +76,19 @@ using the Oracle XML Parser for Java v2 is used to actually
generate the XML document.</p></li><li><p>A special Intermedia index configured to parse XML documents is
built on the column containing the XML documents for all
revisions.</p></li>
</ol><p>The Intermedia index allows you to use the WITHIN operator to
search on individual attributes if desired.</p><pre>
</ol>
<p>The Intermedia index allows you to use the WITHIN operator to
search on individual attributes if desired.</p>
<pre>
select
revision_id,score(1)
from
cr_revisions
where
contains(attributes, 'company WITHIN title', 1) &gt; 0
</pre><p>Some limitations of the current implementation include:</p><ol>
</pre>
<p>Some limitations of the current implementation include:</p>
<ol>
<li>A <tt>USER_DATASTORE</tt> associated with each row of the
<tt>cr_items</tt> table, which feeds Intermedia the contents of the
<tt>content</tt> column (a BLOB) for the <em>live</em> revision of
......@@ -86,7 +103,10 @@ also be able implement custom handlers, to allow the XML document
to reflect one-to-many relationships or special formatting of
attributes as well. The handler should specify a java class and
method, which a dispatch method can call by reflection.</li>
</ol><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last Modified: $Id: search.html,v 1.1.1.1 2001/03/13 22:59:26 ben
</ol>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last Modified: $&zwnj;Id: search.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
</body>
......@@ -2,18 +2,23 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {}</property>
<property name="doc(title)"></property>
<master>
<body>
<h2>Storing Data in the Content Repository</h2><p>This document provides an introduction to using the content
<h2>Storing Data in the Content Repository</h2>
<p>This document provides an introduction to using the content
repository for storing data (binary or text files) and associated
attributes. It describes how to store user portraits as an
example.</p><h3>Define an Item Type</h3><p>The first step towards using the content repository is to define
example.</p>
<h3>Define an Item Type</h3>
<p>The first step towards using the content repository is to define
one or more <em>content types</em> for the data you wish to
manage.</p><p>The basic content item includes the following attributes:</p><ul>
manage.</p>
<p>The basic content item includes the following attributes:</p>
<ul>
<li>Title</li><li>Description</li><li>Publication or Posting Date</li><li>Author or Contributor</li><li>MIME Type</li><li>Binary or Text Data</li>
</ul><p>Most types of content require additional attributes. For a
</ul>
<p>Most types of content require additional attributes. For a
photo, we probably also want to store the pixel width and height at
the very least:</p><pre>
the very least:</p>
<pre>
create table images (
image_id integer
constraint images_image_id_fk
......@@ -23,8 +28,10 @@ the very least:</p><pre>
width integer,
height integer
);
</pre><p>Content types are nothing more than standard ACS Objects that
inherit from <tt>content_revision</tt>:</p><pre>
</pre>
<p>Content types are nothing more than standard ACS Objects that
inherit from <tt>content_revision</tt>:</p>
<pre>
begin
acs_object_type.create_type (
......@@ -56,17 +63,22 @@ begin
end;
/
show errors
</pre><p>Note that content types always extend <tt>content_revision</tt>,
</pre>
<p>Note that content types always extend <tt>content_revision</tt>,
rather than <tt>content_item</tt>. This is because we want to store
multiple revisions of both the actual data (in this case the image)
as well as associated attributes (the width and height of the image
may vary among revisions).</p><h3>Define a Relationship to a Target Object</h3><p>The content repository implements a flexible mechanism for
may vary among revisions).</p>
<h3>Define a Relationship to a Target Object</h3>
<p>The content repository implements a flexible mechanism for
organizing data in a hierarchical fashion in a manner similar to a
file system. This would be useful if we ever decided to allow each
user to manage an entire personal photo gallery rather than a
single portrait.</p><p>In the simple case where each user is allowed a single portrait,
single portrait.</p>
<p>In the simple case where each user is allowed a single portrait,
we can simply define a relationship between user and image as ACS
Objects:</p><pre>
Objects:</p>
<pre>
acs_rel_type.create_role('user');
acs_rel_type.create_role('portrait');
......@@ -81,13 +93,17 @@ Objects:</p><pre>
min_n_rels_two =&gt; 0,
max_n_rels_two =&gt; 1
);
</pre><p>Note that the <tt>user</tt> object is related to a
</pre>
<p>Note that the <tt>user</tt> object is related to a
<tt>content_item</tt> object rather than an <tt>image</tt> object
directly. Each <tt>image</tt> object represents only a single
revision of a portrait. Revisions always exist in the context of an
item.</p><h3>Store Objects</h3><p>Now we have defined both a content type and relationship type,
item.</p>
<h3>Store Objects</h3>
<p>Now we have defined both a content type and relationship type,
we can start storing portraits. The DML for processing a new
portrait upload form would look like this:</p><pre>
portrait upload form would look like this:</p>
<pre>
begin transaction
:item_id := content_item.new(:name, :item_id, sysdate, NULL, '[ns_conn peeraddr]');
# maybe have content_revision return the LOB locator so that it can
......@@ -96,8 +112,12 @@ portrait upload form would look like this:</p><pre>
:item_id, :revision_id);
blob_dml_file update cr_revisions set content = empty_blob() ...
:rel_id := acs_rel.new(...)
</pre><h3>Retrieve Objects</h3><pre>
</pre>
<h3>Retrieve Objects</h3>
<pre>
ns_ora write_blob ...
</pre><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><p>Last Modified: $Id: storage.html,v 1.1.1.1 2001/03/13 22:59:26
</pre>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<p>Last Modified: $&zwnj;Id: storage.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $</p>
</body>
......@@ -4,82 +4,104 @@ Templates}</property>
<property name="doc(title)">Content Repository Developer Guide: Applying
Templates</property>
<master>
<body>
<h2>Applying Templates</h2><p>The content repository allows you to associate templates with
<h2>Applying Templates</h2>
<p>The content repository allows you to associate templates with
both content types and individual content items. A template
determines how a content item is rendered when exported to the file
system or served directly to a client.</p><p>The content repository does not make any assumptions about the
system or served directly to a client.</p>
<p>The content repository does not make any assumptions about the
type of templating system used by the application server with which
it is being used. Templates are simply made available to the
application server as text objects. The server is responsible for
merging the template with the actual content.</p><h3>Creating templates</h3><p>The content repository handle templates as a special class of
merging the template with the actual content.</p>
<h3>Creating templates</h3>
<p>The content repository handle templates as a special class of
text object. The interface for handling templates builds on that of
simple content items:</p><pre>
simple content items:</p>
<pre>
template_id := content_template.new(
name =&gt; 'image_template',
parent_id =&gt; :parent_id
);
</pre><p>The name represents the tail of the location for that content
</pre>
<p>The name represents the tail of the location for that content
template. The parent ID must be another content item, or a subclass
of content item such as a folder.</p><p>
of content item such as a folder.</p>
<p>
<tt>The content_template.new</tt> function accepts the standard
<tt>creation_date</tt>, <tt>creation_user</tt>, and
<tt>creation_ip</tt> auditing parameters.</p><p>Content items and templates are organized in two separate
<tt>creation_ip</tt> auditing parameters.</p>
<p>Content items and templates are organized in two separate
hierarchies within the content repository. For example, you may
place all your press releases in the <tt>press</tt> folder under
the item root (having the ID returned by
<tt>content_item.get_root_folder</tt>). You may have 5 different
templates used to render press releases. These my be stored in the
<tt>press</tt> folder under the <em>template</em> root (having the
ID returned by <tt>content_template.get_root_folder</tt>).</p><p>Templates are placed under their own root to ensures that bare
ID returned by <tt>content_template.get_root_folder</tt>).</p>
<p>Templates are placed under their own root to ensures that bare
templates are never accessible via a public URL. This is also done
because the relationship with the file system may be different for
templates than for content items. For example, templates may be
associated with additional code or resource files that developers
maintain under separate source control.</p><h3>Associating templates with content types</h3><p>You use the <tt>content_type.register_template</tt> procedure to
associate a template with a particular content type:</p><pre>
maintain under separate source control.</p>
<h3>Associating templates with content types</h3>
<p>You use the <tt>content_type.register_template</tt> procedure to
associate a template with a particular content type:</p>
<pre>
content_type.register_template(
content_type =&gt; 'content_revision',
template_id =&gt; :template_id,
use_context =&gt; 'public',
is_default =&gt; 't'
);
</pre><p>The <tt>use_context</tt> is a simple keyword that specifies the
</pre>
<p>The <tt>use_context</tt> is a simple keyword that specifies the
situation in which the template is appropriate. One general
context, <tt>public</tt>, is loaded when the content repository is
installed. Templates in this context are for presenting content to
users of the site. Some sites may wish to distinguish this further,
for example using <tt>intranet</tt>, <tt>extranet</tt> and
<tt>public</tt> contexts.</p><p>The <tt>is_default</tt> flag specifies that this template will
<tt>public</tt> contexts.</p>
<p>The <tt>is_default</tt> flag specifies that this template will
serve as the default template in the case that no template is
registered to a content item of this content type and this use
context. Any content type/context pair may have any number of
templates registered to it, but there can be only one default
template per pair.</p><p>To make a template the default template for a content
type/context pair:</p><pre>
template per pair.</p>
<p>To make a template the default template for a content
type/context pair:</p>
<pre>
content_type.set_default_template(
content_type =&gt; 'content_revision',
template_id =&gt; :template_id,
use_context =&gt; 'public'
);
</pre><h3>Associating templates with content items</h3><p>Individual items may also be associated with templates using the
<tt>content_item.register_template</tt> procedure:</p><pre>
</pre>
<h3>Associating templates with content items</h3>
<p>Individual items may also be associated with templates using the
<tt>content_item.register_template</tt> procedure:</p>
<pre>
content_item.register_template(
item_id =&gt; :item_id,
template_id =&gt; :template_id,
use_context =&gt; 'intranet'
);
</pre><p>Unlike the case with content types, only one template may be
registered with a content item for a particular context.</p><p>The content management system uses this functionality to allow
</pre>
<p>Unlike the case with content types, only one template may be
registered with a content item for a particular context.</p>
<p>The content management system uses this functionality to allow
publishers to choose templates for each content they create. For
example, a company may have three different templates for
presenting press releases. Depending on the subject, geographic
region or any other criterion, a different template may be used for
each press release.</p><h3>Retrieving the template for a content item</h3><p>The application server (AOLserver or servlet container) may use
each press release.</p>
<h3>Retrieving the template for a content item</h3>
<p>The application server (AOLserver or servlet container) may use
the <tt>content_item.get_template</tt> function to determine the
proper template to use for rendering a page in any particular
context:</p><pre>
context:</p>
<pre>
template_id := content_item.get_template(
item_id =&gt; :item_id,
use_context =&gt; 'public'
......@@ -88,23 +110,31 @@ template_id := content_item.get_template(
template_path := content_template.get_path(
template_id =&gt; :template_id
);
</pre><p>In the case that no template is registered to given item/context
</pre>
<p>In the case that no template is registered to given item/context
pair, <tt>content_item.get_template</tt> will return the default
template (if it exists) for the related content type/context
pair.</p><h3>Unregistering templates</h3><p>The procedure for disassociating templates with content types is
as follows:</p><pre>
pair.</p>
<h3>Unregistering templates</h3>
<p>The procedure for disassociating templates with content types is
as follows:</p>
<pre>
content_type.unregister_template(
content_type =&gt; 'content_revision',
template_id =&gt; :template_id,
use_context =&gt; 'intranet'
);
</pre><p>The corresponding procedure to disassociate templates with
content items is:</p><pre>
</pre>
<p>The corresponding procedure to disassociate templates with
content items is:</p>
<pre>
content_item.unregister_template(
item_id =&gt; :item_id,
template_id =&gt; :template_id,
use_context =&gt; 'admin'
);
</pre><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><p>Last Modified: $Id: template.html,v 1.1.1.1 2001/03/13 22:59:26
</pre>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<p>Last Modified: $&zwnj;Id: template.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $</p>
</body>
......@@ -4,16 +4,19 @@ Types}</property>
<property name="doc(title)">Content Repository Developer Guide: Defining Content
Types</property>
<master>
<body>
<h2>Defining Content Types</h2><p>The content repository requires you to define each type of
<h2>Defining Content Types</h2>
<p>The content repository requires you to define each type of
content supported by your supplication. Content types are defined
as <a href="?">ACS Object Types</a>, and may be created in the same
fashion as any other object type. This page provides some specific
examples and details related to defining ACS object types in the
context of the content repository.</p><h3>Determine content attributes</h3><p>A content item typically consists of two components:</p><ol>
context of the content repository.</p>
<h3>Determine content attributes</h3>
<p>A content item typically consists of two components:</p>
<ol>
<li>Text or binary data stored as a single object</li><li>Structured attributes stored as distinct values</li>
</ol><p>Note that a content type does <em>not</em> have to store its
</ol>
<p>Note that a content type does <em>not</em> have to store its
primary content in the <tt>BLOB</tt> column of the
<tt>cr_revisions</tt> table. There is some additional overhead
associated with retrieving small passages of text from the BLOB
......@@ -22,18 +25,22 @@ difference is trivial (fewer than about 10 microseconds), but if
many items must be queried at the same time the difference may
become significant. If the primary content will always be small, it
is perfectly acceptable to store the content in an attribute column
instead.</p><p>Basic attributes for all content types are stored in the
instead.</p>
<p>Basic attributes for all content types are stored in the
<tt>cr_revisions</tt> (note that they are stored in the revisions
table so that attributes may be updated for each new revision of
the actual data). Most types of content require more than the basic
attributes. For example, when storing images you will usually want
to store the pixel height and width so that images can be selected
and sorted by size, as well as displayed efficiently.</p><h3>Create an attribute table</h3><p>Extended attributes associated with ACS object types may be
and sorted by size, as well as displayed efficiently.</p>
<h3>Create an attribute table</h3>
<p>Extended attributes associated with ACS object types may be
stored as key-value pairs in a central table (generic storage), or
in a custom table whose primary key references the associated ACS
object ID (specific storage). To ensure efficient access to
attributes, the content repository API requires you to use specific
storage. Your table should have the form:</p><pre>
storage. Your table should have the form:</p>
<pre>
create table cr_<em>content_type</em> (
<em>content_type</em>_id integer
constraint cr_<em>content_type</em>_id_fk
......@@ -42,12 +49,16 @@ create table cr_<em>content_type</em> (
primary key,
<em>attributes</em>...
);
</pre><p>Note that your extended attribute table must reference the
</pre>
<p>Note that your extended attribute table must reference the
<tt>cr_revisions</tt> table, <em>not</em><tt>cr_items</tt>. As
mentioned above, this allows you to maintain multiple revisions of
the attribute data in tandem with revisions of the content object
itself.</p><h3>Use the Content Type API to create the content type</h3><p>To define a content type, you should write an SQL script to
create the content type and then add attributes to it:</p><pre>
itself.</p>
<h3>Use the Content Type API to create the content type</h3>
<p>To define a content type, you should write an SQL script to
create the content type and then add attributes to it:</p>
<pre>
declare
attr_id acs_attributes.attribute_id%TYPE;
begin
......@@ -72,14 +83,16 @@ begin
);
...
</pre><p>The <tt>content_type</tt> methods use the core ACS Object Type
</pre>
<p>The <tt>content_type</tt> methods use the core ACS Object Type
API to create an object type for each content type, and to add
attributes to the object type. In addition,
<tt>content_type.create_type</tt> will create the extended
attribute table with an appropriately defined primary key column
(referencing its supertype) if the table does not already exist.
Likewise, <tt>content_type.create_attribute</tt> will add a column
to the table if the column does not already exist.</p><p>Most importantly, the <tt>content_type</tt> methods call
to the table if the column does not already exist.</p>
<p>Most importantly, the <tt>content_type</tt> methods call
<tt>content_type.refresh_view</tt> after each change to the content
type definition. Each content type must have an associated
attribute view named <tt>
......@@ -89,9 +102,13 @@ table for a particular content type. The view joins the
<tt>acs_objects</tt>, <tt>cr_revisions</tt>, and all extended
attribute tables in the class hierarchy of a particular content
type. This view may be used to query attributes when serving
content.</p><h3>Creating compund items</h3><p>In many cases your content items will serve as containers for
content.</p>
<h3>Creating compund items</h3>
<p>In many cases your content items will serve as containers for
other items. You can include the set of allowable components as
part of a content type definition. See <a href="object-relationships">Object Relationships</a> for
details.</p><hr><a href="mailto:templating@arsdigita.com">templating@arsdigita.com</a><p>Last Modified: $Id: types.html,v 1.1.1.1 2001/03/13 22:59:26 ben
details.</p>
<hr>
<a href="mailto:templating\@arsdigita.com">templating\@arsdigita.com</a>
<p>Last Modified: $&zwnj;Id: types.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $</p>
</body>
......@@ -2,11 +2,13 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Content Repository Developer Guide: Workflow}</property>
<property name="doc(title)">Content Repository Developer Guide: Workflow</property>
<master>
<body>
<h2>Applying Workflow to Content Items</h2><p>This document describes the workflow API calls necessary to
apply a simple workflow to a content item.</p><h3>Workflow Description</h3><p>Most publishers wish to follow some variation of the following
workflow:</p><table border="1" cellspacing="0" cellpadding="4">
<h2>Applying Workflow to Content Items</h2>
<p>This document describes the workflow API calls necessary to
apply a simple workflow to a content item.</p>
<h3>Workflow Description</h3>
<p>Most publishers wish to follow some variation of the following
workflow:</p>
<table border="1" cellspacing="0" cellpadding="4">
<tr bgcolor="#CCCCCC">
<th>State</th><th>Task</th><th>Description</th>
</tr><tr>
......@@ -18,10 +20,12 @@ workflow:</p><table border="1" cellspacing="0" cellpadding="4">
</tr><tr>
<td>Published</td><td>None</td><td>The publisher has approved the item.</td>
</tr>
</table><p>At any point in the workflow, an assigned user should be able to
</table>
<p>At any point in the workflow, an assigned user should be able to
check out an item, such that other users are advised that someone
is working on it. When checking an item in, a user should have up
to three options:</p><ol>
to three options:</p>
<ol>
<li>Check the item in but do not mark the task as finished
(allowing someone else to work on the task. The currently enabled
task (whether it is authoring, editing or approving) does not
......@@ -29,12 +33,16 @@ change.</li><li>Check the item in and move to the next task. For the authoring
task, this signifies that the authoring is complete. For subsequent
tasks, this signifies approval.</li><li>Check the item in and move to a previous task, indicating
rejection.</li>
</ol><p>This simple workflow is defined in
<tt>sql/workflows/author-edit-publish.sql</tt>.</p><h3>Workflow Creation</h3><p>Production of a content item frequently begins with a concept
</ol>
<p>This simple workflow is defined in
<tt>sql/workflows/author-edit-publish.sql</tt>.</p>
<h3>Workflow Creation</h3>
<p>Production of a content item frequently begins with a concept
which is initiated by the publisher and then executed by the staff.
In this scenario, the publisher creates the workflow and then
assigns each task in the workflow to one or more people. The API
calls to initialize a new workflow are as follows:</p><pre>
calls to initialize a new workflow are as follows:</p>
<pre>
declare
v_case_id integer;
sample_object_id integer := 9;
......@@ -53,17 +61,23 @@ begin
end;
/
</pre><p>In this case, only one assignment is made per task. You can make
</pre>
<p>In this case, only one assignment is made per task. You can make
as many assignments per task as desired. There is currently no
workflow API to set deadlines, so you must write your own DML to
insert a row into <tt>wf_case_deadlines</tt> if you wish to allow
the publisher to set deadlines ahead of time.</p><p>The above workflow is created in the <b>Default</b> context. In
the publisher to set deadlines ahead of time.</p>
<p>The above workflow is created in the <b>Default</b> context. In
practice, you may wish to create one or more contexts in which to
create your workflows. Contexts may be used to represent different
departments within an organization.</p><p>The <tt>start_case</tt> enables the first task in the workflow,
in this case <b>Authoring</b>.</p><h3>Check Out Item</h3><p>If multiple persons are assigned to the same task, it is useful
departments within an organization.</p>
<p>The <tt>start_case</tt> enables the first task in the workflow,
in this case <b>Authoring</b>.</p>
<h3>Check Out Item</h3>
<p>If multiple persons are assigned to the same task, it is useful
to allow a single person to "check out" or lock an item while they
are working. This is accomplished with the following API calls:</p><pre>
are working. This is accomplished with the following API calls:</p>
<pre>
declare
v_journal_id integer;
sample_task_id := 1000;
......@@ -77,14 +91,18 @@ begin
end;
/
</pre><p>A mininum of two calls are required to perform any action
</pre>
<p>A mininum of two calls are required to perform any action
related to a task. In this case we are simply notifying the
workflow engine that someone has started the task. You may specify
NULL for the journal message if the user does not wish to comment
on the check out.</p><h3>Check In Item</h3><p>Unless given a timeout period, a lock on a content item will
on the check out.</p>
<h3>Check In Item</h3>
<p>Unless given a timeout period, a lock on a content item will
persist until the holding user checks the item back in. This
involves notifying the workflow engine that the user has finished
the task:</p><pre>
the task:</p>
<pre>
declare
v_journal_id integer;
sample_task_id integer := 1000;
......@@ -99,14 +117,18 @@ begin
end;
/
</pre><p>Upon finishing a task, you must notify the workflow engine where
</pre>
<p>Upon finishing a task, you must notify the workflow engine where
to go next. In this case, an author wishes to simply check an item
back in without actually completing the authoring task. The
<tt>set_attribute_value</tt> procedure must thus be used to set
<tt>next_place</tt> to the starting place of the workflow.</p><h3>Finish Task</h3><p>The process to finish a task varies slightly depending on
<tt>next_place</tt> to the starting place of the workflow.</p>
<h3>Finish Task</h3>
<p>The process to finish a task varies slightly depending on
whether the user has previously checked out the item out or not. If
the user has not already checked it out (has been working on the
item without locking it, the code looks like this:</p><pre>
item without locking it, the code looks like this:</p>
<pre>
declare
v_journal_id integer;
sample_task_id integer := 1002;
......@@ -127,13 +149,17 @@ begin
end;
/
</pre><p>In this case an author is finishing the <b>Authoring</b> task,
</pre>
<p>In this case an author is finishing the <b>Authoring</b> task,
upon which the workflow engine will move the workflow to the
<b>Authored</b> state (as indicated by the <tt>next_place</tt>
attribute). If the author had previously checked out the item, then
only the second step is required.</p><h3>Approve or Reject</h3><p>Approval steps more commonly do not involve an explicit
only the second step is required.</p>
<h3>Approve or Reject</h3>
<p>Approval steps more commonly do not involve an explicit
check-out process. The code is thus virtually identical to that
above:</p><pre>
above:</p>
<pre>
declare
v_journal_id integer;
sample_task_id integer := 1003;
......@@ -152,8 +178,12 @@ begin
end;
/
</pre><p>Note the distinction between approval or rejection is determined
solely by the value of the <tt>next_place</tt> attribute.</p><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last Modified: <tt>$Id: workflow.html,v 1.1.1.1 2001/03/13 22:59:26
</pre>
<p>Note the distinction between approval or rejection is determined
solely by the value of the <tt>next_place</tt> attribute.</p>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last Modified: <tt>$&zwnj;Id: workflow.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $</tt>
</body>
......@@ -2,9 +2,8 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {ACS Content Repository}</property>
<property name="doc(title)">ACS Content Repository</property>
<master>
<body>
<h2>ACS Content Repository</h2><ul>
<h1>ACS Content Repository</h1>
<ul>
<li><a href="design">Introduction</a></li><li><a href="install">Installation</a></li><li><a href="tutorial">Tutorial</a></li><li><a href="object-model">Object Model</a></li><li>
<p>Developer Guide</p><ul>
<li><a href="guide/types">Designing content types</a></li><li><a href="guide/items">Creating content items</a></li><li><a href="guide/revisions">Adding revisions to content
......@@ -32,6 +31,12 @@ items</a></li>
</ul>
</li><li><a href="uninstall">Uninstalling the content
repository</a></li>
</ul><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last Revised: $Id$
</body>
</ul>
<h2>Release Notes</h2>
<p>Please file bugs in the <a href="http://openacs.org/bugtracker/openacs/">Bug Tracker</a>.</p>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last Revised: $&zwnj;Id: index.html,v 1.2.18.2 2015/08/21 10:49:20
gustafn Exp $
......@@ -6,7 +6,7 @@
</head>
<body>
<h2>ACS Content Repository</h2>
<h1>ACS Content Repository</h1>
<b><a href="/doc">ACS Documentation</a></b>
<hr>
......@@ -55,7 +55,10 @@
</ul>
<li><a href="uninstall.html">Uninstalling the content repository</a>
</ul>
<h2>Release Notes</h2>
<p>Please file bugs in the <a href="http://openacs.org/bugtracker/openacs/">Bug Tracker</a>.</p>
<hr>
<a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last Revised: $Id$
......
......@@ -2,13 +2,15 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Content Repository: Installation}</property>
<property name="doc(title)">Content Repository: Installation</property>
<master>
<body>
<h2>Installing the Content Repository</h2><p>The content repository is a part of the core data model of ACS
<h2>Installing the Content Repository</h2>
<p>The content repository is a part of the core data model of ACS
4.0 and greater, and is loaded automatically as part of the ACS
installation process.</p><p>If you wish to install the content repository in a database
installation process.</p>
<p>If you wish to install the content repository in a database
schema outside the context of ACS, the following instructions
apply.</p><p>First install the data model and PL/SQL API:</p><ol>
apply.</p>
<p>First install the data model and PL/SQL API:</p>
<ol>
<li>Obtain the latest distribution of ACS.</li><li>Run the SQL script
<tt>packages/acs-kernel/sql/acs-kernel-create.sql</tt> to load the
core ACS Objects data model.</li><li>Run the SQL script
......@@ -16,28 +18,41 @@ core ACS Objects data model.</li><li>Run the SQL script
the workflow package.</li><li>Run the SQL script
<tt>packages/acs-workflow/sql/acs-content-repository-create.sql</tt>
to load the content repository itself.</li>
</ol><h3>Java</h3><p>In additional to SQL and PL/SQL, the content repository
</ol>
<h3>Java</h3>
<p>In additional to SQL and PL/SQL, the content repository
implements a limited set of key methods in Java. The XML import and
export methods are dependent on Oracle's XML Parser for Java v2,
available from the Oracle Technology Network:</p><a href="http://technet.us.oracle.com/tech/xml/parser_java2/index.htm"><tt>http://technet.us.oracle.com/tech/xml/parser_java2/index.htm</tt></a><p>To load the XML parser, download and untar the distribution.
available from the Oracle Technology Network:</p>
<a href="http://technet.us.oracle.com/tech/xml/parser_java2/index.htm"><tt>http://technet.us.oracle.com/tech/xml/parser_java2/index.htm</tt></a>
<p>To load the XML parser, download and untar the distribution.
Load the class package <tt>lib/xmlparserv2.jar</tt> into Oracle
from a shell prompt:</p><pre>
from a shell prompt:</p>
<pre>
$ loadjava -user user/password xmlparserv2.jar
</pre><p>Finally, load the SQLJ files in
<tt>packages/acs-content-repository/java</tt>:</p><pre>
</pre>
<p>Finally, load the SQLJ files in
<tt>packages/acs-content-repository/java</tt>:</p>
<pre>
$ loadjava -user user/password -resolve *.sqlj
</pre><p>Installation of the data model and API should now be
complete.</p><h3>Intermedia</h3><p>The content repository relies on an Intermedia with the INSO
</pre>
<p>Installation of the data model and API should now be
complete.</p>
<h3>Intermedia</h3>
<p>The content repository relies on an Intermedia with the INSO
filtering option to search text within a wide variety of file
formats, including PDF and Microsoft Word. When the index on the
<tt>content</tt> column of <tt>cr_revisions</tt> is built, the INSO
filter automatically detects the file type of each entry and
extracts all available text for indexing.</p><p>If your searches are not returning any results even after
extracts all available text for indexing.</p>
<p>If your searches are not returning any results even after
rebuilding the index, INSO filtering may be silently failing. You
can verifying this by checking for entries in the
<tt>ctx_user_index_errors</tt> view following an <tt>alter
index</tt> statement.</p><p>If you experience errors on a UNIX system, check the
following:</p><ul>
index</tt> statement.</p>
<p>If you experience errors on a UNIX system, check the
following:</p>
<ul>
<li>The operating system user running the Oracle database must have
execute permission on the files
<tt>$ORACLE_HOME/ctx/lib/*.flt</tt>.</li><li>The directory <tt>$ORACLE_HOME/ctx/lib</tt> must be in the
......@@ -47,17 +62,22 @@ running the Oracle database.</li><li>The directory <tt>$ORACLE_HOME/ctx/lib</tt>
Oracle database.</li><li>The <tt>LD_LIBRARY_PATH</tt> environment variable must be
specified in the entry for <tt>PLSExtProc</tt> in the
<tt>$ORACLE_HOME/network/admin/listener.ora.</tt> For example:</li>
</ul><pre>
</ul>
<pre>
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /ora8/m01/app/oracle/product/8.1.6)
(ENVS = LD_LIBRARY_PATH=/ora8/m01/app/oracle/product/8.1.6/lib:/usr/lib:/lib:/usr/openwin/lib:/ora8/m01/app/oracle/product/8.1.6/ctx/lib)
(PROGRAM = extproc)
)
</pre><p>If your searches are still failing even after following these
</pre>
<p>If your searches are still failing even after following these
instructions, try a simple <a href="intermedia">test case</a>
to determine whether the problem has something to do with the
content repository data model itself.</p><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last revised: $Id: install.html,v 1.1.1.1 2001/03/13 22:59:26 ben
content repository data model itself.</p>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last revised: $&zwnj;Id: install.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
</body>
......@@ -2,12 +2,14 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Content Repository: Testing Intermedia}</property>
<property name="doc(title)">Content Repository: Testing Intermedia</property>
<master>
<body>
<h2>Testing Intermedia</h2><p>Even if you follow the instructions in the <a href="install">installation notes</a>, content searches may
<h2>Testing Intermedia</h2>
<p>Even if you follow the instructions in the <a href="install">installation notes</a>, content searches may
inexplicably fail to work. This document describes how to create a
simple test case independent of the content repository to verify
that Intermedia is indeed functioning properly.</p><h3>Create a document table</h3><p>Create a simple table to hold some test documents:</p><pre>
that Intermedia is indeed functioning properly.</p>
<h3>Create a document table</h3>
<p>Create a simple table to hold some test documents:</p>
<pre>
create table cr_test_documents (
doc_id integer primary key,
author varchar2(30),
......@@ -15,22 +17,30 @@ create table cr_test_documents (
title varchar2(256),
doc blob
);
</pre><p>Create an Intermedia preference to specify INSO filtering:</p><pre>
</pre>
<p>Create an Intermedia preference to specify INSO filtering:</p>
<pre>
begin
ctx_ddl.create_preference
(
preference_name =&gt; 'CONTENT_FILTER_PREF',
object_name =&gt; 'INSO_FILTER'
);
</pre><p>If this preference has already been created, this step will
cause an error that you can ignore.</p><p>Create an Intermedia index on the test table with INSO
filtering:</p><pre>
</pre>
<p>If this preference has already been created, this step will
cause an error that you can ignore.</p>
<p>Create an Intermedia index on the test table with INSO
filtering:</p>
<pre>
create index cr_test_documents_idx on cr_test_documents ( doc )
indextype is ctxsys.context
parameters ('FILTER content_filter_pref' );
</pre><h3>Load test documents</h3><p>You can use SQL*Loader to load some documents into the test
</pre>
<h3>Load test documents</h3>
<p>You can use SQL*Loader to load some documents into the test
table. First create a control file named
<tt>cr-test-docs.ctl</tt>:</p><pre>
<tt>cr-test-docs.ctl</tt>:</p>
<pre>
load data
INFILE 'cr-test-docs.data'
INTO TABLE cr_test_documents
......@@ -41,13 +51,17 @@ FIELDS TERMINATED BY ','
title,
ext_fname FILLER CHAR(80),
doc LOBFILE(ext_fname) TERMINATED BY EOF)
</pre><p>Copy any number of documents (Microsoft Word, PDF, text, HTML,
</pre>
<p>Copy any number of documents (Microsoft Word, PDF, text, HTML,
etc.) to the file system of your database server. Create a data
file with an entry for each document you would like to load. This
is simply a comma-separated text file:</p><pre>
is simply a comma-separated text file:</p>
<pre>
word, Simple Story,sample-docs/simple.doc,
excel, Simple Spreadsheet,sample-docs/simple.xls
</pre><p>Load the documents from the command line:</p><pre>
</pre>
<p>Load the documents from the command line:</p>
<pre>
$ sqlldr userid=cms/cms control=cr-test-docs.ctl log=cr-test-docs.log
SQL*Loader: Release 8.1.6.2.0 - Production on Thu Nov 9 13:36:56 2000
......@@ -55,8 +69,11 @@ SQL*Loader: Release 8.1.6.2.0 - Production on Thu Nov 9 13:36:56 2000
(c) Copyright 1999 Oracle Corporation. All rights reserved.
Commit point reached - logical record count 2
</pre><h3>Test search</h3><p>Once the documents have been loaded, rebuild the index and run
some test queries:</p><pre>
</pre>
<h3>Test search</h3>
<p>Once the documents have been loaded, rebuild the index and run
some test queries:</p>
<pre>
SQL&gt; alter index cr_test_documents_index rebuild online parameters ('sync');
SQL&gt; select score(1), doc_id from cr_test_documents
where contains(doc, 'cars', 1) &gt; 0;
......@@ -64,7 +81,10 @@ SQL&gt; select score(1), doc_id from cr_test_documents
SCORE(1) DOC_ID
---------- ----------
4 1
</pre><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last revised: $Id: intermedia.html,v 1.1.1.1 2001/03/13 22:59:26
</pre>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last revised: $&zwnj;Id: intermedia.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $
</body>
# included template
# method and package must be defined by the including template
doc::get_proc_doc $method $package params info code
\ No newline at end of file
doc::get_proc_doc $method $package params info code
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -2,18 +2,21 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Content Repository: Object Model}</property>
<property name="doc(title)">Content Repository: Object Model</property>
<master>
<body>
<h2>Object Model</h2><p>The content repository is an extension of the ACS Object Model.
<h2>Object Model</h2>
<p>The content repository is an extension of the ACS Object Model.
The following diagram illustrates the relationship among the
standard object types defined by the content repository (click on a
box to view a description and API summary for a particular object
type):</p><img name="objectmodel" src="object-model.gif" width="500" height="400" border="0" usemap="#m_object_model" id="objectmodel"><map name="m_object_model" id="m_object_model">
type):</p>
<img name="objectmodel" src="object-model.gif" width="500" height="400" border="0" usemap="#m_object_model" id="objectmodel">
<map name="m_object_model" id="m_object_model">
<area shape="rect" coords="191,45,287,90" href="api/keyword.html"><area shape="rect" coords="39,224,135,269" href="api/object.html"><area shape="rect" coords="345,306,440,364" href="api/custom.html"><area shape="rect" coords="191,123,287,168" href="api/item.html"><area shape="rect" coords="191,313,287,358" href="api/revision.html"><area shape="rect" coords="343,25,439,70" href="api/folder.html"><area shape="rect" coords="345,89,441,134" href="api/template.html"><area shape="rect" coords="344,154,440,199" href="api/symlink.html"><area shape="rect" coords="345,221,441,266" href="api/extlink.html">
</map><p>Note that content revisions and content items inherit separately
</map>
<p>Note that content revisions and content items inherit separately
from the root of the object model. Each item may be related to one
or more revisions, but they are fundamentally different types of
objects.</p><p>Also important to note is the relationship between custom
objects.</p>
<p>Also important to note is the relationship between custom
content types and the rest of the object model. You define new
content types as subtypes of Content Revision, not of Content Item.
This is because new content types are characterized by their
......@@ -21,7 +24,10 @@ attributes, which are stored at the revision level to make changes
easy to audit. Custom content types typically do not require
additional unaudited attributes or methods beyond those already
provided by the Content Item type. It is thereful almost never
necessary to create a custom subtype of Content Item itself.</p><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last revised: $Id: object-model.html,v 1.1.1.1 2001/03/13 22:59:26
necessary to create a custom subtype of Content Item itself.</p>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last revised: $&zwnj;Id: object-model.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $
</body>
......@@ -9,3 +9,9 @@ doc::package_info $package_name info
# declare the datasource for the methods
doc::func_multirow $package_name methods
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
This diff is collapsed.
......@@ -2,9 +2,8 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {}</property>
<property name="doc(title)"></property>
<master>
<body>
<h2>To Do List for Content Management System</h2><pre>
<h2>To Do List for Content Management System</h2>
<pre>
Documentation
......@@ -70,6 +69,6 @@ Clipboard
--think about improving UI for this. 2
</pre><p>Last Modified: $Id: todo.html,v 1.1.1.1 2001/03/13 22:59:26 ben
</pre>
<p>Last Modified: $&zwnj;Id: todo.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $</p>
</body>
This diff is collapsed.
......@@ -2,13 +2,15 @@
<property name="context">{/doc/acs-content-repository {Content Repository}} {Content Repository: Uninstalling}</property>
<property name="doc(title)">Content Repository: Uninstalling</property>
<master>
<body>
<h2>Uninstalling the Content Repository</h2><p>The content repository includes an uninstall script,
<tt>sql/content-drop.sql</tt>. This script does two things:</p><ol>
<h2>Uninstalling the Content Repository</h2>
<p>The content repository includes an uninstall script,
<tt>sql/content-drop.sql</tt>. This script does two things:</p>
<ol>
<li>Drops the attribute storage tables for all content types you
have defined.</li><li>Drops the general tables for the content repository.</li>
</ol><p>The uninstall script does <b>not</b> do the following:</p><ol>
</ol>
<p>The uninstall script does <b>not</b> do the following:</p>
<ol>
<li>It does <b>not</b> delete rows from the <tt>acs_objects</tt>
table. Many other tables reference the <tt>object_id</tt> column in
this table, so there is the possibility that the uninstall script
......@@ -16,12 +18,16 @@ will encounter foreign key reference errors.</li><li>It does <b>not</b> delete t
<tt>acs_object_types</tt> table. As for objects themselves, it is
impossible for an automatic script to properly handle disposal of
all foreign key references.</li>
</ol><p>Because of what the uninstall script does <b>not</b> do, it is
</ol>
<p>Because of what the uninstall script does <b>not</b> do, it is
only appropriate for removing the content repository <em>in
preparation for removing the entire ACS Objects data model</em>. If
you wish to upgrade an existing installation and cannot afford to
lose your data, you must run an upgrade script rather than
uninstalling the entire data model.</p><hr><a href="mailto:karlg@arsdigita.com">karlg@arsdigita.com</a><br>
Last revised: $Id: uninstall.html,v 1.1.1.1 2001/03/13 22:59:26 ben
uninstalling the entire data model.</p>
<hr>
<a href="mailto:karlg\@arsdigita.com">karlg\@arsdigita.com</a>
<br>
Last revised: $&zwnj;Id: uninstall.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
</body>
......@@ -4,4 +4,9 @@ ad_page_contract {
item_id:naturalnum,notnull
filename
}
set ad_url [ad_url]
\ No newline at end of file
set ad_url [ad_url]
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment