FlagShip
acessando bancos
de dados relacional
Muito tem se falado de banco de dados relacional. Não vou me estender nesse assunto, pois existem diversos artigos demonstrando as vantagens da utilização de uma base relacional. Mas fundamentalmente podemos citar os principais benefícios de um banco relacional: padrão dos comandos de acesso (linguagem SQL), propriedade de suportar alto volume de dados, infinita capacidade de acesso à base por quaisquer dados (tipos de informação), backup on-line, integridade da base de dados, implementação de triggers e procedures, conceito de transação (commit/roolback) e distribuição e replicação de dados.
Com base nessas vantagens,
a Inso, distribuidora do FlagShip no Brasil (FlagShip é uma linguagem
de programação e ferramenta de desenvolvimento compatível com o
CA-Clipper), desenvolveu e agregou
a esse produto o FS-Connection. O FS-Connection é um RDD que permite ao FlagShip acessar bancos de dados relacionais. É sobre esse módulo que irei falar. Com o FS-Connection, pode-se converter todo o seu aplicativo Clipper para o ambiente Linux, acessando também um RDBMS.
O FS-Connection é composto por três módulos bem definidos.
1. O RDD propriamente dito, escrito em FlagShip, converte todos os comandos e as funções de acesso à base DBF para comandos SQL, que são formatados e enviados para as funções da LibRDD. O resultado desse processamento é recebido e reformatado para ser devolvido à aplicação cliente, como se tivesse acessado arquivos DBF.
2. O Daemon é um programa escrito em C e ESQLC (Embbeded SQL/C) com a função de fazer os acessos ao banco de dados relacional (RDBMS) efetivamente. Este recebe as requisições da LibRDD, as envia para o banco, recebe os resultados e repassa-os para a LibRDD novamente.
3. A LibRDD é um conjunto de funções escritas em C, mas com interface FlagShip, que recebe as requisições
do RDD, as envia para o Daemon,
recebe os resultados e repassa-os para o RDD.
Utilitários do FS-Connection
São fornecidos também alguns utilitários para realizar a conversão automática de formatos dos arquivos .dbf para RDBMS, incluindo também os campos lógicos, memos e criptografados. Existe também um outro utilitário que faz uma análise dos nomes dos campos dos arquivos em dbf para verificar se são nomes reservados do banco de dados.
DBF e RDBMS no mesmo programa
Através do comando USE complementado pelas funções DBFIDX ou DBFSQL, é possível definir se o arquivo é DBF ou uma tabela do banco de dados relacional. Normalmente define-se o ambiente default e acrescenta-se pelas funções citadas os arquivos que sejam exceção. Um dos nossos utilitários, o programa de conversão de arquivos com campos memo, é um exemplo de programa que usa tanto arquivos .dbf quanto tabelas em banco de dados relacional.
Fácil manutenção dos fontes
Sobretudo para os desenvolvedores, o aspecto interessante é que um único fonte e executável serve tanto para acessar a base .dbf como a RDBMS, que não precisam usar outra linguagem. Com o #if ... #else ... #endif, pode-se manter rotinas exclusivas para cada um dos ambientes num
mesmo programa, como nesse
exemplo:
#ifdef FlagShip
#include fspreset.fh
#endif
#ifdef RDD
extern IngresRDDNew
rddsetdefault (oracleRDD)
#endif
Utilizando esses recursos pode-se manter o mesmo fonte e gerar o
executável conforme o ambiente
(Clipper, FlagShip, FlagShip com
FS-Connection).
Melhoria de performance
Como os programas Clipper /
FlagShip escritos para acessar a base de dados dbf foram desenvolvidos com uma lógica procedural, em casos de processamentos batch de alto volume pode haver perda de performance.
Escrevendo essa rotina com lógicas SQL (não procedurais), a performance é muito maior. Para isso o FS-
Connection possui uma função
ExecSql, que permite escrever diretamente no fonte todo o comando SQL. Veja código 1 na página anterior.
Precauções com alguns comandos em ambiente RDBMS
Normalmente em tabelas de
grande volume, os comandos ou funções GoTop / DbGoTop(), GoToBottom / DbGoBottom(), Seek / DbSeek(), acompanhado do Set SoftSeek ON, podem trazer alguma perda de performance. Nesse caso analisar a lógica, usando comandos SQL, ou simplificar a rotina pode resultar numa melhoria muito grande de performance.
Esses mesmos comandos com o SoftSeek OFF não vão causar nenhuma perda de performance.
Limitações do FS-CONNECTION
- Set Filter e Set Relation deverão ser substituídos.
- Chaves de índices, com funções como o SUBSTR(...), LEFT(...), etc. não são aceitos.
- Número máximo de colunas (campos) por tabela (arquivo) 200 colunas (campos).
- Número máximo de campos MEMO por tabela (arquivo) 4 campos (passível de alteração).
- Tamanho máximo de linha (registro) 3.988 bytes.
- Não pode utilizar nome de tabelas e colunas com nomes reservados pelo BDR.
Conversão de aplicações Flagship para acesso a RDBMS
Fazer todos os testes necessários com o sistema em FlagShip acessando a base de dados dbf. Este teste é
importante para eliminar o problema
de lógica e também para a comparação de performance.
Instalar o FS-Connection no seu ambiente de trabalho
- Fazer as conversões de todos os arquivos para o banco de dados relacional, utilizando os utilitários que acompanham o FS-Connection.
- Executar as rotinas de parametrização e otimização de performance do próprio banco.
- Fazer as alterações básicas nos
fontes, efetuando os testes de acesso
e performance.
- Analisar eventuais problemas de performance, verificando a necessidade ou não de incluir ou alterar as funções críticas.
Principais vantagens de um RDBMS em relação ao DBF
- Fazer o backup dinâmico, ou seja, mesmo com os usuários conectados.
- Efetuar o restore da base sem perda dos dados, utilizando o próprio log do banco.
- Possibilidade de incluir controles de begin / end transactions.
- Eliminação total do problema de corrupção de índices.
- Garantia total de integridade da base de dados.
- Permitir compartilhamento com vários front-ends.
- Possibilitar o armazenamento
e acesso de grande volume de dados com ótima performance.
- Possibilidade de criar store procedures no próprio banco, para garantir a integridade, performance e otimização do código fonte
Características Gerais da Solução
- Evolução para o ambiente cliente / servidor.
- Possibilidade de dados distribuídos e multiplataforma.
Recurso de réplica e distribuição
de dados.
- Servidor de alta performance
e escalável, sem limites aparentes
de expansão.
- Implementação de procedimentos
de gerenciamento e segurança,
como backup on-line, restore, log
de transações, etc.
- O acesso via FS-Connection é nativo (não utiliza ODBC).
- Conversão automática dos arquivos DBF para a base de dados relacional, inclusive campos memos e conteúdos criptografados.
- O nível de customização é mínimo (quando existente).
- Possibilidade de escrever comandos SQL diretamente no fonte FlagShip.
- Acesso a diversos bancos relacionais (CA-Ingres II, Oracle, Interbase, etc).
- A documentação do FS-Connection é toda em HTML com descrição
de todos os comandos de acesso
FlagShip, com exemplos bastante variados e esclarecimento das principais dúvidas dos usuários.
FS-Connection demo
Você pode entrar no nosso site (www.inso.com.br) e solicitar um demo do FS-Connection para a realização dos seus testes. Para isso basta preencher o formulário de solicitação indicando que banco de dados relacional você irá utilizar. Além disso dispomos de workshop e seminários gratuitos (mensais), nos quais você pode se increver acessando o nosso site.
Conclusão
Aproveitando a base de conhecimento adquirida na cultura xBase, os desenvolvedores podem migrar suas aplicações para uma arquitetura mais robusta, e substituir suas bases de dados por servidores mais poderosos. Esses, por sua vez, ampliam o poder de distribuição de dados e incrementam a segurança das bases de dados
em redes de qualquer porte.
No próximo artigo, detalharemos
a instalação de um servidor Interbase, que além de estar aderindo à causa do código aberto, consome poucos recursos de hardware, comparando-se aos outros concorrentes na categoria, e que é reconhecido como um servidor de banco completo e sofisticado.
Código 1
#ifdef RDD
logicaSQL()
#else
logicaDBF()
#endif
ou
#ifdef RDD
cSql :=
update movto set movto.valor = movto.quant * produto.unitario from produto where movto.codigo = produto.codigo and movto.grupo = 10
ExecSql (cSql) ALIAS
SQL
#else
SELE Movto
SET ORDER TO 1
DbGoTop()
WHILE .NOT. EOF()
IF Movto->Grupo = 10
SELE Produto
SET ORDER TO 1
DbSeek(STR(Produto->Codigo))
IF FOUND()
SELE Movto
RLOCK()
Movto->Valor := Produto->Unitario * Movto->Quant
DbCommit()
UNLOCK
ELSE
Movto-Valor := 0
ENDIF
ENDIF
DbSkip()
ENDDO
#endif
Obs.: O comando SQL pode ter alguma diferença de sintaxe conforme o RDBMS.