Revista Do Linux  
EDIÇÃO DO MÊS
 Programação
 CD do mês
 Corporativo
 Entrevista
 Capa
 Estudo de Caso
 Produto
 Distro
 Flagship
 Interbase
 Gerenciadores
 RPM
 Wine
 XML
 

Interbase:
instale e configure

Na matéria de capa da edição anterior começamos uma série de artigos que mostrarão como instalar e configurar os servidores de bancos de dados mais conhecidos do mercado, território onde o SQL impera soberano. Agora trazemos o Interbase, grande aposta da Inprise para conquistar o mercado corporativo, e que está agora aderindo ao código aberto. Dando continuidade ao artigo anterior veremos como acessar bases de dados Interbase, depois de instalado e configurado, usando código xBase e comandos SQL.

InterBase

Para começar a se familiarizar com um banco de dados relacional, escolhemos o InterBase para o ambiente Linux, pois não só o banco como toda a documentação necessária podem ser baixados diretamente do site da Inprise.

As principais características de um banco de dados relacional de primeira linha são:

  • Garantia total da integridade da base de dados.
  • Controle de acesso à base de dados independente de aplicativos.
  • Facilidade de manutenção de relacionamento, dependência e integridade das informações no próprio banco.
  • Criação e manutenção de procedures e trigers.
  • Possibilidade de fazer backup dinâmico.
  • Facilidade de recuperação de informações com comandos SQL.
  • Possibilidade de uso de vários front-ends.

Vamos começar nosso trabalho de instalação já com o pacote do InterBase baixado. Como todo pacote para Linux (Red Hat), a instalação é feita com o rpm. Antes de iniciar a instalação, certifique-se de que o usuário administrador do banco de dados foi criado. Nosso roteiro baseia-se no usuário interbase como administrador.

Inclua o path /opt/interbase/bin no arquivo /etc/profile:

# cd /etc
# vi profile
# :/opt/interbase/bin

Crie ou inclua o localhosts no arquivo /etc/hosts.equiv:

# cd /etc
# vi hosts.equiv
# localhost

Verifique se o IP da sua máquina está incluído em /etc/hosts:

# cd /etc
# vi hosts

Instalando o InterBase

Faça isso como usuário root:

# rpm -ivh <pacote>

Altere o owner e group do diretório /opt/interbase para interbase:

# cd /opt/
# chown -R interbase.interbase interbase

Para colocar o banco "no ar", conecte-se como usuário interbase:

# ibmgr -start -user sysdba
-pass masterkey

Por segurança, após a instalação você deve alterar a senha do usuário sysdba. Veja se o banco está ativo:

# ps ax

Nota: Para tornar automática a inicialização do banco InterBase, inclua as seguintes linhas de comando no arquivo /etc/rc.d/rc.local:

# /bin/su
# interbase
# c
# /opt/interbase/bin/ibmgr
# start > /dev/null

Para tirar o Interbase "do ar", conecte-se como usuário interbase:

# ibmgr
# shut
# user sysdba
# pass masterkey

Para criar um banco de dados para trabalho, siga o seguinte script:

set sql dialect 1;
create database ‘<nome do banco>’;

Nota: O dialect é a forma como o InterBase compatibiliza as informações da base de dados de versões anteriores. Como foi desenvolvido para a versão anterior, o FS-Connection utiliza ainda o dialect 1. Exemplo:

set sql dialect 1;
create database ‘demo.gdb’;

Para fazer uma tabela no banco de dados criado veja esse exemplo:

isql demo.gdb
CREATE TABLE alunos (
    CODIGO       DECIMAL(18,0) NOT NULL, PRIMARY KEY (codigo),
    NOME           CHAR(40),
    INSCRICAO       TIMESTAMP,
    CURSO           DECIMAL(18,0),
    SEXO            CHAR(1) )
COMMIT;

Veja que na criação da tabela é possível definir a chave primária, ou seja, o conteúdo não pode ser duplicado

/* Inserindo 1 registro com comando SQL na tabela alunos */
INSERT INTO alunos ( CODIGO, NOME, INSCRICAO, CURSO, SEXO
VALUES ( 1, CARLA, 28.09.2000
, 3, F );
COMMIT;

O FS-Connection converte automaticamente 100% dos comandos de acesso à base de dados do FlagShip para comandos SQL do InterBase. Como se trata de conversão de fontes com lógicas procedurais para não procedurais (SQL), é importante analisar que na lógica de Clipper/FlagShip, a criação de arquivos índices é obrigatória sempre que houver necessidade de acesso randômico à linha/coluna.

Em banco de dados relacionais, o índice é criado única e exclusivamente quando se quer uma melhoria de performance no acesso à informação. No FS-Connection, portanto, os arquivos índices .NTX e .IDX são convertidos em arquivos .SQL somente para manter a compatibilidade lógica. Caso tenha sido criada uma função de recuperação de informação de uma ou mais tabelas do banco com lógicas SQL, não há necessidade de gerar o arquivo .SQL.

Na lógica procedural, uma procura com SOFTSEEK ON significa localizar o primeiro registro igual ou maior, enquanto que na lógica SQL todos são localizados a partir desse registro. Em casos de acesso a tabelas com muitos registros, é importante reanalisar a lógica e fazer as alterações para melhorar a performance da rotina.

Lógica batch em arquivos de grandes volumes

No processamento batch em lógicas procedurais normalmente utilizam-se funções condicionais, como o WHILE. Se estiver acessando outras tabelas nessa mesma lógica, a perda de performance pode ser muito grande em ambientes relacionais. Nesse caso, deve-se reanalisar a lógica e substituir por comandos SQL ou até mesmo criar procedures no próprio banco para ter ganhos de performance na rotina.

Em lógicas procedurais, é muito comum posicionar o ponteiro no primeiro ou no último registro, mesmo quando não vai se fazer nada. Em lógicas procedurais, não se esqueça que o comando vai gerar sempre um result set, ou seja, o comando será executado, inclusive com a classificação dos dados com o índice corrente. Execute, portanto, comandos ou funções somente quando efetivamente quiser obter ou processar uma rotina.

Em lógicas não procedurais, navegar num conjunto de linhas através do browse significa gerar um result set com as informações necessárias, inclusive as classificadas com o índice corrente. Se a sua lógica, portanto, estiver gerando uma quantidade muito grande, veja a possibilidade de criar intervalos de consulta menores para agilizar o acesso e melhorar a performance. Observe a estrutura de um arquivo .sql criado pelo FS-Connection:

<nome do arquivo.idx>.sql
TG:<nome do arquivo .idx>
KE:<col1> [, col2[, ... [, coln]]]

Exemplo:

Nome Índice    Conteúdo .sql
alunos_c.sql    TG:alunos_c
            KE:codigo
controle_x.sql    TG:controle_x
            KE:codigo, nome,                 chave, depto

Veja que na concatenação de várias colunas para o índice, não há necessidade de se preocupar com o conteúdo. Basta citar os nomes das colunas que compõem o índice na ordem correta.

Alteração dos fontes

As alterações básicas necessárias para os fontes dos programas em FlagShip são:

- Altere os arquivos de índices de .NTX para .SQL

- Para utilizar a diretiva #IFDEF, é necessário que ele seja compilado com o Flag DRDD. Exemplo:


#IFDEF RDD
   fs_set("translext","ntx","sql")
#ENDIF

- Inclua a rotina de conexão com o banco InterBase:

local nConnect := -1
local cUser              := interbase
local cPass       := inter
local cDb       := ../../teste.gdb

#IFDEF RDD
 extern IbRDDNew
 rddatual:=rddsetdefault("ibRDD")
CONNECT TO cDb USER cUser PASSWORD cPass get nConnect
  IF nConnect < 0
    ALERT("Falha na CONEXAO -> " + alltrim (str ( nConnect ) ) )
       RETURN NILL
    ENDIF
#ENDIF

Alteração no script do Makefile

As alterações são basicamente as que estão em negrito. O flag DRDD é para utilizar a diretiva #IFDEF.

 CC=FlagShip
 FILES=demo.prg
 LIBS=-lrddib
 FLAGS=-na -Mmain -o demo -DRDD
 all:
   $(CC) $(FILES) $(LIBS) $(FLAGS)
   rm *.c
 clean:
   rm *.o
   rm demo

Após essas alterações, confira a performance de cada rotina e crie os índices das tabelas. Nas rotinas com lógicas de processamento batch em arquivos de grande volume, analise a possibilidade de substituir o comando procedural por comandos SQL:

 // Lógica Procedural
 SELE Movimentos
 SET ORDER TO 2
 DbGoTop()
 WHILE .NOT. EOF()
   IF movimentos->conta = D
    SELE TabDebitos
    SET ORDER TO 1
    DbSeek(movimentos->codigo)
      IF FOUND()
         ProcessaDeb()
        ELSE
         ALERT(erro)
        ENDIF
   ELSE
        ProcessaCred()
    ENDIF
 ENDDO
 // Lógica SQL
 cSql := update movimentos set ... where ...
 ExecSql (cSql) ALIAS
 SQL

Veja que com lógicas SQL se reduz drasticamente o número de IO’s e o tempo de processamento.


A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux