Index: openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql,v diff -u -r1.36 -r1.37 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql 7 Mar 2011 01:39:31 -0000 1.36 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql 7 Mar 2011 02:52:22 -0000 1.37 @@ -626,13 +626,14 @@ v_package_name := p_package_name; end if; - if p_supertype is null or p_supertype = '''' then - v_supertype := ''acs_object''; - else - v_supertype := p_supertype; - if not acs_object_type__is_subtype_p(''acs_object'', p_supertype) - then - raise exception ''%s is not a valid type'', p_supertype; + if p_object_type <> ''acs_object'' then + if p_supertype is null or p_supertype = '''' then + v_supertype := ''acs_object''; + else + v_supertype := p_supertype; + if not acs_object_type__is_subtype_p(''acs_object'', p_supertype) then + raise exception ''%s is not a valid type'', p_supertype; + end if; end if; end if; Index: openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.7.0d7-5.7.0d8.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.7.0d7-5.7.0d8.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.7.0d7-5.7.0d8.sql 7 Mar 2011 02:52:22 -0000 1.1 @@ -0,0 +1,191 @@ +update acs_object_types set supertype = null where object_type = 'acs_object'; + +create or replace function acs_object_type__create_type (varchar,varchar,varchar,varchar,varchar,varchar,varchar,boolean,varchar,varchar, boolean, boolean) +returns integer as ' +declare + p_object_type alias for $1; + p_pretty_name alias for $2; + p_pretty_plural alias for $3; + p_supertype alias for $4; + p_table_name alias for $5; -- default null + p_id_column alias for $6; -- default null + p_package_name alias for $7; -- default null + p_abstract_p alias for $8; -- default ''f'' + p_type_extension_table alias for $9; -- default null + p_name_method alias for $10; -- default null + p_create_table_p alias for $11; + p_dynamic_p alias for $12; + v_package_name acs_object_types.package_name%TYPE; + v_supertype acs_object_types.supertype%TYPE; + v_name_method varchar; + v_idx integer; + v_temp_p boolean; + v_supertype_table acs_object_types.table_name%TYPE; + v_id_column acs_object_types.id_column%TYPE; + v_table_name acs_object_types.table_name%TYPE; +begin + v_idx := position(''.'' in p_name_method); + if v_idx <> 0 then + v_name_method := substr(p_name_method,1,v_idx - 1) || + ''__'' || substr(p_name_method, v_idx + 1); + else + v_name_method := p_name_method; + end if; + + -- If we are asked to create the table, provide reasonable default values for the + -- table name and id column. Traditionally OpenACS uses the plural form of the type + -- name. This code appends "_t" (for "table") because the use of english plural rules + -- does not work well for all languages. + + if p_create_table_p and (p_table_name is null or p_table_name = '''') then + v_table_name := p_object_type || ''_t''; + else + v_table_name := p_table_name; + end if; + + if p_create_table_p and (p_id_column is null or p_id_column = '''') then + v_id_column := p_object_type || ''_id''; + else + v_id_column := p_id_column; + end if; + + if p_package_name is null or p_package_name = '''' then + v_package_name := p_object_type; + else + v_package_name := p_package_name; + end if; + + if p_object_type <> ''acs_object'' then + if p_supertype is null or p_supertype = '''' then + v_supertype := ''acs_object''; + else + v_supertype := p_supertype; + if not acs_object_type__is_subtype_p(''acs_object'', p_supertype) then + raise exception ''%s is not a valid type'', p_supertype; + end if; + end if; + end if; + + insert into acs_object_types + (object_type, pretty_name, pretty_plural, supertype, table_name, + id_column, abstract_p, type_extension_table, package_name, + name_method, dynamic_p) + values + (p_object_type, p_pretty_name, + p_pretty_plural, v_supertype, + v_table_name, v_id_column, + p_abstract_p, p_type_extension_table, + v_package_name, v_name_method, p_dynamic_p); + + if p_create_table_p then + + if exists (select 1 + from pg_class + where relname = lower(v_table_name)) then + raise exception ''Table "%" already exists'', v_table_name; + end if; + + loop + select table_name,object_type into v_supertype_table,v_supertype + from acs_object_types + where object_type = v_supertype; + exit when v_supertype_table is not null; + end loop; + + execute ''create table '' || v_table_name || '' ('' || + v_id_column || '' integer constraint '' || v_table_name || + ''_pk primary key '' || '' constraint '' || v_table_name || + ''_fk references '' || v_supertype_table || '' on delete cascade)''; + end if; + + return 0; +end;' language 'plpgsql'; + +-- DRB: backwards compatibility version, don't allow for table creation. + +create or replace function acs_object_type__create_type (varchar,varchar,varchar,varchar,varchar,varchar,varchar,boolean,varchar,varchar) +returns integer as ' +declare + p_object_type alias for $1; + p_pretty_name alias for $2; + p_pretty_plural alias for $3; + p_supertype alias for $4; + p_table_name alias for $5; -- default null + p_id_column alias for $6; -- default null + p_package_name alias for $7; -- default null + p_abstract_p alias for $8; -- default ''f'' + p_type_extension_table alias for $9; -- default null + p_name_method alias for $10; -- default null +begin + return acs_object_type__create_type(p_object_type, p_pretty_name, + p_pretty_plural, p_supertype, p_table_name, + p_id_column, p_package_name, p_abstract_p, + p_type_extension_table, p_name_method,''f'',''f''); +end;' language 'plpgsql'; + +select define_function_args('acs_object_type__drop_type','object_type,drop_table_p;f,drop_children_p;f'); + +-- procedure drop_type +create or replace function acs_object_type__drop_type (varchar,boolean,boolean) +returns integer as ' +declare + p_object_type alias for $1; + p_drop_children_p alias for $2; + p_drop_table_p alias for $3; + row record; + object_row record; + v_table_name acs_object_types.table_name%TYPE; +begin + + -- drop children recursively + if p_drop_children_p then + for row in select object_type + from acs_object_types + where supertype = p_object_type + loop + perform acs_object_type__drop_type(row.object_type, ''t'', p_drop_table_p); + end loop; + end if; + + -- drop all the attributes associated with this type + for row in select attribute_name + from acs_attributes + where object_type = p_object_type + loop + perform acs_attribute__drop_attribute (p_object_type, row.attribute_name); + end loop; + + -- Remove the associated table if it exists and p_drop_table_p is true + + if p_drop_table_p then + + select table_name into v_table_name + from acs_object_types + where object_type = p_object_type; + + if found then + if not exists (select 1 + from pg_class + where relname = lower(v_table_name)) then + raise exception ''Table "%" does not exist'', v_table_name; + end if; + + execute ''drop table '' || v_table_name || '' cascade''; + end if; + + end if; + + delete from acs_object_types + where object_type = p_object_type; + + return 0; +end;' language 'plpgsql'; + +-- Retained for backwards compatibility + +create or replace function acs_object_type__drop_type (varchar,boolean) +returns integer as ' +begin + return acs_object_type__drop_type($1,$2,''f''); +end;' language 'plpgsql'; + Fisheye: Tag 1.2 refers to a dead (removed) revision in file `openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.7.0d7-upgrade-5.7.0d8.sql'. Fisheye: No comparison available. Pass `N' to diff?