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())
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())
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())
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())
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())