Analizador sintactico para Operacion DELETE de SQL

Ahora dejo el analizador basico para la operacion DELETE de SQL, Esta clase hace uso de la clase JfrPrincipal.java que mostre en el articulo del analizador sintactico del INSERT de SQL. Po lo tanto  solo voi a dejar el codigo del analizador sintactico de DELETE y si quieren ver el codigo de la clase JfrPrincipal.java pues se van al articulo correspondiente. Aca el Link. Bueno dejemos el wara wara wara y pasemos al codigo que es el siguiente:

//
//   Instituto Tecnologico de Zacatepec
// @author:  Gonzalo Silverio gonzasilve@gmail.com
// Archivo:  OperacionDelete.java
//  Descripcion:	Esta clase Analiza la sintaxis de la operacion DELETE de SQL
// Fecha:    8/09/2010  01:22:19 AM

public class OperacionDelete
{

String strInstruccionSQL = "";
String strNombreTabla,strC1;
Tokens tokens;
int i,j,c;

OperacionDelete(String cadSQL)
{
tokens = new Tokens(cadSQL);
}

public void analizar()
{
tokens.obtener_Token();      //Lee  la palabra delete
tokens.obtener_Token();      //Lee la palabra from
if( tokens.tipo_token == tokens.PALABRA_CLAVE && tokens.token.toString().toLowerCase().equals("from"))
{
tokens.obtener_Token();            //leer el token  del nombre de la tabla
}
else
{
mensaje_parser("\n ERROR! Se esperaba la palabra clave FROM. ");
return;
}

if( tokens.tipo_token != tokens.IDENTIFICADOR  )
{
mensaje_parser("\n Error! Se esperaba el nombre de la tabla. ");
return;
}
strNombreTabla=tokens.token.toString();	//Guardar el nombre de la tabla

//Para mostrar los campos eliminados
int cont_eliminados=0;

//Leeer el siguiente token deespues del nombre de la tabla
tokens.obtener_Token();
if( tokens.tipo_token == tokens.DELIMITADOR && tokens.token.toString().toLowerCase().equals(";") )
{
//Cambiarnos a la primera ficha
JfrPrincipal.jtpMensajes.setSelectedIndex(0);
mensaje_SBDD("\n\n Se eliminaran TODOS los registros de la tabla " + strNombreTabla + ". En total " +cont_eliminados);
//aqui se haria el delete la tabla que indico el usuario
mensaje_SBDD("\n Operacion DELETE realizada con exito.");
return;
}	//Fin de checkar si es ;

String campo1,campo2,campo3, valor1,valor2,valor3, operador1,operador2,operador3, logico1,logico2,logico3;
String tipo_valor1,tipo_valor2,tipo_valor3,tipo_valor4;

// ######################## COMPROBAR QUE EXISTE WHERE  ########################
if( tokens.tipo_token == tokens.PALABRA_CLAVE && tokens.token.toString().toLowerCase().equals("where"))
{
tokens.obtener_Token();            //leer el nombre del primer campo de asignacion
}
else
{
mensaje_parser("\n ERROR! Se esperaba la palabra clave WHERE. ");
return;
}

// ######################## LEER LA CONDICION 1   ########################
if( tokens.tipo_token == tokens.IDENTIFICADOR  )
{
campo1 = tokens.token.toString();
tokens.obtener_Token();            //leer el operador de asignacion
}
else
{
mensaje_parser("\n ERROR! Se esperaba el nombre de un identificador de campo de la tabla " + strNombreTabla);
return;
}

if( tokens.tipo_token == tokens.OPERADOR  )
{
operador1 = tokens.token.toString();
if( ! operador1.equals("=") )
{
mensaje_parser("\n ERROR! Se esperaba el operador = , no el operador  " + operador1  );
return;
}
tokens.obtener_Token();            //leer el operador
}
else
{
mensaje_parser("\n ERROR! Se esperaba un operador " );
return;
}

if( tokens.tipo_token == tokens.NUMERO_ENTERO || tokens.tipo_token==tokens.NUMERO_DECIMAL || tokens.tipo_token==tokens.CADENA  )
{
tipo_valor1=tokens.tt;		//Guardar el tipo de valor de campo; en forma de cadena
if(tipo_valor1.equals("char"))
valor1 = "'"+tokens.token.toString()+"'";
else
valor1 = tokens.token.toString();
tokens.obtener_Token();            //leer el siguiente token la asignacion  ; ó  or ó and
}
else
{
mensaje_parser("\n ERROR! Se esperaba un valor integer, decimal o char para el campo "+ campo1 );
return;
}

//Checkar si solo hay una condicion, si se logra pasar este tope (return), hay otra condicion
if( tokens.tipo_token == tokens.DELIMITADOR && tokens.token.toString().toLowerCase().equals(";") )
{
strC1 = new String("DELETE FROM " +  strNombreTabla + " WHERE "+ campo1+operador1+valor1);
//Cambiarnos a la primera ficha
JfrPrincipal.jtpMensajes.setSelectedIndex(0);
mensaje_SBDD("\n\n Instruccion DELETE con una condicion: "+strC1);
//Aqui se intentaria ejecutar la instruccion...
//Mostramos un msg al usuario para avisar del exito o fracaso de la ejecucion
mensaje_SBDD("\n Operacion DELETE realizada con exito.");
return;

}

// ######################## LEER LA CONDICION 2   ########################
if( ! (tokens.tipo_token == tokens.PALABRA_CLAVE) )
{
mensaje_parser("\n ERROR! se esperaba la palabra clave and  u or, no la palabra '" +tokens.token.toString() +"'" );
return;
}

logico1 = tokens.token.toString();		//Recoger el operador logico ando u or

if( logico1.toLowerCase().equals("and") || logico1.toLowerCase().equals("or") )
{
tokens.obtener_Token();
}

if( tokens.tipo_token == tokens.IDENTIFICADOR  )
{
campo2 = tokens.token.toString();
tokens.obtener_Token();            //leer el operador de asignacion
}
else
{
mensaje_parser("\n ERROR! Se esperaba el nombre de un identificador de campo de la tabla " + strNombreTabla);
return;
}

if( tokens.tipo_token == tokens.OPERADOR  )
{
operador2 = tokens.token.toString();
if( ! operador2.equals("=") )
{
mensaje_parser("\n ERROR! Se esperaba el operador = , no el operador  " + operador2  );
return;
}
tokens.obtener_Token();            //leer el operador
}
else
{
mensaje_parser("\n ERROR! Se esperaba un operador " );
return;
}

if( tokens.tipo_token == tokens.NUMERO_ENTERO || tokens.tipo_token==tokens.NUMERO_DECIMAL || tokens.tipo_token==tokens.CADENA  )
{
tipo_valor2=tokens.tt;		//Guardar el tipo de valor de campo; en forma de cadena
if(tipo_valor2.equals("char"))
valor2 =  "'"+tokens.token.toString()+"'";
else
valor2 =  tokens.token.toString();
tokens.obtener_Token();            //leer el siguiente token la asignacion  ; ó  ,
}
else
{
mensaje_parser("\n ERROR! Se esperaba un valor integer, decimal o char para el campo "+ campo2 );
return;
}

//Checkar si solo hay una condicion, si se logra pasar este tope (return), hay otra tercera condicion
if( tokens.tipo_token == tokens.DELIMITADOR && tokens.token.toString().toLowerCase().equals(";") )
{
strC1 = new String("DELETE FROM " +  strNombreTabla + " WHERE "+ campo1+operador1+valor1+ " " + logico1 + " " +campo2+operador2+valor2 );
//Cambiarnos a la primera ficha
JfrPrincipal.jtpMensajes.setSelectedIndex(0);
mensaje_SBDD("\n\n Instruccion DELETE con 2 condiciones: "+strC1);
//Aqui se intentaria ejecutar la instruccion...
//Mostramos un msg al usuario para avisar del exito o fracaso de la ejecucion
mensaje_SBDD("\n Operacion DELETE realizada con exito.");
return;
}

// ######################## LEER LA CONDICION 3   ########################
if( ! (tokens.tipo_token == tokens.PALABRA_CLAVE) )
{
mensaje_parser("\n ERROR! se esperaba la palabra clave and  u or, no la palabra '" +tokens.token.toString() +"'" );
return;
}

logico2 = tokens.token.toString();		//Recoger el operador logico ando u or

if( logico2.toLowerCase().equals("and") || logico2.toLowerCase().equals("or") )
{
tokens.obtener_Token();
}

if( tokens.tipo_token == tokens.IDENTIFICADOR  )
{
campo3 = tokens.token.toString();
tokens.obtener_Token();            //leer el operador de asignacion
}
else
{
mensaje_parser("\n ERROR! Se esperaba el nombre de un identificador de campo de la tabla " + strNombreTabla);
return;
}

if( tokens.tipo_token == tokens.OPERADOR  )
{
operador3 = tokens.token.toString();
if( ! operador3.equals("=") )
{
mensaje_parser("\n ERROR! Se esperaba el operador = , no el operador  " + operador3  );
return;
}
tokens.obtener_Token();            //leer el operador
}
else
{
mensaje_parser("\n ERROR! Se esperaba un operador " );
return;
}

if( tokens.tipo_token == tokens.NUMERO_ENTERO || tokens.tipo_token==tokens.NUMERO_DECIMAL || tokens.tipo_token==tokens.CADENA  )
{
tipo_valor3=tokens.tt;		//Guardar el tipo de valor de campo; en forma de cadena
if(tipo_valor3.equals("char"))
valor3 =  "'"+tokens.token.toString()+"'";
else
valor3 =  tokens.token.toString();
tokens.obtener_Token();            //leer el siguiente token la asignacion  ; ó  ,
}
else
{
mensaje_parser("\n ERROR! Se esperaba un valor integer, decimal o char para el campo "+ campo3 );
return;
}

//Checkar si solo hay una ultima condicion; este analizados sintactico como maximo soporta e condiciones unidas con and u or
if( tokens.tipo_token == tokens.DELIMITADOR && tokens.token.toString().toLowerCase().equals(";") )
{
strC1 = new String("DELETE FROM " +  strNombreTabla + " WHERE "+ campo1+operador1+valor1+ " " + logico1 + " " +campo2+operador2+valor2 + " " + logico2 + " " +campo3+operador3+valor3);
//Cambiarnos a la primera ficha
JfrPrincipal.jtpMensajes.setSelectedIndex(0);
mensaje_SBDD("\n\n Instruccion DELETE con 3 condiciones: "+strC1);
//Aqui se intentaria ejecutar la instruccion...
//Mostramos un msg al usuario para avisar del exito o fracaso de la ejecucion
mensaje_SBDD("\n Operacion DELETE realizada con exito.");
return;
}

}

public void mensaje_parser(String msg)
{
JfrPrincipal.jtaMensajesParser.append("\n" + msg );
}

public void mensaje_SBDD(String msg)
{
JfrPrincipal.jtaMensajesSBDD.append( msg );
}

}

Como se puede ver analiza sintaxis de delete
sin condiciones (caso en que se eliminan todos los registros de la tabla)
con condiciones (maximo 3)
las condiciones pueden estar unidas con el operador and u or

Aca un pantallazo con el delete sin condiciones

Aca un pantallazo con el delete con sintaxis invalida (en el where)

y por ultimo un pantallazo con un delete con 2 condiciones validas

A la mayoria no le funciona el codigo aqui mostrado en wordpress.com por que al parecer al formatearlo el sistema le inserta caracteres raros, pero si a alguien le interesa el fuente se lo paso. espero comentarios

}

Acerca de gonzasilve
Freelance Web Developer.

11 Responses to Analizador sintactico para Operacion DELETE de SQL

  1. buenos días estoy interesado en el código mi correo es
    carloslopera89@gmail.com

    Saludos

  2. Josue dice:

    Hola, será que me podrías ayudarme con tu codigo para guiarme como realizar uno mi correo es josueale2809@gmail.com
    de antemano muchas gracias

  3. Carlos dice:

    Buenas noches, estoy interesado en el còdigo como ayuda pedagògica, por favor me puedes enviar el codigo a candrisi@hotmail.com

    Gracias.

    • gonzasilve dice:

      Holaaa
      Que crees?? creo que e perdido ese codigo (operacion delete), pero te mando el analisis sintactico de la operacion INSERT, para el delete es algo muy parecido. te lo mando para que te des una idea y espero te sirva de algo.

      echale ganas, te mando un cordial Saludo. y gracias x visitar

  4. Arnold dice:

    excelente por favor me lo podrias enviar a roca831105@msn.com

  5. irama dice:

    me lo podrias pasar a irama_chavez@hotmail.com

  6. LIZ_Bonita dice:

    hola si me podrias enviar tu analizador de favor, o algun tutorial de como empezar a diseña uno, mi correo es liz_brianda14@hotmail.com. gracias bye…………..

  7. me podes mandar el analizador este es mi correo renetello356@gmail.com

  8. me podrias enviar tu analizador este es mi correo erling.aqp@gmail.com

  9. fernanda dice:

    hola si me podrias pasar este analizador porfa mi correo es mariafernandastar12@hotmail.com
    gracias es un excelente trabajo
    Por fa me gustaria estudiarlo y basarme en el para hacer uno jeje
    te agradezco tu atencion
    gracias

  10. fernanda dice:

    hola si me podrias pasar este analizador porfa mi correo es mariafernandastar12@hotmail.com
    gracias es un excelente trabajo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: