Programa
SQL Server |
Grupo Galápagos | |
Edvaldo Arruda
Pereira
Flávia Futiwaki Ivan Fontes Garcia |
Nº USP: 0449925
Nº USP: 1008790 Nº USP: 1017588 |
1. UDF Cover Sheet:
Nro. |
|
|
|
|
|
|
Requisitos | 05/11/1999 | 05/11/1999 |
|
|
|
Descrição de Projeto | 05/11/1999 | 05/11/1999 |
|
|
|
Interface Externas | 14/11/1999 | 16/11/1999 |
|
|
|
Lista de Capacidades Funcionais | 05/11/1999 | 05/11/1999 |
|
|
|
Código | 14/11/1999 | 16/11/1999 |
|
|
|
Plano de Testes | 10/11/1999 | 10/11/1999 |
|
|
|
Resultado dos Testes | 14/11/1999 | 16/11/1999 |
|
|
|
Procedimento para a Compilação | 08/11/1999 | 08/11/1999 |
|
|
|
Relatório de Problemas | 14/11/1999 | 15/11/1999 |
|
|
|
Notas | 14/11/1999 | 15/11/1999 |
|
|
|
Revisores |
1,2. Requisitos e Descrição do Projeto
Como qualquer aplicativo cliente-servidor, o programa SQL Server é dividido em dois módulos: o do cliente, e o do servidor. A tarefa do cliente, se resume em ler comandos SQL e enviar para o servidor que, por sua vez, executa os comandos sobre um banco de dados.
3.1. Cliente
telnet <host> <port>
onde:
host é o endereço da máquina
onde o servidor está rodando.
port é o número da porta
que oferece o serviço.
O número da porta é impresso no dispositivo padrão de saída, no momento em que se executa o servidor.
A sintaxe dos comandos SQL é
descrita a seguir:
Observações:
server
Para rodar o server em background use:
server&
Ao rodar o server é impresso o número da porta usada pelo serviço. Esse número deve ser usado pelo cliente para estabelecer a conexão com o servidor.
O Server funciona do seguinte modo: primeiro é aberto um socket associado a uma porta de comunicação; feito isso o Server entra num loop que consiste em esperar por um pedido de comunicação do cliente, quando isso acontece é criada uma thread para atender o cliente.
Início
4.1. Resumo
1 - Rodar o servidor: Para rodar o programa servidor, é necessário executar o arquivo server em uma máquina rodando Solaris. Ao ser executado, o server imprime o número da porta que será usada pelo cliente para se comunicar com o servidor.
2 - Executar o programa cliente: Para rodar um programa cliente, basta executar um telnet passando como parâmetros o endereço da máquina onde o servidor está rodando, e o número da porta para a comunicação.
3 - Executar os comandos SQL: Ao rodar, o telnet abre um prompt (SQL > ) que lê comandos SQL e imprime sua resposta.
4 - Finalizar o programa cliente: Para
finalizar o prompt basta digitar o comando QUIT.
Para esperar por uma conexão deve
ser usada a principal função desse módulo, ServerSocket_Accept,
que retorna um ponteiro para uma estrutura do tipo Socket.
Para abrir uma conexão, em um host e porta específicos, deve ser usada a função Socket_New, passando como parâmetros o nome do host e o número da porta. Essa função irá alocar espaço de memória para uma estrutura do tipo Socket e retornar o seu endereço através de um ponteiro.
Para escrever através de um stream socket deve ser usada a função Socket_PrintLine ou Socket_Print, e para ler a partir de um stream socket deve ser usada a função Socket_ReadToken. A duas primeiras funções escrevem uma linha de texto para o cliente, com ou sem newline, enquanto a útima lê um token do cliente.
Essas últimas funções
são muito usadas pelos
Interpreters que leêm e executam
os comandos enviados pelo cliente, através do socket.
A função que é chamada pela thr_create é a Interpreter_Main, que implementa um loop que lê o primeiro token de cada comando SQL, como por exemplo CREATE (comando CREATE TABLE), DROP (comando DROP TABLE), INSERT (comando INSERT INTO), DELETE (comando DELETE FROM), e SELECT (comando SELECT FROM). O loop termina se for lido o token QUIT correspondente ao comando para terminar a conexão.
De acordo com o primeiro token do comando
SQL são chamadas as respectivas funções para terminar
de executar o parsing e executar os comandos SQL, como:
Interpreter_CreateTable, Interpreter_DropTable,
Interpreter_InsertInto,
Interpreter_DeleteFrom,
e Interpreter_SelectFrom.
Cria uma tabela de nome nome_tabela, desde que já não exista uma tabela com este nome.
Remove uma tabela de nome nome_tabela, caso já exista uma tabela com este nome.
4.5.3. Insert Into
Insere em uma tabela de nome nome_tabela os valores valor_1, valor_2, ..., caso já exista uma tabela com este nome. Verifica se a sequência e o nomes das colunas são os mesmos da tabela, e se os valores são em número correspondente ao das colunas.
Verifica se existe a tabela e se a coluna pertence à tabela; selecionando então as linhas onde a condição é verdadeira, as quais serão enviadas ao cliente.
Verifica se existe a tabela e se a coluna pertence à tabela; selecionando então as linhas onde a condição é verdadeira, as quais serão removidas da tabela.
4.6. Banco de Dados
O arquivo zipado é:
Os testes foram realizados de acordo com os tipos de comandos SQL, tentando achar bugs na execução dos mesmos. Foram testados todos os comandos SQL implementados com sua sintaxe correta para avaliar se foram implementados corretamente. Também foram testados varios comandos incorretos para verificar o tratamento de erros pelo Interpreter para cada comando implementado.
SQL > createTABLE faltando.
Sintaxe: CREATE TABLE nome_tabela (campo1 tipo, campo2
tipo, campoN tipo)
SQL > create table teste (nome string, idade string)
> Tabela [TESTE] criada!
SQL > insert into teste2 (nome, idade) values (vinucius,28)
A tabela [TESTE2] nao existe!
SQL > create table table (teste string)
> Tabela [TABLE] criada!
SQL > drop table table
> Tabela [TABLE] removida!
SQL > insert into teste (nome, idade, noUSP) values (lupercio, 22, 1180320)
O numero de colunas lidas deve ser igual ao numero de colunas da tabela:
2
SQL > insert into teste (nome, noUSP) values (edvaldo, 34)
Os nomes das colunas devem ser iguais aos nomes das colunas da tabela:
NOME IDADE
SQL > insert into teste (nome, idade) values (flavia, 24)
> Linha inserida!
SQL > insert into teste (nome, idade) values (ivan, 25)
> Linha inserida!
SQL > select from teste where nome=ivan
IVAN
25
SQL > insert into teste (nome, idade) values (sandra,24)
> Linha inserida!
SQL > delete from teste where idade=60
Não foi encontrada nenhuma linha na tabela com essa condicao.
SQL > delete from teste where nome = ivan
>Linha removida!
8. Procedimentos para Compilação
Para compilar o programa servidor é preciso primeiramente gerar os objetos de cada módulo. Com todos os fontes no mesmo diretorio:
oca% gcc -c *.c
e depois linká-los para gerar o server:
oca% gcc *.o -o server -lthread -lsocket -lnsl
Foram encontrados os seguintes problemas durante a construção do interpretador de servidor SQL:
- manipulação das operações lógicas nos comandos SELECT e DELETE;
- chatice de ficar encontrando os erros na leitura dos comandos SQL.
- gerenciamento das várias versões do Interpreter que cada integrante do grupo desenvolvia em paralelo, com problemas na hora de juntar as partes.