--- getting 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;
-- getting 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,recipient_id,is_recursive;f,object_type;content_item');
select define_function_args('content_permission__revoke_permission_h','object_id,revokee_id,privilege');
select define_function_args('content_permission__revoke_permission','object_id,holder_id,privilege,revokee_id,is_recursive;f,object_type;content_item');
select define_function_args('content_permission__permission_p','object_id,holder_id,privilege');
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 functions 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'
and r.content is not null;
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();