def cmd_alterDropColumn(self, database, table, nombreColumna): numeroColumna = self.tabla.devolverPosicionCampos( database, table, nombreColumna) if numeroColumna > 1: if existeCampo(nombreColumna, table, database) == 1: self.tabla.eliminarCampo_TS(database, table, nombreColumna) condb.alterDropColumn(database, table, numeroColumna) print('verificar MEtodo plox')
def createColumnTable(self, database: Database, table: Table, column: Column, noLine, noColumn): """ Method to create a column in table :param database: Table database :param table: The name of table :param column: Number of columns :param noLine: The instruction line :param noColumn: The instruction column :return: Returns nothing """ dbStatement = jsonMode.alterAddColumn(database.name, table.name, column.default) if dbStatement == 0: if not self.searchColumn(table, column.name): if len(table.columns) > 0: column.number = table.columns[-1].number + 1 table.columns.append(column) self.writeFile() print('Table updated successfully') return jsonMode.alterDropColumn(database.name, table.name, column.number) desc = f": Column {column.name} already exists" ErrorController().addExecutionError(29, 'Execution', desc, noLine, noColumn) elif dbStatement == 1: desc = f": Can't update table {table.name}" ErrorController().addExecutionError(34, 'Execution', desc, noLine, noColumn) elif dbStatement == 2: desc = f": Database {database.name} does not exist" ErrorController().addExecutionError(35, 'Execution', desc, noLine, noColumn) elif dbStatement == 3: desc = f": Table {table.name} does not exist" ErrorController().addExecutionError(27, 'Execution', desc, noLine, noColumn)
def EAltTbAlterDropCol(): cargarMemoria() #llamar la funcion de EDD if (len(listaMemoria) > 0): res = EDD.alterDropColumn(listaMemoria[0][0], listaMemoria[0][1], listaMemoria[0][3]) print("Eliminando en Tabla:" + listaMemoria[0][1]) print("\tDROP COLUMN:" + listaMemoria[0][2]) print("\tResultado de la eliminacion de la columna:" + str(res)) listaMemoria.pop(0)
def execute(self, environment,tableName): if not isinstance(self.columnName,str): return {'Error': 'El nombre indicado de la columna no es una cadena.', 'Fila':self.row, 'Columna': self.column } if not isinstance(tableName,str): return {'Error': 'El nombre indicado de la tabla no es una cadena.', 'Fila':self.row, 'Columna': self.column } db_name = environment.getActualDataBase() database = environment.readDataBase(db_name) table = database.getTable(tableName) if table == None: return {'Error': 'la tabla: '+ tableName +'no existe en la base de datos: '+db_name, 'Fila':self.row, 'Columna': self.column } index = -1 for i in range(len(table.columns)): if table.columns[i].name == self.columnName: index = i break if index == -1: return {'Error': 'la columna: '+ self.columnName +'no existe en la tabla: '+tableName, 'Fila':self.row, 'Columna': self.column } result = admin.alterDropColumn(db_name, tableName, index) if result == 0: for item in table.constraint: if item['type'] == 'primary': if item['value'] == self.columnName: return {'Error': 'la columna: '+ self.columnName +'no puede eliminarse ya que es una llave primaria de la tabla', 'Fila':self.row, 'Columna': self.column } columnDelete = table.deleteConstraint(self.columnName) while columnDelete == True: columnDelete = table.deleteConstraint(self.columnName) table.deleteColumn(self.columnName) #falta borrar los checks return 'se elimino correctamente la columna: '+self.columnName+' en la tabla: '+tableName elif result == 1: return {'Error': 'Error al ejecutar la operacion drop column', 'Fila':self.row, 'Columna': self.column } elif result == 2: return {'Error': 'La base de datos a la que hace referencia no existe', 'Fila':self.row, 'Columna': self.column } elif result == 3: return {'Error': 'La tabla: '+tableName+' no existe', 'Fila':self.row, 'Columna': self.column } elif result == 4: return {'Error': 'Llave no puede eliminarse o tabla quedarse sin columnas', 'Fila':self.row, 'Columna': self.column } elif result == 5: return {'Error': 'Columna fuera de limites', 'Fila':self.row, 'Columna': self.column } else: return {'Error': 'Error desconocido en el drop column', 'Fila':self.row, 'Columna': self.column }
def deleteColumn(self, database: Database, table: Table, column: Column, noLine, noColumn): """ Method to remove a column in table :param database: Table database :param table: The name of table :param column: Number of columns :param noLine: The instruction line :param noColumn: The instruction column :return: Returns nothing """ dbStatement = jsonMode.alterDropColumn(database.name, table.name, column.number) if dbStatement == 0: if column: table.remove(column) self.writeFile() print('Column deleted successfully') return desc = f": Column {column.name} does not exist" ErrorController().addExecutionError(26, 'Execution', desc, noLine, noColumn) elif dbStatement == 1: desc = f": Can't update Table {table.name}" ErrorController().addExecutionError(34, 'Execution', desc, noLine, noColumn) elif dbStatement == 2: desc = f": Database {database.name} does not exist" ErrorController().addExecutionError(35, 'Execution', desc, noLine, noColumn) elif dbStatement == 3: desc = f": Table {table.name} does not exist" ErrorController().addExecutionError(27, 'Execution', desc, noLine, noColumn) elif dbStatement == 4: print('Out of range column')
def ejecutar(self, ent: Entorno): dbActual = ent.getDataBase() if dbActual != None: tablaAlterada: Simbolo = ent.buscarSimbolo(self.tabla + "_" + dbActual) if tablaAlterada != None: for opcionX in self.opciones: if opcionX.tipoAlter == TipoAlter.ADDCOLUMNA: addColumna: AddColumn = opcionX res = DBMS.alterAddColumn(dbActual, self.tabla, None) if res == 0: nuevaCol: Simbolo = Simbolo( addColumna.tipo, addColumna.id) nuevaCol.tabla = self.tabla nuevaCol.baseDatos = dbActual tablaAlterada.valor.append(nuevaCol) e = ent.editarSimbolo(self.tabla + "_" + dbActual, tablaAlterada) if e == "ok": variables.consola.insert( INSERT, "Se agregó nueva columna '" + str(addColumna.id) + "' a la tabla '" + str(self.tabla) + "'\n") else: reporteerrores.append( Lerrores( "Error Semantico", "No se ha podido agregar la columna '" + addColumna.id + "' a la tabla " + self.tabla, 0, 0)) variables.consola.insert( INSERT, "No se ha podido agregar la columna '" + addColumna.id + "' a la tabla ") elif opcionX.tipoAlter == TipoAlter.ADDCHECK: #formato: C_database_tabla_nombreColumna addCheck: AddCheck = opcionX nombreColCheck: str = str( addCheck.condicion.exp1.valor) for col in tablaAlterada.valor: if col.nombre == nombreColCheck: idCheck: str = str("C_" + dbActual + "_" + self.tabla + "_" + col.nombre) if addCheck.constraint != None: idCheck += "_" + str(addCheck.constraint) col.atributos.update({'check': idCheck}) nuevoSym: Simbolo = Simbolo( TipoSimbolo.CONSTRAINT_CHECK, idCheck, addCheck.condicion) nuevoSym.baseDatos = dbActual nuevoSym.tabla = self.tabla ent.nuevoSimbolo(nuevoSym) variables.consola.insert( INSERT, "Condición check agegada en columna '" + str(col.nombre) + "' en la tabla '" + str(self.tabla) + "'\n") break elif opcionX.tipoAlter == TipoAlter.ADDUNIQUE: addUnique: AddUnique = opcionX for add in addUnique.columnas: for col in tablaAlterada.valor: if col.nombre == add.valor: idUnique: str = str("U_" + dbActual + "_" + self.tabla + "_" + col.nombre) if addUnique.constraint != None: idUnique += "_" + str( addUnique.constraint) col.atributos.update({'unique': idUnique}) nuevoSym: Simbolo = Simbolo( TipoSimbolo.CONSTRAINT_UNIQUE, idUnique, col.nombre) nuevoSym.baseDatos = dbActual nuevoSym.tabla = self.tabla ent.nuevoSimbolo(nuevoSym) variables.consola.insert( INSERT, "Condición Unique agregada en columna '" + str(col.nombre) + "' en la tabla '" + str(self.tabla) + "'\n") elif opcionX.tipoAlter == TipoAlter.ADDFOREIGN: addForeign: AddForeign = opcionX tablaReferenciada: Simbolo = ent.buscarSimbolo( addForeign.referenceTable + "_" + dbActual) if tablaReferenciada != None: if len(addForeign.colAddForeign) == len( addForeign.colReferences): idFk: str = str("FK_" + dbActual + "_" + self.tabla + "_" + addForeign.referenceTable) if addForeign.constraint != None: idFk += "_" + addForeign.constraint n: Simbolo = Simbolo( TipoSimbolo.CONSTRAINT_FOREIGN, idFk) n.baseDatos = dbActual n.tabla = self.tabla ent.nuevoSimbolo(n) variables.consola.insert( INSERT, "Llave Foránea referenciando a tabla '" + str(addForeign.referenceTable) + "' en la tabla '" + str(self.tabla) + "'\n") else: variables.consola.insert( INSERT, "La cantidad de columnas no coinciden en llave foránea de la tabla '" + str(self.tabla) + "'\n") reporteerrores.append( Lerrores( "Error Semántico", "La cantidad de columnas no coinciden en llave foránea de tabla '" + self.tabla + "'", "", "")) elif opcionX.tipoAlter == TipoAlter.ADDNULL: addNulo: AddNull = opcionX for col in tablaAlterada.valor: if col.nombre == addNulo.columna: if addNulo.nulo: #setea a nulos col.atributos.update({'null': True}) else: col.atributos.update({'not null': True}) break elif opcionX.tipoAlter == TipoAlter.DROPCONSTRAINT: #formato : CONSTRAINT_database_tabla_nombreCol_idConstraint dropConstr: DropConstraint = opcionX opcConstraint = ["C", "U", "F", "P"] constr = ['check', 'unique', 'foreign', 'primary'] encontrado = False concat: str = "_" + dbActual + "_" + self.tabla + "_" for col in tablaAlterada.valor: for x in range(len(opcConstraint)): idCo: str = opcConstraint[ x] + concat + col.nombre + "_" + dropConstr.constraint r: Simbolo = ent.buscarSimbolo(idCo) if r != None: encontrado = True ent.eliminarSimbolo(idCo) del col.atributos[constr[x]] variables.consola.insert( INSERT, "El constraint '" + str(dropConstr.constraint) + "' ha sido eliminado\n") break if not encontrado: variables.consola.insert( INSERT, "El constraint '" + str(dropConstr.constraint) + "' no existe'\n") reporteerrores.append( Lerrores( "Error Semántico", "El constraint '" + str(dropConstr.constraint) + "' no existe", "", "")) elif opcionX.tipoAlter == TipoAlter.ALTERTYPE: alterTipo: AlterType = opcionX for col in tablaAlterada.valor: if col.nombre == alterTipo.columna: col.tipo = alterTipo.nuevoTipo variables.consola.insert( INSERT, "El tipo de la columna '" + str(col.nombre) + "' de la tabla '" + self.tabla + "' cambió a '" + col.tipo.tipo + "'\n") return elif opcionX.tipoAlter == TipoAlter.RENAMECOLUMN: rCol: RenameColumn = opcionX for col in tablaAlterada.valor: if col.nombre == rCol.oldColumn: col.nombre = rCol.newColumn variables.consola.insert( INSERT, "El nombre de la columna '" + str(rCol.oldColumn) + "' de la tabla '" + self.tabla + "' cambió a '" + str(rCol.newColumn) + "'\n") return elif opcionX.tipoAlter == TipoAlter.DROPCHECK: dChe: DropCheck = opcionX for col in tablaAlterada.valor: idd = "C_" + dbActual + "_" + self.tabla + "_" + str( col.nombre) + "_" + dChe.iden r: Simbolo = ent.buscarSimbolo(idd) if r != None: ent.eliminarSimbolo(idd) variables.consola.insert( INSERT, "Se ha eliminado la condición check '" + str(dChe.iden) + "'\n") break elif opcionX.tipoAlter == TipoAlter.DROPCOLUMN: index = [] dropC: DropColumns = opcionX for drop in dropC.columnas: for x in range(len(tablaAlterada.valor)): if tablaAlterada.valor[x].nombre == drop.valor: r = DBMS.alterDropColumn( dbActual, self.tabla, x) if r == 0: for z in tablaAlterada.valor[ x].atributos.values(): ent.eliminarSimbolo(z) variables.consola.insert( INSERT, "Se ha eliminado la columna '" + str(drop.valor) + "' de la tabla '" + str(self.tabla) + "'\n") index.append(x) for g in index: tablaAlterada.valor.pop(g) ent.editarSimbolo(self.tabla + "_" + dbActual, tablaAlterada)