BDE com Paradox

  Configurando o BDE para um banco de dados Paradox

  Você alguma vez já escreveu um programa Delphi que usa tabelas Paradox locais, e recebeu mensagens de erro, tais como, "Not initialized for network access" ou "Directory is busy"? Você já configurou um programa multi-usuário e descobriu que o usuário A não via as mudanças dos bancos de dados feitas pelo usuário B? O segredo para evitar esses problemas é certamente a configuração do Borland Database Engine(BDE).
 Primeiramente, vamos configurar o diretório Paradox na rede. Execute o BDE Administrator que acompanha o Delphi 3 ou 4, selecione a página Configuration e em Drivers | Native clique no Driver Paradox para ver as opções de configuração, conforme mostrada na figura 1.

  NET DIR

  Se seu programa acessar arquivos num drive compartilhado da rede, você tem que configurar o parâmetro NET DIR, que é o path para o diretório que contém o arquivo de controle do Paradox em rede, nomeado PDOXUSRS.NET.
  As regras seguintes aplicam-se para o path do NET DIR:
  Terá que apontar para um diretório compartilhado na rede;
  Usuários que vão acessar as tabelas Paradox terão que ter direito de ler, escrever, criar, e deletar neste diretório. O arquivo PDOXUSRS.NET será criado automaticamente pelo BDE;
  Usuários que acessarão simultaneamente as tabelas Paradox num diretório devem usar o mesmo diretório de arquivo de controle em rede.

· O path do NET DIR deve ser o mesmo para todos os usuários;

Se você estiver configurando o BDE para uma rede peer-to-peer (ponto a ponto), há uma exceção para esta última regra: Como você controla a rede peer-to-peer dependendo da versão do BDE que você está utilizando(16 ou 32 bits)? Vamos analisar primeiro um caso mais fácil. O BDE de 32-bit suporta o arquivos de nome UNC, então é fácil providenciar um path para o NET DIR que fique igual para todas as máquinas. O formato de um path UNC é:

\\NomeServidor\ShareName\ShareDir

onde o NomeServidor é o nome da máquina em que o NET DIR vai residir, ShareName é o nome atribuído para o diretório compartilhado na rede, e ShareDir é o path para um diretório abaixo do diretório compartilhado como ShareName. Usando UNC, o path do NET DIR será o mesmo em todas as maquinas, incluindo o servidor. Veja abaixo um exemplo de path UNC:

\\Servidor1\C\DiretorioTheClub

Com o BDE de 16-bit, você deve usar a mesma path do NET DIR em todas as máquinas, com uma exceção: a configuração do drive pode ser diferente. Por exemplo, suponha que o diretório do arquivo de controle em rede seja C:\NETDIR no servidor. Em todas as outras máquinas, o drive C: do servidor é mapeado para o drive G : Portanto, a configuração do NET DIR para essas máquinas deve ser G:\NETDIR

Você pode via programação fazer a configuração do NET DIR no arquivo de configuração do BDE em tempo de execução, configurando a propriedade Session.NetFileDir. Por exemplo:

Session.NetFileDir := ‘G:\BDENET ‘;

isso configurará o diretório do arquivo de controle para o diretório G:\BDENET. Se você precisar mudar o diretório do arquivo de controle no seu programa, faça isso no arquivo de projeto (.DPR) antes de qualquer formulário ser aberto, ou no evento OnCreate do formulário principal antes de qualquer tabela ser aberta. Se você configurar o diretório do arquivo de controle na rede na unit principal , ou no arquivo de projeto, lembre-se de incluir a unidade DB na cláusula uses.

Figura 1: Parâmetros de configuração do driver Paradox no BDE

LEVEL

A estrutura interna das tabelas Paradox tem mudado muitas vezes no decorrer desses anos; o parâmetro LEVEL determina a versão de tabela mais baixa (velha) que o BDE criará. A configuração default é 4, que é o primeiro formato introduzido com o Paradox 4.0 para DOS (e subseqüentemente usado pelo Paradox 4.5 para DOS , Paradox 1.0 para Windows, e Paradox 4.5 para Windows). Tabelas de nível 5 foram introduzidas no Paradox 5.0 para Windows, e tabelas de nível 7 são sustentadas pelo Paradox 7.0 para Windows 95/98 e Windows NT, e Paradox 7 para Windows 3.1 . Você pode usar também a configuração de nível de tabela para 3 se você precisar criar tabelas que podem ser acessadas pelo Paradox 3.5 para DOS ou versões mais recentes.

O nível de qualquer tabela que você criar será determinada pela característica da mesma. Vamos dizer que o nível da tabela no arquivo de configuração do BDE seja configurada para 4. Se você criar uma tabela que use o tipo de campo long integer, ou qualquer tipo de campo adicionado no Paradox 5.0, o BDE criará automaticamente uma tabela de nível 5. Se você usar índices único ou secundários descendentes, o BDE criará automa-ticamente uma tabela de nível 7. Você pode deixar também o nível de tabela defaut configurada para 4 (o default) para uma máxima compatibilidade. Você não terá uma performance melhor - ou qualquer outra vantagem - usando um nível de tabela superior à tabela ou uma estrutura de índice exigida.

TYPE

O arquivo de parâmetro TYPE é configurado automaticamente pelo BDE; você não deve mudá-lo. Os únicos dois valores válidos são FILE , usado pelo Paradox e tabelas DBase, e a SERVER, que é usado por qualquer servidor de bancos de dados.

  LANGDRIVER
  Essa configuração seleciona a linguagem do driver usada pela suas tabelas e índices. A linguagem do driver determina que língua específica de caracteres podem ser armazenados nas tabelas e em qual tipo de ordem é usada para construir índices.
  O caractere padrão do Paradox configurado segue o tipo de ordem ASCII , que separa "a" depois de "Z" isto é, caracteres minúsculos seguem os maiúsculos. Se você quiser "A" e "a" para serem separados adjacentes (entre eles), você deve considerar a mudança do drive de linguagem para o Paradox Internacional. Se fizer, embora fique avisado que, sem reconstruir todos os índices - um usuário Paradox com uma linguagem de driver diferente não será capaz de usar tabelas que você cria.

  BLOCK SIZE

  A quantia máxima de dados que uma tabela Paradox suporta é 64KB vezes o tamanho do bloco. O default do parâmetro BLOCK SIZE é de 2048 bytes, sendo assim qualquer tabela Paradox que você cria é limitada em 128MB em tamanho. O tamanho de bloco permitido para as tabelas com Level 3 e 4 são 1024, 2048, e 4096. Para o Level 5 e superior, você pode também especificar um tamanho de bloco de 8192, 16384, ou 32768. O tamanho default, contudo, ainda é 2048.

Se você mudar o tamanho do bloco no arquivo de configuração do BDE, todas as tabelas que você criar depois de fazer as mudanças terão um novo block size. Para mudar o block size de uma tabela existente, primeiro mude o block size no BDE Administrator, depois copie ou recrie a estrutura da tabela. Por que lendo ou escrevendo um registro simples significa ler ou escrever todo um bloco que contém o registro, você não deve fazer o block size maior do que é necessário para conter os dados.


  Figura 2: Você precisa alterar a configuração default do Local Share
  FILL FACTOR
  O FILL FACTOR determina o quão cheio um bloco de índices deve estar antes que o Paradox aloque outro bloco quando estiver construindo o índice. O default é de 95%. Isso significa que o índice é inicialmente construído, ou quando for reconstruído como parte de organizar uma tabela, cada bloco de índice terá aproximadamente 5 % de todo seu espaço vazio.

Quando você adicionar um novo registro para uma tabela, a entrada do registro deve ser feita em cada índice da tabela. Tendo espaço livre no bloco de índice, significa que é menos provável que o bloco afetado esteja cheio; portanto, adicionar o novo registro será mais rápido.

Apesar do FILL FACTOR poder ser configurado em qualquer porcentagem, deixando muito espaço livre nos blocos de índices o índice será maior. Se o índice for maior, mais blocos de índices devem ser lidos quando você procurar por um registro, diminuindo a performance.
  STRICTINTEGRTY
  Se STRICTINTEGRTY (Strict Integrity) for configurado para TRUE, os programas que não suportam integridade referencial (tal como Paradox para DOS) não serão capazes de modificar qualquer tabela para cada integridade referencial que for definida. Para modificar uma tabela Paradox para DOS, configure STRICTINTEGRTY to False. Se você fizer assim, e quiser proteger a integridade dos dados, você deve escrever o código para forçar a integridade referencial em seu Paradox para a aplicação do DOS.
  LOCAL SHARE
  O BDE automaticamente cuida das tabelas e registros travando-os para as tabelas Paradox armazenadas no drive da rede compartilhado. Embora, não seja a única situação onde a trava é requerida para assegurar a integridade dos seus dados. Se você executar múltiplos programas que simultaneamente acessem as mesmas tabelas no seu drive local, você precisa travar para prevenir um programa da mudança de um registro já em uso por outro.
  A Figura 2 mostra as configurações de System | Init do BDE Administrator. Por default, o parâmetro LOCAL SHARE é configurado para False. Se você executar múltiplos programas que acessem as mesmas tabelas, você deve configurar LOCAL SHARE para True para o BDE providenciar uma trava, mesmo que as tabelas estejam no seu drive local, a menos que todos os programas estejam usando as mesma versão do BDE. Se você estiver executando uma aplicação multi-usuário numa rede peer to peer você deve ter também LOCAL SHARE configurado para True. Isso por que o BDE "vê" o drive no servidor como um drive local mais do que um drive em rede compartilhado, e em cada estação está executando a sua própria cópia do BDE.

  PRIVATE DIRECTORY
  Se você é programador que usa Paradox, ficará surpreso ao aprender que as regras que governam o uso do diretório privado são muito diferentes no Delphi do que no Paradox. O Paradox cria arquivos temporariamente com nomes fixos no seu diretório privado. Exemplos incluem ANSWER.DB, CHANGED.DB, DELETED.DB e KEYVIOL.DB. Por que essas tabelas temporárias mostram o mesmo nome para cada usuário e para cada instância Paradox, cada usuário e cada sessão deve ter seu próprio diretório privado. Quando duas instâncias de Paradox estão executando na mesma máquina, isto assegura que 2 sessões de Paradox não tentarão criar uma tabela com um mesmo nome num mesmo diretório ao mesmo tempo.

Embora o BDE também crie arquivos temporários no diretório privado quando filtrando com Query, pesquisando, reestruturando tabelas Paradox e dBASE e quando apresentando uma query que une tabelas em 2 diferentes servidores, o BDE cria arquivo de nome único para seu arquivo temporário. Portanto, é seguro para múltiplos programas de Delphi executando na mesma máquina, ao mesmo tempo, para um mesmo usuário, para o mesmo diretório privado com tanto que o programa não crie arquivos com nomes fixos num diretório privado.

function GetExeName: string;
{ Retorna o nome do arquivo .EXE
sem o Path e a extensão }
var
ExtPos : Integer;
Name, Ext : String;
begin
Name := ExtractFileName(Application.Exename);
Ext := ExtractFileExt(Application.ExeName);
{Procura onde a extensão começa no nome}
ExtPos := Pos(Ext, Name);
{ Extrai o nome sem a extensão. }
if ExtPos > 0 then
Name := Copy(Name, 1, ExtPos-1);
Result := Name;
end; { GetExeName. }
  Figura 3: Uma função para retornar o nome do arquivo EXE
  Se múltiplos usuários executarem o mesmo programa numa rede, e se o BDE precisar criar arquivos temporários enquanto o programa executa, você precisará nomear um diretório privado separado para cada usuário.
  Quando você inicia um programa de banco de dados Delphi, isso abre a sessão default do BDE e configura o diretório privado para o diretório startup, o qual será identificado no campo Iniciar do ícone do programa no Windows desktop.
  Se nenhum for especificado, o diretório startup será aquele que contém o arquivo .EXE. Embora, o BDE não crie arquivo de lock no diretório privado, até que o BDE necessite do diretório privado para criar um arquivo temporário, ou você configura a path para o diretório privado de dentro do seu programa nomeando uma path para a propriedade Session. PrivateDir.
  Por que o diretório privado não está travado quando o programa inicia, sendo possível 2 usuários diferentes iniciarem o mesmo programa e compartilhar o mesmo diretório privado. Embora, o BDE necessite criar um arquivo temporário, isso travará o diretório privado para aquele usuário. Se outra cópia do BDE precisar criar um arquivo temporário, aquele usuário receberá uma exceção de aviso "Directory is busy".
  Isso é bom; os programas Client/Server que não fazem junções heterogêneas, não tendo que se preocupar sobre diretório privado, por que o BDE não terá que criar qualquer arquivo temporário.
  Mas, se você estiver executando um programa que use uma tabela Paradox e muitos usuários compartilhando de um única cópia do programa no drive de rede compartilhado, você vai ter problemas . Se cada usuário estiver executando a mesma cópia do .EXE , então cada usuário terá o mesmo diretório privado - a menos que você especifique o diretório startup para cada usuário ou mude o diretório privado no seu código assim que o programa iniciar.
  A melhor solução para esse problema é ter cada programa Delphi configurado no diretório privado para um diretório único quando iniciado. Uma maneira para fazer isso é criar um subdiretório com o mesmo nome do arquivo .EXE, daí coloque isso no seu drive local.
  A função mostrada na figura 3 volta o nome do arquivo .EXE com o path e extensão removida . Figura 4 mostra um procedimento que cria um diretório privado.
  Usando essas rotinas, você pode configurar o diretório privado de dentro do seu programa:
SetPrivateDir(c:\bdepriv\’+GetExeName);
  Essa instrução cria um diretório como um subdiretório no diretório C:\BDEPRIV, mantendo todos os diretórios de preferência em uma localização ao longo do diretório raiz no seu drive local.
  Alternadamente , você pode criar diretórios privados abaixo do diretório de cada usuário na rede. Embora a performance seja melhor se o diretório privado estiver num HD local, a rede é uma escolha melhor se alguns usuários tem o espaço do HD limitado.
  Por que há sempre muitas exceções, é uma boa idéia fornecer uma maneira para o path do diretório privado default para ser levado em conta.

Você pode fazer isso com um arquivo .INI, no Registry, ou um comando de parâmetro de linha opcional para seu programa. Usando uma dessas técnicas fica fácil manipular um caso excepcional em, que um usuário precisa de um diretório privado num lugar não padronizado.

procedure SetPrivateDir(DirPath: String);
{ Cria um diretório específico se não existir
e faz dele um diretório privado }
begin
ForceDirectories(DirPath);
if DirectoryExists(DirPath) then
Session.PrivateDir := DirPath
else
raise Exception.Create(‘O diretório privado ‘+ DirPath + ‘ não pode ser criado’);
end; { SetPrivateDir }
  Figura 4: Use a procedure SetPrivateDir para criar um diretório privado.

  Conclusão

  Se seu programa Delphi usar o BDE, você deve configurá-lo corretamente , para um diretório privado único para cada usuário e para cada programa. Isso permite multiusuários em segurança e operações de multitarefas.

Configurando o BDE corretamente permitirá múltiplos programas para compartilhar seguramente os dados na rede ou drives locais.