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?