Пример #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())
Пример #2
0
 def ejecutar(self, tabla, arbol):
     super().ejecutar(tabla, arbol)
     if arbol.bdUsar != None:
         objetoTabla = arbol.devolviendoTablaDeBase(self.tabla)
         if objetoTabla != 0:
             existe = None
             for columnas in objetoTabla.lista_de_campos:
                 if columnas.nombre == self.col:
                     existe = columnas
             if existe != None:
                 #print(len(listaUnique),self.tabla, self.id)
                 #Insertar llaves Unique
                 if existe.constraint != None:
                     existe.constraint.append(
                         Tipo_Constraint(None,
                                         Tipo_Dato_Constraint.NOT_NULL,
                                         None))
                     #print("MÁS DE UNA-----------------",existe.nombre, existe.tipo.toString(),len(existe.constraint))
                 else:
                     existe.constraint = []
                     existe.constraint.append(
                         Tipo_Constraint(None,
                                         Tipo_Dato_Constraint.NOT_NULL,
                                         None))
                     #print("SOLO UNA-------------",existe.nombre, existe.tipo.toString(),len(existe.constraint))
                 arbol.consola.append("Consulta devuelta correctamente.")
                 print(
                     "Consulta ALTER TABLE ALTER COLUMN devuelta correctamente"
                 )
             else:
                 #print(listaNombres,self.lista_col)
                 #print(lista)
                 error = Excepcion(
                     '42P01', "Semántico",
                     "No existe la columna «" + self.col + "» en la llave",
                     self.linea, self.columna)
                 arbol.excepciones.append(error)
                 arbol.consola.append(error.toString())
                 return error
         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())
Пример #3
0
 def ejecutar(self, tabla, arbol):
     super().ejecutar(tabla, arbol)
     if arbol.bdUsar != None:
         objetoTabla = arbol.devolviendoTablaDeBase(self.tabla)
         if objetoTabla != 0:
             tablaForanea = arbol.devolviendoTablaDeBase(self.tabla2)
             if tablaForanea != 0:
                 listaTabla1 = []
                 tabla1Nombres = []
                 for c in self.lista_id1:
                     for columnas in objetoTabla.lista_de_campos:
                         if columnas.nombre == c:
                             listaTabla1.append(columnas)
                             tabla1Nombres.append(columnas.nombre)
                 if (len(listaTabla1) == len(self.lista_id1)):
                     listaForaneas = []
                     tabla2Nombres = []
                     for c in self.lista_id2:
                         for columnas in tablaForanea.lista_de_campos:
                             if columnas.nombre == c:
                                 listaForaneas.append(columnas)
                                 tabla2Nombres.append(columnas.nombre)
                     if (len(listaForaneas) == len(self.lista_id2)):
                         listaPrimarias = 0
                         for columna in listaForaneas:
                             if columna.constraint != None:
                                 for i in columna.constraint:
                                     if i.tipo == Tipo_Dato_Constraint.PRIMARY_KEY:
                                         listaPrimarias += 1
                             else:
                                 error = Excepcion(
                                     '42P01', "Semántico",
                                     "No hay restricción unique que coincida con las columnas dadas en la tabla referida «"
                                     + self.tabla2 + "»", self.linea,
                                     self.columna)
                                 arbol.excepciones.append(error)
                                 arbol.consola.append(error.toString())
                                 return
                         if listaPrimarias == len(self.lista_id2):
                             for c in range(0, len(listaTabla1)):
                                 if listaTabla1[c].constraint != None:
                                     restriccion = Tipo_Constraint(
                                         self.id_constraint,
                                         Tipo_Dato_Constraint.FOREIGN_KEY,
                                         listaForaneas[c])
                                     restriccion.referencia = self.tabla2
                                     listaTabla1[c].constraint.append(
                                         restriccion)
                                 else:
                                     listaTabla1[c].constraint = []
                                     restriccion = Tipo_Constraint(
                                         self.id_constraint,
                                         Tipo_Dato_Constraint.FOREIGN_KEY,
                                         listaForaneas[c])
                                     restriccion.referencia = self.tabla2
                                     listaTabla1[c].constraint.append(
                                         restriccion)
                             arbol.consola.append(
                                 "Consulta devuelta correctamente.")
                         else:
                             error = Excepcion(
                                 '42P01', "Semántico",
                                 "No hay restricción unique que coincida con las columnas dadas en la tabla referida «"
                                 + self.tabla2 + "»", self.linea,
                                 self.columna)
                             arbol.excepciones.append(error)
                             arbol.consola.append(error.toString())
                             return
                     else:
                         lista = set(self.lista_id2) - set(tabla2Nombres)
                         #print(tabla2Nombres,self.lista_id2)
                         #print(lista)
                         for i in lista:
                             error = Excepcion(
                                 '42P01', "Semántico",
                                 "No existe la columna «" + i +
                                 "» en la llave", self.linea, self.columna)
                             arbol.excepciones.append(error)
                             arbol.consola.append(error.toString())
                         return
                 else:
                     lista = set(self.lista_id1) - set(tabla1Nombres)
                     #print(tabla1Nombres,self.lista_id1)
                     #print(lista)
                     for i in lista:
                         error = Excepcion(
                             '42P01', "Semántico",
                             "No existe la columna «" + i + "» en la llave",
                             self.linea, self.columna)
                         arbol.excepciones.append(error)
                         arbol.consola.append(error.toString())
                     return
             else:
                 error = Excepcion('42P01', "Semántico",
                                   "No existe la relación " + self.tabla2,
                                   self.linea, self.columna)
                 arbol.excepciones.append(error)
                 arbol.consola.append(error.toString())
                 return error
         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())
Пример #4
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())
Пример #5
0
 def ejecutar(self, tabla, arbol):
     super().ejecutar(tabla, arbol)
     if arbol.bdUsar != None:
         objetoTabla = arbol.devolviendoTablaDeBase(self.tabla)
         if objetoTabla != 0:
             existe = None
             for columnas in objetoTabla.lista_de_campos:
                 if columnas.constraint != None:
                     for const in columnas.constraint:
                         if const.id == self.id:
                             existe = True
             if existe:
                 error = Excepcion(
                     '42P01', "Semántico",
                     "la relación «" + self.id + "» ya existe", self.linea,
                     self.columna)
                 arbol.excepciones.append(error)
                 arbol.consola.append(error.toString())
                 return error
             listaUnique = []
             listaNombres = []
             for c in self.lista_col:
                 for columnas in objetoTabla.lista_de_campos:
                     if columnas.nombre == c:
                         listaUnique.append(columnas)
                         listaNombres.append(columnas.nombre)
             if (len(listaUnique) == len(self.lista_col)):
                 #print(len(listaUnique),self.tabla, self.id)
                 #Insertar llaves Unique
                 for c in listaUnique:
                     if c.constraint != None:
                         c.constraint.append(
                             Tipo_Constraint(self.id,
                                             Tipo_Dato_Constraint.UNIQUE,
                                             None))
                         #print("MÁS DE UNA-----------------",c.nombre, c.tipo.toString(),len(c.constraint))
                     else:
                         c.constraint = []
                         c.constraint.append(
                             Tipo_Constraint(self.id,
                                             Tipo_Dato_Constraint.UNIQUE,
                                             None))
                         #print("SOLO UNA-------------",c.nombre, c.tipo.toString(),len(c.constraint))
                 arbol.consola.append("Consulta devuelta correctamente.")
             else:
                 lista = set(self.lista_col) - set(listaNombres)
                 #print(listaNombres,self.lista_col)
                 #print(lista)
                 for i in lista:
                     error = Excepcion(
                         '42P01', "Semántico",
                         "No existe la columna «" + i + "» en la llave",
                         self.linea, self.columna)
                     arbol.excepciones.append(error)
                     arbol.consola.append(error.toString())
                 return
         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())