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