Exemplo n.º 1
0
    def FunctionWithBucket(self, funcion, parametros, exp1, exp2, exp3, exp4):
        if (parametros == 4):
            if (exp1 < exp2 or exp1 > exp3):
                reporteerrores.append(
                    Lerrores("Error Semantico", "Valor" + str(exp1) + "no se encuentra en el rango", 0, 0))
                return "Error: El valor: " + str(exp1) + " no esta en el rango de: (" + str(exp2) + "," + str(
                    exp3) + ")"
            else:
                contador = 1
                for x in range(exp2, exp3):
                    contador = contador + 1

                columnas = int(contador / exp4)
                inicio = int(exp2)
                final = int(exp2) + (columnas)
                posbucket = 0
                for fila in range(0, exp4):
                    for valores in range(inicio, final):
                        if (exp1 == valores):
                            posbucket = fila + 1
                            msg="El valor de: " + str(exp1) + " esta en el bucket: " + str(posbucket)
                            tipo =Tipo('varchar',self.l(msg),-1,-1)
                            return Terminal(tipo,msg)
                    inicio = final
                    final = final + columnas
        else:
            reporteerrores.append(
                Lerrores("Error Semantico", "La funcion" + funcion + "solo recibe 2 parametros", 0, 0))
            return "Error: La funcion: " + funcion + " recibe 4 parametro"
Exemplo n.º 2
0
    def FunctionWithTreeParameter(self, funcion, parametros, exp1, exp2, exp3):
        if (parametros == 3):
            if (funcion == "substring"):
                inicio = exp2 - 1
                fin = inicio + exp3
                sub = exp1[inicio:fin]
                return Terminal(Tipo('decimal', sub, self.l(sub), -1), sub)

            elif (funcion == "substr"):
                inicio = exp2 - 1
                fin = inicio + exp3
                sub = exp1[inicio:fin]
                return Terminal(Tipo('decimal', sub, self.l(sub), -1), sub)
        else:
            reporteerrores.append(
                Lerrores("Error Semantico", "La funcion" + funcion + "solo recibe 3 parametros", 0, 0))
            return "Error: La funcion: " + funcion + " recibe 3 parametro"
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
            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.º 4
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.º 5
0
    def FunctionWithTwoParameter(self, funcion, parametros, exp1, exp2):
        if (parametros == 2):
            if (funcion == "div"):

                return Terminal(Tipo('decimal', exp1 / exp2, self.l(exp1 / exp2), -1), exp1 / exp2)

            elif (funcion == "gcd"):
                return Terminal(Tipo('integer', math.gcd(exp1, exp2), self.l(math.gcd(exp1, exp2)), -1),
                                math.gcd(exp1, exp2))


            elif (funcion == "mod"):
                return Terminal(Tipo('integer', exp1 % exp2, self.l(exp1 % exp2), -1), exp1 % exp2)

            elif (funcion == "power"):
                return Terminal(Tipo('decimal', math.pow(exp1, exp2), self.l(math.pow(exp1, exp2)), -1),
                                math.pow(exp1, exp2))

            elif (funcion == "round"):
                return Terminal(Tipo('decimal', round(exp1, exp2), self.l(round(exp1, exp2)), -1), round(exp1, exp2))

            elif (funcion == "atan2"):
                return Terminal(Tipo('decimal', math.atan(exp1 / exp2), self.l(math.atan(exp1 / exp2)), -1),
                                math.atan(exp1 / exp2))

            elif (funcion == "atan2d"):
                return Terminal(
                    Tipo('decimal', math.degrees(math.atan(exp1 / exp2)), self.l(math.atan(exp1 / exp2)), -1),
                    math.degrees(math.atan(exp1 / exp2)))

            elif (funcion == "encode"):
                if (exp2.lower() == "base64"):
                    cascci = exp1.encode('ascii')
                    codificado = base64.b64encode(cascci)
                    return Terminal(Tipo('varchar', codificado.decode('utf-8'), self.l(codificado.decode('utf-8')), -1),
                                    codificado.decode('utf-8'))

                elif (exp2.lower() == "hex"):
                    cascci = exp1.encode('utf-8')
                    codificado = base64.b16encode(cascci)
                    return Terminal(Tipo('varchar', codificado.decode('utf-8'), self.l(codificado.decode('utf-8')), -1),
                                    codificado.decode('utf-8'))

                elif (exp2.lower() == "escape"):
                    codificado = exp1.encode('unicode_escape').decode('utf-8')
                    return Terminal(Tipo('varchar', codificado, self.l(codificado), -1), codificado)

            elif (funcion == "decode"):
                if (exp2.lower() == "base64"):
                    codificado = base64.b64decode(exp1)
                    return Terminal(Tipo('varchar', codificado.decode('utf-8'), self.l(codificado.decode('utf-8')), -1),
                                    codificado.decode('utf-8'))

                elif (exp2.lower() == "hex"):
                    codificado = base64.b16decode(exp1)

                    return Terminal(Tipo('varchar', codificado.decode('utf-8'), self.l(codificado.decode('utf-8')), -1),
                                    codificado.decode('utf-8'))

                elif (exp2.lower() == "escape"):
                    codificado = exp1.encode('utf-8').decode('unicode_escape')

                    return Terminal(Tipo('varchar', codificado, self.l(codificado), -1), codificado)

            elif (funcion == "date_part"):
                datepart = Date_Part(exp1, exp2)
                datepart=datepart.getval()

                return Terminal(Tipo('integer', datepart, self.l(datepart), -1), datepart)
            
            elif (funcion == "trim"):
                print('exp',exp2)
                trim = exp1.strip(exp2)
                return Terminal(Tipo('varchar', trim, self.l(trim), -1), trim)


        else:

            reporteerrores.append(
                Lerrores("Error Semantico", "La funcion" + funcion + "solo recibe 2 parametros", 0, 0))
            return "Error: La funcion: " + funcion + " recibe 2 parametro"
Exemplo n.º 6
0
    def FunctionWithOneParameter(self, funcion, parametros, exp):
        result = None
        if (parametros == 1):
            if (funcion == "abs"):
                if (exp < 0):
                    return Terminal(Tipo('numeric', exp * -1, self.l(exp * -1), -1), exp * -1)

                else:
                    return Terminal(Tipo('numeric', exp, self.l(exp), -1), exp)

            elif (funcion == "cbrt"):
                return Terminal(Tipo('decimal', math.pow(exp, 3), self.l(math.pow(exp, 3)), -1), math.pow(exp, 3))

            elif (funcion == "ceil"):
                return Terminal(Tipo('numeric', math.ceil(exp), self.l(math.ceil(exp)), -1), math.ceil(exp))

            elif (funcion == "ceiling"):
                return Terminal(Tipo('numeric', math.ceil(exp), self.l(math.ceil(exp)), -1), math.ceil(exp))

            elif (funcion == "degrees"):
                return Terminal(Tipo('decimal', math.degrees(exp), self.l(math.degrees(exp)), -1), math.degrees(exp))

            elif (funcion == "exp"):
                return Terminal(Tipo('numeric', math.exp(exp), self.l(math.exp(exp)), -1), math.exp(exp))

            elif (funcion == "factorial"):

                return Terminal(Tipo('numeric', math.factorial(exp), self.l(math.factorial(exp)), -1),
                                math.factorial(exp))

            elif (funcion == "floor"):

                return Terminal(Tipo('integer', math.floor(exp), self.l(math.floor(exp)), -1), math.floor(exp))

            elif (funcion == "ln"):
                return Terminal(Tipo('decimal', math.log(exp), self.l(math.log(exp)), -1), math.log(exp))


            elif (funcion == "log"):
                return Terminal(Tipo('decimal', math.log10(exp), self.l(math.log10(exp)), -1), math.log10(exp))

            elif (funcion == "radians"):
                return Terminal(Tipo('decimal', math.radians(exp), self.l(math.radians(exp)), -1), math.radians(exp))

            elif (funcion == "sing"):
                if (exp > 0):
                    return Terminal(Tipo('integer', 1, self.l(1), -1), 1)

                else:
                    return Terminal(Tipo('integer', -1, self.l(-1), -1), -1)

            elif (funcion == "sqrt"):
                return Terminal(Tipo('decimal', math.sqrt(exp), self.l(math.sqrt(exp)), -1), math.sqrt(exp))

            elif (funcion == "trunc"):
                return Terminal(Tipo('numeric', math.trunc(exp), self.l(math.trunc(exp)), -1), math.trunc(exp))

            elif (funcion == "acos"):

                return Terminal(Tipo('decimal', math.acos(exp), self.l(math.acos(exp)), -1), math.acos(exp))

            elif (funcion == "acosd"):
                return Terminal(Tipo('decimal', math.degrees(math.acos(exp)), self.l(math.degrees(math.acos(exp))), -1),
                                math.degrees(math.acos(exp)))

            elif (funcion == "asin"):
                return Terminal(Tipo('decimal', math.asin(exp), self.l(math.asin(exp)), -1), math.asin(exp))

            elif (funcion == "asind"):
                return Terminal(Tipo('decimal', math.degrees(math.asin(exp)), self.l(math.degrees(math.asin(exp))), -1),
                                math.degrees(math.asin(exp)))

            elif (funcion == "atan"):
                return Terminal(Tipo('decimal', math.atan(exp), self.l(math.atan(exp)), -1), math.atan(exp))

            elif (funcion == "atand"):
                return Terminal(Tipo('decimal', math.degrees(math.atan(exp)), self.l(math.degrees(math.atan(exp))), -1),
                                math.degrees(math.atan(exp)))

            elif (funcion == "cos"):
                return Terminal(Tipo('decimal', math.cos(exp), self.l(math.cos(exp)), -1), math.cos(exp))

            elif (funcion == "cosd"):
                return Terminal(Tipo('decimal', math.degrees(math.cos(exp)), self.l(math.degrees(math.cos(exp))), -1),
                                math.degrees(math.cos(exp)))

            elif (funcion == "cot"):
                return Terminal(Tipo('decimal', (1 / math.tan(exp)), self.l((1 / math.tan(exp))), -1),
                                (1 / math.tan(exp)))

            elif (funcion == "cotd"):
                return Terminal(
                    Tipo('decimal', math.degrees(1 / math.tan(exp)), self.l(math.degrees(1 / math.tan(exp))), -1),
                    math.degrees(1 / math.tan(exp)))

            elif (funcion == "sin"):

                return Terminal(Tipo('decimal', math.sin(exp), self.l(math.sin(exp)), -1), math.sin(exp))

            elif (funcion == "sind"):

                return Terminal(Tipo('decimal', math.degrees(math.sin(exp)), self.l(math.degrees(math.sin(exp))), -1),
                                math.degrees(math.sin(exp)))

            elif (funcion == "sin"):
                return Terminal(Tipo('decimal', math.sin(exp), self.l(math.sin(exp)), -1), math.sin(exp))

            elif (funcion == "sind"):
                return Terminal(Tipo('decimal', math.degrees(math.sin(exp)), self.l(math.degrees(math.sin(exp))), -1),
                                math.degrees(math.sin(exp)))

            elif (funcion == "tan"):
                return Terminal(Tipo('decimal', math.tan(exp), self.l(math.tan(exp)), -1), math.tan(exp))

            elif (funcion == "tand"):
                return Terminal(Tipo('decimal', math.degrees(math.tan(exp)), self.l(math.degrees(math.tan(exp))), -1),
                                math.degrees(math.tan(exp)))

            elif (funcion == "sinh"):
                return Terminal(Tipo('decimal', math.sinh(exp), self.l(math.sinh(exp)), -1), math.sinh(exp))

            elif (funcion == "cosh"):
                return Terminal(Tipo('decimal', math.cosh(exp), self.l(math.cosh(exp)), -1), math.cosh(exp))

            elif (funcion == "tanh"):
                return Terminal(Tipo('decimal', math.tanh(exp), self.l(math.tanh(exp)), -1), math.tanh(exp))

            elif (funcion == "asinh"):
                return Terminal(Tipo('decimal', math.asinh(exp), self.l(math.asinh(exp)), -1), math.asinh(exp))

            elif (funcion == "acosh"):
                return Terminal(Tipo('decimal', math.acosh(exp), self.l(math.acosh(exp)), -1), math.acosh(exp))

            elif (funcion == "atanh"):

                return Terminal(Tipo('decimal', math.atanh(exp), self.l(math.atanh(exp)), -1), math.atanh(exp))

            elif (funcion == "length"):
                self.leng = len(exp)
                return Terminal(Tipo('smallint', self.leng, self.l(self.leng), -1), self.leng)

            elif (funcion == "md5"):
                m = exp
                result = hashlib.md5(m.encode())
                return Terminal(Tipo('varchar', result.hexdigest(), self.l(result.hexdigest()), -1), result.hexdigest())
            elif (funcion == "sha256"):
                m = exp
                result = hashlib.sha256(m.encode()).hexdigest()
                return Terminal(Tipo('decimal', result, self.l(result), -1), result)

            elif (funcion == "convert"):
                return self.expresiones[0]
            
            elif (funcion == "trim"):
                trim = exp.strip()
                return Terminal(Tipo('varchar', trim, self.l(trim), -1), trim)




        else:
            reporteerrores.append(
                Lerrores("Error Semantico", "La funcion" + funcion + "solo recibe 2 parametros", 0, 0))
            return "Error: La funcion: " + funcion + " recibe un parametro"
Exemplo n.º 7
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.º 8
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'