Index: openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql,v diff -u -N -r1.11 -r1.12 --- openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql 9 Mar 2002 02:00:02 -0000 1.11 +++ openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql 17 Aug 2002 17:42:45 -0000 1.12 @@ -130,7 +130,7 @@ update cr_revisions - set content = '$content' + set content = :content where revision_id = :revision_id Index: openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-4.1.2-4.5.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-4.1.2-4.5.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-content-repository/sql/postgresql/upgrade/upgrade-4.1.2-4.5.sql 17 Aug 2002 17:42:45 -0000 1.2 @@ -0,0 +1,26 @@ +-- packages/acs-content-repository/sql/upgrade/upgrade-4.1.2-4.5.sql +-- +-- @author vinod@kurup.com +-- @creation-date 2002-05-15 +-- @cvs-id $Id: upgrade-4.1.2-4.5.sql,v 1.2 2002/08/17 17:42:45 vinodk Exp $ +-- + +-- fixes bug #1502 http://openacs.org/sdm/one-baf.tcl?baf_id=1502 + +drop function content_keyword__delete(integer); +create function content_keyword__delete (integer) +returns integer as ' +declare + delete__keyword_id alias for $1; + v_rec record; +begin + + for v_rec in select item_id from cr_item_keyword_map + where keyword_id = delete__keyword_id LOOP + PERFORM content_keyword__item_unassign(v_rec.item_id, delete__keyword_id); + end LOOP; + + PERFORM acs_object__delete(delete__keyword_id); + + return 0; +end;' language 'plpgsql'; 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.14 -r1.15 --- openacs-4/packages/acs-kernel/acs-kernel.info 3 Aug 2002 17:51:51 -0000 1.14 +++ openacs-4/packages/acs-kernel/acs-kernel.info 17 Aug 2002 17:42:45 -0000 1.15 @@ -7,17 +7,17 @@ t t - + oracle postgresql Don Baccus Routines and data models providing the foundation for OpenACS-based Web services. - 2002-05-15 + 2002-08-17 OpenACS - + @@ -81,6 +81,7 @@ + @@ -134,6 +135,8 @@ + + @@ -146,43 +149,43 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade-4.5-4.5.1.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade-4.5-4.5.1.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade-4.5-4.5.1.sql 17 Aug 2002 17:42:45 -0000 1.1 @@ -0,0 +1,720 @@ +-- acs-kernel +-- upgrade-4.5-4.5.1.sql +-- @author vinod@kurup.com +-- @creation-date 2002-08-17 + +-- acs-create.sql + +-- scalabilty change + +create or replace view registered_users +as + select p.email, p.url, pe.first_names, pe.last_name, u.*, mr.member_state + from parties p, persons pe, users u, group_member_map m, membership_rels mr + where party_id = person_id + and person_id = user_id + and u.user_id = m.member_id + and m.rel_id = mr.rel_id + and m.group_id = (select acs.magic_object_id('registered_users') from dual) + and mr.member_state = 'approved' + and u.email_verified_p = 't'; + + +-- acs-kernel-create.sql + +@@ ../tree-create +@@ ../site-node-object-map-create + +-- acs-objects-create.sql + +-- add procedure update_last_modified to package + +create or replace package acs_object +as + + function new ( + object_id in acs_objects.object_id%TYPE default null, + object_type in acs_objects.object_type%TYPE + default 'acs_object', + creation_date in acs_objects.creation_date%TYPE + default sysdate, + creation_user in acs_objects.creation_user%TYPE + default null, + creation_ip in acs_objects.creation_ip%TYPE default null, + context_id in acs_objects.context_id%TYPE default null + ) return acs_objects.object_id%TYPE; + + procedure delete ( + object_id in acs_objects.object_id%TYPE + ); + + function name ( + object_id in acs_objects.object_id%TYPE + ) return varchar2; + + -- The acs_object_types.name_method for "acs_object" + -- + function default_name ( + object_id in acs_objects.object_id%TYPE + ) return varchar2; + + -- Determine where the attribute is stored and what sql needs to be + -- in the where clause to retreive it + -- Used in get_attribute and set_attribute + procedure get_attribute_storage ( + object_id_in in acs_objects.object_id%TYPE, + attribute_name_in in acs_attributes.attribute_name%TYPE, + v_column out varchar2, + v_table_name out varchar2, + v_key_sql out varchar2 + ); + + -- Get/set the value of an object attribute, as long as + -- the type can be cast to varchar2 + function get_attribute ( + object_id_in in acs_objects.object_id%TYPE, + attribute_name_in in acs_attributes.attribute_name%TYPE + ) return varchar2; + + procedure set_attribute ( + object_id_in in acs_objects.object_id%TYPE, + attribute_name_in in acs_attributes.attribute_name%TYPE, + value_in in varchar2 + ); + + function check_representation ( + object_id in acs_objects.object_id%TYPE + ) return char; + + procedure update_last_modified ( + object_id in acs_objects.object_id%TYPE, + last_modified in acs_objects.last_modified%TYPE default sysdate + ); + +end acs_object; +/ +show errors + +create or replace package body acs_object +as + + procedure initialize_attributes ( + object_id in acs_objects.object_id%TYPE + ) + is + v_object_type acs_objects.object_type%TYPE; + begin + -- XXX This should be fixed to initialize supertypes properly. + + -- Initialize dynamic attributes + insert into acs_attribute_values + (object_id, attribute_id, attr_value) + select + initialize_attributes.object_id, a.attribute_id, a.default_value + from acs_attributes a, acs_objects o + where a.object_type = o.object_type + and o.object_id = initialize_attributes.object_id + and a.storage = 'generic' + and a.static_p = 'f'; + + -- Retreive type for static attributes + select object_type into v_object_type from acs_objects + where object_id = initialize_attributes.object_id; + + -- Initialize static attributes + begin + insert into acs_static_attr_values + (object_type, attribute_id, attr_value) + select + v_object_type, a.attribute_id, a.default_value + from acs_attributes a, acs_objects o + where a.object_type = o.object_type + and o.object_id = initialize_attributes.object_id + and a.storage = 'generic' + and a.static_p = 't' + and not exists (select 1 from acs_static_attr_values + where object_type = a.object_type); + exception when no_data_found then null; + end; + + end initialize_attributes; + + function new ( + object_id in acs_objects.object_id%TYPE default null, + object_type in acs_objects.object_type%TYPE + default 'acs_object', + creation_date in acs_objects.creation_date%TYPE + default sysdate, + creation_user in acs_objects.creation_user%TYPE + default null, + creation_ip in acs_objects.creation_ip%TYPE default null, + context_id in acs_objects.context_id%TYPE default null + ) + return acs_objects.object_id%TYPE + is + v_object_id acs_objects.object_id%TYPE; + begin + if object_id is null then + select acs_object_id_seq.nextval + into v_object_id + from dual; + else + v_object_id := object_id; + end if; + + insert into acs_objects + (object_id, object_type, context_id, + creation_date, creation_user, creation_ip) + values + (v_object_id, object_type, context_id, + creation_date, creation_user, creation_ip); + + acs_object.initialize_attributes(v_object_id); + + return v_object_id; + end new; + + procedure delete ( + object_id in acs_objects.object_id%TYPE + ) + is + v_exists_p char; + begin + + -- Delete dynamic/generic attributes + delete from acs_attribute_values where object_id = acs_object.delete.object_id; + + for object_type + in (select table_name, id_column + from acs_object_types + start with object_type = (select object_type + from acs_objects o + where o.object_id = acs_object.delete.object_id) + connect by object_type = prior supertype) + loop + -- Delete from the table if it exists. + select decode(count(*),0,'f','t') into v_exists_p + from user_tables + where table_name = upper(object_type.table_name); + + if v_exists_p = 't' then + execute immediate 'delete from ' || object_type.table_name || + ' where ' || object_type.id_column || ' = :object_id' + using in object_id; + end if; + + end loop; + + end delete; + + function name ( + object_id in acs_objects.object_id%TYPE + ) + return varchar2 + is + object_name varchar2(500); + v_object_id integer := object_id; + begin + -- Find the name function for this object, which is stored in the + -- name_method column of acs_object_types. Starting with this + -- object's actual type, traverse the type hierarchy upwards until + -- a non-null name_method value is found. + -- + for object_type + in (select name_method + from acs_object_types + start with object_type = (select object_type + from acs_objects o + where o.object_id = name.object_id) + connect by object_type = prior supertype) + loop + if object_type.name_method is not null then + + -- Execute the first name_method we find (since we're traversing + -- up the type hierarchy from the object's exact type) using + -- Native Dynamic SQL, to ascertain the name of this object. + -- + --execute immediate 'select ' || object_type.name_method || '(:1) from dual' + execute immediate 'begin :1 := ' || object_type.name_method || '(:2); end;' + using out object_name, in object_id; + --into object_name + + exit; + end if; + end loop; + + return object_name; + end name; + + function default_name ( + object_id in acs_objects.object_id%TYPE + ) return varchar2 + is + object_type_pretty_name acs_object_types.pretty_name%TYPE; + begin + select ot.pretty_name + into object_type_pretty_name + from acs_objects o, acs_object_types ot + where o.object_id = default_name.object_id + and o.object_type = ot.object_type; + + return object_type_pretty_name || ' ' || object_id; + end default_name; + + procedure get_attribute_storage ( + object_id_in in acs_objects.object_id%TYPE, + attribute_name_in in acs_attributes.attribute_name%TYPE, + v_column out varchar2, + v_table_name out varchar2, + v_key_sql out varchar2 + ) + is + v_object_type acs_attributes.object_type%TYPE; + v_static acs_attributes.static_p%TYPE := null; + v_attr_id acs_attributes.attribute_id%TYPE := null; + v_storage acs_attributes.storage%TYPE := null; + v_attr_name acs_attributes.attribute_name%TYPE := null; + v_id_column varchar2(200) := null; + v_sql varchar2(4000) := null; + v_return varchar2(4000) := null; + + -- Fetch the most inherited attribute + cursor c_attribute is + select + a.attribute_id, a.static_p, a.storage, a.table_name, a.attribute_name, + a.object_type, a.column_name, t.id_column + from + acs_attributes a, + (select + object_type, id_column + from + acs_object_types + connect by + object_type = prior supertype + start with + object_type = (select object_type from acs_objects + where object_id = object_id_in) + ) t + where + a.attribute_name = attribute_name_in + and + a.object_type = t.object_type; + + begin + + -- Determine the attribute parameters + open c_attribute; + fetch c_attribute into + v_attr_id, v_static, v_storage, v_table_name, v_attr_name, + v_object_type, v_column, v_id_column; + if c_attribute%NOTFOUND then + close c_attribute; + raise_application_error (-20000, + 'No such attribute ' || v_object_type || '::' || attribute_name_in || + ' in acs_object.get_attribute_storage.'); + end if; + close c_attribute; + + -- This should really be done in a trigger on acs_attributes, + -- instead of generating it each time in this function + + -- If there is no specific table name for this attribute, + -- figure it out based on the object type + if v_table_name is null then + + -- Determine the appropriate table name + if v_storage = 'generic' then + -- Generic attribute: table name/column are hardcoded + + v_column := 'attr_value'; + + if v_static = 'f' then + v_table_name := 'acs_attribute_values'; + v_key_sql := '(object_id = ' || object_id_in || ' and ' || + 'attribute_id = ' || v_attr_id || ')'; + else + v_table_name := 'acs_static_attr_values'; + v_key_sql := '(object_type = ''' || v_object_type || ''' and ' || + 'attribute_id = ' || v_attr_id || ')'; + end if; + + else + -- Specific attribute: table name/column need to be retreived + + if v_static = 'f' then + select + table_name, id_column + into + v_table_name, v_id_column + from + acs_object_types + where + object_type = v_object_type; + else + raise_application_error(-20000, + 'No table name specified for storage specific static attribute ' || + v_object_type || '::' || attribute_name_in || + ' in acs_object.get_attribute_storage.'); + end if; + + end if; + else + -- There is a custom table name for this attribute. + -- Get the id column out of the acs_object_tables + -- Raise an error if not found + select id_column into v_id_column from acs_object_type_tables + where object_type = v_object_type + and table_name = v_table_name; + + end if; + + if v_column is null then + + if v_storage = 'generic' then + v_column := 'attr_value'; + else + v_column := v_attr_name; + end if; + + end if; + + if v_key_sql is null then + if v_static = 'f' then + v_key_sql := v_id_column || ' = ' || object_id_in ; + else + v_key_sql := v_id_column || ' = ''' || v_object_type || ''''; + end if; + end if; + + exception when no_data_found then + if c_attribute%ISOPEN then + close c_attribute; + end if; + raise_application_error(-20000, 'No data found for attribute ' || + v_object_type || '::' || attribute_name_in || + ' in acs_object.get_attribute_storage'); + + end get_attribute_storage; + + -- Get/set the value of an object attribute, as long as + -- the type can be cast to varchar2 + function get_attribute ( + object_id_in in acs_objects.object_id%TYPE, + attribute_name_in in acs_attributes.attribute_name%TYPE + ) return varchar2 + is + v_table_name varchar2(200); + v_column varchar2(200); + v_key_sql varchar2(4000); + v_return varchar2(4000); + begin + + get_attribute_storage(object_id_in, attribute_name_in, + v_column, v_table_name, v_key_sql); + + begin + execute immediate 'select ' + || v_column || ' from ' || v_table_name || ' where ' || v_key_sql + into + v_return; + exception when no_data_found then + return null; + end; + + return v_return; + end get_attribute; + + procedure set_attribute ( + object_id_in in acs_objects.object_id%TYPE, + attribute_name_in in acs_attributes.attribute_name%TYPE, + value_in in varchar2 + ) + is + v_table_name varchar2(200); + v_column varchar2(200); + v_key_sql varchar2(4000); + v_return varchar2(4000); + v_dummy integer; + begin + + get_attribute_storage(object_id_in, attribute_name_in, + v_column, v_table_name, v_key_sql); + + execute immediate 'update ' + || v_table_name || ' set ' || v_column || ' = :value where ' || v_key_sql + using value_in; + + end set_attribute; + + function check_context_index ( + object_id in acs_objects.object_id%TYPE, + ancestor_id in acs_objects.object_id%TYPE, + n_generations in integer + ) return char + is + n_rows integer; + n_gens integer; + begin + -- Verify that this row exists in the index. + select decode(count(*),0,0,1) into n_rows + from acs_object_context_index + where object_id = check_context_index.object_id + and ancestor_id = check_context_index.ancestor_id; + + if n_rows = 1 then + -- Verify that the count is correct. + select n_generations into n_gens + from acs_object_context_index + where object_id = check_context_index.object_id + and ancestor_id = check_context_index.ancestor_id; + + if n_gens != n_generations then + acs_log.error('acs_object.check_representation', 'Ancestor ' || + ancestor_id || ' of object ' || object_id || + ' reports being generation ' || n_gens || + ' when it is actually generation ' || n_generations || + '.'); + return 'f'; + else + return 't'; + end if; + else + acs_log.error('acs_object.check_representation', 'Ancestor ' || + ancestor_id || ' of object ' || object_id || + ' is missing an entry in acs_object_context_index.'); + return 'f'; + end if; + end; + + function check_object_ancestors ( + object_id in acs_objects.object_id%TYPE, + ancestor_id in acs_objects.object_id%TYPE, + n_generations in integer + ) return char + is + context_id acs_objects.context_id%TYPE; + security_inherit_p acs_objects.security_inherit_p%TYPE; + n_rows integer; + n_gens integer; + result char(1); + begin + -- OBJECT_ID is the object we are verifying + -- ANCESTOR_ID is the current ancestor we are tracking + -- N_GENERATIONS is how far ancestor_id is from object_id + + -- Note that this function is only supposed to verify that the + -- index contains each ancestor for OBJECT_ID. It doesn''t + -- guarantee that there aren''t extraneous rows or that + -- OBJECT_ID''s children are contained in the index. That is + -- verified by seperate functions. + + result := 't'; + + -- Grab the context and security_inherit_p flag of the current + -- ancestor''s parent. + select context_id, security_inherit_p into context_id, security_inherit_p + from acs_objects + where object_id = check_object_ancestors.ancestor_id; + + if ancestor_id = 0 then + if context_id is null then + result := 't'; + else + -- This can be a constraint, can''t it? + acs_log.error('acs_object.check_representation', + 'Object 0 doesn''t have a null context_id'); + result := 'f'; + end if; + else + if context_id is null or security_inherit_p = 'f' then + context_id := 0; + end if; + + if check_context_index(object_id, ancestor_id, n_generations) = 'f' then + result := 'f'; + end if; + + if check_object_ancestors(object_id, context_id, + n_generations + 1) = 'f' then + result := 'f'; + end if; + end if; + + return result; + end; + + function check_object_descendants ( + object_id in acs_objects.object_id%TYPE, + descendant_id in acs_objects.object_id%TYPE, + n_generations in integer + ) return char + is + result char(1); + begin + -- OBJECT_ID is the object we are verifying. + -- DESCENDANT_ID is the current descendant we are tracking. + -- N_GENERATIONS is how far the current DESCENDANT_ID is from + -- OBJECT_ID. + + -- This function will verfy that each actualy descendant of + -- OBJECT_ID has a row in the index table. It does not check that + -- there aren't extraneous rows or that the ancestors of OBJECT_ID + -- are maintained correctly. + + result := 't'; + + -- First verify that OBJECT_ID and DESCENDANT_ID are actually in + -- the index. + if check_context_index(descendant_id, object_id, n_generations) = 'f' then + result := 'f'; + end if; + + -- For every child that reports inheriting from OBJECT_ID we need to call + -- ourselves recursively. + for obj in (select * + from acs_objects + where context_id = descendant_id + and security_inherit_p = 't') loop + if check_object_descendants(object_id, obj.object_id, + n_generations + 1) = 'f' then + result := 'f'; + end if; + end loop; + + return result; + end; + + function check_path ( + object_id in acs_objects.object_id%TYPE, + ancestor_id in acs_objects.object_id%TYPE + ) return char + is + context_id acs_objects.context_id%TYPE; + security_inherit_p acs_objects.security_inherit_p%TYPE; + begin + if object_id = ancestor_id then + return 't'; + end if; + + select context_id, security_inherit_p into context_id, security_inherit_p + from acs_objects + where object_id = check_path.object_id; + + if context_id is null or security_inherit_p = 'f' then + context_id := 0; + end if; + + return check_path(context_id, ancestor_id); + end; + + function check_representation ( + object_id in acs_objects.object_id%TYPE + ) return char + is + result char(1); + object_type acs_objects.object_type%TYPE; + n_rows integer; + begin + result := 't'; + acs_log.notice('acs_object.check_representation', + 'Running acs_object.check_representation on object_id = ' || + object_id || '.'); + + -- If this fails then there isn''t even an object associated with + -- this id. I'm going to let that error propogate as an exception. + select object_type into object_type + from acs_objects + where object_id = check_representation.object_id; + + acs_log.notice('acs_object.check_representation', + 'OBJECT STORAGE INTEGRITY TEST'); + + -- Let's look through every primary storage table associated with + -- this object type and all of its supertypes and make sure there + -- is a row with OBJECT_ID as theh primary key. + for t in (select t.object_type, t.table_name, t.id_column + from acs_object_type_supertype_map m, acs_object_types t + where m.ancestor_type = t.object_type + and m.object_type = check_representation.object_type + union + select object_type, table_name, id_column + from acs_object_types + where object_type = check_representation.object_type) loop + execute immediate 'select decode(count(*),0,0,1) from ' || t.table_name || + ' where ' || t.id_column || ' = ' || object_id + into n_rows; + + if n_rows = 0 then + result := 'f'; + acs_log.error('acs_object.check_representation', + 'Table ' || t.table_name || ' (primary storage for ' || + t.object_type || ') doesn''t have a row for object ' || + object_id || ' of type ' || object_type || '.'); + end if; + end loop; + + acs_log.notice('acs_object.check_representation', + 'OBJECT CONTEXT INTEGRITY TEST'); + + -- Do a bunch of dirt simple sanity checks. + + -- First let's check that all of our ancestors appear in + -- acs_object_context_index with the correct generation listed. + if check_object_ancestors(object_id, object_id, 0) = 'f' then + result := 'f'; + end if; + + -- Now let's check that all of our descendants appear in + -- acs_object_context_index with the correct generation listed. + if check_object_descendants(object_id, object_id, 0) = 'f' then + result := 'f'; + end if; + + -- Ok, we know that the index contains every entry that it is + -- supposed to have. Now let's make sure it doesn't contain any + -- extraneous entries. + for row in (select * + from acs_object_context_index + where object_id = check_representation.object_id + or ancestor_id = check_representation.object_id) loop + if check_path(row.object_id, row.ancestor_id) = 'f' then + acs_log.error('acs_object.check_representation', + 'acs_object_context_index contains an extraneous row: ' || + 'object_id = ' || row.object_id || ', ancestor_id = ' || + row.ancestor_id || ', n_generations = ' || + row.n_generations || '.'); + result := 'f'; + end if; + end loop; + + acs_log.notice('acs_object.check_representation', + 'Done running acs_object.check_representation ' || + 'on object_id = ' || object_id || '.'); + return result; + end check_representation; + + procedure update_last_modified ( + object_id in acs_objects.object_id%TYPE, + last_modified in acs_objects.last_modified%TYPE default sysdate + ) + is + v_parent_id acs_objects.context_id%TYPE; + begin + update acs_objects + set acs_objects.last_modified = acs_object.update_last_modified.last_modified + where acs_objects.object_id in (select ao.object_id + from acs_objects ao + connect by prior ao.context_id = ao.object_id + start with ao.object_id = acs_object.update_last_modified.object_id) + and acs_objects.context_id is not null + and acs_objects.object_id != 0; + end update_last_modified; + +end acs_object; +/ +show errors + + +-- acs-permissions-create.sql + + Index: openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-4.2-4.5.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-4.2-4.5.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-4.2-4.5.sql 17 Aug 2002 17:42:45 -0000 1.2 @@ -0,0 +1,56 @@ +-- packages/acs-kernel/sql/upgrade/upgrade-4.2-4.5.sql +-- +-- @author vinod@kurup.com +-- @creation-date 2002-05-15 +-- @cvs-id $Id: upgrade-4.2-4.5.sql,v 1.2 2002/08/17 17:42:45 vinodk Exp $ +-- + +-- fixes bug #1515 http://openacs.org/sdm/one-bug.tcl?baf_id=1515 + +drop function apm_package_version__upgrade_p (varchar,varchar,varchar); +create function apm_package_version__upgrade_p (varchar,varchar,varchar) +returns integer as ' +declare + upgrade_p__path alias for $1; + upgrade_p__initial_version_name alias for $2; + upgrade_p__final_version_name alias for $3; + v_pos1 integer; + v_pos2 integer; + v_tmp apm_package_files.path%TYPE; + v_path apm_package_files.path%TYPE; + v_version_from apm_package_versions.version_name%TYPE; + v_version_to apm_package_versions.version_name%TYPE; +begin + + -- Set v_path to the tail of the path (the file name). + v_path := substr(upgrade_p__path, instr(upgrade_p__path, ''/'', -1) + 1); + + -- Remove the extension, if it is .sql. + v_pos1 := position(''.sql'' in v_path); + if v_pos1 > 0 then + v_path := substr(v_path, 1, v_pos1 - 1); + end if; + + -- Figure out the from/to version numbers for the individual file. + v_pos1 := instr(v_path, ''-'', -1, 2); + v_pos2 := instr(v_path, ''-'', -1); + if v_pos1 = 0 or v_pos2 = 0 then + -- There aren''t two hyphens in the file name. Bail. + return 0; + end if; + + v_version_from := substr(v_path, v_pos1 + 1, v_pos2 - v_pos1 - 1); + v_version_to := substr(v_path, v_pos2 + 1); + + if apm_package_version__version_name_greater(upgrade_p__initial_version_name, v_version_from) <= 0 and + apm_package_version__version_name_greater(upgrade_p__final_version_name, v_version_to) >= 0 then + return 1; + end if; + + return 0; + -- exception when others then + -- Invalid version number. + -- return 0; + +end;' language 'plpgsql'; + Index: openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-4.5-4.5.1.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-4.5-4.5.1.sql,v diff -u -N -r1.2 -r1.3 --- openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-4.5-4.5.1.sql 2 Aug 2002 23:45:04 -0000 1.2 +++ openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-4.5-4.5.1.sql 17 Aug 2002 17:42:45 -0000 1.3 @@ -1,13 +1,19 @@ -- added jon@jongriffin.com +-- updated 2002-08-17 vinod@kurup.com ---include the new file +-- acs-kernel-create.sql \i ../site-node-object-map-create.sql --- acs-objects-create code +-- acs-objects-create.sql + create function acs_object__update_last_modified (integer) + returns integer as ' + declare + acs_object__update_last_modified__object_id alias for $1; + begin + return acs_object__update_last_modified(acs_object__update_last_modified__object_id, now()); + end;' language 'plpgsql'; -drop function acs_object__update_last_modified (integer, timestamp); - create function acs_object__update_last_modified (integer, timestamp) returns integer as ' declare @@ -39,7 +45,7 @@ end;' language 'plpgsql'; --- apm-create +-- apm-create.sql create function apm_package__parent_id (integer) returns integer as ' declare apm_package__parent_id__package_id alias for $1; @@ -59,60 +65,6 @@ end if; end;' language 'plpgsql'; - --- function upgrade_p - -drop function apm_package_version__upgrade_p (varchar,varchar,varchar); - -create function apm_package_version__upgrade_p (varchar,varchar,varchar) -returns integer as ' -declare - upgrade_p__path alias for $1; - upgrade_p__initial_version_name alias for $2; - upgrade_p__final_version_name alias for $3; - v_pos1 integer; - v_pos2 integer; - - v_tmp apm_package_files.path%TYPE; - v_path apm_package_files.path%TYPE; - v_version_from apm_package_versions.version_name%TYPE; - v_version_to apm_package_versions.version_name%TYPE; -begin - - -- Set v_path to the tail of the path (the file name). - v_path := substr(upgrade_p__path, instr(upgrade_p__path, ''/'', -1) + 1); - - -- Remove the extension, if it is .sql. - v_pos1 := position(''.'' in v_path); - if v_pos1 > 0 and substr(v_path, v_pos1) = ''.sql'' then - v_path := substr(v_path, 1, v_pos1 - 1); - end if; - - -- Figure out the from/to version numbers for the individual file. - - v_pos1 := instr(v_path, ''-'', -1, 2); - v_pos2 := instr(v_path, ''-'', -1); - if v_pos1 = 0 or v_pos2 = 0 then - -- There aren''t two hyphens in the file name. Bail. - return 0; - end if; - - v_version_from := substr(v_path, v_pos1 + 1, v_pos2 - v_pos1 - 1); - v_version_to := substr(v_path, v_pos2 + 1); - - if apm_package_version__version_name_greater(upgrade_p__initial_version_name, v_version_from) <= 0 and - apm_package_version__version_name_greater(upgrade_p__final_version_name, v_version_to) >= 0 then - return 1; - end if; - - return 0; - -- exception when others then - -- Invalid version number. - -- return 0; - -end;' language 'plpgsql'; - - -- postgresql.sql create function tree_increment_key(varbit) @@ -160,45 +112,19 @@ end;' language 'plpgsql' with (isstrict, iscachable); --- +--- -drop function create_user_col_comments(); -create function create_user_col_comments() returns boolean as ' -begin - -- in version 7.1 col_description was missing but is present in 7.2 - -- does it exist in 7.0? - if version() like ''%7.1%'' then - execute '' - create view user_col_comments as - select upper(c.relname) as table_name, - upper(a.attname) as column_name, - d.description as comments - from pg_class c, - pg_attribute a - left outer join pg_description d on (a.oid = d.objoid) - where c.oid = a.attrelid - and a.attnum > 0''; - else - execute '' - create view user_col_comments as - select upper(c.relname) as table_name, - upper(a.attname) as column_name, - col_description(a.attrelid, a.attnum) as comments - from pg_class c - left join pg_attribute a - on a.attrelid = c.oid - where a.attnum > 0''; - end if; - return ''t''; -end;' language 'plpgsql'; +-- vinodk: create_user_col_comments is changed, but only with comments +-- also, the function is dropped after it creates the view, so the comments +-- persist only in the SQL file -select create_user_col_comments(); +--- -drop function create_user_col_comments(); +-- need to drop the view that the function is going to create +-- otherwise, we'll get 'relation already exists' errors ---- +drop view user_tab_comments; -drop function create_user_tab_comments(); create function create_user_tab_comments() returns boolean as ' begin if version() like ''%7.2%'' then @@ -234,7 +160,7 @@ drop function create_user_tab_comments(); --- +-- rel-constraints-create.sql create function rel_segment__new (varchar,integer,varchar) returns integer as ' @@ -252,7 +178,7 @@ end;' language 'plpgsql'; --- site-nodes-create +-- site-nodes-create.sql create index site_nodes_parent_id_idx on site_nodes(parent_id,object_id,node_id); Index: openacs-4/packages/acs-service-contract/acs-service-contract.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/acs-service-contract.info,v diff -u -N -r1.7 -r1.8 --- openacs-4/packages/acs-service-contract/acs-service-contract.info 17 Aug 2002 03:59:38 -0000 1.7 +++ openacs-4/packages/acs-service-contract/acs-service-contract.info 17 Aug 2002 17:42:45 -0000 1.8 @@ -14,7 +14,8 @@ Kapil Thangavelu Neophytos Demetriou - 2002-08-14 + Allows different packages to communicate via defined contracts + 2002-08-17 OpenACS @@ -35,6 +36,7 @@ + Index: openacs-4/packages/acs-subsite/www/admin/users/new-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/www/admin/users/new-postgresql.xql,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/acs-subsite/www/admin/users/new-postgresql.xql 4 Dec 2001 00:20:47 -0000 1.3 +++ openacs-4/packages/acs-subsite/www/admin/users/new-postgresql.xql 17 Aug 2002 17:42:45 -0000 1.4 @@ -13,7 +13,7 @@ select t1.object_type from acs_object_types t1, acs_object_types t2 where t2.tree_sortkey between t1.tree_sortkey and tree_right(t1.tree_sortkey) - and t1.object_type = :add_with_rel_type + and t2.object_type = :add_with_rel_type ) Index: openacs-4/packages/edit-this-page/tcl/etp-procs-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/edit-this-page/tcl/etp-procs-oracle.xql,v diff -u -N -r1.8 -r1.9 --- openacs-4/packages/edit-this-page/tcl/etp-procs-oracle.xql 10 Dec 2001 19:02:02 -0000 1.8 +++ openacs-4/packages/edit-this-page/tcl/etp-procs-oracle.xql 17 Aug 2002 17:42:45 -0000 1.9 @@ -146,6 +146,7 @@ + sort_order