O Net.Data é projetado para permitir que novas interfaces de linguagem e de banco de dados sejam incluídas de modo 'pluggable'. Estes ambientes de linguagem são acessados como programas de serviço. O nome do programa de serviço é configurado no arquivo de inicialização do Net.Data e associado ao nome do ambiente de linguagem. Cada ambiente de linguagem deve suportar um conjunto padrão de interfaces definidas pelo Net.Data.
O Net.Data para OS/400 suporta os seguintes ambientes de linguagem:
As seguintes seções descrevem os ambientes de linguagem acima relacionados.
O ambiente de linguagem REXX pode interpretar programas REXX internos que estão especificados em um bloco FUNCTION da macro Net.Data ou pode executar programas REXX externos armazenados em um arquivo separado. Algumas das características dos ambientes de linguagem REXX são:
Programas REXX acessam os valores de um parâmetro de tabela da macro Net.Data como variáveis stem do REXX. Para um programa REXX, o cabeçalho das colunas para tabela T é T_N.i e os valores de campo são T_V.i.j.
Chamadas a programas REXX externos são identificadas em um bloco FUNCTION por uma instrução do formato:
%EXEC{ REXX-file-name Yoptional parameters" %}
Segue um simples exemplo de uma macro (REXXM) com um programa REXX interno e uma referência a um programa REXX externo:
%define a = "3"
%define b = "0"
%function(DTW_REXX) func1(IN inp1, OUT outp1){
%EXEC{ /QSYS.LIB/REXX.LIB/REXXSRC.FILE/TREXX.MBR %}
%}
%function(DTW_REXX) func2(IN inp1, OUT outp1){
outp1 = 2*inp1
%}
%HTML(REPORT) {
@func1(a, b)
b=$(b)
@func2(a, b)
b=$(b)
%}
No exemplo, os resultados @func1 no programa REXX TREXX.MBR sendo interpretados pelo intérprete REXX, e os resultados @func2 no intérprete REXX estão interpretando a instrução "outp1 = 2*inp1". Em ambos os casos, o pool de variáveis REXX está definido de tal modo que o intérprete REXX possa acessar as variáveis "a" e "b". Após a conclusão da @func2, "b" é definido como "6" (supondo que o programa REXX TREXX.MBR não modificou "a").
Este é um exemplo de uma URL referenciando a macro, supondo que:
http://hostname/cgi-bin/db2www/WWW/macro/REXXM/report
Caso opte pela não criação de um arquivo de inicialização do Net.Data, o ambiente de linguagem REXX é ativado por padrão. No entanto, caso tenha criado um arquivo de inicialização e deseje utilizar o ambiente de linguagem REXX, a seguinte instrução de configuração deverá estar no arquivo de inicialização:
ENVIRONMENT(DTW_REXX) /QSYS.LIB/QTCP.LIB/QTMHREXX.SRVPGM ( )
O ambiente de linguagem SQL é utilizado para executar instruções SQL utilizando o DB2. Algumas das características do ambiente de linguagem SQL são:
DTW_SQL_NAMING_MODE = SYSTEM_NAMING
Você também pode definir DTW_SQL_NAMING_MODE como SQL_NAMING, que é o mesmo que o padrão do modo de nomeação SQL.
Quando uma conexão a um AS/400 remoto é feita, a Interface de Nível de Chamada SQL procura por um objeto *SQLPKG na biblioteca QGPL pelo nome de QSQCLIPKG. Se existir, ele será utilizado, caso contrário, ele será criado. Este pacote SQL contém todas as regras através das quais o SQL nativo é acessado. Sendo assim, os primeiros atributos da conexão definem as regras que devem ser seguidas por todas as conexões subseqüentes. Um destes atributos é o modo de nomeação. Se definir o DTW_SQL_NAMING_MODE para entrar em conflito com o modo de nomeação em um QGPL/QSQCLIPKG existente em um AS/400 remoto, a instrução SQL na macro Net.Data resultará em um SQLCODE de -5016. Para evitar que isto ocorra, selecione um modo de nomeação e o preserve. Se o objeto QGPL/QSQCLIPKG existente está em conflito com o modo de nomeação escolhido, elimine-o e emita o pedido do Net.Data novamente. Um novo QGPL/QSQCLIPKG é criado com a opção de modo de nomeação solicitada.
Quando o ambiente de linguagem SQL estabelece uma conexão a um sistema remoto, ele associa uma ID de usuário à conexão. Se, em uma consulta subseqüente do Net.Data, a ID de usuário não for correspondente àquela associada à conexão, a conexão será encerrada e uma nova conexão ao banco de dados será estabelecida (isto só ocorre se o escopo da transação for SINGLE). Então, se o desempenho é uma preocupação, os escritores da macro Web devem colocar um código permanente ou utilizar a mesma ID de usuário ao emitir instruções SQL para um banco de dados remoto. Para acesso a bancos de dados locais, a ID e senha do usuário são ignoradas.
Segue abaixo um simples exemplo de uma macro (SQLM) que emite um único comando SQL:
%define DATABASE="HOSTNAME"
%FUNCTION(DTW_SQL) sql1 (){
select * from custinfo.customer
%}
%HTML(REPORT) {
@sql1()
%}
A URL que faz referência à macro é semelhante ao exemplo da URL fornecido para o ambiente de linguagem REXX, exceto pelo nome do arquivo macro REXXM que é substituído por SQLM.
Caso opte pela não criação de um arquivo de inicialização do Net.Data, o ambiente de linguagem SQL é ativado por padrão. No entanto, caso tenha criado um arquivo de inicialização e deseje utilizar o ambiente de linguagem SQL, a seguinte instrução de configuração deverá estar no arquivo de inicialização:
ENVIRONMENT(DTW_SQL) /QSYS.LIB/QTCP.LIB/QTMHSQL.SRVPGM
( IN DATABASE, LOGIN, PASSWORD, TRANSACTION_SCOPE, SHOWSQL, DTW_SET_TOTAL_ROWS,
DB_CASE, OUT DTWTABLE, SQL_CODE, TOTAL_ROWS )
O texto desta instrução do ambiente deve estar todo em um linha do arquivo de inicialização. Aqui ele será mostrado dividido em diversas linhas para ficar legível.
Os parâmetros do ambiente de linguagem SQL na instrução de configuração acima são transmitidos ao ambiente de linguagem e estão descritos abaixo:
%DEFINE DATABASE="HOSTNAME"
%DEFINE{ LOGIN="MYUSERID"
PASSWORD="DB2WWW"
%}
%DEFINE TRANSACTION_SCOPE="SINGLE"
%DEFINE SHOWSQL="YES"
%DEFINE DB_CASE="UPPER"
Consulta concluída com código SQL $(SQL_CODE).
O ambiente de linguagem SYSTEM suporta chamadas a programas externos identificados em uma instrução EXEC no bloco FUNCTION.
O ambiente de linguagem de SYSTEM interpreta as instruções EXEC transmitindo o nome e parâmetros do programa especificado ao sistema operacional para execução através da chamada de função system() de linguagem C. Este método não permite que as variáveis do Net.Data sejam passadas ou recuperadas diretamente para as instruções executáveis, como faz o ambiente de linguagem do REXX, então o ambiente de linguagem do SYSTEM passa e recupera variáveis do seguinte modo:
Programas do ambiente de linguagem SYSTEM acessam os valores de um parâmetro de tabela da macro Net.Data através de seu nome Net.Data. Os cabeçalhos de coluna para a tabela T serão T_N_i e os valores de campo são T_V_i_j.
O ambiente de linguagem SYSTEM espera que o executável seja um comando ou um programa. O perfil de usuário QTMHHTP1 deverá possuir a autoridade adequada para executar o executável, além dos recursos que um executável utiliza.
Segue abaixo um simples exemplo de uma macro (SYSM) que especifica um programa como o executável, passando-a um parâmetro do Net.Data:
%define var1 = "OriginalValue"
%FUNCTION(DTW_SYSTEM) test(INOUT parm1){
%EXEC{ /QSYS.LIB/PGM.LIB/TSYS0001.PGM %}
%}
%HTML(REPORT) {
<PRE>
Valor da var1 antes da chamada de função: $(var1)
@test(var1)
Valor da var1 após a chamada de função: $(var1)
</PRE>
%}
A URL que faz referência à macro é semelhante ao exemplo da URL fornecido para o ambiente de linguagem REXX, exceto pelo nome do arquivo macro REXXM que é substituído por SYSM.
Caso opte pela não criação de um arquivo de inicialização do Net.Data, o ambiente de linguagem SYSTEM é ativado por padrão. No entanto, caso tenha criado um arquivo de inicialização e deseje utilizar o ambiente de linguagem SYSTEM, a seguinte instrução de configuração deverá estar no arquivo de inicialização:
ENVIRONMENT(DTW_SYSTEM) /QSYS.LIB/QTCP.LIB/QTMHSYS.SRVPGM ( )