sexta-feira, 8 de setembro de 2017

DROP Wiki #2 - Conexões com SGBDs

Dando continuidade à série DROP Wiki, o assunto da vez é o estabelecimento da conexão com uma fonte de dados (normalmente um SGBD) e a escolha da melhor classe para realizar esta tarefa.

Mais adiante veremos que para o ORM do DROP funcionar, poucos pré-requisitos são necessários. Destes pré-requisitos, o mais importante com certeza é criar um objeto do tipo TAqDBConnection, e através deste objeto, estabelecer uma conexão com a fonte de dados.

A classe TAqDBConnection (unit AqDrop.DB.Connection) é quase totalmente abstrata (existem planos, ainda que remotos, para transformá-la em interface, o que pode facilitar a implementação de testes). A responsabilidade da classe é abstrair o mínimo necessário para execução de comandos pelos SGDBs suportados. Obviamente, esta abstração visa possibilitar a extensão do framework para diferentes engines de acesso, sendo que, não custa relembrar, já temos extensões implementadas para DBX e FireDAC.

Basicamente as interfaces fornecidas por TAqDBConnection são:
  - Rotinas para manipulação de Transações;
  - Preparação de comandos (ao estilo Prepare e Unprepare);
  - Rotinas para abertura de cursores;
  - Rotinas para execução de comandos (nromalmente DMLs);

As rotinas de manipulação de transações, preparação e execução de comandos não diferem muito de qualquer engine de acesso a dados do Delphi (inclusive de terceiros). A diferença mais significativa está nas rotinas de abertura de cursores, que foram construídas de forma a fornecer interfaces semelhantes às fornecidas pelos readers do DBX Framework, conferindo ao código de leitura dos cursores um aproach mais voltado à orientação a objetos (em resumo, no datasets ;-).

Visando dividir os trabalhos do suporte ao DBX e FireDAC, duas classes foram implementadas e, ao estilo VCL, ambas tem o termo 'Custom' em seus nomes (TAqDBXCustomConnection e TAqFDCustomConnection), realizando o trabalho pesado no que diz respeito a alcançar seus respectivos objetivos. Duas heranças diretas, omitindo o termo 'Custom' de seus nomes (TAqDBXConnection e TAqFDConnection) tem somente o trabalho de disponibilizar ao usuário da classe todos os parâmetros fornecidos pelo DROP e as engines mapeadas, de forma a permitir toda a configuração completa para acesso ao SGBD desejado.

Conforme prometido em outras oportunidades, uma feature que estava no forno e agora está pronta (faltando somente terminar a escrita dos novos testes para liberar a publicação), é o suporte ao Interbase. Já que esta é uma novidade, aproveito a oportunidade para usar o SGDB da Embarcadero para demonstrar, via DBX, a configuração de uma conexão. Segue exemplo de uso da classe TAqDBXConnection:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
function TTesteConexaoDBXConnection.GetConexao: TAqDBConnection;
var
  lConexao: TAqDBXConnection;
begin
  lConexao := TAqDBXConnection.Create;

  try
    lConexao.DriverName := 'InterBase';
    lConexao.VendorLib := 'GDS32.DLL';
    lConexao.LibraryName := 'dbxint.dll';
    lConexao.GetDriverFunc := 'getSQLDriverINTERBASE';
    lConexao.Properties[TDBXPropertyNames.Database] := 'C:\ALGUMCAMINHO\ALGUM.GDB';
    lConexao.Properties[TDBXPropertyNames.Username] := 'SYSDBA';
    lConexao.Properties[TDBXPropertyNames.Password] := 'masterkey';
    lConexao.DBXAdapter := TAqDBXIBAdapter.Create;
  except
    lConexao.Free;
    raise;
  end;

  Result := lConexao;
end;

O exemplo acima mostra que configurar uma conexão do DROP ou um TSQLConnection, por exemplo, são tarefas muito parecidas. No entanto, uma diferença clara da configuração do DROP para outras conexões do Delphi, está na construção de um adapter, necessário para um completo funcionamento dos recursos do DROP. Os adapters informam ao DROP como resolver algumas tarefas, ou então, como ler alguns tipos de dados do SGDB.

Como o DROP visa funcionar mais como biblioteca, e menos como componente, a tarefa acima pode ser simplificada através do uso de um outro conjunto de classes, que mapeiam mais facilmente algumas distinções entre os SGBDs suportados. Abaixo vemos a criação de uma conexão com a mesma base de dados utilizada acima, no entanto, usando diretamente uma classe que mapeia DBX e as particularidades do Interbase.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
function TTesteConexaoDBXIB.GetConexao: TAqDBConnection;
var
  lConexao: TAqDBXIBConnection;
begin
  lConexao := TAqDBXIBConnection.Create;

  try
    lConexao.DataBase := 'C:\ALGUMCAMINHO\ALGUM.GDB';
    lConexao.UserName := 'SYSDBA';
    lConexao.Password := 'masterkey';
  except
    lConexao.Free;
    raise;
  end;

  Result := lConexao;
end;

No exemplo acima percebemos que a classe TAqDBXIBConnection se responsabiliza por configurar as propriedades conforme padrão para conectar com o Interbase, e expõe propriedades que são específicas do IB. Estas propriedades permitem configurar estaticamente alguns dados como o percurso do GDB, usuário e senha, ao contrário do primeiro exemplo, onde estas informações são dadas dinamicamente.

Bom, este foi o exemplo com o SGDB Interbase, e exemplos com outros SGDBs simplesmente significariam um pouco "mais do mesmo" em se tratando de código. No entanto, é válido colocar no mínimo a lista de classes especializadas já disponíveis no DROP, cada uma configurando a conexão para o comportamento padrão do SGDB, e disponibilizando propriedades particulares ao mesmo. Segue lista completa de classes, separadas por engine:

DBX:
 - TAqDBXIBConnection;
 - TAqDBXMSSQLConnection;
 - TAqDBXMySQLConnection;
 - TAqDBXFBConnection;
 - TAqDBXOraConnection;
 - TAqDBXSQLiteConnection;

FD:
 - TAqFDIBConnection;
 - TAqFDMSSQLConnection;
 - TAqFDMySQLConnection;
 - TAqFDFBConnection;
 - TAqFDOraConnection;
 - TAqFDSQLiteConnection;
 - TAqFDPGConnection;

Notem que no FireDAC, temos um SGDB a mais, que é o PostgreSQL.

E, para o momento, vamos ficando por aqui. Na sequência teremos o episódio #3 da série, que vai mostrar como usar estes objetos de forma independente, e em episódios futuros, como usar dentro do aspecto do mapeamento objeto-relacional.

Até o próximo post!


Nenhum comentário:

Postar um comentário

DROP Wiki #4 - Transações

O post de hoje é extremamente simples, mas sobre algo muito importante: Transações! O sistema de transações do DROP trabalha com o c...