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.110 -r1.111 --- openacs-4/packages/acs-kernel/acs-kernel.info 10 Mar 2010 00:44:03 -0000 1.110 +++ openacs-4/packages/acs-kernel/acs-kernel.info 15 Mar 2010 00:21:16 -0000 1.111 @@ -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.47 -r1.48 --- openacs-4/packages/acs-kernel/sql/oracle/apm-create.sql 12 Mar 2010 00:16:08 -0000 1.47 +++ openacs-4/packages/acs-kernel/sql/oracle/apm-create.sql 15 Mar 2010 00:21:16 -0000 1.48 @@ -968,6 +968,8 @@ default null, package_key in apm_parameters.package_key%TYPE, parameter_name in apm_parameters.parameter_name%TYPE, + scope in apm_parameters.scope%TYPE + default 'instance', description in apm_parameters.description%TYPE default null, datatype in apm_parameters.datatype%TYPE @@ -1011,30 +1013,37 @@ default null ); - -- Return the value of this parameter for a specific package and parameter. + function id_for_name ( + package_key in apm_parameters.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameters.parameter_id%TYPE; + + function id_for_name ( + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameters.parameter_id%TYPE; + function get_value ( - parameter_id in apm_parameter_values.parameter_id%TYPE, - package_id in apm_packages.package_id%TYPE + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE ) return apm_parameter_values.attr_value%TYPE; function get_value ( - package_id in apm_packages.package_id%TYPE, + package_key in apm_packages.package_key%TYPE, parameter_name in apm_parameters.parameter_name%TYPE ) return apm_parameter_values.attr_value%TYPE; - -- Sets a value for a parameter for a package instance. procedure set_value ( - parameter_id in apm_parameter_values.parameter_id%TYPE, - package_id in apm_packages.package_id%TYPE, + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE, attr_value in apm_parameter_values.attr_value%TYPE - ); + ); procedure set_value ( - package_id in apm_packages.package_id%TYPE, + package_key in apm_packages.package_key%TYPE, parameter_name in apm_parameters.parameter_name%TYPE, attr_value in apm_parameter_values.attr_value%TYPE ); - end apm; / @@ -1538,6 +1547,8 @@ default null, package_key in apm_parameters.package_key%TYPE, parameter_name in apm_parameters.parameter_name%TYPE, + scope in apm_parameters.scope%TYPE + default 'instance', description in apm_parameters.description%TYPE default null, datatype in apm_parameters.datatype%TYPE @@ -1648,8 +1659,8 @@ end unregister_parameter; function id_for_name ( - parameter_name in apm_parameters.parameter_name%TYPE, - package_key in apm_parameters.package_key%TYPE + package_key in apm_parameters.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE ) return apm_parameters.parameter_id%TYPE is a_parameter_id apm_parameters.parameter_id%TYPE; @@ -1658,90 +1669,137 @@ from apm_parameters p where p.parameter_name = id_for_name.parameter_name and p.package_key = id_for_name.package_key; + return a_parameter_id; + + exception when no_data_found then + raise_application_error(-20000, 'The specified package ' || + id_for_name.package_key || ' AND/OR parameter ' || id_for_name.package_key || + ' do not exist'); + end id_for_name; - + + function id_for_name ( + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameters.parameter_id%TYPE + is + 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 = (select package_key from apm_packages + where package_id = id_for_name.package_id); + + return a_parameter_id; + + exception when no_data_found then + raise_application_error(-20000, 'The specified package ' || + id_for_name.package_id || ' AND/OR parameter ' || id_for_name.parameter_name || + ' do not exist'); + + end id_for_name; + function get_value ( - parameter_id in apm_parameter_values.parameter_id%TYPE, - package_id in apm_packages.package_id%TYPE + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE ) return apm_parameter_values.attr_value%TYPE is + parameter_id apm_parameter_values.parameter_id%TYPE; value apm_parameter_values.attr_value%TYPE; begin - select attr_value into value from apm_parameter_values v + parameter_id := apm.id_for_name(package_id, 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; + and parameter_id = get_value.parameter_id; + return value; - end get_value; + end get_value; function get_value ( - package_id in apm_packages.package_id%TYPE, + package_key in apm_packages.package_key%TYPE, parameter_name in apm_parameters.parameter_name%TYPE ) return apm_parameter_values.attr_value%TYPE is - v_parameter_id apm_parameter_values.parameter_id%TYPE; + 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( - parameter_id => v_parameter_id, - package_id => get_value.package_id - ); - end get_value; + parameter_id := apm.id_for_name(package_key, parameter_name); + select attr_value into value from apm_parameter_values v + where v.package_id is null + and parameter_id = get_value.parameter_id; - -- Sets a value for a parameter for a package instance. + return value; + end get_value; + procedure set_value ( - parameter_id in apm_parameter_values.parameter_id%TYPE, - package_id in apm_packages.package_id%TYPE, + package_key in apm_packages.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE, attr_value in apm_parameter_values.attr_value%TYPE ) is - v_value_id apm_parameter_values.value_id%TYPE; + parameter_id apm_parameter_values.parameter_id%TYPE; + value_id apm_parameter_values.value_id%TYPE; begin - -- Determine if the value exists - select value_id into v_value_id from apm_parameter_values - where parameter_id = set_value.parameter_id - and package_id = set_value.package_id; - update apm_parameter_values set attr_value = set_value.attr_value - where parameter_id = set_value.parameter_id - and package_id = set_value.package_id; - exception - when NO_DATA_FOUND - then - v_value_id := apm_parameter_value.new( - package_id => set_value.package_id, - parameter_id => set_value.parameter_id, - attr_value => set_value.attr_value - ); - end set_value; + parameter_id := apm.id_for_name(package_key, parameter_name); + select value_id into value_id from apm_parameter_values + where parameter_id = set_value.parameter_id + and package_id is null; + + update apm_parameter_values + set attr_value = set_value.attr_value + where parameter_id = set_value.parameter_id + and package_id = null; + + + exception + when NO_DATA_FOUND + then + value_id := apm_parameter_value.new( + package_id => null, + parameter_id => set_value.parameter_id, + attr_value => set_value.attr_value + ); + + end set_value; + procedure set_value ( package_id in apm_packages.package_id%TYPE, parameter_name in apm_parameters.parameter_name%TYPE, attr_value in apm_parameter_values.attr_value%TYPE ) is - v_parameter_id apm_parameter_values.parameter_id%TYPE; + parameter_id apm_parameter_values.parameter_id%TYPE; + 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); - apm.set_value( - parameter_id => v_parameter_id, - package_id => set_value.package_id, - attr_value => set_value.attr_value - ); + parameter_id := apm.id_for_name(package_id, parameter_name); + + select value_id into value_id from apm_parameter_values + where parameter_id = set_value.parameter_id + and package_id = set_value.package_id; + + update apm_parameter_values + set attr_value = set_value.attr_value + where parameter_id = set_value.parameter_id + and package_id = set_value.package_id; + + exception when NO_DATA_FOUND then - RAISE_APPLICATION_ERROR(-20000, 'The parameter named ' || set_value.parameter_name || ' that you attempted to set does not exist AND/OR the specified package ' || set_value.package_id || ' does not exist in the system.'); + value_id := apm_parameter_value.new( + package_id => set_value.package_id, + parameter_id => set_value.parameter_id, + attr_value => set_value.attr_value + ); + end set_value; + end apm; / show errors Index: openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade-5.6.0d6-5.6.0d7.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade-5.6.0d6-5.6.0d7.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade-5.6.0d6-5.6.0d7.sql 15 Mar 2010 00:21:16 -0000 1.1 @@ -0,0 +1,657 @@ + +-- Public Programmer level API. +create or replace package apm +as + procedure register_package ( + package_key in apm_package_types.package_key%TYPE, + pretty_name in apm_package_types.pretty_name%TYPE, + pretty_plural in apm_package_types.pretty_plural%TYPE, + package_uri in apm_package_types.package_uri%TYPE, + package_type in apm_package_types.package_type%TYPE, + initial_install_p in apm_package_types.initial_install_p%TYPE + default 'f', + singleton_p in apm_package_types.singleton_p%TYPE + default 'f', + implements_subsite_p in apm_package_types.implements_subsite_p%TYPE + default 'f', + inherit_templates_p in apm_package_types.inherit_templates_p%TYPE + default 't', + spec_file_path in apm_package_types.spec_file_path%TYPE + default null, + spec_file_mtime in apm_package_types.spec_file_mtime%TYPE + default null + ); + + function update_package ( + package_key in apm_package_types.package_key%TYPE, + pretty_name in apm_package_types.pretty_name%TYPE + default null, + pretty_plural in apm_package_types.pretty_plural%TYPE + default null, + package_uri in apm_package_types.package_uri%TYPE + default null, + package_type in apm_package_types.package_type%TYPE + default null, + initial_install_p in apm_package_types.initial_install_p%TYPE + default null, + singleton_p in apm_package_types.singleton_p%TYPE + default null, + implements_subsite_p in apm_package_types.implements_subsite_p%TYPE + default null, + inherit_templates_p in apm_package_types.inherit_templates_p%TYPE + default null, + spec_file_path in apm_package_types.spec_file_path%TYPE + default null, + spec_file_mtime in apm_package_types.spec_file_mtime%TYPE + default null + ) return apm_package_types.package_type%TYPE; + + procedure unregister_package ( + package_key in apm_package_types.package_key%TYPE, + cascade_p in char default 't' + ); + + function register_p ( + package_key in apm_package_types.package_key%TYPE + ) return integer; + + -- Informs the APM that this application is available for use. + procedure register_application ( + package_key in apm_package_types.package_key%TYPE, + pretty_name in apm_package_types.pretty_name%TYPE, + pretty_plural in apm_package_types.pretty_plural%TYPE, + package_uri in apm_package_types.package_uri%TYPE, + initial_install_p in apm_package_types.initial_install_p%TYPE + default 'f', + singleton_p in apm_package_types.singleton_p%TYPE + default 'f', + implements_subsite_p in apm_package_types.implements_subsite_p%TYPE + default 'f', + inherit_templates_p in apm_package_types.inherit_templates_p%TYPE + default 't', + spec_file_path in apm_package_types.spec_file_path%TYPE + default null, + spec_file_mtime in apm_package_types.spec_file_mtime%TYPE + default null + ); + + -- Remove the application from the system. + procedure unregister_application ( + package_key in apm_package_types.package_key%TYPE, + -- Delete all objects associated with this application. + cascade_p in char default 'f' + ); + + procedure register_service ( + package_key in apm_package_types.package_key%TYPE, + pretty_name in apm_package_types.pretty_name%TYPE, + pretty_plural in apm_package_types.pretty_plural%TYPE, + package_uri in apm_package_types.package_uri%TYPE, + initial_install_p in apm_package_types.initial_install_p%TYPE + default 'f', + singleton_p in apm_package_types.singleton_p%TYPE + default 'f', + implements_subsite_p in apm_package_types.implements_subsite_p%TYPE + default 'f', + inherit_templates_p in apm_package_types.inherit_templates_p%TYPE + default 't', + spec_file_path in apm_package_types.spec_file_path%TYPE + default null, + spec_file_mtime in apm_package_types.spec_file_mtime%TYPE + default null + ); + + -- Remove the service from the system. + procedure unregister_service ( + package_key in apm_package_types.package_key%TYPE, + -- Delete all objects associated with this service. + cascade_p in char default 'f' + ); + + -- Indicate to APM that a parameter is available to the system. + function register_parameter ( + parameter_id in apm_parameters.parameter_id%TYPE + default null, + package_key in apm_parameters.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE, + scope in apm_parameters.scope%TYPE + default 'instance', + description in apm_parameters.description%TYPE + default null, + datatype in apm_parameters.datatype%TYPE + default 'string', + default_value in apm_parameters.default_value%TYPE + default null, + section_name in apm_parameters.section_name%TYPE + default null, + min_n_values in apm_parameters.min_n_values%TYPE + default 1, + max_n_values in apm_parameters.max_n_values%TYPE + default 1 + ) return apm_parameters.parameter_id%TYPE; + + function update_parameter ( + parameter_id in apm_parameters.parameter_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + default null, + description in apm_parameters.description%TYPE + default null, + datatype in apm_parameters.datatype%TYPE + default 'string', + default_value in apm_parameters.default_value%TYPE + default null, + section_name in apm_parameters.section_name%TYPE + default null, + min_n_values in apm_parameters.min_n_values%TYPE + default 1, + max_n_values in apm_parameters.max_n_values%TYPE + default 1 + ) return apm_parameters.parameter_name%TYPE; + + function parameter_p( + package_key in apm_package_types.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return integer; + + -- Remove any uses of this parameter. + procedure unregister_parameter ( + parameter_id in apm_parameters.parameter_id%TYPE + default null + ); + + function id_for_name ( + package_key in apm_parameters.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameters.parameter_id%TYPE; + + function id_for_name ( + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameters.parameter_id%TYPE; + + function get_value ( + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameter_values.attr_value%TYPE; + + function get_value ( + package_key in apm_packages.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameter_values.attr_value%TYPE; + + procedure set_value ( + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE, + attr_value in apm_parameter_values.attr_value%TYPE + ); + + procedure set_value ( + package_key in apm_packages.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE, + attr_value in apm_parameter_values.attr_value%TYPE + ); + +end apm; +/ +show errors + + +create or replace package body apm +as + procedure register_package ( + package_key in apm_package_types.package_key%TYPE, + pretty_name in apm_package_types.pretty_name%TYPE, + pretty_plural in apm_package_types.pretty_plural%TYPE, + package_uri in apm_package_types.package_uri%TYPE, + package_type in apm_package_types.package_type%TYPE, + initial_install_p in apm_package_types.initial_install_p%TYPE + default 'f', + singleton_p in apm_package_types.singleton_p%TYPE + default 'f', + implements_subsite_p in apm_package_types.implements_subsite_p%TYPE + default 'f', + inherit_templates_p in apm_package_types.inherit_templates_p%TYPE + default 't', + spec_file_path in apm_package_types.spec_file_path%TYPE + default null, + spec_file_mtime in apm_package_types.spec_file_mtime%TYPE + default null + ) + is + begin + apm_package_type.create_type( + package_key => register_package.package_key, + pretty_name => register_package.pretty_name, + pretty_plural => register_package.pretty_plural, + package_uri => register_package.package_uri, + package_type => register_package.package_type, + initial_install_p => register_package.initial_install_p, + singleton_p => register_package.singleton_p, + implements_subsite_p => register_package.implements_subsite_p, + inherit_templates_p => register_package.inherit_templates_p, + spec_file_path => register_package.spec_file_path, + spec_file_mtime => spec_file_mtime + ); + end register_package; + + function update_package ( + package_key in apm_package_types.package_key%TYPE, + pretty_name in apm_package_types.pretty_name%TYPE + default null, + pretty_plural in apm_package_types.pretty_plural%TYPE + default null, + package_uri in apm_package_types.package_uri%TYPE + default null, + package_type in apm_package_types.package_type%TYPE + default null, + initial_install_p in apm_package_types.initial_install_p%TYPE + default null, + singleton_p in apm_package_types.singleton_p%TYPE + default null, + implements_subsite_p in apm_package_types.implements_subsite_p%TYPE + default null, + inherit_templates_p in apm_package_types.inherit_templates_p%TYPE + default null, + spec_file_path in apm_package_types.spec_file_path%TYPE + default null, + spec_file_mtime in apm_package_types.spec_file_mtime%TYPE + default null + ) return apm_package_types.package_type%TYPE + is + begin + + return apm_package_type.update_type( + package_key => update_package.package_key, + pretty_name => update_package.pretty_name, + pretty_plural => update_package.pretty_plural, + package_uri => update_package.package_uri, + package_type => update_package.package_type, + initial_install_p => update_package.initial_install_p, + singleton_p => update_package.singleton_p, + implements_subsite_p => update_package.implements_subsite_p, + inherit_templates_p => update_package.inherit_templates_p, + spec_file_path => update_package.spec_file_path, + spec_file_mtime => update_package.spec_file_mtime + ); + + end update_package; + + + procedure unregister_package ( + package_key in apm_package_types.package_key%TYPE, + cascade_p in char default 't' + ) + is + begin + apm_package_type.drop_type( + package_key => unregister_package.package_key, + cascade_p => unregister_package.cascade_p + ); + end unregister_package; + + function register_p ( + package_key in apm_package_types.package_key%TYPE + ) return integer + is + v_register_p integer; + begin + select decode(count(*),0,0,1) into v_register_p from apm_package_types + where package_key = register_p.package_key; + return v_register_p; + end register_p; + + procedure register_application ( + package_key in apm_package_types.package_key%TYPE, + pretty_name in apm_package_types.pretty_name%TYPE, + pretty_plural in apm_package_types.pretty_plural%TYPE, + package_uri in apm_package_types.package_uri%TYPE, + initial_install_p in apm_package_types.initial_install_p%TYPE + default 'f', + singleton_p in apm_package_types.singleton_p%TYPE + default 'f', + implements_subsite_p in apm_package_types.implements_subsite_p%TYPE + default 'f', + inherit_templates_p in apm_package_types.inherit_templates_p%TYPE + default 't', + spec_file_path in apm_package_types.spec_file_path%TYPE + default null, + spec_file_mtime in apm_package_types.spec_file_mtime%TYPE + default null + ) + is + begin + apm.register_package( + package_key => register_application.package_key, + pretty_name => register_application.pretty_name, + pretty_plural => register_application.pretty_plural, + package_uri => register_application.package_uri, + package_type => 'apm_application', + initial_install_p => register_application.initial_install_p, + singleton_p => register_application.singleton_p, + implements_subsite_p => register_application.implements_subsite_p, + inherit_templates_p => register_application.inherit_templates_p, + spec_file_path => register_application.spec_file_path, + spec_file_mtime => register_application.spec_file_mtime + ); + end register_application; + + procedure unregister_application ( + package_key in apm_package_types.package_key%TYPE, + cascade_p in char default 'f' + ) + is + begin + apm.unregister_package ( + package_key => unregister_application.package_key, + cascade_p => unregister_application.cascade_p + ); + end unregister_application; + + procedure register_service ( + package_key in apm_package_types.package_key%TYPE, + pretty_name in apm_package_types.pretty_name%TYPE, + pretty_plural in apm_package_types.pretty_plural%TYPE, + package_uri in apm_package_types.package_uri%TYPE, + initial_install_p in apm_package_types.initial_install_p%TYPE + default 'f', + singleton_p in apm_package_types.singleton_p%TYPE + default 'f', + implements_subsite_p in apm_package_types.implements_subsite_p%TYPE + default 'f', + inherit_templates_p in apm_package_types.inherit_templates_p%TYPE + default 't', + spec_file_path in apm_package_types.spec_file_path%TYPE + default null, + spec_file_mtime in apm_package_types.spec_file_mtime%TYPE + default null + ) + is + begin + apm.register_package( + package_key => register_service.package_key, + pretty_name => register_service.pretty_name, + pretty_plural => register_service.pretty_plural, + package_uri => register_service.package_uri, + package_type => 'apm_service', + initial_install_p => register_service.initial_install_p, + singleton_p => register_service.singleton_p, + implements_subsite_p => register_service.implements_subsite_p, + inherit_templates_p => register_service.inherit_templates_p, + spec_file_path => register_service.spec_file_path, + spec_file_mtime => register_service.spec_file_mtime + ); + end register_service; + + procedure unregister_service ( + package_key in apm_package_types.package_key%TYPE, + cascade_p in char default 'f' + ) + is + begin + apm.unregister_package ( + package_key => unregister_service.package_key, + cascade_p => unregister_service.cascade_p + ); + end unregister_service; + + -- Indicate to APM that a parameter is available to the system. + function register_parameter ( + parameter_id in apm_parameters.parameter_id%TYPE + default null, + package_key in apm_parameters.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE, + scope in apm_parameters.scope%TYPE + default 'instance', + description in apm_parameters.description%TYPE + default null, + datatype in apm_parameters.datatype%TYPE + default 'string', + default_value in apm_parameters.default_value%TYPE + default null, + section_name in apm_parameters.section_name%TYPE + default null, + min_n_values in apm_parameters.min_n_values%TYPE + default 1, + max_n_values in apm_parameters.max_n_values%TYPE + default 1 + ) return apm_parameters.parameter_id%TYPE + is + v_parameter_id apm_parameters.parameter_id%TYPE; + v_value_id apm_parameter_values.value_id%TYPE; + begin + -- Create the new parameter. + v_parameter_id := acs_object.new( + object_id => parameter_id, + object_type => 'apm_parameter', + title => register_parameter.package_key || ': Parameter ' || register_parameter.parameter_name + ); + + insert into apm_parameters + (parameter_id, parameter_name, description, package_key, datatype, + default_value, section_name, min_n_values, max_n_values) + values + (v_parameter_id, register_parameter.parameter_name, register_parameter.description, + register_parameter.package_key, register_parameter.datatype, + register_parameter.default_value, register_parameter.section_name, + register_parameter.min_n_values, register_parameter.max_n_values); + -- Propagate parameter to new instances. + for pkg in (select package_id from apm_packages where package_key = register_parameter.package_key) + loop + v_value_id := apm_parameter_value.new( + package_id => pkg.package_id, + parameter_id => v_parameter_id, + attr_value => register_parameter.default_value + ); + end loop; + return v_parameter_id; + end register_parameter; + + function update_parameter ( + parameter_id in apm_parameters.parameter_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + default null, + description in apm_parameters.description%TYPE + default null, + datatype in apm_parameters.datatype%TYPE + default 'string', + default_value in apm_parameters.default_value%TYPE + default null, + section_name in apm_parameters.section_name%TYPE + default null, + min_n_values in apm_parameters.min_n_values%TYPE + default 1, + max_n_values in apm_parameters.max_n_values%TYPE + default 1 + ) return apm_parameters.parameter_name%TYPE + is + begin + update apm_parameters + set parameter_name = nvl(update_parameter.parameter_name, parameter_name), + default_value = nvl(update_parameter.default_value, default_value), + datatype = nvl(update_parameter.datatype, datatype), + description = nvl(update_parameter.description, description), + section_name = nvl(update_parameter.section_name, section_name), + min_n_values = nvl(update_parameter.min_n_values, min_n_values), + max_n_values = nvl(update_parameter.max_n_values, max_n_values) + where parameter_id = update_parameter.parameter_id; + + update acs_objects + set title = (select package_key || ': Parameter ' || parameter_name + from apm_parameters + where parameter_id = update_parameter.parameter_id) + where object_id = update_parameter.parameter_id; + + return parameter_id; + end; + + function parameter_p( + package_key in apm_package_types.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return integer + is + v_parameter_p integer; + begin + select decode(count(*),0,0,1) into v_parameter_p + from apm_parameters + where package_key = parameter_p.package_key + and parameter_name = parameter_p.parameter_name; + return v_parameter_p; + end parameter_p; + + procedure unregister_parameter ( + parameter_id in apm_parameters.parameter_id%TYPE + default null + ) + is + begin + delete from apm_parameter_values + where parameter_id = unregister_parameter.parameter_id; + delete from apm_parameters + where parameter_id = unregister_parameter.parameter_id; + acs_object.del(parameter_id); + end unregister_parameter; + + function id_for_name ( + package_key in apm_parameters.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameters.parameter_id%TYPE + is + 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; + + return a_parameter_id; + + exception when no_data_found then + raise_application_error(-20000, 'The specified package ' || + id_for_name.package_key || ' AND/OR parameter ' || id_for_name.package_key || + ' do not exist'); + + end id_for_name; + + function id_for_name ( + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameters.parameter_id%TYPE + is + 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 = (select package_key from apm_packages + where package_id = id_for_name.package_id); + + return a_parameter_id; + + exception when no_data_found then + raise_application_error(-20000, 'The specified package ' || + id_for_name.package_id || ' AND/OR parameter ' || id_for_name.parameter_name || + ' do not exist'); + + end id_for_name; + + function get_value ( + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameter_values.attr_value%TYPE + is + parameter_id apm_parameter_values.parameter_id%TYPE; + value apm_parameter_values.attr_value%TYPE; + begin + parameter_id := apm.id_for_name(package_id, 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 get_value; + + function get_value ( + package_key in apm_packages.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE + ) return apm_parameter_values.attr_value%TYPE + is + parameter_id apm_parameter_values.parameter_id%TYPE; + value apm_parameter_values.attr_value%TYPE; + begin + parameter_id := apm.id_for_name(package_key, parameter_name); + + 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 get_value; + + procedure set_value ( + package_key in apm_packages.package_key%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE, + attr_value in apm_parameter_values.attr_value%TYPE + ) + is + parameter_id apm_parameter_values.parameter_id%TYPE; + value_id apm_parameter_values.value_id%TYPE; + begin + parameter_id := apm.id_for_name(package_key, parameter_name); + + select value_id into value_id from apm_parameter_values + where parameter_id = set_value.parameter_id + and package_id is null; + + update apm_parameter_values + set attr_value = set_value.attr_value + where parameter_id = set_value.parameter_id + and package_id = null; + + exception + when NO_DATA_FOUND + then + value_id := apm_parameter_value.new( + package_id => null, + parameter_id => set_value.parameter_id, + attr_value => set_value.attr_value + ); + + end set_value; + + procedure set_value ( + package_id in apm_packages.package_id%TYPE, + parameter_name in apm_parameters.parameter_name%TYPE, + attr_value in apm_parameter_values.attr_value%TYPE + ) + is + parameter_id apm_parameter_values.parameter_id%TYPE; + value_id apm_parameter_values.value_id%TYPE; + begin + parameter_id := apm.id_for_name(package_id, parameter_name); + + select value_id into value_id from apm_parameter_values + where parameter_id = set_value.parameter_id + and package_id = set_value.package_id; + + update apm_parameter_values + set attr_value = set_value.attr_value + where parameter_id = set_value.parameter_id + and package_id = set_value.package_id; + + exception + when NO_DATA_FOUND + then + value_id := apm_parameter_value.new( + package_id => set_value.package_id, + parameter_id => set_value.parameter_id, + attr_value => set_value.attr_value + ); + + end set_value; + +end apm; +/ +show errors +