Commit dade9ebc authored by Frank Bergmann's avatar Frank Bergmann

- Updated to OpenACS 5.9.1

parent e781030e
......@@ -6,33 +6,36 @@
<pretty-plural>ACS Content Repository Services</pretty-plural>
<initial-install-p>t</initial-install-p>
<singleton-p>t</singleton-p>
<version name="5.9.0" url="http://openacs.org/repository/download/apm/acs-content-repository-5.9.0.apm">
<implements-subsite-p>f</implements-subsite-p>
<inherit-templates-p>t</inherit-templates-p>
<version name="5.9.1" url="http://openacs.org/repository/download/apm/acs-content-repository-5.9.1.apm">
<owner url="http://openacs.org">OpenACS</owner>
<summary>The canonical repository for OpenACS content.</summary>
<release-date>2015-10-04</release-date>
<release-date>2017-08-06</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
other CMS backing functionality. Utilized by Bug Tracker, File Storage, and other packages.
</description>
</description>
<license>GPL</license>
<maturity>3</maturity>
<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"/>
<provides url="acs-content-repository" version="5.9.1"/>
<requires url="acs-kernel" version="5.9.1"/>
<requires url="acs-service-contract" version="5.9.1"/>
<requires url="acs-tcl" version="5.9.1"/>
<requires url="search" version="5.9.1"/>
<callbacks>
<callback type="after-upgrade" proc="content::apm::after_upgrade"/>
<callback type="after-upgrade" proc="content::apm::after_upgrade"/>
</callbacks>
<parameters>
<parameter datatype="string" min_n_values="1" max_n_values="1" name="CRFileLocationRoot" default="content-repository-content-files" description="The directory to which files are published and from where they are retrieved when a files is served. It is taken to be relative to $::acs::rootdir unless FileLocationRelativeP is set to 1" section_name="files"/>
<parameter datatype="number" min_n_values="1" max_n_values="1" name="FileLocationRelativeP" default="1" description="Defaults to 1 which means the FileLocation parameter is relative to the web servers root folder. If set to 0, the FileLocation parameter is an absolute path and so can contain a drive letter for example. Important note: if you change this parameter to 0, remember the system will attempt to retrieve existing files from the new location. You will also need to bounce the server after changing this or the FileLocation value." section_name="files"/>
<parameter datatype="string" min_n_values="1" max_n_values="1" name="ImageMagickConvertBinary" default="/usr/bin/convert" description="Binary to use with the image:: procs in packages/acs-content-repository/tcl/image-procs.tcl" section_name="files"/>
<parameter datatype="string" min_n_values="1" max_n_values="1" name="TemplateRoot" default="templates" description="The directory to which templates are published and from where they are retrieved when a page is served. If the value does not start with a '/', it is taken to be relative to $::acs::rootdir. Packages that use the content-repository can override this setting by defining their own TemplateRoot parameter." section_name="templates"/>
<parameter scope="instance" datatype="number" min_n_values="1" max_n_values="1" name="AllowMimeTypeCreationP" default="0" description="Decides whether we allow unknown mimetypes to be automatically registered when encountered. Default is to allow only already registered mimetypes to be put into Content Repository." section_name="files"/>
<parameter scope="instance" datatype="string" min_n_values="1" max_n_values="1" name="CRFileLocationRoot" default="content-repository-content-files" description="The directory to which files are published and from where they are retrieved when a files is served. It is taken to be relative to $::acs::rootdir unless FileLocationRelativeP is set to 1" section_name="files"/>
<parameter scope="instance" datatype="number" min_n_values="1" max_n_values="1" name="FileLocationRelativeP" default="1" description="Defaults to 1 which means the FileLocation parameter is relative to the web servers root folder. If set to 0, the FileLocation parameter is an absolute path and so can contain a drive letter for example. Important note: if you change this parameter to 0, remember the system will attempt to retrieve existing files from the new location. You will also need to bounce the server after changing this or the FileLocation value." section_name="files"/>
<parameter scope="instance" datatype="string" min_n_values="1" max_n_values="1" name="ImageMagickConvertBinary" default="/usr/bin/convert" description="Binary to use with the image:: procs in packages/acs-content-repository/tcl/image-procs.tcl" section_name="files"/>
<parameter scope="instance" datatype="string" min_n_values="1" max_n_values="1" name="TemplateRoot" default="templates" description="The directory to which templates are published and from where they are retrieved when a page is served. If the value does not start with a &#39;/&#39;, it is taken to be relative to $::acs::rootdir. Packages that use the content-repository can override this setting by defining their own TemplateRoot parameter." section_name="templates"/>
</parameters>
</version>
......
This diff is collapsed.
......@@ -767,7 +767,7 @@ begin
from cr_items i
where i.item_id = :old.item_id
and i.storage_type = 'file'
and r.content is not null;
and :old.filename is not null;
end cr_cleanup_cr_files_del_trg;
/
......
......@@ -284,7 +284,8 @@ procedure copy (
target_folder_id in cr_folders.folder_id%TYPE,
creation_user in acs_objects.creation_user%TYPE,
creation_ip in acs_objects.creation_ip%TYPE default null,
name in cr_items.name%TYPE default null
name in cr_items.name%TYPE default null,
label in cr_folders.label%TYPE default null
) is
v_valid_folders_p integer := 0;
v_current_folder_id cr_folders.folder_id%TYPE;
......@@ -363,7 +364,7 @@ begin
v_new_folder_id := content_folder.new(
parent_id => copy.target_folder_id,
name => nvl(copy.name,v_name),
label => v_label,
label => nvl(copy.label,v_label),
description => v_description,
creation_user => copy.creation_user,
creation_ip => copy.creation_ip
......
......@@ -80,7 +80,8 @@ function new (
is_live in char default 'f',
storage_type in cr_items.storage_type%TYPE default 'lob',
security_inherit_p in acs_objects.security_inherit_p%TYPE default 't',
package_id in acs_objects.package_id%TYPE default null
package_id in acs_objects.package_id%TYPE default null,
with_child_rels in boolean default 't'
) return cr_items.item_id%TYPE
is
v_parent_id cr_items.parent_id%TYPE;
......@@ -197,7 +198,8 @@ begin
-- if the parent is not a folder, insert into cr_child_rels
-- We checked above before creating the object that it is a valid rel
if v_parent_id ^= -4 and
if content_item.new.with_child_rels = 't' and
v_parent_id ^= -4 and
content_folder.is_folder(v_parent_id) = 'f' then
v_rel_id := acs_object.new(
......@@ -1076,7 +1078,8 @@ end get_live_revision;
procedure set_live_revision (
revision_id in cr_revisions.revision_id%TYPE,
publish_status in cr_items.publish_status%TYPE default 'ready'
publish_status in cr_items.publish_status%TYPE default 'ready',
publish_date in cr_revisions.publish_date%TYPE default sysdate
) is
begin
......@@ -1096,7 +1099,7 @@ begin
update
cr_revisions
set
publish_date = sysdate
publish_date = set_live_revision.publish_date
where
revision_id = set_live_revision.revision_id;
......
......@@ -192,8 +192,8 @@ dbms_output.put_line('This is the path to a folder from a subfolder');
dbms_output.put_line('Path for ' || sub_folder_id || ' from sub_sub_folder_id: ' ||
sub_sub_folder_id || ' is ' ||
content_item.get_path(sub_folder_id,sub_sub_folder_id));
dbms_output.put_line('This is a path to an item from a non-existant item');
dbms_output.put_line('Path for ' || item_id || ' from nonexistant_id: ' ||
dbms_output.put_line('This is a path to an item from a non-existent item');
dbms_output.put_line('Path for ' || item_id || ' from nonexistent_id: ' ||
-200 || ' is ' ||
content_item.get_path(item_id,-200));
dbms_output.put_line('This is a path to an item from a non-related branch');
......
......@@ -311,7 +311,7 @@ begin
-- Drop the attribute
acs_attribute.drop_attribute(content_type, attribute_name);
-- Drop the column if neccessary
-- Drop the column if necessary
if drop_column = 't' then
begin
execute immediate 'alter table ' || v_table || ' drop column ' ||
......@@ -556,6 +556,7 @@ begin
revision_id => :new.revision_id,
title => :new.title,
description => :new.description,
publish_date => :new.publish_date,
mime_type => :new.mime_type,
nls_language => :new.nls_language,
item_id => content_symlink.resolve(:new.item_id),
......@@ -571,6 +572,7 @@ begin
revision_id => :new.revision_id,
title => :new.title,
description => :new.description,
publish_date => :new.publish_date,
mime_type => :new.mime_type,
nls_language => :new.nls_language,
item_id => content_symlink.resolve(:new.item_id),
......
......@@ -503,7 +503,7 @@ function get_virtual_path (
procedure write_to_file (
--/** Writes the content of the live revision of this item to a file,
-- creating all the neccessary directories in the process
-- creating all the necessary directories in the process
-- @author Karl Goldstein
-- @param item_id The item to be written to a file
-- @param root_path The path in the filesystem to which the root of the
......@@ -1622,7 +1622,7 @@ function is_assigned (
) return varchar2;
function get_path (
--/** Retreives a path to the keyword/subject category, with the most general
--/** Retrieves a path to the keyword/subject category, with the most general
-- category at the root of the path
-- @author Karl Goldstein
-- @param keyword_id The keyword id
......@@ -1659,8 +1659,8 @@ is
function has_grant_authority (
--/** Determine if the user may grant a certain permission to another
-- user. The permission may only be granted if the user has
-- the permission himself and posesses the cm_perm access, or if the
-- user posesses the cm_perm_admin access.
-- the permission himself and possesses the cm_perm access, or if the
-- user possesses the cm_perm_admin access.
-- @author Karl Goldstein
-- @param object_id The object whose permissions are to be changed
-- @param holder_id The person who is attempting to grant the permissions
......@@ -1697,7 +1697,7 @@ is
-- @param object_id The object whose permissions are to be changed
-- @param holder_id The person who is attempting to grant the permissions
-- @param privilege The privilege to be granted
-- @param recepient_id The person who will gain the privilege
-- @param recipient_id The person who will gain the privilege
-- @param is_recursive If 't', applies the donation recursively to
-- all child objects of the object (equivalent to UNIX's <tt>chmod -r</tt>).
-- If 'f', only affects the objects itself.
......@@ -1707,7 +1707,7 @@ is
object_id in acs_objects.object_id%TYPE,
holder_id in parties.party_id%TYPE,
privilege in acs_privileges.privilege%TYPE,
recepient_id in parties.party_id%TYPE,
recipient_id in parties.party_id%TYPE,
is_recursive in varchar2 default 'f',
object_type in acs_objects.object_type%TYPE default 'content_item'
);
......@@ -1715,8 +1715,8 @@ is
function has_revoke_authority (
--/** Determine if the user may take a certain permission away from another
-- user. The permission may only be revoked if the user has
-- the permission himself and posesses the cm_perm access, while the
-- other user does not, or if the user posesses the cm_perm_admin access.
-- the permission himself and possesses the cm_perm access, while the
-- other user does not, or if the user possesses the cm_perm_admin access.
-- @author Karl Goldstein
-- @param object_id The object whose permissions are to be changed
-- @param holder_id The person who is attempting to revoke the permissions
......@@ -1755,7 +1755,7 @@ is
-- @param object_id The object whose permissions are to be changed
-- @param holder_id The person who is attempting to revoke the permissions
-- @param privilege The privilege to be revoked
-- @param recepient_id The person who will lose the privilege
-- @param recipient_id The person who will lose the privilege
-- @param is_recursive If 't', applies the operation recursively to
-- all child objects of the object (equivalent to UNIX's <tt>chmod -r</tt>).
-- If 'f', only affects the objects itself.
......
......@@ -4480,7 +4480,7 @@ function get_virtual_path (
procedure write_to_file (
--/** Writes the content of the live revision of this item to a file,
-- creating all the neccessary directories in the process
-- creating all the necessary directories in the process
-- @author Karl Goldstein
-- @param item_id The item to be written to a file
-- @param root_path The path in the filesystem to which the root of the
......@@ -5581,7 +5581,7 @@ function is_assigned (
) return varchar2;
function get_path (
--/** Retreives a path to the keyword/subject category, with the most general
--/** Retrieves a path to the keyword/subject category, with the most general
-- category at the root of the path
-- @author Karl Goldstein
-- @param keyword_id The keyword id
......@@ -5618,8 +5618,8 @@ is
function has_grant_authority (
--/** Determine if the user may grant a certain permission to another
-- user. The permission may only be granted if the user has
-- the permission himself and posesses the cm_perm access, or if the
-- user posesses the cm_perm_admin access.
-- the permission himself and possesses the cm_perm access, or if the
-- user possesses the cm_perm_admin access.
-- @author Karl Goldstein
-- @param object_id The object whose permissions are to be changed
-- @param holder_id The person who is attempting to grant the permissions
......@@ -5656,7 +5656,7 @@ is
-- @param object_id The object whose permissions are to be changed
-- @param holder_id The person who is attempting to grant the permissions
-- @param privilege The privilege to be granted
-- @param recepient_id The person who will gain the privilege
-- @param recipient_id The person who will gain the privilege
-- @param is_recursive If 't', applies the donation recursively to
-- all child objects of the object (equivalent to UNIX's <tt>chmod -r</tt>).
-- If 'f', only affects the objects itself.
......@@ -5666,7 +5666,7 @@ is
object_id in acs_objects.object_id%TYPE,
holder_id in parties.party_id%TYPE,
privilege in acs_privileges.privilege%TYPE,
recepient_id in parties.party_id%TYPE,
recipient_id in parties.party_id%TYPE,
is_recursive in varchar2 default 'f',
object_type in acs_objects.object_type%TYPE default 'content_item'
);
......@@ -5674,8 +5674,8 @@ is
function has_revoke_authority (
--/** Determine if the user may take a certain permission away from another
-- user. The permission may only be revoked if the user has
-- the permission himself and posesses the cm_perm access, while the
-- other user does not, or if the user posesses the cm_perm_admin access.
-- the permission himself and possesses the cm_perm access, while the
-- other user does not, or if the user possesses the cm_perm_admin access.
-- @author Karl Goldstein
-- @param object_id The object whose permissions are to be changed
-- @param holder_id The person who is attempting to revoke the permissions
......@@ -5714,7 +5714,7 @@ is
-- @param object_id The object whose permissions are to be changed
-- @param holder_id The person who is attempting to revoke the permissions
-- @param privilege The privilege to be revoked
-- @param recepient_id The person who will lose the privilege
-- @param recipient_id The person who will lose the privilege
-- @param is_recursive If 't', applies the operation recursively to
-- all child objects of the object (equivalent to UNIX's <tt>chmod -r</tt>).
-- If 'f', only affects the objects itself.
......
......@@ -204,7 +204,7 @@ function get_virtual_path (
procedure write_to_file (
--/** Writes the content of the live revision of this item to a file,
-- creating all the neccessary directories in the process
-- creating all the necessary directories in the process
-- @author Karl Goldstein
-- @param item_id The item to be written to a file
-- @param root_path The path in the filesystem to which the root of the
......
......@@ -204,7 +204,7 @@ function get_virtual_path (
procedure write_to_file (
--/** Writes the content of the live revision of this item to a file,
-- creating all the neccessary directories in the process
-- creating all the necessary directories in the process
-- @author Karl Goldstein
-- @param item_id The item to be written to a file
-- @param root_path The path in the filesystem to which the root of the
......
......@@ -1288,7 +1288,7 @@ begin
-- Drop the attribute
acs_attribute.drop_attribute(content_type, attribute_name);
-- Drop the column if neccessary
-- Drop the column if necessary
if drop_column = 't' then
begin
execute immediate 'alter table ' || v_table || ' drop column ' ||
......
......@@ -214,7 +214,7 @@ function get_virtual_path (
procedure write_to_file (
--/** Writes the content of the live revision of this item to a file,
-- creating all the neccessary directories in the process
-- creating all the necessary directories in the process
-- @author Karl Goldstein
-- @param item_id The item to be written to a file
-- @param root_path The path in the filesystem to which the root of the
......
......@@ -242,7 +242,7 @@ begin
-- Drop the attribute
acs_attribute.drop_attribute(content_type, attribute_name);
-- Drop the column if neccessary
-- Drop the column if necessary
if drop_column = 't' then
begin
execute immediate 'alter table ' || v_table || ' drop column ' ||
......
......@@ -2620,7 +2620,7 @@ function is_assigned (
) return varchar2;
function get_path (
--/** Retreives a path to the keyword/subject category, with the most general
--/** Retrieves a path to the keyword/subject category, with the most general
-- category at the root of the path
-- @author Karl Goldstein
-- @param keyword_id The keyword id
......
......@@ -564,7 +564,7 @@ begin
-- Drop the attribute
acs_attribute.drop_attribute(content_type, attribute_name);
-- Drop the column if neccessary
-- Drop the column if necessary
if drop_column = 't' then
begin
execute immediate 'alter table ' || v_table || ' drop column ' ||
......
......@@ -277,7 +277,7 @@ begin
-- Drop the attribute
acs_attribute.drop_attribute(content_type, attribute_name);
-- Drop the column if neccessary
-- Drop the column if necessary
if drop_column = 't' then
begin
execute immediate 'alter table ' || v_table || ' drop column ' ||
......
......@@ -12,7 +12,7 @@ begin
from cr_items i
where i.item_id = :old.item_id
and i.storage_type = 'file'
and r.content is not null;
and :old.filename is not null;
end cr_cleanup_cr_files_del_trg;
/
......
......@@ -56,7 +56,7 @@ comment on table cr_extension_mime_type_map is '
\i ../common/mime-type-data.sql
create table cr_content_mime_type_map (
content_type varchar(100)
content_type varchar(1000)
constraint cr_content_mime_map_ctyp_fk
references acs_object_types,
mime_type varchar(200)
......@@ -115,10 +115,10 @@ insert into cr_locales (
--------------------------------------------------------------
create table cr_type_children (
parent_type varchar(100)
parent_type varchar(1000)
constraint cr_type_children_parent_type_fk
references acs_object_types,
child_type varchar(100)
child_type varchar(1000)
constraint cr_type_children_child_type_fk
references acs_object_types,
relation_tag varchar(100),
......@@ -138,10 +138,10 @@ create index cr_type_children_chld_type_idx ON cr_type_children(child_type);
create table cr_type_relations (
content_type varchar(100)
content_type varchar(1000)
constraint cr_type_relations_parent_fk
references acs_object_types,
target_type varchar(100)
target_type varchar(1000)
constraint cr_type_relations_child_fk
references acs_object_types,
relation_tag varchar(100),
......@@ -163,6 +163,7 @@ create index cr_type_relations_tgt_typ_idx ON cr_type_relations(target_type);
--------------------------------------------------------------
-- CONTENT ITEMS
--------------------------------------------------------------
CREATE TYPE cr_item_storage_type_enum AS ENUM ('text', 'file', 'lob');
-- Define the cr_items table
......@@ -189,12 +190,10 @@ create table cr_items (
check (publish_status in
('production', 'ready', 'live', 'expired')
),
content_type varchar(100)
content_type varchar(1000)
constraint cr_items_content_type_fk
references acs_object_types,
storage_type varchar(10) default 'text' not null
constraint cr_items_storage_type_ck
check (storage_type in ('lob','text','file')),
storage_type cr_item_storage_type_enum default 'text' not null,
storage_area_key varchar(100) default 'CR_FILES' not null,
tree_sortkey varbit not null,
max_child_sortkey varbit
......@@ -232,7 +231,7 @@ comment on table cr_files_to_delete is '
';
-- DCW, this can't be defined in the apm_package_versions table defintion,
-- DCW, this can't be defined in the apm_package_versions table definition,
-- because cr_items is created afterwards.
alter table apm_package_versions add
......@@ -390,10 +389,14 @@ create table cr_child_rels (
references acs_objects,
parent_id integer
constraint cr_child_rels_parent_id_nn
not null,
not null
CONSTRAINT cr_child_rels_parent_id_fk
REFERENCES acs_objects(object_id) ON DELETE CASCADE,
child_id integer
constraint cr_child_rels_child_id_nn
not null,
not null
CONSTRAINT cr_child_rels_child_id_fk
REFERENCES cr_items(item_id) ON DELETE CASCADE,
relation_tag varchar(100),
order_n integer
);
......@@ -416,8 +419,8 @@ create table cr_item_rels (
constraint cr_item_rels_rel_id_fk
references acs_objects,
item_id integer
constraint cr_item_rels_item_id_fk
references cr_items,
CONSTRAINT cr_item_rels_item_id_fk
REFERENCES cr_items(item_id) ON DELETE CASCADE,
related_object_id integer
constraint cr_item_rels_rel_obj_fk
references acs_objects,
......@@ -485,8 +488,8 @@ create table cr_revisions (
create index cr_revisions_lob_idx ON cr_revisions(lob);
create index cr_revisions_item_id_idx ON cr_revisions(item_id);
create trigger cr_revisions_lob_trig before delete or update or insert
on cr_revisions for each row execute procedure on_lob_ref();
CREATE TRIGGER cr_revisions_lob_trig AFTER UPDATE or DELETE or INSERT
ON cr_revisions FOR EACH ROW EXECUTE PROCEDURE on_lob_ref();
create index cr_revisions_by_mime_type on cr_revisions(mime_type);
create index cr_revisions_title_idx on cr_revisions(title);
......@@ -827,7 +830,7 @@ create table cr_folder_type_map (
folder_id integer
constraint cr_folder_type_map_fldr_fk
references cr_folders on delete cascade,
content_type varchar(100)
content_type varchar(1000)
constraint cr_folder_type_map_typ_fk
references acs_object_types on delete cascade,
constraint cr_folder_type_map_pk
......@@ -876,7 +879,7 @@ insert into cr_template_use_contexts values ('admin');
insert into cr_template_use_contexts values ('public');
create table cr_type_template_map (
content_type varchar(100)
content_type varchar(1000)
constraint cr_type_template_map_typ_fk
references acs_object_types
constraint cr_type_template_map_typ_nn
......@@ -950,8 +953,8 @@ create table cr_symlinks (
constraint cr_symlinks_symlink_id_pk
primary key,
target_id integer
constraint cr_symlinks_target_id_fk
references cr_items
CONSTRAINT cr_symlinks_target_id_fk
REFERENCES cr_items(item_id) ON DELETE CASCADE
constraint cr_symlinks_target_id_nn
not null,
label varchar(1000)
......@@ -1375,16 +1378,19 @@ BEGIN
v_revision_id := content_revision__new(
'Template',
NULL,
now(),
'text/html',
null,
null, -- description
now(), -- publish_date
'text/html', -- mime_type
null, -- nls_language
'<html><body>@text;noquote@</body></html>',
v_item_id,
NULL,
now(),
null,
null);
null, -- revision_id
now(), -- creation_date
null, -- creation_user
null, -- creation_ip
null, -- content_length
null -- package_id
);
update
cr_revisions
......
......@@ -74,10 +74,14 @@ BEGIN
null,
null,
'text/plain',
null,
null,
null,
null, -- data
null, -- relation_tag
'f', -- is_live
'text',
v_package_id
v_package_id,
't' -- with_child_rels
);
insert into cr_extlinks
......
......@@ -210,9 +210,6 @@ $$ LANGUAGE plpgsql;
-- new
select define_function_args('content_folder__new','name,label,description;null,parent_id;null,context_id;null,folder_id;null,creation_date;now,creation_user;null,creation_ip;null,security_inherit_p;t,package_id;null');
--
-- procedure content_folder__new/11
--
......@@ -624,55 +621,22 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
-- procedure copy
-- added
--
-- procedure content_folder__copy/4
--
CREATE OR REPLACE FUNCTION content_folder__copy(
copy__folder_id integer,
copy__target_folder_id integer,
copy__creation_user integer,
copy__creation_ip varchar -- default null
) RETURNS integer AS $$
DECLARE
v_valid_folders_p integer;
v_current_folder_id cr_folders.folder_id%TYPE;
v_name cr_items.name%TYPE;
v_label cr_folders.label%TYPE;
v_description cr_folders.description%TYPE;
v_new_folder_id cr_folders.folder_id%TYPE;
v_folder_contents_val record;
BEGIN
v_new_folder_id := content_folder__copy (
copy__folder_id,
copy__target_folder_id,
copy__creation_user,
copy__creation_ip,
NULL
);
return v_new_folder_id;
END;
$$ LANGUAGE plpgsql;
-- procedure copy
-- added
select define_function_args('content_folder__copy','folder_id,target_folder_id,creation_user,creation_ip;null,name;null');
select define_function_args('content_folder__copy','folder_id,target_folder_id,creation_user,creation_ip;null,name;null,label;null');
--
-- procedure content_folder__copy/5
-- procedure content_folder__copy/6
--
CREATE OR REPLACE FUNCTION content_folder__copy(
copy__folder_id integer,
copy__target_folder_id integer,
copy__creation_user integer,
copy__creation_ip varchar, -- default null
copy__name varchar -- default null
copy__creation_ip varchar default null,
copy__name cr_items.name%TYPE default null,
copy__label cr_folders.label%TYPE default null
) RETURNS integer AS $$
DECLARE
......@@ -738,7 +702,7 @@ BEGIN
-- create the new folder
v_new_folder_id := content_folder__new(
coalesce (copy__name, v_name),
v_label,
coalesce (copy__label, v_label),
v_description,
copy__target_folder_id,
copy__target_folder_id,
......@@ -904,7 +868,7 @@ CREATE OR REPLACE FUNCTION content_folder__register_content_type(
) RETURNS integer AS $$
DECLARE
v_is_registered varchar;
v_is_registered boolean;
BEGIN
if register_content_type__include_subtypes = 'f' then
......
......@@ -111,7 +111,6 @@ end;
select define_function_args('image__new','name,parent_id;null,item_id;null,revision_id;null,mime_type;jpeg,creation_user;null,creation_ip;null,relation_tag;null,title;null,description;null,is_live;f,publish_date;now(),path,file_size,height,width,package_id;null');
--
......@@ -134,7 +133,7 @@ CREATE OR REPLACE FUNCTION image__new(
new__file_size integer,
new__height integer,
new__width integer,
new__package_id integer -- default null
new__package_id integer default null
) RETURNS integer AS $$
DECLARE
......@@ -189,12 +188,13 @@ DECLARE
new__publish_date,
new__mime_type,
new__nls_language,
null,
new__path,
v_item_id,
new__revision_id,
new__creation_date,
new__creation_user,
new__creation_ip,
new__file_size,
v_package_id
);
......@@ -203,12 +203,6 @@ DECLARE
values
(v_revision_id, new__height, new__width);
-- update revision with image file info
update cr_revisions
set content_length = new__file_size,
content = new__path
where revision_id = v_revision_id;
-- is_live => 't' not used as part of content_item.new
-- because content_item.new does not let developer specify revision_id,
-- revision_id is determined in advance
......@@ -222,59 +216,14 @@ END;
$$ LANGUAGE plpgsql;
--
-- procedure image__new/16
--
CREATE OR REPLACE FUNCTION image__new(
new__name varchar,
new__parent_id integer, -- default null
new__item_id integer, -- default null
new__revision_id integer, -- default null
new__mime_type varchar, -- default jpeg
new__creation_user integer, -- default null
new__creation_ip varchar, -- default null
new__relation_tag varchar, -- default null
new__title varchar, -- default null
new__description varchar, -- default null
new__is_live boolean, -- default f
new__publish_date timestamptz, -- default now()
new__path varchar,
new__file_size integer,
new__height integer,
new__width integer
) RETURNS integer AS $$
DECLARE
BEGIN
return image__new(new__name,
new__parent_id,
new__item_id,
new__revision_id,
new__mime_type,
new__creation_user,
new__creation_ip,
new__relation_tag,
new__title,
new__description,
new__is_live,
new__publish_date,
new__path,
new__file_size,
new__height,
new__width,
null
);
END;
$$ LANGUAGE plpgsql;
-- DRB's version
--
-- procedure image__new/16
--
-- compared to image_new/17:
-- * has no relation_tag, is_live, path, file_size
-- * but has storage_type, content_type, nls_language
--
CREATE OR REPLACE FUNCTION image__new(
p_name varchar,
p_parent_id integer, -- default null
......@@ -285,17 +234,16 @@ CREATE OR REPLACE FUNCTION image__new(
p_creation_ip varchar, -- default null
p_title varchar, -- default null
p_description varchar, -- default null
p_storage_type varchar,
p_storage_type cr_items.storage_type%TYPE,
p_content_type varchar,
p_nls_language varchar,
p_publish_date timestamptz,
p_height integer,
p_width integer,
p_package_id integer -- default null
p_package_id integer default null
) RETURNS integer AS $$
DECLARE
v_item_id cr_items.item_id%TYPE;
v_revision_id cr_revisions.revision_id%TYPE;
v_package_id acs_objects.package_id%TYPE;
......@@ -339,12 +287,13 @@ DECLARE
p_publish_date,
p_mime_type,
p_nls_language,
null,
null, -- text
v_item_id,
p_revision_id,
current_timestamp,
p_creation_user,
p_creation_ip,
null, -- content_length
v_package_id
);
......@@ -359,53 +308,6 @@ $$ LANGUAGE plpgsql;
--
-- procedure image__new/15
--
CREATE OR REPLACE FUNCTION image__new(
p_name varchar,
p_parent_id integer, -- default null
p_item_id integer, -- default null
p_revision_id integer, -- default null
p_mime_type varchar, -- default jpeg
p_creation_user integer, -- default null
p_creation_ip varchar, -- default null
p_title varchar, -- default null
p_description varchar, -- default null
p_storage_type varchar,
p_content_type varchar,
p_nls_language varchar,
p_publish_date timestamptz,
p_height integer,
p_width integer
) RETURNS integer AS $$
DECLARE
BEGIN
return image__new(p_name,
p_parent_id,
p_item_id,
p_revision_id,
p_mime_type,
p_creation_user,
p_creation_ip,
p_title,
p_description,
p_storage_type,
p_content_type,
p_nls_language,
p_publish_date,
p_height,
p_width,
null
);
END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('image__new_revision','item_id,revision_id,title,description,publish_date,mime_type,nls_language,creation_user,creation_ip,height,width,package_id');
--
......@@ -423,7 +325,7 @@ CREATE OR REPLACE FUNCTION image__new_revision(
p_creation_ip varchar,
p_height integer,
p_width integer,
p_package_id integer
p_package_id integer default null
) RETURNS integer AS $$
DECLARE
v_revision_id integer;
......@@ -443,12 +345,13 @@ BEGIN
p_publish_date,
p_mime_type,
p_nls_language,
null,
null, -- content_length
p_item_id,
p_revision_id,
current_timestamp,
p_creation_user,
p_creation_ip,
null, -- content_length
v_package_id
);
......@@ -463,46 +366,7 @@ $$ LANGUAGE plpgsql;
--
-- procedure image__new_revision/11
--
CREATE OR REPLACE FUNCTION image__new_revision(
p_item_id integer,
p_revision_id integer,
p_title varchar,
p_description varchar,
p_publish_date timestamptz,
p_mime_type varchar,
p_nls_language varchar,
p_creation_user integer,
p_creation_ip varchar,
p_height integer,
p_width integer
) RETURNS integer AS $$
DECLARE
v_revision_id integer;
BEGIN
return image__new_revision(p_item_id,
p_revision_id,
p_title,
p_description,
p_publish_date,
p_mime_type,
p_nls_language,
p_creation_user,
p_creation_ip,
p_height,
p_width,
p_revision_id,
null
);
END;
$$ LANGUAGE plpgsql;
select define_function_args('image__delete','v_item_id');
--
......
This diff is collapsed.
This diff is collapsed.
......@@ -81,7 +81,9 @@ select acs_sc_binding__new('FtsContentProvider','content_template');
-- DaveB: We only want to index live_revisions 2002-09-26
--
-- procedure content_search__itrg/0
--
CREATE OR REPLACE FUNCTION content_search__itrg () RETURNS trigger AS $$
BEGIN
......@@ -92,14 +94,6 @@ if (select live_revision from cr_items where item_id=new.item_id) = new.revision
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION content_search__dtrg () RETURNS trigger AS $$
BEGIN
perform search_observer__enqueue(old.revision_id,'DELETE');
return old;
END;
$$ LANGUAGE plpgsql;
--
-- procedure content_search__utrg/0
......@@ -131,11 +125,13 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION content_item_search__utrg () RETURNS trigger AS $$
BEGIN
if new.live_revision is not null and coalesce(old.live_revision,0) <> new.live_revision and (select publish_date from cr_revisions where revision_id=new.live_revision) <= current_timestamp then
if new.live_revision is not null and coalesce(old.live_revision,0) <> new.live_revision
and (select publish_date from cr_revisions where revision_id=new.live_revision) <= current_timestamp then
perform search_observer__enqueue(new.live_revision,'INSERT');
end if;
if old.live_revision is not null and old.live_revision <> coalesce(new.live_revision,0) then
if old.live_revision is not null and old.live_revision <> coalesce(new.live_revision,0)
and (select publish_date from cr_revisions where revision_id=old.live_revision) <= current_timestamp then
perform search_observer__enqueue(old.live_revision,'DELETE');
end if;
if old.live_revision is not null and new.publish_status = 'expired' then
......@@ -149,9 +145,6 @@ $$ LANGUAGE plpgsql;
create trigger content_search__itrg after insert on cr_revisions
for each row execute procedure content_search__itrg ();
create trigger content_search__dtrg after delete on cr_revisions
for each row execute procedure content_search__dtrg ();
create trigger content_search__utrg after update on cr_revisions
for each row execute procedure content_search__utrg ();
......
......@@ -106,13 +106,18 @@ BEGIN
new__creation_ip,
'content_item',
'content_template',
null,
null,
null, -- title
null, -- description
'text/plain',
null,
null,
'text'
);
null, -- nls_language
null, -- text
null, -- data
null, -- relation_tag
'f', -- is_live
'text', -- storage_type
null, -- package_id
't' -- with_child_rels
);
insert into cr_templates (
template_id
......
......@@ -387,9 +387,9 @@ BEGIN
sub_sub_folder_id
)
);
PERFORM content_test__put_line('This is a path to an item from a non-existant item');
PERFORM content_test__put_line('This is a path to an item from a non-existent item');
PERFORM content_test__put_line('Path for ' || item_id ||
' from nonexistant_id: ' ||
' from nonexistent_id: ' ||
-300 || ' is ' ||
content_item__get_path(item_id,-300)
);
......
......@@ -454,7 +454,7 @@ BEGIN
drop_attribute__attribute_name);
-- FIXME: postgresql does not support drop column.
-- Drop the column if neccessary
-- Drop the column if necessary
if drop_attribute__drop_column then
execute 'alter table ' || v_table || ' drop column ' ||
drop_attribute__attribute_name || ' cascade';
......@@ -698,8 +698,8 @@ $$ LANGUAGE plpgsql stable;
-- into the input view when a new content revision is added. Pg locks the
-- underlying table when the rule is dropped, so the dropping and recreating
-- of the new content revisons seems like it would be reliable, but the
-- possiblity of a race condition exists for either the initial creation
-- of dropping of a type. I'm not sure if the possiblity of a race condition
-- possibility of a race condition exists for either the initial creation
-- of dropping of a type. I'm not sure if the possibility of a race condition
-- acually exists in practice. The thing to do here might be to just create
-- a function that dynamically builds the insert strings and does the
-- each time an insert is done on the content_type view. Trade-off being
......@@ -750,7 +750,7 @@ BEGIN
select content_revision__new(
p_new.title,
p_new.description,
now(),
p_new.publish_date,
p_new.mime_type,
p_new.nls_language,
case when p_new.text is null
......@@ -762,6 +762,7 @@ BEGIN
now(),
p_new.creation_user,
p_new.creation_ip,
null, -- content_length
p_new.object_package_id
) into v_revision_id;
';
......@@ -777,13 +778,13 @@ BEGIN
and ot1.table_name is not null
order by level asc
LOOP
function_text := function_text || ' ' || content_type__trigger_insert_statement(type_rec.object_type) || ';
function_text := function_text || content_type__trigger_insert_statement(type_rec.object_type) || ';
';
end loop;
function_text := function_text || '
return;
end;'' language ''plpgsql'';
end;'' language plpgsql;
';
-- end building the rule definition code
......
......@@ -23,7 +23,7 @@ create table tmp_cr_extension_mime_type_map as select * from cr_extension_mime_t
-- data from sql/common/mime-type-data.sql
insert into tmp_cr_mime_types (label,mime_type,file_extension) values ( 'Unkown' , '*/*' , '' );
insert into tmp_cr_mime_types (label,mime_type,file_extension) values ( 'Unknown' , '*/*' , '' );
insert into tmp_cr_mime_types (label,mime_type,file_extension) values ( 'AutoCAD drawing files' , 'application/acad' , 'dwg' );
insert into tmp_cr_mime_types (label,mime_type,file_extension) values ( 'Andrew data stream' , 'application/andrew-inset' , 'ez' );
insert into tmp_cr_mime_types (label,mime_type,file_extension) values ( 'ClarisCAD files' , 'application/clariscad' , 'ccad' );
......
......@@ -751,7 +751,7 @@ begin
drop_attribute__attribute_name);
-- FIXME: postgresql does not support drop column.
-- Drop the column if neccessary
-- Drop the column if necessary
if drop_attribute__drop_column then
execute ''alter table '' || v_table || '' drop column '' ||
drop_attribute__attribute_name || ''cascade'';
......
......@@ -40,7 +40,7 @@ begin
PERFORM acs_attribute__drop_attribute(drop_attribute__content_type,
drop_attribute__attribute_name);
-- Drop the column if neccessary
-- Drop the column if necessary
if drop_attribute__drop_column then
execute ''alter table '' || v_table || '' drop column '' ||
drop_attribute__attribute_name || '' cascade'';
......
------------------------------------------------------------
-- Upgrade to enhance the perfomance of the acs-content-repository when adding / editing an
-- Upgrade to enhance the performance of the acs-content-repository when adding / editing an
-- cr_item, special fix for postgres to avoid using max() which is quite slow.
-- Now update tree_sortkey in the process fix dups and add max_child_sortkey
--
......
......@@ -7,7 +7,7 @@
-- @cvs-id $Id$
--
-- this script was orignally created by daveb -- upgrade-5.2.0d15-5.2.0a1.sql
-- this script was originally created by daveb -- upgrade-5.2.0d15-5.2.0a1.sql
-- patch#548 bug#1937
......
......@@ -417,7 +417,7 @@ select define_function_args('content_permission__inherit_permissions','parent_ob
select define_function_args('content_permission__has_grant_authority','object_id,holder_id,privilege');
select define_function_args('content_permission__has_revoke_authority','object_id,holder_id,privilege,revokee_id');
select define_function_args('content_permission__grant_permission_h','object_id,grantee_id,privilege');
select define_function_args('content_permission__grant_permission','object_id,holder_id,privilege,recepient_id,is_recursive;f,object_type;content_item');
select define_function_args('content_permission__grant_permission','object_id,holder_id,privilege,recipient_id,is_recursive;f,object_type;content_item');
select define_function_args('content_permission__revoke_permission_h','object_id,revokee_id,privilege');
select define_function_args('content_permission__revoke_permission','object_id,holder_id,privilege,revokee_id,is_recursive;f,object_type;content_item');
select define_function_args('content_permission__permission_p','object_id,holder_id,privilege');
......
......@@ -10,42 +10,42 @@
-- functions although the create script do not define this triggers.
-- It seems that an update script was missing.
--
DROP TRIGGER if exists cr_folder_del_ri_trg ON cr_items;
DROP FUNCTION if exists cr_folder_del_ri_trg();
DROP TRIGGER IF EXISTS cr_folder_del_ri_trg ON cr_items;
DROP FUNCTION IF EXISTS cr_folder_del_ri_trg();
DROP TRIGGER if exists cr_folder_ins_up_ri_trg ON cr_folders;
DROP FUNCTION if exists cr_folder_ins_up_ri_trg();
DROP TRIGGER IF EXISTS cr_folder_ins_up_ri_trg ON cr_folders;
DROP FUNCTION IF EXISTS cr_folder_ins_up_ri_trg();
--
-- Handle latest_revision and live_revision via foreign keys
--
-- fraber 161128: Delete inconsistent entries
update cr_items set latest_revision = null
-- fraber 161128: Delete inconsistent entries
update cr_items set latest_revision = null
where latest_revision in (select latest_revision from cr_items except select revision_id from cr_revisions);
ALTER TABLE cr_items DROP CONSTRAINT if exists 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);
-- fraber 161128: Delete inconsistent entries
update cr_items set live_revision = null
-- fraber 161128: Delete inconsistent entries
update cr_items set live_revision = null
where live_revision in (select live_revision from cr_items except select revision_id from cr_revisions);
ALTER TABLE cr_items DROP CONSTRAINT if exists 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);
DROP TRIGGER if exists cr_revision_del_ri_tr on cr_items;
DROP FUNCTION if exists cr_revision_del_ri_tr();
DROP TRIGGER if exists cr_revision_ins_ri_tr on cr_items;
DROP FUNCTION if exists cr_revision_ins_ri_tr();
DROP TRIGGER IF EXISTS cr_revision_del_ri_tr on cr_items;
DROP FUNCTION IF EXISTS cr_revision_del_ri_tr();
DROP TRIGGER if exists cr_revision_up_ri_tr on cr_items;
DROP FUNCTION if exists cr_revision_up_ri_tr();
DROP TRIGGER IF EXISTS cr_revision_ins_ri_tr on cr_items;
DROP FUNCTION IF EXISTS cr_revision_ins_ri_tr();
DROP TRIGGER if exists cr_revision_del_rev_ri_tr on cr_revisions;
DROP FUNCTION if exists cr_revision_del_rev_ri_tr();
DROP TRIGGER IF EXISTS cr_revision_up_ri_tr on cr_items;
DROP FUNCTION IF EXISTS cr_revision_up_ri_tr();
DROP TRIGGER IF EXISTS cr_revision_del_rev_ri_tr on cr_revisions;
DROP FUNCTION IF EXISTS cr_revision_del_rev_ri_tr();
......@@ -26,38 +26,38 @@
-- constraints from acs-content-repository/sql/postgresql/content-revision.sql
ALTER TABLE cr_item_publish_audit DROP CONSTRAINT if exists 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 if exists 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 if exists 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 if exists 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 if exists 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 if exists 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 if exists 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 if exists 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;
......@@ -149,7 +149,7 @@ BEGIN
--
-- The following loop could be dropped / replaced by a cascade
-- operation, when proper foreign keys are used along the
-- inheritence path.
-- inheritance path.
--
for v_revision_val in select revision_id
from cr_revisions
......
......@@ -7,8 +7,8 @@ template::filter add content::init
# Walter McGinnis (wtem@olywa.net), 2001-09-23
# based on original photo-album package code by Tom Baginski
# Daveb: unless someone has a good reason this should go away for openacs 5.1
# we should promote a tcl api to the cr instead of each package accessing
# Daveb: unless someone has a good reason this should go away for OpenACS 5.1
# we should promote a Tcl api to the cr instead of each package accessing
# the pl/sql procs directly.
ad_schedule_proc -thread t -schedule_proc ns_schedule_daily [list 22 0] cr_delete_scheduled_files
......@@ -21,7 +21,7 @@ ad_proc -public acs_cr_scheduled_release_exec {} {
} {
db_exec_plsql schedule_releases {begin cr_scheduled_release_exec; end;}
db_exec_plsql schedule_releases {}
}
ad_schedule_proc [expr {15 * 60}] acs_cr_scheduled_release_exec
......
......@@ -13,10 +13,4 @@ select distinct crftd.path, crftd.storage_area_key
</querytext>
</fullquery>
<fullquery name="cr_check_orphaned_files.fetch_path">
<querytext>
SELECT count(*) FROM cr_revisions WHERE content = :name
</querytext>
</fullquery>
</queryset>
......@@ -26,18 +26,18 @@ ad_proc -private cr_delete_scheduled_files {} {
} {
db_transaction {
# subselect makes sure there isn't a parent revision still lying around
db_foreach fetch_paths { *SQL* } {
db_foreach fetch_paths {} {
set file [cr_fs_path $storage_area_key]/$path
if {[regexp {^[0-9/]+$} $path]} {
# the filename looks valid, delete the file from filesystem
ns_log Debug "cr_delete_scheduled_files: deleting $file"
file delete $file
file delete -- $file
} else {
ns_log Warning "cr_delete_scheduled_files: refuse to delete $file"
}
}
# now that all scheduled files deleted, clear table
db_dml delete_files { *SQL* }
db_dml delete_files {}
}
#
......@@ -117,7 +117,7 @@ ad_proc cr_check_orphaned_files {-delete:boolean {-mtime ""}} {
lappend result $f
if {$delete_p} {
file delete $f
file delete -- $f
}
}
......
......@@ -335,7 +335,9 @@ ad_proc content::folder::get_folder_from_package_not_cached {
Returns the folder_id of the package instance
} {
return [db_string get_folder_id "select folder_id from cr_folders where package_id=:package_id"]
return [db_string get_folder_id {
select folder_id from cr_folders where package_id = :package_id
}]
}
# Local variables:
......
nsv_set mutex cr_file_creation [ns_mutex create oacs:cr_file_creation]
exec touch [cr_fs_path]/file-creation.log
#
# Make sure that the file-creation.log exists, without using "exec
# touch", which is not available under windows (see issue #3311).
#
set creation_log_file [cr_fs_path]/file-creation.log
if {![file exists $creation_log_file]} {
set F [open $creation_log_file w]; close $F
}
# Local variables:
# mode: tcl
......
......@@ -75,7 +75,6 @@ ad_proc -public ::content::item::new {
if {$creation_user eq ""} {
set creation_user [ad_conn user_id]
}
if {$creation_ip eq ""} {
set creation_ip [ad_conn peeraddr]
}
......@@ -83,6 +82,11 @@ ad_proc -public ::content::item::new {
set package_id [ad_conn package_id]
}
set mime_type [cr_check_mime_type \
-filename $name \
-mime_type $mime_type \
-file $tmp_filename]
set var_list [list]
lappend var_list \
[list name $name] \
......@@ -102,52 +106,52 @@ ad_proc -public ::content::item::new {
[list is_live $is_live ] \
[list storage_type $storage_type]
# we don't pass title, text, or data to content_item__new
# because the magic revision creation of the pl/sql proc does
# not create a proper subtype of content revision, also it
# can't set attributes of an extended type
# we don't pass title, text, or data to content_item__new because
# the magic revision creation of the pl/sql proc does not create a
# proper subtype of content revision, also it can't set attributes
# of an extended type
# the content type is not the object type of the cr_item so we pass in
# the cr_item subtype here and content_type as part of
# the content type is not the object type of the cr_item so we
# pass in the cr_item subtype here and content_type as part of
# var_list
db_transaction {
# An explict lock was necessary for PostgreSQL between 8.0 and
# 8.2; left the following statement here for documentary purposes
# 8.2; left the following statement here for documentary
# purposes
#
# db_dml lock_objects "LOCK TABLE acs_objects IN SHARE ROW EXCLUSIVE MODE"
set item_id [package_exec_plsql \
-var_list $var_list \
content_item new]
# if we have attributes we pass in everything
# and create a revision with all subtype attributes that were
# passed in
# since we can't rely on content_item__new to create a revision
# we have to pass is_live to content::revision::new and
# set the live revision there
if {([info exists title] && $title ne "")
set item_id [package_exec_plsql \
-var_list $var_list \
content_item new]
# if we have attributes we pass in everything and create a
# revision with all subtype attributes that were passed in
# since we can't rely on content_item__new to create a
# revision we have to pass is_live to content::revision::new
# and set the live revision there
if {([info exists title] && $title ne "")
|| ([info exists text] && $text ne "")
|| ([info exists data] && $data ne "")
|| ([info exists tmp_filename] && $tmp_filename ne "")
|| [llength $attributes]
} {
content::revision::new \
-item_id $item_id \
-title $title \
-description $description \
-content $text \
-mime_type $mime_type \
-content_type $content_type \
-is_live $is_live \
-package_id $package_id \
-creation_user $creation_user \
-creation_ip $creation_ip \
-creation_date $creation_date \
-nls_language $nls_language \
-tmp_filename $tmp_filename \
-attributes $attributes
}
|| ([info exists data] && $data ne "")
|| ([info exists tmp_filename] && $tmp_filename ne "")
|| [llength $attributes]
} {
content::revision::new \
-item_id $item_id \
-title $title \
-description $description \
-content $text \
-mime_type $mime_type \
-content_type $content_type \
-is_live $is_live \
-package_id $package_id \
-creation_user $creation_user \
-creation_ip $creation_ip \
-creation_date $creation_date \
-nls_language $nls_language \
-tmp_filename $tmp_filename \
-attributes $attributes
}
}
return $item_id
}
......@@ -220,11 +224,11 @@ ad_proc -public ::content::item::get {
@creation-date 2004-05-28
@param item_id
@param revision live, latest, or best (live if it exists, otherwise latest)
@param revision live, latest
@param array_name name of array to upvar content into
@return upvars array_name containing all attributes of the content
type except content
@return returns 0 if item does not exists or 1 if query was sucessful
@return returns 0 if item does not exists or 1 if query was successful
@error
} {
......@@ -234,18 +238,22 @@ ad_proc -public ::content::item::get {
}
set content_type [content_type -item_id $item_id]
if {$content_type eq ""} {
# content_type query was unsucessful, item does not exist
# content_type query was unsuccessful, item does not exist
return 0
}
if {"content_folder" eq $content_type} {
return [db_0or1row get_item_folder "" -column_array local_array]
}
set table_name [db_string get_table_name "select table_name from acs_object_types where object_type=:content_type"]
set table_name [db_string get_table_name {
select table_name from acs_object_types where object_type = :content_type
}]
while {$table_name eq ""} {
acs_object_type::get -object_type $content_type -array typeInfo
ns_log notice "no table for $content_type registered, trying '$typeInfo(supertype)' instead"
set content_type $typeInfo(supertype)
set table_name [db_string get_table_name "select table_name from acs_object_types where object_type=:content_type"]
set table_name [db_string get_table_name {
select table_name from acs_object_types where object_type = :content_type
}]
}
set table_name "${table_name}x"
# get attributes of the content_item use the content_typex view
......@@ -845,8 +853,10 @@ ad_proc -public content::item::upload_file {
}
set existing_filenames [db_list get_parent_existing_filenames {}]
set filename [util_text_to_url \
-text ${title} -existing_urls "$existing_filenames" -replacement "_"]
set filename [ad_sanitize_filename \
-existing_names $existing_filenames \
-collapse_spaces \
-replace_with "_" $title]
set revision_id [cr_import_content \
-storage_type "file" -title $title \
......@@ -899,8 +909,9 @@ ad_proc -public ::content::item::get_publish_status {
} {
set publish_status [db_string gps_get_publish_status \
"select publish_status from cr_items where item_id = :item_id"]
set publish_status [db_string gps_get_publish_status {
select publish_status from cr_items where item_id = :item_id
}]
return $publish_status
}
......
......@@ -30,7 +30,7 @@
from cr_items
where parent_id = :parent_id
</querytext>
</fullquery>
</fullquery>
<fullquery name="content::item::get.get_item_folder">
<querytext>
......@@ -50,14 +50,6 @@
</querytext>
</fullquery>
<fullquery name="content::item::upload_file.get_parent_existing_filenames">
<querytext>
select name
from cr_items
where parent_id = :parent_id
</querytext>
</fullquery>
<fullquery name="content::item::get_id_by_name.get_item_id_by_name">
<querytext>
select item_id
......
......@@ -27,14 +27,14 @@ ad_proc -public content::permission::grant_permission {
-object_id:required
-holder_id:required
-privilege:required
-recepient_id:required
-recipient_id:required
{-is_recursive ""}
{-object_type ""}
} {
@param object_id
@param holder_id
@param privilege
@param recepient_id
@param recipient_id
@param is_recursive
@param object_type
} {
......@@ -42,7 +42,7 @@ ad_proc -public content::permission::grant_permission {
[list object_id $object_id ] \
[list holder_id $holder_id ] \
[list privilege $privilege ] \
[list recepient_id $recepient_id ] \
[list recipient_id $recipient_id ] \
[list is_recursive $is_recursive ] \
[list object_type $object_type ] \
] content_permission grant_permission]
......
......@@ -110,7 +110,7 @@ ad_proc -public cr_create_content_file_from_string {item_id revision_id str} {
ad_proc -public cr_file_size {relative_file_path} {
Returns the size of a file stored in the content repository. Takes the
relative file path of the content repository file as an arguement.
relative file path of the content repository file as an argument.
} {
return [file size [cr_fs_path]$relative_file_path]
......@@ -163,7 +163,7 @@ ad_proc -public cr_count_file_entries {name} {
0 or 1 in consistent databases.
} {
db_string count_entries { *SQL* }
db_string count_entries {}
}
ad_proc -private cr_delete_orphans {files} {
......@@ -188,7 +188,7 @@ ad_proc -private cr_delete_orphans {files} {
# the content entry does not exist anymore, therefore the
# file is an orphan and should be removed
ns_log notice "delete orphaned file $dir$name"
file delete $dir$name
file delete -- $dir$name
}
}
}
......
......@@ -22,15 +22,6 @@
</querytext>
</fullquery>
<fullquery name="content::revision::new.update_lob_attribute">
<querytext>
update $lob_table
set $lob_attribute = empty_clob()
where $lob_id_column = :revision_id
returning $lob_attribute into :1
</querytext>
</fullquery>
<fullquery name="content::revision::item_id.item_id">
<querytext>
select item_id
......
......@@ -34,7 +34,7 @@
update cr_revisions
set mime_type = :mime_type,
lob = [set __lob_id [db_string get_lob_id "select empty_lob()"]]
lob = [set __lob_id [db_string get_lob_id {select empty_lob()}]]
where revision_id = :revision_id
</querytext>
......
......@@ -131,8 +131,15 @@ ad_proc -public ::content::revision::new {
}
}
set table_name [db_string get_table_name "select table_name from acs_object_types where object_type=:content_type"]
set table_name [db_string get_table_name {
select table_name from acs_object_types where object_type = :content_type
}]
set mime_type [cr_check_mime_type \
-filename $title \
-mime_type $mime_type \
-file $tmp_filename]
set query_text "insert into ${table_name}i
(revision_id, object_type, creation_user, creation_date, creation_ip, title, description, item_id, object_package_id, mime_type $attribute_names)
values (:revision_id, :content_type, :creation_user, :creation_date, :creation_ip, :title, :description, :item_id, :package_id, :mime_type $attribute_values)"
......@@ -172,7 +179,7 @@ ad_proc -public ::content::revision::update_content {
} {
Update content column seperately. Oracle does not allow insert
Update content column separately. Oracle does not allow insert
into a BLOB.
This assumes that if storage type is lob and no file is specified
......
......@@ -11,7 +11,13 @@
<fullquery name="content::revision::new.get_storage_type">
<querytext>
select storage_type from cr_items where item_id=:item_id
select storage_type from cr_items where item_id=:item_id
</querytext>
</fullquery>
<fullquery name="content::revision::new.mime_type_registered_p">
<querytext>
select exists(select 1 from cr_mime_types where mime_type = :mime_type)
</querytext>
</fullquery>
</queryset>
......@@ -37,7 +37,7 @@ namespace eval doc {
ad_proc -public get_proc_header { proc_name package_name doc_ref code_ref { db "" } } {
Retreive the function header for a specific function
Retrieve the function header for a specific function
and parse out the javadoc comment.
} {
......
......@@ -46,21 +46,7 @@
select
content_item__get_live_revision(content_item__get_template(:item_id, :context)) as template_id,
content_template__get_path(content_item__get_template(:item_id, :context),:template_root) as template_url
from
dual
</querytext>
</fullquery>
<fullquery name="content::init_all.get_template_url">
<querytext>
select
content_template__get_path(
content_item__get_template(:item_id, :context),:template_root) as template_url
from
dual
from dual
</querytext>
</fullquery>
......
......@@ -164,11 +164,7 @@ ad_proc -public content::get_content_value { revision_id } {
@return content element corresponding to the provided revision_id
} {
db_transaction {
db_exec_plsql gcv_get_revision_id {
begin
content_revision.to_temporary_clob(:revision_id);
end;
}
db_exec_plsql gcv_get_revision_id {}
# Query for values from a previous revision
set content [db_string gcv_get_previous_content ""]
......
......@@ -61,20 +61,4 @@
</querytext>
</fullquery>
<fullquery name="content::init.get_live_revision">
<querytext>
select live_revision from cr_items where item_id = :item_id
</querytext>
</fullquery>
<fullquery name="content::init_all.get_live_revision">
<querytext>
select live_revision from cr_items where item_id = :item_id
</querytext>
</fullquery>
</queryset>
......@@ -358,7 +358,7 @@ ad_proc -public image::resize {
if {[catch {exec [image::convert_binary] -resize $sizes($size_name) $original_filename $tmp_filename} errmsg]} {
# maybe imagemagick isn't installed?
file delete $tmp_filename
file delete -- $tmp_filename
return ""
}
if {[set resize_item_id \
......@@ -378,7 +378,7 @@ ad_proc -public image::resize {
-item_id $resize_item_id \
-tmp_filename $tmp_filename
}
file delete $tmp_filename
file delete -- $tmp_filename
return $resize_item_id
}
......@@ -423,7 +423,10 @@ ad_proc -private image::resize_existing_images {
} {
foreach {size_name dimensions} [image::get_convert_to_sizes] {
foreach item_id [db_list get_items "select item_id from cr_items where \content_type='image' and latest_revision is not null"] {
foreach item_id [db_list get_items {
select item_id from cr_items
where content_type='image' and latest_revision is not null
}] {
image::resize \
-item_id $item_id \
-size_name $size_name
......
......@@ -436,7 +436,7 @@ ad_proc -public -deprecated item::get_content_type { item_id } {
@public get_content_type
Retrieves the content type of tyhe item. If the item does not exist,
Retrieves the content type of the item. If the item does not exist,
returns an empty string.
@param item_id The item id
......
......@@ -37,14 +37,6 @@
</querytext>
</fullquery>
<fullquery name="cr::keyword::item_unassign.item_unassign">
<querytext>
begin
content_keyword.item_unassign(:item_id, :keyword_id);
end;
</querytext>
</fullquery>
<fullquery name="cr::keyword::item_assign.keyword_assign">
<querytext>
begin
......
......@@ -30,12 +30,6 @@
</querytext>
</fullquery>
<fullquery name="cr::keyword::item_unassign.item_unassign">
<querytext>
select content_keyword__item_unassign(:item_id, :keyword_id)
</querytext>
</fullquery>
<fullquery name="cr::keyword::item_assign.keyword_assign">
<querytext>
select content_keyword__item_assign(
......
......@@ -51,7 +51,7 @@ ad_proc -public -deprecated cr::keyword::set_heading {
Update a keyword heading
@see content::keyword::set_heading
} {
db_exec_plsql set_heading { }
db_exec_plsql set_heading {}
}
ad_proc -public -deprecated cr::keyword::get_keyword_id {
......
<?xml version="1.0"?>
<queryset>
<fullquery name="cr::keyword::get_keyword_id.select_keyword_id">
<querytext>
select keyword_id
from cr_keywords
where parent_id = :parent_id
and heading = :heading
</querytext>
</fullquery>
<fullquery name="cr::keyword::item_unassign_children.item_unassign_children">
<querytext>
delete from cr_item_keyword_map
where item_id = :item_id
and keyword_id in (select p.keyword_id
from cr_keywords p
where p.parent_id = :parent_id)
</querytext>
</fullquery>
<fullquery name="cr::keyword::item_assign.get_parent_id">
<querytext>
select parent_id
......@@ -28,33 +9,4 @@
</querytext>
</fullquery>
<fullquery name="cr::keyword::item_get_assigned.get_keywords">
<querytext>
select keyword_id from cr_item_keyword_map
where item_id = :item_id
</querytext>
</fullquery>
<fullquery name="cr::keyword::item_get_assigned.get_child_keywords">
<querytext>
select km.keyword_id
from cr_item_keyword_map km,
cr_keywords kw
where km.item_id = :item_id
and kw.parent_id = :parent_id
and kw.keyword_id = km.keyword_id
</querytext>
</fullquery>
<fullquery name="cr::keyword::get_options_flat.select_keyword_options">
<querytext>
select heading,
keyword_id
from cr_keywords
where [ad_decode $parent_id "" "parent_id is null" "parent_id = :parent_id"]
order by lower(heading)
</querytext>
</fullquery>
</queryset>
......@@ -36,16 +36,6 @@
</fullquery>
<fullquery name="publish::write_content.get_revision_id">
<querytext>
begin
content_revision.to_temporary_clob(:revision_id);
end;
</querytext>
</fullquery>
<fullquery name="publish::write_content.get_previous_content">
<querytext>
......
......@@ -38,14 +38,6 @@
</querytext>
</fullquery>
<fullquery name="publish::write_content.get_revision_id">
<querytext>
select 1
</querytext>
</fullquery>
<fullquery name="publish::write_content.get_previous_content">
<querytext>
......
......@@ -72,7 +72,7 @@ ad_proc -public publish::get_publish_roots {} {
}
ad_proc -public publish::mkdirs { path } {
Create all the directories neccessary to save the specified file
Create all the directories necessary to save the specified file
@param path The path to the file that is about to be saved
} {
......@@ -225,17 +225,17 @@ ad_proc -public publish::handle_binary_file {
@param revision_id_ref {<i>required</i>}
The name of the variable in the calling frame that will
recieve the revision_id whose content blob was written
receive the revision_id whose content blob was written
to the filesystem.
@param url_ref
The name of the variable in the calling frame that will
recieve the relative URL of the file in the file system
receive the relative URL of the file in the file system
which contains the content blob
@param error_ref
The name of the variable in the calling frame that will
recieve an error message. If no error has ocurred, this
receive an error message. If no error has occurred, this
variable will be set to the empty string ""
@option embed
......@@ -503,11 +503,7 @@ ad_proc -public publish::handle::text { item_id args } {
} else {
db_transaction {
db_exec_plsql get_revision_id {
begin
content_revision.to_temporary_clob(:revision_id);
end;
}
db_exec_plsql get_revision_id {}
# Query for values from a previous revision
set html [db_string get_previous_content ""]
......@@ -1069,7 +1065,7 @@ ad_proc -public publish::write_content { revision_id args } {
# crap out if the file already exists, but on the other hand, we shouldn't accidentally
# overwrite files
if { [file exists $root_path$file_url] } {
file delete $root_path$file_url
file delete -- $root_path$file_url
}
# Write blob/text to file
......
......@@ -21,7 +21,7 @@
<fullquery name="cr_write_content.write_lob_content">
<querytext>
select lob as content
select lob as content, 'lob' as storage_type
from cr_revisions
where revision_id = :revision_id
</querytext>
......@@ -105,8 +105,12 @@
/* mime_type => */ null,
/* nls_language => */ null,
/* text => */ null,
/* data => */ null,
/* relation_tag => */ null,
/* is live => */ 'f',
/* storage_type => */ :storage_type,
/* package_id => */ :package_id
/* package_id => */ :package_id,
/* w_child_rels => */ 't'
);
</querytext>
</fullquery>
......@@ -114,18 +118,19 @@
<fullquery name="cr_import_content.content_revision_new">
<querytext>
select content_revision__new (
/* title => */ :title,
/* description => */ :description,
/* publish_date => */ current_timestamp,
/* mime_type => */ :mime_type,
/* nls_language => */ null,
/* data => */ null,
/* item_id => */ :item_id,
/* revision_id => */ :revision_id,
/* creation_date => */ current_timestamp,
/* creation_user => */ :creation_user,
/* creation_ip => */ :creation_ip,
/* package_id => */ :package_id
/* title => */ :title,
/* description => */ :description,
/* publish_date => */ current_timestamp,
/* mime_type => */ :mime_type,
/* nls_language => */ null,
/* data => */ null,
/* item_id => */ :item_id,
/* revision_id => */ :revision_id,
/* creation_date => */ current_timestamp,
/* creation_user => */ :creation_user,
/* creation_ip => */ :creation_ip,
/* content_length => */ null,
/* package_id => */ :package_id
);
</querytext>
</fullquery>
......@@ -135,7 +140,7 @@
update cr_revisions
set mime_type = :mime_type,
lob = [set __lob_id [db_string get_lob_id "select empty_lob()"]]
lob = [set __lob_id [db_string get_lob_id {select empty_lob()}]]
where revision_id = :revision_id
</querytext>
......
......@@ -71,7 +71,7 @@ ad_proc -public cr_write_content {
set filename [db_string write_file_content ""]
if {$filename eq ""} {
error "No content for the revision $revision_id.\
This seems to be an error which occured during the upload of the file"
This seems to be an error which occurred during the upload of the file"
} elseif {![file readable $filename]} {
ns_log Error "Could not read file $filename. Maybe the content repository is (partially) missing?"
ns_return 404 text/plain {}
......@@ -110,11 +110,27 @@ ad_proc -public cr_write_content {
if { $string_p } {
return [db_blob_get write_lob_content ""]
}
# need to set content_length header here
ns_set put [ns_conn outputheaders] "Content-Length" $content_length
ReturnHeaders $mime_type
# also need to check for HEAD method and skip sending
# actual content
#
# Need to set content_length header here.
#
# Unfortunately, old versions of OpenACS did not set the
# content_length correctly, so we fix this here locally.
#
if {$content_length eq "0" && [db_driverkey ""] eq "postgresql"} {
set content_length [db_string get_lob_length {
select sum(byte_len)
from cr_revisions, lob_data
where revision_id = :revision_id and lob_id = cr_revisions.lob
}]
}
ns_set put [ns_conn outputheaders] "Content-Length" $content_length
ReturnHeaders $mime_type $content_length
#
# In a HEAD request, just send headers and no content
#
if {![string equal -nocase "head" [ns_conn method]]} {
db_write_blob write_lob_content ""
} else {
......@@ -233,26 +249,24 @@ ad_proc -public cr_import_content {
error "Image file must be stored in an image object"
}
set what_aolserver_told_us ""
set what_nsd_told_us ""
if {$mime_type eq "image/jpeg"} {
catch { set what_aolserver_told_us [ns_jpegsize $tmp_filename] }
catch { set what_nsd_told_us [ns_jpegsize $tmp_filename] }
} elseif {$mime_type eq "image/gif"} {
catch { set what_aolserver_told_us [ns_gifsize $tmp_filename] }
} elseif {$mime_type eq "image/png"} {
# we don't have built in png size detection
# but we want to allow upload of png images
catch { set what_nsd_told_us [ns_gifsize $tmp_filename] }
} elseif {$mime_type eq "image/png"} {
catch { set what_nsd_told_us [ns_pngsize $tmp_filename] }
} else {
error "Unknown image type"
}
# the AOLserver jpegsize command has some bugs where the height comes
# through as 1 or 2
if { $what_aolserver_told_us ne ""
&& [lindex $what_aolserver_told_us 0] > 10
&& [lindex $what_aolserver_told_us 1] > 10
# The AOLserver/ jpegsize command has some bugs where the height comes
# through as 1 or 2, so trust the valuesresult only on larger values.
if { $what_nsd_told_us ne ""
&& [lindex $what_nsd_told_us 0] > 10
&& [lindex $what_nsd_told_us 1] > 10
} {
set original_width [lindex $what_aolserver_told_us 0]
set original_height [lindex $what_aolserver_told_us 1]
lassign $what_nsd_told_us original_width original_height
} else {
set original_width ""
set original_height ""
......@@ -342,6 +356,53 @@ ad_proc cr_registered_type_for_mime_type {
return [db_string registered_type_for_mime_type "" -default ""]
}
ad_proc cr_check_mime_type {
-mime_type
{-filename ""}
{-file ""}
} {
Check whether the mimetype is registered. If not, check whether it
can be guessed from the filename. If guessed mimetype is not
registered optionally insert it.
@param mime_type param The mime type
@param filename the filename
@param file the actual file being saved. This option currently
doesn't have any effect, but in the future would be better
to inspect the actual file content instead of trusting the user.
@return the mapped mimetype
} {
#
# Check if the provided mime_type is already in our cr_mime_types
# table. If so, accept it.
#
if {$mime_type ne "*/*" && [db_0or1row check_given_mime_type {
select 1 from cr_mime_types where mime_type = :mime_type
}]} {
return $mime_type
}
# TODO: we use only the extension to get the mimetype. Something
# better should be done, like inspecting the actual content of the
# file and never trust the user on this regard, but as this
# involves changes also in the data model, we leave this for the
# future. Usages of this proc in the systems are already set to
# give us the path to the file here.
set extension [string tolower [string trimleft [file extension $filename] "."]]
if {[db_0or1row lookup_mimetype {}]} {
return $mime_type
}
set mime_type [string tolower [ns_guesstype $filename]]
if {[db_0or1row lookup_mimetype {}]} {
return $mime_type
}
set allow_mimetype_creation_p \
[parameter::get \
-parameter AllowMimeTypeCreationP -default 0]
return [cr_filename_to_mime_type -create=$allow_mimetype_creation_p \
$filename]
}
ad_proc -public cr_filename_to_mime_type {
-create:boolean
......@@ -365,10 +426,11 @@ ad_proc -public cr_filename_to_mime_type {
return "*/*"
}
if {[db_0or1row lookup_mimetype { select mime_type from cr_extension_mime_type_map where extension = :extension }]} {
if {[db_0or1row lookup_mimetype {}]} {
return $mime_type
} else {
set mime_type [string tolower [ns_guesstype $filename]]
ns_log Debug "guessed mime \"$mime_type\" create_p $create_p"
if {(!$create_p) || $mime_type eq "*/*" || $mime_type eq ""} {
# we don't have anything meaningful for this mimetype
......
<?xml version="1.0"?>
<queryset>
<fullquery name="cr_write_content.get_revision_info">
<querytext>
select i.storage_type, i.storage_area_key, r.mime_type, i.item_id,
r.content_length
from cr_items i, cr_revisions r
where r.revision_id = :revision_id and i.item_id = r.item_id
</querytext>
</fullquery>
<fullquery name="cr_write_content.get_revision_info">
<querytext>
select i.storage_type, i.storage_area_key, r.mime_type, i.item_id,
r.content_length
from cr_items i, cr_revisions r
where r.revision_id = :revision_id and i.item_id = r.item_id
</querytext>
</fullquery>
<fullquery name="cr_write_content.write_text_content">
<querytext>
select content
from cr_revisions
where revision_id = :revision_id
</querytext>
</fullquery>
<fullquery name="cr_write_content.write_text_content">
<querytext>
select content
from cr_revisions
where revision_id = :revision_id
</querytext>
</fullquery>
<fullquery name="cr_import_content.get_content_type">
<querytext>
select content_type
from cr_items
where item_id = :item_id
</querytext>
</fullquery>
<fullquery name="cr_import_content.mime_type_insert">
<querytext>
insert into cr_mime_types (mime_type)
select :mime_type
from dual
where not exists (select 1 from cr_mime_types where mime_type = :mime_type)
</querytext>
</fullquery>
<fullquery name="cr_import_content.get_content_type">
<querytext>
select content_type
from cr_items
where item_id = :item_id
</querytext>
</fullquery>
<fullquery name="cr_registered_type_for_mime_type.registered_type_for_mime_type">
<querytext>
select content_type
from cr_content_mime_type_map
where mime_type = :mime_type
</querytext>
</fullquery>
<fullquery name="cr_import_content.mime_type_insert">
<querytext>
insert into cr_mime_types (mime_type)
select :mime_type
from dual
where not exists (select 1 from cr_mime_types where mime_type = :mime_type)
</querytext>
</fullquery>
<fullquery name="cr_import_content.is_registered">
<querytext>
select 1
from cr_content_mime_type_map
where mime_type = :mime_type
and content_type = 'content_revision'
</querytext>
</fullquery>
<fullquery name="cr_registered_type_for_mime_type.registered_type_for_mime_type">
<querytext>
select content_type
from cr_content_mime_type_map
where mime_type = :mime_type
</querytext>
</fullquery>
<fullquery name="cr_check_mime_type.lookup_mimetype">
<querytext>
select mime_type
from cr_extension_mime_type_map
where extension = :extension
</querytext>
</fullquery>
<fullquery name="cr_import_content.is_registered">
<querytext>
select 1
from cr_content_mime_type_map
where mime_type = :mime_type
and content_type = 'content_revision'
</querytext>
</fullquery>
<fullquery name="cr_filename_to_mime_type.lookup_mimetype">
<querytext>
select mime_type
from cr_extension_mime_type_map
where extension = :extension
</querytext>
</fullquery>
<fullquery name="cr_import_content.image_type_p">
<fullquery name="cr_import_content.image_type_p">
<querytext>
select 1
from cr_content_mime_type_map
where mime_type = :mime_type
and content_type = 'image'
select 1
from cr_content_mime_type_map
where mime_type = :mime_type
and content_type = 'image'
</querytext>
</fullquery>
</fullquery>
</queryset>
......@@ -45,11 +45,11 @@ aa_register_case content_folder {
#########################################################
# create a child folder
#########################################################
set child_folder_id [db_nextval "acs_object_id_seq"]
set child_folder_id [db_nextval "acs_object_id_seq"]
set returned_child_folder_id [content::folder::new \
-folder_id $child_folder_id \
-parent_id $first_folder_id \
-name "test_folder_${first_folder_id}"]
-name "test_folder_${first_folder_id}"]
#########################################################
# check if child is a subfolder of parent
#########################################################
......
ad_library {
Procedures to test content::image tcl API
Procedures to test content::image Tcl API
@author Hugh Brock
@creation-date 2006-01-17
......
......@@ -67,7 +67,10 @@ aa_register_case content_item {
aa_true "First item's revision exists" \
[expr \
{![string equal "" \
[db_string get_revision "select latest_revision from cr_items, cr_revisions where latest_revision=revision_id and cr_items.item_id=:first_item_id" -default ""]]}]
[db_string get_revision {
select latest_revision from cr_items, cr_revisions
where latest_revision=revision_id and cr_items.item_id = :first_item_id
} -default ""]]}]
# check the folder is not empty now.
set is_empty [content::folder::is_empty -folder_id $first_folder_id]
......@@ -103,7 +106,7 @@ aa_register_case content_item {
# delete the evil_name item
#########################################################
# in oracle content_item.del is not a fucntion and cannot
# in oracle content_item.del is not a function and cannot
# return true or false so we have to rely on a query to
# see if the item exists or not
......
......@@ -12,12 +12,12 @@ ad_proc -private cr_item_search::assert_not_in_queue {
Check if revision_id is in the search observer queue
} {
aa_false "Revision ${revision_id} is not queued for search events $events" \
[expr [db_string check_queue \
"select count(*) from search_observer_queue
where object_id=:revision_id
and event in
([template::util::tcl_to_sql_list $events])"\
-default 0]]
[expr [db_string check_queue [subst {
select count(*) from search_observer_queue
where object_id = :revision_id
and event in
([template::util::tcl_to_sql_list $events])
}] -default 0]]
}
ad_proc -private cr_item_search::assert_in_queue {
......@@ -30,12 +30,12 @@ ad_proc -private cr_item_search::assert_in_queue {
@param events List of events to check for (INSERT,UPDATE,DELETE)
} {
aa_true "Revision ${revision_id} is queued for search events $events" \
[expr [db_string check_queue \
"select count(*) from search_observer_queue
where object_id=:revision_id
and event in
([template::util::tcl_to_sql_list $events])"\
-default 0]]
[expr [db_string check_queue [subst {
select count(*) from search_observer_queue
where object_id = :revision_id
and event in
([template::util::tcl_to_sql_list $events])
}] -default 0]]
}
ad_proc -private cr_item_search::remove_from_queue {
......@@ -88,10 +88,10 @@ aa_register_case -cats db cr_item_search_triggers {
[content::item::get_latest_revision \
-item_id $item_id]] ne ""}]
aa_false "Item is NOT queued for search indexing" \
[expr [db_string check_queue \
"select 1 from search_observer_queue
where object_id=:latest_revision"\
-default 0]]
[expr [db_string check_queue {
select 1 from search_observer_queue
where object_id = :latest_revision
} -default 0]]
aa_log "Update Item, still no live revision"
content::item::update \
-item_id $item_id \
......
......@@ -6,7 +6,7 @@ ad_page_contract {
} {
{ extension_p:boolean 0 }
{ orderby "mime_type" }
{ orderby:token "mime_type" }
}
set return_url [export_vars -base "index" {extension_p orderby}]
......
......@@ -6,7 +6,7 @@ ad_page_contract {
} {
mime_type:notnull
{return_url ""}
{return_url:localurl ""}
}
set doc(title) "Add an extension"
......
......@@ -5,7 +5,7 @@ ad_page_contract {
@cvs-id $Id$
} {
{return_url ""}
{return_url:localurl ""}
}
set doc(title) "Create a new MIME Type"
......
......@@ -7,7 +7,7 @@ ad_page_contract {
} {
extension:notnull
mime_type:notnull
{return_url ""}
{return_url:localurl ""}
}
if { $return_url eq "" } {
......
<property name="context">{/doc/acs-content-repository {Content Repository}} {Package: content}</property>
<property name="context">{/doc/acs-content-repository {ACS Content Repository}} {Package: content}</property>
<property name="doc(title)">Package: content</property>
<master>
<h2>content</h2>
<p>
<a href="../index">Content Repository</a> : content</p>
<hr>
<ul><li>Function content.blob_to_string</li></ul>
<ul>
<li>Function content.blob_to_string
<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>
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><em>Not yet documented</em></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><kbd>
function blob_to_string(
blob_loc blob) return varchar2
as language
......@@ -18,11 +19,11 @@ name
oracle.sql.BLOB
) return java.lang.String';
</tt></pre></td></tr>
</kbd></pre></td></tr>
</table>
<ul><li>Procedure content.blob_to_file</li></ul>
</li><li>Procedure content.blob_to_file
<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>
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><em>Not yet documented</em></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><kbd>
procedure blob_to_file(
s varchar2, blob_loc blob)
as language
......@@ -32,11 +33,11 @@ name
java.lang.String, oracle.sql.BLOB
)';
</tt></pre></td></tr>
</kbd></pre></td></tr>
</table>
<ul><li>Procedure content.string_to_blob</li></ul>
</li><li>Procedure content.string_to_blob
<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>
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><em>Not yet documented</em></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><kbd>
procedure string_to_blob(
s varchar2, blob_loc blob)
as language
......@@ -46,11 +47,11 @@ name
java.lang.String, oracle.sql.BLOB
)';
</tt></pre></td></tr>
</kbd></pre></td></tr>
</table>
<ul><li>Procedure content.string_to_blob_size</li></ul>
</li><li>Procedure content.string_to_blob_size
<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>
<tr><th align="left" colspan="2">Parameters:</th></tr><tr><td></td></tr><tr><td align="left" colspan="2"><em>Not yet documented</em></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><kbd>
procedure string_to_blob_size(
s varchar2, blob_loc blob, blob_size number)
as language
......@@ -60,7 +61,9 @@ name
java.lang.String, oracle.sql.BLOB, int
)';
</tt></pre></td></tr>
</kbd></pre></td></tr>
</table>
<p>Last Modified: $&zwnj;Id: content.html,v 1.1.1.1 2001/03/13 22:59:26
ben Exp $</p>
</li>
</ul>
<p>Last Modified: $&zwnj;Id: content.html,v 1.1.1.1.30.2 2016/06/22
07:40:41 gustafn Exp $</p>
<html>
<head>
<title>Package: content</title>
</head>
<body bgcolor="#FFFFFF">
<h2>content</h2>
<p>
<a href="../index.html">Content Repository</a> : content
<hr>
<p>
<li>Function content.blob_to_string
<p></p>
<table cellpadding=3 cellspacing=0 border=0>
<tr><th align=left colspan=2>Parameters:</th><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
as language
java
name
'com.arsdigita.content.Util.blobToString(
oracle.sql.BLOB
) return java.lang.String';
</tt></pre>
</td></tr>
</table>
<p>
<li>Procedure content.blob_to_file
<p></p>
<table cellpadding=3 cellspacing=0 border=0>
<tr><th align=left colspan=2>Parameters:</th><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)
as language
java
name
'com.arsdigita.content.Util.blobToFile(
java.lang.String, oracle.sql.BLOB
)';
</tt></pre>
</td></tr>
</table>
<p>
<li>Procedure content.string_to_blob
<p></p>
<table cellpadding=3 cellspacing=0 border=0>
<tr><th align=left colspan=2>Parameters:</th><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)
as language
java
name
'com.arsdigita.content.Util.stringToBlob(
java.lang.String, oracle.sql.BLOB
)';
</tt></pre>
</td></tr>
</table>
<p>
<li>Procedure content.string_to_blob_size
<p></p>
<table cellpadding=3 cellspacing=0 border=0>
<tr><th align=left colspan=2>Parameters:</th><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)
as language
java
name
'com.arsdigita.content.Util.stringToBlob(
java.lang.String, oracle.sql.BLOB, int
)';
</tt></pre>
</td></tr>
</table>
<p>
Last Modified: $Id$
</body>
</html>
<html>
<head>
<title>Package: content</title>
</head>
<body bgcolor="#FFFFFF">
<h2>content</h2>
<p>
<a href="../index.html">Content Repository</a> : content
<hr>
<p>
<ul>
<li>Function content.blob_to_string
<p></p>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th><tr>
<tr><td align="left" colspan="2">
<em>Not yet documented</em>
</td>
</tr>
<tr><th align="left" colspan="2">Declaration:</th></tr>
<tr align="left"><td colspan="2" align="left">
<pre><kbd>
function blob_to_string(
blob_loc blob) return varchar2
as language
java
name
'com.arsdigita.content.Util.blobToString(
oracle.sql.BLOB
) return java.lang.String';
</kbd></pre>
</td></tr>
</table>
<p>
<li>Procedure content.blob_to_file
<p></p>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th><tr>
<tr><td align="left" colspan="2">
<em>Not yet documented</em>
</td>
</tr>
<tr><th align="left" colspan="2">Declaration:</th></tr>
<tr align="left"><td colspan="2" align="left">
<pre><kbd>
procedure blob_to_file(
s varchar2, blob_loc blob)
as language
java
name
'com.arsdigita.content.Util.blobToFile(
java.lang.String, oracle.sql.BLOB
)';
</kbd></pre>
</td></tr>
</table>
<p>
<li>Procedure content.string_to_blob
<p></p>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th><tr>
<tr><td align="left" colspan="2">
<em>Not yet documented</em>
</td>
</tr>
<tr><th align="left" colspan="2">Declaration:</th></tr>
<tr align="left"><td colspan="2" align="left">
<pre><kbd>
procedure string_to_blob(
s varchar2, blob_loc blob)
as language
java
name
'com.arsdigita.content.Util.stringToBlob(
java.lang.String, oracle.sql.BLOB
)';
</kbd></pre>
</td></tr>
</table>
<p>
<li>Procedure content.string_to_blob_size
<p></p>
<table cellpadding="3" cellspacing="0" border="0">
<tr><th align="left" colspan="2">Parameters:</th><tr>
<tr><td align="left" colspan="2">
<em>Not yet documented</em>
</td>
</tr>
<tr><th align="left" colspan="2">Declaration:</th></tr>
<tr align="left"><td colspan="2" align="left">
<pre><kbd>
procedure string_to_blob_size(
s varchar2, blob_loc blob, blob_size number)
as language
java
name
'com.arsdigita.content.Util.stringToBlob(
java.lang.String, oracle.sql.BLOB, int
)';
</kbd></pre>
</td></tr>
</table>
</ul>
<p>
Last Modified: $Id$
</body>
</html>
<property name="context">{/doc/acs-content-repository {Content Repository}} {Package: content_extlink}</property>
<property name="context">{/doc/acs-content-repository {ACS Content Repository}} {Package: content_extlink}</property>
<property name="doc(title)">Package: content_extlink</property>
<master>
<h2>content_extlink</h2>
......@@ -11,44 +11,42 @@ content_extlink</p>
<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>
<h3><a name="overview" id="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>
"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&#39;s own content items.</p>
<p> </p>
<h3><a name="related">Related Objects</a></h3>
<h3><a name="related" id="related">Related Objects</a></h3>
See also: {content_item }
See also: {content_item}
<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">
<h3><a name="api" id="api">API</a></h3>
<ul>
<li>
<font size="+1">Function:</font> content_extlink.is_extlink
<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>
<th align="left">Returns:</th><td align="left">'t' if the item is a extlink, 'f' otherwise</td>
<th align="left">Returns:</th><td align="left">'t' if the item is a extlink, 'f'
otherwise</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>
<th align="right" valign="top">item_id:</th><td>  </td><td>The item id</td>
</tr></table></blockquote></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
</tr></table></blockquote></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><kbd>
function is_extlink (
item_id in cr_items.item_id%TYPE
) return char;
</tt></pre></td></tr><tr>
</kbd></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>
</table><p> </p>
</li><li>
<font size="+1">Function:</font> content_extlink.new
<p>Create a new extlink, an item pointing to an off-site
resource</p>
<table cellpadding="3" cellspacing="0" border="0">
resource</p><table cellpadding="3" cellspacing="0" border="0">
<tr>
<th align="left">Author:</th><td align="left">Karl Goldstein</td>
</tr><tr>
......@@ -70,16 +68,16 @@ folder and not a generic content item.</td>
<th align="right" valign="top">extlink_id:</th><td>  </td><td>The id of the new extlink. A new id will be allocated by
default</td>
</tr><tr>
<th align="right" valign="top">creation_date:</th><td>  </td><td>As in <tt>acs_object.new</tt>
<th align="right" valign="top">creation_date:</th><td>  </td><td>As in <kbd>acs_object.new</kbd>
</td>
</tr><tr>
<th align="right" valign="top">creation_ip:</th><td>  </td><td>As in <tt>acs_object.new</tt>
<th align="right" valign="top">creation_ip:</th><td>  </td><td>As in <kbd>acs_object.new</kbd>
</td>
</tr><tr>
<th align="right" valign="top">creation_user:</th><td>  </td><td>As in <tt>acs_object.new</tt>
<th align="right" valign="top">creation_user:</th><td>  </td><td>As in <kbd>acs_object.new</kbd>
</td>
</tr>
</table></blockquote></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
</table></blockquote></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><kbd>
function new (
name in cr_items.name%TYPE default null,
url in cr_extlinks.url%TYPE,
......@@ -94,29 +92,28 @@ function new (
creation_ip in acs_objects.creation_ip%TYPE default null
) return cr_extlinks.extlink_id%TYPE;
</tt></pre></td></tr><tr>
</kbd></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>
</li><li>
<font size="+1">Procedure:</font> content_extlink.delete
<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>
<th align="right" valign="top">extlink_id:</th><td>  </td><td>The id of the extlink to delete</td>
</tr></table></blockquote></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><tt>
</tr></table></blockquote></td></tr><tr><th align="left" colspan="2">Declaration:</th></tr><tr align="left"><td colspan="2" align="left"><pre><kbd>
procedure delete (
extlink_id in cr_extlinks.extlink_id%TYPE
);
</tt></pre></td></tr><tr>
</kbd></pre></td></tr><tr>
<th align="left" valign="top">See Also:</th><td>content_extlink.new, acs_object.delete</td>
</tr>
</table>
<p> </p>
</li>
</ul>
Last Modified: $&zwnj;Id: extlink.html,v 1.1.1.1 2001/03/13 22:59:26 ben
Exp $
Last Modified: $&zwnj;Id: extlink.html,v 1.1.1.1.30.2 2016/06/22 07:40:41
gustafn Exp $
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -2,8 +2,8 @@
<head><title>Content Repository Design</title></head>
<body>
<h2>Content Repository Design</h2>
<b><a href="/doc">ACS Documentation</a> :
<a href="index.html">Content Repository</a></b>
<strong><a href="/doc">ACS Documentation</a> :
<a href="index.html">Content Repository</a></strong>
<hr>
<h3>I. Essentials</h3>
......
<property name="context">{/doc/acs-content-repository {Content Repository}} {}</property>
<property name="context">{/doc/acs-content-repository {ACS Content Repository}} {}</property>
<property name="doc(title)"></property>
<master>
<p>Last Modified: $&zwnj;Id: access-control.html,v 1.1.1.1 2001/03/13
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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