-- procedure image__new/16 -- DROP FUNCTION IF EXISTS image__new(character varying,integer,integer,integer,character varying,integer,character varying,character varying,character varying,character varying,boolean,timestamp with time zone,character varying,integer,integer,integer,integer); CREATE OR REPLACE FUNCTION image__new( p_name varchar, p_parent_id integer, -- default null p_item_id integer, -- default null p_revision_id integer, -- default null p_mime_type varchar, -- default jpeg p_creation_user integer, -- default null p_creation_ip varchar, -- default null p_title varchar, -- default null p_description varchar, -- default null p_storage_type cr_items.storage_type%TYPE, p_content_type varchar, p_nls_language varchar, p_publish_date timestamptz, p_height integer, p_width integer, p_package_id integer default null ) RETURNS integer AS $$ DECLARE v_item_id cr_items.item_id%TYPE; v_revision_id cr_revisions.revision_id%TYPE; v_package_id acs_objects.package_id%TYPE; BEGIN if content_item__is_subclass(p_content_type, 'image') = 'f' then raise EXCEPTION '-20000: image__new can only be called for an image type'; end if; if p_package_id is null then v_package_id := acs_object__package_id(p_parent_id); else v_package_id := p_package_id; end if; v_item_id := content_item__new ( p_name, p_parent_id, p_item_id, null, current_timestamp, p_creation_user, p_parent_id, p_creation_ip, 'content_item', p_content_type, null, null, null, null, null, p_storage_type, v_package_id ); -- We will let the caller fill in the LOB data or file path. v_revision_id := content_revision__new ( p_title, p_description, p_publish_date, p_mime_type, p_nls_language, null, -- text v_item_id, p_revision_id, current_timestamp, p_creation_user, p_creation_ip, null, -- content_length v_package_id ); insert into images (image_id, height, width) values (v_revision_id, p_height, p_width); return v_item_id; END; $$ LANGUAGE plpgsql; -- -- procedure content_revision__content_copy/2 -- CREATE OR REPLACE FUNCTION content_revision__content_copy( content_copy__revision_id integer, content_copy__revision_id_dest integer -- default null ) RETURNS integer AS $$ DECLARE v_item_id cr_items.item_id%TYPE; v_content_length cr_revisions.content_length%TYPE; v_revision_id_dest cr_revisions.revision_id%TYPE; v_content cr_revisions.content%TYPE; v_lob cr_revisions.lob%TYPE; v_new_lob cr_revisions.lob%TYPE; v_storage_type cr_items.storage_type%TYPE; BEGIN if content_copy__revision_id is null then raise exception 'content_revision__content_copy attempt to copy a null revision_id'; end if; select content_length, item_id into v_content_length, v_item_id from cr_revisions where revision_id = content_copy__revision_id; -- get the destination revision if content_copy__revision_id_dest is null then select latest_revision into v_revision_id_dest from cr_items where item_id = v_item_id; else v_revision_id_dest := content_copy__revision_id_dest; end if; -- only copy the content if the source content is not null if v_content_length is not null and v_content_length > 0 then /* The internal LOB types - BLOB, CLOB, and NCLOB - use copy semantics, as opposed to the reference semantics which apply to BFILEs. When a BLOB, CLOB, or NCLOB is copied from one row to another row in the same table or in a different table, the actual LOB value is copied, not just the LOB locator. */ select r.content, r.content_length, r.lob, i.storage_type into v_content, v_content_length, v_lob, v_storage_type from cr_revisions r, cr_items i where r.item_id = i.item_id and r.revision_id = content_copy__revision_id; if v_storage_type = 'lob' then v_new_lob := empty_lob(); PERFORM lob_copy(v_lob, v_new_lob); update cr_revisions set content = null, content_length = v_content_length, lob = v_new_lob where revision_id = v_revision_id_dest; -- this call has to be before the above instruction, -- because lob references the v_new_lob -- PERFORM lob_copy(v_lob, v_new_lob); else -- this will work for both file and text types... well sort of. -- this really just creates a reference to the first file which is -- wrong since, the item_id, revision_id uniquely describes the -- location of the file in the content repository file system. -- after copy is called, the content attribute needs to be updated -- with the new relative file path: -- update cr_revisions -- set content = '[cr_create_content_file $item_id $revision_id [cr_fs_path]$old_rel_path]' -- where revision_id = :revision_id -- old_rel_path is the content attribute value of the content revision -- that is being copied. update cr_revisions set content = v_content, content_length = v_content_length, lob = null where revision_id = v_revision_id_dest; end if; end if; return 0; END; $$ LANGUAGE plpgsql; -- -- procedure content_revision__get_content/1 -- CREATE OR REPLACE FUNCTION content_revision__get_content( get_content__revision_id integer ) RETURNS text AS $$ DECLARE v_storage_type cr_items.storage_type%TYPE; v_lob_id integer; v_data text; BEGIN select i.storage_type, r.lob into v_storage_type, v_lob_id from cr_items i, cr_revisions r where i.item_id = r.item_id and r.revision_id = get_content__revision_id; if v_storage_type = 'lob' then return v_lob_id::text; else return content from cr_revisions where revision_id = get_content__revision_id; end if; END; $$ LANGUAGE plpgsql stable strict;