class TableModule: def __init__(self): self.handler = Handler() def createTable(self, database: str, table: str, numberColumns: int) -> int: try: if not self.handler.siExiste(database, table): databases = self.handler.leerArchivoDB() for i in databases: if database == i.name: i.tablesName.append(str(table)) self.handler.actualizarArchivoDB(databases) self.handler.actualizarArchivoTB( AVLTree(database, table, numberColumns, []), database, table) return 0 return 2 return 3 except: return 1 def showTables(self, database: str) -> list: try: databases = self.handler.leerArchivoDB() for i in databases: if database == i.name: return i.tablesName return None except: return None def extractTable(self, database: str, table: str) -> list: try: if self.handler.siExiste(database, table): tmp = [] avl = self.handler.leerArchivoTB(database, table) if avl.root != None: tmp = avl.toList() return tmp else: return None except: return None def extractRangeTable(self, database: str, table: str, columnNumber: int, lower: any, upper: any) -> list: try: if self.handler.siExiste(database, table): tmp = [] avl = self.handler.leerArchivoTB(database, table) if avl.root: for i in avl.toList(): if type(i[columnNumber]) == type(3): if int(i[columnNumber]) >= int(lower) and int( i[columnNumber]) <= int(upper): tmp.append(i) elif type(i[columnNumber]) == type("string"): if str(i[columnNumber]) >= str(lower) and str( i[columnNumber]) <= str(upper): tmp.append(i) elif type(i[columnNumber]) == type(3.1): if float( i[columnNumber]) >= float(lower) and float( i[columnNumber]) <= float(upper): tmp.append(i) elif type(i[columnNumber]) == type(True): if bool(i[columnNumber]) >= bool(lower) and bool( i[columnNumber]) <= bool(upper): tmp.append(i) return tmp else: return None except: return None def alterAddPK(self, database: str, table: str, columns: list) -> int: try: databases = self.handler.leerArchivoDB() for i in databases: if database == i.name: if self.handler.siExiste(database, table): avl = self.handler.leerArchivoTB(database, table) if avl.pklist == []: for j in columns: if j < 0 or j >= avl.numberColumns: return 5 if avl.root == None: avl.pklist = columns return 0 else: temporal = [] for tupla in avl.toList(): tmp2 = "" for key in columns: tmp2 += "-" + str(tupla[key]) tmp2.pop(0) if tmp2 in temporal: return 1 temporal.append(tmp2) newAvl = AVLTree(database, table, avl.numberColumns, columns) for tupla in avl.toList(): newAvl.add(tupla) self.handler.actualizarArchivoTB( newAvl, database, table) return 0 else: return 4 else: return 3 return 2 except: return 1 def alterDropPK(self, database: str, table: str) -> int: try: databases = self.handler.leerArchivoDB() for i in databases: if database == i.name: if self.handler.siExiste(database, table): avl = self.handler.leerArchivoTB(database, table) if avl.pklist != []: avl.pklist = [] else: return 4 else: return 3 return 2 except: return 1 def alterAddFK(self, database: str, table: str, references: dict) -> int: #para fase 2 pass def alterAddIndex(self, database: str, table: str, references: dict) -> int: #para fase 2 pass def alterTable(self, database: str, tableOld: str, tableNew: str) -> int: try: databases = self.handler.leerArchivoDB() for i in databases: if database == i.name: if not self.handler.siExiste(database, tableNew): if self.handler.siExiste(database, tableOld): for j in range(len(i.tablesName)): if i.tablesName[j] == tableOld: i.tablesName[j] = tableNew self.handler.actualizarArchivoDB(databases) avl = self.handler.leerArchivoTB( database, tableOld) avl.name = tableNew self.handler.renombrarArchivo( str(tableOld) + '-' + str(database) + '.tbl', str(tableNew) + '-' + str(database) + '.tbl') return 0 else: return 3 else: return 4 return 2 except: return 1 def alterAddColumn(self, database: str, table: str, default: any) -> int: try: databases = self.handler.leerArchivoDB() for i in databases: if database == i.name: if self.handler.siExiste(database, table): avl = self.handler.leerArchivoTB(database, table) avl.numberColumns += 1 avl.addColumn(default) return 0 else: return 3 return 2 except: return 1 def alterDropColumn( self, database: str, table: str, columnNumber: int ) -> int: #no se puede eliminar una columna que sea llave primaria (validar) try: databases = self.handler.leerArchivoDB() for i in databases: if database == i.name: if self.handler.siExiste(database, table): avl = self.handler.leerArchivoTB(database, table) if columnNumber > avl.numberColumns or columnNumber < 0: return 5 elif columnNumber == avl.numberColumns or columnNumber in avl.pklist: return 4 else: avl.numberColumns -= 1 avl.dropColumn(columnNumber) return 0 else: return 3 return 2 except: return 1 def dropTable(self, database: str, table: str) -> int: try: databases = self.handler.leerArchivoDB() for i in databases: if database == i.name: if self.handler.siExiste(database, table): i.tablesName.remove(table) self.handler.actualizarArchivoDB(databases) self.handler.borrarArchivo( str(table) + '-' + str(database) + '.tbl') return 0 else: return 3 return 2 except: return 1
class TupleModule: def __init__(self): self.handler = Handler() def insert(self, database: str, table: str, register: list) -> int: try: listaBases = self.handler.leerArchivoDB() existe = False for base in listaBases: if database == base.name: existe = True break if existe == True: tabla = self.handler.siExiste(database, table) if tabla == True: tempAVL = self.handler.leerArchivoTB(database, table) # lista que almacena las columnas que son PK en el parametro auxPk = "" for i in range(len(register)): if str(i) in tempAVL.pklist: if i == 0: auxPk = register[i] else: auxPk = auxPk + "-" + register[i] if len( register ) > tempAVL.numberColumns: # más parametros de los esperado en register return 5 elif tempAVL.find(auxPk) is None: # PK repetida return 4 else: if len(tempAVL.pklist) < 0: tempAVL.add(auxPk, register) # cuando no exista PK else: tempAVL.add(tempAVL.pklist, register) # Cuando existe PK # export table self.handler.actualizarArchivoTB( tempAVL, database, table) return 0 else: return 3 else: return 2 except: return 1 def loadCSV(self, file: str, database: str, table: str) -> list: try: # validando ruta y extención del archivo if file.endswith(".csv") is False: return [None] archivo = open(file, "r") lector = csv.reader(archivo) dbList = self.handler.leerArchivoDB() existeDB = False existeTable = False for db in dbList: if db.name == database: existeDB = True break existeTable = self.handler.leerArchivoTB(database, table) if existeTable is True and existeDB is True: tempAvl = self.handler.leerArchivoTB(database, table) result = [] for columna in lector: if len(columna) <= tempAvl.numberColumns: result.append(self.insert(database, table, columna)) self.handler.actualizarArchivoTB(tempAvl, database, table) return result elif existeDB is False: return [2] else: return [3] except: return [None] def extractRow(self, database: str, table: str, columns: list) -> list: try: dbList = self.handler.leerArchivoDB() existeDB = False existeTable = False for db in dbList: if db.name == database: existeDB = True break existeTable = self.handler.leerArchivoTB(database, table) if existeTable is True and existeDB is True: tempAvl = self.handler.leerArchivoTB(database, table) auxStr = "" for el in columns: if el == columns[0]: auxStr = str(el) else: auxStr = auxStr + "-" + str(el) foundNode = tempAvl.find(auxStr) if foundNode is not None: return foundNode.content else: return [4] elif existeDB is False: return [2] else: return [3] except: return [1] def update(self, database: str, table: str, register: dict, columns: list) -> int: try: dbList = self.handler.leerArchivoDB() existeDB = False existeTable = False for db in dbList: if db.name == database: existeDB = True break existeTable = self.handler.leerArchivoTB(database, table) if existeTable is True and existeDB is True: tempAvl = self.handler.leerArchivoTB(database, table) auxStr = "" for el in columns: if el == columns[0]: auxStr = str(el) else: auxStr = auxStr + "-" + str(el) foundNode = tempAvl.find(auxStr) if foundNode is not None: if len(register) <= tempAvl.numberColumns: newContent = tempAvl.content for key in register: newContent[key] = register[key] # actualizas el nodo auxStr-> concatenacion de las llaves y el newContent -> lista del content tempAvl.update(auxStr, newContent) self.handler.actualizarArchivoTB( tempAvl, database, table) return 0 else: return 1 else: return 4 elif existeDB is False: return 2 else: return 3 except: return 1 def delete(self, database: str, table: str, columns: list) -> int: try: listaBases = self.handler.leerArchivoDB() existe = False for base in listaBases: if database == base.name: existe = True break tabla = self.handler.siExiste(database, table) if existe is False: return 2 elif tabla is False: return 3 elif tabla is True and existe is True: tempAVL = self.handler.leerArchivoTB(database, table) if tempAVL.find(columns) is None: keyAux = "" for i in range(len(columns)): if i == 0: keyAux = columns[i] else: keyAux = keyAux + "-" + columns[i] tempAVL.delete(keyAux) self.handler.actualizarArchivoTB(tempAVL, database, table) return 0 else: return 4 except: return 1 def truncate(self, database: str, table: str) -> int: try: listaBases = self.handler.leerArchivoDB() existe = False for base in listaBases: if database == base.name: existe = True break if existe == True: tabla = self.handler.siExiste(database, table) if tabla == True: tempAVL = self.handler.leerArchivoTB(database, table) newAvl = AVLTree(database, table, tempAVL.numberColumns, tempAVL.pklist) self.handler.actualizarArchivoTB(newAvl, database, table) return 0 else: return 3 else: return 2 except: return 1