Exemplo n.º 1
0
    def ejecutar(self, ent:Entorno):
        completo=str(self.nombre+'_'+ ent.getDataBase())
        tabla:Simbolo = ent.buscarSimbolo(completo)
        if tabla != None:
            columnas=tabla.valor
            i=0
            contador=0
            columnaunique=[]
            for columna in columnas:

                verificarnull=tabla.valor[i].atributos.get('not null')
                verificarprimary=tabla.valor[i].atributos.get('primary')
                verificarunique=tabla.valor[i].atributos.get('unique')
                verificarcheck=tabla.valor[i].atributos.get('check')

                condicion1:Expresion
                condicion2:Expresion
                if verificarunique!=None:
                    columnaunique.append(columna.nombre)



                if(verificarcheck!=None):
                    check=ent.buscarSimbolo(verificarcheck)
                    #print("Condicion:",check.valor.exp1.getval(ent).valor,check.valor.simbolo,check.valor.exp2.getval(ent).valor)

                    if isinstance(check.valor.exp1,Identificador):
                        condicion1=check.valor.exp1.getval(ent)
                        if condicion1==None:

                            condicion1=Terminal(columna.tipo, check.valor.exp1.nombre)
                    else:
                        condicion1 = Terminal(columna.tipo, check.valor.exp1.getval(ent).valor)

                    if isinstance(check.valor.exp2, Identificador):
                        condicion2 = check.valor.exp2.getval(ent)
                        if condicion2 == None:
                            condicion2 = Terminal(columna.tipo, check.valor.exp2.nombre)
                    else:
                        condicion2 = Terminal(columna.tipo, check.valor.exp2.getval(ent).valor)


                    operador=check.valor.simbolo
                    l=0
                    for columna in columnas:
                        #tipo=columna.tipo
                        if(check.valor.exp1.getval(ent)==columna.nombre):
                            k=0
                            for actual in self.namecolums:
                                if(check.valor.exp1.getval(ent)==actual.getval(ent).valor):
                                    condicion1=Terminal(columna.tipo,self.valores[k].getval(ent).valor)
                                k=k+1
                        l=l+1

                    n=0
                    for columna in columnas:
                        if(check.valor.exp2.getval(ent)==columna.nombre):
                            k=0
                            for actual in self.namecolums:
                                if(check.valor.exp2.getval(ent)==actual.getval(ent).valor):
                                    condicion2=Terminal(columna.tipo,self.valores[k].getval(ent).valor)
                                k=k+1
                        n=n+1

                    correcto=False
                    if operador in ('>','<','>=','<=','='):
                        #print(condicion1.getval(ent).valor,operador,condicion2.getval(ent).valor)
                        nuevaop = Relacional(condicion1,condicion2,operador);
                        if nuevaop.getval(ent):
                            correcto=True
                        else:
                            variables.consola.insert(INSERT,'Error Registro no cumple con condicion check\n')
                            reporteerrores.append(Lerrores("Error Semantico", 'Registro no cumple con condicion check','',''))
                            return

                    elif operador in ('or','and','not'):
                        nuevaop = Logica(condicion1,condicion2,operador);
                        if nuevaop.getval(ent):
                            correcto=True
                        else:
                            variables.consola.insert(INSERT,'Error Registro no cumple con condicion check\n')
                            reporteerrores.append(Lerrores("Error Semantico", 'Registro no cumple con condicion check','',''))
                            return




                if(verificarnull !=None or verificarprimary!=None or verificarunique!=None):
                    contador=contador+1
                i=i+1

                #print("contador",contador)
            if( (len(self.valores) >= contador) and (len(self.valores) == len(self.namecolums)) and (len(self.namecolums)<=len(columnas))):
                j=0
                t=0
                correcto=True
                terminales = []

                for columna in columnas:
                    if j < len(self.namecolums):
                        nombre=columna.nombre
                        tipo=columna.tipo
                        util=Tipo(None,None,-1,-1)
                        if isinstance(self.namecolums[j],Identificador):
                            v=self.namecolums[j].getval(ent)
                            if v==None:
                                self.namecolums[j] = Terminal(self.namecolums[j].tipo, self.namecolums[j].nombre)
                            else:
                                self.namecolums[j]=v

                        if(nombre==self.namecolums[j].valor):
                            #print("iguales",nombre,":",self.namecolums[j].getval(ent).valor,"J",j,"t",t)

                            for colunique in columnaunique:
                                if nombre==colunique:
                                    #print("UNIQUE",colunique,"colactual",nombre,"valor",self.valores[j].getval(ent).valor,"---")
                                    v=self.validarunique(ent,tabla,colunique,self.valores[j].getval(ent).valor)
                                    #print("-----",v)
                                    if v:
                                        variables.consola.insert(INSERT,'Error Violacion de Constraint Unique en columna:'+colunique +' : '+str(self.valores[j].getval(ent).valor)+'\n')
                                        reporteerrores.append(Lerrores("Error Semantico", 'Error Violacion de Constraint Unique en columna:'+colunique +' : '+str(self.valores[j].getval(ent).valor),'',''))
                                        return


                            buscado=str('ENUM_'+ent.getDataBase()+'_'+tipo.tipo)
                            types:Simbolo= ent.buscarSimbolo(buscado)

                            tipocorrecto = False

                            if types!=None:
                                tiposenum=types.valor
                                print("Comparando Enum")
                                for valenum in tiposenum:
                                    if str(valenum.getval(ent).valor).lower() == str(self.valores[j].getval(ent).valor).lower():
                                        tipocorrecto=True
                                if not tipocorrecto:
                                    variables.consola.insert(INSERT,str('Error Tipo enum no correcto en valor: '+self.valores[j].getval(ent).valor)+'\n')
                                    reporteerrores.append(Lerrores("Error Semantico",str('Tipo enum no correcto en valor: '+self.valores[j].getval(ent).valor),'',''))
                                    return



                            if not tipocorrecto:
                                if util.comparetipo(tipo,self.valores[j].getval(ent).tipo):
                                    'todo correcto'
                                else:
                                    correcto=False
                                    variables.consola.insert(INSERT,'Error los tipos no coinciden con la definicion de la tabla\n')
                                    reporteerrores.append(Lerrores("Error Semantico",'Tipo de datos en columanas no son iguales','',''))
                                    return


                            terminales.append(self.valores[j].valor)
                            j=j+1
                        else:
                            #print("diferentes",nombre,":",self.namecolums[j].getval(ent).valor,"J",j,"t",t)
                            terminales.append('')
                    else:
                        terminales.append('')
                r=DBMS.insert(ent.getDataBase(),self.nombre,terminales)
                if(r==4):
                    variables.consola.insert(INSERT,'Error violacion de Constraint Primary key\n')
                    reporteerrores.append(Lerrores("Error Semantico",'Violacion de Constraint primary Key','',''))
                    return
                elif r==0:
                    variables.consola.insert(INSERT, 'Registros Ingresados EXITOSAMENTE\n')





            else:
                variables.consola.insert(INSERT,'Error Numero Parametros en tabla '+self.nombre+' Incorrectos\n')
                reporteerrores.append(Lerrores('Erro semantico','Numero Parametros en tabla '+self.nombre+' Incorrectos','',''))
                return

        else:
            variables.consola.insert(INSERT,'Error Tabla '+self.nombre+' No Existe en la BD actual\n')
            reporteerrores.append(Lerrores('Error Semantico','Numero Parametros en tabla '+self.nombre+' Incorrectos','',''))
            return
Exemplo n.º 2
0
    def ejecutar(self, ent: Entorno):
        completo = self.nombre + '_' + ent.getDataBase()
        tabla: Simbolo = ent.buscarSimbolo(completo)
        if tabla != None:
            columnas = tabla.valor
            i = 0
            contador = 0
            for columna in columnas:

                verificarnull = tabla.valor[i].atributos.get('not null')
                verificarprimary = tabla.valor[i].atributos.get('primary')
                verificarunique = tabla.valor[i].atributos.get('unique')
                verificarcheck = tabla.valor[i].atributos.get('check')

                condicion1: Expresion
                condicion2: Expresion
                if (verificarcheck != None):
                    check = ent.buscarSimbolo(verificarcheck)
                    print("Condicion:", check.valor.exp1.getval(ent),
                          check.valor.simbolo, check.valor.exp2.getval(ent))
                    condicion1 = Terminal(columna.tipo,
                                          check.valor.exp1.getval(ent))
                    condicion2 = Terminal(columna.tipo,
                                          check.valor.exp2.getval(ent))
                    operador = check.valor.simbolo
                    l = 0
                    for columna in columnas:
                        tipo = columna.tipo
                        if (check.valor.exp1.getval(ent) == columna.nombre):
                            k = 0
                            for actual in self.namecolums:
                                if (check.valor.exp1.getval(ent) ==
                                        actual.getval(ent)):
                                    condicion1 = Terminal(
                                        tipo, self.valores[k].getval(ent))
                                k = k + 1
                        l = l + 1

                    n = 0
                    for columna in columnas:
                        if (check.valor.exp2.getval(ent) == columna.nombre):
                            k = 0
                            for actual in self.namecolums:
                                if (check.valor.exp2.getval(ent) ==
                                        actual.getval(ent)):
                                    condicion2 = Terminal(
                                        columna.tipo,
                                        self.valores[k].getval(ent))
                                k = k + 1
                        n = n + 1

                    correcto = False
                    if operador in ('>', '<', '>=', '<=', '='):
                        print(condicion1.getval(ent), operador,
                              condicion2.getval(ent))
                        nuevaop = Relacional(condicion1, condicion2, operador)
                        if nuevaop.getval(ent):
                            correcto = True
                        else:
                            return ('Registro no cumple con condicion check')

                    elif operador in ('or', 'and', 'not'):
                        nuevaop = Logica(condicion1, condicion2, operador)
                        if nuevaop.getval(ent):
                            correcto = True
                        else:
                            return ('Registro no cumple con condicion Check')

                if (verificarnull != None or verificarprimary != None
                        or verificarunique != None):
                    contador = contador + 1
                i = i + 1

                #print("contador",contador)
            if ((len(self.valores) >= contador)
                    and (len(self.valores) == len(self.namecolums))
                    and (len(self.namecolums) <= len(columnas))):
                j = 0
                t = 0
                correcto = True
                terminales = []
                for columna in columnas:
                    nombre = columna.nombre
                    tipo = columna.tipo
                    util = Tipo(None, None, -1, -1)
                    if (nombre == self.namecolums[j].getval(ent)):
                        #print("iguales",nombre,":",self.namecolums[j].getval(ent),"J",j,"t",t)
                        if util.comparetipo(tipo, self.valores[j].tipo):
                            'todo correcto'
                        else:
                            correcto = False
                            return 'Error los tipos de los valores no coinciden con la definicion de la tabla'
                        terminales.append(self.valores[j].getval(ent))
                        j = j + 1
                    else:
                        #print("diferentes",nombre,":",self.namecolums[j].getval(ent),"J",j,"t",t)
                        terminales.append('')
                r = DBMS.insert(ent.getDataBase(), self.nombre, terminales)
                if (r == 4):
                    return 'Error al Insertar Registro Violacion de Constraint Primary Key'

                print("Insert: ", terminales)
                return 'Registro insertado exitosamente'
                #print("insertando",r)
            else:
                return str('Error Numero Parametros en tabla ' + self.nombre +
                           ' Incorrectos')

        else:
            return str('Error Tabla ' + self.nombre +
                       ' No Existe en la BD actual')
Exemplo n.º 3
0
    def ejecutar(self, ent:Entorno):
        completo=str(self.nombre+'_'+ent.getDataBase())
        tabla:Simbolo = ent.buscarSimbolo(completo)
        if tabla != None:
            columnas=tabla.valor
            columnaunique=[]
            columnacheck=[]

            if len(self.valores)== len(columnas):
                i=0
                correcto=True
                for columna in columnas:
                    verificarunique=tabla.valor[i].atributos.get('unique')
                    verificarcheck=tabla.valor[i].atributos.get('check')
                    nombre=columna.nombre
                    tipo=columna.tipo

                    condicion1:Expresion
                    condicion2:Expresion
                    if verificarunique!=None:
                        #print("unique",verificarunique,"m--",nombre)
                        columnaunique.append(columna.nombre)

                    for colunique in columnaunique:
                        if nombre==colunique:
                            #print("UNIQUE",colunique,"colactual",nombre,"valor",self.valores[i].getval(ent).valor,"---")
                            exp=self.valores[i].getval(ent)
                            exp=exp.valor
                            v=self.validarunique(ent,tabla,colunique,exp)
                            #print("-----",v)
                            if v:
                                #print('Error Violacion de Constraint Unique en:',colunique,' : ',self.valores[i].getval(ent).valor)
                                variables.consola.insert(INSERT,'Error Violacion de Constraint Unique en columna:'+colunique +' : '+str(self.valores[i].getval(ent).valor)+'\n')
                                reporteerrores.append(Lerrores("Error Semantico", 'Error Violacion de Constraint Unique en columna:'+colunique +' : '+str(self.valores[i].getval(ent).valor),'',''))
                                return

                    if(verificarcheck!=None):
                        check=ent.buscarSimbolo(verificarcheck)
                        #print("Condicion:",check.valor.exp1.getval(ent).valor,check.valor.simbolo,check.valor.exp2.getval(ent).valor)

                        if isinstance(check.valor.exp1, Identificador):
                            condicion1 = check.valor.exp1.getval(ent)
                            if condicion1 == None:
                                condicion1 = Terminal(columna.tipo, check.valor.exp1.nombre)
                        else:
                            condicion1 = Terminal(columna.tipo, check.valor.exp1.getval(ent).valor)

                        if isinstance(check.valor.exp2, Identificador):
                            condicion2 = check.valor.exp2.getval(ent)
                            if condicion2 == None:
                                condicion2 = Terminal(columna.tipo, check.valor.exp2.nombre)
                        else:
                            condicion2 = Terminal(columna.tipo, check.valor.exp2.getval(ent).valor)
                        operador=check.valor.simbolo
                        l=0
                        for columna in columnas:
                            #tipo=columna.tipo
                            if isinstance(check.valor.exp1, Identificador):
                                check.valor.exp1 = Terminal(check.valor.exp1.tipo, check.valor.exp1.nombre)

                            if(check.valor.exp1.getval(ent).valor==columna.nombre):
                                condicion1=Terminal(columna.tipo,self.valores[l].getval(ent).valor)
                            l=l+1

                        n=0
                        for columna in columnas:
                            if isinstance(check.valor.exp2, Identificador):
                                check.valor.exp2 = Terminal(check.valor.exp2.tipo, check.valor.exp2.nombre)

                            if(check.valor.exp2.getval(ent).valor==columna.nombre):

                                condicion2=Terminal(columna.tipo,self.valores[n].getval(ent).valor)
                            n=n+1

                        correcto=False
                        if operador in ('>','<','>=','<=','='):
                            #print(condicion1.getval(ent).valor,operador,condicion2.getval(ent).valor)
                            nuevaop = Relacional(condicion1,condicion2,operador)
                            if nuevaop.getval(ent).valor:
                                correcto=True
                            else:
                                variables.consola.insert(INSERT,'Error Registro no cumple con condicion check\n')
                                reporteerrores.append(Lerrores("Error Semantico", 'Registro no cumple con condicion check','',''))
                                return

                        elif operador in ('or','and','not'):
                            nuevaop = Logica(condicion1,condicion2,operador);
                            if nuevaop.getval(ent).valor:
                                correcto=True
                            else:
                                variables.consola.insert(INSERT,'Error Registro no cumple con condicion check\n')
                                reporteerrores.append(Lerrores("Error Semantico", 'Error Registro no cumple con condicion check','',''))
                                return

                    buscado=str('ENUM_'+ent.getDataBase()+'_'+tipo.tipo)
                    types:Simbolo= ent.buscarSimbolo(buscado)

                    tipocorrecto = False

                    if types!=None:
                        tiposenum=types.valor
                        print("Comparando Enum")
                        for valenum in tiposenum:
                             if str(valenum.getval(ent).valor).lower() == str(self.valores[i].getval(ent).valor).lower():
                                  tipocorrecto=True
                        if not tipocorrecto:
                            variables.consola.insert(INSERT,str('Error Tipo enum no correcto en valor: '+self.valores[i].getval(ent).valor)+'\n')
                            reporteerrores.append(Lerrores("Error Semantico",str('Error Tipo enum no correcto en valor: '+self.valores[i].getval(ent).valor),'',''))
                            return


                    if not tipocorrecto:


                        util=Tipo(None,None,-1,-1)
                        #tabla:Simbolo = ent.buscarSimbolo(completo)


                        self.valores[i]=self.valores[i].getval(ent)

                        if util.comparetipo(tipo,self.valores[i].tipo):
                            'todo correcto'

                        else:
                            correcto=False
                            variables.consola.insert(INSERT,'Error los tipos no coinciden con la definicion de la tabla\n')
                            reporteerrores.append(Lerrores("Error Semantico",'Tipo de datos en columanas no son iguales','',''))
                            return

                    i=i+1
                terminales = []
                for val in self.valores:
                    terminales.append(val.valor)

                r=DBMS.insert(ent.getDataBase(),self.nombre,terminales)
                if(r==4):
                    variables.consola.insert(INSERT,'Error violacion de Constraint Primary key\n')
                    reporteerrores.append(Lerrores("Error Semantico",'Violacion de Constraint primary Key','',''))
                    return
                variables.consola.insert(INSERT,'Registros Ingresados EXITOSAMENTE\n')

                return
Exemplo n.º 4
0
    def ejecutar(self, ent: Entorno):
        completo = self.nombre + '_' + ent.getDataBase()
        tabla: Simbolo = ent.buscarSimbolo(completo)
        if tabla != None:
            columnas = tabla.valor
            columnaunique = []
            columnacheck = []

            if len(self.valores) == len(columnas):
                i = 0
                correcto = True
                for columna in columnas:
                    verificarnull = tabla.valor[i].atributos.get('not null')
                    verificarprimary = tabla.valor[i].atributos.get('primary')
                    verificarunique = tabla.valor[i].atributos.get('unique')
                    verificarcheck = tabla.valor[i].atributos.get('check')

                    nombre = columna.nombre
                    tipo = columna.tipo

                    condicion1: Expresion
                    condicion2: Expresion
                    if verificarunique != None:
                        #print("unique",verificarunique,"m--",nombre)
                        columnaunique.append(columna.nombre)

                    for colunique in columnaunique:
                        if nombre == colunique:
                            #print("UNIQUE",colunique,"colactual",nombre,"valor",self.valores[i].getval(ent),"---")
                            v = self.validarunique(ent, tabla, colunique,
                                                   self.valores[i].getval(ent))
                            #print("-----",v)
                            if v:
                                print(
                                    'Error Violacion de Constraint Unique en:',
                                    colunique, ' : ',
                                    self.valores[i].getval(ent))
                                return 'Error Violacion de Constraint Unique en columna:' + colunique + ' : ' + self.valores[
                                    i].getval(ent)

                    if (verificarcheck != None):
                        check = ent.buscarSimbolo(verificarcheck)
                        #print("Condicion:",check.valor.exp1.getval(ent),check.valor.simbolo,check.valor.exp2.getval(ent))
                        condicion1 = Terminal(columna.tipo,
                                              check.valor.exp1.getval(ent))
                        condicion2 = Terminal(columna.tipo,
                                              check.valor.exp2.getval(ent))
                        operador = check.valor.simbolo
                        l = 0
                        for columna in columnas:
                            tipo = columna.tipo
                            if (check.valor.exp1.getval(ent) == columna.nombre
                                ):
                                condicion1 = Terminal(
                                    tipo, self.valores[l].getval(ent))
                            l = l + 1

                        n = 0
                        for columna in columnas:
                            if (check.valor.exp2.getval(ent) == columna.nombre
                                ):

                                condicion2 = Terminal(
                                    columna.tipo, self.valores[n].getval(ent))
                            n = n + 1

                        correcto = False
                        if operador in ('>', '<', '>=', '<=', '='):
                            #print(condicion1.getval(ent),operador,condicion2.getval(ent))
                            nuevaop = Relacional(condicion1, condicion2,
                                                 operador)
                            if nuevaop.getval(ent):
                                correcto = True
                            else:
                                return (
                                    'Registro no cumple con condicion check')

                        elif operador in ('or', 'and', 'not'):
                            nuevaop = Logica(condicion1, condicion2, operador)
                            if nuevaop.getval(ent):
                                correcto = True
                            else:
                                return (
                                    'Registro no cumple con condicion Check')

                    util = Tipo(None, None, -1, -1)
                    if isinstance(self.valores[i], FuncionesNativas):
                        self.valores[i] = self.valores[i].getval(ent)

                    if util.comparetipo(tipo, self.valores[i].tipo):
                        'todo correcto'

                    else:
                        correcto = False
                        return 'Error los tipos de los valores no coinciden con la definicion de la tabla'
                    i = i + 1
                terminales = []
                for val in self.valores:
                    terminales.append(val.getval(ent))

                r = DBMS.insert(ent.getDataBase(), self.nombre, terminales)
                if (r == 4):
                    return 'Error al Insertar Registro Violacion de Constraint Primary Key'

                return 'Registros insertados con exito'