def search_index(self, name): for index, c in enumerate(SymbolTable().getList()): if c.value == name and c.dataType == 'Index': # print('Entro') del SymbolTable().getList()[index] return True return False
def search_index(self, name, new_name): for index, c in enumerate(SymbolTable().getList()): if c.value == name and c.dataType == 'Index' and new_name != None: # print('Entro') SymbolTable().getList()[index].name.variable = new_name SymbolTable().getList()[index].value = new_name return True return False
def __init__(self): self._symbolTable = SymbolTable() self._data = '' self.generateReport() report = open('symbolTable.dot', 'w') report.write(self._data) report.close() os.system('dot -Tpdf symbolTable.dot -o symbolTable.pdf')
def rename_column(self, name, column): for index, c in enumerate(SymbolTable().getList()): if c.value == name and c.dataType == 'Index' and column != None: if isinstance(column, int): SymbolTable().getList( )[index].name.list_column_reference[0] = 'Changed Column' return True else: SymbolTable().getList( )[index].name.list_column_reference[0] = column return True return False
def agregarCheck(self, conditionColumn, tablaId): typeChecker = TypeChecker() bandera = False tableToAlter = typeChecker.searchTable(SymbolTable().useDatabase, tablaId) # L (L|D)* whatColumnIs = re.search('[a-zA-z]([a-zA-z]|[0-9])*', conditionColumn.alias) if whatColumnIs != None: whatColumnIs = whatColumnIs.group(0) for columna in tableToAlter.columns: if (columna._name == whatColumnIs): bandera = True columna._check = conditionColumn.alias break if not bandera: desc = f": Undefined column in alter check ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False else: desc = f": column not given in check()" ErrorController().add(26, 'Execution', desc, 0, 0) return typeChecker.writeFile()
def deleteDatabase(self, name: str, line, column): """ Method to remove a database in type checker :param name: The name of the database :param line: The instruction line :param column: The instruction column :return: Returns nothing """ dbStatement = jsonMode.dropDatabase(name) if dbStatement == 0: database = self.searchDatabase(name) self._typeCheckerList.remove(database) self.writeFile() SymbolTable().delete(database) print('Database deleted successfully') elif dbStatement == 1: desc = f": Can't drop database {name}" ErrorController().addExecutionError(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {name} does not exist" ErrorController().addExecutionError(35, 'Execution', desc, line, column)
def createDatabase(self, database: str, line, column): """ Method to create a database in type checker :param database: The name of database :param line: The instruction line :param column: The instruction column :return: Returns nothing """ dbStatement = jsonMode.createDatabase(database) if dbStatement == 0: db = Database(database) self._typeCheckerList.append(db) self.writeFile() SymbolTable().add(db, 'New Database', 'Database', 'Global', None, line, column) print('Database created successfully') # Query returned successfully in # secs # msec. elif dbStatement == 1: desc = f": Can't create database {database}" ErrorController().addExecutionError(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {database} already exists" ErrorController().addExecutionError(30, 'Execution', desc, line, column)
def agregarNuevoTipo(self, tablaAMod, colAMod, nuevoTipo): typeChecker = TypeChecker() bandera = False tableToAlter = typeChecker.searchTable(SymbolTable().useDatabase, tablaAMod) tipoFinal = { '_tipoColumna': str(nuevoTipo._tipoColumna), '_paramOne': nuevoTipo._paramOne, '_paramTwo': nuevoTipo._paramTwo } for columna in tableToAlter.columns: if (columna._name == colAMod): bandera = True columna._dataType = tipoFinal break if not bandera: desc = f": Undefined column in alter type ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False typeChecker.writeFile() pass
def deleteDatabase(self, name: str, line, column): """ Method to remove a database in type checker :param name: The name of the database :param line: The instruction line :param column: The instruction column :return: Returns nothing """ database = self.searchDatabase(name) if not database: desc = f": Database {name} does not exist" ErrorController().add(35, 'Execution', desc, line, column) return dbStatement = data_mode.mode(database.mode).dropDatabase(name.lower()) if dbStatement == 0: self._typeCheckerList.remove(database) self.writeFile() SymbolTable().delete(database) DataWindow().consoleText( 'Query returned successfully: Database deleted') elif dbStatement == 1: desc = f": Can't drop database {name}" ErrorController().add(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {name} does not exist" ErrorController().add(35, 'Execution', desc, line, column)
def compile(self, environment): database_id = SymbolTable().useDatabase #ejecutando si hay llamada a alguna funcion temps_array = [] for value in self.arr_values: if isinstance(value, Funcion): temps_array.append(value.compile(environment)) new_val = putVarValues(self._tac, temps_array, environment) temp = '' if new_val == self._tac: #Es un temporal --- quitar comillas temp = ThreeAddressCode().newTemp() if database_id is not None: ThreeAddressCode().addCode(f"{temp} = \"USE {database_id}; {new_val}\"") else: ThreeAddressCode().addCode(f"{temp} = \"{new_val}\"") else: temp = new_val #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})") return temp1
def extractTable(self, name: str, noLine, noColumn) -> list: """ Method to get a list of records from a table :param name: The name of table :param noLine: The instruction line :param noColumn: The instruction column :return: Returns a list of records """ database = SymbolTable().useDatabase if not database: desc = f": Database not selected" ErrorController().add(4, 'Execution', desc, noLine, noColumn) return None if not TypeChecker().searchTable(database, name): desc = f": Table {name} does not exist" ErrorController().add(27, 'Execution', desc, noLine, noColumn) return None data = data_mode.mode(database.mode).extractTable( database.name.lower(), name.lower()) if data == None: ErrorController().add(34, 'Execution', '', noLine, noColumn) return None return data
def createDatabase(self, database: Database, line, column): """ Method to create a database in type checker :param database: Database object :param line: The instruction line :param column: The instruction column :return: Returns nothing """ if self.searchDatabase(database.name): desc = f": Database {database.name} already exists" ErrorController().add(30, 'Execution', desc, line, column) return dbStatement = data_mode.mode(database.mode).createDatabase( database.name.lower()) if dbStatement == 0: self._typeCheckerList.append(database) self.writeFile() SymbolTable().add(database, 'New Database', 'Database', 'Global', None, line, column) DataWindow().consoleText( 'Query returned successfully: Database created') elif dbStatement == 1: desc = f": Can't create database {database.name}" ErrorController().add(34, 'Execution', desc, line, column) elif dbStatement == 2: desc = f": Database {database.name} already exists" ErrorController().add(30, 'Execution', desc, line, column)
def extractRow(self, name: str, columns: list, noLine, noColumn) -> list: """ Method to extract a record from a table :param name: The name of table :param columns: List with number of columns of primary keys :param noLine: The instruction line :param noColumn: The instruction column :return: Returns nothing """ database = SymbolTable().useDatabase if not database: desc = f": Database not selected" ErrorController().add(4, 'Execution', desc, noLine, noColumn) return None if not TypeChecker().searchTable(database, name): desc = f": Table {name} does not exist" ErrorController().add(27, 'Execution', desc, noLine, noColumn) return None data = data_mode.mode(database.mode).extractRow( database.name.lower(), name.lower(), columns) if data == None: ErrorController().add(34, 'Execution', '', noLine, noColumn) return None return data
def process(self, instruction): #Jalando Base de Datos print("EJECUTANDO INSERT") database_id = SymbolTable().useDatabase if not database_id: desc = f": Database not selected" ErrorController().addExecutionError(4, 'Execution', desc, 0, 1)#manejar linea y columna return None #Base de datos existe --> Obtener tabla table_tp = TypeChecker().searchTable(database_id, self.table.value) if not table_tp: desc = f": Table does not exists" ErrorController().addExecutionError(4, 'Execution', desc, 0, 1)#manejar linea y columna return None # Obtenida la tabla ---> TODO: VALIDAR TIPOS # for column in table_tp.columns: # if column. if self.arr_columns == None: #Solo nos dieron los valores, tienen que venir todos ---> Espino ya valida longitud? vals_insert = [] for column in self.arr_values: val = column.process(instruction) vals_insert.append(val.value) print(vals_insert) DataController().insert(self.table.value, vals_insert,0,1) else: if len(self.arr_columns) == len(self.arr_values): pass else: print("Error Datos incompletos")
def generateColumns(self, nombreTabla, typeChecker): for columna in self._column_list: if isinstance(columna, CreateCol): # columna._paramOne # columna._paraTwos # columna._tipoColumna tipoFinal = { '_tipoColumna': str(columna._type_column._tipoColumna), '_paramOne': columna._type_column._paramOne, '_paramTwo': columna._type_column._paramTwo } columnaFinal = Column(columna._column_name, tipoFinal) if columna._properties != None: for prop in columna._properties: columnaFinal = self.addPropertyes(prop, columnaFinal) tableToInsert = typeChecker.searchTable( SymbolTable().useDatabase, nombreTabla) validateCol = typeChecker.createColumnTable( tableToInsert, columnaFinal, 0, 0) # if return None an error ocurrio if validateCol == None: self._can_create_flag = False return
def compile(self, instrucction): temp = ThreeAddressCode().newTemp() database_id = SymbolTable().useDatabase if database_id is not None: ThreeAddressCode().addCode( f"{temp} = \"USE {database_id}; {self._tac}\"") else: ThreeAddressCode().addCode(f"{temp} = \"{self._tac}\"")
def addVar(self, id, _type, value, pos, line, col): id = id.lower() if self.variables.get(id) == None: SymbolTable().add(id, value, _type, self, None, line, col) newVar = Variable(pos, _type, value, line, col) self.variables[id] = newVar return newVar return None
def process(self, instrucction): typeNew = Type(self._name.alias) for valor in self._values: typeNew._values.append(valor.alias) SymbolTable().add(typeNew._name, str(typeNew._values), 'TYPE', 'DB', None, '0', '0') print(typeNew)
def process(self, instrucction): # Obteniendo tabla de la cual voy a borrar database_id = SymbolTable().useDatabase table_tp = TypeChecker().searchTable(database_id, self.table) table_cont = DataController().extractTable(self.table, self.line, self.column) headers = TypeChecker().searchColumnHeadings(table_tp) table_delete = pd.DataFrame(table_cont) if self.params == None: pk_col_name = TypeChecker().searchColPrimaryKey(table_tp) if pk_col_name == []: # NO HAY LLAVE PRIMARIA pk_list = table_delete.index.tolist() print(pk_list) for pk in pk_list: DataController().delete(self.table, pk, self.line, self.column) else: table_delete.columns = headers list_pks = [] for col in pk_col_name: list_pks.append(col.name) pk_list = table_delete[list_pks].values.tolist() print(pk_list) for pk in pk_list: DataController().delete(self.table, pk, self.line, self.column) else: for option in self.params: if isinstance(option, Where): table_delete.columns = headers storage_columns(table_cont, headers, self.line, self.column) storage_table(table_cont, headers, self.table, self.line, self.column) table_result = option.process( instrucction, table_delete, self.table) pk_col_name = TypeChecker().searchColPrimaryKey(table_tp) if pk_col_name == []: # NO HAY LLAVE PRIMARIA pk_list = table_result.index.to_list() print(pk_list) for pk in pk_list: DataController().delete(self.table, pk, self.line, self.column) else: table_result.columns = headers list_pks = [] for col in pk_col_name: list_pks.append(col.name) pk_list = table_result[list_pks].values.tolist() print(pk_list) for pk in pk_list: DataController().delete(self.table, pk, self.line, self.column) break return None
def agregarFk(self, listaCols, nombreTabla, listaTablasCols, tablaAAlter): typeChecker = TypeChecker() # the len of the cols must be de same if len(listaCols) != len(listaTablasCols): desc = f": cantidad of params in foreign() != " ErrorController().add(36, 'Execution', desc, 0, 0) return existForeingTable = typeChecker.searchTable(SymbolTable().useDatabase, nombreTabla) tableToAlter = typeChecker.searchTable(SymbolTable().useDatabase, tablaAAlter) # validate if the foreign table exists if existForeingTable == None: desc = f": Undefined table in foreign key ()" ErrorController().add(27, 'Execution', desc, 0, 0) return # validate if the columns exists in the foreign table for coli in listaTablasCols: if typeChecker.searchColumn(existForeingTable, coli) == None: desc = f": Undefined col in table in foreign key ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False for x in range(0, len(listaCols)): for columna in tableToAlter.columns: if (columna._name == listaCols[x]): bandera = True columna._foreignKey = { '_refTable': nombreTabla, '_refColumn': listaTablasCols[x] } break if not bandera: desc = f": Undefined column in alter foreign key ()" ErrorController().add(26, 'Execution', desc, 0, 0) return bandera = False typeChecker.writeFile()
def getParams(self, name): self.loadFile() db = SymbolTable().useDatabase key = f"{name}{db}" if key in self.__storedProcedure: return self.__storedProcedure[key]['tac'].params return []
def addVar(self, id, _type, value, pos, line, col): id = id.lower() if self.variables.get(id) == None: SymbolTable().add(id, value, _type, self, None, line, col) newVar = Variable(pos, _type, value, line, col) self.variables[id] = newVar return newVar else: print("VARIABLE DECLARADA ------ ERROR") return None
def process(self, instrucction): typeNew = Type(self._name.alias) for valor in self._values: typeNew._values.append(valor.alias) SymbolTable().add(typeNew._name, str(typeNew._values), 'TYPE', 'DB', None, '0', '0') print(typeNew) #CREANDO C3D temp = ThreeAddressCode().newTemp() database_id = SymbolTable().useDatabase if database_id is not None: ThreeAddressCode().addCode( f"{temp} = \"USE {database_id}; {self._tac}\"") else: ThreeAddressCode().addCode(f"{temp} = \"{self._tac}\"") #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})")
def compile(self, environment): #CREANDO C3D temp = ThreeAddressCode().newTemp() database_id = SymbolTable().useDatabase if database_id is not None: ThreeAddressCode().addCode(f"{temp} = \"USE {database_id}; {self._tac}\"") else: ThreeAddressCode().addCode(f"{temp} = \"{self._tac}\"") #LLAMANDO A FUNCION PARA ANALIZAR ESTA COCHINADA temp1 = ThreeAddressCode().newTemp() ThreeAddressCode().addCode(f"{temp1} = parse({temp})")
def existsPK(self, tableCreated): indicesPrimarios = 0 typeChecker = TypeChecker() tablaToExtract = typeChecker.searchTable(SymbolTable().useDatabase, tableCreated) for colExt in tablaToExtract._colums: if colExt._primaryKey == True: indicesPrimarios += 1 return indicesPrimarios
def process(self, instrucction): typeChecker = TypeChecker() database = typeChecker.searchDatabase(self._dbActual) if not database: desc = f": Database {self._dbActual} does not exist" ErrorController().add(35, 'Execution', desc, self._noLine, self._noColumn) return SymbolTable().useDatabase = database DataWindow().consoleText('Query returned successfully: USE DATABASE')
def addInherits(self, nameChildTable, nameParentTable): typeChecker = TypeChecker() tablaPadre = typeChecker.searchTable(SymbolTable().useDatabase, nameParentTable) tablaHija = typeChecker.searchTable(SymbolTable().useDatabase, nameChildTable) # La tabla de la que hereda no existe if tablaPadre == None: desc = f": parent table dont exists" ErrorController().add(27, 'Execution', desc, 0, 0) self._can_create_flag = False return for colPar in tablaPadre._colums: # Vamos a insertar en la hija validarCol = typeChecker.createColumnTable(tablaHija, colPar, 0, 0) # Si es una columna repetida entonces no puede crear la tabla if validarCol == None: self._can_create_flag = False return
def addVar(self, id, _type, value, pos, line, col): # id = id.lower() if self.variables.get(id) == None: SymbolTable().add(id, value, _type, self, None, line, col) newVar = Variable(pos, _type, value, line, col) self.variables[id] = newVar return newVar else: print("VARIABLE DECLARADA ------ ERROR", id) ErrorController().add(33, 'Execution', f"VARIABLE {id} YA DECLARADA", line, col) return self.getVar(id)
class SymbolTableReport(object): def __init__(self): self._symbolTable = SymbolTable() self._data = '' self.generateReport() report = open('symbolTable.dot', 'w') report.write(self._data) report.close() os.system('dot -Tpdf symbolTable.dot -o symbolTable.pdf') # os.startfile('symbolTable.pdf') def generateReport(self): self._data = 'digraph {\n\ttbl [\n\tshape=plaintext\n\tlabel=<' self._data += '\n\t\t<table border=\'0\' cellborder=\'1\' color=\'#324960\' cellspacing=\'0\'>' self._data += '\n\t\t\t<tr>\n\t\t\t\t<td bgcolor="#324960" colspan=\'8\' SIDES=\"TB\">' self._data += f"\n\t\t\t\t\t<font color=\"white\">SYMBOL TABLE</font>" self._data += '\n\t\t\t\t</td>\n\t\t\t</tr>' self.generateHeaders() self._data += '\n\t\t</table>\n\t>];\n}' def generateHeaders(self): self._data += '\n\t\t\t<tr>' self.dataHeaderCol('ID') self.dataHeaderCol('Name') self.dataHeaderCol('Value') self.dataHeaderCol('Type') self.dataHeaderCol('Environment') self.dataHeaderCol('References') self.dataHeaderCol('Line') self.dataHeaderCol('Column') self._data += '\n\t\t\t</tr>' for col in self._symbolTable.getList(): self._data += '\n\t\t\t<tr>' self.dataCol(col.idSymbol) self.dataCol(col.name) self.dataCol(col.value) self.dataCol(col.dataType) self.dataCol(col.environment) self.dataCol(col.references) self.dataCol(col.row) self.dataCol(col.column) self._data += '\n\t\t\t</tr>' def dataHeaderCol(self, name): self._data += f"\n\t\t\t\t<td bgcolor=\"#4fc3a1\" SIDES=\"B\"><b><font color=\"white\"> {name} </font></b></td>" def dataCol(self, data): self._data += f"\n\t\t\t\t<td SIDES=\"B\"> {data} </td>"
def generateHiddenPK(self, nombreTabla): typeChecker = TypeChecker() tipoEscondido = { '_tipoColumna': 'HIDDEN', '_paramOne': None, '_paramTwo': None } columnaEscondida = Column('HIDDEN', tipoEscondido) columnaEscondida._primaryKey = True tableToInsert = typeChecker.searchTable(SymbolTable().useDatabase, nombreTabla) typeChecker.createColumnTable(tableToInsert, columnaEscondida, 0, 0) print('### SE HA GENERADO UNA LLAVE PRIMARIA ESCONDIDA')