Index: openacs-4/packages/acs-service-contract/acs-service-contract.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/acs-service-contract.info,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/acs-service-contract.info 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,49 @@ + + + + + ACS Service Contract + ACS Service Contract + t + t + + + + oracle + postgresql + + Neophytos Demetriou + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-msg-types-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-msg-types-create.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-msg-types-create.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,253 @@ +-- QUESTION: IS THIS STUFF GENERAL ENOUGH TO MOVE IT INTO A NEW PACKAGE? +-- +select acs_object_type__create_type ( + 'acs_sc_msg_type', -- object_type + 'ACS SC Message Type', -- pretty_name + 'ACS SC Message Types', -- pretty_plural + 'acs_object', -- supertype + 'acs_sc_msg_type', -- table_name + 'msg_type_id', -- id_column + null, -- package_name + 'f', -- abstract_p + null, -- type_extension_table + null -- name_method +); + + + +create table acs_sc_msg_type ( + msg_type_id integer + constraint acs_sc_msg_type_id_fk + references acs_objects(object_id) + on delete cascade + constraint acs_sc_msg_type_pk + primary key, + msg_type_name varchar(100) + constraint acs_sc_msg_type_name_un + unique +); + + +create function acs_sc_msg_type__new(varchar,varchar) +returns integer as ' +declare + p_msg_type_name alias for $1; + p_msg_type_spec alias for $2; + v_msg_type_id integer; +begin + + v_msg_type_id := acs_object__new( + null, + ''acs_sc_msg_type'', + now(), + null, + null, + null + ); + + insert into acs_sc_msg_type ( + msg_type_id, + msg_type_name + ) values ( + v_msg_type_id, + p_msg_type_name + ); + + perform acs_sc_msg_type_spec__parse(p_msg_type_name,p_msg_type_spec); + + return v_msg_type_id; + +end;' language 'plpgsql'; + + +create function acs_sc_msg_type__get_id(varchar) +returns integer as ' +declare + p_msg_type_name alias for $1; + v_msg_type_id integer; +begin + + select msg_type_id into v_msg_type_id + from acs_sc_msg_type + where msg_type_name = p_msg_type_name; + + return v_msg_type_id; + +end;' language 'plpgsql'; + + +create function acs_sc_msg_type__get_name(integer) +returns varchar as ' +declare + p_msg_type_id alias for $1; + v_msg_type_name varchar; +begin + + select msg_type_name into v_msg_type_name + from acs_sc_msg_type + where msg_type_id = p_msg_type_id; + + return v_msg_type_name; + +end;' language 'plpgsql'; + + +create function acs_sc_msg_type__delete(integer) +returns integer as ' +declare + p_msg_type_id alias for $1; +begin + + delete from acs_sc_msg_type + where msg_type_id = p_msg_type_id; + + return 0; + +end;' language 'plpgsql'; + + +create function acs_sc_msg_type__delete(varchar) +returns integer as ' +declare + p_msg_type_name alias for $1; + v_msg_type_id integer; +begin + + v_msg_type_id := acs_sc_msg_type__get_id(p_msg_type_name); + + perform acs_sc_msg_type__delete(v_msg_type_id); + + return v_msg_type_id; + +end;' language 'plpgsql'; + + + +create table acs_sc_msg_type_element ( + msg_type_id integer + constraint acs_sc_msg_type_el_mtype_id_fk + references acs_sc_msg_type(msg_type_id) + on delete cascade, + element_name varchar(100), + element_msg_type_id integer + constraint acs_sc_msg_type_el_mtype_id_fk + references acs_sc_msg_type(msg_type_id), + element_msg_type_isset_p boolean, + element_pos integer +); + + + + +create function acs_sc_msg_type_element__new(varchar,varchar,varchar,boolean,integer) +returns integer as ' +declare + p_msg_type_name alias for $1; + p_element_name alias for $2; + p_element_msg_type_name alias for $3; + p_element_msg_type_isset_p alias for $4; + p_element_pos alias for $5; + v_msg_type_id integer; + v_element_msg_type_id integer; +begin + + v_msg_type_id := acs_sc_msg_type__get_id(p_msg_type_name); + + if v_msg_type_id is null then + raise exception ''Unknown Message Type: %'', p_msg_type_name; + end if; + + v_element_msg_type_id := acs_sc_msg_type__get_id(p_element_msg_type_name); + + if v_element_msg_type_id is null then + raise exception ''Unknown Message Type: %'', p_element_msg_type_name; + end if; + + insert into acs_sc_msg_type_element ( + msg_type_id, + element_name, + element_msg_type_id, + element_msg_type_isset_p, + element_pos + ) values ( + v_msg_type_id, + p_element_name, + v_element_msg_type_id, + p_element_msg_type_isset_p, + p_element_pos + ); + + return v_msg_type_id; + +end;' language 'plpgsql'; + + + + +create function acs_sc_msg_type_spec__parse(varchar,varchar) +returns integer as ' +declare + p_msg_type_name alias for $1; + p_msg_type_spec alias for $2; + v_element varchar; + v_element_type varchar; + v_str_pos integer; + v_element_name varchar; + v_element_msg_type_name varchar; + v_element_msg_type_isset_p boolean; + v_element_pos integer; +begin + + v_element_pos := 1; + v_element := split(p_msg_type_spec, '','', v_element_pos); + + while v_element is not null loop + + v_str_pos = instr(v_element, '':'', 1, 1); + + if v_str_pos > 0 then + v_element_name := trim(substr(v_element, 1, v_str_pos-1)); + v_element_type := trim(substr(v_element, v_str_pos+1, length(v_element) - v_str_pos)); + if (instr(v_element_type, ''['',1,1) = length(v_element_type)-1) and + (instr(v_element_type, '']'',1,1) = length(v_element_type)) then + v_element_msg_type_isset_p := ''t''; + v_element_msg_type_name := trim(substr(v_element_type,1,length(v_element_type)-2)); + if v_element_msg_type_name = '''' then + raise exception ''Wrong Format: Message Type Specification''; + end if; + else + v_element_msg_type_isset_p := ''f''; + v_element_msg_type_name := v_element_type; + end if; + else + raise exception ''Wrong Format: Message Type Specification''; + end if; + + perform acs_sc_msg_type_element__new( + p_msg_type_name, -- msg_type_id + v_element_name, -- element_name + v_element_msg_type_name, -- element_msg_type_id + v_element_msg_type_isset_p, -- element_msg_type_isset_p + v_element_pos -- element_pos + ); + + v_element_pos := v_element_pos + 1; + v_element := split(p_msg_type_spec, '','', v_element_pos); + + end loop; + + return v_element_pos-1; + +end;' language 'plpgsql'; + + + +-- +-- Primitive Message Types +-- +select acs_sc_msg_type__new('integer',''); +select acs_sc_msg_type__new('string',''); +select acs_sc_msg_type__new('boolean',''); +select acs_sc_msg_type__new('timestamp',''); +select acs_sc_msg_type__new('uri',''); +select acs_sc_msg_type__new('version',''); Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-msg-types-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-msg-types-drop.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-msg-types-drop.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,12 @@ +drop function acs_sc_msg_type_spec__parse(varchar,varchar); +drop function acs_sc_msg_type_element__new(varchar,varchar,varchar,boolean,integer); +drop table acs_sc_msg_type_element; +drop function acs_sc_msg_type__delete(varchar); +drop function acs_sc_msg_type__delete(integer); +drop function acs_sc_msg_type__get_name(integer); +drop function acs_sc_msg_type__get_id(varchar); +drop function acs_sc_msg_type__new(varchar,varchar); +drop table acs_sc_msg_type; +delete from acs_objects where object_type = 'acs_sc_msg_type'; +select acs_object_type__drop_type ('acs_sc_msg_type', 'f'); + Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-object-types-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-object-types-create.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-object-types-create.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,42 @@ +select acs_object_type__create_type ( + 'acs_sc_contract', -- object_type + 'ACS SC Contract', -- pretty_name + 'ACS SC Contracts', -- pretty_plural + 'acs_object', -- supertype + 'acs_sc_contract', -- table_name + 'contract_id', -- id_column + null, -- package_name + 'f', -- abstract_p + null, -- type_extension_table + null -- name_method +); + + + +select acs_object_type__create_type ( + 'acs_sc_operation', -- object_type + 'ACS SC Operation', -- pretty_name + 'ACS SC Operations', -- pretty_plural + 'acs_object', -- supertype + 'acs_sc_operation', -- table_name + 'operation_id', -- id_column + null, -- package_name + 'f', -- abstract_p + null, -- type_extension_table + null -- name_method +); + + +select acs_object_type__create_type ( + 'acs_sc_implementation', -- object_type + 'ACS SC Implementation', -- pretty_name + 'ACS SC Implementations', -- pretty_plural + 'acs_object', -- supertype + 'acs_sc_impl', -- table_name + 'impl_id', -- id_column + null, -- package_name + 'f', -- abstract_p + null, -- type_extension_table + null -- name_method +); + Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-object-types-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-object-types-drop.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-object-types-drop.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,9 @@ +delete from acs_objects where object_type = 'acs_sc_implementation'; +select acs_object_type__drop_type ('acs_sc_implementation', 'f'); + +delete from acs_objects where object_type = 'acs_sc_operation'; +select acs_object_type__drop_type ('acs_sc_operation', 'f'); + +delete from acs_objects where object_type = 'acs_sc_contract'; +select acs_object_type__drop_type ('acs_sc_contract', 'f'); + Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-packages-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-packages-create.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-packages-create.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,484 @@ +create function acs_sc_contract__new(varchar,text) +returns integer as ' +declare + p_contract_name alias for $1; + p_contract_desc alias for $2; + v_contract_id integer; +begin + + v_contract_id := acs_object__new( + null, + ''acs_sc_contract'', + now(), + null, + null, + null + ); + + insert into acs_sc_contract ( + contract_id, + contract_name, + contract_desc + ) values ( + v_contract_id, + p_contract_name, + p_contract_desc + ); + + return v_contract_id; + +end;' language 'plpgsql'; + + + +create function acs_sc_contract__get_id(varchar) +returns integer as ' +declare + p_contract_name alias for $1; + v_contract_id integer; +begin + + select contract_id into v_contract_id + from acs_sc_contract + where contract_name = p_contract_name; + + return v_contract_id; + +end;' language 'plpgsql'; + + + +create function acs_sc_contract__get_name(integer) +returns varchar as ' +declare + p_contract_id alias for $1; + v_contract_name varchar; +begin + + select contract_name into v_contract_name + from acs_sc_contract + where contract_id = p_contract_id; + + return v_contract_name; + +end;' language 'plpgsql'; + + + +create function acs_sc_contract__delete(integer) +returns integer as ' +declare + p_contract_id alias for $1; +begin + + delete from acs_sc_contract + where contract_id = p_contract_id; + + return 0; + +end;' language 'plpgsql'; + + + +create function acs_sc_contract__delete(varchar) +returns integer as ' +declare + p_contract_name alias for $1; + v_contract_id integer; +begin + + v_contract_id := acs_sc_contract__get_id(p_contract_name); + + perform acs_sc_contract__delete(v_contract_id); + + return 0; + +end;' language 'plpgsql'; + + + +create function acs_sc_operation__new(varchar,varchar,text,boolean,integer,varchar,varchar) +returns integer as ' +declare + p_contract_name alias for $1; + p_operation_name alias for $2; + p_operation_desc alias for $3; + p_operation_iscachable_p alias for $4; + p_operation_nargs alias for $5; + p_operation_inputtype alias for $6; + p_operation_outputtype alias for $7; + v_contract_id integer; + v_operation_id integer; + v_operation_inputtype_id integer; + v_operation_outputtype_id integer; +begin + + v_contract_id := acs_sc_contract__get_id(p_contract_name); + + v_operation_id := acs_object__new( + null, + ''acs_sc_operation'', + now(), + null, + null, + null + ); + + v_operation_inputtype_id := acs_sc_msg_type__get_id(p_operation_inputtype); + + v_operation_outputtype_id := acs_sc_msg_type__get_id(p_operation_outputtype); + + insert into acs_sc_operation ( + contract_id, + operation_id, + contract_name, + operation_name, + operation_desc, + operation_iscachable_p, + operation_nargs, + operation_inputtype_id, + operation_outputtype_id + ) values ( + v_contract_id, + v_operation_id, + p_contract_name, + p_operation_name, + p_operation_desc, + p_operation_iscachable_p, + p_operation_nargs, + v_operation_inputtype_id, + v_operation_outputtype_id + ); + + return v_operation_id; + +end;' language 'plpgsql'; + + + +create function acs_sc_operation__get_id(varchar,varchar) +returns integer as ' +declare + p_contract_name alias for $1; + p_operation_name alias for $2; + v_operation_id integer; +begin + + select operation_id into v_operation_id + from acs_sc_operation + where contract_name = p_contract_name + and operation_name = p_operation_name; + + return v_operation_id; + +end;' language 'plpgsql'; + + + +create function acs_sc_operation__delete(integer) +returns integer as ' +declare + p_operation_id alias for $1; +begin + + delete from acs_sc_operation + where operation_id = p_operation_id; + + return 0; + +end;' language 'plpgsql'; + + + +create function acs_sc_operation__delete(varchar,varchar) +returns integer as ' +declare + p_contract_name alias for $1; + p_operation_name alias for $2; + v_operation_id integer; +begin + + v_operation_id := acs_sc_operation__get_id( + p_contract_name, + p_operation_name + ); + + perform acs_sc_operation__delete(v_operation_id); + + return v_operation_id; + +end;' language 'plpgsql'; + + + +create function acs_sc_impl__new(varchar,varchar,varchar) +returns integer as ' +declare + p_impl_contract_name alias for $1; + p_impl_name alias for $2; + p_impl_owner_name alias for $3; + v_impl_id integer; +begin + + v_impl_id := acs_object__new( + null, + ''acs_sc_implementation'', + now(), + null, + null, + null + ); + + insert into acs_sc_impl ( + impl_id, + impl_name, + impl_owner_name, + impl_contract_name + ) values ( + v_impl_id, + p_impl_name, + p_impl_owner_name, + p_impl_contract_name + ); + + return v_impl_id; + +end;' language 'plpgsql'; + + + +create function acs_sc_impl__get_id(varchar,varchar) +returns integer as ' +declare + p_impl_contract_name alias for $1; + p_impl_name alias for $2; + v_impl_id integer; +begin + + select impl_id into v_impl_id + from acs_sc_impl + where impl_name = p_impl_name + and impl_contract_name = p_impl_contract_name; + + return v_impl_id; + +end;' language 'plpgsql'; + + +create function acs_sc_impl__get_name(integer) +returns varchar as ' +declare + p_impl_id alias for $1; + v_impl_name varchar; +begin + + select impl_name into v_impl_name + from acs_sc_impl + where impl_id = p_impl_id; + + return v_impl_name; + +end;' language 'plpgsql'; + + + +create function acs_sc_impl__delete(varchar,varchar) +returns integer as ' +declare + p_impl_contract_name alias for $1; + p_impl_name alias for $2; +begin + + delete from acs_sc_impl + where impl_contract_name = p_impl_contract_name + and impl_name = p_impl_name; + + return 0; + +end;' language 'plpgsql'; + + + + + + +create function acs_sc_impl_alias__new(varchar,varchar,varchar,varchar,varchar) +returns integer as ' +declare + p_impl_contract_name alias for $1; + p_impl_name alias for $2; + p_impl_operation_name alias for $3; + p_impl_alias alias for $4; + p_impl_pl alias for $5; + v_impl_id integer; +begin + + v_impl_id := acs_sc_impl__get_id(p_impl_contract_name,p_impl_name); + + insert into acs_sc_impl_alias ( + impl_id, + impl_name, + impl_contract_name, + impl_operation_name, + impl_alias, + impl_pl + ) values ( + v_impl_id, + p_impl_name, + p_impl_contract_name, + p_impl_operation_name, + p_impl_alias, + p_impl_pl + ); + + return v_impl_id; + +end;' language 'plpgsql'; + + + + +create function acs_sc_impl_alias__delete(varchar,varchar) +returns integer as ' +declare + p_impl_contract_name alias for $1; + p_impl_name alias for $2; + p_impl_operation_name alias for $3; + v_impl_id integer; +begin + + v_impl_id := acs_sc_impl__get_id(p_impl_name); + + delete from acs_sc_impl_alias + where impl_contract_name = p_impl_contract_name + and impl_name = p_impl_name + and impl_operation_name = p_impl_operation_name; + + return v_impl_id; + +end;' language 'plpgsql'; + + + +create function acs_sc_binding__new(integer,integer) +returns integer as ' +declare + p_contract_id alias for $1; + p_impl_id alias for $2; + v_contract_name varchar; + v_impl_name varchar; + v_count integer; +begin + + v_contract_name := acs_sc_contract__get_name(p_contract_id); + v_impl_name := acs_sc_impl__get_name(p_impl_id); + + select count(*) into v_count + from acs_sc_operation + where contract_id = p_contract_id + and operation_name not in (select impl_operation_name + from acs_sc_impl_alias + where impl_contract_name = v_contract_name + and impl_id = p_impl_id); + + if v_count > 0 then + raise exception ''Binding of % to % failed.'', v_contract_name, v_impl_name; + end if; + + insert into acs_sc_binding ( + contract_id, + impl_id + ) values ( + p_contract_id, + p_impl_id + ); + + return 0; + +end;' language 'plpgsql'; + + + +create function acs_sc_binding__new(varchar,varchar) +returns integer as ' +declare + p_contract_name alias for $1; + p_impl_name alias for $2; + v_contract_id integer; + v_impl_id integer; + v_count integer; +begin + + v_contract_id := acs_sc_contract__get_id(p_contract_name); + + v_impl_id := acs_sc_impl__get_id(p_contract_name,p_impl_name); + + perform acs_sc_binding__new(v_contract_id,v_impl_id); + + return 0; + +end;' language 'plpgsql'; + + +create function acs_sc_binding__delete(integer,integer) +returns integer as ' +declare + p_contract_id alias for $1; + p_impl_id alias for $2; +begin + + delete from acs_sc_binding + where contract_id = p_contract_id + and impl_id = p_impl_id; + + return 0; +end;' language 'plpgsql'; + + +create function acs_sc_binding__delete(varchar,varchar) +returns integer as ' +declare + p_contract_name alias for $1; + p_impl_name alias for $2; + v_contract_id integer; + v_impl_id integer; +begin + + v_contract_id := acs_sc_contract__get_id(p_contract_name); + + v_impl_id := acs_sc_impl__get_id(p_contract_name,p_impl_name); + + perform acs_sc_binding__delete(v_contract_id,v_impl_id); + + return 0; + +end;' language 'plpgsql'; + + + +create function acs_sc_binding__exists_p(varchar,varchar) +returns integer as ' +declare + p_contract_name alias for $1; + p_impl_name alias for $2; + v_contract_id integer; + v_impl_id integer; + v_exists_p integer; +begin + + v_contract_id := acs_sc_contract__get_id(p_contract_name); + + v_impl_id := acs_sc_impl__get_id(p_contract_name,p_impl_name); + + select case when count(*)=0 then 0 else 1 end into v_exists_p + from acs_sc_binding + where contract_id = v_contract_id + and impl_id = v_impl_id; + + return v_exists_p; + +end;' language 'plpgsql'; + + + + Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-packages-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-packages-drop.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-packages-drop.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,20 @@ +drop function acs_sc_binding__exists_p(varchar,varchar); +drop function acs_sc_binding__delete(varchar,varchar); +drop function acs_sc_binding__delete(integer,integer); +drop function acs_sc_binding__new(integer,integer); +drop function acs_sc_binding__new(varchar,varchar); +drop function acs_sc_impl_alias__delete(varchar,varchar); +drop function acs_sc_impl_alias__new(varchar,varchar,varchar,varchar,varchar); +drop function acs_sc_impl__delete(varchar,varchar); +drop function acs_sc_impl__get_name(integer); +drop function acs_sc_impl__get_id(varchar,varchar); +drop function acs_sc_impl__new(varchar,varchar,varchar); +drop function acs_sc_operation__delete(varchar,varchar); +drop function acs_sc_operation__delete(integer); +drop function acs_sc_operation__get_id(varchar,varchar); +drop function acs_sc_operation__new(varchar,varchar,text,boolean,integer,varchar,varchar); +drop function acs_sc_contract__delete(varchar); +drop function acs_sc_contract__delete(integer); +drop function acs_sc_contract__get_name(integer); +drop function acs_sc_contract__get_id(varchar); +drop function acs_sc_contract__new(varchar,text); Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-tables-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-tables-create.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-tables-create.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,99 @@ +create table acs_sc_contract ( + contract_id integer + constraint acs_sc_contract_id_fk + references acs_objects(object_id) + on delete cascade + constraint acs_sc_contract_pk + primary key, + contract_name varchar(1000) + constraint acs_sc_contract_name_nn + not null + constraint acs_sc_contract_name_un + unique, + contract_desc text + constraint acs_sc_contract_desc_nn + not null +); + + + + + +create table acs_sc_operation ( + contract_id integer + constraint acs_sc_operation_cid_fk + references acs_sc_contract(contract_id) + on delete cascade, + operation_id integer + constraint acs_sc_operation_opid_fk + references acs_objects(object_id) + on delete cascade + constraint acs_sc_operation_pk + primary key, + contract_name varchar(1000), + operation_name varchar(100), + operation_desc text + constraint acs_sc_operation_desc_nn + not null, + operation_iscachable_p boolean, + operation_nargs integer, + operation_inputtype_id integer + constraint acs_sc_operation_intype_fk + references acs_sc_msg_type(msg_type_id), + operation_outputtype_id integer + constraint acs_sc_operation_outtype_fk + references acs_sc_msg_type(msg_type_id) +); + + + +create table acs_sc_impl ( + impl_id integer + constraint acs_sc_impl_impl_id_fk + references acs_objects(object_id) + on delete cascade + constraint acs_sc_impl_pk + primary key, + impl_name varchar(100), + impl_owner_name varchar(1000), + impl_contract_name varchar(1000) +); + + + +create table acs_sc_impl_alias ( + impl_id integer + constraint acs_sc_impl_proc_impl_id_fk + references acs_sc_impl(impl_id) + on delete cascade, + impl_name varchar(100), + impl_contract_name varchar(1000), + impl_operation_name varchar(100), + impl_alias varchar(100), + impl_pl varchar(100), +constraint acs_sc_impl_alias_un unique(impl_name,impl_contract_name,impl_operation_name) +); + + + +create table acs_sc_binding ( + contract_id integer + constraint acs_sc_binding_cid_fk + references acs_sc_contract(contract_id) + on delete cascade, + impl_id integer + constraint acs_sc_binding_impl_id_fk + references acs_sc_impl(impl_id) + on delete cascade +); + + + + + + + + + + + Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-tables-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-tables-drop.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-tables-drop.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,5 @@ +drop table acs_sc_binding; +drop table acs_sc_impl_alias; +drop table acs_sc_impl; +drop table acs_sc_operation; +drop table acs_sc_contract; Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-views-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-views-create.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-views-create.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,46 @@ +create view valid_uninstalled_binding as + select c.contract_id, c.contract_name, i.impl_id, i.impl_name + from acs_sc_contract c, acs_sc_impl i + where c.contract_name = i.impl_contract_name + and not exists (select 1 + from acs_sc_binding b + where b.contract_id = c.contract_id + and b.impl_id = i.impl_id) + and not exists (select 1 + from acs_sc_operation o + where o.contract_id = c.contract_id + and not exists (select 1 + from acs_sc_impl_alias a + where a.impl_contract_name = c.contract_name + and a.impl_id = i.impl_id + and a.impl_operation_name = o.operation_name)); + + + +create view invalid_uninstalled_binding as + select c.contract_id, c.contract_name, i.impl_id, i.impl_name + from acs_sc_contract c, acs_sc_impl i + where c.contract_name = i.impl_contract_name + and not exists (select 1 + from acs_sc_binding b + where b.contract_id = c.contract_id + and b.impl_id = i.impl_id) + and exists (select 1 + from acs_sc_operation o + where o.contract_id = c.contract_id + and not exists (select 1 + from acs_sc_impl_alias a + where a.impl_contract_name = c.contract_name + and a.impl_id = i.impl_id + and a.impl_operation_name = o.operation_name)); + + +create view orphan_implementation as + select i.impl_id, i.impl_name, i.impl_contract_name + from acs_sc_impl i + where not exists (select 1 + from acs_sc_binding b + where b.impl_id = i.impl_id) + and not exists (select 1 + from acs_sc_contract c + where c.contract_name = i.impl_contract_name); \ No newline at end of file Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-views-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-views-drop.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-sc-views-drop.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,3 @@ +drop view orphan_implementation; +drop view invalid_uninstalled_binding; +drop view valid_uninstalled_binding; \ No newline at end of file Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-service-contract-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-service-contract-create.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-service-contract-create.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,5 @@ +\i acs-sc-msg-types-create.sql +\i acs-sc-object-types-create.sql +\i acs-sc-tables-create.sql +\i acs-sc-packages-create.sql +\i acs-sc-views-create.sql \ No newline at end of file Index: openacs-4/packages/acs-service-contract/sql/postgresql/acs-service-contract-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/acs-service-contract-drop.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/acs-service-contract-drop.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,5 @@ +\i acs-sc-views-drop.sql +\i acs-sc-packages-drop.sql +\i acs-sc-tables-drop.sql +\i acs-sc-object-types-drop.sql +\i acs-sc-msg-types-drop.sql \ No newline at end of file Index: openacs-4/packages/acs-service-contract/sql/postgresql/sc-sample-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/sc-sample-create.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/sc-sample-create.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,87 @@ +-- CREATE CONTRACT + +select acs_sc_contract__new ( + 'ObjectDisplay', -- contract_name + 'Object display' -- contract_desc +); + + +select acs_sc_msg_type__new ('ObjectDisplay.Name.InputType','object_id:integer'); +select acs_sc_msg_type__new ('ObjectDisplay.Name.OutputType','object_name:string'); + +select acs_sc_operation__new ( + 'ObjectDisplay', -- contract_name + 'name', -- operation_name + 'Returns object''s name', -- operation_desc + 'f', -- operation_iscachable_p + 1, -- operation_nargs + 'ObjectDisplay.Name.InputType', -- operation_inputtype + 'ObjectDisplay.Name.OutputType' -- operation_outputtype +); + + +select acs_sc_msg_type__new ('ObjectDisplay.Url.InputType','object_id:integer'); +select acs_sc_msg_type__new ('ObjectDisplay.Url.OutputType','object_url:uri'); + +select acs_sc_operation__new ( + 'ObjectDisplay', -- contract_name + 'url', -- operation_name + 'Returns object''s url', -- operation_desc + 'f', -- operation_iscachable_p + 1, -- operation_nargs + 'ObjectDisplay.Url.InputType', -- operation_inputtype + 'ObjectDisplay.Url.OutputType' -- operation_outputtype +); + +select acs_sc_msg_type__new ('ObjectDisplay.SampleHello.InputType','object_id:integer,object_txt:string'); +select acs_sc_msg_type__new ('ObjectDisplay.SampleHello.OutputType','object_sample:string[],xxx_p:boolean'); + +select acs_sc_operation__new ( + 'ObjectDisplay', -- contract_name + 'sample_hello', -- operation_name + 'Returns object''s url', -- operation_desc + 't', -- operation_iscachable_p + 1, -- operation_nargs + 'ObjectDisplay.SampleHello.InputType', -- operation_inputtype + 'ObjectDisplay.SampleHello.OutputType' -- operation_outputtype +); + + + +-- CREATE IMPLEMENTATION + + +select acs_sc_impl__new( + 'ObjectDisplay', -- impl_contract_name + 'bboard_message', -- impl_name + 'bboard' -- impl_owner_name +); + + +select acs_sc_impl_alias__new( + 'ObjectDisplay', -- impl_contract_name + 'bboard_message', -- impl_name + 'name', -- impl_operation_name + 'bboard_message__name', -- impl_alias + 'PLPGSQL' -- impl_pl +); + +select acs_sc_impl_alias__new( + 'ObjectDisplay', -- impl_contract_name + 'bboard_message', -- impl_name + 'url', -- impl_operation_name + 'bboard_message__url', -- impl_alias + 'PLPGSQL' -- impl_pl +); + +select acs_sc_impl_alias__new( + 'ObjectDisplay', -- impl_contract_name + 'bboard_message', -- impl_name + 'sample_hello', -- impl_operation_name + 'bboard_message__sample_hello', -- impl_alias + 'TCL' -- impl_pl +); + + + + Index: openacs-4/packages/acs-service-contract/sql/postgresql/sc-sample-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/sql/postgresql/sc-sample-drop.sql,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/sql/postgresql/sc-sample-drop.sql 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,16 @@ +select acs_sc_contract__delete('ObjectDisplay'); + +select acs_sc_msg_type__delete ('ObjectDisplay.Name.InputType'); +select acs_sc_msg_type__delete ('ObjectDisplay.Name.OutputType'); + +select acs_sc_msg_type__delete ('ObjectDisplay.Url.InputType'); +select acs_sc_msg_type__delete ('ObjectDisplay.Url.OutputType'); + + +select acs_sc_msg_type__delete ('ObjectDisplay.SampleHello.InputType'); +select acs_sc_msg_type__delete ('ObjectDisplay.SampleHello.OutputType'); + +select acs_sc_impl__delete( + 'ObjectDisplay', -- impl_contract_name + 'bboard_message' -- impl_name +); Index: openacs-4/packages/acs-service-contract/tcl/acs-service-contract-init.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/tcl/acs-service-contract-init.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/tcl/acs-service-contract-init.tcl 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,15 @@ + +db_foreach impl_operation { + select + impl_contract_name, + impl_operation_name, + impl_name + from acs_sc_impl_alias +} { + + set binding_exists_p [db_exec_plsql binding_exists_p {select acs_sc_binding__exists_p(:impl_contract_name,:impl_name)}] + + if $binding_exists_p { + acs_sc_proc $impl_contract_name $impl_operation_name $impl_name + } +} \ No newline at end of file Index: openacs-4/packages/acs-service-contract/tcl/acs-service-contract-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/tcl/acs-service-contract-procs.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/tcl/acs-service-contract-procs.tcl 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,212 @@ +ad_library { + + @author Neophytos Demetriou + +} + +ad_proc acs_sc_binding_exists_p { + contract + impl +} { + @author Neophytos Demetriou +} { + + return [db_exec_plsql binding_exists_p {select acs_sc_binding__exists_p(:contract,:impl)}] + +} + +ad_proc acs_sc_generate_name { + contract + impl + operation + +} { + @author Neophytos Demetriou +} { + return AcsSc.${contract}.${operation}.${impl} +} + + +ad_proc acs_sc_get_alias { + contract + operation + impl +} { + @author Neophytos Demetriou +} { + + set exists_p [util_memoize "acs_sc_binding_exists_p $contract $impl"] + + if ![set exists_p] {return ""} + + db_0or1row get_alias { + select impl_alias, impl_pl + from acs_sc_impl_alias + where impl_contract_name = :contract + and impl_operation_name = :operation + and impl_name = :impl + } + + return [list $impl_alias $impl_pl] + +} + + + + +ad_proc acs_sc_proc { + contract + operation + impl +} { + @author Neophytos Demetriou +} { + + set arguments [list] + set docblock [list] + + + set proc_name [acs_sc_generate_name $contract $impl $operation] + + foreach {impl_alias impl_pl} [acs_sc_get_alias $contract $operation $impl] break + + if ![info exists impl_alias] { + error "Cannot find alias for $proc_name" + } + + db_0or1row get_operation_definition { + select + operation_desc, + operation_iscachable_p, + operation_nargs, + operation_inputtype_id, + operation_outputtype_id + from acs_sc_operation + where contract_name = :contract + and operation_name = :operation + } + + lappend docblock "$operation_desc" + + db_foreach operation_inputtype_element { + select + element_name, + acs_sc_msg_type__get_name(element_msg_type_id) as element_msg_type_name, + element_msg_type_isset_p, + element_pos + from acs_sc_msg_type_element + where msg_type_id = :operation_inputtype_id + order by element_pos asc + } { + lappend arguments "$element_name" + lappend docblock "@param $element_name $element_msg_type_name" + if { $element_msg_type_isset_p } { + lappend docblock "\[\]" + } + } + + db_foreach operation_outputtype_element { + select + element_name, + acs_sc_msg_type__get_name(element_msg_type_id) as element_msg_type_name, + element_msg_type_isset_p, + element_pos + from acs_sc_msg_type_element + where msg_type_id = :operation_outputtype_id + order by element_pos asc + } { + lappend docblock "@return $element_name - $element_msg_type_name" + if { $element_msg_type_isset_p } { + lappend docblock "\[\]" + } + } + + + set full_statement [acs_sc_get_statement $impl_alias $impl_pl $arguments] + + if { $operation_iscachable_p } { + set full_statement "util_memoize \"$full_statement\"" + } + +#FIX ME: CALL BY NAME USING UPVAR + set body "return \[$full_statement\]" + + set docblock [join $docblock "\n\r"] + set arguments [join $arguments] + ad_proc $proc_name $arguments $docblock $body + +} + + + +ad_proc acs_sc_get_statement { + impl_alias + impl_pl + arguments +} { + @author Neophytos Demetriou +} { + + + switch $impl_pl { + TCL { + set full_statement [list $impl_alias] + for {set __i 0} {$__i < [llength $arguments]} {incr __i} { + lappend full_statement "\$[lindex $arguments $__i]" + } + set full_statement [join $full_statement] + } + PLPGSQL { + set args_list [list] + for {set __i 0} {$__i < [llength $arguments]} {incr __i} { + lappend args_list "\$[lindex $arguments $__i]" + } + set args_final [join $args_list ,] + set full_statement "db_exec_plsql full_statement \"select ${impl_alias}(${args_final})\"" + } + default { + error "Unknown impl_pl: $impl_pl" + } + } + + return $full_statement +} + + + + +ad_proc acs_sc_call { + contract + operation + {arguments ""} + {impl ""} +} { + @author Neophytos Demetriou +} { + + set proc_name [acs_sc_generate_name $contract $impl $operation] + + if { [llength [info procs $proc_name]] == 1 } { + return [apply $proc_name $arguments] + } else { + # QUESTION: + # SHOULD WE PRODUCE AN ERROR HERE? + # MAYBE NOT, THE SEMANTICS MIGHT REQUIRE TO CALL + # THE FUNCTION ONLY IF THE IMPLEMENTATION IS SUPPORTED. + ns_log warning "ACS-SC: Function Not Found: $proc_name" + return + } +} + + + + + + + + + + + + + Index: openacs-4/packages/acs-service-contract/www/binding-install.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/www/binding-install.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/www/binding-install.tcl 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,13 @@ +ad_page_contract { + + @author Neophytos Demetriou + +} { + contract_id:integer + impl_id:integer +} + + +db_exec_plsql binding_install "select acs_sc_binding__new($contract_id,$impl_id)" + +ad_returnredirect "" Index: openacs-4/packages/acs-service-contract/www/binding-uninstall.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/www/binding-uninstall.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/www/binding-uninstall.tcl 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,13 @@ +ad_page_contract { + + @author Neophytos Demetriou + +} { + contract_id:integer + impl_id:integer +} + + +db_exec_plsql binding_uninstall "select acs_sc_binding__delete($contract_id,$impl_id)" + +ad_returnredirect "" Index: openacs-4/packages/acs-service-contract/www/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/www/index.adp,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/www/index.adp 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,73 @@ + + +

ACS Service Contract

+ +@context_bar@ + +
+ +

Installed Bindings

+ + + + +

Valid Uninstalled Bindings

+ + + + +

Invalid Uninstalled Bindings

+ + +

Orphan Implementations

+ \ No newline at end of file Index: openacs-4/packages/acs-service-contract/www/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/www/index.tcl,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/www/index.tcl 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,30 @@ + +set context_bar [ad_context_bar] + +db_multirow valid_installed_binding valid_installed_binding { + select + contract_id, + impl_id, + acs_sc_contract__get_name(contract_id) as contract_name, + acs_sc_impl__get_name(impl_id) as impl_name + from + acs_sc_binding +} + + +db_multirow valid_uninstalled_binding valid_uninstalled_binding { + select contract_id, contract_name, impl_name,impl_id + from valid_uninstalled_binding; +} + + +db_multirow invalid_uninstalled_binding invalid_uninstalled_binding { + select contract_id, contract_name, impl_name,impl_id + from invalid_uninstalled_binding; +} + + +db_multirow orphan_implementation orphan_implementation { + select impl_id, impl_name, impl_contract_name + from orphan_implementation +} \ No newline at end of file Index: openacs-4/packages/acs-service-contract/www/doc/notes.html =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-service-contract/www/doc/notes.html,v diff -u -N --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/acs-service-contract/www/doc/notes.html 1 Sep 2001 20:22:57 -0000 1.1 @@ -0,0 +1,40 @@ +ACS Service Contract Overview +by Neophytos Demetriou (k2pts@yahoo.com) and Kapil Thangavelu (k_vertigo@yahoo.com) + + +Goals + +- To increase inter-application code reuse by designating interfaces for interaction. + +- To increase flexibility by allowing developers to reimplement an interface for their needs. + +- To provide the framework for constructing web services by housing the metadata needed to construct wsdl. + +- To be low impediment to developers to create interfaces for their packages. + +- To reduce fixed dependencies in packages. + + +Definitions + +Interface - An abstract set of operations supported by one or more endpoints. + +Operation - An abstract description of an action supported by the service. + +Binding - A concrete implementation for a particular interface. + +Function - The implementation of an operation. + + +Actors + +Registrar - An entity that defines the specification of a contract and registers it with the repository. + +Provider - Provides an implementation of the contract. + +Dependant - Something that uses a contract. + + + + +