Index: openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql,v diff -u -N -r1.4 -r1.5 --- openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql 17 Sep 2002 21:03:24 -0000 1.4 +++ openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql 17 May 2003 10:37:05 -0000 1.5 @@ -246,6 +246,8 @@ -- allow child items to be added content_folder.register_content_type(v_folder_id,'content_revision','t'); content_folder.register_content_type(v_folder_id,'content_folder','t'); + content_folder.register_content_type(v_folder_id,'content_extlink','t'); + content_folder.register_content_type(v_folder_id,'content_symlink','t'); -- set up default permissions acs_permission.grant_permission( @@ -612,6 +614,18 @@ 't' -- include_subtypes ); + content_folder.register_content_type( + v_folder_id, -- folder_id + 'content_extlink', -- content_type + 't' -- include_subtypes + ); + + content_folder.register_content_type( + v_folder_id, -- folder_id + 'content_symlink', -- content_type + 't' -- include_subtypes + ); + -- Give the creator admin privileges on the folder acs_permission.grant_permission( v_folder_id, -- object_id @@ -667,7 +681,18 @@ content_folder.delete(v_rec.item_id); end if; - -- We may have to delete other items here, e.g., symlinks(future feature) + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = 'content_symlink' + then + content_symlink.delete(v_rec.item_id); + end if; + + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = 'content_extlink' + then + content_extlink.delete(v_rec.item_id); + end if; + end loop; end; / Index: openacs-4/packages/file-storage/sql/oracle/file-storage-simple-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/Attic/file-storage-simple-create.sql,v diff -u -N --- openacs-4/packages/file-storage/sql/oracle/file-storage-simple-create.sql 17 Jul 2002 20:09:47 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,62 +0,0 @@ - --- --- File Storage NonVersioned (Simple) Objects --- --- This is to get away from the CR pain when dealing with file-storage of --- "other" objects --- --- @author Ben Adida (ben@openforce) --- @creation-date 01 April 2002 --- @cvs-id $Id: file-storage-simple-create.sql,v 1.4 2002/07/17 20:09:47 yon Exp $ --- - - --- Non-versioned objects -create table fs_simple_objects ( - object_id integer - constraint fs_simp_obj_id_fk - references acs_objects(object_id) - constraint fs_simple_objects_pk - primary key, - folder_id integer - constraint fs_simp_folder_id_fk - references cr_folders, - name varchar(250) not null, - description varchar(4000) -); - -create index fs_so_folder_id_idx on fs_simple_objects (folder_id); - -create table fs_urls ( - url_id integer - constraint fs_url_url_id_fk - references fs_simple_objects(object_id) - constraint fs_urls_pk - primary key, - url varchar(250) not null -); - -begin - -- stuff for non-versioned file-storage objects - acs_object_type.create_type ( - supertype => 'acs_object', - object_type => 'fs_simple_object', - pretty_name => 'File Storage Simple Object', - pretty_plural => 'File Storage Simple Objects', - table_name => 'fs_simple_objects', - id_column => 'object_id', - name_method => 'fs_simple_object.name' - ); - - -- links - acs_object_type.create_type ( - supertype => 'fs_simple_object', - object_type => 'fs_url', - pretty_name => 'File Storage URL', - pretty_plural => 'File Storage URLs', - table_name => 'fs_urls', - id_column => 'url_id' - ); -end; -/ -show errors; Index: openacs-4/packages/file-storage/sql/oracle/file-storage-simple-package-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/Attic/file-storage-simple-package-create.sql,v diff -u -N --- openacs-4/packages/file-storage/sql/oracle/file-storage-simple-package-create.sql 17 Jul 2002 20:09:47 -0000 1.5 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,220 +0,0 @@ - --- --- File Storage NonVersioned (simple) Objects --- --- This is to get away from the CR pain when dealing with file-storage of --- "other" objects --- --- @author Ben Adida (ben@openforce) --- @creation-date 01 April 2002 --- @cvs-id $Id: file-storage-simple-package-create.sql,v 1.5 2002/07/17 20:09:47 yon Exp $ --- - -create or replace package fs_simple_object -as - - function new ( - object_id in fs_simple_objects.object_id%TYPE default NULL, - object_type in acs_objects.object_type%TYPE default 'fs_simple_object', - folder_id in fs_simple_objects.folder_id%TYPE, - name in fs_simple_objects.name%TYPE, - description in fs_simple_objects.description%TYPE, - creation_date in acs_objects.creation_date%TYPE default sysdate, - creation_user in acs_objects.creation_user%TYPE, - creation_ip in acs_objects.creation_ip%TYPE, - context_id in acs_objects.context_id%TYPE - ) return fs_simple_objects.object_id%TYPE; - - procedure delete ( - object_id in fs_simple_objects.object_id%TYPE - ); - - function name ( - object_id in fs_simple_objects.object_id%TYPE - ) return fs_simple_objects.name%TYPE; - -end fs_simple_object; -/ -show errors - -create or replace package body fs_simple_object -as - - function new ( - object_id in fs_simple_objects.object_id%TYPE default NULL, - object_type in acs_objects.object_type%TYPE default 'fs_simple_object', - folder_id in fs_simple_objects.folder_id%TYPE, - name in fs_simple_objects.name%TYPE, - description in fs_simple_objects.description%TYPE, - creation_date in acs_objects.creation_date%TYPE default sysdate, - creation_user in acs_objects.creation_user%TYPE, - creation_ip in acs_objects.creation_ip%TYPE, - context_id in acs_objects.context_id%TYPE - ) return fs_simple_objects.object_id%TYPE - is - v_object_id acs_objects.object_id%TYPE; - begin - v_object_id:= acs_object.new ( - object_id => object_id, - object_type => object_type, - creation_date => creation_date, - creation_user => creation_user, - creation_ip => creation_ip, - context_id => context_id - ); - - insert into fs_simple_objects - (object_id, folder_id, name, description) values - (v_object_id, folder_id, name, description); - - acs_object.update_last_modified(fs_simple_object.new.folder_id); - - return v_object_id; - end new; - - procedure delete ( - object_id in fs_simple_objects.object_id%TYPE - ) - is - begin - acs_object.delete(object_id); - end delete; - - function name ( - object_id in fs_simple_objects.object_id%TYPE - ) return fs_simple_objects.name%TYPE - is - v_name fs_simple_objects.name%TYPE; - begin - select name - into v_name - from fs_simple_objects - where object_id = fs_simple_object.name.object_id; - - return v_name; - end name; - -end fs_simple_object; -/ -show errors - -create or replace package fs_url -as - - function new ( - url_id in fs_urls.url_id%TYPE default NULL, - object_type in acs_objects.object_type%TYPE default 'fs_url', - url in fs_urls.url%TYPE, - folder_id in fs_simple_objects.folder_id%TYPE, - name in fs_simple_objects.name%TYPE, - description in fs_simple_objects.description%TYPE, - creation_date in acs_objects.creation_date%TYPE default sysdate, - creation_user in acs_objects.creation_user%TYPE, - creation_ip in acs_objects.creation_ip%TYPE, - context_id in acs_objects.context_id%TYPE - ) return fs_urls.url_id%TYPE; - - procedure delete ( - url_id in fs_urls.url_id%TYPE - ); - - function copy ( - url_id in fs_urls.url_id%TYPE, - target_folder_id in fs_simple_objects.folder_id%TYPE - ) return fs_urls.url_id%TYPE; - -end fs_url; -/ -show errors - -create or replace package body fs_url -as - - function new ( - url_id in fs_urls.url_id%TYPE default NULL, - object_type in acs_objects.object_type%TYPE default 'fs_url', - url in fs_urls.url%TYPE, - folder_id in fs_simple_objects.folder_id%TYPE, - name in fs_simple_objects.name%TYPE, - description in fs_simple_objects.description%TYPE, - creation_date in acs_objects.creation_date%TYPE default sysdate, - creation_user in acs_objects.creation_user%TYPE, - creation_ip in acs_objects.creation_ip%TYPE, - context_id in acs_objects.context_id%TYPE - ) return fs_urls.url_id%TYPE - is - v_url_id fs_simple_objects.object_id%TYPE; - begin - v_url_id:= fs_simple_object.new ( - object_id => url_id, - object_type => object_type, - folder_id => folder_id, - name => name, - description => description, - creation_date => creation_date, - creation_user => creation_user, - creation_ip => creation_ip, - context_id => context_id - ); - - insert into fs_urls - (url_id, url) values - (v_url_id, url); - - return v_url_id; - end new; - - procedure delete ( - url_id in fs_urls.url_id%TYPE - ) - is - begin - delete from fs_urls where url_id= fs_url.delete.url_id; - - fs_simple_object.delete(url_id); - end delete; - - function copy ( - url_id in fs_urls.url_id%TYPE, - target_folder_id in fs_simple_objects.folder_id%TYPE - ) return fs_urls.url_id%TYPE - is - v_new_url_id fs_urls.url_id%TYPE; - v_url fs_urls.url%TYPE; - v_name fs_simple_objects.name%TYPE; - v_description fs_simple_objects.description%TYPE; - v_creation_user acs_objects.creation_user%TYPE; - v_creation_ip acs_objects.creation_ip%TYPE; - begin - - select url - into v_url - from fs_urls - where url_id = copy.url_id; - - select name, description - into v_name, v_description - from fs_simple_objects - where object_id = copy.url_id; - - select creation_user, creation_ip - into v_creation_user, v_creation_ip - from acs_objects - where object_id = copy.url_id; - - v_new_url_id := fs_url.new( - url => v_url, - folder_id => copy.target_folder_id, - name => v_name, - description => v_description, - creation_user => v_creation_user, - creation_ip => v_creation_ip, - context_id => copy.target_folder_id - ); - - return v_new_url_id; - end copy; - -end fs_url; -/ -show errors Index: openacs-4/packages/file-storage/sql/oracle/file-storage-views-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/file-storage-views-create.sql,v diff -u -N -r1.6 -r1.7 --- openacs-4/packages/file-storage/sql/oracle/file-storage-views-create.sql 11 Dec 2002 13:27:59 -0000 1.6 +++ openacs-4/packages/file-storage/sql/oracle/file-storage-views-create.sql 17 May 2003 10:37:05 -0000 1.7 @@ -8,17 +8,17 @@ create or replace view fs_urls_full as - select fs_urls.url_id, - fs_urls.url, - fs_simple_objects.folder_id, - fs_simple_objects.name, - fs_simple_objects.description, + select cr_extlinks.extlink_id as url_id, + cr_extlinks.url, + cr_items.parent_id as folder_id, + cr_extlinks.label as name, + cr_extlinks.description, acs_objects.* - from fs_urls, - fs_simple_objects, + from cr_extlinks, + cr_items, acs_objects - where fs_urls.url_id = fs_simple_objects.object_id - and fs_simple_objects.object_id = acs_objects.object_id; + where cr_extlinks.extlink_id = cr_items.item_id + and cr_items.item_id = acs_objects.object_id; create or replace view fs_folders as @@ -59,41 +59,38 @@ create or replace view fs_objects as - select fs_folders.folder_id as object_id, - 0 as live_revision, - 'folder' as type, - fs_folders.content_size, - fs_folders.name, - '' as file_upload_name, - fs_folders.last_modified, - '' as url, - fs_folders.parent_id, - fs_folders.key, - 0 as sort_key - from fs_folders - union all - select fs_files.file_id as object_id, - fs_files.live_revision, - fs_files.type, - fs_files.content_size, - fs_files.name, - fs_files.file_upload_name, - fs_files.last_modified, - '' as url, - fs_files.parent_id, - fs_files.key, - 1 as sort_key - from fs_files - union all - select fs_urls_full.url_id as object_id, - 0 as live_revision, - 'url' as type, - 0 as content_size, - fs_urls_full.name, - fs_urls_full.name as file_upload_name, - fs_urls_full.last_modified, - fs_urls_full.url, - fs_urls_full.folder_id as parent_id, - fs_urls_full.url as key, - 1 as sort_key - from fs_urls_full; + select cr_items.item_id as object_id, + cr_items.live_revision, + case + when cr_items.content_type = 'content_folder' then 'folder' + when cr_items.content_type = 'content_extlink' then 'url' + else cr_revisions.mime_type + end as type, + case + when cr_items.content_type = 'content_folder' + then (select count(*) + from cr_items ci + where ci.content_type <> 'content_folder' + connect by prior ci.item_id = ci.parent_id + start with ci.item_id = cr_folders.folder_id) + else cr_revisions.content_length + end as content_size, + case + when cr_items.content_type = 'content_folder' then cr_folders.label + when cr_items.content_type = 'content_extlink' then cr_extlinks.label + else cr_items.name + end as name, + cr_revisions.title as file_upload_name, + acs_objects.last_modified, + cr_extlinks.url, + cr_items.parent_id, + cr_items.name as key, + case + when cr_items.content_type = 'content_folder' then 0 + else 1 + end as sort_key + from cr_items, cr_extlinks, cr_folders, cr_revisions, acs_objects + where cr_items.item_id = cr_extlinks.extlink_id(+) + and cr_items.item_id = cr_folders.folder_id(+) + and cr_items.item_id = acs_objects.object_id + and cr_items.live_revision = cr_revisions.revision_id(+); Index: openacs-4/packages/file-storage/sql/oracle/upgrade/upgrade-4.6.1-4.6.2.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/upgrade/upgrade-4.6.1-4.6.2.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/file-storage/sql/oracle/upgrade/upgrade-4.6.1-4.6.2.sql 17 May 2003 10:37:36 -0000 1.2 @@ -0,0 +1,817 @@ +-- Move old fs_simple_objects URLs to the content repository, where they +-- belong. + +declare + new_url_id cr_extlinks.extlink_id%TYPE; +begin + + for root_folder in (select folder_id from fs_root_folders) + loop + for folder in (select folder_id + from cr_folders + where folder_id in (select item_id + from cr_items + start with item_id = root_folder.folder_id + connect by prior item_id = parent_id)) + loop + + if content_folder.is_registered(folder.folder_id, 'content_extlink') = 'f' then + content_folder.register_content_type(folder.folder_id, 'content_extlink'); + end if; + + if content_folder.is_registered(folder.folder_id, 'content_symlink') = 'f' then + content_folder.register_content_type(folder.folder_id, 'content_symlink'); + end if; + + end loop; + end loop; + + for fs_url in (select * from fs_urls_full) + loop + + new_url_id := content_extlink.new ( + url => fs_url.url, + label => fs_url.name, + description => fs_url.description, + parent_id => fs_url.folder_id, + extlink_id => null, + creation_date => fs_url.creation_date, + creation_user => fs_url.creation_user, + creation_ip => fs_url.creation_ip + ); + + update acs_objects + set last_modified = fs_url.last_modified, + modifying_user = fs_url.modifying_user, + modifying_ip = fs_url.modifying_ip + where object_id = fs_url.object_id; + + update acs_permissions + set object_id = new_url_id + where object_id = fs_url.object_id; + + acs_object.delete(fs_url.object_id); + + end loop; + +end; +/ +show errors; + +drop table fs_urls; +drop table fs_simple_objects; + +create or replace view fs_urls_full +as + select cr_extlinks.extlink_id as url_id, + cr_extlinks.url, + cr_items.parent_id as folder_id, + cr_extlinks.label as name, + cr_extlinks.description, + acs_objects.* + from cr_extlinks, + cr_items, + acs_objects + where cr_extlinks.extlink_id = cr_items.item_id + and cr_items.item_id = acs_objects.object_id; + +create or replace view fs_objects +as + select cr_items.item_id as object_id, + cr_items.live_revision, + case + when cr_items.content_type = 'content_folder' then 'folder' + when cr_items.content_type = 'content_extlink' then 'url' + else cr_revisions.mime_type + end as type, + case + when cr_items.content_type = 'content_folder' + then (select count(*) + from cr_items ci + where ci.content_type <> 'content_folder' + connect by prior ci.item_id = ci.parent_id + start with ci.item_id = cr_folders.folder_id) + else cr_revisions.content_length + end as content_size, + case + when cr_items.content_type = 'content_folder' then cr_folders.label + when cr_items.content_type = 'content_extlink' then cr_extlinks.label + else cr_items.name + end as name, + cr_revisions.title as file_upload_name, + acs_objects.last_modified, + cr_extlinks.url, + cr_items.parent_id, + cr_items.name as key, + case + when cr_items.content_type = 'content_folder' then 0 + else 1 + end as sort_key + from cr_items, cr_extlinks, cr_folders, cr_revisions, acs_objects + where cr_items.item_id = cr_extlinks.extlink_id(+) + and cr_items.item_id = cr_folders.folder_id(+) + and cr_items.item_id = acs_objects.object_id + and cr_items.live_revision = cr_revisions.revision_id(+); + +-- +-- packages/file-storage/sql/file-storage-package-create.sql +-- +-- @author yon (yon@openforce.net) +-- @creation-date 2002-04-03 +-- @version $Id: upgrade-4.6.1-4.6.2.sql,v 1.2 2003/05/17 10:37:36 jeffd Exp $ +-- + +create or replace package file_storage +as + + function get_root_folder( + -- + -- Returns the root folder corresponding to a particular + -- package instance. + -- + package_id in apm_packages.package_id%TYPE + ) return fs_root_folders.folder_id%TYPE; + + function get_package_id( + item_id in cr_items.item_id%TYPE + ) return fs_root_folders.package_id%TYPE; + + function new_root_folder( + -- + -- Creates a new root folder + -- + package_id in apm_packages.package_id%TYPE, + folder_name in cr_folders.label%TYPE default null, + description in cr_folders.description%TYPE default null + ) return fs_root_folders.folder_id%TYPE; + + function new_file( + -- + -- Create a file in CR in preparation for actual storage + -- Wrapper for content_item.new + -- + item_id in cr_items.item_id%TYPE default null, + title in cr_items.name%TYPE, + folder_id in cr_items.parent_id%TYPE, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE, + indb_p in char default 't' + ) return cr_items.item_id%TYPE; + + procedure delete_file( + -- + -- Delete a file and all its version + -- Wrapper to content_item.delete + -- + file_id in cr_items.item_id%TYPE + ); + + procedure rename_file( + -- + -- Rename a file and all + -- Wrapper to content_item__rename + -- + file_id in cr_items.item_id%TYPE, + title in cr_items.name%TYPE + ); + + function copy_file( + -- + -- Copy a file, but only copy the live_revision + -- + file_id in cr_items.item_id%TYPE, + target_folder_id in cr_items.parent_id%TYPE, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE + ) return cr_revisions.revision_id%TYPE; + + procedure move_file( + -- + -- Move a file, and all its versions, to a new folder + -- + file_id in cr_items.item_id%TYPE, + target_folder_id in cr_items.parent_id%TYPE + ); + + function get_title( + -- + -- Unfortunately, title in the file-storage context refers + -- to the name attribute in cr_items, not the title attribute in + -- cr_revisions + item_id in cr_items.item_id%TYPE + ) return varchar; + + function get_parent_id( + item_id in cr_items.item_id%TYPE + ) return cr_items.item_id%TYPE; + + function get_content_type( + -- + -- Wrapper for content_item. get_content_type + -- + item_id in cr_items.item_id%TYPE + ) return cr_items.content_type%TYPE; + + function get_folder_name( + -- + -- Wrapper for content_folder__get_label + -- + folder_id in cr_folders.folder_id%TYPE + ) return cr_folders.label%TYPE; + + function new_version( + -- + -- Create a new version of a file + -- Wrapper for content_revision.new + -- + filename in cr_revisions.title%TYPE, + description in cr_revisions.description%TYPE, + mime_type in cr_revisions.mime_type%TYPE, + item_id in cr_items.item_id%TYPE, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE + ) return cr_revisions.revision_id%TYPE; + + function delete_version( + -- + -- Delete a version of a file + -- + file_id in cr_items.item_id%TYPE, + version_id in cr_revisions.revision_id%TYPE + ) return cr_items.parent_id%TYPE; + + function new_folder( + -- + -- Create a folder + -- + name in cr_items.name%TYPE, + folder_name in cr_folders.label%TYPE, + parent_id in cr_items.parent_id%TYPE, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE + ) return cr_folders.folder_id%TYPE; + + procedure delete_folder( + -- + -- Delete a folder + -- + folder_id in cr_folders.folder_id%TYPE + ); + +end file_storage; +/ +show errors + +create or replace package body file_storage +as + + function get_root_folder( + package_id in apm_packages.package_id%TYPE + ) return fs_root_folders.folder_id%TYPE + is + v_folder_id fs_root_folders.folder_id%TYPE; + v_count integer; + begin + select count(*) + into v_count + from fs_root_folders + where package_id = get_root_folder.package_id; + + if v_count > 0 then + select folder_id + into v_folder_id + from fs_root_folders + where package_id = get_root_folder.package_id; + else + -- must be a new instance. Gotta create a new root folder + v_folder_id := new_root_folder(package_id); + end if; + + return v_folder_id; + end get_root_folder; + + function get_package_id( + item_id in cr_items.item_id%TYPE + ) return fs_root_folders.package_id%TYPE + is + v_package_id fs_root_folders.package_id%TYPE; + begin + select fs_root_folders.package_id + into v_package_id + from fs_root_folders, + (select cr_items.item_id + from cr_items + connect by prior cr_items.parent_id = cr_items.item_id + start with cr_items.item_id = get_package_id.item_id) this + where fs_root_folders.folder_id = this.item_id; + + return v_package_id; + + exception when NO_DATA_FOUND then + return null; + end get_package_id; + + function new_root_folder( + -- + -- A hackish function to get around the fact that we can't run + -- code automatically when a new package instance is created. + -- + package_id in apm_packages.package_id%TYPE, + folder_name in cr_folders.label%TYPE default null, + description in cr_folders.description%TYPE default null + ) return fs_root_folders.folder_id%TYPE + is + v_folder_id fs_root_folders.folder_id%TYPE; + v_package_name apm_packages.instance_name%TYPE; + v_package_key apm_packages.package_key%TYPE; + v_folder_name cr_folders.label%TYPE; + v_description cr_folders.description%TYPE; + begin + select instance_name, package_key + into v_package_name, v_package_key + from apm_packages + where package_id = new_root_folder.package_id; + + if new_root_folder.folder_name is null + then + v_folder_name := v_package_name || ' Root Folder'; + else + v_folder_name := folder_name; + end if; + + if new_root_folder.description is null + then + v_description := 'Root folder for the file-storage system. All other folders in file storage are subfolders of this one.'; + else + v_description := description; + end if; + + v_folder_id := content_folder.new( + name => v_package_key || '_' || package_id, + label => v_folder_name, + description => v_description + ); + + insert + into fs_root_folders + (package_id, folder_id) + values + (package_id, v_folder_id); + + -- allow child items to be added + content_folder.register_content_type(v_folder_id,'content_revision','t'); + content_folder.register_content_type(v_folder_id,'content_folder','t'); + content_folder.register_content_type(v_folder_id,'content_extlink','t'); + + -- set up default permissions + acs_permission.grant_permission( + object_id => v_folder_id, + grantee_id => acs.magic_object_id('the_public'), + privilege => 'read' + ); + + acs_permission.grant_permission( + object_id => v_folder_id, + grantee_id => acs.magic_object_id('registered_users'), + privilege => 'write' + ); + + return v_folder_id; + end new_root_folder; + + function new_file( + -- + -- Create a file in CR in preparation for actual storage + -- Wrapper for content_item.new + -- + item_id in cr_items.item_id%TYPE default null, + title in cr_items.name%TYPE, + folder_id in cr_items.parent_id%TYPE, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE, + indb_p in char default 't' + ) return cr_items.item_id%TYPE + is + v_item_id cr_items.item_id%TYPE; + begin + if new_file.indb_p = 't' + then + v_item_id := content_item.new( + item_id => new_file.item_id, + name => new_file.title, + parent_id => new_file.folder_id, + creation_user => new_file.creation_user, + context_id => new_file.folder_id, + creation_ip => new_file.creation_ip, + content_type => 'file_storage_object', + item_subtype => 'content_item' + ); + else + v_item_id := content_item.new( + name => new_file.title, + parent_id => new_file.folder_id, + creation_user => new_file.creation_user, + context_id => new_file.folder_id, + creation_ip => new_file.creation_ip, + content_type => 'file_storage_object', + item_subtype => 'content_item', + storage_type => 'file' + ); + end if; + + acs_object.update_last_modified(file_storage.new_file.folder_id); + + return v_item_id; + end new_file; + + procedure delete_file( + -- + -- Delete a file and all its version + -- Wrapper to content_item__delete + -- + file_id in cr_items.item_id%TYPE + ) + is + begin + content_item.delete(item_id => file_storage.delete_file.file_id); + end delete_file; + + procedure rename_file( + -- + -- Rename a file and all + -- Wrapper to content_item__rename + -- + file_id in cr_items.item_id%TYPE, + title in cr_items.name%TYPE + ) + is + begin + content_item.rename( + item_id => file_storage.rename_file.file_id, + name => file_storage.rename_file.title + ); + end rename_file; + + function copy_file( + -- + -- Copy a file, but only copy the live_revision + -- + file_id in cr_items.item_id%TYPE, + target_folder_id in cr_items.parent_id%TYPE, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE + ) return cr_revisions.revision_id%TYPE + is + v_title cr_items.name%TYPE; + v_live_revision cr_items.live_revision%TYPE; + v_filename cr_revisions.title%TYPE; + v_description cr_revisions.description%TYPE; + v_mime_type cr_revisions.mime_type%TYPE; + v_content_length cr_revisions.content_length%TYPE; + v_lob cr_revisions.content%TYPE; + v_file_path cr_revisions.filename%TYPE; + v_new_file_id cr_items.item_id%TYPE; + v_new_version_id cr_revisions.revision_id%TYPE; + v_indb_p char; + begin + -- We copy only the title from the file being copied, and attributes of the + -- live revision + select i.name, i.live_revision, r.title, r.description, + r.mime_type, r.content, r.filename, r.content_length, + decode(i.storage_type,'lob','t','f') + into v_title, v_live_revision, v_filename, v_description, + v_mime_type, v_lob, v_file_path, v_content_length, + v_indb_p + from cr_items i, cr_revisions r + where r.item_id = i.item_id + and r.revision_id = i.live_revision + and i.item_id = file_storage.copy_file.file_id; + + -- We should probably use the copy functions of CR + -- when we optimize this function + v_new_file_id := file_storage.new_file( + title => v_title, + folder_id => file_storage.copy_file.target_folder_id, + creation_user => file_storage.copy_file.creation_user, + creation_ip => file_storage.copy_file.creation_ip, + indb_p => v_indb_p + ); + + v_new_version_id := file_storage.new_version( + filename => v_filename, + description => v_description, + mime_type => v_mime_type, + item_id => v_new_file_id, + creation_user => file_storage.copy_file.creation_user, + creation_ip => file_storage.copy_file.creation_ip + ); + + -- Oracle is easier, since lobs are true lobs + -- For now, we simply copy the file name + update cr_revisions + set filename = v_file_path, + content = v_lob, + content_length = v_content_length + where revision_id = v_new_version_id; + + acs_object.update_last_modified(file_storage.copy_file.target_folder_id); + + return v_new_version_id; + end copy_file; + + procedure move_file( + -- + -- Move a file, and all its versions, to a new folder + -- + file_id in cr_items.item_id%TYPE, + target_folder_id in cr_items.parent_id%TYPE + ) + is + begin + content_item.move( + item_id => file_storage.move_file.file_id, + target_folder_id => file_storage.move_file.target_folder_id + ); + + acs_object.update_last_modified(file_storage.move_file.target_folder_id); + + end; + + function new_version( + -- + -- Create a new version of a file + -- Wrapper for content_revision.new + -- + filename in cr_revisions.title%TYPE, + description in cr_revisions.description%TYPE, + mime_type in cr_revisions.mime_type%TYPE, + item_id in cr_items.item_id%TYPE, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE + ) return cr_revisions.revision_id%TYPE + is + v_revision_id cr_revisions.revision_id%TYPE; + v_folder_id cr_items.parent_id%TYPE; + begin + -- Create a revision + v_revision_id := content_revision.new( + title => new_version.filename, + description => new_version.description, + mime_type => new_version.mime_type, + item_id => new_version.item_id, + creation_user => new_version.creation_user, + creation_ip => new_version.creation_ip + ); + + -- Make live the newly created revision + content_item.set_live_revision(revision_id => v_revision_id); + + select cr_items.parent_id + into v_folder_id + from cr_items + where cr_items.item_id = file_storage.new_version.item_id; + + acs_object.update_last_modified(v_folder_id); + + return v_revision_id; + + exception when NO_DATA_FOUND then + return v_revision_id; + end new_version; + + function get_title( + -- + -- Unfortunately, title in the file-storage context refers + -- to the name attribute in cr_items, not the title attribute in + -- cr_revisions + item_id in cr_items.item_id%TYPE + ) return varchar + is + v_title cr_items.name%TYPE; + v_content_type cr_items.content_type%TYPE; + begin + select content_type + into v_content_type + from cr_items + where item_id = get_title.item_id; + + if v_content_type = 'content_folder' + then + select label + into v_title + from cr_folders + where folder_id = get_title.item_id; + else if v_content_type = 'content_symlink' + then + select label into v_title + from cr_symlinks + where symlink_id = get_title.item_id; + else + select name into v_title + from cr_items + where item_id = get_title.item_id; + end if; + end if; + + return v_title; + end get_title; + + function get_parent_id( + item_id in cr_items.item_id%TYPE + ) return cr_items.item_id%TYPE + is + v_parent_id cr_items.item_id%TYPE; + begin + select parent_id + into v_parent_id + from cr_items + where item_id = get_parent_id.item_id; + + return v_parent_id; + end get_parent_id; + + function get_content_type( + -- + -- Wrapper for content_item. get_content_type + -- + item_id in cr_items.item_id%TYPE + ) return cr_items.content_type%TYPE + is + v_content_type cr_items.content_type%TYPE; + begin + v_content_type := content_item.get_content_type( + item_id => file_storage.get_content_type.item_id + ); + + return v_content_type; + end get_content_type; + + function get_folder_name( + -- + -- Wrapper for content_folder.get_label + -- + folder_id in cr_folders.folder_id%TYPE + ) return cr_folders.label%TYPE + is + v_folder_name cr_folders.label%TYPE; + begin + v_folder_name := content_folder.get_label( + folder_id => file_storage.get_folder_name.folder_id + ); + + return v_folder_name; + end get_folder_name; + + function delete_version( + -- + -- Delete a version of a file + -- + file_id in cr_items.item_id%TYPE, + version_id in cr_revisions.revision_id%TYPE + ) return cr_items.parent_id%TYPE + is + v_parent_id cr_items.parent_id%TYPE; + begin + if file_storage.delete_version.version_id = content_item.get_live_revision(file_storage.delete_version.file_id) + then + content_revision.delete(file_storage.delete_version.version_id); + content_item.set_live_revision( + content_item.get_latest_revision(file_storage.delete_version.file_id) + ); + else + content_revision.delete(file_storage.delete_version.version_id); + end if; + + -- If the live revision is null, we have deleted the last version above + select decode(live_revision, null, parent_id, 0) + into v_parent_id + from cr_items + where item_id = file_storage.delete_version.file_id; + + -- Unfortunately, due to PostgreSQL behavior with regards referential integrity, + -- we cannot delete the content_item entry if there are no more revisions. + return v_parent_id; + end delete_version; + + function new_folder( + -- + -- Create a folder + -- + name in cr_items.name%TYPE, + folder_name in cr_folders.label%TYPE, + parent_id in cr_items.parent_id%TYPE, + creation_user in acs_objects.creation_user%TYPE, + creation_ip in acs_objects.creation_ip%TYPE + ) return cr_folders.folder_id%TYPE + is + v_folder_id cr_folders.folder_id%TYPE; + begin + -- Create a new folder + v_folder_id := content_folder.new( + name => file_storage.new_folder.name, + label => file_storage.new_folder.folder_name, + parent_id => file_storage.new_folder.parent_id, + creation_user => file_storage.new_folder.creation_user, + creation_ip => file_storage.new_folder.creation_ip + ); + + -- register the standard content types + content_folder.register_content_type( + v_folder_id, -- folder_id + 'content_revision', -- content_type + 't' -- include_subtypes + ); + + content_folder.register_content_type( + v_folder_id, -- folder_id + 'content_folder', -- content_type + 't' -- include_subtypes + ); + + content_folder.register_content_type( + v_folder_id, -- folder_id + 'content_extlink', -- content_type + 't' -- include_subtypes + ); + + -- Give the creator admin privileges on the folder + acs_permission.grant_permission( + v_folder_id, -- object_id + file_storage.new_folder.creation_user, -- grantee_id + 'admin' -- privilege + ); + + return v_folder_id; + end new_folder; + + procedure delete_folder( + -- + -- Delete a folder + -- + folder_id in cr_folders.folder_id%TYPE + ) + is + begin + content_folder.delete( + folder_id => file_storage.delete_folder.folder_id + ); + end delete_folder; + +end file_storage; +/ +show errors; + +-- JS: BEFORE DELETE TRIGGER to clean up CR +create or replace trigger fs_package_items_delete_trig +before delete on fs_root_folders +for each row +declare + cursor v_cursor is + select item_id,content_type + from cr_items + where item_id != :old.folder_id + connect by parent_id = prior item_id + start with item_id = :old.folder_id + order by level desc; +begin + for v_rec in v_cursor + loop + -- We delete the item. On delete cascade should take care + -- of deletion of revisions. + if v_rec.content_type = 'file_storage_object' + then + content_item.delete(v_rec.item_id); + end if; + + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = 'content_folder' + then + content_folder.delete(v_rec.item_id); + end if; + + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = 'content_symlink' + then + content_symlink.delete(v_rec.item_id); + end if; + + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = 'content_extlink' + then + content_extlink.delete(v_rec.item_id); + end if; + + end loop; +end; +/ +show errors; + +-- JS: AFTER DELETE TRIGGER to clean up last entry in CR +create or replace trigger fs_root_folder_delete_trig +after delete on fs_root_folders +for each row +begin + content_folder.delete(:old.folder_id); +end; +/ +show errors; Index: openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql,v diff -u -N -r1.8 -r1.9 --- openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql 18 Sep 2002 06:03:29 -0000 1.8 +++ openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql 17 May 2003 10:38:11 -0000 1.9 @@ -131,6 +131,16 @@ ''content_folder'', -- content_types ''t'' -- include_subtypes ); + PERFORM content_folder__register_content_type( + v_folder_id, -- folder_id + ''content_symlink'', -- content_types + ''t'' -- include_subtypes + ); + PERFORM content_folder__register_content_type( + v_folder_id, -- folder_id + ''content_extlink'', -- content_types + ''t'' -- include_subtypes + ); -- set up default permissions PERFORM acs_permission__grant_permission ( @@ -637,6 +647,18 @@ ''t'' -- include_subtypes (default) ); + PERFORM content_folder__register_content_type( + v_folder_id, -- folder_id + ''content_extlink'', -- content_types + ''t'' -- include_subtypes + ); + + PERFORM content_folder__register_content_type( + v_folder_id, -- folder_id + ''content_symlink'', -- content_types + ''t'' -- include_subtypes + ); + -- Give the creator admin privileges on the folder PERFORM acs_permission__grant_permission ( v_folder_id, -- object_id @@ -685,7 +707,9 @@ order by c1.tree_sortkey desc loop + -- DRB: Why can''t we just use object delete here? + -- We delete the item. On delete cascade should take care -- of deletion of revisions. if v_rec.content_type = ''file_storage_object'' @@ -701,8 +725,20 @@ PERFORM content_folder__delete(v_rec.item_id); end if; - -- We may have to delete other items here, e.g., symlinks (future feature) + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = ''content_symlink'' + then + raise notice ''Deleting symlink_id = %'',v_rec.item_id; + PERFORM content_symlink__delete(v_rec.item_id); + end if; + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = ''content_extlink'' + then + raise notice ''Deleting folder_id = %'',v_rec.item_id; + PERFORM content_extlink__delete(v_rec.item_id); + end if; + end loop; -- We need to return something for the trigger to be activated Index: openacs-4/packages/file-storage/sql/postgresql/file-storage-simple-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/Attic/file-storage-simple-create.sql,v diff -u -N --- openacs-4/packages/file-storage/sql/postgresql/file-storage-simple-create.sql 17 Jul 2002 20:09:47 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,64 +0,0 @@ - --- --- File Storage NonVersioned (Simple) Objects --- --- This is to get away from the CR pain when dealing with file-storage of --- "other" objects --- --- @author Ben Adida (ben@openforce) --- @creation-date 01 April 2002 --- @cvs-id $Id: file-storage-simple-create.sql,v 1.3 2002/07/17 20:09:47 yon Exp $ --- - - --- Non-versioned objects -create table fs_simple_objects ( - object_id integer - constraint fs_simp_obj_id_fk - references acs_objects(object_id) - constraint fs_simp_obj_id_pk - primary key, - folder_id integer - constraint fs_simp_folder_id_fk - references cr_folders(folder_id), - name varchar(250) not null, - description varchar(4000) -); - - -create table fs_urls ( - url_id integer - constraint fs_url_url_id_fk - references fs_simple_objects(object_id) - constraint fs_url_url_id_pk - primary key, - url varchar(250) not null -); - --- stuff for non-versioned file-storage objects -select acs_object_type__create_type ( - 'fs_simple_object', - 'File Storage Simple Object', - 'File Storage Simple Objects', - 'acs_object', - 'fs_simple_objects', - 'object_id', - NULL, - 'f', - NULL, - 'fs_simple_object.name' -); - --- links -select acs_object_type__create_type ( - 'fs_url', - 'File Storage URL', - 'File Storage URLs', - 'fs_simple_object', - 'fs_urls', - 'url_id', - NULL, - 'f', - NULL, - NULL -); Index: openacs-4/packages/file-storage/sql/postgresql/file-storage-simple-package-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/Attic/file-storage-simple-package-create.sql,v diff -u -N --- openacs-4/packages/file-storage/sql/postgresql/file-storage-simple-package-create.sql 21 Dec 2002 22:28:58 -0000 1.9 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,183 +0,0 @@ - --- --- File Storage NonVersioned (simple) Objects --- --- This is to get away from the CR pain when dealing with file-storage of --- "other" objects --- --- @author Ben Adida (ben@openforce) --- @creation-date 01 April 2002 --- @cvs-id $Id: file-storage-simple-package-create.sql,v 1.9 2002/12/21 22:28:58 bartt Exp $ --- - -select define_function_args('fs_simple_object__new','object_id,object_type,fs_simple_object,folder_id,name,description,creation_date,creation_user,creation_ip,context_id'); - -create function fs_simple_object__new(integer,varchar,integer,varchar,varchar,timestamp with time zone,integer,varchar,integer) -returns integer as ' -DECLARE - p_object_id alias for $1; - p_object_type alias for $2; - p_folder_id alias for $3; - p_name alias for $4; - p_description alias for $5; - p_creation_date alias for $6; - p_creation_user alias for $7; - p_creation_ip alias for $8; - p_context_id alias for $9; - v_object_id integer; -BEGIN - v_object_id:= acs_object__new ( - p_object_id, - p_object_type, - p_creation_date, - p_creation_user, - p_creation_ip, - p_context_id - ); - - insert into fs_simple_objects - (object_id, folder_id, name, description) values - (v_object_id, p_folder_id, p_name, p_description); - - PERFORM acs_object__update_last_modified(p_folder_id); - - return v_object_id; - -END; -' language 'plpgsql'; - -select define_function_args('fs_simple_object__delete','object_id'); - -create function fs_simple_object__delete(integer) -returns integer as ' -DECLARE - p_object_id alias for $1; -BEGIN - PERFORM acs_object__delete(p_object_id); - - return 0; -END; -' language 'plpgsql'; - -select define_function_args('fs_simple_object__name', 'object_id'); - -create function fs_simple_object__name(integer) -returns integer as ' -declare - p_object_id alias for $1; -begin - return name - from fs_simple_objects - where object_id = p_object_id; -end; -' language 'plpgsql'; - -select define_function_args('fs_url__new','url_id,object_type;fs_url,url,folder_id,name,description,creation_date,creation_user,creation_ip,context_id'); - -select define_function_args('fs_url__delete','url_id'); - -select define_function_args('fs_url__copy','url_id;target_object_id'); - -create function fs_url__new(integer,varchar,varchar,integer,varchar,varchar,timestamp with time zone,integer,varchar,integer) -returns integer as ' -DECLARE - p_url_id alias for $1; - p_object_type alias for $2; - p_url alias for $3; - p_folder_id alias for $4; - p_name alias for $5; - p_description alias for $6; - p_creation_date alias for $7; - p_creation_user alias for $8; - p_creation_ip alias for $9; - p_context_id alias for $10; - v_url_id integer; -BEGIN - v_url_id:= fs_simple_object__new ( - p_url_id, - p_object_type, - p_folder_id, - p_name, - p_description, - p_creation_date, - p_creation_user, - p_creation_ip, - p_context_id - ); - - insert into fs_urls - (url_id, url) values - (v_url_id, p_url); - - return v_url_id; -END; -' language 'plpgsql'; - - -create function fs_url__delete(integer) -returns integer as ' -DECLARE - p_url_id alias for $1; -BEGIN - delete from fs_urls where url_id= p_url_id; - - PERFORM fs_simple_object__delete(p_url_id); - - return 0; -END; -' language 'plpgsql'; - - -create function fs_url__copy(integer,integer) -returns integer as ' -DECLARE - p_url_id alias for $1; - p_target_folder_id alias for $2; - v_new_url_id integer; - v_url varchar; - v_name varchar; - v_description varchar; - v_creation_user integer; - v_creation_ip varchar; -BEGIN - select url - into v_url - from fs_urls - where url_id = p_url_id; - - select name - into v_name - from fs_simple_objects - where object_id = p_url_id; - - select description - into v_description - from fs_simple_objects - where object_id = p_url_id; - - select creation_user - into v_creation_user - from acs_objects - where object_id = p_url_id; - - select creation_ip - into v_creation_ip - from acs_objects - where object_id = p_url_id; - - v_new_url_id:= fs_url__new ( - NULL, - ''fs_url'', - v_url, - p_target_folder_id, - v_name, - v_description, - NULL, - v_creation_user, - v_creation_ip, - p_target_folder_id - ); - - return v_new_url_id; -END; -' language 'plpgsql'; Index: openacs-4/packages/file-storage/sql/postgresql/file-storage-views-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/file-storage-views-create.sql,v diff -u -N -r1.7 -r1.8 --- openacs-4/packages/file-storage/sql/postgresql/file-storage-views-create.sql 18 Feb 2003 16:56:47 -0000 1.7 +++ openacs-4/packages/file-storage/sql/postgresql/file-storage-views-create.sql 17 May 2003 10:38:11 -0000 1.8 @@ -8,17 +8,17 @@ create view fs_urls_full as - select fs_urls.url_id, - fs_urls.url, - fs_simple_objects.folder_id, - fs_simple_objects.name, - fs_simple_objects.description, + select cr_extlinks.extlink_id as url_id, + cr_extlinks.url, + cr_items.parent_id as folder_id, + cr_extlinks.label as name, + cr_extlinks.description, acs_objects.* - from fs_urls, - fs_simple_objects, + from cr_extlinks, + cr_items, acs_objects - where fs_urls.url_id = fs_simple_objects.object_id - and fs_simple_objects.object_id = acs_objects.object_id; + where cr_extlinks.extlink_id = cr_items.item_id + and cr_items.item_id = acs_objects.object_id; create view fs_folders as @@ -37,7 +37,6 @@ where cr_folders.folder_id = ci.item_id and cr_folders.folder_id = acs_objects.object_id; - create view fs_files as select cr_revisions.item_id as file_id, @@ -59,41 +58,36 @@ create view fs_objects as - select fs_folders.folder_id as object_id, - 0 as live_revision, - 'folder' as type, - fs_folders.content_size, - fs_folders.name, - '' as file_upload_name, - fs_folders.last_modified, - '' as url, - fs_folders.parent_id, - fs_folders.key, - 0 as sort_key - from fs_folders - union all - select fs_files.file_id as object_id, - fs_files.live_revision, - fs_files.type, - fs_files.content_size, - fs_files.name, - fs_files.file_upload_name, - fs_files.last_modified, - '' as url, - fs_files.parent_id, - fs_files.key, - 1 as sort_key - from fs_files - union all - select fs_urls_full.url_id as object_id, - 0 as live_revision, - 'url' as type, - 0 as content_size, - fs_urls_full.name, - fs_urls_full.name as file_upload_name, - fs_urls_full.last_modified, - fs_urls_full.url, - fs_urls_full.folder_id as parent_id, - fs_urls_full.url as key, - 1 as sort_key - from fs_urls_full; + select cr_items.item_id as object_id, + cr_items.live_revision, + case + when cr_items.content_type = 'content_folder' then 'folder' + when cr_items.content_type = 'content_extlink' then 'url' + else cr_revisions.mime_type + end as type, + case + when cr_items.content_type = 'content_folder' + then (select count(*) + from cr_items ci2 + where ci2.content_type <> 'content_folder' + and ci2.tree_sortkey between cr_items.tree_sortkey and tree_right(cr_items.tree_sortkey)) + else cr_revisions.content_length + end as content_size, + case + when cr_items.content_type = 'content_folder' then cr_folders.label + when cr_items.content_type = 'content_extlink' then cr_extlinks.label + else cr_items.name + end as name, + cr_revisions.title as file_upload_name, + acs_objects.last_modified, + cr_extlinks.url, + cr_items.parent_id, + cr_items.name as key, + case + when cr_items.content_type = 'content_folder' then 0 + else 1 + end as sort_key + from cr_items left join cr_extlinks on (cr_items.item_id = cr_extlinks.extlink_id) + left join cr_folders on (cr_items.item_id = cr_folders.folder_id) + left join cr_revisions on (cr_items.live_revision = cr_revisions.revision_id) + join acs_objects on (cr_items.item_id = acs_objects.object_id); Index: openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6-4.6.1.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6-4.6.1.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6-4.6.1.sql 17 May 2003 10:38:49 -0000 1.2 @@ -0,0 +1,66 @@ +-- DRB: As if the following union view weren't unscalable enough for PG +-- (which can't optimize them at all) the following view with its +-- summing of content items sucks to no end. + +drop view fs_folders; +create view fs_folders +as + select cr_folders.folder_id, + cr_folders.label as name, + acs_objects.last_modified, -- JCD needs to walk tree as oracle ver + (select count(*) -- DRB: needs to walk tree and won't scale worth shit + from cr_items ci2 + where ci2.content_type <> 'content_folder' + and ci2.tree_sortkey between ci.tree_sortkey and tree_right(ci.tree_sortkey)) as content_size, + ci.parent_id, + ci.name as key + from cr_folders, + cr_items ci, + acs_objects + where cr_folders.folder_id = ci.item_id + and cr_folders.folder_id = acs_objects.object_id; + +-- DRB: This used to be a plain union view requiring a sort +-- and unique sweep. Union all speeds it up a bit. + +drop view fs_objects; +create view fs_objects +as + select fs_folders.folder_id as object_id, + 0 as live_revision, + 'folder' as type, + fs_folders.content_size, + fs_folders.name, + '' as file_upload_name, + fs_folders.last_modified, + '' as url, + fs_folders.parent_id, + fs_folders.key, + 0 as sort_key + from fs_folders + union all + select fs_files.file_id as object_id, + fs_files.live_revision, + fs_files.type, + fs_files.content_size, + fs_files.name, + fs_files.file_upload_name, + fs_files.last_modified, + '' as url, + fs_files.parent_id, + fs_files.key, + 1 as sort_key + from fs_files + union all + select fs_urls_full.url_id as object_id, + 0 as live_revision, + 'url' as type, + 0 as content_size, + fs_urls_full.name, + fs_urls_full.name as file_upload_name, + fs_urls_full.last_modified, + fs_urls_full.url, + fs_urls_full.folder_id as parent_id, + fs_urls_full.url as key, + 1 as sort_key + from fs_urls_full; Index: openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6.1-4.6.2.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6.1-4.6.2.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6.1-4.6.2.sql 17 May 2003 10:38:49 -0000 1.2 @@ -0,0 +1,188 @@ +-- Move old fs_simple_objects URLs to the content repository, where they +-- belong. + +create or replace function inline_0() returns integer as ' +declare + root record; + folder record; + fs_url record; + new_url_id cr_extlinks.extlink_id%TYPE; +begin + + for root in select tree_sortkey + from fs_root_folders, cr_items + where fs_root_folders.folder_id = cr_items.item_id + loop + + for folder in select folder_id + from cr_folders, cr_items + where cr_items.tree_sortkey between root.tree_sortkey and tree_right(root.tree_sortkey) + and cr_folders.folder_id = cr_items.item_id + loop + if not content_folder__is_registered(folder.folder_id, ''content_symlink'', ''t'') then + perform content_folder__register_content_type(folder.folder_id, ''content_symlink'', ''t''); + end if; + if not content_folder__is_registered(folder.folder_id, ''content_extlink'', ''t'') then + perform content_folder__register_content_type(folder.folder_id, ''content_extlink'', ''t''); + end if; + end loop; + + end loop; + + for fs_url in select * from fs_urls_full + loop + + new_url_id := content_extlink__new ( + null, + fs_url.url, + fs_url.name, + fs_url.description, + fs_url.folder_id, + null, + fs_url.creation_date, + fs_url.creation_user, + fs_url.creation_ip + ); + + update acs_objects + set last_modified = fs_url.last_modified, + modifying_user = fs_url.modifying_user, + modifying_ip = fs_url.modifying_ip + where object_id = fs_url.object_id; + + update acs_permissions + set object_id = new_url_id + where object_id = fs_url.object_id; + + perform acs_object__delete(fs_url.object_id); + + end loop; + + return 0; + +end' language 'plpgsql'; + +begin; + select inline_0(); + drop function inline_0(); + drop view fs_objects; + drop view fs_urls_full; + drop table fs_urls; + drop table fs_simple_objects; +end; + +create view fs_urls_full +as + select cr_extlinks.extlink_id as url_id, + cr_extlinks.url, + cr_items.parent_id as folder_id, + cr_extlinks.label as name, + cr_extlinks.description, + acs_objects.* + from cr_extlinks, + cr_items, + acs_objects + where cr_extlinks.extlink_id = cr_items.item_id + and cr_items.item_id = acs_objects.object_id; + +create view fs_objects +as + select cr_items.item_id as object_id, + cr_items.live_revision, + case + when cr_items.content_type = 'content_folder' then 'folder' + when cr_items.content_type = 'content_extlink' then 'url' + else cr_revisions.mime_type + end as type, + case + when cr_items.content_type = 'content_folder' + then (select count(*) + from cr_items ci2 + where ci2.content_type <> 'content_folder' + and ci2.tree_sortkey between cr_items.tree_sortkey and tree_right(cr_items.tree_sortkey)) + else cr_revisions.content_length + end as content_size, + case + when cr_items.content_type = 'content_folder' then cr_folders.label + when cr_items.content_type = 'content_extlink' then cr_extlinks.label + else cr_items.name + end as name, + cr_revisions.title as file_upload_name, + acs_objects.last_modified, + cr_extlinks.url, + cr_items.parent_id, + cr_items.name as key, + case + when cr_items.content_type = 'content_folder' then 0 + else 1 + end as sort_key + from cr_items left join cr_extlinks on (cr_items.item_id = cr_extlinks.extlink_id) + left join cr_folders on (cr_items.item_id = cr_folders.folder_id) + left join cr_revisions on (cr_items.live_revision = cr_revisions.revision_id) + join acs_objects on (cr_items.item_id = acs_objects.object_id); + +-- JS: BEFORE DELETE TRIGGER to clean up CR entries (except root folder) +drop function fs_package_items_delete_trig (); +create function fs_package_items_delete_trig () returns opaque as ' +declare + + v_rec record; +begin + + for v_rec in + + -- We want to delete all cr_items entries, starting from the leaves all + -- the way up the root folder (old.folder_id). + select c1.item_id, c1.content_type + from cr_items c1, cr_items c2 + where c2.item_id = old.folder_id + and c1.tree_sortkey between c2.tree_sortkey and tree_right(c2.tree_sortkey) + and c1.item_id <> old.folder_id + order by c1.tree_sortkey desc + loop + + -- DRB: Why can''t we just use object delete here? + + + -- We delete the item. On delete cascade should take care + -- of deletion of revisions. + if v_rec.content_type = ''file_storage_object'' + then + raise notice ''Deleting item_id = %'',v_rec.item_id; + PERFORM content_item__delete(v_rec.item_id); + end if; + + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = ''content_folder'' + then + raise notice ''Deleting folder_id = %'',v_rec.item_id; + PERFORM content_folder__delete(v_rec.item_id); + end if; + + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = ''content_symlink'' + then + raise notice ''Deleting symlink_id = %'',v_rec.item_id; + PERFORM content_symlink__delete(v_rec.item_id); + end if; + + -- Instead of doing an if-else, we make sure we are deleting a folder. + if v_rec.content_type = ''content_extlink'' + then + raise notice ''Deleting folder_id = %'',v_rec.item_id; + PERFORM content_extlink__delete(v_rec.item_id); + end if; + + end loop; + + -- We need to return something for the trigger to be activated + return old; + +end;' language 'plpgsql'; + +drop trigger fs_package_items_delete_trig on fs_root_folders; +create trigger fs_package_items_delete_trig before delete +on fs_root_folders for each row +execute procedure fs_package_items_delete_trig (); + + Index: openacs-4/packages/file-storage/tcl/file-storage-procs-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/file-storage-procs-oracle.xql,v diff -u -N -r1.20 -r1.21 --- openacs-4/packages/file-storage/tcl/file-storage-procs-oracle.xql 18 Nov 2002 18:01:04 -0000 1.20 +++ openacs-4/packages/file-storage/tcl/file-storage-procs-oracle.xql 17 May 2003 10:39:21 -0000 1.21 @@ -52,26 +52,28 @@ - select fc.* - from (select fs_objects.object_id, - fs_objects.name, - fs_objects.live_revision, - fs_objects.type, - to_char(fs_objects.last_modified, 'YYYY-MM-DD HH24:MI:SS') as last_modified_ansi, - fs_objects.content_size, - fs_objects.url, - fs_objects.key, - fs_objects.sort_key, - fs_objects.file_upload_name, - case when fs_objects.last_modified >= (sysdate - :n_past_days) then 1 else 0 end as new_p, - acs_permission.permission_p(fs_objects.object_id, :user_id, 'admin') as admin_p, - acs_permission.permission_p(fs_objects.object_id, :user_id, 'delete') as delete_p, - acs_permission.permission_p(fs_objects.object_id, :user_id, 'write') as write_p - from fs_objects - where fs_objects.parent_id = :folder_id) fc - where 't' = (select acs_permission.permission_p(fc.object_id, :user_id, 'read') from dual) - order by fc.sort_key, - fc.name + select fs_objects.object_id, + fs_objects.name, + fs_objects.live_revision, + fs_objects.type, + to_char(fs_objects.last_modified, 'Month DD YYYY HH24:MI') as last_modified, + fs_objects.content_size, + fs_objects.url, + fs_objects.key, + fs_objects.sort_key, + fs_objects.file_upload_name, + case when fs_objects.last_modified >= (sysdate - :n_past_days) then 1 else 0 end as new_p, + acs_permission.permission_p(fs_objects.object_id, :user_id, 'admin') as admin_p, + acs_permission.permission_p(fs_objects.object_id, :user_id, 'delete') as delete_p, + acs_permission.permission_p(fs_objects.object_id, :user_id, 'write') as write_p + from fs_objects + where fs_objects.parent_id = :folder_id + and exists (select 1 + from acs_object_party_privilege_map m + where m.object_id = fs_objects.object_id + and m.party_id = :user_id + and m.privilege = 'read') + order by fs_objects.sort_key, fs_objects.name @@ -139,4 +141,12 @@ + + + select content + from cr_revisions + where revision_id = $live_revision + + + Index: openacs-4/packages/file-storage/tcl/file-storage-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/file-storage-procs-postgresql.xql,v diff -u -N -r1.32 -r1.33 --- openacs-4/packages/file-storage/tcl/file-storage-procs-postgresql.xql 21 Jan 2003 13:10:59 -0000 1.32 +++ openacs-4/packages/file-storage/tcl/file-storage-procs-postgresql.xql 17 May 2003 10:39:21 -0000 1.33 @@ -44,30 +44,30 @@ --- we use $ n_past-days instead of :n_past_days because the pgdriver --- bind variable emulation puts single-quotes around the n_past_days --- integer. Postgresql tries to turn '-1' into a date datatype --- so now()-'-1' fails but now()- interval '-1' works fine. - select fc.* - from (select fs_objects.object_id, - fs_objects.name, - fs_objects.live_revision, - fs_objects.type, - to_char(fs_objects.last_modified, 'YYYY-MM-DD HH24:MI:SS') as last_modified_ansi, - fs_objects.content_size, - fs_objects.url, - fs_objects.key, - fs_objects.sort_key, - fs_objects.file_upload_name, - case when fs_objects.last_modified >= (now() - interval '$n_past_days days') then 1 else 0 end as new_p, - acs_permission__permission_p(fs_objects.object_id, :user_id, 'admin') as admin_p, - acs_permission__permission_p(fs_objects.object_id, :user_id, 'delete') as delete_p, - acs_permission__permission_p(fs_objects.object_id, :user_id, 'write') as write_p - from fs_objects - where fs_objects.parent_id = :folder_id) fc - where 't' = (select acs_permission__permission_p(fc.object_id, :user_id, 'read') from dual) - order by fc.sort_key, - fc.name + + select fs_objects.object_id, + fs_objects.name, + fs_objects.live_revision, + fs_objects.type, + to_char(fs_objects.last_modified, 'Month DD YYYY HH24:MI') as last_modified, + fs_objects.content_size, + fs_objects.url, + fs_objects.key, + fs_objects.sort_key, + fs_objects.file_upload_name, + case when fs_objects.last_modified >= (now() - interval '$n_past_days days') then 1 else 0 end as new_p, + acs_permission__permission_p(fs_objects.object_id, :user_id, 'admin') as admin_p, + acs_permission__permission_p(fs_objects.object_id, :user_id, 'delete') as delete_p, + acs_permission__permission_p(fs_objects.object_id, :user_id, 'write') as write_p + from fs_objects + where fs_objects.parent_id = :folder_id + and exists (select 1 + from acs_object_party_privilege_map m + where m.object_id = fs_objects.object_id + and m.party_id = :user_id + and m.privilege = 'read') + order by fs_objects.sort_key, fs_objects.name + @@ -81,7 +81,7 @@ select count(*) from cr_items c1, cr_items c2 - where c2.item_id = file_storage__get_parent_id(:item_id) + where c2.item_id = :item_id and c1.tree_sortkey between c2.tree_sortkey and tree_right(c2.tree_sortkey) and not acs_permission__permission_p(c1.item_id, :user_id, :privilege) @@ -128,4 +128,12 @@ + + + select lob + from cr_revisions + where revision_id = $live_revision + + + Index: openacs-4/packages/file-storage/tcl/file-storage-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/file-storage-procs.tcl,v diff -u -N -r1.30 -r1.31 --- openacs-4/packages/file-storage/tcl/file-storage-procs.tcl 18 Feb 2003 20:55:28 -0000 1.30 +++ openacs-4/packages/file-storage/tcl/file-storage-procs.tcl 17 May 2003 10:39:21 -0000 1.31 @@ -181,41 +181,6 @@ return $context_bar } -# -# Make sure we don't have page crashes due to unknown MIME types -# - -ad_proc fs_maybe_create_new_mime_type { - file_name -} { - The content repository expects the MIME type to already be defined - when you upload content. We use this procedure to add a new type - when we encounter something we haven't seen before. -} { - - set file_extension [string trimleft [file extension $file_name] "."] - - # This case is now handled by the code below (Ben) - # if {[empty_string_p $file_extension]} { - # return "*/*" - #} - - if {![db_0or1row select_mime_type "select mime_type - from cr_mime_types - where file_extension = :file_extension"]} { - - # Ben: we've fixed this so that all AOLserver mime types - # are now part of the cr_mime_types. So we just return now - # or leave it at that. - - set mime_type "*/*" - } - - return $mime_type -} - - - namespace eval fs { ad_proc -public new_root_folder { @@ -357,10 +322,6 @@ } { Return a list the object_ids contained by a file storage folder. - This would be trivial if it weren't for the fact that we need to UNION ALL - with the gawddamned fs_simple_objects Open Force forced upon us and which - will be removed as soon as I (DRB) find the time to write upgrade scripts. - @param folder_id The folder for which to retrieve contents @param user_id The viewer of the contents (to make sure they have permission) @@ -376,6 +337,13 @@ } { WARNING: This proc is not scalable because it does too many permission checks. + DRB: Not so true now that permissions are fast. However it is now only used + to clone files in dotLRN and for the somewhat brain-damaged syllabus package. + At minimum the permission checks returned by the code can be removed. Most of + the other fields as well. Oh well ... + + REMOVE WHEN SYLLABUS IS REWRITTEN TO FIND ITS FILE INTELLIGENTLY + Retrieve the contents of the specified folder in the form of a list of ns_sets, one for each row returned. The keys for each row are as follows: @@ -449,7 +417,7 @@ if {[string equal folder $type]} { set result [publish_folder_to_file_system -folder_id $object_id -path $path -folder_name $name -user_id $user_id] } elseif {[string equal url $type]} { - set result [publish_simple_object_to_file_system -object_id $object_id -path $path -file_name $file_name] + set result [publish_url -object_id $object_id -path $path -file_name $file_name] } else { set result [publish_versioned_object_to_file_system -object_id $object_id -path $path] } @@ -488,29 +456,9 @@ return $dir } - ad_proc -public publish_simple_object_to_file_system { + ad_proc -public publish_url_to_file_system { {-object_id:required} {-path ""} - {-file_name:required} - } { - publish a simple object to the file system; you must implement a proc - named 'fs::publish_simple__to_file_system', where is the - fs_simple_object type that you create, for each new simple file storage - object you create. - } { - if {[empty_string_p $path]} { - set path [ns_tmpnam] - file mkdir $path - } - - set object [db_list_of_ns_sets select_object_info {}] - - return [publish_simple_[ns_set get $object type]_to_file_system -object $object -path $path -file_name $file_name] - } - - ad_proc -public publish_simple_url_to_file_system { - {-object:required} - {-path ""} {-file_name ""} } { publish a url object to the file system @@ -520,15 +468,15 @@ file mkdir $path } - set object [lindex $object 0] + db_1row select_object_metadata {} if {[empty_string_p $file_name]} { - set file_name [ns_set get $object name] + set file_name $label } set file_name [remove_special_file_system_characters -string $file_name] set fp [open [file join ${path} ${file_name}] w] - puts $fp [ns_set get $object url] + puts $fp url close $fp return [file join ${path} ${file_name}] @@ -555,7 +503,15 @@ switch $storage_type { lob { + # FIXME: db_blob_get_file is failing when i use bind variables + + # DRB: you're out of luck - the driver doesn't support them and while it should + # be fixed it will be a long time before we'll want to require an updated + # driver. I'm substituting the Tcl variable value directly in the query due to + # this. It's safe because we've pulled the value ourselves from the database, + # don't need to worry about SQL smuggling etc. + db_blob_get_file select_object_content {} -file [file join ${path} ${file_name}] } text { Index: openacs-4/packages/file-storage/tcl/file-storage-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/file-storage-procs.xql,v diff -u -N -r1.11 -r1.12 --- openacs-4/packages/file-storage/tcl/file-storage-procs.xql 18 Feb 2003 20:55:28 -0000 1.11 +++ openacs-4/packages/file-storage/tcl/file-storage-procs.xql 17 May 2003 10:39:21 -0000 1.12 @@ -17,23 +17,6 @@ - - - select mime_type - from cr_mime_types - where file_extension = :file_extension - - - - - - insert into cr_mime_types - (mime_type, file_extension) - values - (:mime_type, :extension) - - - select item_id @@ -74,21 +57,15 @@ - select * - from (select cr_items.item_id as object_id, - cr_items.name - from cr_items - where cr_items.parent_id = :folder_id - union all - select fs_simple_objects.object_id, - fs_simple_objects.name - from fs_simple_objects - where fs_simple_objects.folder_id = :folder_id) contents - where exists (select 1 - from acs_object_party_privilege_map m - where m.object_id = contents.object_id - and m.party_id = :user_id - and m.privilege = 'read') + select cr_items.item_id as object_id, + cr_items.name + from cr_items + where cr_items.parent_id = :folder_id + and exists (select 1 + from acs_object_party_privilege_map m + where m.object_id = cr_items.item_id + and m.party_id = :user_id + and m.privilege = 'read') @@ -109,11 +86,11 @@ - + - select fs_objects.* - from fs_objects - where fs_objects.object_id = :object_id + select fs_urls_full.* + from fs_urls_full + where fs_urls_full.object_id = :object_id @@ -132,14 +109,6 @@ - - - select content - from cr_revisions - where revision_id = $live_revision - - - select filename Index: openacs-4/packages/file-storage/tcl/fs-simple-procs-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/Attic/fs-simple-procs-oracle.xql,v diff -u -N --- openacs-4/packages/file-storage/tcl/fs-simple-procs-oracle.xql 29 May 2002 23:02:19 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,27 +0,0 @@ - - - - oracle8.1.6 - - - - declare - begin - fs_simple_object.delete(:object_id); - end; - - - - - - declare - begin - :1 := fs_url.copy( - url_id => :url_id, - target_folder_id => :target_folder_id - ); - end; - - - - Index: openacs-4/packages/file-storage/tcl/fs-simple-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/Attic/fs-simple-procs-postgresql.xql,v diff -u -N --- openacs-4/packages/file-storage/tcl/fs-simple-procs-postgresql.xql 29 May 2002 23:02:19 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,17 +0,0 @@ - - - - postgresql7.1 - - - - select fs_simple_object__delete(:object_id); - - - - - - - - - Index: openacs-4/packages/file-storage/tcl/fs-simple-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/Attic/fs-simple-procs.tcl,v diff -u -N --- openacs-4/packages/file-storage/tcl/fs-simple-procs.tcl 5 Nov 2002 17:19:58 -0000 1.5 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,94 +0,0 @@ -ad_library { - TCL library for the file-storage system (v.4) - extensions for non-versioned (simple) items - - @author Ben Adida (ben@openforce.net) - @creation-date 01 April 2002 - @cvs-id $Id: fs-simple-procs.tcl,v 1.5 2002/11/05 17:19:58 peterm Exp $ -} - -namespace eval fs { - - ad_proc -public simple_get_types {} { - return { - {fs_url "url"} - } - } - - ad_proc -public simple_get_type_pretty_name { - {-type:required} - } { - set lst [simple_get_types] - foreach item $lst { - if {$type == [lindex $item 0]} { - return [lindex $item 1] - } - } - - return "" - } - - ad_proc -public url_new { - {-url_id ""} - {-name:required} - {-description ""} - {-url:required} - {-folder_id:required} - } { - Create a new URL - } { - # Context - set context_id $folder_id - - set extra_vars [ns_set create] - oacs_util::vars_to_ns_set -ns_set $extra_vars -var_list {url_id name url folder_id description context_id} - - # Instantiate and return - set url_id [package_instantiate_object -extra_vars $extra_vars fs_url] - return $url_id - } - - ad_proc -public url_edit { - {-url_id:required} - {-name:required} - {-description ""} - {-url:required} - } { - # Perform the update - db_transaction { - db_dml update_simple {} - db_dml update_url {} - } - } - - ad_proc -public simple_object_move { - {-object_id:required} - {-folder_id:required} - } { - # Update the location - db_dml update_folder{} - } - - ad_proc -public simple_delete { - {-object_id:required} - } { - # delete the item - db_exec_plsql delete_item {} - } - - ad_proc -public simple_p { - {-object_id:required} - } { - # is this thing a simple fs object? - return [db_string simple_check {}] - } - ad_proc -public url_copy { - {-url_id:required} - {-target_folder_id:required} - } { - # is this thing a simple fs object? - return [db_exec_plsql copy {}] - } - -} - Index: openacs-4/packages/file-storage/tcl/fs-simple-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/Attic/fs-simple-procs.xql,v diff -u -N --- openacs-4/packages/file-storage/tcl/fs-simple-procs.xql 29 May 2002 23:02:19 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,37 +0,0 @@ - - - - - -update fs_simple_objects set -name= :name, -description= :description -where object_id= :url_id - - - - - -update fs_urls set -url= :url -where url_id= :url_id - - - - - -update fs_simple_objects set -folder_id= :folder_id -where url_id= :url_id - - - - - -select case when count(*) = 0 then 0 else 1 end -from fs_simple_objects -where object_id = :object_id - - - - Index: openacs-4/packages/file-storage/www/file-add-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/Attic/file-add-2.tcl,v diff -u -N -r1.9 -r1.10 --- openacs-4/packages/file-storage/www/file-add-2.tcl 18 Nov 2002 18:01:05 -0000 1.9 +++ openacs-4/packages/file-storage/www/file-add-2.tcl 17 May 2003 10:39:54 -0000 1.10 @@ -41,10 +41,7 @@ # Get the ip set creation_ip [ad_conn peeraddr] -# The content repository is kinda stupid about mime types, -# so we have to check if we know about this one and possibly -# add it. -set mime_type [fs_maybe_create_new_mime_type $upload_file] +set mime_type [cr_filename_to_mime_type -create $upload_file] # Get the storage type set indb_p [ad_parameter "StoreFilesInDatabaseP" -package_id [ad_conn package_id]] @@ -82,7 +79,14 @@ } + # We know the user has write permission to this folder, but they may not have admin privileges. + # They should always be able to admin their own file by default, so they can delete it, control + # who can read it, etc. + if { [string is false [permission::permission_p -party_id $user_id -object_id $folder_id -privilege admin]] } { + permission::grant -party_id $user_id -object_id $file_id -privilege admin + } + } on_error { # most likely a duplicate name or a double click Index: openacs-4/packages/file-storage/www/file-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/file-oracle.xql,v diff -u -N -r1.7 -r1.8 --- openacs-4/packages/file-storage/www/file-oracle.xql 18 Nov 2002 18:01:05 -0000 1.7 +++ openacs-4/packages/file-storage/www/file-oracle.xql 17 May 2003 10:39:54 -0000 1.8 @@ -32,10 +32,14 @@ acs_permission.permission_p(r.revision_id,:user_id,'delete') as delete_p, r.content_length as content_size from acs_objects o, cr_revisions r, cr_items i - where o.object_id = r.revision_id - and acs_permission.permission_p(r.revision_id, :user_id, 'read') = 't' - and r.item_id = i.item_id - and r.item_id = :file_id + where o.object_id = r.revision_id + and r.item_id = i.item_id + and r.item_id = :file_id + and exists (select 1 + from acs_object_party_privilege_map m + where m.object_id = r.revision_id + and m.party_id = :user_id + and m.privilege = 'read') $show_versions order by last_modified desc Index: openacs-4/packages/file-storage/www/file-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/file-postgresql.xql,v diff -u -N -r1.7 -r1.8 --- openacs-4/packages/file-storage/www/file-postgresql.xql 18 Nov 2002 18:01:05 -0000 1.7 +++ openacs-4/packages/file-storage/www/file-postgresql.xql 17 May 2003 10:39:54 -0000 1.8 @@ -32,10 +32,14 @@ acs_permission__permission_p(r.revision_id,:user_id,'delete') as delete_p, r.content_length as content_size from acs_objects o, cr_revisions r, cr_items i - where o.object_id = r.revision_id - and acs_permission__permission_p(r.revision_id, :user_id, 'read') = 't' - and r.item_id = i.item_id - and r.item_id = :file_id + where o.object_id = r.revision_id + and r.item_id = i.item_id + and r.item_id = :file_id + and exists (select 1 + from acs_object_party_privilege_map m + where m.object_id = r.revision_id + and m.party_id = :user_id + and m.privilege = 'read') $show_versions order by last_modified desc Index: openacs-4/packages/file-storage/www/folder-chunk-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/folder-chunk-oracle.xql,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/file-storage/www/folder-chunk-oracle.xql 18 Feb 2003 20:56:09 -0000 1.3 +++ openacs-4/packages/file-storage/www/folder-chunk-oracle.xql 17 May 2003 10:39:54 -0000 1.4 @@ -9,7 +9,7 @@ fs_objects.name, fs_objects.live_revision, fs_objects.type, - to_char(fs_objects.last_modified, 'YYYY-MM-DD HH24:MI:SS') as last_modified, + to_char(fs_objects.last_modified, 'Month DD YYYY HH24:MI') as last_modified, fs_objects.content_size, fs_objects.url, fs_objects.sort_key, Index: openacs-4/packages/file-storage/www/folder-chunk-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/folder-chunk-postgresql.xql,v diff -u -N -r1.4 -r1.5 --- openacs-4/packages/file-storage/www/folder-chunk-postgresql.xql 18 Feb 2003 20:56:09 -0000 1.4 +++ openacs-4/packages/file-storage/www/folder-chunk-postgresql.xql 17 May 2003 10:39:54 -0000 1.5 @@ -9,74 +9,29 @@ fs_objects.name, fs_objects.live_revision, fs_objects.type, - to_char(fs_objects.last_modified, 'YYYY-MM-DD HH24:MI:SS') as last_modified, + to_char(fs_objects.last_modified, 'Month DD YYYY HH24:MI') as last_modified, fs_objects.content_size, fs_objects.url, fs_objects.sort_key, fs_objects.file_upload_name, - case when fs_objects.last_modified >= (now() - interval '$n_past_days days') then 1 else 0 end as new_p, - delete_p, - write_p - from - (select fs_folders.folder_id as object_id, - 0 as live_revision, - 'folder' as type, - fs_folders.content_size, - fs_folders.name, - '' as file_upload_name, - fs_folders.last_modified, - '' as url, - fs_folders.parent_id, - cast('f' as bool) as write_p, - cast('f' as bool) as delete_p, - 0 as sort_key - from fs_folders - where fs_folders.parent_id = :folder_id - and exists (select 1 - from acs_object_party_privilege_map m - where m.object_id = fs_folders.folder_id - and m.party_id = :viewing_user_id - and m.privilege = 'read') - union all - select fs_files.file_id as object_id, - fs_files.live_revision, - fs_files.type, - fs_files.content_size, - fs_files.name, - fs_files.file_upload_name, - fs_files.last_modified, - '' as url, - fs_files.parent_id, - cast('f' as bool) as write_p, - cast('f' as bool) as delete_p, - 1 as sort_key - from fs_files - where fs_files.parent_id = :folder_id - and exists (select 1 - from acs_object_party_privilege_map m - where m.object_id = fs_files.file_id - and m.party_id = :viewing_user_id - and m.privilege = 'read') - union all - select fs_urls_full.url_id as object_id, - 0 as live_revision, - 'url' as type, - 0 as content_size, - fs_urls_full.name, - fs_urls_full.name as file_upload_name, - fs_urls_full.last_modified, - fs_urls_full.url, - fs_urls_full.folder_id as parent_id, - acs_permission__permission_p(fs_urls.url_id, :viewing_user_id, 'write') as write_p, - acs_permission__permission_p(fs_urls.url_id, :viewing_user_id, 'delete') as delete_p, - 1 as sort_key - from fs_urls_full - where fs_urls_full.folder_id = :folder_id - and exists (select 1 - from acs_object_party_privilege_map m - where m.object_id = fs_urls_full.url_id - and m.party_id = :viewing_user_id - and m.privilege = 'read')) as fs_objects + case when fs_objects.last_modified >= (now() - cast('$n_past_days days' as interval)) then 1 else 0 end as new_p, + case + when type = 'url' + then acs_permission__permission_p(fs_objects.object_id, :viewing_user_id, 'delete') + else 't' + end as delete_p, + case + when type = 'url' + then acs_permission__permission_p(fs_objects.object_id, :viewing_user_id, 'write') + else 't' + end as write_p + from fs_objects + where fs_objects.parent_id = :folder_id + and exists (select 1 + from acs_object_party_privilege_map m + where m.object_id = fs_objects.object_id + and m.party_id = :viewing_user_id + and m.privilege = 'read') order by fs_objects.sort_key, fs_objects.name Index: openacs-4/packages/file-storage/www/folder-chunk.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/folder-chunk.adp,v diff -u -N -r1.16 -r1.17 --- openacs-4/packages/file-storage/www/folder-chunk.adp 18 Feb 2003 20:56:09 -0000 1.16 +++ openacs-4/packages/file-storage/www/folder-chunk.adp 17 May 2003 10:39:54 -0000 1.17 @@ -1,5 +1,5 @@ - +
@@ -8,80 +8,82 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  #file-storage.Name##file-storage.Type# #file-storage.Last_Modified#
#file-storage.folder# - <%= [lang::util::localize @contents.name@] %> -#file-storage.new# -   - @contents.content_size@ #file-storage.items##file-storage.item# - #file-storage.folder#@contents.last_modified@#file-storage.file# - @contents.name@ -#file-storage.new# - - - - [ - #file-storage.edit# - - - - | - - #file-storage.delete# - - - - ] - - -  @contents.type@ @contents.last_modified@#file-storage.file# - - @contents.name@ - - - #file-storage.new# - - - [ - - #file-storage.view_details# - - ] - @contents.content_size@ bytes@contents.type@@contents.last_modified@
#file-storage.folder# + @contents.name@ + #file-storage.new# +   + @contents.content_size@ #file-storage.items##file-storage.item# + @contents.type@@contents.last_modified@#file-storage.file# + @contents.name@ + #file-storage.new# + + + + [ #file-storage.edit# + + + | + #file-storage.delete# + + + ] + + +  @contents.type@@contents.last_modified@#file-storage.file# + + @contents.name@ + + + #file-storage.new# + + + #file-storage.view_details# + @contents.content_size@ bytes@contents.type@@contents.last_modified@
+ + +

+ + Download an archive of the contents of this folder + +
+ Note: This may take a while, please be patient. +

+

#file-storage.lt_Folder_folder_name_is#

Index: openacs-4/packages/file-storage/www/folder-chunk.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/folder-chunk.tcl,v diff -u -N -r1.11 -r1.12 --- openacs-4/packages/file-storage/www/folder-chunk.tcl 18 Feb 2003 20:56:09 -0000 1.11 +++ openacs-4/packages/file-storage/www/folder-chunk.tcl 17 May 2003 10:39:54 -0000 1.12 @@ -8,17 +8,14 @@ } -properties { folder_name:onevalue contents:multirow + content_size_total:onevalue } if {![exists_and_not_null folder_id]} { ad_return_complaint 1 [_ file-storage.lt_bad_folder_id_folder_] ad_script_abort } -if {![exists_and_not_null viewing_user_id]} { - set viewing_user_id [acs_magic_object "the_public"] -} - permission::require_permission -party_id $viewing_user_id -object_id $folder_id -privilege "read" if {![exists_and_not_null n_past_days]} { @@ -37,4 +34,13 @@ set folder_name [fs::get_object_name -object_id $folder_id] +set content_size_total 0 + +db_multirow contents select_folder_contents {} { + set file_upload_name [fs::remove_special_file_system_characters -string $file_upload_name] + if { ![empty_string_p $content_size] } { + incr content_size_total $content_size + } +} + ad_return_template Index: openacs-4/packages/file-storage/www/folder-create.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/folder-create.adp,v diff -u -N -r1.4 -r1.5 --- openacs-4/packages/file-storage/www/folder-create.adp 5 Nov 2002 17:19:59 -0000 1.4 +++ openacs-4/packages/file-storage/www/folder-create.adp 17 May 2003 10:39:54 -0000 1.5 @@ -1,9 +1,10 @@ #file-storage.Create_New_Folder# @context@ +folder.folder_name -
+ Index: openacs-4/packages/file-storage/www/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/index.adp,v diff -u -N -r1.18 -r1.19 --- openacs-4/packages/file-storage/www/index.adp 5 Nov 2002 17:19:59 -0000 1.18 +++ openacs-4/packages/file-storage/www/index.adp 17 May 2003 10:39:54 -0000 1.19 @@ -3,45 +3,49 @@ @folder_name@@context@ -
- - - - +
- #file-storage.Upload_a_file# -   |   - #file-storage.Create_a_URL# -   |   - #file-storage.Create_a_new_folder# - -   |   - #file-storage.Rename_this_folder# - - -   |   - #file-storage.Delete_this_folder# - - - - #file-storage.lt_Show_files_modified_i# #file-storage.days_as_new# - -
+ + + + + + + + + - - - - - - - - -
+ #file-storage.Upload_a_file# +  |  + #file-storage.Create_a_URL# + + + #file-storage.lt_Show_files_modified_i# #file-storage.days_as_new# + +
+ #file-storage.Create_a_new_folder# + + +  |  + #file-storage.Rename_this_folder# + + + +  |  + #file-storage.Delete_this_folder# + + + +  |  + #file-storage.lt_Modify_permissions_on_1# + + + +  |  + Up to @up_name@ + + +

- - #file-storage.lt_Modify_permissions_on_1# - -

-
@@ -55,5 +59,3 @@ #file-storage.Note# #file-storage.lt_This_may_take_a_while# - - Index: openacs-4/packages/file-storage/www/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/index.tcl,v diff -u -N -r1.19 -r1.20 --- openacs-4/packages/file-storage/www/index.tcl 5 Nov 2002 17:19:59 -0000 1.19 +++ openacs-4/packages/file-storage/www/index.tcl 17 May 2003 10:39:54 -0000 1.20 @@ -79,4 +79,10 @@ set context [fs_context_bar_list $folder_id] +set up_url {} +if { [llength $context] > 1 } { + set up_url [lindex [lindex $context end-1] 0] + set up_name [lindex [lindex $context end-1] 1] +} + ad_return_template Index: openacs-4/packages/file-storage/www/simple-add-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/simple-add-2.tcl,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/file-storage/www/simple-add-2.tcl 5 Nov 2002 17:19:59 -0000 1.3 +++ openacs-4/packages/file-storage/www/simple-add-2.tcl 17 May 2003 10:39:54 -0000 1.4 @@ -18,11 +18,21 @@ } +set user_id [ad_conn user_id] + # Check for write permission on this folder ad_require_permission $folder_id write -# Create the URL (for now) -set url_id [fs::url_new -url $url -name $title -description $description -folder_id $folder_id] +set item_id [content_extlink::new -url $url -label $title -description $description -parent_id $folder_id] +# Analogous as for files (see file-add-2) we know the user has write permission to this folder, +# but they may not have admin privileges. +# They should always be able to admin their own url (item) by default, so they can delete it, control +# who can read it, etc. + +if { [string is false [permission::permission_p -party_id $user_id -object_id $folder_id -privilege admin]] } { + permission::grant -party_id $user_id -object_id $item_id -privilege admin +} + ad_returnredirect "?folder_id=$folder_id" Index: openacs-4/packages/file-storage/www/simple-add.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/simple-add.adp,v diff -u -N -r1.5 -r1.6 --- openacs-4/packages/file-storage/www/simple-add.adp 5 Nov 2002 17:19:59 -0000 1.5 +++ openacs-4/packages/file-storage/www/simple-add.adp 17 May 2003 10:39:54 -0000 1.6 @@ -4,7 +4,7 @@ - + Index: openacs-4/packages/file-storage/www/simple-add.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/simple-add.tcl,v diff -u -N -r1.6 -r1.7 --- openacs-4/packages/file-storage/www/simple-add.tcl 12 Nov 2002 08:36:44 -0000 1.6 +++ openacs-4/packages/file-storage/www/simple-add.tcl 17 May 2003 10:39:54 -0000 1.7 @@ -7,7 +7,6 @@ @cvs-id $Id$ } { folder_id:integer,notnull - {type "fs_url"} {title ""} {lock_title_p 0} } -validate { @@ -37,7 +36,6 @@ # Should probably generate the item_id and version_id now for # double-click protection - # if title isn't passed in ignore lock_title_p if {[empty_string_p $title]} { set lock_title_p 0 Index: openacs-4/packages/file-storage/www/simple-delete.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/simple-delete.tcl,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/file-storage/www/simple-delete.tcl 5 Nov 2002 17:19:59 -0000 1.3 +++ openacs-4/packages/file-storage/www/simple-delete.tcl 17 May 2003 10:39:54 -0000 1.4 @@ -13,7 +13,7 @@ ad_require_permission $object_id delete # Delete -fs::simple_delete -object_id $object_id +content_extlink::delete -extlink_id $object_id ad_returnredirect "./?folder_id=$folder_id" Index: openacs-4/packages/file-storage/www/simple-edit-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/Attic/simple-edit-2.tcl,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/file-storage/www/simple-edit-2.tcl 5 Nov 2002 17:19:59 -0000 1.2 +++ openacs-4/packages/file-storage/www/simple-edit-2.tcl 17 May 2003 10:39:54 -0000 1.3 @@ -15,9 +15,9 @@ ad_require_permission $object_id write # edit the URL -fs::url_edit -url_id $object_id -name $name -description $description -url $url +content_extlink::edit -extlink_id $object_id -url $url -label $name -description $description -set folder_id [db_string select_folder_id "select folder_id from fs_simple_objects where object_id= :object_id"] +set folder_id [db_string select_folder_id {}] ad_returnredirect "?folder_id=$folder_id" Index: openacs-4/packages/file-storage/www/simple-edit-2.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/Attic/simple-edit-2.xql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/file-storage/www/simple-edit-2.xql 17 May 2003 10:39:54 -0000 1.2 @@ -0,0 +1,12 @@ + + + + + + select parent_id as folder_id + from cr_items + where item_id = :object_id + + + + Index: openacs-4/packages/file-storage/www/simple-edit.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/simple-edit.tcl,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/file-storage/www/simple-edit.tcl 5 Nov 2002 17:19:59 -0000 1.3 +++ openacs-4/packages/file-storage/www/simple-edit.tcl 17 May 2003 10:39:54 -0000 1.4 @@ -17,8 +17,5 @@ set pretty_name "$name" set context [fs_context_bar_list -final "[_ file-storage.Edit_URL]" $folder_id] -# Should probably generate the item_id and version_id now for -# double-click protection - ad_return_template Index: openacs-4/packages/file-storage/www/simple-edit.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/simple-edit.xql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/file-storage/www/simple-edit.xql 17 May 2003 10:39:54 -0000 1.2 @@ -0,0 +1,12 @@ + + + + + + select name, url, description, folder_id + from fs_urls_full + where url_id= :object_id + + + + Index: openacs-4/packages/file-storage/www/url-goto.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/url-goto.tcl,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/file-storage/www/url-goto.tcl 5 Nov 2002 17:19:59 -0000 1.3 +++ openacs-4/packages/file-storage/www/url-goto.tcl 17 May 2003 10:39:54 -0000 1.4 @@ -8,7 +8,7 @@ url_id:notnull } -# Check for write permission on this folder +# Check for read permission on this url ad_require_permission $url_id read # Check the URL @@ -19,4 +19,3 @@ } else { return -code error [_ file-storage.no_such_URL] } - Index: openacs-4/packages/file-storage/www/url-goto.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/url-goto.xql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/file-storage/www/url-goto.xql 17 May 2003 10:39:54 -0000 1.2 @@ -0,0 +1,12 @@ + + + + + + select url + from cr_extlinks + where extlink_id= :url_id + + + + Index: openacs-4/packages/file-storage/www/version-add-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/Attic/version-add-2.tcl,v diff -u -N -r1.4 -r1.5 --- openacs-4/packages/file-storage/www/version-add-2.tcl 12 Nov 2002 08:36:44 -0000 1.4 +++ openacs-4/packages/file-storage/www/version-add-2.tcl 17 May 2003 10:39:54 -0000 1.5 @@ -43,10 +43,8 @@ # Get the ip set creation_ip [ad_conn peeraddr] -# The content repository is kinda stupid about mime types, -# so we have to check if we know about this one and possibly -# add it. -set mime_type [fs_maybe_create_new_mime_type $upload_file] +# get mime type (create if needed) +set mime_type [cr_filename_to_mime_type -create $upload_file] # Get the storage type set indb_p [ad_parameter "StoreFilesInDatabaseP" -package_id [ad_conn package_id]] Index: openacs-4/packages/file-storage/www/doc/design.html =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/doc/design.html,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/file-storage/www/doc/design.html 25 Sep 2001 19:24:01 -0000 1.2 +++ openacs-4/packages/file-storage/www/doc/design.html 17 May 2003 10:40:26 -0000 1.3 @@ -347,23 +347,6 @@

-

fs_maybe_create_new_mime_type

fs_maybe_create_new_mime_type file_name
-
-The content repository expects the MIME type to already be defined - when you upload content. We use this procedure to add a new type - when we encounter something we haven't seen before. - -

-

-

Parameters:
-file_name
-
-
-
- -

- -

fs_root_folder

fs_root_folder [ -package_id package_id ]
Returns the root folder for the file storage system. Index: openacs-4/packages/forums/forums.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/forums.info,v diff -u -N -r1.16 -r1.17 --- openacs-4/packages/forums/forums.info 16 Jan 2003 13:48:21 -0000 1.16 +++ openacs-4/packages/forums/forums.info 17 May 2003 10:40:57 -0000 1.17 @@ -20,127 +20,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Index: openacs-4/packages/forums/sql/oracle/forums-messages-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/forums-messages-create.sql,v diff -u -N -r1.5 -r1.6 --- openacs-4/packages/forums/sql/oracle/forums-messages-create.sql 16 Jan 2003 13:48:49 -0000 1.5 +++ openacs-4/packages/forums/sql/oracle/forums-messages-create.sql 17 May 2003 10:41:35 -0000 1.6 @@ -58,6 +58,9 @@ -- We do a some big queries on forum_id (thread count on index.tcl) so create a second index -- ordered so it's useful for them create unique index forums_mess_forum_sk_un on forums_messages(forum_id, tree_sortkey); +-- Need these for RI checks +create index forums_messages_user_id_idx ON forums_messages(user_id); +create index forums_messages_parent_id_idx ON forums_messages(parent_id); create view forums_messages_approved as select * Index: openacs-4/packages/forums/sql/oracle/upgrade-0.3d-0.4d.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/oracle/Attic/upgrade-0.3d-0.4d.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/forums/sql/oracle/upgrade-0.3d-0.4d.sql 17 May 2003 10:41:35 -0000 1.2 @@ -0,0 +1,3 @@ +-- Need these two for RI checks +create index forums_messages_user_id_idx ON forums_messages(user_id); +create index forums_messages_parent_id_idx ON forums_messages(parent_id); Index: openacs-4/packages/forums/sql/postgresql/forums-forums-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/postgresql/forums-forums-create.sql,v diff -u -N -r1.5 -r1.6 --- openacs-4/packages/forums/sql/postgresql/forums-forums-create.sql 30 Nov 2002 17:35:03 -0000 1.5 +++ openacs-4/packages/forums/sql/postgresql/forums-forums-create.sql 17 May 2003 10:42:08 -0000 1.6 @@ -70,7 +70,7 @@ package_id integer constraint forums_package_id_nn not null, - last_post timestamp + last_post timestamptz ); create view forums_forums_enabled Index: openacs-4/packages/forums/sql/postgresql/forums-forums-package-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/postgresql/forums-forums-package-create.sql,v diff -u -N -r1.8 -r1.9 --- openacs-4/packages/forums/sql/postgresql/forums-forums-package-create.sql 21 Dec 2002 22:28:17 -0000 1.8 +++ openacs-4/packages/forums/sql/postgresql/forums-forums-package-create.sql 17 May 2003 10:42:08 -0000 1.9 @@ -13,7 +13,7 @@ select define_function_args('forums_forum__new','forum_id,object_type;forums_forum,name,charter,presentation_type,posting_policy,package_id,creation_date,creation_user,creation_ip,context_id'); -create function forums_forum__new (integer,varchar,varchar,varchar,varchar,varchar,integer,timestamp with time zone,integer,varchar,integer) +create function forums_forum__new (integer,varchar,varchar,varchar,varchar,varchar,integer,timestamptz,integer,varchar,integer) returns integer as ' declare p_forum_id alias for $1; Index: openacs-4/packages/forums/sql/postgresql/forums-forums-package-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/postgresql/forums-forums-package-drop.sql,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/forums/sql/postgresql/forums-forums-package-drop.sql 12 Jun 2002 15:24:02 -0000 1.2 +++ openacs-4/packages/forums/sql/postgresql/forums-forums-package-drop.sql 17 May 2003 10:42:08 -0000 1.3 @@ -11,7 +11,7 @@ -- chunks lifted from Gilbert. Thanks Orchard Labs! -- -drop function forums_forum__new (integer,varchar,varchar,varchar,varchar,varchar,integer,timestamp,integer,varchar,integer); +drop function forums_forum__new (integer,varchar,varchar,varchar,varchar,varchar,integer,timestamptz,integer,varchar,integer); drop function forums_forum__name(integer); Index: openacs-4/packages/forums/sql/postgresql/forums-messages-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/postgresql/forums-messages-create.sql,v diff -u -N -r1.7 -r1.8 --- openacs-4/packages/forums/sql/postgresql/forums-messages-create.sql 16 Jan 2003 13:49:10 -0000 1.7 +++ openacs-4/packages/forums/sql/postgresql/forums-messages-create.sql 17 May 2003 10:42:08 -0000 1.8 @@ -31,8 +31,8 @@ references users(user_id) constraint forums_mess_user_id_nn not null, - posting_date timestamp - default now() + posting_date timestamptz + default current_timestamp constraint forum_mess_post_date_nn not null, state varchar(100) @@ -50,15 +50,19 @@ check (open_p in ('t','f')), tree_sortkey varbit, max_child_sortkey varbit, - last_child_post timestamp, + last_child_post timestamptz, constraint forums_mess_sk_forum_un unique (tree_sortkey, forum_id) ); -- We do a some big queries on forum_id (thread count on index.tcl) so create a second index -- ordered so it's useful for them create unique index forums_mess_forum_sk_un on forums_messages(forum_id, tree_sortkey); +-- Need these two for RI checks +create index forums_messages_user_id_idx ON forums_messages(user_id); +create index forums_messages_parent_id_idx ON forums_messages(parent_id); + create view forums_messages_approved as select * Index: openacs-4/packages/forums/sql/postgresql/forums-messages-package-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/postgresql/forums-messages-package-create.sql,v diff -u -N -r1.11 -r1.12 --- openacs-4/packages/forums/sql/postgresql/forums-messages-package-create.sql 16 Jan 2003 13:49:10 -0000 1.11 +++ openacs-4/packages/forums/sql/postgresql/forums-messages-package-create.sql 17 May 2003 10:42:08 -0000 1.12 @@ -13,7 +13,7 @@ select define_function_args ('forums_message__new', 'message_id,object_type;forums_message,forum_id,subject,content,html_p,user_id,posting_date,state,parent_id,creation_date,creation_user,creation_ip,context_id'); -create function forums_message__new (integer,varchar,integer,varchar,text,char,integer,timestamp with time zone,varchar,integer,timestamp with time zone,integer,varchar,integer) +create function forums_message__new (integer,varchar,integer,varchar,text,char,integer,timestamptz,varchar,integer,timestamptz,integer,varchar,integer) returns integer as ' declare p_message_id alias for $1; Index: openacs-4/packages/forums/sql/postgresql/forums-messages-package-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/postgresql/forums-messages-package-drop.sql,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/forums/sql/postgresql/forums-messages-package-drop.sql 12 Jun 2002 15:24:02 -0000 1.2 +++ openacs-4/packages/forums/sql/postgresql/forums-messages-package-drop.sql 17 May 2003 10:42:08 -0000 1.3 @@ -11,7 +11,7 @@ -- chunks lifted from Gilbert. Thanks Orchard Labs! -- -drop function forums_message__new (integer,varchar,integer,varchar,text,char,integer,timestamp,varchar,integer,timestamp,integer,varchar,integer); +drop function forums_message__new (integer,varchar,integer,varchar,text,char,integer,timestamptz,varchar,integer,timestamptz,integer,varchar,integer); drop function forums_message__root_message_id (integer); Index: openacs-4/packages/forums/sql/postgresql/upgrade-0.1d-0.2d.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/postgresql/Attic/upgrade-0.1d-0.2d.sql,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/forums/sql/postgresql/upgrade-0.1d-0.2d.sql 30 Nov 2002 17:35:03 -0000 1.2 +++ openacs-4/packages/forums/sql/postgresql/upgrade-0.1d-0.2d.sql 17 May 2003 10:42:08 -0000 1.3 @@ -1,10 +1,10 @@ -alter table forums_forums add column last_post timestamp; -alter table forums_messages add column last_child_post timestamp; +alter table forums_forums add column last_post timestamptz; +alter table forums_messages add column last_child_post timestamptz; create or replace function t () returns integer as ' declare v_record record; - v_timestamp timestamp; + v_timestamp timestamptz; begin for v_record in select forum_id @@ -68,7 +68,7 @@ from forums_forums where enabled_p = 't'; -create or replace function forums_message__new (integer,varchar,integer,varchar,text,char,integer,timestamp,varchar,integer,timestamp,integer,varchar,integer) +create or replace function forums_message__new (integer,varchar,integer,varchar,text,char,integer,timestamptz,varchar,integer,timestamptz,integer,varchar,integer) returns integer as ' declare p_message_id alias for $1; @@ -137,7 +137,7 @@ end; ' language 'plpgsql'; -create or replace function forums_forum__new (integer,varchar,varchar,varchar,varchar,varchar,integer,timestamp,integer,varchar,integer) +create or replace function forums_forum__new (integer,varchar,varchar,varchar,varchar,varchar,integer,timestamptz,integer,varchar,integer) returns integer as ' declare p_forum_id alias for $1; Index: openacs-4/packages/forums/sql/postgresql/upgrade-0.3d-0.4d.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/sql/postgresql/Attic/upgrade-0.3d-0.4d.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/forums/sql/postgresql/upgrade-0.3d-0.4d.sql 17 May 2003 10:42:08 -0000 1.2 @@ -0,0 +1,3 @@ +-- Need these two for RI checks +create index forums_messages_user_id_idx ON forums_messages(user_id); +create index forums_messages_parent_id_idx ON forums_messages(parent_id); Index: openacs-4/packages/forums/tcl/forums-security-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/tcl/forums-security-procs.tcl,v diff -u -N -r1.5 -r1.6 --- openacs-4/packages/forums/tcl/forums-security-procs.tcl 30 Nov 2002 17:35:17 -0000 1.5 +++ openacs-4/packages/forums/tcl/forums-security-procs.tcl 17 May 2003 10:42:46 -0000 1.6 @@ -57,7 +57,7 @@ {-user_id ""} {-forum_id:required} } { - return [permission::permission_p -party_id $user_id -object_id $forum_id -privilege forum_write] + return [permission::permission_p -party_id $user_id -object_id $forum_id -privilege forum_create] } ad_proc -public require_post_forum { Index: openacs-4/packages/forums/www/forum-view-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/Attic/forum-view-postgresql.xql,v diff -u -N -r1.8 -r1.9 --- openacs-4/packages/forums/www/forum-view-postgresql.xql 10 Jan 2003 15:13:11 -0000 1.8 +++ openacs-4/packages/forums/www/forum-view-postgresql.xql 17 May 2003 10:43:31 -0000 1.9 @@ -14,7 +14,7 @@ from forums_messages_approved fm1 where fm1.forum_id = :forum_id and fm1.tree_sortkey between tree_left(fm.tree_sortkey) and tree_right(fm.tree_sortkey)) as n_messages, - to_char(fm.last_child_post, 'YYYY-MM-DD HH24:MI:SS') as last_child_post_ansi, + to_char(fm.last_child_post, 'Mon DD YYYY HH24:MI:SS') as last_child_post, case when fm.last_child_post > (now() - interval '1 day') then 't' else 'f' end as new_p from forums_messages_approved fm where fm.forum_id = :forum_id @@ -35,7 +35,7 @@ from forums_messages fm1 where fm1.forum_id = :forum_id and fm1.tree_sortkey between tree_left(fm.tree_sortkey) and tree_right(fm.tree_sortkey)) as n_messages, - to_char(fm.last_child_post, 'YYYY-MM-DD HH24:MI:SS') as last_child_post_ansi, + to_char(fm.last_child_post, 'Mon DD YYYY HH24:MI:SS') as last_child_post, case when fm.last_child_post > (now() - interval '1 day') then 't' else 'f' end as new_p from forums_messages_approved fm where fm.forum_id = :forum_id Index: openacs-4/packages/forums/www/index-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/Attic/index-postgresql.xql,v diff -u -N -r1.6 -r1.7 --- openacs-4/packages/forums/www/index-postgresql.xql 16 Jan 2003 13:49:30 -0000 1.6 +++ openacs-4/packages/forums/www/index-postgresql.xql 17 May 2003 10:43:31 -0000 1.7 @@ -10,7 +10,7 @@ from forums_messages where forums_messages.forum_id = forums_forums_enabled.forum_id and parent_id is null) as n_threads, - to_char(last_post, 'YYYY-MM-DD HH24:MI:SS') as last_post_ansi, + to_char(last_post, 'Mon DD YYYY HH24:MI:SS') as last_post, case when last_post > (now() - interval '1 day') then 't' else 'f' end as new_p from forums_forums_enabled where forums_forums_enabled.package_id = :package_id Index: openacs-4/packages/forums/www/message-post.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/message-post.tcl,v diff -u -N -r1.20 -r1.21 --- openacs-4/packages/forums/www/message-post.tcl 20 Jan 2003 12:56:19 -0000 1.20 +++ openacs-4/packages/forums/www/message-post.tcl 17 May 2003 10:43:31 -0000 1.21 @@ -48,9 +48,11 @@ -html {rows 20 cols 60 wrap soft} \ -validate { empty {expr ![empty_string_p [string trim $value]]} { [_ forums.lt_Please_enter_a_messag] } - html { expr {( [string match [set l_html_p [ns_queryget html_p f]] "t"] && [empty_string_p [set v_message [ad_html_security_check $value]]] ) || [string match $l_html_p "f"] } } {} + html { expr {( [string match [set l_html_p [ns_queryget html_p f]] "t"] && [empty_string_p [set v_message [ad_quotehtml [ad_html_security_check $value]]]] ) || [string match $l_html_p "f"] } } + {} } + element create message html_p \ -label [_ forums.Format] \ -datatype text \ @@ -183,10 +185,15 @@ # trim multiple leading Re: regsub {^(\s*Re:\s*)*} $subject {Re: } subject + + # see if they're allowed to add to this thread + forum::security::require_post_message -message_id $parent_id +} else { + # no parent_id, therefore new thread + # require thread creation privs + forum::security::require_post_forum -forum_id $forum_id } -forum::security::require_post_forum -forum_id $forum_id - forum::get -forum_id $forum_id -array forum # Prepare the other data Index: openacs-4/packages/forums/www/message-view.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/www/message-view.tcl,v diff -u -N -r1.17 -r1.18 --- openacs-4/packages/forums/www/message-view.tcl 26 Jan 2003 19:52:35 -0000 1.17 +++ openacs-4/packages/forums/www/message-view.tcl 17 May 2003 10:43:31 -0000 1.18 @@ -17,18 +17,18 @@ set table_bgcolor [parameter::get -parameter table_bgcolor] set table_other_bgcolor [parameter::get -parameter table_other_bgcolor] +# Load up the message information +forum::message::get -message_id $message_id -array message +set message(subject) [ad_quotehtml $message(subject)] + # Check if the user has admin on the message set moderate_p [forum::security::can_moderate_message_p -message_id $message_id] if {!${moderate_p}} { - set post_p [forum::security::can_post_message_p -message_id $message_id] + set post_p [forum::security::can_post_forum_p -forum_id $message(forum_id)] } else { set post_p 1 } -# Load up the message information -forum::message::get -message_id $message_id -array message -set message(subject) [ad_quotehtml $message(subject)] - form create search -action search element create search search_text \ @@ -125,6 +125,16 @@ set reply_url "message-post?[export_vars { { parent_id $last_message_id } }]" } +if { $post_p || [ad_conn user_id] == 0 } { + set rowcount ${responses:rowcount} + if { $rowcount > 0 } { + set last_message_id [set "responses:${rowcount}(message_id)"] + } else { + set last_message_id $message(message_id) + } + set reply_url "message-post?[export_vars { { parent_id $last_message_id } }]" +} + if {[string equal $forum(presentation_type) flat]} { ad_return_template "message-view-flat" } else { Index: openacs-4/packages/gatekeeper/gatekeeper.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/gatekeeper/gatekeeper.info,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/gatekeeper/gatekeeper.info 20 Apr 2001 20:51:11 -0000 1.1 +++ openacs-4/packages/gatekeeper/gatekeeper.info 17 May 2003 10:44:02 -0000 1.2 @@ -16,7 +16,7 @@ 2001-01-19 ArsDigita Corporation - + Index: openacs-4/packages/general-comments/general-comments.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/general-comments/general-comments.info,v diff -u -N -r1.8 -r1.9 --- openacs-4/packages/general-comments/general-comments.info 30 Jan 2003 13:13:39 -0000 1.8 +++ openacs-4/packages/general-comments/general-comments.info 17 May 2003 10:44:33 -0000 1.9 @@ -19,108 +19,10 @@ OpenACS - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Index: openacs-4/packages/general-comments/www/file-add-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/general-comments/www/file-add-2.tcl,v diff -u -N -r1.4 -r1.5 --- openacs-4/packages/general-comments/www/file-add-2.tcl 7 Nov 2002 08:32:49 -0000 1.4 +++ openacs-4/packages/general-comments/www/file-add-2.tcl 17 May 2003 10:45:05 -0000 1.5 @@ -51,17 +51,8 @@ # remove the first . from the file extension regsub {\.} $file_extension "" file_extension -set guessed_file_type [ns_guesstype $upload_file] +set guessed_file_type [cr_filename_to_mime_type -create $upload_file] -# if the guessed_file_type is not an entry in -# cr_mime_types, then set it as null -if { ![db_0or1row is_mime_type_valid { - select mime_type - from cr_mime_types - where mime_type = :guessed_file_type }] } { - set guessed_file_type [db_null] -} - # strip off the C:\directories... crud and just get the file name if ![regexp {([^/\\]+)$} $upload_file match client_filename] { # couldn't find a match Index: openacs-4/packages/general-comments/www/file-add-2.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/general-comments/www/Attic/file-add-2.xql,v diff -u -N --- openacs-4/packages/general-comments/www/file-add-2.xql 31 Oct 2001 20:46:59 -0000 1.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,14 +0,0 @@ - - - - - - - select mime_type - from cr_mime_types - where mime_type = :guessed_file_type - - - - - Index: openacs-4/packages/glossary/glossary.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/glossary/glossary.info,v diff -u -N -r1.5 -r1.6 --- openacs-4/packages/glossary/glossary.info 23 Sep 2002 23:32:21 -0000 1.5 +++ openacs-4/packages/glossary/glossary.info 17 May 2003 10:45:36 -0000 1.6 @@ -24,7 +24,7 @@ glossary's content will be stored in the content repository and its presentation will use the ArsDigita Templating System (ATS). - + Index: openacs-4/packages/logger/todo.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/logger/todo.txt,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/logger/todo.txt 17 May 2003 10:46:08 -0000 1.2 @@ -0,0 +1,5 @@ +*** Questions + +none + +*** TODO Index: openacs-4/packages/monitoring/monitoring.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/monitoring/monitoring.info,v diff -u -N -r1.5 -r1.6 --- openacs-4/packages/monitoring/monitoring.info 23 Aug 2002 03:39:12 -0000 1.5 +++ openacs-4/packages/monitoring/monitoring.info 17 May 2003 10:46:40 -0000 1.6 @@ -19,7 +19,7 @@ OpenACS The monitoring apps from ACS 3.4.x /admin/monitoring directory. Includes Cassandracle, Watchdog, etc. - +