Index: openacs-4/packages/acs-content-repository/acs-content-repository.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/acs-content-repository.info,v diff -u -N -r1.99 -r1.100 --- openacs-4/packages/acs-content-repository/acs-content-repository.info 6 Jul 2011 19:13:24 -0000 1.99 +++ openacs-4/packages/acs-content-repository/acs-content-repository.info 11 Jul 2011 09:38:09 -0000 1.100 @@ -7,7 +7,7 @@ t t - + OpenACS The canonical repository for OpenACS content. 2010-06-17 @@ -20,7 +20,7 @@ GPL 3 - + Index: openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-5.8.0d1-5.8.0d2.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-5.8.0d1-5.8.0d2.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-5.8.0d1-5.8.0d2.sql 11 Jul 2011 09:38:09 -0000 1.1 @@ -0,0 +1,683 @@ + +--- geting rid of backslashes used with the purpose of scaping + +-- function is_assigned +select define_function_args ('content_keyword__is_assigned','item_id,keyword_id,recurse;none'); +-- +-- procedure content_keyword__is_assigned/3 +-- +CREATE OR REPLACE FUNCTION content_keyword__is_assigned( + is_assigned__item_id integer, + is_assigned__keyword_id integer, + is_assigned__recurse varchar -- default 'none' + +) RETURNS boolean AS $$ +DECLARE + v_ret boolean; + v_is_assigned__recurse varchar; +BEGIN + if is_assigned__recurse is null then + v_is_assigned__recurse := 'none'; + else + v_is_assigned__recurse := is_assigned__recurse; + end if; + + -- Look for an exact match + if v_is_assigned__recurse = 'none' then + return count(*) > 0 from cr_item_keyword_map + where item_id = is_assigned__item_id + and keyword_id = is_assigned__keyword_id; + end if; + + -- Look from specific to general + if v_is_assigned__recurse = 'up' then + return count(*) > 0 + where exists (select 1 + from (select keyword_id from cr_keywords c, cr_keywords c2 + where c2.keyword_id = is_assigned__keyword_id + and c.tree_sortkey between c2.tree_sortkey and tree_right(c2.tree_sortkey)) t, + cr_item_keyword_map m + where t.keyword_id = m.keyword_id + and m.item_id = is_assigned__item_id); + end if; + + if v_is_assigned__recurse = 'down' then + return count(*) > 0 + where exists (select 1 + from (select k2.keyword_id + from cr_keywords k1, cr_keywords k2 + where k1.keyword_id = is_assigned__keyword_id + and k1.tree_sortkey between k2.tree_sortkey and tree_right(k2.tree_sortkey)) t, + cr_item_keyword_map m + where t.keyword_id = m.keyword_id + and m.item_id = is_assigned__item_id); + + end if; + + -- Tried none, up and down - must be an invalid parameter + raise EXCEPTION '-20000: The recurse parameter to content_keyword.is_assigned should be ''none'', ''up'' or ''down'''; + + return null; +END; +$$ LANGUAGE plpgsql stable; + +select define_function_args('content_item__generic_move','item_id,target_item_id,name'); + + +-- getting rid of extra end if on function + +-- +-- procedure content_item__generic_move/3 +-- +CREATE OR REPLACE FUNCTION content_item__generic_move( + move__item_id integer, + move__target_item_id integer, + move__name varchar +) RETURNS integer AS $$ +DECLARE +BEGIN + + if move__target_item_id is null then + raise exception 'attempt to move item_id % to null folder_id', move__item_id; + end if; + + if content_folder__is_folder(move__item_id) = 't' then + + PERFORM content_folder__move(move__item_id, move__target_item_id); + + elsif content_folder__is_folder(move__target_item_id) = 't' then + + if content_folder__is_registered(move__target_item_id, + content_item__get_content_type(move__item_id),'f') = 't' and + content_folder__is_registered(move__target_item_id, + content_item__get_content_type(content_symlink__resolve(move__item_id)),'f') = 't' + then + end if; + end if; + + -- update the parent_id for the item + + update cr_items + set parent_id = move__target_item_id, + name = coalesce(move__name, name) + where item_id = move__item_id; + + -- GN: the following "end if" appears to be not needed + -- end if; + + if move__name is not null then + update acs_objects + set title = move__name + where object_id = move__item_id; + end if; + + return 0; +END; +$$ LANGUAGE plpgsql; + + +--- Removing 7.2 vs 7.3 querying + +select define_function_args('content_type__refresh_trigger','content_type'); +-- +-- procedure content_type__refresh_trigger/1 +-- +CREATE OR REPLACE FUNCTION content_type__refresh_trigger( + refresh_trigger__content_type varchar +) RETURNS integer AS $$ +DECLARE + rule_text text default ''; + function_text text default ''; + v_table_name acs_object_types.table_name%TYPE; + type_rec record; +BEGIN + + -- get the table name for the content type (determines view name) + raise NOTICE 'refresh trigger for % ', refresh_trigger__content_type; + + -- Since we allow null table name use object type if table name is null so + -- we still can have a view. + select coalesce(table_name,object_type) + into v_table_name + from acs_object_types + where object_type = refresh_trigger__content_type; + + --=================== start building rule code ======================= + + function_text := function_text || + 'create or replace function ' || v_table_name || '_f (p_new '|| v_table_name || 'i) + returns void as '' + declare + v_revision_id integer; + begin + + select content_revision__new( + p_new.title, + p_new.description, + now(), + p_new.mime_type, + p_new.nls_language, + case when p_new.text is null + then p_new.data + else p_new.text + end, + content_symlink__resolve(p_new.item_id), + p_new.revision_id, + now(), + p_new.creation_user, + p_new.creation_ip, + p_new.object_package_id + ) into v_revision_id; + '; + + -- add an insert statement for each subtype in the hierarchy for this type + + for type_rec in select ot2.object_type, tree_level(ot2.tree_sortkey) as level + from acs_object_types ot1, acs_object_types ot2 + where ot2.object_type <> 'acs_object' + and ot2.object_type <> 'content_revision' + and ot1.object_type = refresh_trigger__content_type + and ot1.tree_sortkey between ot2.tree_sortkey and tree_right(ot2.tree_sortkey) + and ot1.table_name is not null + order by level asc + LOOP + function_text := function_text || ' ' || content_type__trigger_insert_statement(type_rec.object_type) || '; + '; + end loop; + + function_text := function_text || ' + return; + end;'' language ''plpgsql''; + '; + -- end building the rule definition code + + -- create the new function + execute function_text; + + rule_text := 'create rule ' || v_table_name || '_r as on insert to ' || + v_table_name || 'i do instead SELECT ' || v_table_name || '_f(new); ' ; + --================== done building rule code ======================= + + -- drop the old rule + if rule_exists(v_table_name || '_r', v_table_name || 'i') then + execute 'drop rule ' || v_table_name || '_r ' || 'on ' || v_table_name || 'i'; + end if; + + -- create the new rule for inserts on the content type + execute rule_text; + + return null; + +END; +$$ LANGUAGE plpgsql; + +select define_function_args('content_type__drop_type','content_type,drop_children_p;f,drop_table_p;f,drop_objects_p;f'); +-- +-- procedure content_type__drop_type/4 +-- +CREATE OR REPLACE FUNCTION content_type__drop_type( + drop_type__content_type varchar, + drop_type__drop_children_p boolean, -- default 'f' + drop_type__drop_table_p boolean, -- default 'f' + drop_type__drop_objects_p boolean -- default 'f' + +) RETURNS integer AS $$ +DECLARE + table_exists_p boolean; + v_table_name varchar; + is_subclassed_p boolean; + child_rec record; + attr_row record; + revision_row record; + item_row record; +BEGIN + + -- first we'll rid ourselves of any dependent child types, if any , + -- along with their own dependent grandchild types + + select + count(*) > 0 into is_subclassed_p + from + acs_object_types + where supertype = drop_type__content_type; + + -- this is weak and will probably break; + -- to remove grand child types, the process will probably + -- require some sort of querying for drop_type + -- methods within the children's packages to make + -- certain there are no additional unanticipated + -- restraints preventing a clean drop + + if drop_type__drop_children_p and is_subclassed_p then + + for child_rec in select + object_type + from + acs_object_types + where + supertype = drop_type__content_type + LOOP + PERFORM content_type__drop_type(child_rec.object_type, 't', drop_type__drop_table_p, drop_type__drop_objects_p); + end LOOP; + + end if; + + -- now drop all the attributes related to this type + for attr_row in select + attribute_name + from + acs_attributes + where + object_type = drop_type__content_type + LOOP + PERFORM content_type__drop_attribute(drop_type__content_type, + attr_row.attribute_name, + 'f' + ); + end LOOP; + + -- we'll remove the associated table if it exists + select + table_exists(lower(table_name)) into table_exists_p + from + acs_object_types + where + object_type = drop_type__content_type; + + if table_exists_p and drop_type__drop_table_p then + select + table_name into v_table_name + from + acs_object_types + where + object_type = drop_type__content_type; + + -- drop the rule and input/output views for the type + -- being dropped. + -- FIXME: this did not exist in the oracle code and it needs to be + -- tested. Thanks to Vinod Kurup for pointing this out. + -- The rule dropping might be redundant as the rule might be dropped + -- when the view is dropped. + + -- different syntax for dropping a rule in 7.2 and 7.3 so check which + -- version is being used (olah). + + execute 'drop table ' || v_table_name || ' cascade'; + + end if; + + -- If we are dealing with a revision, delete the revision with revision__delete + -- This way the integrity constraint with live revision is dealt with correctly + if drop_type__drop_objects_p then + for revision_row in + select revision_id + from cr_revisions, acs_objects + where revision_id = object_id + and object_type = drop_type__content_type + loop + PERFORM content_revision__delete(revision_row.revision_id); + end loop; + + for item_row in + select item_id + from cr_items + where content_type = drop_type__content_type + loop + PERFORM content_item__delete(item_row.item_id); + end loop; + + end if; + + PERFORM acs_object_type__drop_type(drop_type__content_type, drop_type__drop_objects_p); + + return 0; +END; +$$ LANGUAGE plpgsql; + + +-- geting right definition of function's arguments + +select define_function_args('cr_items_get_tree_sortkey','item_id'); +select define_function_args('cr_keywords_get_tree_sortkey','keyword_id'); +select define_function_args('content_extlink__new','name;null,url,label;null,description;null,parent_id,extlink_id;null,creation_date;now,creation_user;null,creation_ip;null,package_id;null'); +select define_function_args('content_extlink__delete','extlink_id'); +select define_function_args('content_extlink__is_extlink','item_id'); +select define_function_args('content_extlink__copy','extlink_id,target_folder_id,creation_user,creation_ip;null,name'); +select define_function_args('content_folder__new','name,label,description;null,parent_id;null,context_id;null,folder_id;null,creation_date;now,creation_user;null,creation_ip;null,security_inherit_p;t,package_id;null'); +select define_function_args('content_folder__del','folder_id,cascade_p;f'); +select define_function_args('content_folder__delete','folder_id,cascade_p;f'); +select define_function_args('content_folder__edit_name','folder_id,name;null,label;null,description;null'); +select define_function_args('content_folder__move','folder_id,target_folder_id,name;null'); +select define_function_args('content_folder__copy','folder_id,target_folder_id,creation_user,creation_ip;null,name;null'); +select define_function_args('content_folder__is_folder','item_id'); +select define_function_args('content_folder__is_sub_folder','folder_id,target_folder_id'); +select define_function_args('content_folder__is_empty','folder_id'); +select define_function_args('content_folder__register_content_type','folder_id,content_type,include_subtypes;f'); +select define_function_args('content_folder__unregister_content_type','folder_id,content_type,include_subtypes;f'); +select define_function_args('content_folder__is_registered','folder_id,content_type,include_subtypes;f'); +select define_function_args('content_folder__get_label','folder_id'); +select define_function_args('content_folder__get_index_page','folder_id'); +select define_function_args('content_folder__is_root','folder_id'); +select define_function_args('image__new','name,parent_id;null,item_id;null,revision_id;null,mime_type;jpeg,creation_user;null,creation_ip;null,relation_tag;null,title;null,description;null,is_live;f,publish_date;now(),path,file_size,height,width,package_id;null'); +select define_function_args('image__new_revision','item_id,revision_id,title,description,publish_date,mime_type,nls_language,creation_user,creation_ip,height,width,package_id'); +select define_function_args('image__delete','v_item_id'); +select define_function_args('content_item__get_root_folder','item_id;null'); +select define_function_args('content_item__new','name,parent_id;null,item_id;null,locale;null,creation_date;now,creation_user;null,context_id;null,creation_ip;null,item_subtype;content_item,content_type;content_revision,title;null,description;null,mime_type;text/plain,nls_language;null,text;null,data;null,relation_tag;null,is_live;f,storage_type;null,package_id;null'); +select define_function_args('content_item__is_published','item_id'); +select define_function_args('content_item__is_publishable','item_id'); +select define_function_args('content_item__is_valid_child','item_id,content_type,relation_tag'); +select define_function_args('content_item__del','item_id'); +select define_function_args('content_item__delete','item_id'); +select define_function_args('content_item__edit_name','item_id,name'); +select define_function_args('content_item__get_id','item_path,root_folder_id;null,resolve_index;f'); +select define_function_args('content_item__get_path','item_id,root_folder_id;null'); +select define_function_args('content_item__get_virtual_path','item_id,root_folder_id;-100'); +select define_function_args('content_item__write_to_file','item_id,root_path'); +select define_function_args('content_item__register_template','item_id,template_id,use_context'); +select define_function_args('content_item__unregister_template','item_id,template_id;null,use_context;null'); +select define_function_args('content_item__get_template','item_id,use_context'); +select define_function_args('content_item__get_content_type','item_id'); +select define_function_args('content_item__get_live_revision','item_id'); +select define_function_args('content_item__get_live_revision','item_id'); +select define_function_args('content_item__set_live_revision','revision_id,publish_status;ready'); +select define_function_args('content_item__set_live_revision','revision_id,publish_status;ready'); +select define_function_args('content_item__unset_live_revision','item_id'); +select define_function_args('content_item__set_release_period','item_id,start_when;null,end_when;null'); +select define_function_args('content_item__get_revision_count','item_id'); +select define_function_args('content_item__get_revision_count','item_id'); +select define_function_args('content_item__get_context','item_id'); +select define_function_args('content_item__move','item_id,target_folder_id,name'); +select define_function_args('content_item__generic_move','item_id,target_item_id,name'); +select define_function_args('content_item__copy2','item_id,target_folder_id,creation_user,creation_ip;null'); +select define_function_args('content_item__copy','item_id,target_folder_id,creation_user,creation_ip;null,name;null'); +select define_function_args('content_item__get_latest_revision','item_id'); +select define_function_args('content_item__get_best_revision','item_id'); +select define_function_args('content_item__get_title','item_id,is_live;f'); +select define_function_args('content_item__get_publish_date','item_id,is_live;f'); +select define_function_args('content_item__is_subclass','object_type,supertype'); +select define_function_args('content_item__relate','item_id,object_id,relation_tag;generic,order_n;null,relation_type;cr_item_rel'); +select define_function_args('content_item__unrelate','rel_id'); +select define_function_args('content_item__unrelate','rel_id'); +select define_function_args('content_item__is_index_page','item_id,folder_id'); +select define_function_args('content_item__is_index_page','item_id,folder_id'); +select define_function_args('content_item__get_parent_folder','item_id'); +select define_function_args ('content_keyword__get_heading','keyword_id'); +select define_function_args ('content_keyword__get_description','keyword_id'); +select define_function_args ('content_keyword__set_heading','keyword_id,heading'); +select define_function_args ('content_keyword__set_description','keyword_id,description'); +select define_function_args ('content_keyword__is_leaf','keyword_id'); +select define_function_args('content_keyword__new','heading,description;null,parent_id;null,keyword_id;null,creation_date;now,creation_user;null,creation_ip;null,object_type;content_keyword'); +select define_function_args ('content_keyword__del','keyword_id'); +select define_function_args('content_keyword__delete','keyword_id'); +select define_function_args ('content_keyword__item_assign','item_id,keyword_id,context_id;null,creation_user;null,creation_ip;null'); +select define_function_args ('content_keyword__item_unassign','item_id,keyword_id'); +select define_function_args ('content_keyword__is_assigned','item_id,keyword_id,recurse;none'); +select define_function_args ('content_keyword__get_path','keyword_id'); +select define_function_args('content_permission__inherit_permissions','parent_object_id,child_object_id,child_creator_id;null'); +select define_function_args('content_permission__has_grant_authority','object_id,holder_id,privilege'); +select define_function_args('content_permission__has_revoke_authority','object_id,holder_id,privilege,revokee_id'); +select define_function_args('content_permission__grant_permission_h','object_id,grantee_id,privilege'); +select define_function_args('content_permission__grant_permission','object_id,holder_id,privilege,recepient_id,is_recursive;f,object_type;content_item'); +select define_function_args('content_permission__revoke_permission_h','object_id,revokee_id,privilege'); +select define_function_args('content_permission__revoke_permission','object_id,holder_id,privilege,revokee_id,is_recursive;f,object_type;content_item'); +select define_function_args('content_permission__permission_p','object_id,holder_id,privilege'); +select define_function_args('content_revision__new','title,description;null,publish_date;now(),mime_type;text/plain,nls_language;null,text; ,item_id,revision_id;null,creation_date;now(),creation_user;null,creation_ip;null,content_length;null,package_id;null'); +select define_function_args('content_revision__copy_attributes','content_type,revision_id,copy_id'); +select define_function_args('content_revision__copy','revision_id,copy_id;null,target_item_id;null,creation_user;null,creation_ip;null'); +select define_function_args('content_revision__del','revision_id'); +select define_function_args('content_revision__delete','revision_id'); +select define_function_args('content_revision__get_number','revision_id'); +select define_function_args('content_revision__revision_name','revision_id'); +select define_function_args('content_revision__to_html','revision_id'); +select define_function_args('content_revision__is_live','revision_id'); +select define_function_args('content_revision__is_latest','revision_id'); +select define_function_args('content_revision__to_temporary_clob','revision_id'); +select define_function_args('content_revision__content_copy','revision_id,revision_id_dest;null'); +select define_function_args('content_revision__get_content','revision_id'); +select define_function_args('content_symlink__new','name;null,label;null,target_id,parent_id,symlink_id;null,creation_date;now,creation_user;null,creation_ip;null,package_id;null'); +select define_function_args('content_symlink__delete','symlink_id'); +select define_function_args('content_symlink__del','symlink_id'); +select define_function_args('content_symlink__is_symlink','item_id'); +select define_function_args('content_symlink__copy','symlink_id,target_folder_id,creation_user,creation_ip;null,name;null'); +select define_function_args('content_symlink__resolve','item_id'); +select define_function_args('content_symlink__resolve_content_type','item_id'); +select define_function_args('content_template__new','name,parent_id;null,template_id;null,creation_date;now,creation_user;null,creation_ip;null,text;null,is_live;f'); +select define_function_args('content_template__del','template_id'); +select define_function_args('content_template__delete','template_id'); +select define_function_args('content_template__is_template','template_id'); +select define_function_args('content_template__get_path','template_id,root_folder_id;content_template_globals.c_root_folder_id'); +select define_function_args('content_test__save_val','v_id,v_name'); +select define_function_args('content_type__create_type','content_type,supertype;content_revision,pretty_name,pretty_plural,table_name,id_column;XXX,name_method;null'); +select define_function_args('content_type__drop_type','content_type,drop_children_p;f,drop_table_p;f,drop_objects_p;f'); +select define_function_args('content_type__drop_type','content_type,drop_children_p;f,drop_table_p;f,drop_objects_p;f'); +select define_function_args('content_type__create_attribute','content_type,attribute_name,datatype,pretty_name,pretty_plural;null,sort_order;null,default_value;null,column_spec;text'); +select define_function_args('content_type__drop_attribute','content_type,attribute_name,drop_column;f'); +select define_function_args('content_type__register_template','content_type,template_id,use_context,is_default;f'); +select define_function_args('content_type__set_default_template','content_type,template_id,use_context'); +select define_function_args('content_type__get_template','content_type,use_context'); +select define_function_args('content_type__unregister_template','content_type;null,template_id,use_context;null'); +select define_function_args('content_type__trigger_insert_statement','content_type'); +select define_function_args('content_type__refresh_trigger','content_type'); +select define_function_args('content_type__refresh_view','content_type'); +select define_function_args('content_type__register_child_type','parent_type,child_type,relation_tag;generic,min_n;0,max_n;null'); +select define_function_args('content_type__register_child_type','parent_type,child_type,relation_tag;generic,min_n;0,max_n;null'); +select define_function_args('content_type__unregister_child_type','parent_type,child_type,relation_tag'); +select define_function_args('content_type__register_relation_type','content_type,target_type,relation_tag;generic,min_n;0,max_n;null'); +select define_function_args('content_type__unregister_relation_type','content_type,target_type,relation_tag;null'); +select define_function_args('content_type__register_mime_type','content_type,mime_type'); +select define_function_args('content_type__unregister_mime_type','content_type,mime_type'); +select define_function_args('content_type__is_content_type','object_type'); +select define_function_args('content_type__rotate_template','template_id,v_content_type,use_context'); +select define_function_args('table_exists','table_name'); +select define_function_args('column_exists','table_name,column_name'); +select define_function_args('trigger_exists','trigger_name,on_table'); +select define_function_args('trigger_func_exists','trigger_name'); +select define_function_args('rule_exists','rule_name,table_name'); +select define_function_args('doc__get_proc_header','proc_name,package_name'); +select define_function_args('doc__get_package_header','package_name'); + + +-- right return type for fuctions used in triggers and right naming +-- vguerra - NOTE: ALTER TRIGGER could be used for renaming the triggers but it +-- is available starting from PG 8.2 on, so for backwards compatibility +-- we simply drop and recreate the triggers. + +-- +-- procedure cr_revision_del_ri_tr/0 +-- +CREATE OR REPLACE FUNCTION cr_revision_del_ri_tr( + +) RETURNS trigger AS $$ +DECLARE + dummy integer; + v_latest integer; + v_live integer; +BEGIN + select 1 into dummy + from + cr_revisions + where + revision_id = old.live_revision; + + if FOUND then + raise EXCEPTION 'Referential Integrity: live_revision still exists: %', old.live_revision; + end if; + + select 1 into dummy + from + cr_revisions + where + revision_id = old.latest_revision; + + if FOUND then + raise EXCEPTION 'Referential Integrity: latest_revision still exists: %', old.latest_revision; + end if; + + return old; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- procedure cr_revision_ins_ri_tr/0 +-- +CREATE OR REPLACE FUNCTION cr_revision_ins_ri_tr( + +) RETURNS trigger AS $$ +DECLARE + dummy integer; + v_latest integer; + v_live integer; +BEGIN + select 1 into dummy + from + cr_revisions + where + revision_id = new.live_revision; + + if NOT FOUND and new.live_revision is NOT NULL then + raise EXCEPTION 'Referential Integrity: live_revision does not exist: %', new.live_revision; + end if; + + select 1 into dummy + from + cr_revisions + where + revision_id = new.latest_revision; + + if NOT FOUND and new.latest_revision is NOT NULL then + raise EXCEPTION 'Referential Integrity: latest_revision does not exist: %', new.latest_revision; + end if; + + return new; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- procedure cr_revision_up_ri_tr/0 +-- +CREATE OR REPLACE FUNCTION cr_revision_up_ri_tr( + +) RETURNS trigger AS $$ +DECLARE + dummy integer; + v_latest integer; + v_live integer; +BEGIN + select 1 into dummy + from + cr_revisions + where + revision_id = new.live_revision; + + if NOT FOUND and new.live_revision <> old.live_revision and new.live_revision is NOT NULL then + raise EXCEPTION 'Referential Integrity: live_revision does not exist: %', new.live_revision; + end if; + + select 1 into dummy + from + cr_revisions + where + revision_id = new.latest_revision; + + if NOT FOUND and new.latest_revision <> old.latest_revision and new.latest_revision is NOT NULL then + raise EXCEPTION 'Referential Integrity: latest_revision does not exist: %', new.latest_revision; + end if; + + return new; +END; +$$ LANGUAGE plpgsql; + + + +-- +-- procedure cr_revision_del_rev_ri_tr/0 +-- +CREATE OR REPLACE FUNCTION cr_revision_del_rev_ri_tr( + +) RETURNS trigger AS $$ +DECLARE + dummy integer; +BEGIN + select 1 into dummy + from + cr_items + where + item_id = old.item_id + and + live_revision = old.revision_id; + + if FOUND then + raise EXCEPTION 'Referential Integrity: attempting to delete live_revision: %', old.revision_id; + end if; + + select 1 into dummy + from + cr_items + where + item_id = old.item_id + and + latest_revision = old.revision_id; + + if FOUND then + raise EXCEPTION 'Referential Integrity: attempting to delete latest_revision: %', old.revision_id; + end if; + + return old; +END; +$$ LANGUAGE plpgsql; + +-- +-- procedure cr_cleanup_cr_files_del_tr/0 +-- +CREATE OR REPLACE FUNCTION cr_cleanup_cr_files_del_tr( + +) RETURNS trigger AS $$ +DECLARE + +BEGIN + insert into cr_files_to_delete + select r.content as path, i.storage_area_key + from cr_items i, cr_revisions r + where i.item_id = r.item_id + and r.revision_id = old.revision_id + and i.storage_type = 'file'; + + return old; +END; +$$ LANGUAGE plpgsql; + +create trigger cr_revision_del_ri_tr +after delete on cr_items +for each row execute procedure cr_revision_del_ri_tr(); + +create trigger cr_revision_up_ri_tr +after update on cr_items +for each row execute procedure cr_revision_up_ri_tr(); + +create trigger cr_revision_ins_ri_tr +after insert on cr_items +for each row execute procedure cr_revision_ins_ri_tr(); + +create trigger cr_revision_del_rev_ri_tr +after delete on cr_revisions +for each row execute procedure cr_revision_del_rev_ri_tr(); + +create trigger cr_cleanup_cr_files_del_tr +before delete on cr_revisions +for each row execute procedure cr_cleanup_cr_files_del_tr(); + +drop trigger cr_revision_del_ri_trg on cr_items; +drop trigger cr_revision_up_ri_trg on cr_items; +drop trigger cr_revision_ins_ri_trg on cr_items; +drop trigger cr_revision_del_rev_ri_trg on cr_revisions; +drop trigger cr_cleanup_cr_files_del_trg on cr_revisions; + +drop function cr_revision_del_ri_trg(); +drop function cr_revision_up_ri_trg(); +drop function cr_revision_ins_ri_trg(); +drop function cr_revision_del_rev_ri_trg(); +drop function cr_cleanup_cr_files_del_trg(); Index: openacs-4/packages/acs-kernel/acs-kernel.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/acs-kernel.info,v diff -u -N -r1.123 -r1.124 --- openacs-4/packages/acs-kernel/acs-kernel.info 6 Jul 2011 19:13:24 -0000 1.123 +++ openacs-4/packages/acs-kernel/acs-kernel.info 11 Jul 2011 09:38:09 -0000 1.124 @@ -7,15 +7,15 @@ t t - + OpenACS Core Team Routines and data models providing the foundation for OpenACS-based Web services. 2010-06-17 OpenACS The OpenACS kernel contains the core datamodel create and drop scripts for such things as objects, groups, partiies and the supporting PL/SQL and PL/pgSQL procedures. 3 - + Index: openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.8.0d1-5.8.0d2.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.8.0d1-5.8.0d2.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.8.0d1-5.8.0d2.sql 11 Jul 2011 09:38:09 -0000 1.1 @@ -0,0 +1,310 @@ +-- getting rid of backslashes using for escaping + +-- +-- procedure drop_package/1 +-- +CREATE OR REPLACE FUNCTION drop_package( + package_name varchar +) RETURNS varchar AS $$ +DECLARE + v_rec record; + v_drop_cmd varchar; + v_pkg_name varchar; +BEGIN + raise NOTICE 'DROP PACKAGE: %', package_name; + v_pkg_name := package_name || '__' || '%'; + + for v_rec in select proname + from pg_proc + where proname like v_pkg_name + order by proname + LOOP + raise NOTICE 'DROPPING FUNCTION: %', v_rec.proname; + v_drop_cmd := get_func_drop_command (v_rec.proname::varchar); + EXECUTE v_drop_cmd; + end loop; + + if NOT FOUND then + raise NOTICE 'PACKAGE: % NOT FOUND', package_name; + else + raise NOTICE 'PACKAGE: %: DROPPED', package_name; + end if; + + return null; + +END; +$$ LANGUAGE plpgsql; + + + +-- +-- procedure get_func_definition/2 +-- +CREATE OR REPLACE FUNCTION get_func_definition( + fname varchar, + args oidvector +) RETURNS text AS $$ +DECLARE + nargs integer default 0; + v_pos integer; + v_funcdef text default ''; + v_args varchar; + v_one_arg varchar; + v_one_type varchar; + v_nargs integer; + v_src text; + v_rettype varchar; +BEGIN + select proargtypes, pronargs, number_src(prosrc), + (select typname from pg_type where oid = p.prorettype::integer) + into v_args, v_nargs, v_src, v_rettype + from pg_proc p + where proname = fname::name + and proargtypes = args; + + v_funcdef := v_funcdef || ' +create or replace function ' || fname || '('; + + v_pos := position(' ' in v_args); + + while nargs < v_nargs loop + nargs := nargs + 1; + if nargs = v_nargs then + v_one_arg := v_args; + v_args := ''; + else + v_one_arg := substr(v_args, 1, v_pos - 1); + v_args := substr(v_args, v_pos + 1); + v_pos := position(' ' in v_args); + end if; + select case when nargs = 1 + then typname + else ',' || typname + end into v_one_type + from pg_type + where oid = v_one_arg::integer; + v_funcdef := v_funcdef || v_one_type; + end loop; + v_funcdef := v_funcdef || ') returns ' || v_rettype || E' as ''\n' || v_src || ''' language ''plpgsql'';'; + + return v_funcdef; + +END; +$$ LANGUAGE plpgsql stable strict; + +-- geting right definition of function's arguments + +select define_function_args('acs__add_user','user_id;null,object_type;user,creation_date;now(),creation_user;null,creation_ip;null,authority_id,username,email,url;null,first_names,last_name,password,salt,screen_name;null,email_verified_p;t,member_state;approved'); +select define_function_args('acs__remove_user','user_id'); +select define_function_args('acs__magic_object_id','name'); +select define_function_args('acs_log__notice','log_key,message'); +select define_function_args('acs_log__warn','log_key,message'); +select define_function_args('acs_log__error','log_key,message'); +select define_function_args('acs_log__debug','log_key,message'); +select define_function_args('acs_object_type_get_tree_sortkey','object_type'); +select define_function_args('acs_object_type__create_type','object_type,pretty_name,pretty_plural,supertype,table_name;null,id_column;null,package_name;null,abstract_p;f,type_extension_table;null,name_method;null,create_table_p;f,dynamic_p;f'); +select define_function_args('acs_object_type__drop_type','object_type,drop_children_p;f,drop_table_p;f'); +select define_function_args('acs_object_type__pretty_name','object_type'); +select define_function_args('acs_object_type__is_subtype_p','object_type_1,object_type_2'); +select define_function_args('acs_attribute__create_attribute','object_type,attribute_name,datatype,pretty_name,pretty_plural;null,table_name;null,column_name;null,default_value;null,min_n_values;1,max_n_values;1,sort_order;null,storage;type_specific,static_p;f,create_column_p;f,database_type;null,size;null,null_p;t,references;null,check_expr;null,column_spec;null'); +select define_function_args('acs_attribute__drop_attribute','object_type,attribute_name,drop_column_p;f'); +select define_function_args('acs_attribute__add_description','object_type,attribute_name,description_key,description'); +select define_function_args('acs_attribute__drop_description','object_type,attribute_name,description_key'); +select define_function_args('acs_datatype__date_output_function','attribute_name'); +select define_function_args('acs_datatype__timestamp_output_function','attribute_name'); +select define_function_args('acs_objects_get_tree_sortkey','object_id'); +select define_function_args('acs_object__initialize_attributes','initialize_attributes__object_id'); +select define_function_args('acs_object__new','object_id;null,object_type;acs_object,creation_date;now(),creation_user;null,creation_ip;null,context_id;null,security_inherit_p;t,title;null,package_id;null'); +select define_function_args('acs_object__delete','object_id'); +select define_function_args('acs_object__name','name__object_id'); +select define_function_args('acs_object__default_name','default_name__object_id'); +select define_function_args('acs_object__object_id','p_object_id'); +select define_function_args('acs_object__package_id','object_id'); +select define_function_args('acs_object__get_attribute_storage','object_id_in,attribute_name_in'); +select define_function_args('acs_object__get_attr_storage_column','v_vals'); +select define_function_args('acs_object__get_attr_storage_table','v_vals'); +select define_function_args('acs_object__get_attr_storage_sql','v_vals'); +select define_function_args('acs_object__get_attribute','object_id_in,attribute_name_in'); +select define_function_args('acs_object__set_attribute','object_id_in,attribute_name_in,value_in'); +select define_function_args('acs_object__check_context_index','check_context_index__object_id,check_context_index__ancestor_id,check_context_index__n_generations'); +select define_function_args('acs_object__check_object_ancestors','object_id,ancestor_id,n_generations'); +select define_function_args('acs_object__check_object_descendants','object_id,descendant_id,n_generations'); +select define_function_args('acs_object__check_path','check_path__object_id,check_path__ancestor_id'); +select define_function_args('acs_object__check_representation','check_representation__object_id'); +select define_function_args('acs_object__update_last_modified','update_last_modified__object_id,update_last_modified__modifying_user,update_last_modified__modifying_ip,update_last_modified__last_modified;now()'); +select define_function_args('acs_object_util__object_type_exist_p','object_type'); +select define_function_args('acs_object_util__get_object_type','object_id'); +select define_function_args('acs_object_util__type_ancestor_type_p','object_type1,object_type2'); +select define_function_args('acs_object_util__object_ancestor_type_p','object_id,object_type'); +select define_function_args('acs_object_util__object_type_p','object_id,object_type'); +select define_function_args('priv_recurse_subtree','nkey,child_priv'); +select define_function_args('acs_privilege__create_privilege','privilege,pretty_name;null,pretty_plural;null'); +select define_function_args('acs_privilege__drop_privilege','privilege'); +select define_function_args('acs_privilege__add_child','privilege,child_privilege'); +select define_function_args('acs_privilege__remove_child','privilege,child_privilege'); +select define_function_args('acs_permission__grant_permission','object_id,grantee_id,privilege'); +select define_function_args('acs_permission__revoke_permission','object_id,grantee_id,privilege'); +select define_function_args('acs_permission__permission_p','object_id,party_id,privilege'); +select define_function_args('acs_rel_type__create_role','role,pretty_name;null,pretty_plural;null'); +select define_function_args('acs_rel_type__drop_role','role'); +select define_function_args('acs_rel_type__role_pretty_name','role'); +select define_function_args('acs_rel_type__role_pretty_plural','role'); +select define_function_args('acs_rel_type__create_type','rel_type,pretty_name,pretty_plural,supertype;relationship,table_name,id_column,package_name,object_type_one,role_one;null,min_n_rels_one,max_n_rels_one,object_type_two,role_two;null,min_n_rels_two,max_n_rels_two'); +select define_function_args('acs_rel_type__drop_type','rel_type,cascade_p;f'); +select define_function_args('acs_rel__new','rel_id;null,rel_type;relationship,object_id_one,object_id_two,context_id;null,creation_user;null,creation_ip;null'); +select define_function_args('acs_rel__delete','rel_id'); +select define_function_args('apm__register_package','package_key,pretty_name,pretty_plural,package_uri,package_type,initial_install_p;f,singleton_p;f,implements_subsite_p;f,inherit_templates_p;f,spec_file_path;null,spec_file_mtime;null'); +select define_function_args('apm__update_package','package_key,pretty_name;null,pretty_plural;null,package_uri;null,package_type;null,initial_install_p;null,singleton_p;null,implements_subsite_p;f,inherit_templates_p;f,spec_file_path;null,spec_file_mtime;null'); +select define_function_args('apm__unregister_package','package_key,cascade_p;t'); +select define_function_args('apm__register_p','package_key'); +select define_function_args('apm__register_application','package_key,pretty_name,pretty_plural,package_uri,initial_install_p;f,singleton_p;f,implements_subsite_p;f,inherit_templates_p;f,spec_file_path;null,spec_file_mtime;null'); +select define_function_args('apm__unregister_application','package_key,cascade_p;f'); +select define_function_args('apm__register_service','package_key,pretty_name,pretty_plural,package_uri,initial_install_p;f,singleton_p;f,implements_subsite_p;f,inherit_templates_p;f,spec_file_path;null,spec_file_mtime;null'); +select define_function_args('apm__unregister_service','package_key,cascade_p;f'); +select define_function_args('apm__register_parameter','parameter_id;null,package_key,parameter_name,description;null,scope,datatype;string,default_value;null,section_name;null,min_n_values;1,max_n_values;1'); +select define_function_args('apm__update_parameter','parameter_id,parameter_name;null,description;null,datatype;string,default_value;null,section_name;null,min_n_values;1,max_n_values;1'); +select define_function_args('apm__parameter_p','package_key,parameter_name'); +select define_function_args('apm__unregister_parameter','parameter_id;null'); +select define_function_args('apm__id_for_name','package_key,parameter_name'); +select define_function_args('apm__get_value','package_key,parameter_name'); +select define_function_args('apm__set_value','package_key,parameter_name,attr_value'); +select define_function_args('apm_package__is_child','parent_package_key,child_package_key'); +select define_function_args('apm_package__initialize_parameters','package_id,package_key'); +select define_function_args('apm_package__new','package_id;null,instance_name;null,package_key,object_type;apm_package,creation_date;now(),creation_user;null,creation_ip;null,context_id;null'); +select define_function_args('apm_package__delete','package_id'); +select define_function_args('apm_package__initial_install_p','package_key'); +select define_function_args('apm_package__singleton_p','package_key'); +select define_function_args('apm_package__num_instances','package_key'); +select define_function_args('apm_package__name','package_id'); +select define_function_args('apm_package__highest_version','package_key'); +select define_function_args('apm_package__parent_id','parent_id__package_id'); +select define_function_args('apm_package_version__new','version_id;null,package_key,version_name;null,version_uri,summary,description_format,description,release_date,vendor,vendor_uri,auto_mount,installed_p;f,data_model_loaded_p;f'); +select define_function_args('apm_package_version__delete','version_id'); +select define_function_args('apm_package_version__enable','version_id'); +select define_function_args('apm_package_version__disable','version_id'); +select define_function_args('apm_package_version__copy','version_id,new_version_id;null,new_version_name,new_version_uri,copy_owners_p'); +select define_function_args('apm_package_version__edit','new_version_id;null,version_id,version_name;null,version_uri,summary,description_format,description,release_date,vendor,vendor_uri,auto_mount,installed_p;f,data_model_loaded_p;f'); +select define_function_args('apm_package_version__add_interface','interface_id;null,version_id,interface_uri,interface_version'); +select define_function_args('apm_package_version__remove_interface','interface_uri,interface_version,version_id'); +select define_function_args('apm_package_version__add_dependency','dependency_type,dependency_id;null,version_id,dependency_uri,dependency_version'); +select define_function_args('apm_package_version__remove_dependency','dependency_uri,dependency_version,version_id'); +select define_function_args('apm_package_version__sortable_version_name','version_name'); +select define_function_args('apm_package_version__version_name_greater','version_name_one,version_name_two'); +select define_function_args('apm_package_version__upgrade_p','path,initial_version_name,final_version_name'); +select define_function_args('apm_package_version__upgrade','version_id'); +select define_function_args('apm_package_type__create_type','package_key,pretty_name,pretty_plural,package_uri,package_type,initial_install_p,singleton_p,implements_subsite_p,inherit_templates_p,spec_file_path;null,spec_file_mtime;null'); +select define_function_args('apm_package_type__update_type','package_key,pretty_name;null,pretty_plural;null,package_uri;null,package_type;null,initial_install_p;null,singleton_p;null,implements_subsite_p;null,inherit_templates_p;null,spec_file_path;null,spec_file_mtime;null'); +select define_function_args('apm_package_type__drop_type','package_key,cascade_p;f'); +select define_function_args('apm_package_type__num_parameters','package_key'); +select define_function_args('apm_parameter_value__new','value_id;null,package_id,parameter_id,attr_value'); +select define_function_args('apm_parameter_value__delete','value_id;null'); +select define_function_args('apm_application__new','application_id;null,instance_name;null,package_key,object_type;apm_application,creation_date;now(),creation_user;null,creation_ip;null,context_id;null'); +select define_function_args('apm_application__delete','application_id'); +select define_function_args('apm_service__new','service_id;null,instance_name;null,package_key,object_type;apm_service,creation_date;now(),creation_user;null,creation_ip;null,context_id;null'); +select define_function_args('apm_service__delete','service_id'); +select define_function_args('authority__new','authority_id;null,object_type;authority,short_name,pretty_name,enabled_p;t,sort_order,auth_impl_id;null,pwd_impl_id;null,forgotten_pwd_url;null,change_pwd_url;null,register_impl_id;null,register_url;null,help_contact_text;null,creation_user;null,creation_ip;null,context_id;null'); +select define_function_args('authority__del','authority_id'); +select define_function_args('party__new','party_id;null,object_type;party,creation_date;now(),creation_user;null,creation_ip;null,email,url;null,context_id;null'); +select define_function_args('party__delete','party_id'); +select define_function_args('party__name','party_id'); +select define_function_args('party__email','party_id'); +select define_function_args('person__new','person_id;null,object_type;person,creation_date;now(),creation_user;null,creation_ip;null,email,url;null,first_names,last_name,context_id;null'); +select define_function_args('person__delete','person_id'); +select define_function_args('person__name','person_id'); +select define_function_args('person__first_names','person_id'); +select define_function_args('person__last_name','person_id'); +select define_function_args('user__new','user_id,object_type;user,creation_date;now(),creation_user,creation_ip,authority_id,username,email,url,first_names,last_name,password,salt,screen_name,email_verified_p;t,context_id'); +select define_function_args('acs_user__new','user_id;null,object_type;user,creation_date;now(),creation_user;null,creation_ip;null,authority_id,username,email,url;null,first_names,last_name,password,salt,screen_name;null,email_verified_p;t,context_id;null'); +select define_function_args('acs_user__receives_alerts_p','user_id'); +select define_function_args('acs_user__approve_email','user_id'); +select define_function_args('acs_user__unapprove_email','user_id'); +select define_function_args('acs_user__delete','user_id'); +select define_function_args('composition_rel__new','rel_id;null,rel_type;composition_rel,object_id_one,object_id_two,creation_user;null,creation_ip;null'); +select define_function_args('composition_rel__delete','rel_id'); +select define_function_args('composition_rel__check_path_exists_p','component_id,container_id'); +select define_function_args('composition_rel__check_index','component_id,container_id'); +select define_function_args('composition_rel__check_representation','rel_id'); +select define_function_args('membership_rel__new','rel_id;null,rel_type;membership_rel,object_id_one,object_id_two,member_state;approved,creation_user;null,creation_ip;null'); +select define_function_args('membership_rel__ban','rel_id'); +select define_function_args('membership_rel__approve','rel_id'); +select define_function_args('membership_rel__reject','rel_id'); +select define_function_args('membership_rel__unapprove','rel_id'); +select define_function_args('membership_rel__deleted','rel_id'); +select define_function_args('membership_rel__delete','rel_id'); +select define_function_args('membership_rel__merge','rel_id'); +select define_function_args('membership_rel__check_index','group_id,member_id,container_id'); +select define_function_args('membership_rel__check_representation','rel_id'); +select define_function_args('acs_group__new','group_id;null,object_type;group,creation_date;now(),creation_user;null,creation_ip;null,email;null,url;null,group_name,join_policy;null,context_id;null'); +select define_function_args('acs_group__delete','group_id'); +select define_function_args('acs_group__name','group_id'); +select define_function_args('acs_group__member_p','party_id,group_id,cascade_membership'); +select define_function_args('acs_group__check_representation','group_id'); +select define_function_args('admin_rel__new','rel_id;null,rel_type;admin_rel,object_id_one,object_id_two,member_state;approved,creation_user;null,creation_ip;null'); +select define_function_args('admin_rel__delete','rel_id'); +select define_function_args('group_contains_p','group_id,component_id,rel_id'); +select define_function_args('journal_entry__new','journal_id;null,object_id,action,action_pretty;null,creation_date;now(),creation_user;null,creation_ip;null,msg;null'); +select define_function_args('journal_entry__delete','journal_id'); +select define_function_args('journal_entry__delete_for_object','object_id'); +select define_function_args('lob_get_data','lob_id'); +select define_function_args('lob_copy','from_id,to_id'); +select define_function_args('lob_length','id'); +select define_function_args('instr','str,pat,dir,cnt'); +select define_function_args('split','string,split_char,element'); +select define_function_args('get_func_drop_command','fname'); +select define_function_args('drop_package','package_name'); +select define_function_args('number_src','v_src'); +select define_function_args('get_func_definition','fname,args'); +select define_function_args('get_func_header','fname,args'); +select define_function_args('int_to_tree_key','intkey'); +select define_function_args('tree_key_to_int','tree_key,level'); +select define_function_args('tree_ancestor_key','tree_key,level'); +select define_function_args('tree_root_key','tree_key'); +select define_function_args('tree_leaf_key_to_int','tree_key'); +select define_function_args('tree_next_key','parent_key,child_value'); +select define_function_args('tree_increment_key','child_sort_key'); +select define_function_args('tree_left','key'); +select define_function_args('tree_right','key'); +select define_function_args('tree_level','tree_key'); +select define_function_args('tree_ancestor_p','potential_ancestor,potential_child'); +select define_function_args('define_function_args','function,arg_list'); +select define_function_args('trigger_type','tgtype'); +select define_function_args('rel_constraint__new','constraint_id;null,constraint_type;rel_constraint,constraint_name,rel_segment,rel_side;two,required_rel_segment,context_id;null,creation_user;null,creation_ip;null'); +select define_function_args('rel_constraint__delete','constraint_id'); +select define_function_args('rel_constraint__get_constraint_id','rel_segment,rel_side,required_rel_segment'); +select define_function_args('rel_constraint__violation','rel_id'); +select define_function_args('rel_constraint__violation_if_removed','rel_id'); +select define_function_args('rel_segment__new','segment_id;null,object_type;rel_segment,creation_date;now(),creation_user;null,creation_ip;null,email;null,url;null,segment_name,group_id,rel_type,context_id;null'); +select define_function_args('rel_segment__delete','segment_id'); +select define_function_args('rel_segment__get','group_id,rel_type'); +select define_function_args('rel_segment__get_or_new','group_id,rel_type,segment_name;null'); +select define_function_args('rel_segment__name','segment_id'); +select define_function_args('party_approved_member__add_one','party_id,member_id,rel_id'); +select define_function_args('party_approved_member__add','party_id,member_id,rel_id,rel_type'); +select define_function_args('party_approved_member__remove_one','party_id,member_id,rel_id'); +select define_function_args('party_approved_member__remove','party_id,member_id,rel_id,rel_type'); +select define_function_args('site_node_object_map__new', 'object_id,node_id'); +select define_function_args('site_node_object_map__del', 'object_id'); +select define_function_args('site_node_get_tree_sortkey','node_id'); +select define_function_args('site_node__new','node_id;null,parent_id;null,name,object_id;null,directory_p,pattern_p;f,creation_user;null,creation_ip;null'); +select define_function_args('site_node__delete','node_id'); +select define_function_args('site_node__find_pattern','node_id'); +select define_function_args('site_node__node_id','url,parent_id;null'); +select define_function_args('site_node__url','node_id'); +select define_function_args('util__multiple_nextval','v_sequence_name,v_count'); +select define_function_args('util__logical_negation','true_or_false'); + + +--- getting triggers right ( names and return values ) + +CREATE OR REPLACE FUNCTION lobs_delete_tr() RETURNS trigger AS $$ +BEGIN + delete from lob_data where lob_id = old.lob_id; + return old; +END; +$$ LANGUAGE plpgsql; + +create trigger lobs_delete_tr before delete on lobs +for each row execute procedure lobs_delete_tr(); + +drop trigger lobs_delete_trig on lobs; +drop function on_lobs_delete();