Ficheiros de configuração das tabelas da base 

Introdução

A criação de uma tabela está feita, no software, pelo intermédio de um utilitário nomeado valfil. Este utilitário está chamado diretamente pelo amnbiente de desenvolvimeto integrado a SAGE, nos diferentes casos : criação de uma tabela depois o editor das tabelas, modificação de uma tabela depois a mesma função, extração ou integração de dados, integração de um patch conduzido à alteração de estrutura de uma tabela da base.

A base, uma tabela está definida por ficheiros físicos se encontram no directório FIL do dossier, e por uma tabela da base de dados. Os ficheiros físicos são os seguintes :

  • um ficheiro XXX.srf, que contém a descriação da estrutura do ficheiro (sob um formato "ascii" descrito a seguir).
  • um ficheiro XXX.fde, que contém a descrição da estrutura do ficheiro (sob forma compilada utilizável diretamente pelo motor sage).

Quando a tabela não foi guardada na base, mas foi descarregada sob forma de um ficheiro transportável, encontrar-se-á os seus dados sob a forma de dois ou três ficheiros suplementares :

  • um ficheiro XXX.dat, que contém os dados sob a forma de um ficheiro constituido de registos em comprimento fixo.
  • um ficheiro XXX.seq, que contem o próximo número de sequência associada à tabela. Esta informação é importante na medida onde cada tabela está associada a um número de sequência que permite criar os números unicos (isso corresponde à função sage uniqid([abv]), onde abv é abreviação da tabela correspondente)
  • um ficheiro XXX.blb, que contém os dados longos (blobs e clobs) se existem na tabela

As informações contidas nos diferentes ficheiros permitem a criação de uma tabela com as opções "a mínima" que são as seguintes :

  • o dimensionamento da tabela (tamanho previsto, se for caso disso - para oracle - sob a forma de segmento inicial e de tamanho de extents) está definido no ficheiro de extenção ".srf" (o cálculo sendo feito a partir do número previsto de linhas na tabela, definido pelas variáveis e fórmulas de dimensionamento).
  • O dimensionamento dos indices está definido por pró-rata a partir do tamanho da tabela (multiplica-se o tamanho do segmento inicial por relação entre o comprimento de chave e o seu comprimento da linha de tabela, depois impõe-se o "next extent" o mesmo tamanho que inicial).
  • os grupos de ficheiros (sob SQL server) são aqueles definidos no ficheiro .adxodbc se existir. Se o ficheiro não existe, toma-se os grupos de ficheiros DOSSIER_DAT e DOSSIER_IDX se existem, DOSSIER sendo o nome do dossier. Por defeito, toma-se o grupo por defeito definido para a base.
  • as "tablespaces" de armazenagem (para oracle) são aqueles definidos no ficheiro ".adxora" se existe. Se o ficheiro não existe, toma-se a tablespace associado por defeito a o utilizador DOSSIER para os dados, a tablespace DOSSIER_IDX para os índices.

Pode ser interessante definir as informações complementares utilizadas no momento da criação da tabela e a cada uma das atualizações, para modificar estas regras de dimensionamento ou de localização, em tendo em conta as particularidades das diferentes bases de dados e assim obter melhores performances. Mas isto supões guardar estes elemetos fora da base, afim que o utilitário valfil possa aplicar a cada vez que uma validação ou uma revalidação da tabela será feita. É porque é possível de criar um ficheiro de extensão "cfg" no directório FIL. Este ficheiro permite registar um conjunto de diretivas opcionais que complemtarão a ordem SQL Create table ou Create Index que será realizado por valfil. Tudo como os ficheiros de extensão .srf, está em formato "ascii" (descrito a seguir).

O conteúdo deste ficheiro de configuração aparece em baixo de separador de definição dos índices, em gestão das tabelas. A seguinte deste documeto descreve a sintaxe de registo deste ficheiro de configuração.

Sintaxe de registo

Este ficheiro está composto de linhas de texto formando as secções. Cada secção começa por uma etiqueta préfixada pelo caracter $, seguido de um código indicando para a base de dados está feita nesta secção (é seja ORACLE, seja MSSQL), seguido de um caracter de sublinhamento e do nome da tabela ou de um índice.

Encontramos em seguida cláusulas enquadradas pelo caracter {" (chaveta aberta seguida de duplas aspas) e "} (chaveta que fecha precedida de duplas aspas). Estas cláusulas serão passadas tais que na base de dados no momento da criação ou a modificação da tabela ou do índice. Se existem vários, elas são passadas umas após as outras, separadas por um fim de linha. O número de caracteres de uma cláusula está limitada a 256.

Encontramos em seguida a palavra chave End, que termina uma secção.

Co,mentários podem ser inseridos no ficheiro de configuração, sob a forma de textos livres prefixados pelo caracter # (emitido) Um comentário não pode se encontrar que em início de linha.

Desde logo que uma seção não vazia (com pelo menos uma cláusula) existe, todas as regras de dimensionamento ou de guardar por defeitro do elemento (tabela ou índice) descrito ao proveito das cláusulas passadas.

Uma secção correspondente a um elemento inexistente, ou relativo a uma base de dados que não é a base de dados corrente, está puramnte e simplesmente ignorado.

Exemplos de sintaxes oracle

As cláusulas de guardar podem ser, por exemplo :

Tablespace imposta

{" Tablespace ts1 "}

Domensionamento dos "extents" da tabela

{" Storage (Initial 100K Next 50K Maxextents 10 Pctincrease 20) "}

Partindo de uma tabela sobre várias tablespaces segundo o valor de um campo.

{" partition by range (DHIDAT_0) (partition p1 values less then ('01-APR-1999') tablespace ts1, "}
{" partition p2 values less then ('01-APR-2001') tablespace ts2, "}
{" partition p3 values less then (maxvalue) tablespace ts4) "}

Exemplos de sintaxes SQL Server

Nas versões de motor entregues antes a versão 6.4, a única cláusula de guardar possível é

Volume imposto

{" On volume1 "}

A partir da versão 6.4 está igualmente possível de definir que o primeiro índice (e ele apenas) está "clustered", quer dizer que os dados da tabela cujo fisicamente limitada na ordem desta chave. Isto pode ser utilizado com fins de otimização, o principio sendo então de acrescentar a secção seguinte (XXXX sendo o nome de index em questão) :

$CLUSTERED
{ "XXXX" }
End

É importante, para que esta diretiva seja tomada em conta, de revalidar a tabela em modo forçado após ter modificado o ficheiro de configuração.

Atenção : esta sintaxe para definir o índice "clustered" é temporária. Com efeito, na próxima versão maior, a definiçao dos índices deste tipo será definido de maneira mais natural no dicionário

Exemplo de ficheiro

Encontrar-se-á a seguir um exemplo de ficheiro de configuração. Notar-se-á aqui uma parte somente das diretivas serão utilizadas (segundo a base utilizada, depois que aquelas se aplicam à base de dados realmente utilizada serão colocados em obra).

É de notar que o fornecimento standard do software não comporta nenhum ficheiro de configuração, e que uma atualização respeita os ficheiros de configuração existentes. Com efeito, os ficheiros de configuração são considerados como elementos de implementação e são forçosamente ligados a uma instalação dada e não a um standard qualquer.

 

#---  Regra por Oracle : Ficheiro das faturas
$ORACLE_SINVOICE
#--- Impõe-se um tablespace diferente
{" Tablespace DEMO_DAT2 "}
#--- Regras de dimensionamento obrigatórias desde logo que imposto qualquer coisa
{" Storage (Initial 100M  Next 50M Pctincrease 20) "}
End

#---  Regra para Sql Server
$MSSQL_SINVOICE
{" On DEMO_DAT2 "}
End

#--- Primerio índice sob Oracle (Sem regra para os outros índices)
$ORACLE_SIH0
{" Tablespace DEMO_IDX2 "}
{" Storage (Initial 5M Next 2M Pctincrease 30) "}
End

Anexo : Os ficheiros ascii utilizados com o motor Sage

O motor SAGE utiliza os ficheiros ascii de tipo "Unix", quer dizer que o separador de linha é "Line Feed" (caracter de código 10), e não por "Carriage Return", "Line Feed" (caracteres 13, depois 10) como para os ficheiros textos Windows™. É então fundamental de não editar tais textos sobre notepad (ou do menos de não os reenscrever com notepad), falta que o motor sage será em pente de os reexplorar. Por outro lado, sob UNIX, o editor vi está utilizável. Os editor sage geram tudo de facto correctamete estes ficheiros.

É de então notar que o formato utilizado por ficheiros está na realidade o formato UTF8 (que está um formato permitindo de tratar ps caracteres UNICODE - chinês por exempo - de maneira totalmente transparente. Trata-se então em realidade de uma codificação sobre 1 a 4 bytes para um único carater. O formato UTF8 corresponde a ASCII para todos os carateres não acentuados, mas desde que o bit de peso o mais forte é 1, o caracter está codificado sobre mais de um byte. Isto significa que os caracteres acentuados franceses não são visualizados corretamente com os editores "clássicos" (ma os editores sage tratam correctamente esta transcodificação).

Anexo : As regras de dimensionamento por defeito das tabelas

Na ausência de ficheiro de configuração, o algoritmo de dimesionamento utilizado para talhar as tabelas oracle é o seguinte :

  • determina-se então o número de linhas susceptíveis de serem guardados na tabela. Este número de linhas foi calculado pelo meio das fórmulas de dimensionamento, elas mesmo calculadas a partir deelementos de dimensionamento. Este número de linhas está comparado com o número de linhas dadas na rubrica Número de fichas situadas no primeiro separador do dicionário das tabelas. É o máximo de dois números que foi retido
  • calcula-se em seguida de uma linha da tabela em número de bytes. Considera-se para este facto o tipo interno associado a cada um dos tipos de dados dos campos da tabela. Um campo de tipo literal toma 1 byte, um campo de tipo inteiro 2 bytes, um campo de tipo inteiro longo 4 separadores, um campo de tipo decimal 8 bytes. Os campos de tipo alfanuméricos e de comprimento máximo L tomando L + 1 byres, multiplicado por um coeficiente multiplicados que vale 1 se a base está em ASCII, e que vale o valor da variável de ambiente STUSIZE se a base é UNICODE (na ausência de valor, retoma-se 2). De referir que este tamanho pode ser obtido pela função Opção / Informações acessível em gestão das tabelas.
  • calcula-se de mesmo o comprimento (em bytes) de cada índice, em aplicando as mesmas regras de dimensionamento para os campos que o compõem.
  • calcula-se o tamanho global da tabela em multiplicando o número de linhas por tamanho de uma linha,e em aplicando um coeficiente para ter em conta do facto que o preenchimento máximo (este coeficiente vale 0,5 por defeito).
  • no caso da base de dados criados oracle, define-se o tamanho do segmento inicial tomando o tamanho da tabela se ela é inferior a 10 Mb. Senão, limita-se o segmento iincial a um valor dados para a variável de ambiente ADXEXTSIZE (exprimido em Kbytes) Este valor não pode em nenhum caso ser superior a 1,5 Gbytes