• Nenhum resultado encontrado

Criação de uma base de dados com PHP/METABASE

6 POSSÍVEIS FUTURAS IMPLEMENTAÇÕES DO PROJECTO AMIS

6.6 METABASE PHP P ACKAGE – INSTALAÇÃO , ACESSO E GESTÃO INDEPENDENTE

6.6.2.2 Criação de uma base de dados com PHP/METABASE

É descrito, nesta secção, a implementação de esquemas de bases de dados, usando o METABASE, a criação e instalação da base de dados.

6.6.2.2.1 Esquema da base de dados

Quando se pretende criar uma base de dados, o primeiro passo a tomar é a esquematização da mesma, que vai suportar toda a informação que é necessária para a aplicação a ser desenvolvida.

O METABASE simplifica este passo, porque permite que programadores implementem estes esquemas de uma forma independente da base de dados. Apenas é necessário escrever uma file de texto em formato genérico XML que descreve as tabelas e campos que a base de dados terá. Vamos supor que pretendemos criar uma base de dados chamada teste (Fig. 39):

te xt USERS USER_ID USER_NAME PASSWORD REMAINDER NAME EMAIL te xt GROUPS GROUP_ID NAME OWNER_ID DESCRIPTION te xt GROUP_USERS GROUP_ID USER_ID

Fig. 39 - Esquema UML da base de dados teste.

Será agora apresentado um exemplo de descrição de um esquema da base de dados: Todas as files que descrevem esquemas em XML do METABASE terão, obrigatoriamente, de ter este cabeçalho:

<?xml version=”1.0” encoding=”ISO-8859-1”?>

<database>

As propriedades gerais da base de dados são inseridas como marcas. A propriedade/marca name é necessária e, a marca create, embora não seja necessária, pretendemos que o

METABASE crie a base de dados por nós, quando instalada pela primeira vez. Logo, esta propriedade tem de ser definida como 1.

<name>teste</name> <create>1</create>

Para criar uma tabela, é necessária a inserção da marca table e name, ou seja, criação da tabela

e nome, respectivamente.

<table>

<name>Users</name>

As definições das tabelas podem ter duas secções, além das suas propriedades: declaration

e initialization. A marca declaration é necessária e tem de incluir as declarações de todas as tabelas, campos provenientes dessas tabelas e índices. A marca initialization,

embora não seja necessária, é usada para inserir valores iniciais nas tabelas que são criadas. A declaração da tabela, tem de ter, pelo menos, um campo (<field>). Na definição do

campo, i.e., da marca <field>, é obrigatória a introdução das propriedades nome do campo, <name>, e tipo, <type>. Os tipos mais usados nos campos são o integer e text, embora ,o

tipo timestamp também seja muito utilizado.

<declaration> <field><name>user_id</name><type>integer</type> <default>0</default><notnull>1</notnull></field> <field><name>user_name</name><type>text</type></field> <field><name>password</name><type>text</type></field> <field><name>reminder</name><type>text</type></field> <field><name>name</name><type>text</type></field> <field><name>email</name><type>text</type></field>

O uso de índices, embora facultativo, é muitas vezes utilizado para minimizar tempos de acesso à base de dados, sendo na generalidade criados em campos que pertencem às clausulas de procura de queries mais utilizados onde a aplicação corre. Obviamente, os campos em que os índices devem ser adicionados dependem do propósito da aplicação em desenvolvimento. De qualquer forma, existem campos que, geralmente, são declarados como chaves primárias ou estrangeiras numa tabela. O METABASE não suporta a declaração de chaves, pela razão de que alguns SGBDs não o suportam. As razões são diversas, sendo a principal a manutenção de uma aplicação robusta e modularidade. No universo do desenvolvimento de software, opta-se cada vez mais por garantir robustez e fiabilidade às aplicações, dando-se cada vez mais importância à portabilidade e standardização, em detrimento da velocidade e processamento. No entanto, suporta a declaração de índices únicos em campos individuais, que na prática podem funcionar como chaves primárias desses campos.

De notar, que campos onde seja criado um índice não pode ter entradas nulas (NULL). Po essa

razão, o parser em XML da descrição de esquemas do METABASE, força o campo a ser criado com a propriedade de não nulo (notnull). Requer, também, que a propriedade default

seja definida com um valor não nulo. No exemplo da base de dados deste será definida como no exemplo em baixo: <index> <name>users_id_index</name> <unique>1</unique> <field><name>user_id</name></field> </index>

Sequências de objectos são frequentemente usadas para gerar valores inteiros únicos, sempre que é necessário inserir uma nova entrada numa tabela com um novo número identificador (único). Devido a esta necessidade, muitos programadores declaram campos com a propriedade auto_increment, dando o mesmo efeito a identificadores únicos. O

METABASE não suporta esta propriedade, porque nem todos os SGBDs a suportam. Neste caso, recomenda-se o uso de sequências (sequence) em vez de auto_increment. Uma das

vantagens do uso de sequências consiste no facto da reutilização dos valores das sequências para inserir noutras tabelas que o requeiram.

As sequências são esquemas de objectos standalone em bases de dados. No entanto, devemos especificar, no gestor da base de dados, qual a sequência de valores que são pretendidos usar. Isto ajuda, na medida em que determina um valor inicial da sequência, se adicionarmos posteriormente a sequência à base de dados, e então, teremos adicionado o campo da tabela com que deve estar sincronizada:

</declaration> </table> <sequence> <name>user_id</name> <start>1</start> <on><table>users</table><field>user_id</field></on> </sequence>

Outras tabelas e sequências podem ser declaradas, tantas quantas forem precisas:

<table> <name>groups</name> <declaration> <field><name>name</name><type>text</type></field> <field><name>owner_id</name><type>text</type></field> <field><name>description</name><type>text</type></field> </declaration> </table> <table> <name>group_users</name> <declaration> <field><name>group_id</name><type>text</type></field> <field><name>user_id</name><type>text</type></field> </declaration> </table>

Os esquemas XML do METABASE têm de ser finalizados com a marca coincidente com a marca inicial:

</database>

6.6.2.2.2 Instalação da base de dados com o METABASE

Uma vez definida a file com o esquema da base de dados, procedemos à instalação do servidor SGBD, através da classe de gestão do METABSE. Como exemplo, vamos supor que gravamos o esquema XML, apresentado anteriormente, numa file designada por

MyDatabase.schema.

Para a instalação da base de dados, pela primeira vez, por exemplo, MySQL, necessitamos apenas de criar um objecto da classe de gestão, que invoca o método UpdateDatabase

function, e usar um interpretador standalone em PHP para executar um script, similar com o apresentado em baixo:

<?php

$schema_file="MyDatabase.schema";

A variável $schema_file é a definição do nome do esquema XML da base de dados.

$variables=array();

Na necessidade de definir e instalar valores de variáveis temporais (tipo de SGBD, username, password, etc.), definimo-las em $variables. Na declaração em cima, não declaramos variáveis, vamos então defini-las:

$arguments=array( "Type"=>"mysql",

"User"=>"mysql_user_name",

"Password"=>"mysql_user_password" );

Para a configuração da ligação ao servidor DB, são necessários alguns argumentos específicos dos SGBDs que, por sua vez, são passados para o método SetupDatabase da classe de

$manager=new metabase_manager_class;

No método UpdateDatabase da classe de gestão, passamos como parâmetro o nome da file

do esquema XML, os argumentos de configuração da base de dados e o array de variáveis do esquema. O segundo parâmetro é de especial importância, pois define o nome da file, do esquema a ser instalado, em que será copiado, após uma instalação com sucesso. A file copiada, será utilizada posteriormente, sempre que quisermos actualizar o esquema XML. Esta file não deverá ser apagada para que o gestor determinar o esquema instalado.

$SUCCESS=$MANAGER->UPDATEDATABASE( $schema_file,

$schema_file.".before", &$arguments,

&$variables);

Se a instalação falhar, poderemos visualizar o error retornado:

if(!$success)

echo "Error: ".$manager->error."\n";

Além disso, mesmo no caso da instalação ter sido completada com sucesso, devemos sempre visualizar os warnings resultados:

if(count($manager->warnings)>0)

echo "WARNING:\n",implode($manager->warnings,"!\n"),"\n"; ?>

Documentos relacionados