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.") print(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 getval(self, ent: Entorno, err=1): '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\n" ) 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\n" ) 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\n" ) else: if err == 1: reporteerrores.append( Lerrores( "Error Semantico", "Error la funcion '" + self.nombre + "' no existe", 0, 0)) variables.consola.insert( INSERT, "Error la funcion '" + self.nombre + "' no existe\n")