DataSnap no Kylix

Criando aplicações multicamadas no Linux

 

Na edição 46 da revista ClubeDelphi vimos como criar uma aplicação multicamadas passo a passo, usando Delphi 7, DataSnap, dbExpress e IB/FB. Nossa aplicação final poderia ser compilada tanto para ambiente cliente/servidor, Midas/DataSnap ou ainda Desktop. Vimos ainda algumas técnicas para desenvolvimento MultiTier. A aplicação podia usar ainda tanto o protocolo SOAP quanto o protocolo COM+. Você pode fazer download do aplicativo criado a partir do endereço:

http://codecentral.borland.com/codecentral/ccweb.exe/author?authorid=222668

Recebi vários e-mails de leitores comentando o artigo, vários pediram para que mostrássemos como construir uma aplicação multicamadas usando somente Kylix / Linux. Este é o tema deste artigo.

Introdução à programação DataSnap no Kylix

O exemplo deste artigo foi construído usando-se Kylix 3 Enterprise. A distribuição do Linux que utilizei foi a Red Hat 7.2, a versão do MySQL foi a 3.23 e o Apache 1.3. Utilizei essas configurações não por uma escolha pessoal: é uma das combinações mais estáveis para se trabalhar com esse tipo de aplicação e recomendada pelo Borland.

Como no Linux não temos o COM, nosso servidor de aplicação usará o protocolo SOAP, através da criação de Web Services no Kylix (suportada a partir do Kylix 2 Enterprise). O servidor SOAP será publicado em um servidor Apache.

Não é necessário criar métodos de Web Services para se trabalhar com DataSnap no Kylix, seja para transferir dados ou aplicar atualizações. A Borland criou uma interface chamada IAppServerSOAP, que é utilizada internamente pelo ClientDataSet, DataSetProvider e SOAP Data Module. Veja a definição da interface a partir da unit SOAPMidas.pas.

 

IAppServerSOAP = interface(IInvokable)

['{C99F4735-D6D2-495C-8CA2-E53E5A439E61}']

 

function SAS_ApplyUpdates(const ProviderName:

 WideString; Delta: OleVariant; MaxErrors: Integer;

  out ErrorCount: Integer; var OwnerData: OleVariant):

   OleVariant; stdcall;

 

function SAS_GetRecords(const ProviderName: WideString;

Count: Integer; out RecsOut: Integer;

 Options: Integer; const CommandText: WideString;

var Params: OleVariant; var OwnerData: OleVariant):

 OleVariant; stdcall;

 

function SAS_DataRequest(const ProviderName: WideString;

 Data: OleVariant): OleVariant; stdcall;

 

function SAS_GetProviderNames: TWideStringDynArray; stdcall;

 

function SAS_GetParams(const ProviderName: WideString;

var OwnerData: OleVariant): OleVariant; stdcall;

 

function SAS_RowRequest(const ProviderName: WideString;

 Row: OleVariant; RequestType: Integer;

var OwnerData: OleVariant): OleVariant; stdcall;

 

procedure SAS_Execute(const ProviderName: WideString;

const CommandText: WideString;

var Params: OleVariant; var OwnerData: OleVariant); stdcall;

 

end;

 

Essa interface permite a comunicação e troca de DataPackets entre um servidor SOAP e uma aplicação cliente. Os dados ao invés de usarem o formato COM usando o formato XML, permitindo a troca de dados através do protocolo HTTP / 80.

A partir de agora construiremos uma aplicação passo a passo. Criaremos o banco de dados, faremos ao acesso a dados, criaremos a aplicação servidora e finalmente a aplicação cliente. 

Criando o banco de dados no MySQL

Abra um Shell do Linux e inicie o servidor MySQL usando o seguinte comando:

 

./etc/init.d/mysqld start

 

Depois, abra o MySQL Monitor digitando “mysql”. Crie um banco de dados e uma tabela simples, usando os seguintes comandos (digite um por linha):

 

mysql> create database CLUBEDELPHI;

mysql> use CLUBEDELPHI;

mysql> create table ALUNOS (ID_ALUNO integer not null primary key,

 NOME_ALUNO varchar(40), FOTO blob);

 

Insira alguns registros usando o seguinte comando:

 

mysql> insert into ALUNOS values (1,’GUINTHER’,null);

 

Para ver os registros incluídos, basta dar um select (Figura 1):

 

Figura 1. Trabalhando com MySQL através de linha de comando

 

Dica: consulte a edição 28 da Revista ClubeDelphi, onde o acesso ao MySQL a partir do Delphi e Kylix foi discutido em detalhes.

Criando o Servidor SOAP

No Kylix, clique em File|New>Other>WebServices>SOAP Server Application (Figura 2).

 

Figura 2. Criando um servidor SOAP

Escolha a opção CGI Stand-Alone executable (Figura 3).

 

Figura 3. Tipos de servidores suportados

Quando o Kylix perguntar se você deseja criar uma interface para o módulo SOAP, responda não. Seu WebModule deve estar semelhante ao da Figura 4.

 

Figura 4. Web Module do servidor SOAP

Criando o SOAP DataModule

Clique em File|New>Other>WebServices>SOAP Server Data Module (Figura 5).

 

Figura 5. Criando um SOAP DataModule

Um SOAP Data Module é semelhante a um Data Module (na verdade ele é um descendente). Ele implementa a interface IAppServerSOAP discutida anteriormente. Digite DM para o nome do SOAP Data Module (Figura 6).

 

Figura 6. Dando um nome para o SOAP Data Module

Clique em File|Save All e salve todos os arquivos em um diretório chamado “Servidor”.

Configurando a conexão dbExpress

Coloque no SOAP Data Module os componentes SQLConnection e SQLQuery da paleta dbExpress, e um DataSetProvider da paleta Data Access. Veja a Figura 7.

 

Figura 7. Acesso ao MySQL com dbExpress

Relacione os componentes configurando suas propriedades, baseando-se no diagrama da Figura 8.

 

Figura 8. Configurando a relação entre os componentes.

Dê um duplo clique no SQLConnection e no editor de conexões do dbExpress clique em “+”. Escolha MySQL no Driver Name e digite “CLUBEDELPHI” para Connection Name (Figura 9).

 

Figura 9. Criando uma conexão MySQL

Clique em OK e configure as propriedades da conexão conforme a Figura 10. HostName recebe o nome ou IP do servidor que está rodando o banco MySQL, Database é nome do banco de dados (e não o caminho físico como no IB), User_Name e Password definem as credenciais de acesso. Nesse exemplo estamos usando as credenciais padrão.

 

Figura 10. Parâmetros da conexão dbExpress

Altere a propriedade SQL do SQLQuery para

 

select * from ALUNOS

 

Nota: Observe que nosso select é bastante simples. No entanto, em situações reais, é altamente recomendado o uso de parâmetros para otimizar o tráfego de dados na rede, como fizemos no exemplo da edição 46.

Distribuindo o servidor SOAP

Clique em Project|Options e na opção Output directory digite o diretório padrão de scripts do Apache, nesse caso /var/www/cgi-bin (Figura 11). Para quem trabalha com IIS, esse diretório pode ser comparado ao c:\Inetpub\Scripts.

 

Figura 11. Compilando a aplicação no diretório do Apache

Compile a aplicação. Esse procedimento fará com que o arquivo binário (nesse caso Project1) seja compilado já dentro do diretório publicado do Apache, sem a necessidade de se fazer uma cópia depois da compilação. Agora abra um Shell do Linux e digite os seguintes comandos:

 

ln -s /usr/local/kylix3/bin/libxercesxmldom.so.1

/usr/lib/libxercesxmldom.so.1

 

ln -s /usr/local/kylix3/bin/libxerces-c1_6_0.so

/usr/lib/libxerces-c1_6_0.so

 

ln -s /usr/local/kylix3/bin/libicuuc.so.20

/user/lib/libicuuc.so.20

 

ln -s /usr/local/kylix3/bin/libicudt20l.so

/user/lib/libicudt20l.so

 

ln -s /usr/local/kylix3/bin/libmidas.so.1

/user/lib/libmidas.so.1

 

ln -s /usr/local/kylix3/bin/libsqlmy.so

/user/lib/libsqlmy.so

 

ln -s /usr/lib/mysql/libmysqlclient.so

/usr/lib/libmysqlclient.so

 

Isso criará links em /usr/lib para as bibliotecas utilizadas pela aplicação Kylix, como arquivos do Midas, dbExpress e MySQL.

Testando o Servidor SOAP

Certifique-se que o servidor Apache esteja rodando. Você poderá iniciar o servidor usando o seguinte comando:

 

./etc/init.d/httpd start

 

Recomendo que você abra um navegador e acesso http://localhost. Se aparecer a página padrão do servidor Apache é porque ele está rodando corretamente. Abra um navegador e digite a seguinte URL:

 

http://localhost/cgi-bin/Project1

 

Deverá aparecer a página semelhante a mostrada na Figura 12. Essa página descreve as interfaces publicadas pelo servidor SOAP, bem como os documentos WSDL. Essa página é automaticamente criada pelo componente WSDLHTMLPublish, que está no Web Module da aplicação.

 

Figura 12. Informações sobre o servidor SOAP

Criando a aplicação Cliente

Clique em File|New|Application. Coloque no formulário um SoapConnectioin (paleta WebServices), um ClientDataSet e um DataSource (paleta DataAcess). Relacione as propriedades dos componentes conforme o diagrama da Figura 13.

 

Figura 13. Componentes da aplicação cliente

Configure as propriedades do SoapConnection conforme a Tabela 1:

Propriedade

Valor

URL

http://127.0.0.1/cgi-bin/Project1/soap/IDM

UseSoapAdapter

False

Connected

True

Tabela 1.

Aponte a propriedade ProviderName do ClientDataSet para DataSetProvider1 e Active para True. Coloque no formulário os seguintes componentes: duas Labels, dois Buttons, dois DBEdits, um DBImage um DBNavigator (paleta Data Controls) e um OpenDialog. Organize os componentes no formulário conforme mostrado na Figura 14.

 

Figura 14. Formulário principal da aplicação

Aponte a propriedade DataSource dos DBEdits, do DBImage e do DBNavigator. Aponte a propriedade DataField dos DBEdits e do DBImage para ID_ALUNOS, NOME_ALUNO e FOTO, respectivamente. No evento OnClick do botão Apply digite:

 

ClientDataSet1.ApplyUpdates(0);

 

Isso aplica no BD as alterações feitas no ClientDataSet. E no evento OnClick do botão Load digite:

 

if OpenDialog1.Execute then

  ClientDataSet1FOTO.LoadFromFile(OpenDialog1.FileName);

 

Isso abra uma caixa de diálogo para carregar uma imagem para o campo FOTO. Veja a aplicação final em excução na Figura 15.

 

Figura 15. Testando o acesso ao servidor SOAP a partir de uma aplicação cliente

Conclusões

Você poderá agora acessar seu servidor de aplicação SOAP no Linux a partir de qualquer lugar da Web, sem se preocupar com firewalls, usando o protocolo HTTP. Como usamos o formato XML, você pode construir aplicações clientes em diversas outras linguagens, como Delphi, C++ etc. Graças a Borland e a tecnologia DataSnap / IAppServer, vimos que desenvolver aplicação MultiCamadas é tão simples quando desenvolver uma aplicação cliente/server, usando dbExpress e ClientDataSet. Um abraço a todos e até a próxima!