Skip to content

Commit ea756f9

Browse files
Execução passa a lidar com múltiplas sentenças.
1 parent 3e80705 commit ea756f9

File tree

5 files changed

+78
-42
lines changed

5 files changed

+78
-42
lines changed

execucao.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,17 @@ lincones.clienteSQLite.abrir().then(() => {
1212

1313
interfaceLeitura.prompt();
1414
interfaceLeitura.on('line', (linha: string) => {
15-
lincones.executar(null, linha).then(resultado => {
16-
if (resultado.linhasRetornadas.length > 0) {
17-
console.table(resultado.linhasRetornadas);
18-
}
15+
lincones.executar(null, linha).then(resultados => {
16+
for (const resultado of resultados) {
17+
if (resultado.linhasRetornadas.length > 0) {
18+
console.table(resultado.linhasRetornadas);
19+
}
1920

20-
console.log(resultado.mensagemExecucao);
21+
console.log(resultado.mensagemExecucao);
2122

22-
if (resultado.ultimoId) {
23-
console.log(`ID retornado pela operação: ${resultado.ultimoId}`);
23+
if (resultado.ultimoId) {
24+
console.log(`ID retornado pela operação: ${resultado.ultimoId}`);
25+
}
2426
}
2527

2628
return Promise.resolve();

fontes/infraestrutura/cliente-sqlite.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class ClienteSQLite {
2424
}
2525
}
2626

27-
public async abrir() {
27+
async abrir() {
2828
const database = await sqlite.open({
2929
filename: this.origemDados,
3030
driver: sqlite3.Database
@@ -33,7 +33,7 @@ export class ClienteSQLite {
3333
console.log('Conectado ao banco de dados SQLite.');
3434
}
3535

36-
public async executarComando(comando: string, parametros: any[] = []): Promise<any> {
36+
async executarComando(comando: string, parametros: any[] = []): Promise<any> {
3737
if (comando.startsWith('SELECT')) {
3838
return await this.executarComandoSelecao(comando, parametros);
3939
}

fontes/lincones-sqlite.ts

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { AvaliadorSintatico } from "./comum/fontes/avaliador-sintatico";
33
import { Lexador } from "./comum/fontes/lexador";
44
import { ClienteSQLite } from "./infraestrutura/cliente-sqlite";
55
import { RetornoComando } from "./infraestrutura";
6+
import { Comando } from "./comum/fontes";
67

78
export class LinconesSQLite {
89
lexador: Lexador;
@@ -17,25 +18,43 @@ export class LinconesSQLite {
1718
this.clienteSQLite = new ClienteSQLite();
1819
}
1920

21+
async executarComando(comando: Comando) {
22+
return await this.executarInterno([comando], comando.parametros);
23+
}
24+
2025
/**
2126
* Traduz um comando de LinConEs para SQL e executa no banco de dados SQLite.
2227
* @param _ Normalmente a instância do interpretador Delégua.
23-
* @param comando O comando em LinConEs a ser traduzido e executado.
28+
* @param sentencaLincones A sentença em LinConEs a ser traduzida e executada.
2429
* @param parametros Parâmetros adicionais para o comando, se necessário.
2530
* @returns
2631
*/
27-
async executar(_: any, comando: string, parametros: any[] = []): Promise<RetornoComando> {
28-
const resultadoLexador = this.lexador.mapear([comando]);
32+
async executar(_: any, sentencaLincones: string, parametros: any[] = []): Promise<RetornoComando[]> {
33+
const resultadoLexador = this.lexador.mapear([sentencaLincones]);
2934
const resultadoAvaliacaoSintatica = this.avaliadorSintatico.analisar(resultadoLexador);
30-
const resultadoTraducao = this.tradutor.traduzir(resultadoAvaliacaoSintatica.comandos);
3135

32-
if (resultadoAvaliacaoSintatica.comandos.length <= 0) {
33-
return new RetornoComando(null);
36+
if (resultadoAvaliacaoSintatica.erros.length > 0) {
37+
throw new Error(`Erros encontrados na avaliação de comandos: ${resultadoAvaliacaoSintatica.erros.reduce((mensagens, erro) => mensagens += erro.message + '; ', '')}.`);
38+
}
39+
40+
return await this.executarInterno(resultadoAvaliacaoSintatica.comandos, parametros);
41+
}
42+
43+
private async executarInterno(comandos: Comando[], parametros: any[]): Promise<RetornoComando[]> {
44+
if (comandos.length <= 0) {
45+
return [];
3446
}
3547

36-
const resultadoExecucao = await this.clienteSQLite.executarComando(resultadoTraducao, parametros);
37-
const retorno = new RetornoComando(resultadoExecucao);
48+
const retornosComandos: RetornoComando[] = [];
49+
50+
for (const comando of comandos) {
51+
const resultadoTraducao = this.tradutor.traduzir([comando]);
52+
// TODO: Parâmetros
53+
const resultadoExecucao = await this.clienteSQLite.executarComando(resultadoTraducao, parametros);
54+
const retorno = new RetornoComando(resultadoExecucao);
55+
retornosComandos.push(retorno)
56+
}
3857

39-
return retorno;
58+
return retornosComandos;
4059
}
41-
}
60+
}

testes/lincones-sqlite.test.ts

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,50 @@ import { LinconesSQLite } from '../fontes/lincones-sqlite';
33
describe('LinconesSqlite', () => {
44
let linconesSqlite: LinconesSQLite;
55

6-
beforeEach(() => {
6+
beforeAll(async () => {
77
linconesSqlite = new LinconesSQLite();
8+
const comandoCriarTabela = 'CRIAR TABELA SE NÃO EXISTIR clientes(ID INTEIRO NAO NULO CHAVE PRIMARIA AUTO INCREMENTO, NOME TEXTO(100) NAO NULO, IDADE INTEIRO NAO NULO, EMAIL TEXTO(255) NAO NULO, ATIVO LOGICO NAO NULO);';
9+
10+
try {
11+
await linconesSqlite.clienteSQLite.abrir();
12+
await linconesSqlite.executar(null, comandoCriarTabela);
13+
} catch (error) {
14+
console.error('Erro no pré-teste:', error);
15+
throw error;
16+
}
817
});
918

10-
it('Execução com parâmetros', async () => {
11-
const comandoCriarTabela = 'CRIAR TABELA SE NÃO EXISTIR clientes(ID INTEIRO NAO NULO CHAVE PRIMARIA AUTO INCREMENTO, NOME TEXTO(100) NAO NULO, IDADE INTEIRO NAO NULO, EMAIL TEXTO(255) NAO NULO, ATIVO LOGICO NAO NULO);';
19+
it.skip('Execução com parâmetros', async () => {
1220
const comandoInserir = 'INSERIR EM clientes (NOME, IDADE, EMAIL, ATIVO) VALORES (?, ?, ?, ?);';
1321
const comandoAtualizar = 'ATUALIZAR clientes DEFINIR NOME = ?, IDADE = ?, EMAIL = ?, ATIVO = ? ONDE ID = ?;';
1422
const comandoExcluir = 'EXCLUIR DE clientes ONDE ID = ?;';
1523
const comandoSelecionar = 'SELECIONAR * DE clientes;';
1624

17-
await linconesSqlite.clienteSQLite.abrir();
18-
19-
const retornoCriarTabela = await linconesSqlite.executar(null, comandoCriarTabela);
20-
expect(retornoCriarTabela).toBeTruthy();
21-
22-
const retornoInserir = await linconesSqlite.executar(null, comandoInserir, ['Pernalonga', 18, 'pernalonga@warnerbros.com', true]);
23-
expect(retornoInserir).toBeTruthy();
24-
expect(retornoInserir.ultimoId).toBeGreaterThan(0);
25-
26-
const retornoAtualizar = await linconesSqlite.executar(null, comandoAtualizar, ['Pernalonga Atualizado', 19, 'pernalonga2@warnerbros.com', false, retornoInserir.ultimoId]);
27-
expect(retornoAtualizar).toBeTruthy();
28-
expect(retornoAtualizar.linhasAfetadas).toBeGreaterThan(0);
29-
30-
const retornoExcluir = await linconesSqlite.executar(null, comandoExcluir, [retornoInserir.ultimoId]);
31-
expect(retornoExcluir).toBeTruthy();
32-
expect(retornoExcluir.linhasAfetadas).toBeGreaterThan(0);
33-
34-
const retornoSelecionar = await linconesSqlite.executar(null, comandoSelecionar);
35-
expect(retornoSelecionar).toBeTruthy();
25+
try {
26+
const retornosInserir = await linconesSqlite.executar(null, comandoInserir, ['Pernalonga', 18, 'pernalonga@warnerbros.com', true]);
27+
expect(retornosInserir).toBeTruthy();
28+
expect(retornosInserir.length).toBeGreaterThan(0);
29+
const retornoInserir = retornosInserir[0];
30+
expect(retornoInserir.ultimoId).toBeGreaterThan(0);
31+
32+
const retornosAtualizar = await linconesSqlite.executar(null, comandoAtualizar, ['Pernalonga Atualizado', 19, 'pernalonga2@warnerbros.com', false, retornoInserir.ultimoId]);
33+
expect(retornosAtualizar).toBeTruthy();
34+
expect(retornosAtualizar.length).toBeGreaterThan(0);
35+
const retornoAtualizar = retornosAtualizar[0];
36+
expect(retornoAtualizar.linhasAfetadas).toBeGreaterThan(0);
37+
38+
const retornosExcluir = await linconesSqlite.executar(null, comandoExcluir, [retornoInserir.ultimoId]);
39+
expect(retornosExcluir).toBeTruthy();
40+
expect(retornosExcluir.length).toBeGreaterThan(0);
41+
const retornoExcluir = retornosExcluir[0];
42+
expect(retornoExcluir.linhasAfetadas).toBeGreaterThan(0);
43+
44+
const retornosSelecionar = await linconesSqlite.executar(null, comandoSelecionar);
45+
expect(retornosSelecionar).toBeTruthy();
46+
expect(retornosSelecionar.length).toBeGreaterThan(0);
47+
} catch (error) {
48+
console.error('Erro de execução em teste:', error);
49+
throw error;
50+
}
3651
});
3752
});

0 commit comments

Comments
 (0)