/* OPERACION COMMIT EN BASES DE DATOS */ /* ---------------------------------------------------*/ /* -- Programa: commit.yac ----*/ /* -- TEcnica: Dirigida por la sintAxis ----*/ /* -- Objetivo: Permitir el lenguaje de SQL ----*/ /* -- Programador: J. Rafael R. ochoa ----*/ /*----------------------------------------------------*/ %{ int begin_transaction=0; char enlace_commit[80]; %} %union { char str[256]; } %token <str> COMA LEFT RIGHT IGUAL LINEA SALIR GO INSERT INTO %token <str> VALUES DELETE FROM WHERE SELECT UPDATE CREATE TABLE DROP %token <str> APOSTROFE NOT_NULL SET AND OR CHAR INT ASTERISCO %token <str> NUMERO TEXTO COMMIT BEGINX TRANSACTION ROLLBACK %type <str> insert delete select update tables datos dato criterio %type <str> view list_view estructura not_null tipo cambios crit_list %type <str> commit begin rollback %% /* producciones de la gramatica */ entrada : expr | expr entrada | error LINEA { printf("\n:-) "); } entrada ; expr : SALIR LINEA { return 1; } | insert GO LINEA { printf("\n:-) "); } | delete GO LINEA { printf("\n:-) "); } | select GO LINEA { printf("\n:-) "); } | update GO LINEA { printf("\n:-) "); } | tables GO LINEA { printf("\n:-) "); } | commit GO LINEA { printf("\n:-) "); } | rollback GO LINEA { printf("\n:-) "); } | begin GO LINEA { printf("\n:-) "); } ; insert : INSERT INTO TEXTO VALUES LEFT datos RIGHT { if(begin_transaction) sprintf($$,"insert into %s values ( %s )",$3,$6); else sprintf($$,"insert into %s values (%s)",$3,$6); if(begin_transaction) guarda_log($$); else ejecuta_instr_mslq($$); } ; delete : DELETE FROM TEXTO criterio { sprintf($$,"delete from %s %s",$3,$4); if(begin_transaction) guarda_log($$); else ejecuta_instr_mslq($$); } ; select : SELECT view FROM TEXTO criterio { sprintf($$,"select %s from %s %s",$2,$4,$5); if(begin_transaction) guarda_log($$); else ejecuta_instr_mslq($$); } ; update : UPDATE TEXTO SET cambios criterio { sprintf($$,"update %s set %s where %s", $2,$4,$5); if(begin_transaction) guarda_log($$); else ejecuta_instr_mslq($$); } ; tables : CREATE TABLE TEXTO LEFT estructura RIGHT { sprintf($$,"create table %s ( %s )",$3,$5); if(begin_transaction) guarda_log($$); else ejecuta_instr_mslq($$); } | DROP TABLE TEXTO { sprintf($$,"drop table %s",$3); if(begin_transaction) guarda_log($$); else ejecuta_instr_mslq($$); } ; datos : dato { sprintf($$,"%s",$1); } | dato COMA datos { sprintf($$,"%s,%s",$1,$3); } ; dato : APOSTROFE TEXTO APOSTROFE { sprintf($$,"'%s'",$2); } | NUMERO { strcpy($$,$1); } ; criterio : { sprintf($$,"%s",""); } /* todos */ | WHERE crit_list { sprintf($$,"where %s",$2); } ; crit_list : TEXTO IGUAL dato { sprintf($$,"%s=%s",$1,$3); } | TEXTO IGUAL dato AND crit_list { sprintf($$,"%s=%s and %s",$1,$3,$5); } ; cambios : TEXTO IGUAL dato { sprintf($$,"%s=%s",$1,$3); } | TEXTO IGUAL dato COMA cambios { sprintf($$,"%s=%s,%s",$1,$3,$5); } view : ASTERISCO { sprintf($$,"%s","*"); } | list_view { sprintf($$,"%s",$1); } ; list_view : TEXTO { sprintf($$,"%s",$1); } | TEXTO COMA list_view { sprintf($$,"%s,%s",$1,$3); } ; estructura: TEXTO tipo LEFT NUMERO RIGHT not_null { sprintf($$,"%s %s ( %s ) %s",$1,$2,$4,$6); } | TEXTO tipo LEFT NUMERO RIGHT not_null COMA estructura { sprintf($$,"%s %s ( %s ) %s, %s",$1,$2,$4,$6,$8); } ; tipo : CHAR { strcpy($$,"char"); } | INT { strcpy($$,"int"); } ; not_null : { strcpy($$, " "); } | NOT_NULL { strcpy($$, " not null"); } ; commit : COMMIT TRANSACTION { if(begin_transaction) { guarda_log("commit transaction"); begin_transaction = 0; system(enlace_commit); } else } ; rollback : ROLLBACK TRANSACTION { system("rollback.pl"); } ; begin : BEGINX TRANSACTION { if(begin_transaction) else { guarda_log("begin transaction"); begin_transaction = 1; } } ; %% /* funciones auxiliares */ #include <stdio.h> #include <string.h> void guarda_log(char log[]); void ejecuta_instr_mslq(char instr[]); extern int yylex(); /* Liga con la funcion yylex generada por LEX */ extern int yynerrs; int yyparse(); void main(int argc, char *argv[]) { char decide[80]; sprintf(enlace_commit, "commit.pl %s",argv[1]); sprintf(decide,"decide.pl %s",argv[1]); system("clear"); printf("\n"); printf("-------------------------------------------\n"); printf(" Monitor SQL - incrementado\n"); printf("-------------------------------------------\n"); system(decide); /* rollback o commit */ printf(":-) "); yyparse(); printf("\n(8-)~ok\n"); } yyerror(char *error) /* llamado por yyparse() cuando ocurra */ { /* un error */ printf("\n%s \n",error); return 1; } void guarda_log(char log[]) { FILE *bitacora; printf("\n==>%s",log); bitacora = fopen("log.txt","a+"); fputs(log,bitacora); fputc('\n',bitacora); fclose(bitacora); } void ejecuta_instr_mslq(char instr[]) { char cadena[275]; strcpy(cadena,"apli_sql.pl "); strcat(cadena,instr); system(cadena); }