Index: openacs-4/packages/file-storage/file-storage.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/file-storage.info,v diff -u -N -r1.17.2.8 -r1.17.2.9 --- openacs-4/packages/file-storage/file-storage.info 9 Nov 2003 20:57:36 -0000 1.17.2.8 +++ openacs-4/packages/file-storage/file-storage.info 15 Nov 2003 18:17:12 -0000 1.17.2.9 @@ -7,14 +7,14 @@ f f - + Dave Bauer This application allows users to collaboratively maintain documents on the web server 2003-11-09 OpenACS Now allows storage of files on the filesystem or database. - + Index: openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql,v diff -u -N -r1.4.2.4 -r1.4.2.5 --- openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql 23 Jun 2003 18:47:02 -0000 1.4.2.4 +++ openacs-4/packages/file-storage/sql/oracle/file-storage-package-create.sql 15 Nov 2003 18:17:12 -0000 1.4.2.5 @@ -27,7 +27,8 @@ -- 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 + description in cr_folders.description%TYPE default null, + name in cr_items.name%TYPE default null ) return fs_root_folders.folder_id%TYPE; function new_file( @@ -205,7 +206,8 @@ -- 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 + description in cr_folders.description%TYPE default null, + name in cr_items.name%TYPE default null ) return fs_root_folders.folder_id%TYPE is v_folder_id fs_root_folders.folder_id%TYPE; @@ -234,7 +236,7 @@ end if; v_folder_id := content_folder.new( - name => v_package_key || '_' || package_id, + name => nvl(new_root_folder.name,v_package_key || '_' || package_id), label => v_folder_name, description => v_description ); 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.2.5 -r1.8.2.6 --- openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql 9 Nov 2003 03:36:56 -0000 1.8.2.5 +++ openacs-4/packages/file-storage/sql/postgresql/file-storage-package-create.sql 15 Nov 2003 18:17:12 -0000 1.8.2.6 @@ -6,7 +6,7 @@ -- @cvs-id $Id$ -- -create function file_storage__get_root_folder ( +create or replace function file_storage__get_root_folder ( -- -- Returns the root folder corresponding to a particular -- package instance. @@ -37,7 +37,7 @@ end;' language 'plpgsql' with (iscachable); -create function file_storage__get_package_id ( +create or replace function file_storage__get_package_id ( integer -- cr_items.item_id%TYPE ) returns integer as ' -- fs_root_folders.package_id%TYPE declare @@ -162,7 +162,7 @@ end;' language 'plpgsql'; -create function file_storage__new_file( +create or replace function file_storage__new_file( -- -- Create a file in CR in preparation for actual storage -- Wrapper for content_item__new @@ -177,7 +177,7 @@ integer -- cr_items.item_id%TYPE, ) returns integer as ' -- cr_items.item_id%TYPE declare - new_file__title alias for $1; + new_file__name alias for $1; new_file__folder_id alias for $2; new_file__user_id alias for $3; new_file__creation_ip alias for $4; @@ -189,7 +189,7 @@ if new_file__indb_p then v_item_id := content_item__new ( - new_file__title, -- name + new_file__name, -- name new_file__folder_id, -- parent_id new_file__item_id, -- item_id (default) null, -- locale (default) @@ -207,7 +207,7 @@ ); else v_item_id := content_item__new ( - new_file__title, -- name + new_file__name, -- name new_file__folder_id, -- parent_id new_file__item_id, -- item_id (default) null, -- locale (default) @@ -234,23 +234,23 @@ end;' language 'plpgsql'; -create function file_storage__new_file( +create or replace function file_storage__new_file( varchar, -- cr_items.name%TYPE, integer, -- cr_items.parent_id%TYPE, integer, -- acs_objects.creation_user%TYPE, varchar, -- acs_objects.creation_ip%TYPE, boolean -- store in db? ) returns integer as ' -- cr_items.item_id%TYPE declare - new_file__title alias for $1; + new_file__name alias for $1; new_file__folder_id alias for $2; new_file__user_id alias for $3; new_file__creation_ip alias for $4; new_file__indb_p alias for $5; begin return file_storage__new_file( - new_file__title, + new_file__name, new_file__folder_id, new_file__user_id, new_file__creation_ip, @@ -261,7 +261,7 @@ end;' language 'plpgsql'; -create function file_storage__delete_file ( +create or replace function file_storage__delete_file ( -- -- Delete a file and all its version -- Wrapper to content_item__delete @@ -277,7 +277,7 @@ end;' language 'plpgsql'; -create function file_storage__rename_file ( +create or replace function file_storage__rename_file ( -- -- Rename a file and all -- Wrapper to content_item__rename @@ -287,19 +287,19 @@ ) returns integer as ' declare rename_file__file_id alias for $1; - rename_file__title alias for $2; + rename_file__name alias for $2; begin return content_item__rename( rename_file__file_id, -- item_id - rename_file__title -- name + rename_file__name -- name ); end;' language 'plpgsql'; -create function file_storage__copy_file( +create or replace function file_storage__copy_file( -- -- Copy a file, but only copy the live_revision -- @@ -313,7 +313,7 @@ copy_file__target_folder_id alias for $2; copy_file__creation_user alias for $3; copy_file__creation_ip alias for $4; - v_title cr_items.name%TYPE; + v_name cr_items.name%TYPE; v_live_revision cr_items.live_revision%TYPE; v_filename cr_revisions.title%TYPE; v_description cr_revisions.description%TYPE; @@ -334,7 +334,7 @@ then true else false end) - into v_title,v_live_revision,v_filename,v_description,v_mime_type,v_content_length,v_indb_p + into v_name,v_live_revision,v_filename,v_description,v_mime_type,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 @@ -343,7 +343,7 @@ -- We should probably use the copy functions of CR -- when we optimize this function v_new_file_id := file_storage__new_file( - v_title, -- title + v_name, -- name copy_file__target_folder_id, -- folder_id copy_file__creation_user, -- creation_user copy_file__creation_ip, -- creation_ip @@ -401,7 +401,7 @@ end;' language 'plpgsql'; -create function file_storage__move_file ( +create or replace function file_storage__move_file ( -- -- Move a file (ans all its versions) to a different folder. -- Wrapper for content_item__move @@ -427,7 +427,7 @@ end;' language 'plpgsql'; -create function file_storage__get_title ( +create or replace function file_storage__get_title ( -- -- Unfortunately, title in the file-storage context refers -- to the name attribute in cr_items, not the title attribute in @@ -464,7 +464,7 @@ end;' language 'plpgsql'; -create function file_storage__get_parent_id ( +create or replace function file_storage__get_parent_id ( integer -- item_id in cr_items.item_id%TYPE ) returns integer as ' -- cr_items.item_id%TYPE declare @@ -482,7 +482,7 @@ end;'language 'plpgsql'; -create function file_storage__get_content_type ( +create or replace function file_storage__get_content_type ( -- -- Wrapper for content_item__get_content_type integer -- cr_items.item_id%TYPE @@ -498,7 +498,7 @@ -create function file_storage__get_folder_name ( +create or replace function file_storage__get_folder_name ( -- -- Wrapper for content_folder__get_label integer -- cr_folders.folder_id%TYPE @@ -513,7 +513,7 @@ end;' language 'plpgsql'; -create function file_storage__new_version ( +create or replace function file_storage__new_version ( -- -- Create a new version of a file -- Wrapper for content_revision__new @@ -565,7 +565,7 @@ end;' language 'plpgsql'; -create function file_storage__delete_version ( +create or replace function file_storage__delete_version ( -- -- Delete a version of a file -- @@ -605,7 +605,7 @@ end;' language 'plpgsql'; -create function file_storage__new_folder( +create or replace function file_storage__new_folder( -- -- Create a folder -- @@ -675,7 +675,7 @@ end;' language 'plpgsql'; -create function file_storage__delete_folder( +create or replace function file_storage__delete_folder( -- -- Delete a folder -- @@ -693,7 +693,7 @@ -- JS: BEFORE DELETE TRIGGER to clean up CR entries (except root folder) -create function fs_package_items_delete_trig () returns opaque as ' +create or replace function fs_package_items_delete_trig () returns opaque as ' declare v_rec record; @@ -756,7 +756,7 @@ -- JS: AFTER DELETE TRIGGER to clean up last CR entry -create function fs_root_folder_delete_trig () returns opaque as ' +create or replace function fs_root_folder_delete_trig () returns opaque as ' begin PERFORM content_folder__delete(old.folder_id); return null; Index: openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6.2-4.6.3.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6.2-4.6.3.sql,v diff -u -N --- openacs-4/packages/file-storage/sql/postgresql/upgrade/upgrade-4.6.2-4.6.3.sql 23 Jun 2003 18:47:03 -0000 1.1.2.1 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,253 +0,0 @@ --- Add user_id and IP to update_last_modified --- $Id - -create function file_storage__new_file( - -- - -- Create a file in CR in preparation for actual storage - -- Wrapper for content_item__new - -- - -- DRB: I added this version to allow one to predefine item_id, among other things to - -- make it easier to use with ad_form - varchar, -- cr_items.name%TYPE, - integer, -- cr_items.parent_id%TYPE, - integer, -- acs_objects.creation_user%TYPE, - varchar, -- acs_objects.creation_ip%TYPE, - boolean, -- store in db? - integer -- cr_items.item_id%TYPE, -) returns integer as ' -- cr_items.item_id%TYPE -declare - new_file__title alias for $1; - new_file__folder_id alias for $2; - new_file__user_id alias for $3; - new_file__creation_ip alias for $4; - new_file__indb_p alias for $5; - new_file__item_id alias for $6; - v_item_id integer; -begin - - if new_file__indb_p - then - v_item_id := content_item__new ( - new_file__title, -- name - new_file__folder_id, -- parent_id - new_file__item_id, -- item_id (default) - null, -- locale (default) - now(), -- creation_date (default) - new_file__user_id, -- creation_user - new_file__folder_id, -- context_id - new_file__creation_ip, -- creation_ip - ''content_item'', -- item_subtype (default) - ''file_storage_object'', -- content_type (needed by site-wide search) - null, -- title (default) - null, -- description - ''text/plain'', -- mime_type (default) - null, -- nls_language (default) - null -- data (default) - ); - else - v_item_id := content_item__new ( - new_file__title, -- name - new_file__folder_id, -- parent_id - new_file__item_id, -- item_id (default) - null, -- locale (default) - now(), -- creation_date (default) - new_file__user_id, -- creation_user - new_file__folder_id, -- context_id - new_file__creation_ip, -- creation_ip - ''content_item'', -- item_subtype (default) - ''file_storage_object'', -- content_type (needed by site-wide search) - null, -- title (default) - null, -- description - ''text/plain'', -- mime_type (default) - null, -- nls_language (default) - null, -- text (default) - ''file'' -- storage_type - ); - - end if; - - perform acs_object__update_last_modified(new_file__folder_id,new_file__user_id,new_file__creation_ip); - - return v_item_id; - -end;' language 'plpgsql'; - - -create function file_storage__copy_file( - -- - -- Copy a file, but only copy the live_revision - -- - integer, -- cr_items.item_id%TYPE, - integer, -- cr_items.parent_id%TYPE, - integer, -- acs_objects.creation_user%TYPE, - varchar -- acs_objects.creation_ip%TYPE -) returns integer as ' -- cr_revisions.revision_id%TYPE -declare - copy_file__file_id alias for $1; - copy_file__target_folder_id alias for $2; - copy_file__creation_user alias for $3; - copy_file__creation_ip alias for $4; - 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_id cr_revisions.lob%TYPE; - v_new_lob_id cr_revisions.lob%TYPE; - v_file_path cr_revisions.content%TYPE; - v_new_file_id cr_items.item_id%TYPE; - v_new_version_id cr_revisions.revision_id%TYPE; - v_indb_p boolean; -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_length, - (case when i.storage_type = ''lob'' - then true - else false - end) - into v_title,v_live_revision,v_filename,v_description,v_mime_type,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 = 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( - v_title, -- title - copy_file__target_folder_id, -- folder_id - copy_file__creation_user, -- creation_user - copy_file__creation_ip, -- creation_ip - v_indb_p -- indb_p - ); - - v_new_version_id := file_storage__new_version ( - v_filename, -- title - v_description, -- description - v_mime_type, -- mime_type - v_new_file_id, -- item_id - copy_file__creation_user, -- creation_user - copy_file__creation_ip -- creation_ip - ); - - if v_indb_p - then - - -- Lob to copy from - select lob into v_lob_id - from cr_revisions - where revision_id = v_live_revision; - - -- New lob id - v_new_lob_id := empty_lob(); - - -- copy the blob - perform lob_copy(v_lob_id,v_new_lob_id); - - -- Update the lob id on the new version - update cr_revisions - set lob = v_new_lob_id, - content_length = v_content_length - where revision_id = v_new_version_id; - - else - - -- For now, we simply copy the file name - select content into v_file_path - from cr_revisions - where revision_id = v_live_revision; - - -- Update the file path - update cr_revisions - set content = v_file_path, - content_length = v_content_length - where revision_id = v_new_version_id; - - end if; - - perform acs_object__update_last_modified(copy_file__target_folder_id,copy_file__creation_user,copy_file__creation_ip); - - return v_new_version_id; - -end;' language 'plpgsql'; - - -create function file_storage__move_file ( - -- - -- Move a file (ans all its versions) to a different folder. - -- Wrapper for content_item__move - -- - integer, -- cr_folders.folder_id%TYPE, - integer -- cr_folders.folder_id%TYPE -) returns integer as ' -- 0 for success -declare - move_file__file_id alias for $1; - move_file__target_folder_id alias for $2; - move_file__creation_user alias for $3; - move_file__creation_ip alias for $4; -begin - - perform content_item__move( - move_file__file_id, -- item_id - move_file__target_folder_id -- target_folder_id - ); - - perform acs_object__update_last_modified(move_file__target_folder_id,move_file__creation_user,move_file__creation_ip); - - return 0; -end;' language 'plpgsql'; - -create function file_storage__new_version ( - -- - -- Create a new version of a file - -- Wrapper for content_revision__new - -- - varchar, -- cr_revisions.title%TYPE, - varchar, -- cr_revisions.description%TYPE, - varchar, -- cr_revisions.mime_type%TYPE, - integer, -- cr_items.item_id%TYPE, - integer, -- acs_objects.creation_user%TYPE, - varchar -- acs_objects.creation_ip%TYPE -) returns integer as ' -- cr_revisions.revision_id -declare - new_version__filename alias for $1; - new_version__description alias for $2; - new_version__mime_type alias for $3; - new_version__item_id alias for $4; - new_version__creation_user alias for $5; - new_version__creation_ip alias for $6; - 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 ( - new_version__filename, -- title - new_version__description, -- description - now(), -- publish_date - new_version__mime_type, -- mime_type - null, -- nls_language - null, -- data (default) - new_version__item_id, -- item_id - null, -- revision_id - now(), -- creation_date - new_version__creation_user, -- creation_user - new_version__creation_ip -- creation_ip - ); - - -- Make live the newly created revision - perform content_item__set_live_revision(v_revision_id); - - select cr_items.parent_id - into v_folder_id - from cr_items - where cr_items.item_id = new_version__item_id; - - perform acs_object__update_last_modified(v_folder_id,new_version__creation_user,new_version__creation_ip); - - return v_revision_id; - -end;' language 'plpgsql'; - Index: openacs-4/packages/file-storage/tcl/file-storage-dav-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/file-storage-dav-procs.tcl,v diff -u -N -r1.1.2.1 -r1.1.2.2 --- openacs-4/packages/file-storage/tcl/file-storage-dav-procs.tcl 9 Nov 2003 20:56:45 -0000 1.1.2.1 +++ openacs-4/packages/file-storage/tcl/file-storage-dav-procs.tcl 15 Nov 2003 18:17:12 -0000 1.1.2.2 @@ -29,7 +29,7 @@ set tmp_filename [oacs_dav::conn tmpfile] set tmp_size [file size $tmp_filename] # authenticate that user has write privilege - +ns_log notice "OACS-DAV File Storage PUT tmp_filename $tmp_filename tmp_size $tmp_size" # we need to calculate parent_id from the URI # it might not be the root DAV folder for the package # check for folder or not Index: openacs-4/packages/file-storage/tcl/file-storage-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/file-storage-procs.tcl,v diff -u -N -r1.25.2.7 -r1.25.2.8 --- openacs-4/packages/file-storage/tcl/file-storage-procs.tcl 9 Nov 2003 20:56:45 -0000 1.25.2.7 +++ openacs-4/packages/file-storage/tcl/file-storage-procs.tcl 15 Nov 2003 18:17:12 -0000 1.25.2.8 @@ -200,6 +200,7 @@ -pretty_name $sn(instance_name) \ -name $name } + ad_proc -public fs::new_root_folder { {-package_id ""} {-pretty_name ""} @@ -627,6 +628,15 @@ set mime_type [cr_filename_to_mime_type -create $name] set tmp_size [file size $tmp_filename] + switch [cr_registered_type_for_mime_type $mime_type] { + image { + set content_type "image" + } + default { + set content_type "file_storage_object" + } + } + db_transaction { if {[empty_string_p $item_id] || ![db_string item_exists ""]} { set item_id [db_exec_plsql create_item ""] Index: openacs-4/packages/file-storage/www/index.vuh =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/www/index.vuh,v diff -u -N -r1.1.2.1 -r1.1.2.2 --- openacs-4/packages/file-storage/www/index.vuh 10 Nov 2003 02:44:25 -0000 1.1.2.1 +++ openacs-4/packages/file-storage/www/index.vuh 15 Nov 2003 18:17:12 -0000 1.1.2.2 @@ -10,6 +10,12 @@ set extra_uri [ad_conn path_info] set root_folder [fs_get_root_folder] set file_item_id [fs::get_item_id -name $extra_uri -folder_id $root_folder] +ns_log debug "File Storage index.vuh item_id=$file_item_id URL=[ad_conn url]" +if {[empty_string_p $file_item_id]} { + ns_log debug "File Storage return not found" + ns_return 404 text/plain "File Not Found" + ad_script_abort +} permission::require_permission \ -object_id $file_item_id \ -privilege read \