Salve pessoal,
tenho uma dúvida com relação ao funcionamento de uma instrução SQL; O cliente se conecta ao servidor via TCP, toda comunicação entre o cliente e o servidor é feita pelo envio de strings, certo? Quando a gente faz uma query Ex: SELECT * from tabela, essa string da query vai ser enviada pelo TCP ao servidor que vai tratar ela, daí ele abre os arquivos locais(tabela) e procura o que foi requisitado e manda os dados na resposta(suponho que seja por stream). Se até eu não falei besteira, . Como a rotina que interpreta as instruções SQL e traduz pro resto do script pra que ele busque no arquivo exatamente o que foi requisitado na query?
Ex: se todas as instruções fossem SELECT * FROM tabela WHERE … ou UPDATE tabela SET sss=‘sss’ WHERE… etc, eu faria uma rotina que iria tratar a string com a instrução e enfim fazer a query. Como a gente já sabe existem trocentas formas de fazer instrução “SELECT * FROM…”, “SELECT campo1, campo2, campo3 FROM…”, SELECT a.campo1, b.campo1…
A minha intenção é montar um servidor de banco de dados e pra isso eu tô tentando entender como funciona lá nos bastidores e tentar seguir op padrão.
Valeu e desde já agradeço à galera aí que puder dar um help, []'s.
Uma forma é pegar o fonte do HSQLDB ( http://hsqldb.soruceforge.net ) e tentar entender mais ou menos o que ocorre. Ele não tem otimização no SQL nem usa algoritmos muito complexos no acesso aos dados (ou seja, para qualquer consulta de dados grande ou complexa ele abre o bico), mas para entender o que se passa é bem legal.
Aham, é “http://hsqldb.sourceforge.net”. Desculpem nossa falha…
Cara valeu mesmo pela dica, vi a rotina, ele faz exatamente o que eu tava pensando, pega a string da variável “cmd” que é a que vem pelo tcp, trata ela e dá esse switch aí,
switch (cmd) {
case SELECT :
rResult = p.processSelect();
break;
case INSERT :
rResult = p.processInsert();
send_update=true;
break;
case UPDATE :
rResult = p.processUpdate();
send_update=true;
break;
case DELETE :
rResult = p.processDelete();
send_update=true;
break;
case CALL :
rResult = p.processCall();
send_update=true;
break;
case SET :
rResult = processSet(c, session);
send_update=true;
break;
case COMMIT :
rResult = processCommit(c, session);
session.setScripting(true);
send_update=true;
break;
case ROLLBACK :
rResult = processRollback(c, session);
session.setScripting(true);
send_update=true;
break;
case SAVEPOINT :
rResult = processSavepoint(c, session);
session.setScripting(true);
send_update=true;
break;
case CREATE :
rResult = processCreate(c, session);
send_update=true;
break;
case ALTER :
rResult = processAlter(c, session);
send_update=true;
break;
case DROP :
rResult = processDrop(c, session);
send_update=true;
break;
case GRANT :
rResult = processGrantOrRevoke(c, session, true);
send_update=true;
break;
case REVOKE :
rResult = processGrantOrRevoke(c, session, false);
send_update=true;
break;
case CONNECT :
rResult = processConnect(c, session);
break;
case DISCONNECT :
rResult = processDisconnect(session);
break;
case SCRIPT :
rResult = processScript(c, session);
break;
case SHUTDOWN :
rResult = processShutdown(c, session);
break;
case CHECKPOINT :
rResult = processCheckpoint(session);
send_update=true;
break;
case SEMICOLON :
break;
}
pra cada tipo de instrução ele criou uma função pra fazer o tratamento, maneiro valeu mesmo… []'s.