Index: openacs-4/packages/static-pages/sql/postgresql/static-pages-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/static-pages/sql/postgresql/static-pages-create.sql,v diff -u -r1.3 -r1.4 --- openacs-4/packages/static-pages/sql/postgresql/static-pages-create.sql 2 Jul 2001 19:39:43 -0000 1.3 +++ openacs-4/packages/static-pages/sql/postgresql/static-pages-create.sql 24 Jul 2001 19:51:56 -0000 1.4 @@ -24,8 +24,12 @@ parent_id integer constraint sp_folders_parent_id_fk references sp_folders(folder_id), package_id integer constraint sp_folders_package_id_fk - references apm_packages + references apm_packages, + tree_sortkey varchar(4000) ); + + + comment on table sp_folders is ' Holds the folder hierarchy, mirroring the structure of the folders in the content repository. Used for navigating through the static @@ -48,6 +52,84 @@ create index sp_folders_parent_id_idx on sp_folders(parent_id); create index sp_folders_package_id_idx on sp_folders(package_id); +--tree_sortkey index DaveB +create index sp_folders_tree_skey_idx on sp_folders (tree_sortkey); + +-- tree_sortkey triggers DaveB + +create function sp_folders_insert_tr () returns opaque as ' +declare + v_parent_sk varchar; + max_key varchar; +begin + select max(tree_sortkey) into max_key + from sp_folders + where parent_id = new.parent_id; + + select coalesce(max(tree_sortkey),'''') into v_parent_sk + from sp_folders + where folder_id = new.folder_id; + + new.tree_sortkey := v_parent_sk || ''/'' || tree_next_key(max_key); + + return new; + +end;' language 'plpgsql'; + +create trigger sp_folders_insert_tr before insert +on sp_folders for each row +execute procedure sp_folders_insert_tr (); + +create function sp_folders_update_tr () returns opaque as ' +declare + v_parent_sk varchar; + max_key varchar; + v_rec record; + clr_keys_p boolean default ''t''; +begin + if new.folder_id = old.folder_id and + ((new.parent_id = old.parent_id) or + (new.parent_id is null and old.parent_id is null)) then + + return new; + + end if; + + for v_rec in select folder_id + from sp_folders + where tree_sortkey like new.tree_sortkey || ''%'' + order by tree_sortkey + LOOP + if clr_keys_p then + update sp_folders set tree_sortkey = null + where tree_sortkey like new.tree_sortkey || ''%''; + clr_keys_p := ''f''; + end if; + + select max(tree_sortkey) into max_key + from sp_folders + where parent_id = (select parent_id + from sp_folders + where folder_id = v_rec.folder_id); + + select coalesce(max(tree_sortkey),'''') into v_parent_sk + from sp_folders + where folder_id = (select parent_id + from sp_folders + where folder_id = v_rec.folder_id); + + update sp_folders + set tree_sortkey = v_parent_sk || ''/'' || tree_next_key(max_key) + where folder_id = v_rec.folder_id; + + end LOOP; + + return new; + +end;' language 'plpgsql'; +-- end of tree_sortkey triggers DaveB + + -- The title and content of each page will go into cr_revisions. Here -- we record the filename. -- @@ -131,10 +213,11 @@ '; -- Here's where we get our session_ids: -create sequence sp_session_id_seq; -create view sp_session_id_sequence as select nextval('sp_session_id_seq') as nextval; +create sequence sp_session_id_sequence; +create view sp_session_id_seq as select nextval('sp_session_id_sequence') as nextval; + -- this also creates the acs_object type select content_type__create_type ( 'static_page', -- content_type @@ -160,6 +243,7 @@ -- create or replace package body static_page as +-- create or replace package body static_page as create function static_page__new ( integer, -- static_page_id in static_pages.static_page_id%TYPE -- default null, @@ -190,39 +274,49 @@ p_context_id alias for $10; v_item_id static_pages.static_page_id%TYPE; - v_permission_row acs_permissions%ROWTYPE; + v_permission_row RECORD; + v_revision_id integer; + v_is_live boolean default ''t''; + v_mime_type cr_revisions.mime_type%TYPE default ''text/html''; + v_storage_type cr_items.storage_type%TYPE default ''text''; begin -- Create content item; this also makes the content revision. -- One might be tempted to set the content_type to static_page, -- But this would confuse site-wide-search, which expects to -- see a content_type of content_revision. + v_item_id := content_item__new( p_static_page_id, -- item_id - p_folder_id, -- parent_id - p_filename, -- name + p_filename, -- name + p_folder_id, -- parent_id p_title, -- title - ''text/html'', -- mime_type p_creation_date, -- creation_date p_creation_user, -- creation_user - p_creation_ip, -- creation_ip p_context_id, -- context_id - ''t'', -- is_live - p_content -- data + p_creation_ip, -- creation_ip + v_is_live, -- is_live + v_mime_type, -- mime_type + p_content, -- text + v_storage_type, -- storage_type + FALSE -- security_inherit_p ); + -- We want to be able to have non-commentable folders below -- commentable folders. We can''t do this if we leave security -- inheritance enabled. -- - update acs_objects set security_inherit_p = ''f'' - where object_id = v_item_id; +-- uses overloaded content_item__new and acs_object__new to set +-- security_inherit_p to ''f'' DaveB +-- update acs_objects set security_inherit_p = ''f'' +-- where object_id = v_item_id; -- Copy permissions from the parent: - for v_permission_row in ( + for v_permission_row in select grantee_id,privilege from acs_permissions - where object_id = p_folder_id; - ) loop - acs_permission__grant_permission( + where object_id = p_folder_id + loop + perform acs_permission__grant_permission( v_item_id, -- object_id v_permission_row.grantee_id, -- grantee_id v_permission_row.privilege -- privilege @@ -242,6 +336,37 @@ return v_item_id; end;' language 'plpgsql'; +create function static_page__new ( + + integer, -- folder_id in sp_folders.folder_id%TYPE, + varchar, -- filename in static_pages.filename%TYPE default null, + varchar -- title in cr_revisions.title%TYPE default null + ) returns integer as ' + declare + p_folder_id alias for $1; + p_filename alias for $2; + p_title alias for $3; + + v_static_page_id static_pages.static_page_id%TYPE; + v_item_id static_pages.static_page_id%TYPE; + + begin + return static_page__new ( + NULL, -- static_page_id + p_folder_id, -- folder_id + p_filename, -- filename + p_title, -- title + NULL, -- content + ''t'', -- show_comments_p + now(), -- creation_date + NULL, -- creation_user + NULL, -- creation_ip + NULL -- conext_id + ); + +end;' language 'plpgsql'; + + create function static_page__delete ( integer -- static_page_id in static_pages.static_page_id%TYPE ) returns integer as ' @@ -255,25 +380,25 @@ -- Drop all comments on this page. general-comments doesn''t have -- a comment.delete() function, so I just do this (see the -- general-comments drop script): - for v_comment_row in ( + for v_comment_row in select comment_id from general_comments - where object_id = p_static_page_id; - ) loop + where object_id = p_static_page_id + loop delete from images where image_id in ( select latest_revision from cr_items where parent_id = v_comment_row - ); + ); - acs_message__delete(v_comment_row); + PERFORM acs_message__delete(v_comment_row); end loop; -- Delete the page. -- WE SHOULDN''T NEED TO DO THIS: CONTENT_ITEM.DELETE SHOULD TAKE CARE OF -- DELETING FROM STATIC PAGES. delete from static_pages where static_page_id = p_static_page_id; - content_item__delete(p_static_page_id); + PERFORM content_item__delete(p_static_page_id); return 0; end;' language 'plpgsql'; @@ -294,23 +419,31 @@ ); if v_folder_exists_p = 0 then + v_folder_id := static_page__new_folder ( - ''sp_root'', -- name - ''sp_root'' -- label + null, + ''sp_root'', -- name + ''sp_root'', -- label + null, + null, + null, + null, + null, + null ); update sp_folders set package_id = p_package_id where folder_id = v_folder_id; - acs_permission__grant_permission ( + PERFORM acs_permission__grant_permission ( v_folder_id, -- object_id acs__magic_object_id(''the_public''), -- grantee_id ''general_comments_create'' -- privilege ); -- The comments will inherit read permission from the pages, -- so the public should be able to read the static pages. - acs_permission__grant_permission ( + PERFORM acs_permission__grant_permission ( v_folder_id, -- object_id acs__magic_object_id(''the_public''), -- grantee_id ''read'' -- privilege @@ -373,13 +506,14 @@ v_folder_id := content_folder__new ( p_name, -- name p_label, -- label - p_folder_id, -- folder_id + p_description, -- description v_parent_id, -- parent_id - p_description, -- description + p_context_id, -- context_id + p_folder_id, -- folder_id v_creation_date, -- creation_date p_creation_user, -- creation_user - p_creation_ip, -- creation_ip - p_context_id -- context_id + p_creation_ip -- creation_ip + ); if p_parent_id is not null then @@ -394,11 +528,11 @@ where object_id = v_folder_id; -- Copy permissions from the parent: - for v_permission_row in ( + for v_permission_row in select grantee_id,privilege from acs_permissions - where object_id = p_parent_id; - ) loop - acs_permission__grant_permission( + where object_id = p_parent_id + loop + perform acs_permission__grant_permission( v_folder_id, -- object_id v_permission_row.grantee_id, -- grantee_id v_permission_row.privilege -- privilege @@ -410,17 +544,20 @@ -- if it''s a root folder, allow it to contain static pages and -- other folders (subfolders will inherit these properties) - content_folder__register_content_type ( + PERFORM content_folder__register_content_type ( v_folder_id, -- folder_id - ''static_page'' -- content_type + ''static_page'', -- content_type + ''f'' ); - content_folder__register_content_type ( + PERFORM content_folder__register_content_type ( v_folder_id, -- folder_id - ''content_revision'' -- content_type + ''content_revision'', -- content_type + ''f'' ); - content_folder__register_content_type ( + PERFORM content_folder__register_content_type ( v_folder_id, -- folder_id - ''content_folder'' -- content_type + ''content_folder'', -- content_type + ''f'' ); end if; @@ -435,22 +572,23 @@ v_folder_row sp_folders.folder_id%TYPE; v_page_row static_pages.static_page_id%TYPE; begin - for v_folder_row in ( + for v_folder_row in select folder_id from ( - select folder_id,level as path_depth from sp_folders - start with folder_id = p_folder_id - connect by parent_id = prior folder_id; + select folder_id, tree_level(''folder_id'') as path_depth from sp_folders + where tree_sortkey like ( select tree_sortkey || ''%'' + from sp_folders + where folder_id = p_folder_id) ) order by path_depth desc - ) loop - for v_page_row in ( + loop + for v_page_row in select static_page_id from static_pages - where folder_id = v_folder_row; - ) loop + where folder_id = v_folder_row + loop static_page__delete(v_page_row); end loop; delete from sp_folders where folder_id = v_folder_row; - content_folder__delete(v_folder_row); + PERFORM content_folder__delete(v_folder_row); end loop; end;' language 'plpgsql'; @@ -462,27 +600,34 @@ p_session_id alias for $1; p_package_id alias for $2; v_root_folder_id sp_folders.folder_id%TYPE; - v_stale_file_row static_pages.static_page_id%TYPE; - v_stale_folder_row sp_folders.folder_id%TYPE; + v_stale_file_row static_pages%ROWTYPE; + v_stale_folder_row sp_folders%ROWTYPE; begin v_root_folder_id := static_page__get_root_folder(p_package_id); -- First delete all files that are descendants of the root folder - -- but aren''t in sp_extant_files: - -- - for v_stale_file_row in ( + -- but aren''t in sp_extant_files + + for v_stale_file_row in select static_page_id from static_pages - where folder_id in ( - select folder_id from sp_folders - start with folder_id = v_root_folder_id - connect by parent_id = prior folder_id - ) and static_page_id not in ( - select static_page_id - from sp_extant_files - where session_id = p_session_id - ); - ) loop - static_page__delete(v_stale_file_row); + where static_page_id not in ( + select static_page_id + from sp_extant_files + where session_id = p_session_id + ) + +-- where folder_id in ( +-- select folder_id from sp_folders +-- where tree_sortkey like ( select tree_sortkey || ''%'' +-- from sp_folders +-- where folder_id = v_root_folder_id) +-- ) and static_page_id not in ( +-- select static_page_id +-- from sp_extant_files +-- where session_id = p_session_id +-- ) + loop + PERFORM static_page__delete(v_stale_file_row); end loop; -- Now delete all folders that aren''t in sp_extant_folders. There are two @@ -493,7 +638,7 @@ -- show up in the filesystem search, so it will be missing from -- sp_extant_folders. -- - for v_stale_folder_row in ( + for v_stale_folder_row in select dead.folder_id from (select folder_id from sp_folders where (folder_id) not in ( @@ -502,22 +647,23 @@ where session_id = p_session_id ) ) dead, - (select folder_id,level as depth from sp_folders - start with folder_id = v_root_folder_id - connect by parent_id = prior folder_id + (select folder_id,tree_level(''folder_id'') as depth from sp_folders + where tree_sortkey like ( select tree_sortkey || ''%'' + from sp_folders + where folder_id = v_root_folder_id) ) path where dead.folder_id = path.folder_id and dead.folder_id <> v_root_folder_id - order by path.depth desc; - ) loop + order by path.depth desc + loop delete from sp_folders where folder_id = v_stale_folder_row; - content_folder__delete(v_stale_folder_row); + perform content_folder__delete(v_stale_folder_row); end loop; return 0; end;' language 'plpgsql'; - + create function static_page__grant_permission ( integer, -- item_id in acs_permissions.object_id%TYPE, integer, -- grantee_id in acs_permissions.grantee_id%TYPE, @@ -534,34 +680,36 @@ begin if recursive_p = ''t'' then -- For each folder that is a descendant of item_id, grant. - for v_folder_row in ( + for v_folder_row in select folder_id from sp_folders - start with folder_id = p_item_id - connect by parent_id = prior folder_id; - ) loop - acs_permission__grant_permission( + where tree_sortkey like ( select tree_sortkey || ''%'' + from sp_folders + where folder_id = p_item_id) + loop + perform acs_permission__grant_permission( v_folder_row, -- object_id p_grantee_id, -- grantee_id p_privilege -- privilege ); end loop; -- For each file that is a descendant of item_id, grant. - for file_row in ( + for file_row in select static_page_id from static_pages where folder_id in ( select folder_id from sp_folders - start with folder_id = p_item_id - connect by parent_id = prior folder_id - ); - ) loop + where tree_sortkey like ( select tree_sortkey || ''%'' + from sp_folders + where folder_id = p_item_id) + ) + loop acs_permission__grant_permission( v_file_row, -- object_id p_grantee_id, -- grantee_id p_privilege -- privilege ); end loop; else - acs_permission__grant_permission( + perform acs_permission__grant_permission( p_item_id, -- object_id p_grantee_id, -- grantee_id p_privilege -- privilege @@ -586,34 +734,36 @@ begin if p_recursive_p = ''t'' then -- For each folder that is a descendant of item_id, revoke. - for v_folder_row in ( + for v_folder_row in select folder_id from sp_folders - start with folder_id = p_item_id - connect by parent_id = prior folder_id; - ) loop - acs_permission__revoke_permission( + where tree_sortkey like ( select tree_sortkey || ''%'' + from sp_folders + where folder_id = p_item_id) + loop + perform acs_permission__revoke_permission( v_folder_row, -- object_id p_grantee_id, -- grantee_id p_privilege -- privilege ); end loop; -- For each file that is a descendant of item_id, revoke. - for v_file_row in ( + for v_file_row in select static_page_id from static_pages where folder_id in ( select folder_id from sp_folders - start with folder_id = p_item_id - connect by parent_id = prior folder_id; + where tree_sortkey like ( select tree_sortkey || ''%'' + from sp_folders + where folder_id = p_item_id) ) - ) loop - acs_permission__revoke_permission( + loop + perform acs_permission__revoke_permission( v_file_row, -- object_id p_grantee_id, -- grantee_id p_privilege -- privilege ); end loop; else - acs_permission__revoke_permission( + perform acs_permission__revoke_permission( p_item_id, -- object_id p_grantee_id, -- grantee_id p_privilege -- privilege Index: openacs-4/packages/static-pages/sql/postgresql/static-pages-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/static-pages/sql/postgresql/static-pages-drop.sql,v diff -u -r1.2 -r1.3 --- openacs-4/packages/static-pages/sql/postgresql/static-pages-drop.sql 6 May 2001 19:54:15 -0000 1.2 +++ openacs-4/packages/static-pages/sql/postgresql/static-pages-drop.sql 24 Jul 2001 19:51:56 -0000 1.3 @@ -20,9 +20,9 @@ declare v_root_folder_row sp_folders.folder_id%TYPE; begin - for v_root_folder_row in ( - select folder_id from sp_folders where parent_id is null; - ) loop + for v_root_folder_row in + select folder_id from sp_folders where parent_id is null + loop static_page__delete_folder(v_root_folder_row); end loop; return 0; @@ -33,14 +33,19 @@ drop function inline__0(); +-- FIXME this won't work until content_type__drop_attribute in +-- acs-content-repository/sql/postgresql/content-type.sql is fixed DaveB + -- Delete content type 'static_page' and its attributes. -select content_type__drop_type ( - 'static_page', -- content_type +select content_type__drop_type ( + 'static_page', -- content_type 't', -- drop_children_p 'f' -- drop_table_p ); + + select drop_package('static_page'); drop sequence sp_session_id_seq; Index: openacs-4/packages/static-pages/tcl/static-pages-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/static-pages/tcl/static-pages-procs-postgresql.xql,v diff -u -r1.2 -r1.3 --- openacs-4/packages/static-pages/tcl/static-pages-procs-postgresql.xql 6 May 2001 19:54:35 -0000 1.2 +++ openacs-4/packages/static-pages/tcl/static-pages-procs-postgresql.xql 24 Jul 2001 19:51:56 -0000 1.3 @@ -47,10 +47,11 @@ - select static_page.new( + select static_page__new( + :parent_folder_id, -- folder_id :file, -- filename - :page_title, -- title - :parent_folder_id -- folder_id + :page_title -- title + ); @@ -69,10 +70,13 @@ - static_page__delete_stale_items(:sync_session_id,:package_id); - - delete from sp_extant_folders where session_id = :sync_session_id; - delete from sp_extant_files where session_id = :sync_session_id; + begin + perform static_page__delete_stale_items(:sync_session_id,:package_id); +-- delete from sp_extant_folders where session_id = :sync_session_id; +-- + delete from sp_extant_files where session_id = :sync_session_id; + return null; + end;