--
-- acs_sc_msg_type__parse_spec/2
--
create or replace function acs_sc_msg_type__parse_spec(
  character varying,
  character varying
) returns int4 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__new_element(
                   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;