Uso de la clase StringTokenizer para realizar un analizador sintactico de SQL
5 abril 2011 12 comentarios
Uso de la clase StringTokenizer para realizar una analizador sintactico de las operaciones SQL INSERT, DELETE, UPDATE o SELECT. Como he mostrado anteriormente el uso de la clase StringTokenizer es muy sencillo. Asi que ahora quisiera aportar una idea acerca de como se podria implementar el analizador sintactico para alguna de las 4 operaciones SQL. El ejemplo solamente es una clase y solamente da una idea de como iniciar el analisis de la sintaxis de la Operacion INSERT de SQL, SOLAMENTE ES UNA IDEA y es la siguiente:
/* * Instituto Tecnologico de Zacatepec * Descripcion Ejemplo2 de uso de la clase StringTokenizer * author Gonzalo Silverio gonzasilve@hotmail.com * version 1.00 * Archivo: EjemploTokenizer2.java */ import java.util.StringTokenizer; public class EjemploTokenizer2 { //Guarda las tablas validas donde se puede realizar el INSERT, DELETE, UPDATE o un SELECT // este arreglo se puede rellenar con info de alguna fuente exterior a este //programa; por ejemplo de una B.D. static String tablasValidas[] = {"alumnos","profesores","calificaciones","materias","etc"}; //Analiza la sintaxis de la operacion INSERT de SQL public static void analizarOperacionInsert(String cadena) { StringTokenizer tok1 = new StringTokenizer(cadena); String finCadena = new String(); //Guardara el token actualmente leido String tokenActual; //salta el INSERT (en el main ya se comprobo que si era la palabra INSERT) tok1.nextToken(); //guarda SEGUNDO token (INTO) tokenActual = tok1.nextToken(); //Comprueba si realmente es la palabra INTO if(! tokenActual.equals ("INTO") ) { System.out.println ("Se esperaba la palabra clave INTO, no '"+tokenActual+"'"); return; } //guarda SEGUNDO token (Nombre de la tabla donde se desea hacer el INSERT) tokenActual = tok1.nextToken(); //Comprueba si es una tabla valida if( ! buscar_tabla(tokenActual) ) { System.out.println ("La tabla '"+tokenActual+"' NO EXISTE o NO es una tabla valida."); return; } tokenActual = tok1.nextToken(); //guarda lo de values y todo lo demas StringTokenizer tok2 = new StringTokenizer(tokenActual,"("); String cadValues; cadValues = tok2.nextToken(); //Comprueba si realmente es la palabra VALUES if(! cadValues.equals ("VALUES") ) { System.out.println ("Se esperaba la palabra clave VALUES, no '"+cadValues+"'"); return; } //Muestra los tokens que estan despues del parentesis System.out.println("\n\n"+tok2.nextToken()); //Y asi sucesivamente se seguiria analizando la sintaxis de la Operacion INSERT de SQL //bla, bla, bla } // Fin de metodo analizarOperacionDelete(); //Analiza la sintaxis de la operacion DELETE de SQL public static void analizarOperacionDelete(String cadena) { //Aqui se analizaria la sintaxis del DELETE } //Analiza la sintaxis de la operacion UPDATE de SQL public static void analizarOperacionUpdate(String cadena) { //etc } //Analiza la sintaxis de la operacion SELECT de SQL public static void analizarOperacionSelect(String cadena) { } //Devuelve true si la cadena que llega esta dentro de un arreglo de Strings, //devuelve false en caso contrario; busca la tabla que llega dentro de las tablas validas public static boolean buscar_tabla(String nomTabla) { for(int i = 0;i< tablasValidas.length;i++) { if( tablasValidas[i].equals(nomTabla) ) return true; } return false; } public static void main(String gonza[]) { //Cadena a ser analizada String cadena = "INSERT INTO alumnos VALUES('s1','intel','cuerna',245)"; //String cadena = "Delete FROM alumnos where matricula='00547264'"; //String cadena = "UPDATE alumnos SET nombre='Fabian', apellidos='Granados P.' where matricula='00664326'"; //Guardara el token actualmente leido String tokenActual; StringTokenizer st = new StringTokenizer(cadena); //Guarda el primer token tokenActual = st.nextToken(); //Convertimos toda la cadena a MAYUSCULAS para hacerla case insensitive // (NO sensible a las mayusculas/minusculas) tokenActual = tokenActual.toUpperCase(); //EMPEZAMOS POR REVISAR EL PRIMER TOKEN, si es una de las 4 Operaciones SQL if( tokenActual.equals ("INSERT") || tokenActual.equals ("DELETE") || tokenActual.equals ("UPDATE") || tokenActual.equals ("SELECT")) { if (tokenActual.equals ("INSERT")) analizarOperacionInsert(cadena); else if (tokenActual.equals ("DELETE")) analizarOperacionDelete(cadena); else if (tokenActual.equals ("UPDATE")) analizarOperacionUpdate(cadena); else if (tokenActual.equals ("SELECT")) analizarOperacionSelect(cadena); } else System.out.println("No es una operacion SQL valida, solo se permite INSERT,DELETE,UPDATE o SELECT"); } //Fin del metodo main() }
Observa como en el metodo main() se especifica la operacion SQL a analizar (linea 101), obviamente esa cadena se debe obtener de alguna caja de texto donde escribio el usuario o dejar que la teclee el usuario por la consola, yo la he puesto en una variable directamente para fines didacticos y por que solmente quiero mostrar mi idea. Ahora una imagen de la ejecucion y compilacion del ejemplo (sin errores de sintaxis):
Ahora supongamos que en la cadena escribimos mal la palabra INTO y pusimos INTOO, asi;
String cadena = "INSERT INTOO alumnos VALUES('s1','intel','cuerna',245)";
(esto lo cambias en la linea 101) observa ahora la ejecucion, nos marca error de sintaxis!!!
Ahora supongamos que escribimos un nombre de tabla que no es ninguna de las tablas validas; escribimos la tabla salarios, asi;
String cadena = "INSERT INTO salarios VALUES('s1','intel','cuerna',245)";
(esto lo cambias en la linea 101) observa ahora la ejecucion, nos marca error de sintaxis!!!, la tabla no existe!!
Ahora supongamos que olvidamos escribir la palabra INTO, asi;
String cadena = "INSERT alumnos VALUES('s1','intel','cuerna',245)";
(esto lo cambias en la linea 101) observa ahora la ejecucion, nos marca error de sintaxis!!!.
Es todo, y si quieres el .java ya sabes, pidelo en un comentario y te lo envio. hasta pronto.
Comentarios recientes