Index: openacs-4/packages/acs-admin/www/apm/version-dependencies.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-admin/www/apm/version-dependencies.tcl,v diff -u -N -r1.5 -r1.6 --- openacs-4/packages/acs-admin/www/apm/version-dependencies.tcl 5 Jan 2010 01:34:54 -0000 1.5 +++ openacs-4/packages/acs-admin/www/apm/version-dependencies.tcl 10 Mar 2010 00:44:03 -0000 1.6 @@ -13,7 +13,7 @@ " -foreach dependency_type { provide extend require } { +foreach dependency_type { provide require extend embed } { set dependency_type_prep "${dependency_type}s" if { [string index $dependency_type end] eq "e" } { @@ -38,7 +38,7 @@ set sign [ad_decode $dependency_type "provide" "<=" ">="] set counter 0 - set other_dependency_in [ad_decode $dependency_type "provide" "'requires','extends'" "'provides'"] + set other_dependency_in [ad_decode $dependency_type "provide" "'requires','extends','embeds'" "'provides'"] db_foreach apm_specific_version_dependencies {} { incr counter if { $counter == 1 } { @@ -48,6 +48,7 @@ provides { set dep_d provided } requires { set dep_d required } extends { set dep_d extended } + embeds { set dep_d embeds } } doc_body_append "
  • [string totitle $dep_d] by $dep_pretty_name, version $dep_version_name\n" } Index: openacs-4/packages/acs-admin/www/apm/version-dependency-add-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-admin/www/apm/version-dependency-add-2.tcl,v diff -u -N -r1.9 -r1.10 --- openacs-4/packages/acs-admin/www/apm/version-dependency-add-2.tcl 28 Feb 2010 02:22:34 -0000 1.9 +++ openacs-4/packages/acs-admin/www/apm/version-dependency-add-2.tcl 10 Mar 2010 00:44:03 -0000 1.10 @@ -30,8 +30,14 @@ apm_copy_inherited_params $our_package_key } + embed { + apm_dependency_add -dependency_id $dependency_id ${dependency_type}s $version_id $package_key $version_name + apm_build_one_package_relationships $our_package_key + apm_copy_inherited_params $our_package_key + } + default { - ad_return_complaint 1 "Entry error: Depenendencies are either provided or required." + ad_return_complaint 1 "Entry error: Allowable dependencies are required, extends and embeds." } } } on_error { 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.109 -r1.110 --- openacs-4/packages/acs-kernel/acs-kernel.info 5 Mar 2010 12:22:07 -0000 1.109 +++ openacs-4/packages/acs-kernel/acs-kernel.info 10 Mar 2010 00:44:03 -0000 1.110 @@ -7,15 +7,15 @@ t t - + OpenACS Core Team Routines and data models providing the foundation for OpenACS-based Web services. 2009-06-19 OpenACS The OpenACS kernel contains the core datamodel create and drop scripts for such things as objects, groups, partiies and the supporting PL/SQL and PL/pgSQL procedures. 3 - + Index: openacs-4/packages/acs-kernel/sql/oracle/apm-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/oracle/apm-create.sql,v diff -u -N -r1.45 -r1.46 --- openacs-4/packages/acs-kernel/sql/oracle/apm-create.sql 20 Jan 2010 00:17:17 -0000 1.45 +++ openacs-4/packages/acs-kernel/sql/oracle/apm-create.sql 10 Mar 2010 00:44:03 -0000 1.46 @@ -562,6 +562,10 @@ references apm_package_types (package_key), parameter_name varchar2(100) constraint apm_pack_params_name_nn not null, + scope varchar2(20) default 'instance' + constraint apm_parameters_scope_ck + check (scope in ('global','instance')) + constraint apm_parameters_scope_nn not null, description varchar2(2000), section_name varchar2(200), datatype varchar2(100) @@ -595,6 +599,11 @@ This is the name of the parameter, for example "DebugP." '; +comment on column apm_parameters.scope is ' + If the scope is "global", only one value of the parameter exists for the entire site. + If "instance", each package instance has its own value. +'; + comment on column apm_parameters.description is ' A human readable description of what the parameter is used for. '; @@ -764,7 +773,7 @@ dependency_type varchar2(20) constraint apm_package_deps_type_nn not null constraint apm_package_deps_type_ck - check(dependency_type in ('extends', 'provides','requires')), + check(dependency_type in ('embeds', 'extends', 'provides','requires')), service_uri varchar2(1500) constraint apm_package_deps_uri_nn not null, service_version varchar2(100) @@ -1044,11 +1053,6 @@ default null ) return apm_packages.package_id%TYPE; -function is_child( - parent_package_key in apm_package_dependencies.service_uri%TYPE, - child_package_key in apm_package_dependencies.service_uri%TYPE -) return integer; - procedure del ( package_id in apm_packages.package_id%TYPE ); @@ -1844,36 +1848,7 @@ end if; end new; - -function is_child( - parent_package_key in apm_package_dependencies.service_uri%TYPE, - child_package_key in apm_package_dependencies.service_uri%TYPE -) return integer -is - cursor dependencies is - select apd.service_uri - from apm_package_versions apv, apm_package_dependencies apd - where apd.version_id = apv.version_id - and apv.enabled_p = 't' - and apd.dependency_type = 'extends' - and apv.package_key = child_package_key; -begin - - if parent_package_key = child_package_key then - return 1; - end if; - - for dependency in dependencies loop - if dependency.service_uri = parent_package_key or - apm_package.is_child(parent_package_key, dependency.service_uri) = 1 then - return 1; - end if; - end loop; - - return 0; - -end; - + procedure del ( package_id in apm_packages.package_id%TYPE ) 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 -N -r1.29 -r1.30 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql 26 Jun 2009 00:38:33 -0000 1.29 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql 10 Mar 2010 00:44:03 -0000 1.30 @@ -61,7 +61,7 @@ return tree_sortkey from acs_object_types where object_type = p_object_type; end;' language 'plpgsql'; -create function acs_object_type_insert_tr () returns opaque as ' +create function acs_object_type_insert_tr () returns trigger as ' declare v_parent_sk varbit default null; v_max_value integer; @@ -84,7 +84,7 @@ on acs_object_types for each row execute procedure acs_object_type_insert_tr (); -create function acs_object_type_update_tr () returns opaque as ' +create function acs_object_type_update_tr () returns trigger as ' declare v_parent_sk varbit default null; v_max_value integer; Index: openacs-4/packages/acs-kernel/sql/postgresql/acs-objects-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/acs-objects-create.sql,v diff -u -N -r1.60 -r1.61 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-objects-create.sql 16 Jul 2009 00:40:07 -0000 1.60 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-objects-create.sql 10 Mar 2010 00:44:03 -0000 1.61 @@ -258,7 +258,7 @@ create index acs_objects_object_type_idx on acs_objects (object_type); -create function acs_objects_mod_ip_insert_tr () returns opaque as ' +create function acs_objects_mod_ip_insert_tr () returns trigger as ' begin new.modifying_ip := new.creation_ip; @@ -271,7 +271,7 @@ -- show errors -create function acs_objects_last_mod_update_tr () returns opaque as ' +create function acs_objects_last_mod_update_tr () returns trigger as ' begin if new.last_modified is null then new.last_modified := old.last_modified; @@ -293,7 +293,7 @@ return tree_sortkey from acs_objects where object_id = p_object_id; end;' language 'plpgsql' stable strict; -create function acs_objects_insert_tr() returns opaque as ' +create function acs_objects_insert_tr() returns trigger as ' declare v_parent_sk varbit default null; v_max_child_sortkey varbit; @@ -323,7 +323,7 @@ execute procedure acs_objects_insert_tr (); -create function acs_objects_update_tr () returns opaque as ' +create function acs_objects_update_tr () returns trigger as ' declare v_parent_sk varbit default null; v_max_child_sortkey varbit; @@ -438,7 +438,7 @@ from acs_object_context_index where object_id != ancestor_id; -create or replace function acs_objects_context_id_in_tr () returns opaque as ' +create or replace function acs_objects_context_id_in_tr () returns trigger as ' declare security_context_root integer; begin @@ -472,7 +472,7 @@ create trigger acs_objects_context_id_in_tr after insert on acs_objects for each row execute procedure acs_objects_context_id_in_tr (); -create or replace function acs_objects_context_id_up_tr () returns opaque as ' +create or replace function acs_objects_context_id_up_tr () returns trigger as ' declare pair record; outer record; @@ -544,7 +544,7 @@ create trigger acs_objects_context_id_up_tr after update on acs_objects for each row execute procedure acs_objects_context_id_up_tr (); -create function acs_objects_context_id_del_tr () returns opaque as ' +create function acs_objects_context_id_del_tr () returns trigger as ' begin delete from acs_object_context_index where object_id = old.object_id; Index: openacs-4/packages/acs-kernel/sql/postgresql/acs-permissions-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/acs-permissions-create.sql,v diff -u -N -r1.33 -r1.34 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-permissions-create.sql 13 Feb 2009 13:36:02 -0000 1.33 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-permissions-create.sql 10 Mar 2010 00:44:03 -0000 1.34 @@ -118,7 +118,7 @@ -- This would be better, since the same query could be used for both oracle -- and postgresql. -create or replace function acs_priv_hier_ins_del_tr () returns opaque as ' +create or replace function acs_priv_hier_ins_del_tr () returns trigger as ' declare new_value integer; new_key varbit default null; @@ -190,7 +190,7 @@ on acs_privilege_hierarchy for each row execute procedure acs_priv_hier_ins_del_tr (); -create or replace function acs_priv_del_tr () returns opaque as ' +create or replace function acs_priv_del_tr () returns trigger as ' begin delete from acs_privilege_descendant_map @@ -418,7 +418,7 @@ lck integer ); -create function acs_permissions_lock_tr () returns opaque as ' +create function acs_permissions_lock_tr () returns trigger as ' begin raise EXCEPTION ''FOR LOCKING ONLY, NO DML STATEMENTS ALLOWED''; return null; Index: openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql,v diff -u -N -r1.30 -r1.31 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql 6 Jan 2010 20:07:24 -0000 1.30 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql 10 Mar 2010 00:44:03 -0000 1.31 @@ -394,7 +394,7 @@ -- added by oumi@arsdigita.com - Jan 11, 2001 -create function acs_rels_in_tr () returns opaque as ' +create function acs_rels_in_tr () returns trigger as ' declare dummy integer; target_object_type_one acs_object_types.object_type%TYPE; Index: openacs-4/packages/acs-kernel/sql/postgresql/apm-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/apm-create.sql,v diff -u -N -r1.69 -r1.70 --- openacs-4/packages/acs-kernel/sql/postgresql/apm-create.sql 29 Dec 2008 21:02:29 -0000 1.69 +++ openacs-4/packages/acs-kernel/sql/postgresql/apm-create.sql 10 Mar 2010 00:44:03 -0000 1.70 @@ -708,6 +708,11 @@ datatype varchar(100) not null constraint apm_parameters_datatype_ck check(datatype in ('number', 'string','text')), + scope varchar(10) default 'instance' + constraint apm_parameters_scope_ck + check (scope in ('global','instance')) + constraint apm_parameters_scope_nn + not null, default_value text, min_n_values integer default 1 not null constraint apm_parameters_min_n_values_ck @@ -733,6 +738,11 @@ This is the name of the parameter, for example "DebugP." '; +comment on column apm_parameters.scope is ' + If the scope is "global", only one value of the parameter exists for the entire site. + If "instance", each package instance has its own value. +'; + comment on column apm_parameters.description is ' A human readable description of what the parameter is used for. '; @@ -837,6 +847,22 @@ ''f'' ); +attr_id := acs_attribute__create_attribute ( + ''apm_parameter'', + ''scope'', + ''string'', + ''Scope'', + ''Scope'', + null, + null, + null, + 1, + 1, + null, + ''type_specific'', + ''f'' + ); + attr_id := acs_attribute__create_attribute ( ''apm_parameter'', ''datatype'', @@ -996,7 +1022,7 @@ dependency_type varchar(20) constraint apm_package_deps_type_nn not null constraint apm_package_deps_type_ck - check(dependency_type in ('extends', 'provides','requires')), + check(dependency_type in ('embeds', 'extends', 'provides','requires')), service_uri varchar(1500) constraint apm_package_deps_uri_nn not null, service_version varchar(100) @@ -1307,18 +1333,19 @@ return 0; end;' language 'plpgsql'; -create or replace function apm__register_parameter (integer,varchar,varchar,varchar,varchar,varchar,varchar,integer,integer) +create or replace function apm__register_parameter (integer,varchar,varchar,varchar,varchar,varchar,varchar,varchar,integer,integer) returns integer as ' declare register_parameter__parameter_id alias for $1; -- default null register_parameter__package_key alias for $2; register_parameter__parameter_name alias for $3; - register_parameter__description alias for $4; -- default null - register_parameter__datatype alias for $5; -- default ''string'' - register_parameter__default_value alias for $6; -- default null - register_parameter__section_name alias for $7; -- default null - register_parameter__min_n_values alias for $8; -- default 1 - register_parameter__max_n_values alias for $9; -- default 1 + register_parameter__scope alias for $4; + register_parameter__description alias for $5; -- default null + register_parameter__datatype alias for $6; -- default ''string'' + register_parameter__default_value alias for $7; -- default null + register_parameter__section_name alias for $8; -- default null + register_parameter__min_n_values alias for $9; -- default 1 + register_parameter__max_n_values alias for $10; -- default 1 v_parameter_id apm_parameters.parameter_id%TYPE; v_value_id apm_parameter_values.value_id%TYPE; @@ -1339,10 +1366,10 @@ ); insert into apm_parameters - (parameter_id, parameter_name, description, package_key, datatype, + (parameter_id, parameter_name, scope, description, package_key, datatype, default_value, section_name, min_n_values, max_n_values) values - (v_parameter_id, register_parameter__parameter_name, + (v_parameter_id, register_parameter__parameter_name, register_parameter__scope, register_parameter__description, register_parameter__package_key, register_parameter__datatype, register_parameter__default_value, register_parameter__section_name, register_parameter__min_n_values, @@ -1366,6 +1393,30 @@ end;' language 'plpgsql'; +-- For backwards compatibility, register a parameter with "instance" scope. + +create or replace function apm__register_parameter (integer,varchar,varchar,varchar,varchar,varchar,varchar,integer,integer) +returns integer as ' +declare + register_parameter__parameter_id alias for $1; -- default null + register_parameter__package_key alias for $2; + register_parameter__parameter_name alias for $3; + register_parameter__description alias for $4; -- default null + register_parameter__datatype alias for $5; -- default ''string'' + register_parameter__default_value alias for $6; -- default null + register_parameter__section_name alias for $7; -- default null + register_parameter__min_n_values alias for $8; -- default 1 + register_parameter__max_n_values alias for $9; -- default 1 + +begin + return + apm__register_parameter(register_parameter__parameter_id, register_parameter__package_key, + register_parameter__parameter_name, ''instance'', + register_parameter__description, register_parameter__datatype, + register_parameter__default_value, register_parameter__section_name, + register_parameter__min_n_values, register_parameter__max_n_values); +end;' language 'plpgsql'; + -- function update_parameter create or replace function apm__update_parameter (integer,varchar,varchar,varchar,varchar,varchar,integer,integer) returns varchar as ' @@ -1468,40 +1519,99 @@ end;' language 'plpgsql' stable strict; +create or replace function apm__id_for_name (integer,varchar) +returns integer as ' +declare + id_for_name__package_id alias for $1; + id_for_name__parameter_name alias for $2; + a_parameter_id apm_parameters.parameter_id%TYPE; +begin + select parameter_id into a_parameter_id + from apm_parameters + where parameter_name = id_for_name__parameter_name + and package_key = (select package_key from apm_packages + where package_id = id_for_name__package_id); --- function get_value + if NOT FOUND + then + raise EXCEPTION ''-20000: The specified package % AND/OR parameter % do not exist in the system'', id_for_name__package_id, id_for_name__parameter_name; + end if; + + return a_parameter_id; + +end;' language 'plpgsql' stable strict; + +create or replace function apm__id_for_name (varchar,varchar) +returns integer as ' +declare + id_for_name__package_key alias for $1; + id_for_name__parameter_name alias for $2; + a_parameter_id apm_parameters.parameter_id%TYPE; +begin + select parameter_id into a_parameter_id + from apm_parameters p + where p.parameter_name = id_for_name__parameter_name and + p.package_key = id_for_name__package_key; + + if NOT FOUND + then + raise EXCEPTION ''-20000: The specified package % AND/OR parameter % do not exist in the system'', id_for_name__package_key, id_for_name__parameter_name; + end if; + + return a_parameter_id; + +end;' language 'plpgsql' stable strict; + create or replace function apm__get_value (integer,varchar) returns varchar as ' declare get_value__package_id alias for $1; get_value__parameter_name alias for $2; v_parameter_id apm_parameter_values.parameter_id%TYPE; + value apm_parameter_values.attr_value%TYPE; begin - select parameter_id into v_parameter_id - from apm_parameters - where parameter_name = get_value__parameter_name - and package_key = (select package_key from apm_packages - where package_id = get_value__package_id); - return apm__get_value( - v_parameter_id, - get_value__package_id - ); + v_parameter_id := apm__id_for_name (get_value__package_id, get_value__parameter_name); + + select attr_value into value from apm_parameter_values v + where v.package_id = get_value__package_id + and parameter_id = get_value__parameter_id; + + return value; end;' language 'plpgsql' stable strict; +create or replace function apm__get_value (varchar,varchar) +returns varchar as ' +declare + get_value__package_key alias for $1; + get_value__parameter_name alias for $2; + v_parameter_id apm_parameter_values.parameter_id%TYPE; + value apm_parameter_values.attr_value%TYPE; +begin + v_parameter_id := apm__id_for_name (get_value__package_key, get_value__parameter_name); --- procedure set_value -create or replace function apm__set_value (integer,integer,varchar) + select attr_value into value from apm_parameter_values v + where v.package_id is null + and parameter_id = get_value__parameter_id; + + return value; + +end;' language 'plpgsql' stable strict; + +create or replace function apm__set_value (integer,varchar,varchar) returns integer as ' declare - set_value__parameter_id alias for $1; - set_value__package_id alias for $2; + set_value__package_id alias for $1; + set_value__parameter_name alias for $2; set_value__attr_value alias for $3; + v_parameter_id apm_parameter_values.parameter_id%TYPE; v_value_id apm_parameter_values.value_id%TYPE; begin + v_parameter_id := apm__id_for_name (set_value__package_id, set_value__parameter_name); + -- Determine if the value exists select value_id into v_value_id from apm_parameter_values - where parameter_id = set_value__parameter_id + where parameter_id = v_parameter_id and package_id = set_value__package_id; update apm_parameter_values set attr_value = set_value__attr_value where value_id = v_value_id; @@ -1513,51 +1623,47 @@ v_value_id := apm_parameter_value__new( null, set_value__package_id, - set_value__parameter_id, + v_parameter_id, set_value__attr_value ); end if; - return 0; + return 0; end;' language 'plpgsql'; - --- procedure set_value -create or replace function apm__set_value (integer,varchar,varchar) +create or replace function apm__set_value (varchar,varchar,varchar) returns integer as ' declare - set_value__package_id alias for $1; + set_value__package_key alias for $1; set_value__parameter_name alias for $2; set_value__attr_value alias for $3; v_parameter_id apm_parameter_values.parameter_id%TYPE; + v_value_id apm_parameter_values.value_id%TYPE; begin - select parameter_id into v_parameter_id - from apm_parameters - where parameter_name = set_value__parameter_name - and package_key = (select package_key from apm_packages - where package_id = set_value__package_id); + v_parameter_id := apm__id_for_name (set_value__package_key, set_value__parameter_name); - if NOT FOUND - then - raise EXCEPTION ''-20000: The specified package % AND/OR parameter % do not exist in the system'', set_value__package_id, set_value__parameter_name; - end if; + -- Determine if the value exists + select value_id into v_value_id from apm_parameter_values + where parameter_id = v_parameter_id + and package_id is null; + update apm_parameter_values set attr_value = set_value__attr_value + where value_id = v_value_id; + update acs_objects set last_modified = now() + where object_id = v_value_id; + -- exception + if NOT FOUND + then + v_value_id := apm_parameter_value__new( + null, + null, + v_parameter_id, + set_value__attr_value + ); + end if; - PERFORM apm__set_value( - v_parameter_id, - set_value__package_id, - set_value__attr_value - ); - return 0; end;' language 'plpgsql'; - - --- show errors - --- create or replace package body apm_package --- procedure initialize_parameters - create or replace function apm_package__is_child(varchar, varchar) returns boolean as ' declare parent_package_key alias for $1; @@ -1574,7 +1680,7 @@ from apm_package_versions apv, apm_package_dependencies apd where apd.version_id = apv.version_id and apv.enabled_p - and apd.dependency_type = ''extends'' + and apd.dependency_type in (''embeds'', ''extends'') and apv.package_key = child_package_key loop if dependency.service_uri = parent_package_key or @@ -2586,6 +2692,3 @@ return 0; end;' language 'plpgsql'; - - --- show errors Index: openacs-4/packages/acs-kernel/sql/postgresql/groups-body-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/groups-body-create.sql,v diff -u -N -r1.31 -r1.32 --- openacs-4/packages/acs-kernel/sql/postgresql/groups-body-create.sql 12 Feb 2009 02:27:02 -0000 1.31 +++ openacs-4/packages/acs-kernel/sql/postgresql/groups-body-create.sql 10 Mar 2010 00:44:03 -0000 1.32 @@ -15,18 +15,18 @@ -- However, PG 7.3 introduces a new type "trigger" for the return type -- needed for functions called by triggers. "create function" transmorgifies --- the return type "opaque" to "trigger" so PG 7.2 dumps can be restored into +-- the return type "trigger" to "trigger" so PG 7.2 dumps can be restored into -- PG 7.3. But "create or replace" doesn't do it. We can't use "trigger" -- because we currently are still supporting PG 7.2. Isn't life a pleasure? -- I'm leaving the triggers we aren't overriding as "create or replace" because -- this will be the right thing to do if the PG folks fix this problem or when --- we drop support of PG 7.2 and no longer need to declare these as type "opaque" +-- we drop support of PG 7.2 and no longer need to declare these as type "trigger" drop trigger membership_rels_in_tr on membership_rels; drop function membership_rels_in_tr (); -create or replace function membership_rels_in_tr () returns opaque as ' +create or replace function membership_rels_in_tr () returns trigger as ' declare v_object_id_one acs_rels.object_id_one%TYPE; v_object_id_two acs_rels.object_id_two%TYPE; @@ -85,7 +85,7 @@ create trigger membership_rels_in_tr after insert on membership_rels for each row execute procedure membership_rels_in_tr (); -create or replace function membership_rels_up_tr () returns opaque as ' +create or replace function membership_rels_up_tr () returns trigger as ' declare map record; begin @@ -112,7 +112,7 @@ create trigger membership_rels_up_tr before update on membership_rels for each row execute procedure membership_rels_up_tr (); -create or replace function membership_rels_del_tr () returns opaque as ' +create or replace function membership_rels_del_tr () returns trigger as ' declare v_error text; map record; @@ -143,7 +143,7 @@ drop trigger composition_rels_in_tr on composition_rels; drop function composition_rels_in_tr (); -create or replace function composition_rels_in_tr () returns opaque as ' +create or replace function composition_rels_in_tr () returns trigger as ' declare v_object_id_one acs_rels.object_id_one%TYPE; v_object_id_two acs_rels.object_id_two%TYPE; @@ -253,7 +253,7 @@ -- TO DO: See if this can be optimized now that the member and component -- mapping tables have been combined -- -create or replace function composition_rels_del_tr () returns opaque as ' +create or replace function composition_rels_del_tr () returns trigger as ' declare v_object_id_one acs_rels.object_id_one%TYPE; v_object_id_two acs_rels.object_id_two%TYPE; Index: openacs-4/packages/acs-kernel/sql/postgresql/groups-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/groups-create.sql,v diff -u -N -r1.26 -r1.27 --- openacs-4/packages/acs-kernel/sql/postgresql/groups-create.sql 10 Feb 2009 18:31:54 -0000 1.26 +++ openacs-4/packages/acs-kernel/sql/postgresql/groups-create.sql 10 Mar 2010 00:44:03 -0000 1.27 @@ -412,7 +412,7 @@ -- sourced. That file will replace these triggers with triggers -- that actually do useful work -create function membership_rels_in_tr () returns opaque as ' +create function membership_rels_in_tr () returns trigger as ' declare begin raise EXCEPTION ''-20000: Insert to membership rels not yet supported''; @@ -427,7 +427,7 @@ -- show errors -create function composition_rels_in_tr () returns opaque as ' +create function composition_rels_in_tr () returns trigger as ' declare begin raise EXCEPTION ''-20000: Insert to composition rels not yet supported''; Index: openacs-4/packages/acs-kernel/sql/postgresql/lob.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/lob.sql,v diff -u -N -r1.5 -r1.6 --- openacs-4/packages/acs-kernel/sql/postgresql/lob.sql 24 Jul 2004 14:44:55 -0000 1.5 +++ openacs-4/packages/acs-kernel/sql/postgresql/lob.sql 10 Mar 2010 00:44:03 -0000 1.6 @@ -24,7 +24,7 @@ refcount integer not null default 0 ); -create or replace function on_lobs_delete() returns opaque as ' +create or replace function on_lobs_delete() returns trigger as ' begin delete from lob_data where lob_id = old.lob_id; return old; @@ -51,7 +51,7 @@ -- and PG 7.0. The ACS doesn't share LOBs between tables -- or rows within a table anyway, I don't think/hope. -create or replace function on_lob_ref() returns opaque as ' +create or replace function on_lob_ref() returns trigger as ' begin if TG_OP = ''UPDATE'' then if new.lob = old.lob then Index: openacs-4/packages/acs-kernel/sql/postgresql/rel-constraints-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/rel-constraints-create.sql,v diff -u -N -r1.16 -r1.17 --- openacs-4/packages/acs-kernel/sql/postgresql/rel-constraints-create.sql 25 Sep 2006 17:59:16 -0000 1.16 +++ openacs-4/packages/acs-kernel/sql/postgresql/rel-constraints-create.sql 10 Mar 2010 00:44:03 -0000 1.17 @@ -496,7 +496,7 @@ create index rc_segment_required_seg_idx on rc_segment_required_seg_map(required_rel_segment); -create function rel_constraints_ins_tr () returns opaque as ' +create function rel_constraints_ins_tr () returns trigger as ' declare v_rec record; begin @@ -539,7 +539,7 @@ on rel_constraints for each row execute procedure rel_constraints_ins_tr (); -create function rel_constraints_del_tr () returns opaque as ' +create function rel_constraints_del_tr () returns trigger as ' declare v_rec record; begin Index: openacs-4/packages/acs-kernel/sql/postgresql/rel-segments-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/rel-segments-create.sql,v diff -u -N -r1.13 -r1.14 --- openacs-4/packages/acs-kernel/sql/postgresql/rel-segments-create.sql 25 Sep 2006 17:21:43 -0000 1.13 +++ openacs-4/packages/acs-kernel/sql/postgresql/rel-segments-create.sql 10 Mar 2010 00:44:03 -0000 1.14 @@ -276,7 +276,7 @@ -- destroyed. These don't call the above helper functions because we're just -- creating the identity row for the party. -create or replace function parties_in_tr () returns opaque as ' +create or replace function parties_in_tr () returns trigger as ' begin insert into party_approved_member_map @@ -291,7 +291,7 @@ create trigger parties_in_tr after insert on parties for each row execute procedure parties_in_tr (); -create or replace function parties_del_tr () returns opaque as ' +create or replace function parties_del_tr () returns trigger as ' begin delete from party_approved_member_map @@ -311,7 +311,7 @@ -- group with that rel_type. This was intentional on the part of the aD folks -- who added relational segments to ACS 4.2. -create or replace function rel_segments_in_tr () returns opaque as ' +create or replace function rel_segments_in_tr () returns trigger as ' begin insert into party_approved_member_map @@ -328,7 +328,7 @@ create trigger rel_segments_in_tr before insert on rel_segments for each row execute procedure rel_segments_in_tr (); -create or replace function rel_segments_del_tr () returns opaque as ' +create or replace function rel_segments_del_tr () returns trigger as ' begin delete from party_approved_member_map Index: openacs-4/packages/acs-kernel/sql/postgresql/site-nodes-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/site-nodes-create.sql,v diff -u -N -r1.21 -r1.22 --- openacs-4/packages/acs-kernel/sql/postgresql/site-nodes-create.sql 18 Jun 2004 18:21:57 -0000 1.21 +++ openacs-4/packages/acs-kernel/sql/postgresql/site-nodes-create.sql 10 Mar 2010 00:44:03 -0000 1.22 @@ -69,7 +69,7 @@ return tree_sortkey from site_nodes where node_id = p_node_id; end;' language 'plpgsql' stable strict; -create or replace function site_node_insert_tr () returns opaque as ' +create or replace function site_node_insert_tr () returns trigger as ' declare v_parent_sk varbit default null; v_max_value integer; @@ -98,7 +98,7 @@ on site_nodes for each row execute procedure site_node_insert_tr (); -create or replace function site_node_update_tr () returns opaque as ' +create or replace function site_node_update_tr () returns trigger as ' declare v_parent_sk varbit default null; v_max_value integer; Index: openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.6.0d5-5.6.0d6.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.6.0d5-5.6.0d6.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.6.0d5-5.6.0d6.sql 10 Mar 2010 00:44:03 -0000 1.1 @@ -0,0 +1,28 @@ +create or replace function apm_package__is_child(varchar, varchar) returns boolean as ' +declare + parent_package_key alias for $1; + child_package_key alias for $2; + dependency record; +begin + + if parent_package_key = child_package_key then + return ''t''; + end if; + + for dependency in + select apd.service_uri + from apm_package_versions apv, apm_package_dependencies apd + where apd.version_id = apv.version_id + and apv.enabled_p + and apd.dependency_type in (''embeds'', ''extends'') + and apv.package_key = child_package_key + loop + if dependency.service_uri = parent_package_key or + apm_package__is_child(parent_package_key, dependency.service_uri) then + return ''t''; + end if; + end loop; + + return ''f''; +end;' language 'plpgsql'; + Index: openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.tcl,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.tcl 2 Jan 2010 14:04:00 -0000 1.3 +++ openacs-4/packages/acs-object-management/www/admin/widget-add-edit-2.tcl 10 Mar 2010 00:44:03 -0000 1.4 @@ -126,4 +126,4 @@ ad_script_abort } -template::head::add_javascript -src widget-add-edit-2.js \ No newline at end of file +template::head::add_javascript -src widget-add-edit-2.js Index: openacs-4/packages/acs-tcl/tcl/apm-install-procs-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/apm-install-procs-oracle.xql,v diff -u -N -r1.16 -r1.17 --- openacs-4/packages/acs-tcl/tcl/apm-install-procs-oracle.xql 19 Jan 2010 22:54:25 -0000 1.16 +++ openacs-4/packages/acs-tcl/tcl/apm-install-procs-oracle.xql 10 Mar 2010 00:44:03 -0000 1.17 @@ -259,6 +259,16 @@ + + + begin + :1 := apm.parameter_p( + :descendent_package_key, + :parameter_name); + end; + + + begin @@ -276,6 +286,16 @@ + + + begin + :1 := apm.parameter_p( + :new_package_key, + :parameter_name); + end; + + + begin Index: openacs-4/packages/acs-tcl/tcl/apm-install-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/apm-install-procs-postgresql.xql,v diff -u -N -r1.17 -r1.18 --- openacs-4/packages/acs-tcl/tcl/apm-install-procs-postgresql.xql 19 Jan 2010 22:32:39 -0000 1.17 +++ openacs-4/packages/acs-tcl/tcl/apm-install-procs-postgresql.xql 10 Mar 2010 00:44:03 -0000 1.18 @@ -200,6 +200,12 @@ + + + select apm__parameter_p(:descendent_package_key, :parameter_name); + + + select apm__register_parameter(null, :descendent_package_key, :parameter_name, @@ -208,6 +214,12 @@ + + + select apm__parameter_p(:new_package_key, :parameter_name); + + + select apm__register_parameter(null, :new_package_key, :parameter_name, :description, Index: openacs-4/packages/acs-tcl/tcl/apm-install-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/apm-install-procs.tcl,v diff -u -N -r1.100 -r1.101 --- openacs-4/packages/acs-tcl/tcl/apm-install-procs.tcl 19 Jan 2010 22:32:39 -0000 1.100 +++ openacs-4/packages/acs-tcl/tcl/apm-install-procs.tcl 10 Mar 2010 00:44:03 -0000 1.101 @@ -124,20 +124,21 @@ } } -ad_proc -private pkg_info_new { package_key spec_file_path extends provides requires {dependency_p ""} {comment ""}} { +ad_proc -private pkg_info_new { package_key spec_file_path embeds extends provides requires {dependency_p ""} {comment ""}} { Returns a datastructure that maintains information about a package. @param package_key The key of the package. @param spec_file_path The path to the package specification file - @param extends A list of packages extended by the package.. + @param embeds A list of packages to be embedded in the package. + @param extends A list of packages extended by the package. @param provides A list of dependencies provided by the package. @param requires A list of requirements provided by the package.. @param dependency_p Can the package be installed without violating dependency checking. @param comment Some text about the package. Useful to explain why it fails dependency check. @return a list whose first element is a package key and whose second element is a path to the associated .info file. } { - return [list $package_key $spec_file_path $extends $provides $requires $dependency_p $comment] + return [list $package_key $spec_file_path $embeds $extends $provides $requires $dependency_p $comment] } ad_proc -private pkg_info_key {pkg_info} { @@ -167,44 +168,52 @@ return [file dirname [pkg_info_spec $pkg_info]] } -ad_proc -private pkg_info_extends {pkg_info} { +ad_proc -private pkg_info_embeds {pkg_info} { - @return The dependencies provided by the package. + @return The "embeds" dependencies of the package. } { return [lindex $pkg_info 2] } +ad_proc -private pkg_info_extends {pkg_info} { + + @return The "extends" dependencies of the package. + +} { + return [lindex $pkg_info 3] +} + ad_proc -private pkg_info_provides {pkg_info} { @return The dependencies provided by the package. } { - return [lindex $pkg_info 3] + return [lindex $pkg_info 4] } ad_proc -private pkg_info_requires {pkg_info} { - @return The dependencies required by the package info map. + @return The dependencies "requires" dependencies of the package. } { - return [lindex $pkg_info 4] + return [lindex $pkg_info 5] } ad_proc -private pkg_info_dependency_p {pkg_info} { @return Does it pass the dependency checker? "" Means it has not been run yet. } { - return [lindex $pkg_info 5] + return [lindex $pkg_info 6] } ad_proc -private pkg_info_comment {pkg_info} { @return Any comment specified about this package. } { - return [lindex $pkg_info 6] + return [lindex $pkg_info 7] } # DRB: This routine does more than check dependencies, it also parses spec files, @@ -256,7 +265,9 @@ [apm_package_supports_rdbms_p -package_key $package(package.key)] } { lappend install_pend [pkg_info_new \ $package(package.key) \ - $spec_file $package(extends) \ + $spec_file \ + $package(embeds) \ + $package(extends) \ $package(provides) \ $package(requires) \ ""] @@ -298,7 +309,7 @@ # Now determine if we can add another package to the install set. foreach pkg_info $install_pend { set satisfied_p 1 - foreach req [concat [pkg_info_extends $pkg_info] [pkg_info_requires $pkg_info]] { + foreach req [concat [pkg_info_embeds $pkg_info] [pkg_info_extends $pkg_info] [pkg_info_requires $pkg_info]] { if {[apm_dependency_provided_p -dependency_list $install_in_provides \ [lindex $req 0] [lindex $req 1]] != 1} { # Unsatisfied dependency. @@ -318,6 +329,7 @@ lappend install_in [pkg_info_new \ [pkg_info_key $pkg_info] \ [pkg_info_spec $pkg_info] \ + [pkg_info_embeds $pkg_info] \ [pkg_info_extends $pkg_info] \ [pkg_info_provides $pkg_info] \ [pkg_info_requires $pkg_info] \ @@ -340,7 +352,7 @@ foreach pkg_info $install_pend { set satisfied_p 1 - foreach req [concat [pkg_info_extends $pkg_info] [pkg_info_requires $pkg_info]] { + foreach req [concat [pkg_info_embeds $pkg_info] [pkg_info_extends $pkg_info] [pkg_info_requires $pkg_info]] { set counter 0 foreach pkg_info_add $pkg_info_all { # Will this package do anything to change whether this requirement has been satisfied? @@ -381,8 +393,8 @@ if { [exists_and_not_null install_pend] } { foreach pkg_info $install_pend { lappend install_in [pkg_info_new [pkg_info_key $pkg_info] [pkg_info_spec $pkg_info] \ - [pkg_info_extends $pkg_info] [pkg_info_provides $pkg_info] \ - [pkg_info_requires $pkg_info] \ + [pkg_info_embeds $pkg_info] [pkg_info_extends $pkg_info] \ + [pkg_info_provides $pkg_info] [pkg_info_requires $pkg_info] \ "f" $install_error([pkg_info_key $pkg_info])] } return [list 0 $install_in] @@ -480,14 +492,14 @@ array set version $repository($package_key) set satisfied_p 1 - foreach req [concat $version(extends) $version(requires)] { + foreach req [concat $version(embeds) $version(extends) $version(requires)] { set req_uri [lindex $req 0] set req_version [lindex $req 1] if { ![info exists provided($req_uri)] || \ [apm_version_names_compare $provided($req_uri) $req_version]== -1 } { - ns_log Debug "apm_dependency_check_new: $package_key extends or requires $req_uri $req_version => failed" + ns_log Debug "apm_dependency_check_new: $package_key embeds, extends or requires $req_uri $req_version => failed" set satisfied_p 0 @@ -497,7 +509,7 @@ set required($req_uri) $req_version } } else { - ns_log Debug "apm_dependency_check_new: $package_key extends or requires $req_uri $req_version => OK" + ns_log Debug "apm_dependency_check_new: $package_key embeds, extends or requires $req_uri $req_version => OK" } } @@ -609,16 +621,16 @@ lappend result(packages) $package_key # Find unsatisfied requirements - foreach req [concat $version(extends) $version(requires)] { + foreach req [concat $version(embeds) $version(extends) $version(requires)] { set req_uri [lindex $req 0] set req_version [lindex $req 1] if { ![info exists provided($req_uri)] || \ [apm_version_names_compare $provided($req_uri) $req_version] == -1 } { lappend failed($package_key) [list $req_uri $req_version] if { [info exists provided($req_uri)] } { - ns_log Debug "apm_dependency_check_new: Failed dependency: $package_key extends/requires $req_uri $req_version, but we only provide $provided($req_uri)" + ns_log Debug "apm_dependency_check_new: Failed dependency: $package_key embeds/extends/requires $req_uri $req_version, but we only provide $provided($req_uri)" } else { - ns_log Debug "apm_dependency_check_new: Failed dependency: $package_key extends/requires $req_uri $req_version, but we don't have it" + ns_log Debug "apm_dependency_check_new: Failed dependency: $package_key embeds/extends/requires $req_uri $req_version, but we don't have it" } } } @@ -694,6 +706,7 @@ # satisfaction later lappend pkg_info_list [pkg_info_new $package(package.key) \ $spec_file \ + $package(embeds) \ $package(extends) \ $package(provides) \ $package(requires) \ @@ -878,7 +891,7 @@ # Update all other package information. apm_package_install_dependencies -callback $callback \ - $version(extends) $version(provides) $version(requires) $version_id + $version(embeds) $version(extends) $version(provides) $version(requires) $version_id apm_package_install_owners -callback $callback $version(owners) $version_id apm_package_install_callbacks -callback $callback $version(callbacks) $version_id apm_build_one_package_relationships $package_key @@ -974,24 +987,32 @@ return $version_id } - ad_proc apm_copy_descendent_params { new_package_key } { Copy new parameters in the package to its descendents. Called when a package is upgraded. } { foreach descendent_package_key [nsv_get apm_package_descendents $new_package_key] { db_foreach descendent_params {} { - db_exec_plsql copy_descendent_param {} + if { [db_exec_plsql param_exists {}] } { + error "$parameter_name already exists in package $descendent_package_key" + } else { + db_exec_plsql copy_descendent_param {} + } } } } ad_proc apm_copy_inherited_params { new_package_key } { - Copy parameters from a packages ancestors. Called for an "extends" dependency. + Copy parameters from a packages ancestors. Called for "embeds" and "extends" + dependencies. } { - foreach inherited_package_key [nsv_get apm_package_inherit_order $new_package_key] { + foreach inherited_package_key [lrange [nsv_get apm_package_inherit_order $new_package_key] 0 end-1] { db_foreach inherited_params {} { - db_exec_plsql copy_inherited_param {} + if { [db_exec_plsql param_exists {}] } { + error "$parameter_name already exists in package $package_key" + } else { + db_exec_plsql copy_inherited_param {} + } } } } @@ -1319,7 +1340,8 @@ } } -ad_proc -private apm_package_install_dependencies { {-callback apm_dummy_callback} extends provides requires version_id} { +ad_proc -private apm_package_install_dependencies { {-callback apm_dummy_callback} embeds \ + extends provides requires version_id} { Install all package dependencies. @@ -1342,6 +1364,13 @@ apm_interface_add $version_id $interface_uri $interface_version } + foreach item $embeds { + set dependency_uri [lindex $item 0] + set dependency_version [lindex $item 1] + ns_log Debug "apm_package_install_dependencies: Registering dependency $dependency_uri, $dependency_version for $version_id" + apm_dependency_add embeds $version_id $dependency_uri $dependency_version + } + foreach item $extends { set dependency_uri [lindex $item 0] set dependency_version [lindex $item 1] @@ -2031,7 +2060,7 @@ -parent_node $package_node \ -array version - foreach dependency_type { provides requires extends } { + foreach dependency_type { provides requires embeds extends } { set version($dependency_type) {} foreach dependency_node [xml_node_get_children_by_name $package_node "$dependency_type"] { lappend version($dependency_type) \ Index: openacs-4/packages/acs-tcl/tcl/apm-install-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/apm-install-procs.xql,v diff -u -N -r1.6 -r1.7 --- openacs-4/packages/acs-tcl/tcl/apm-install-procs.xql 19 Jan 2010 22:32:39 -0000 1.6 +++ openacs-4/packages/acs-tcl/tcl/apm-install-procs.xql 10 Mar 2010 00:44:03 -0000 1.7 @@ -94,10 +94,6 @@ select ap.* from apm_parameters ap where package_key = :new_package_key - and not exists (select 1 - from apm_parameters ap2 - where ap2.parameter_name = ap.parameter_name - and ap2.package_key = :descendent_package_key) @@ -106,10 +102,6 @@ select ap.* from apm_parameters ap where package_key = :inherited_package_key - and not exists (select 1 - from apm_parameters ap2 - where ap2.parameter_name = ap.parameter_name - and ap2.package_key = :new_package_key) Index: openacs-4/packages/acs-tcl/tcl/apm-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/apm-procs.tcl,v diff -u -N -r1.83 -r1.84 --- openacs-4/packages/acs-tcl/tcl/apm-procs.tcl 12 Jul 2009 01:08:30 -0000 1.83 +++ openacs-4/packages/acs-tcl/tcl/apm-procs.tcl 10 Mar 2010 00:44:03 -0000 1.84 @@ -177,29 +177,41 @@ } -ad_proc apm_package_list_search_order { +ad_proc apm_package_list_url_resolution { package_list } { - Left-right, breadth-first traverse of the inheritance DAG. + Use a left-right, breadth-first traverse of the inheritance DAG to build a + structure to be used by the request processor to resolve URLs based on a + package's "extends" and "embeds" dependencies. } { global apm_visited_package_keys - global apm_package_search_order + global apm_package_url_resolution - foreach package_key $package_list { + foreach package $package_list { + foreach {package_key dependency_type} $package {} if { [info exists apm_visited_package_keys($package_key)] } { continue } - lappend apm_package_search_order $package_key + switch $dependency_type { + extends - + "" { lappend apm_package_url_resolution [acs_root_dir]/packages/$package_key/www } + embeds { lappend apm_package_url_resolution \ + [list [acs_root_dir]/packages/$package_key/embed $package_key] + } + default { + error "apm_package_list_url_resolution: dependency type is $dependency_type" + } + } set apm_visited_package_keys($package_key) 1 } # Make sure old versions work ... - foreach package_key $package_list { - set inherit_templates_p 1 + foreach package $package_list { + foreach {package_key dependency_type} $package {} + set inherit_templates_p t +#fix! catch { db_1row get_inherit_templates_p {} } - if { [string is true $inherit_templates_p] } { - apm_package_list_search_order [db_list get_dependencies {}] - } + apm_package_list_url_resolution [db_list_of_lists get_dependencies {}] } } @@ -255,15 +267,15 @@ } { global apm_visited_package_keys - global apm_package_search_order + global apm_package_url_resolution global apm_package_inherit_order global apm_package_load_libraries_order global apm_package_descendents array unset apm_visited_package_keys - set apm_package_search_order [list] - apm_package_list_search_order $package_key - nsv_set apm_package_search_order $package_key $apm_package_search_order + set apm_package_url_resolution [list] + apm_package_list_url_resolution $package_key + nsv_set apm_package_url_resolution $package_key $apm_package_url_resolution array unset apm_visited_package_keys set apm_package_inherit_order [list] @@ -295,39 +307,32 @@ ad_proc apm_package_descendents { package_key } { - Wrapper that returns the cached package descendents list. - } { return [nsv_get apm_package_descendents $package_key] } ad_proc apm_package_inherit_order { package_key } { - Wrapper that returns the cached package inheritance order list. - } { return [nsv_get apm_package_inherit_order $package_key] } -ad_proc apm_package_search_order { +ad_proc apm_package_url_resolution { package_key } { - Wrapper that returns the cached package search order list. - } { - return [nsv_get apm_package_search_order $package_key] + return [nsv_get apm_package_url_resolution $package_key] } + ad_proc apm_package_load_libraries_order { package_key } { - Wrapper that returns the cached package library load order list. - } { return [nsv_get apm_package_load_libraries_order $package_key] } @@ -2051,6 +2056,7 @@ site_node::update_cache -node_id $node_id } +# DRB: parameter fix! db_foreach get_params {} { db_1row get_new_parameter_id {} db_dml update_param {} Index: openacs-4/packages/acs-tcl/tcl/apm-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/apm-procs.xql,v diff -u -N -r1.25 -r1.26 --- openacs-4/packages/acs-tcl/tcl/apm-procs.xql 17 Mar 2009 01:11:07 -0000 1.25 +++ openacs-4/packages/acs-tcl/tcl/apm-procs.xql 10 Mar 2010 00:44:03 -0000 1.26 @@ -7,7 +7,7 @@ from apm_package_versions apv, apm_package_dependencies apd where apd.version_id = apv.version_id and apv.enabled_p = 't' - and apd.dependency_type = 'extends' + and apd.dependency_type in ('extends', 'embeds') and apd.service_uri = :package_key @@ -20,22 +20,35 @@ - + + select apd.service_uri + from apm_package_versions apv, apm_package_dependencies apd + where apv.package_key = :package_key + and apv.installed_p = 't' + and apd.version_id = apv.version_id + and apd.dependency_type in ('extends', 'embeds') + order by apd.dependency_id + + + + + select inherit_templates_p from apm_package_types where package_key = :package_key - + - select apd.service_uri + select apd.service_uri, apd.dependency_type from apm_package_versions apv, apm_package_dependencies apd where apv.package_key = :package_key and apv.installed_p = 't' and apd.version_id = apv.version_id - and apd.dependency_type = 'extends' + and (apd.dependency_type = 'embeds' + or apd.dependency_type = 'extends' and :inherit_templates_p = 't') order by apd.dependency_id @@ -47,7 +60,7 @@ where apv.package_key = :package_key and apv.installed_p = 't' and apd.version_id = apv.version_id - and apd.dependency_type = 'extends' + and apd.dependency_type in ('extends', 'embeds') order by apd.dependency_id desc @@ -59,7 +72,7 @@ where apv.package_key = :package_key and apv.installed_p = 't' and apd.version_id = apv.version_id - and apd.dependency_type in ('requires', 'extends') + and apd.dependency_type in ('requires', 'embeds', 'extends') order by apd.dependency_id desc Index: openacs-4/packages/acs-tcl/tcl/apm-xml-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/apm-xml-procs.tcl,v diff -u -N -r1.27 -r1.28 --- openacs-4/packages/acs-tcl/tcl/apm-xml-procs.tcl 25 Nov 2008 17:08:50 -0000 1.27 +++ openacs-4/packages/acs-tcl/tcl/apm-xml-procs.tcl 10 Mar 2010 00:44:03 -0000 1.28 @@ -169,7 +169,8 @@
    • path: a path to the file read
    • mtime: the mtime of the file read -
    • provides, extends, and requires: +
    • provides, embeds, extends, + and requires:

      lists of dependency information, containing elements of the form [list $url $version]

    • owners: a list of owners containing elements of the form @@ -311,9 +312,10 @@ set properties(provides) [list] set properties(requires) [list] + set properties(embeds) [list] set properties(extends) [list] - foreach dependency_type { provides requires extends } { + foreach dependency_type { provides requires embeds extends } { set dependency_types [xml_node_get_children_by_name $version $dependency_type] foreach node $dependency_types { Index: openacs-4/packages/acs-tcl/tcl/form-processing-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/form-processing-procs.tcl,v diff -u -N -r1.62 -r1.63 --- openacs-4/packages/acs-tcl/tcl/form-processing-procs.tcl 15 Sep 2009 22:58:32 -0000 1.62 +++ openacs-4/packages/acs-tcl/tcl/form-processing-procs.tcl 10 Mar 2010 00:44:03 -0000 1.63 @@ -794,6 +794,7 @@ return -code error "element $element_name: a form can only declare one key" } set af_key_name($form_name) $element_name + set af_type(${form_name}__$element_name) integer if { $af_element_parameters($element_name:key) ne "" } { if { [info exists af_sequence_name($form_name)] } { return -code error "element $element_name: duplicate sequence" @@ -802,6 +803,7 @@ } lappend form_command "-datatype" "integer" "-widget" "hidden" template::element create $form_name __key_signature -datatype text -widget hidden -value "" + template::element create $form_name __key -datatype text -widget hidden -value $element_name template::element create $form_name __new_p -datatype integer -widget hidden -value 0 } @@ -869,17 +871,17 @@ foreach element_name $af_element_names($form_name) { if { [llength $element_name] == 1 } { if { [info exists af_from_sql(${form_name}__$element_name)] } { - if { [empty_string_p [info commands "::template::util::$af_type(${form_name}__$element_name)::acquire"]] } { + if { [info commands "::template::util::$af_type(${form_name}__$element_name)::acquire"] eq "" } { return -code error "\"from_sql\" not valid for type \"$af_type(${form_name}__$element_name)\"" } } if { [info exists af_to_sql(${form_name}__$element_name)] } { - if { [empty_string_p [info commands "::template::util::$af_type(${form_name}__$element_name)::get_property"]] } { + if { [info commands ::template::util::$af_type(${form_name}__$element_name)::get_property] eq "" } { return -code error "\"to_sql\" not valid for type \"$af_type(${form_name}__$element_name)\"" } } if { [info exists af_to_html(${form_name}__$element_name)] } { - if { [empty_string_p [info commands "::template::util::$af_type(${form_name}__$element_name)::get_property"]] } { + if { [empty_string_p [info commands ::template::util::$af_type(${form_name}__$element_name)::get_property]] } { return -code error "\"to_html\" not valid for type \"$af_type(${form_name}__$element_name)\"" } } @@ -969,6 +971,8 @@ if { [info exists af_from_sql(${form_name}__$element_name)] } { set values($element_name) [template::util::$af_type(${form_name}__$element_name)::acquire \ $af_from_sql(${form_name}__$element_name) $values($element_name)] + } elseif { [info commands ::template::data::from_sql::$af_type(${form_name}__$element_name)] ne "" } { + set values($element_name) [template::data::from_sql::$af_type(${form_name}__$element_name) $values($element_name)] } } } Index: openacs-4/packages/acs-tcl/tcl/parameter-procs-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/parameter-procs-oracle.xql,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/acs-tcl/tcl/parameter-procs-oracle.xql 15 May 2002 18:47:31 -0000 1.1 +++ openacs-4/packages/acs-tcl/tcl/parameter-procs-oracle.xql 10 Mar 2010 00:44:03 -0000 1.2 @@ -3,6 +3,18 @@ oracle8.1.6 + + + begin + apm.set_value( + package_key => :package_key, + parameter_name => :parameter, + attr_value => :value + ); + end; + + + begin Index: openacs-4/packages/acs-tcl/tcl/parameter-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/parameter-procs-postgresql.xql,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/acs-tcl/tcl/parameter-procs-postgresql.xql 16 May 2002 18:36:29 -0000 1.1 +++ openacs-4/packages/acs-tcl/tcl/parameter-procs-postgresql.xql 10 Mar 2010 00:44:03 -0000 1.2 @@ -3,10 +3,20 @@ postgresql7.1 + + + select apm__set_value( + :package_key::varchar, + :parameter, + :value + ); + + + select apm__set_value( - :package_id, + :package_id::integer, :parameter, :value ); Index: openacs-4/packages/acs-tcl/tcl/parameter-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/parameter-procs.tcl,v diff -u -N -r1.16 -r1.17 --- openacs-4/packages/acs-tcl/tcl/parameter-procs.tcl 10 Jan 2007 21:22:12 -0000 1.16 +++ openacs-4/packages/acs-tcl/tcl/parameter-procs.tcl 10 Mar 2010 00:44:03 -0000 1.17 @@ -26,12 +26,93 @@ db_dml set {} } +ad_proc -public parameter::set_global_value { + {-package_key:required} + {-parameter:required} + {-value:required} +} { + Set a global package parameter. + + Do not confuse this with the proc "set_from_package_key", which was previously + used to emulate global parameters declared for singleton packages. + + @param package_key identifies the package to which the global param belongs + @param parameter which parameter's value to set + @param value what value to set said parameter to +} { + + db_exec_plsql set_parameter_value {} + + return [ad_parameter_cache -set $value $package_id $parameter] +} + +ad_proc -public parameter::get_global_value { + -localize:boolean + -boolean:boolean + {-package_key:required} + {-parameter:required} + {-default ""} +} { + Get the value of a global package parameter. + + @param localize should we attempt to localize the parameter + @param boolean insure boolean parameters are normalized to 0 or 1 + @param package_key identifies the package to which the global param belongs + @param parameter which parameter's value to get + @param default what to return if we don't find a value. Defaults to returning the empty string. + + @return The string trimmed (leading and trailing spaces removed) parameter value +} { + + # Is there a parameter by this name in the parameter file? If so, it takes precedence. + # Note that this makes *far* more sense for global parameters than for package instance + # parameters. + + # 1. use the parameter file + set value [ad_parameter_from_file $parameter $package_key] + + # 2. check the parameter cache + if {$value eq ""} { + set value [ad_parameter_cache $package_id $parameter] + } + # 3. use the default value + if {$value eq ""} { + set value $default + } + + if { $localize_p } { + # Replace message keys in hash marks with localized texts + set value [lang::util::localize $value] + } + + # Trimming the value as people may have accidentally put in trailing spaces + set value [string trim $value] + + # Special parsing for boolean parameters, true and false can be written + # in many different ways + if { $boolean_p } { + if { [catch { + if { [template::util::is_true $value] } { + set value 1 + } else { + set value 0 + } + } errmsg] } { + global errorInfo + ns_log Error "Parameter $parameter not a boolean:\n$errorInfo" + set value $default + } + } + + return $value +} + ad_proc -public parameter::set_value { {-package_id ""} {-parameter:required} {-value:required} } { - set a parameter + Set the value of a package instance parameter @param package_id what package to set the parameter in. defaults to [ad_conn package_id] @@ -54,7 +135,7 @@ {-parameter:required} {-default ""} } { - Get the value of a package parameter. + Get the value of a package instance parameter. @param localize should we attempt to localize the parameter @param boolean insure boolean parameters are normalized to 0 or 1 @@ -131,10 +212,13 @@ {-parameter:required} {-value:required} } { - sets a parameter for the package corresponding to package_key - note that this makes the assumption that the package is a singleton - and does not set the value for all packages corresponding to package_key + sets an instance parameter for the package corresponding to package_key. + + Note that this makes the assumption that the package is a singleton + and does not set the value for all packages corresponding to package_key. + New packages should use global parameters instead. + } { parameter::set_value \ -package_id [apm_package_id_from_key $package_key] \ @@ -149,8 +233,12 @@ {-parameter:required} {-default ""} } { - get a parameter + Gets an instance parameter for the package corresponding to package_key. + + Note that this makes the assumption that the package is a singleton. + New packages should use global parameters instead. + @param package_key what package to get the parameter from. we will try to get the package_id from the package_key. this may cause an error if there are more than one Index: openacs-4/packages/acs-tcl/tcl/request-processor-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/request-processor-procs.tcl,v diff -u -N -r1.100 -r1.101 --- openacs-4/packages/acs-tcl/tcl/request-processor-procs.tcl 2 Feb 2010 22:33:54 -0000 1.100 +++ openacs-4/packages/acs-tcl/tcl/request-processor-procs.tcl 10 Mar 2010 00:44:03 -0000 1.101 @@ -34,12 +34,12 @@ the current directory, relative links returned to the clients browser may be broken (since the client will have the original URL). - Use rp_form_put if you want to feed query variables to the redirected page. + Use rp_form_put or rp_form_update if you want to feed query variables to the redirected page. @param absolute_path If set the path is an absolute path within the host filesystem @param path path to the file to serve - @see rp_form_put + @see rp_form_put, rp_form_update } { @@ -861,31 +861,36 @@ rp_debug -debug t "error in rp_handler: $errmsg" } - set roots [ns_info pageroot][string trimright [ad_conn package_url] /] + set resolve_values [concat [ns_info pageroot][string trimright [ad_conn package_url] /] \ + [apm_package_url_resolution [ad_conn package_key]]] - if { [ad_conn package_key] ne "" } { - foreach package_key [apm_package_search_order [ad_conn package_key]] { - lappend roots [acs_root_dir]/packages/$package_key/www + foreach resolve_value $resolve_values { + foreach {root match_prefix} $resolve_value {} + set extra_url [ad_conn extra_url] + if { $match_prefix ne "" } { + if { [string first $match_prefix $extra_url] == 0 } { + set extra_url [string trimleft \ + [string range $extra_url [string length $match_prefix] end] /] + } else { + continue + } } - } - - foreach root $roots { - ds_add rp [list notice "Trying rp_serve_abstract_file $root/[ad_conn extra_url]" $startclicks [clock clicks -milliseconds]] + ds_add rp [list notice "Trying rp_serve_abstract_file $root/$extra_url" $startclicks [clock clicks -milliseconds]] ad_try { - rp_serve_abstract_file "$root/[ad_conn extra_url]" + rp_serve_abstract_file "$root/$extra_url" set tcl_url2file([ad_conn url]) [ad_conn file] set tcl_url2path_info([ad_conn url]) [ad_conn path_info] } notfound val { - ds_add rp [list notice "File $root/[ad_conn extra_url]: Not found" $startclicks [clock clicks -milliseconds]] - ds_add rp [list transformation [list notfound "$root / [ad_conn extra_url]" $val] $startclicks [clock clicks -milliseconds]] + ds_add rp [list notice "File $root/$extra_url: Not found" $startclicks [clock clicks -milliseconds]] + ds_add rp [list transformation [list notfound "$root / $extra_url" $val] $startclicks [clock clicks -milliseconds]] continue } redirect url { - ds_add rp [list notice "File $root/[ad_conn extra_url]: Redirect" $startclicks [clock clicks -milliseconds]] - ds_add rp [list transformation [list redirect $root/[ad_conn extra_url] $url] $startclicks [clock clicks -milliseconds]] + ds_add rp [list notice "File $root/$extra_url: Redirect" $startclicks [clock clicks -milliseconds]] + ds_add rp [list transformation [list redirect $root/$extra_url $url] $startclicks [clock clicks -milliseconds]] ad_returnredirect $url } directory dir_index { - ds_add rp [list notice "File $root/[ad_conn extra_url]: Directory index" $startclicks [clock clicks -milliseconds]] - ds_add rp [list transformation [list directory $root/[ad_conn extra_url] $dir_index] $startclicks [clock clicks -milliseconds]] + ds_add rp [list notice "File $root/$extra_url: Directory index" $startclicks [clock clicks -milliseconds]] + ds_add rp [list transformation [list directory $root/$extra_url $dir_index] $startclicks [clock clicks -milliseconds]] continue } return @@ -904,30 +909,40 @@ # OK, we didn't find a normal file. Let's look for a path info style thingy, # visiting possible file matches from most specific to least. - foreach prefix [rp_path_prefixes [ad_conn extra_url]] { - foreach root $roots { + foreach prefix [rp_path_prefixes $extra_url] { + foreach resolve_value $resolve_values { + foreach {root match_prefix} $resolve_value {} + set extra_url [ad_conn extra_url] + if { $match_prefix ne "" } { + if { [string first $match_prefix $extra_url] == 0 } { + set extra_url [string trimleft \ + [string range $extra_url [string length $match_prefix] end] /] + } else { + continue + } + } ad_try { ad_conn -set path_info \ - [string range [ad_conn extra_url] [expr {[string length $prefix] - 1}] end] + [string range $extra_url [expr {[string length $prefix] - 1}] end] rp_serve_abstract_file -noredirect -nodirectory \ -extension_pattern ".vuh" "$root$prefix" set tcl_url2file([ad_conn url]) [ad_conn file] set tcl_url2path_info([ad_conn url]) [ad_conn path_info] } notfound val { - ds_add rp [list transformation [list notfound $root/[ad_conn extra_url] $val] $startclicks [clock clicks -milliseconds]] + ds_add rp [list transformation [list notfound $root$prefix $val] $startclicks [clock clicks -milliseconds]] continue } redirect url { - ds_add rp [list transformation [list redirect $root/[ad_conn extra_url] $url] $startclicks [clock clicks -milliseconds]] + ds_add rp [list transformation [list redirect $root$prefix $url] $startclicks [clock clicks -milliseconds]] ad_returnredirect $url } directory dir_index { - ds_add rp [list transformation [list directory $root/[ad_conn extra_url] $dir_index] $startclicks [clock clicks -milliseconds]] + ds_add rp [list transformation [list directory $root$prefix $dir_index] $startclicks [clock clicks -milliseconds]] continue } return } } - ds_add rp [list transformation [list notfound $root/[ad_conn extra_url] notfound] $startclicks [clock clicks -milliseconds]] + ds_add rp [list transformation [list notfound $root/$extra_url notfound] $startclicks [clock clicks -milliseconds]] ns_returnnotfound } errmsg]] } { if {$code == 1} { Index: openacs-4/packages/acs-tcl/tcl/utilities-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/utilities-procs.tcl,v diff -u -N -r1.118 -r1.119 --- openacs-4/packages/acs-tcl/tcl/utilities-procs.tcl 16 Jan 2010 23:01:04 -0000 1.118 +++ openacs-4/packages/acs-tcl/tcl/utilities-procs.tcl 10 Mar 2010 00:44:03 -0000 1.119 @@ -1506,6 +1506,16 @@ return [expr { [info exists var] && $var ne "" }] } +ad_proc -public exists_or_null { varname } { + Returns the contents of the variable if it exists, otherwise returns empty string +} { + upvar 1 $varname var + if {[info exists var]} { + return $var + } + return "" +} + ad_proc -public exists_and_equal { varname value } { Returns 1 if the variable name exists in the caller's envirnoment and is equal to the given value.