Parser SQL em java  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
anderson_lp789
JavaGuru

Membro desde: 19/06/2010 19:24:50
Mensagens: 206
Offline

gente estou a fazer um programa no qual o usuário pode escrever suas consultas no banco de dados, e eu preciso validar isso (sua sintaxe somente) tem algum parse que faz isso em java? alguém tem uma dica?
thiago.filadelfo
Virtual Machine Man
[Avatar]

Membro desde: 07/07/2007 00:32:26
Mensagens: 579
Localização: São Paulo
Offline

Olá

Acho que você usar expressao regular deve ficar interessante a validação
http://www.piazinho.com.br/

Ps. Algumas adaptações devem ser feita, mas em termos todos os conceitos são válidos


Espero ter ajudado
Flwsss

[Email] [MSN]
anderson_lp789
JavaGuru

Membro desde: 19/06/2010 19:24:50
Mensagens: 206
Offline

thiago.filadelfo wrote:Olá

Acho que você usar expressao regular deve ficar interessante a validação
http://www.piazinho.com.br/

Ps. Algumas adaptações devem ser feita, mas em termos todos os conceitos são válidos


Espero ter ajudado
Flwsss


bom desculpa pergunta, mas meu conhecimento de expressões regulares é bem baixo, como o uso de expressões regulares pode ser útil para o meu caso? compensa comprar este livro que vc me passou realmente?
thiago.filadelfo
Virtual Machine Man
[Avatar]

Membro desde: 07/07/2007 00:32:26
Mensagens: 579
Localização: São Paulo
Offline

Olá

Então não precisa comprar o livro, tem uma sessão de exemplos que explica sua funcionalidade.

Como a expressão regular pode fazer para te ajudar é validar "sintaxicamente".
Por exemplo:

REGEX: SELECT\s(\*|\w+)\sFROM\s(\w+);
O que validaria: SELECT * FROM tabela; ou SELECT nome FROM tabela

Caso você escreva SELEC * FROM tabela, ele acusa erro de sintaxe. Por dois motivos não terminou com ponto e virgula ( e escreveu SELEC ao invez de SELECT....
assim por diante...

No site que passei tem o livro, mas tem uma parte bastante vasta de exemplo, acho legal dar uma olhada.

ok!?

[Email] [MSN]
thiago.filadelfo
Virtual Machine Man
[Avatar]

Membro desde: 07/07/2007 00:32:26
Mensagens: 579
Localização: São Paulo
Offline

thiago.filadelfo wrote:Olá

Então não precisa comprar o livro, tem uma sessão de exemplos que explica sua funcionalidade.

Como a expressão regular pode fazer para te ajudar é validar "sintaxicamente".
Por exemplo:

REGEX: SELECT\s(\*|\w+)\sFROM\s(\w+);
O que validaria: SELECT * FROM tabela; ou SELECT nome FROM tabela;

Caso você escreva SELEC * FROM tabela, ele acusa erro de sintaxe. Por dois motivos não terminou com ponto e virgula ( e escreveu SELEC ao invez de SELECT....
assim por diante...

No site que passei tem o livro, mas tem uma parte bastante vasta de exemplo, acho legal dar uma olhada.

ok!?

[Email] [MSN]
anderson_lp789
JavaGuru

Membro desde: 19/06/2010 19:24:50
Mensagens: 206
Offline

humm estou compreendendo, parece ser mesmo interessante! no livro ele fala sobre o SQLite, quer dizer q ele implementa regex pra ele é isso?
thiago.filadelfo
Virtual Machine Man
[Avatar]

Membro desde: 07/07/2007 00:32:26
Mensagens: 579
Localização: São Paulo
Offline

Primeiramente desculpe por responder duas vezes, acabei apertando o botao errado.

Infelizamente não aborda SQLite como banco de dados, mas ele aborda somente expressao regular.

Que pode ser usado para fazer validações ou até mesmo "splits".
Expressao regular é bem poderosa, mas custa bastante para o processamento.

Fiz uma projeto em ME os scripts sql são validados e processados através de expressão regular.

This message was edited 1 time. Last update was at 01/11/2010 19:35:41


[Email] [MSN]
anderson_lp789
JavaGuru

Membro desde: 19/06/2010 19:24:50
Mensagens: 206
Offline

humm entendi, acho que vou comprar este livro!

enfim com expressões regulares eu saberia se ele tentou consultar tabela que não existia, erros de sintaxe como: não fechamento de parameteses, aspas, uso errado do and, not, or e xor... e outras coisas mais?
thiago.filadelfo
Virtual Machine Man
[Avatar]

Membro desde: 07/07/2007 00:32:26
Mensagens: 579
Localização: São Paulo
Offline

Sim... pode ser feito isso!!

Basta usar esses parenteses... no exemplo que passei
REGEX: SELECT\s(\*|\w+)\sFROM\s(\w+);

Para expressao regular casa parenteses quer dizer um agrupamento.. dai se fizer assim

agrupamento 1 terá: * ou nome,sobrenome
agrupamento 2 terá: tabela <- quer dizer qual tabela esta querendo buscar...

Mas torna mais complexo a medida que for querendo mais detalhes da expressao (String - script)...

Espero que goste e até que sirva a dica...

Flwsss


[Email] [MSN]
psevestre
JavaEvangelist

Membro desde: 13/05/2005 12:53:19
Mensagens: 432
Localização: São Paulo
Offline

anderson_lp789 wrote:gente estou a fazer um programa no qual o usuário pode escrever suas consultas no banco de dados, e eu preciso validar isso (sua sintaxe somente) tem algum parse que faz isso em java? alguém tem uma dica?


Que tal:

PreparedStatement st = conn.prepareStatement(stringPassadaPeloUsuario);


Se seu banco de dados suportar, este passo já irá validar a sintaxe da consulta SQL ou, se ela estiver errada, lançar uma exceção. RegEx só vai resolver os casos das consultas mais simples. Se for o seu caso, tudo bem, mas lembre-se de que cada banco tem funções próprias, extensões ao SQL, etc. Capturar e manter as expressões regulares provavelmente vai ser um pesadelo.


http://justaphilpicks.blogspot.com/
[MSN]
anderson_lp789
JavaGuru

Membro desde: 19/06/2010 19:24:50
Mensagens: 206
Offline

No meu caso não estou trabalhando com SGBD, e sim "montando" uma sintaxe para enviar ao um programa externo que trabalha com uma linguagem bem parecida com a SQL (só com algumas diferenças básicas como por exemplo a ausencia da clausula GROUP BY)

então creio que REGEX seja a melhor saída... ou vc propõe outra alternativa?

This message was edited 1 time. Last update was at 03/11/2010 07:32:39

psevestre
JavaEvangelist

Membro desde: 13/05/2005 12:53:19
Mensagens: 432
Localização: São Paulo
Offline

anderson_lp789 wrote:No meu caso não estou trabalhando com SGBD, e sim "montando" uma sintaxe para enviar ao um programa externo que trabalha com uma linguagem bem parecida com a SQL (só com algumas diferenças básicas como por exemplo a ausencia da clausula GROUP BY)

então creio que REGEX seja a melhor saída... ou vc propõe outra alternativa?


O melhor é vc. definir o subset SQL de maneira formal e usar uma ferramenta que gere o parser para vc. Veja o link abaixo para um exemplo de como isto pode ser feito em Java:

http://www.antlr.org/

Na página abaixo existem vários exemplos de gramáticas já criadas, inclusive de SQL:

http://www.antlr.org/grammar/list

This message was edited 1 time. Last update was at 03/11/2010 07:57:54


http://justaphilpicks.blogspot.com/
[MSN]
anderson_lp789
JavaGuru

Membro desde: 19/06/2010 19:24:50
Mensagens: 206
Offline

humm parece ser interessante, com a gramática definida como eu faço pra validar se está tudo correto...

por exemplo eu escrevo a consulta que eu quero, e vou validar ela como daih? não entendi isso.. vi alguns exemplos em C mas e em java? obrigado pela atenção e dica
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

anderson_lp789 wrote:gente estou a fazer um programa no qual o usuário pode escrever suas consultas no banco de dados, e eu preciso validar isso (sua sintaxe somente) tem algum parse que faz isso em java? alguém tem uma dica?



http://stackoverflow.com/questions/141499/any-java-libraries-out-there-that-validate-sql-syntax
anderson_lp789
JavaGuru

Membro desde: 19/06/2010 19:24:50
Mensagens: 206
Offline

humm legal, vou ler todo o conteúdo. Qualquer coisa eu aviso! serve pra eu pegar idéias de como implementar, porém acho que vou fazer isso usando regex e idéias deste material que me passaste. Obrigado
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team