def agregar_tabla(self, tabla, listaDescripciones): # Definir tabla temporal tab = Tabla(tabla, self) # Revisar si la tabla ya existe if tab in self.tablas: self.log.error("La tabla '"+tabla+"' ya existe en la base de datos '"+self.getNombre()+"'.") raise TableAlreadyExistException(tabla, self) # Validar que la definicion de tabla no tenga errores de tipo # Separar constraints de columnas listaColumnas = [] listaConstraints = [] for desc in listaDescripciones: if type(desc) == AST.Columna: listaColumnas.append(desc) # Revisar si tiene constrains la columna if len(desc[2]) > 0: listaConstraints.append(desc) else: listaConstraints.append(desc) # Revisión de columnas for columna in listaColumnas: # Agregar columnas a la tabla tab.agregar_columna(columna[0], columna[1][0], (columna[1][1] if columna[1][0] == 'CHAR' else None)) # Revisión constraints for restriccion in listaConstraints: if type(restriccion) == AST.Columna: # Revisar cada restricción corta for restriccionCorta in restriccion[2]: tipo = restriccionCorta[0] if restriccionCorta[0] == 'CHECK' else ( "PRIMARY KEY" if restriccionCorta[0] == 'PRIMARY' else "FOREIGN KEY") nombre = tab.generar_nombre(tipo) if tipo == 'CHECK': tab.agregar_chequeo(nombre, restriccionCorta[1], requerido=restriccion[0]) elif tipo == 'PRIMARY KEY': tab.agregar_clave_primaria(nombre, [restriccion[0]]) else: tab.agregar_clave_foranea(nombre, [restriccion[0]], restriccionCorta[1], [restriccionCorta[2]]) else: # Agregar alguna de las restricciones validas tipo = restriccion[0] if restriccion[0] == 'CHECK' else (restriccion[0] + " KEY") nombre = restriccion[1] if tipo == 'CHECK': tab.agregar_chequeo(nombre, restriccion[2]) elif tipo == 'PRIMARY KEY': tab.agregar_clave_primaria(nombre, restriccion[2]) else: tab.agregar_clave_foranea(nombre, restriccion[2], restriccion[3], restriccion[4]) # Crear archivo vacio para la tabla path = self.getPath() + tabla + '.tbl' with open(path, 'w') as archivo: archivo.write('') # Agregar al archivo de metadatos de bases de datos self.escribir_tabla(tab) # Agregar a la base de datos al manejador self.tablas.append(tab) self.cantTablas = len(self.tablas) # Agregar el archivo al archivo de metadatos del manejador self.manejador.actualizar_base_de_datos(self) # Mostrar mensaje de éxito self.log.info("Tabla '"+tabla+"' creada.")
def agregar_tabla(self, tabla, listaDescripciones): # Definir tabla temporal tab = Tabla(tabla, self) # Revisar si la tabla ya existe if tab in self.tablas: self.log.error("La tabla '" + tabla + "' ya existe en la base de datos '" + self.getNombre() + "'.") raise TableAlreadyExistException(tabla, self) # Validar que la definicion de tabla no tenga errores de tipo # Separar constraints de columnas listaColumnas = [] listaConstraints = [] for desc in listaDescripciones: if type(desc) == AST.Columna: listaColumnas.append(desc) # Revisar si tiene constrains la columna if len(desc[2]) > 0: listaConstraints.append(desc) else: listaConstraints.append(desc) # Revisión de columnas for columna in listaColumnas: # Agregar columnas a la tabla tab.agregar_columna( columna[0], columna[1][0], (columna[1][1] if columna[1][0] == 'CHAR' else None)) # Revisión constraints for restriccion in listaConstraints: if type(restriccion) == AST.Columna: # Revisar cada restricción corta for restriccionCorta in restriccion[2]: tipo = restriccionCorta[0] if restriccionCorta[ 0] == 'CHECK' else ( "PRIMARY KEY" if restriccionCorta[0] == 'PRIMARY' else "FOREIGN KEY") nombre = tab.generar_nombre(tipo) if tipo == 'CHECK': tab.agregar_chequeo(nombre, restriccionCorta[1], requerido=restriccion[0]) elif tipo == 'PRIMARY KEY': tab.agregar_clave_primaria(nombre, [restriccion[0]]) else: tab.agregar_clave_foranea(nombre, [restriccion[0]], restriccionCorta[1], [restriccionCorta[2]]) else: # Agregar alguna de las restricciones validas tipo = restriccion[0] if restriccion[0] == 'CHECK' else ( restriccion[0] + " KEY") nombre = restriccion[1] if tipo == 'CHECK': tab.agregar_chequeo(nombre, restriccion[2]) elif tipo == 'PRIMARY KEY': tab.agregar_clave_primaria(nombre, restriccion[2]) else: tab.agregar_clave_foranea(nombre, restriccion[2], restriccion[3], restriccion[4]) # Crear archivo vacio para la tabla path = self.getPath() + tabla + '.tbl' with open(path, 'w') as archivo: archivo.write('') # Agregar al archivo de metadatos de bases de datos self.escribir_tabla(tab) # Agregar a la base de datos al manejador self.tablas.append(tab) self.cantTablas = len(self.tablas) # Agregar el archivo al archivo de metadatos del manejador self.manejador.actualizar_base_de_datos(self) # Mostrar mensaje de éxito self.log.info("Tabla '" + tabla + "' creada.")