Beispiel #1
0
 def ejecutar(self, tabla, arbol):
     super().ejecutar(tabla, arbol)
     # Ambito para la tabla
     tablaLocal = Tabla(tabla)
     if arbol.bdUsar != None:
         objetoTabla = arbol.devolviendoTablaDeBase(self.tabla)
         if objetoTabla != 0:
             for columnas in objetoTabla.lista_de_campos:
                 arbol.comprobacionCreate = True
                 objeto = Declaracion(columnas.nombre, columnas.tipo, None)
                 objeto.ejecutar(tablaLocal, arbol)
             resultado = self.condicion.ejecutar(tablaLocal, arbol)
             if isinstance(resultado, Excepcion):
                 return resultado
             # Buscamos el nombre del constraint
             col = None
             for columnas in objetoTabla.lista_de_campos:
                 if columnas.nombre == arbol.columnaCheck:
                     col = columnas
                     break
             nombre = ''
             if col.constraint != None:
                 for const in columnas.constraint:
                     if const.tipo == Tipo_Dato_Constraint.CHECK:
                         nombre = const.id
                 last_char = nombre[-1]
                 sinNumero = nombre[:-1]
                 nuevo = sinNumero + str(int(last_char) + 1)
                 col.constraint.append(
                     Tipo_Constraint(nuevo, Tipo_Dato_Constraint.CHECK,
                                     self.condicion))
             else:
                 col.constraint = []
                 col.constraint.append(
                     Tipo_Constraint(
                         self.tabla + "_" + arbol.columnaCheck + "_check1",
                         Tipo_Dato_Constraint.CHECK, self.condicion))
             arbol.comprobacionCreate = False
             arbol.columnaCheck = None
             arbol.consola.append("Consulta devuelta correctamente.")
             print("Constulta ALTER CHECK devuelta correctamente")
         else:
             error = Excepcion('42P01', "Semántico",
                               "No existe la relación " + self.tabla,
                               self.linea, self.columna)
             arbol.excepciones.append(error)
             arbol.consola.append(error.toString())
             return error
     else:
         error = Excepcion("100", "Semantico",
                           "No ha seleccionado ninguna Base de Datos.",
                           self.linea, self.columna)
         arbol.excepciones.append(error)
         arbol.consola.append(error.toString())
Beispiel #2
0
    def getval(self, ent:Entorno):
        'ejecucion llamada funcinon'
        sim=ent.buscarSimbolo('_f'+self.nombre)
        if sim != None:
            tipo=sim.tipo
            defparams=sim.valor[0]
            instrucciones=sim.valor[1]
            newent=Entorno(ent)
            if self.parametros!=None and defparams!=None:
                if len(defparams)==len(self.parametros):
                    for i in range(0,len(defparams)):
                        param=defparams[i]
                        dec=Declaracion(param.nombre,False,param.tipo,self.parametros[i])
                        dec.ejecutar(newent)
                    for inst in instrucciones:
                        v=  inst.ejecutar(newent)
                        if v!=None:
                            util=Tipo('',None,-1,-1)
                            if util.comparetipo(v.tipo,tipo):
                                return v
                            else:
                                reporteerrores.append(Lerrores("Error Semantico", "Error el tipo devuelto no coincide con el de la funcion",  0, 0))
                                variables.consola.insert(INSERT, "Error el tipo devuelto no coincide con el de la funcion")

                else:
                    reporteerrores.append(Lerrores("Error Semantico","Error Los parametros no coinciden con la definicion de la funcion",0, 0))
                    variables.consola.insert(INSERT,"Error Los parametros no coinciden con la definicion de la funcion")
                    return
            else:
                for inst in instrucciones:
                    v = inst.ejecutar(newent)
                    if v != None:
                        util = Tipo('', None, -1, -1)
                        if util.comparetipo(v.tipo, tipo):
                            return v
                        else:
                            reporteerrores.append(
                                Lerrores("Error Semantico", "Error el tipo devuelto no coincide con el de la funcion",
                                         0, 0))
                            variables.consola.insert(INSERT, "Error el tipo devuelto no coincide con el de la funcion")
        else:
            reporteerrores.append(
                Lerrores("Error Semantico", "Error la funcion no existe",
                         0, 0))
            variables.consola.insert(INSERT, "Error la funcion no existe")
Beispiel #3
0
    def ejecutar(self, tabla, arbol):
        super().ejecutar(tabla, arbol)
        # Ambito para la tabla
        tablaLocal = Tabla(tabla)
        compuesta = True
        #SE VALIDA QUE SE HAYA SELECCIONADO UN BD
        if arbol.bdUsar != None:
            for camp in self.campos:
                if isinstance(camp, Tipo_Constraint):
                    tc = self.campos.pop(int(self.campos.index(camp)))
                    if tc.tipo == Tipo_Dato_Constraint.UNIQUE or tc.tipo == Tipo_Dato_Constraint.PRIMARY_KEY or tc.tipo == Tipo_Dato_Constraint.FOREIGN_KEY:
                        for id in tc.expresion:
                            bid = False
                            for ct in self.campos:
                                if ct.nombre == id:
                                    if self.campos[self.campos.index(
                                            ct)].constraint == None:
                                        self.campos[self.campos.index(
                                            ct)].constraint = []
                                        if tc.tipo == Tipo_Dato_Constraint.UNIQUE:
                                            self.campos[self.campos.index(
                                                ct)].constraint.append(
                                                    Tipo_Constraint(
                                                        self.tabla + "_" +
                                                        ct.nombre + "_pkey",
                                                        Tipo_Dato_Constraint.
                                                        UNIQUE, None))
                                        if tc.tipo == Tipo_Dato_Constraint.PRIMARY_KEY:
                                            compuesta = False
                                            self.campos[self.campos.index(
                                                ct)].constraint.append(
                                                    Tipo_Constraint(
                                                        self.tabla + "_pkey",
                                                        Tipo_Dato_Constraint.
                                                        PRIMARY_KEY, None))
                                        #if tc.tipo == Tipo_Dato_Constraint.FOREIGN_KEY:
                                        #self.campos[self.campos.index(ct)].constraint.append(Tipo_Constraint(None, Tipo_Dato_Constraint.UNIQUE, None))
                                    bid = True

                            if not bid:
                                error = Excepcion(
                                    "42P10", "Semantico",
                                    f"La columna <<{id}>> no existe, Error en el Constraint",
                                    self.linea, self.columna)
                                arbol.excepciones.append(error)
                                arbol.consola.append(error.toString())
                                return

            #SE VALIDA SI LA TABLA VA HEREDAR
            if self.herencia != None:
                #SE BUSCA LA SI LA TABLA HEREDADA EXISTE
                htabla = arbol.devolverBaseDeDatos().getTabla(self.herencia)
                if htabla != None:
                    tabla_temp = []
                    #SE RECORRE TODOS LAS COLUMNAS DE LA TABLA PARA UNIR CAMPOS REPETIDOS
                    for campo_her in htabla.lista_de_campos:
                        indice = 0
                        bandera_campo = True
                        for campo_nuevo in self.campos:
                            if campo_her.nombre == campo_nuevo.nombre:
                                tabla_temp.append(campo_nuevo)
                                arbol.consola.append(
                                    f"NOTICE: mezclando la columna <<{campo_nuevo.nombre}>> con la definición heredada."
                                )
                                self.campos.pop(indice)
                                indice += 1
                                bandera_campo = False
                                break
                        if bandera_campo:
                            tabla_temp.append(campo_her)
                    tabla_temp = tabla_temp + self.campos
                    self.campos = tabla_temp
                else:
                    error = Excepcion(
                        f"42P01", "Semantico",
                        "No existe la relación <<{self.herencia}>>.",
                        self.linea, self.columna)
                    arbol.excepciones.append(error)
                    arbol.consola.append(error.toString())
                    return
            # VERIFICACIÓN LLAVES PRIMARIAS
            listaPrimarias = []
            for camp in self.campos:
                if isinstance(camp.tipo, Tipo):
                    if camp.constraint != None:
                        for s in camp.constraint:
                            if s.tipo == Tipo_Dato_Constraint.PRIMARY_KEY:
                                listaPrimarias.append(camp)
            if len(listaPrimarias) > 1 and compuesta:
                error = Excepcion(
                    "42P16", "Semantico",
                    "No se permiten múltiples llaves primarias para la tabla «"
                    + self.tabla + "»", self.linea, self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())
                return error

            #SE CREA UN AMBITO PARA LA TABLA
            tablaNueva = Tablas(self.tabla, None)
            #SE LLENA LA TABLA EN MEMORIA
            for camp in self.campos:
                if isinstance(camp.tipo, Tipo):
                    if camp.tipo.tipo == Tipo_Dato.TIPOENUM:
                        existe = arbol.getEnum(camp.tipo.nombre)
                        if existe == None:
                            error = Excepcion(
                                '42P00', "Semántico",
                                "El tipo " + camp.tipo.nombre + " no existe",
                                self.linea, self.columna)
                            arbol.excepciones.append(error)
                            arbol.consola.append(error.toString())
                            return error
                    if camp.constraint != None:
                        for s in camp.constraint:
                            if s.tipo == Tipo_Dato_Constraint.CHECK:
                                arbol.comprobacionCreate = True
                                objeto = Declaracion(camp.nombre, camp.tipo,
                                                     s.expresion)
                                checkBueno = objeto.ejecutar(tablaLocal, arbol)
                                if not isinstance(checkBueno, Excepcion):
                                    if s.id == None:
                                        s.id = self.tabla + "_" + camp.nombre + "_" + "check1"
                                    #tablaNueva.agregarColumna(camp.nombre,camp.tipo.toString(),None, camp.constraint)
                                    #continue
                                    pass
                                else:
                                    #arbol.consola.append(checkBueno.toString())
                                    return
                            elif s.tipo == Tipo_Dato_Constraint.PRIMARY_KEY:
                                if s.id == None:
                                    s.id = self.tabla + "_pkey"
                            elif s.tipo == Tipo_Dato_Constraint.UNIQUE:
                                if s.id == None:
                                    s.id = self.tabla + "_" + camp.nombre + "_pkey"
                    tablaNueva.agregarColumna(camp.nombre, camp.tipo, None,
                                              camp.constraint)
                    #tablaNueva.lista_constraint.append(camp.constraint)
                else:
                    tablaNueva.agregarColumna(camp.nombre, camp.tipo, None,
                                              camp.constraint)
                    #tablaNueva.lista_constraint.append(camp.constraint)
            arbol.comprobacionCreate = False
            #SE CREA LA TABLA EN DISCO
            ctable = createTable(arbol.bdUsar, self.tabla, len(self.campos))

            if ctable == 0:  #CUANDO LA TABLA SE CREA CORRECTAMENTE
                arbol.consola.append(
                    f"La Tabla: <<{self.tabla}>> se creo correctamente.")
                arbol.agregarTablaABd(tablaNueva)
            elif ctable == 3:  #CUANDO LA TABLA YA EXISTE
                error = Excepcion("100", "Semantico", "La Tabla ya Existe.",
                                  self.linea, self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())
            elif ctable == 2:  #CUANDO POR ALGUN ERROR  NO SE CREA LA TABLA.
                error = Excepcion("100", "Semantico", "Error Interno.",
                                  self.linea, self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())

            # SE AGREGAN LAS LLAVES PRIMARIAS A LA TABLA
            listaIndices = []
            resultado = 0
            for i in listaPrimarias:
                listaIndices.append(tablaNueva.devolverColumna(i.nombre))
            if len(listaIndices) > 0:
                #print("SE AGREGO UN INDICE")
                resultado = alterAddPK(arbol.getBaseDatos(), self.tabla,
                                       listaIndices)
            if resultado == 1:
                error = Excepcion('XX000', "Semántico", "Error interno",
                                  self.linea, self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())
                return error
            elif resultado == 2:
                error = Excepcion(
                    '42P00', "Semántico", "La base de datos " +
                    str(arbol.getBaseDatos()) + " no existe", self.linea,
                    self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())
                return error
            elif resultado == 3:
                error = Excepcion('42P01', "Semántico",
                                  "No existe la relación " + self.tabla,
                                  self.linea, self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())
                return error
            elif resultado == 4:
                error = Excepcion(
                    '42P16', "Semántico",
                    "No se permiten múltiples llaves primarias para la tabla «"
                    + self.tabla + "»", self.linea, self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())
                return error
            elif resultado == 5:
                error = Excepcion('XX002', "Semántico",
                                  "Columna fuera de limites." + self.tabla,
                                  self.linea, self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())
                return error
        else:
            error = Excepcion("100", "Semantico",
                              "No ha seleccionado ninguna Base de Datos.",
                              self.linea, self.columna)
            arbol.excepciones.append(error)
            arbol.consola.append(error.toString())
Beispiel #4
0
    def ejecutar(self, tabla, arbol):
        super().ejecutar(tabla, arbol)
        # Ambito para la tabla
        tablaLocal = Tabla(tabla)

        #SE VALIDA QUE SE HAYA SELECCIONADO UN BD
        if arbol.bdUsar != None:
            #SE VALIDA SI LA TABLA VA HEREDAR
            if self.herencia != None:
                #SE BUSCA LA SI LA TABLA HEREDADA EXISTE
                htabla = arbol.devolverBaseDeDatos().getTabla(self.herencia)
                if htabla != None:
                    tabla_temp = []
                    #SE RECORRE TODOS LAS COLUMNAS DE LA TABLA PARA UNIR CAMPOS REPETIDOS
                    for campo_her in htabla.lista_de_campos:
                        indice = 0
                        bandera_campo = True
                        for campo_nuevo in self.campos:
                            if campo_her.nombre == campo_nuevo.nombre:
                                tabla_temp.append(campo_nuevo)
                                arbol.consola.append(
                                    f"NOTICE: mezclando la columna <<{campo_nuevo.nombre}>> con la definición heredada."
                                )
                                self.campos.pop(indice)
                                indice += 1
                                bandera_campo = False
                                break
                        if bandera_campo:
                            tabla_temp.append(campo_her)
                    tabla_temp = tabla_temp + self.campos
                    self.campos = tabla_temp
                else:
                    error = Excepcion(
                        f"42P01", "Semantico",
                        "No existe la relación <<{self.herencia}>>.",
                        self.linea, self.columna)
                    arbol.excepciones.append(error)
                    arbol.consola.append(error.toString())
                    return
            #SE CREA UN AMBITO PARA LA TABLA
            tablaNueva = Tablas(self.tabla, None)
            #SE LLENA LA TABLA EN MEMORIA
            for camp in self.campos:
                if isinstance(camp.tipo, Tipo):
                    if camp.constraint != None:
                        for s in camp.constraint:
                            if s.tipo == Tipo_Dato_Constraint.CHECK:
                                objeto = Declaracion(camp.nombre, camp.tipo,
                                                     s.expresion)
                                checkBueno = objeto.ejecutar(tablaLocal, arbol)
                                if not isinstance(checkBueno, Excepcion):
                                    #tablaNueva.agregarColumna(camp.nombre,camp.tipo.toString(),None, camp.constraint)
                                    #continue
                                    pass
                                else:

                                    #arbol.consola.append(checkBueno.toString())
                                    return
                    tablaNueva.agregarColumna(camp.nombre,
                                              camp.tipo.toString(), None,
                                              camp.constraint)
                else:
                    tablaNueva.agregarColumna(camp.nombre, camp.tipo, None,
                                              camp.constraint)
            #SE CREA LA TABLA EN DISCO
            ctable = createTable(arbol.bdUsar, self.tabla, len(self.campos))

            if ctable == 0:  #CUANDO LA TABLA SE CREA CORRECTAMENTE
                arbol.consola.append(
                    f"La Tabla: <<{self.tabla}>> se creo correctamente.")
                arbol.agregarTablaABd(tablaNueva)
            elif ctable == 3:  #CUANDO LA TABLA YA EXISTE
                error = Excepcion("100", "Semantico", "La Tabla ya Existe.",
                                  self.linea, self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())
            elif ctable == 2:  #CUANDO POR ALGUN ERROR  NO SE CREA LA TABLA.
                error = Excepcion("100", "Semantico", "Error Interno.",
                                  self.linea, self.columna)
                arbol.excepciones.append(error)
                arbol.consola.append(error.toString())
        else:
            error = Excepcion("100", "Semantico",
                              "No ha seleccionado ninguna Base de Datos.",
                              self.linea, self.columna)
            arbol.excepciones.append(error)
            arbol.consola.append(error.toString())