Exemple #1
0
 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
Exemple #2
0
 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
Exemple #3
0
    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')
Exemple #4
0
 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
Exemple #5
0
    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()
Exemple #6
0
    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)
Exemple #7
0
    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)
Exemple #8
0
    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
Exemple #9
0
    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)
Exemple #10
0
    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
Exemple #11
0
    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
Exemple #12
0
    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)
Exemple #13
0
    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
Exemple #14
0
 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")
Exemple #15
0
    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
Exemple #16
0
 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}\"")
Exemple #17
0
 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
Exemple #18
0
    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)
Exemple #19
0
    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
Exemple #20
0
    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()
Exemple #21
0
    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 []
Exemple #22
0
 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
Exemple #23
0
    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})")
Exemple #24
0
 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})")
Exemple #25
0
    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
Exemple #26
0
    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')
Exemple #27
0
    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
Exemple #28
0
 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)
Exemple #29
0
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>"
Exemple #30
0
 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')