quinta-feira, 30 de setembro de 2010

Delphi XE (2011) + ZeosLib 7 + PostgreSQL 9.0

Hoje instalei o recem lançado Embarcadero RAD Studio XE e gostei do que encontrei nele. Também pretendo escrever algumas notas sobre essa versão nos próximos dias.
Há algum tempo eu escrevi um pequeno passo-a-passo de como instalar o pacote de componentes ZeosLib no Delphi 2010 (http://flovato.blogspot.com/2009/10/zeoslib-for-delphi-2010.html) e hoje volto novamente a esse assunto mas com uma abordagem levemente diferente.
Também, a poucas semanas atrás, tivemos o lançamento da versão 9.0 do PostgreSQL e fiquei curioso para saber o quanto essa nova versão é suportada pelo ZeosLib.


Download
A última versão oficial, estável e disponível do ZeosDBO é a versão 6.6.6 que foi lançada em 30 de Dezembro de 2009 e oferece suporte para o Delphi 5 até Delphi 2007 (Delphi 11).
A versão 7.0 já era ansiosamente aguardada pelo público que utilizava desde o Delphi 2009 devido ao suporte UNICODE e, ainda hoje, continua em desenvolvimento e sem data certa para lançamento.
No artigo anterior foi utilizado uma revision alfa do ZeosLib 7 e, da mesma forma, iremos utilizar a revision mais recente do branch testing para o Delphi 2011 (XE).

Faça o checkout do branch de teste do ZeosLib (svn://zeos.firmos.at/zeos/branches/testing) para um diretório qualquer.
Se seu client svn for de linha de comando, abra o prompt de comandos e desloque-se até o diretório onde deseja fazer o checkout e execute o comando:
svn checkout svn://zeos.firmos.at/zeos/branches/testing.

Caso tenha instalado o Tortoise ou qualquer outro client svn, o procedimento é ainda mais fácil.


Nesse artigo o diretório D:\Delphi\Componentes\ZeosDBO2011\ será o local escolhido para o checkout, sendo utilizado como diretório base. Assim, no caso de você escolher um caminho diferente, basta reajustar as configurações no passo-a-passo de instalação para esse novo caminho.

OBS: A revision utilizada durante a escrita desse artigo foi a r822.
Além disso, se tiver dúvidas de como realizar o checkout, há uma imensa quantidade de tutoriais que explicam detalhadamente esse tema (link de pesquisa).
Por último, há a possibilidade de você baixar diretamente do sourceforge (http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/), quando assim uma release for disponibilizada.

Se tudo estiver correto, o pacote irá apresentar uma estrutura de diretórios igual ou muito semelhante ao da imagem abaixo.


Instalando o Pacote

O procedimento de instalação é bastante simples:


1. Abra o IDE do Delphi com permissões de administrador. Apesar de não ser obrigatório, deixo como uma forte recomendação em decorrência de problemas que tive em outras ocasiões.

2. No IDE do Delphi, clique na opção "Open Project" no menu "File" e vá até o subdiretório "\packages\delphi15" do local onde o foi feito o checkout do ZeosLib. Lá, abra o grupo de projetos ZeosDbo.groupproj.
OBS: O "15" nesse path identifica a versão do Delphi que, nesse caso, refere-se ao Delphi XE. Caso esteja utilizando uma outra versão, deve-se abrir o grupo de projetos correspondente a essa versão (Delphi13 = Delphi 2009; Delphi14 = Delphi 2010; Delphi15 = Delphi XE; ...).

Uma segunda dica para aqueles que já possuem o ZeosDBO 7 instalado e querem atualizá-lo, recomendo que, antes de iniciar a instalação, remova a versão atual do IDE e, após isso, delete todos os arquivos criados no último build (.dcp, .dcu, .loca, .identcache, .dsk, .map e .bpl).
Esses últimos podem ser encontrados na pasta "build" (\packages\delphi15\build). Assim, certifique-se de que essa pasta não contenha arquivos.

3. Build todos os projetos (menu Project -> Build All Projects);

Se tudo estiver OK, o Delphi irá informar a ocorrência de muitos hints e warnings durante o build dos packages. Não se preocupe, por hora vamos considerar que essas notificações não representam problemas.


Entretanto, muito provavelmente será apresentar uma mensagem de erro informando não ter encontrado um determinado arquivo fonte (Exemplo: "... [DCC Fatal Error] ZCore.dpk(51): F1026 File not found: 'ZVariant.dcu' ...").
Para corrigir isto basta apenas localizar o respectivo arquivo mencionado na mensagem de erro a partir do subdiretório "src" no local onde o checkout foi feito e acrescentar o caminho completo no Libray Path do Delphi (Menu Tools -> Options -> Environment Options -> Delphi Options -> Library).

Para evitar essa e várias outras notificações informando não ter encontrado um arquivo específico, acrescente cada um dos subdiretórios presentes no diretório raíz do ZeosLib no Library Path, como é mostrado na imagem abaixo.


Garanta que todas essas sete entradas, destacadas na imagem acima, estejam presentes no Library Path do Delphi. Especialmente a última, porque a compilação não irá emitir uma mensagem de erro se tal entrada não estiver presente. Entretanto, contribuirá com um efeito indesejado na hora de instalar o pacote de componentes.

Observe que na definição dos paths eu utilizo "$(DelphiComponents)\".
Na minha estação de trabalho há uma variável de ambiente chamada DelphiComponents que tem a finalidade de referenciar o diretório onde todos os componentes/pacotes de terceiros estão localizados.
Isso facilita a migração e uso de versões diferentes de componentes sem que seja necessário a reconfiguração dos path nos projetos ou no IDE do Delphi.
Caso não tenha ou não queira adicionar essa variável de ambiente, apenas substitua "$(DelphiComponents)\" pelo path onde o ZeosDBO está localizado (que nesse artigo é  D:\Delphi\Componentes\ZeosDBO2011).


OBS: Se após acrescentar os diretórios na Library Path o Delphi continuar exibindo a mensagem de erro, basta fechá-lo e reabrí-lo. Não esqueça de reabrí-lo com permissões de administrador!



4. Instale o pacote de componentes selecionando a opção "Install" (no menu de contexto) do pacote "ZComponentDesign150.bpl";


Se ao tentar instalar o pacote "ZComponentDesign150.bpl" for apresentado uma mensagem de erro igual ao da imagem abaixo, isso significa que o Delphi não encontrou o arquivo .BPL específico.


A forma mais prática e rápida de corrigir esse problema é colocando o diretório onde tal .BPL está localizada no System Path.
Observe que ao ser buildado os pacotes do ZeosLib, será criado um diretório chamado build localizado no subdiretório ".\packages\delphi15".
Assim, basta acrescentar esse caminho (D:\Delphi\Componentes\ZeosDBO2011\packages\delphi15\build) na lista de diretórios da variável de ambiente "PATH".


OBS: Qualquer alteração nas variáveis de ambiente irá requerer fechar e abrir novamente o Delphi, para que as alterações tenham efeito.

Se ao tentar instalar o pacote "ZComponentDesign150.bpl" for apresentado uma mensagem de erro igual ou semelhante ao da imagem abaixo, muito provavelmente ocorreu um descuido na especificação dos path do ZeosDBO.

Classifico como descuido porque esse erro foi ocasionado quando estava tentando instalar o ZeosDBO que estava em um path diferente daquele referenciado no System Path e no Library Path (no IDE do Delphi).
Assim, garanta que todos os path apontem exatamente para o diretório onde o ZeosDB está localizado.

Se tudo correr bem o Delphi irá apresentar um dialog informando a lista dos componentes que foram instalados.


5. Validando a instalação do pacote
Opcionalmente, você pode confirmar se a instalação realmente está consistente verificando os pacotes de componentes instalados no Delphi.
Para isso acesse o menu Component -> Install Packages ... e localize a entrada "Zeos Database Components".


Muitos tem relatados que mesmo a instalação do pacote ter sido bem sucedida, o Delphi não mostra a paletta de componentes do ZeosDBO.
Isso ocorre porque algum dos passos acima foi pulado ou não realizado de forma correta. E, normalmente, a razão do problema reside em dois pontos:
1º. Esqueceu de acrescentar a pasta de build ($(DelphiComponents)\packages\delphi15\build) no Library Path;

2º. Não especificou a pasta de build do ZeosDBO no System Path;

Uma forma fácil de confirmar isso é digitar “set path” no prompt de comandos.
Observe que na imagem abaixo o caminho "D:\Delphi\Componentes\ZeosDBO2011\packages\delphi15\build" está presente.




Conexão com PostgreSQL 9.0
A primeira questão a ser verificada é se essa versão do ZeosDBO consegue, ao menos, conectar-se ao PostgreSQL.
Nesse ponto é assumido que você já tenha instalado o PostgreSQL 9.X.

Para esse teste básico, um novo projeto foi criado e um componente TZConnection foi dropado no formulário.
Observe na imagem ao lado que a conexão foi efetuada com sucesso sobre a própria base de dados do postgres (metadados).
Um ponto a ser destacado é que na lista de protocolos (propriedade Protocol) não há um item "postgresql-9", como esperado. Assim, a opção mais provável foi utilizar "postgresql-8".
Penso que com o tempo seja acrescentado uma opção exclusiva para a versão 9 do postgresql, já que essa introduz mudanças significativas.

A configuração do componente TZConnection no DFM é apresentado como:

  object ZConnection1: TZConnection
    Properties.Strings = (
      'codepage=UTF8'
      'client_encoding=UTF8')
    AutoCommit = False
    Connected = True
    Protocol = 'postgresql-8'
    HostName = '127.0.0.1'
    Port = 5432
    Database = 'postgres'
    User = 'postgres'
    Password = 'MinhaSenha'
    Left = 126
    Top = 16
  end

Após configurar o componente e alterar a propriedade Connected para True, pela primeira vez, uma notificação de erro igual ao da imagem abaixo foi apresentada.


Esse é um problema clássico que é resolvido de duas maneiras: 1) Copiando os devidos arquivos para a pasta do projeto; ou 2) Acrescentando o diretório onde tais arquivos se encontram no PATH do sistema.
Todas as DLLs estão localizados no subdiretório "bin" do diretório de instalação do PostgreSQL (provavelmente C:\Program Files\PostgreSQL\9.0\bin).


Como mostra a imagem acima, a solução escolhida foi acrescentar o diretório de instalação do PostgreSQL no Path do sistema para que não seja necessário ter que copiar novamente as DLLs para novos projetos que usem o ZeosDBO.
Após isso só foi necessário fechar e reabrir o Delphi e a conexão ocorreu como esperada.


Realizando consultas
Após uma conexão bem sucedida, realizei alguns testes com os componentes básicos para exibir os registros das tabelas.
Na imagem abaixo pode-se notar o componente DBGrid exibindo informações da tabela "information_schema.table".


Apesar de ter realizados alguns poucos testes básicos em modo de design, aparentemente os componentes estão funcionando bem. Não notei qualquer tipo de falha.
Para validar prováveis problemas de suportes que muitas vezes são observados em circunstâncias específicas ou após um bom tempo de uso, resolvi migrar todo um sistema desenvolvido no Delphi 2010 para o Delphi XE.
Esse sistema possui um framework de banco de dados baseado no ZeosDBO e, em teoria, buildar e executar esse sistema através do Delphi XE iria expor qualquer falta de suporte para com o PostgreSQL 9.0, já que esse framework faz uso moderado dos recurso/componentes do ZeosDBO e o sistema possui uma base de dados relativamente grande.


Migrando o sistema para o Delphi XE
Imaginei que seria mais trabalhoso, mas praticamente não foi preciso fazer muita coisa.
Ao abrir o grupo de projeto desse sistema que foi criado no Delphi 2010, o Delphi XE nem mesmo realizou qualquer tipo de conversão de formato.
O único trabalho que tive foi substituir, na cláusula require dos projetos a referência de alguns pacotes de componentes de terceiros (por exemplo: substituir tms2010 por tms2011). O que não custou mais do que 30 minutos.
Só encontrei problemas com alguns pacotes de terceiros que estavam sendo utilizados. Entretanto, para todos já havia uma versão mais recente que suportavam o Delphi XE. Assim, o trabalho real foi instalar as versões novas desses pacotes, com exceção de um deles que necessitou alguma intervenção manual.

Bom, aqui o que nos interessa é a suporte do ZeosDBO ao PostgreSQL 9.0 e em relação a isso surpreendentemente não foi necessário modificar uma linha se quer do framework de banco de dados (esse framework foi criado em 2008 com a ainda recente versão 6.6.4 do ZeosDBO!). O sistema foi buildado 100% sem qualquer problema (apenas alguns poucos hints).
O foco desse post não é a migração de sistemas para o Delphi XE, mas a experiência foi muito positiva. E encorajo qualquer um que use o Delphi 2010 para fazer esse upgrade.
Inicialmente fiquei pensando que era bom demais para ser verdade e que bastaria rodar o sistema para as cores de cabeça aparecerem. Para minha felicidade, o software executou normalmente passando com sucesso em todos os testes automatizados.


Conclusão
Tenho a total consciência que por mais amplo que seja a utilização dos componentes e das funcionalidades do ZeosDBO nesse framework de banco de dados, é precipitado concluir que a versão alfa da versão 7.0 seja totalmente compatível com o PostgreSQL 9.X, mas sinto-me tranquilo para incentivar a qualquer um que já esteja pensando em fazer algum tipo de migração/upgrade parecido para que o faça.