예제 #1
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
        # TODO Revisar Esto didier, que con lower me da problema al buscar tablas y base de datos
        data = data_mode(database.mode).extractTable(database.name.lower(),
                                                     name.lower())
        if data == None:
            ErrorController().add(34, 'Execution', '', noLine, noColumn)
            return None

        return data
예제 #2
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(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)
예제 #3
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(database.mode).extractRow(database.name.lower(),
                                                   name.lower(), columns)
        if data == None:
            ErrorController().add(34, 'Execution', '', noLine, noColumn)
            return None
        return data
예제 #4
0
    def compile(self, environment):
        value1 = self.value1.compile(environment)
        value2 = self.value2.compile(environment)
        if isinstance(value1, PrimitiveData):
            if value1.data_type == DATA_TYPE.STRING:
                value1.value = f"\'{value1.value}\'"
        if isinstance(value1, PrimitiveData):
            if value2.data_type == DATA_TYPE.STRING:
                value2.value = f"\'{value2.value}\'"
        try:
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(
                f"{temporal} = {value1.value} {getOperador(self.operator)} {value2.value}"
            )

            return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line,
                                 self.column)
        except TypeError:
            desc = "Error de tipo"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
        except:
            desc = "FATAL ERROR, Relop, no acepta ids"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #5
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(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)
예제 #6
0
 def process(self, environment):
     try:
         val = None
         result = 0
         lista1 = []
         i = self.down.process(environment).value
         j = self.up.process(environment).value
         if isinstance(self.value, Identifiers):
             val = self.value.process(environment)
             result = [columns[i:j] for columns in val[0]]
             lista1.append(result)
             lista1.append(self.alias)
             return lista1
         else:
             cadena = self.value.process(environment).value
             substr = cadena[i:j]
             return PrimitiveData(DATA_TYPE.STRING, substr, self.line,
                                  self.column)
     except TypeError:
         desc = "Tipo de dato invalido para Substring"
         ErrorController().add(37, 'Execution', desc, self.line,
                               self.column)
         return
     except:
         desc = "FATAL ERROR --- StringFuncs"
         ErrorController().add(34, 'Execution', desc, self.line,
                               self.column)
예제 #7
0
 def process(self, environment):
     try:
         if self.data_type.lower() == "integer":
             if isinstance(self.value, Identifiers):
                 lista1 = []
                 val = self.value.process(environment)
                 result = [int(columns) for columns in val[0]]
                 lista1.append(result)
                 lista1.append(self.alias)
                 return lista1
             else:
                 cadena = self.value.process(environment).value
                 return PrimitiveData(DATA_TYPE.NUMBER, int(cadena),
                                      self.line, self.column)
         else:
             if isinstance(self.value, Identifiers):
                 lista1 = []
                 val = self.value.process(environment)
                 result = [str(columns) for columns in val[0]]
                 lista1.append(result)
                 lista1.append(self.alias)
                 return lista1
             else:
                 cadena = self.value.process(environment).value
                 return PrimitiveData(DATA_TYPE.STRING, cadena, self.line,
                                      self.column)
     except TypeError:
         desc = "Tipo de dato invalido para Convert"
         ErrorController().add(37, 'Execution', desc, self.line,
                               self.column)
         return
     except:
         desc = "FATAL ERROR --- StringFuncs"
         ErrorController().add(34, 'Execution', desc, self.line,
                               self.column)
예제 #8
0
    def addCheck(self, conditionColumn):
        #                           L (L|D)*
        whatColumnIs = re.search('[a-zA-z]([a-zA-z]|[0-9])*',
                                 conditionColumn.alias)
        bandera = False
        if whatColumnIs != None:
            whatColumnIs = whatColumnIs.group(0)
            for columna in self._column_list:
                if isinstance(columna, CreateCol):
                    if (columna._column_name == whatColumnIs):
                        if columna._properties != None:
                            bandera = True
                            columna._properties[0][
                                'check_condition'] = conditionColumn
                            break
            if not bandera:
                desc = f": Undefined column in check ()"
                ErrorController().add(26, 'Execution', desc, 0, 0)
                self._can_create_flag = False
                return
            bandera = False

        else:
            desc = f": column not given in check()"
            ErrorController().add(26, 'Execution', desc, 0, 0)
            self._can_create_flag = False
            return
예제 #9
0
 def process(self, environment):
     try:
         index = self.pos.process(environment).value
         char = self.no_char.process(environment).value
         if isinstance(self.value, Identifiers):
             lista1 = []
             val = self.value.process(environment)
             result = [(columns[:index] + chr(char) + columns[index + 1:])
                       for columns in val[0]]
             lista1.append(result)
             lista1.append(self.alias)
             return lista1
         else:
             cadena = self.value.process(environment).value
             result = cadena[:index] + chr(char) + cadena[index + 1:]
             return PrimitiveData(DATA_TYPE.STRING, result, self.line,
                                  self.column)
     except TypeError:
         desc = "Tipo de dato invalido para SetByte"
         ErrorController().add(37, 'Execution', desc, self.line,
                               self.column)
         return
     except:
         desc = "FATAL ERROR --- StringFuncs"
         ErrorController().add(34, 'Execution', desc, self.line,
                               self.column)
예제 #10
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()
예제 #11
0
 def process(self, environment):
     try:
         if isinstance(self.value, Identifiers):
             lista1 = []
             val = self.value.process(environment)
             result = [
                 hashlib.sha256(columns.encode()).hexdigest()
                 for columns in val[0]
             ]
             lista1.append(result)
             lista1.append(self.alias)
             return lista1
         else:
             cadena = self.value.process(environment).value
             result = hashlib.sha256(cadena.encode())
             return PrimitiveData(DATA_TYPE.STRING, result.hexdigest(),
                                  self.line, self.column)
     except TypeError:
         desc = "Tipo de dato invalido para sha256"
         ErrorController().add(37, 'Execution', desc, self.line,
                               self.column)
         return
     except:
         desc = "FATAL ERROR --- StringFuncs"
         ErrorController().add(34, 'Execution', desc, self.line,
                               self.column)
예제 #12
0
 def process(self, environment):
     try:
         val = None
         result = 0
         lista1 = []
         if isinstance(self.value, Identifiers):
             val = self.value.process(environment)
             result = [len(columns) for columns in val[0]]
             lista1.append(result)
             lista1.append(self.alias)
             return lista1
         else:
             val = self.value.process(environment).value
             l = len(val)
             return PrimitiveData(DATA_TYPE.NUMBER, l, self.line,
                                  self.column)
     except TypeError:
         desc = "Tipo de dato invalido para Length"
         ErrorController().add(37, 'Execution', desc, self.line,
                               self.column)
         return
     except:
         desc = "FATAL ERROR --- StringFuncs"
         ErrorController().add(34, 'Execution', desc, self.line,
                               self.column)
예제 #13
0
def execution(input):
    querys = []
    messages = []
    DataWindow().clearProperties()
    result = parse(input)
    errors = ErrorController().getList()

    if len(ErrorController().getList()) == 0:
        for inst in result:
            if isinstance(inst, Select):
                result = inst.process(0)
                if isinstance(result, DataFrame):
                    DataWindow().format_df(result)
                    querys.append([DataWindow().headers, DataWindow().rows])
                elif isinstance(result, list):
                    DataWindow().format_table_list(result)
                    querys.append([DataWindow().headers, [DataWindow().rows]])
            else:
                inst.process(0)
                querys.append([DataWindow().headers, DataWindow().rows])
            messages.append(DataWindow().data)

    obj = {
        "messages": messages,
        "querys": querys,
        "lexical": errors
    }
    return obj
예제 #14
0
 def process(self, expression):
     value1 = self.value1.process(expression)
     value2 = self.value2.process(expression)
     operator = self.operator
     try:
         value = 0
         if isinstance(value1, PrimitiveData) and isinstance(
                 value2, PrimitiveData):
             if operator.lower() == "and":
                 value = value1.value and value2.value
             elif operator.lower() == "or":
                 value = value1.value or value2.value
             else:
                 print("Operador no valido: " + operator)
                 return
             return PrimitiveData(DATA_TYPE.BOOLEANO, value, self.line,
                                  self.column)
         else:
             data = ""
             if isinstance(value1, list) and isinstance(value2, list):
                 if operator.lower() == 'and':
                     lista_temp = []
                     lista_temp.append(value1[2])
                     lista_temp.append(value2[2])
                     lista_temp = self.convert_unic_list2(lista_temp)
                     name_list = self.convert_unic_list(
                         value1[0], value2[0])
                     data = f'({value1[1]}) and ({value2[1]})'
                     return [name_list, data, lista_temp]
                 elif operator.lower() == 'or':
                     lista_temp = []
                     lista_temp.append(value1[2])
                     lista_temp.append(value2[2])
                     lista_temp = self.convert_unic_list2(lista_temp)
                     name_list = self.convert_unic_list(
                         value1[0], value2[0])
                     data = f'({value1[1]})  or ({value2[1]})'
                     return [name_list, data, lista_temp]
                 else:
                     print("Operador no valido: " + operator)
                     return
             else:
                 if operator.lower() == 'and':
                     data = f'({value1}) and ({value2})'
                     return data
                 elif operator.lower() == 'or':
                     data = f'({value1})  or ({value2})'
                     return data
                 else:
                     print("Operador no valido: " + operator)
                     return
     except TypeError:
         desc = "FATAL ERROR --- LogicalOperators"
         ErrorController().add(34, 'Execution', desc, self.line,
                               self.column)
     except:
         desc = "FATAL ERROR --- LogicalOperators"
         ErrorController().add(34, 'Execution', desc, self.line,
                               self.column)
예제 #15
0
def p_error(p):
    try:
        # print(str(p.value))
        description = ' or near ' + str(p.value)
        column = find_column(p)
        ErrorController().add(33, 'Syntactic', description, p.lineno, column)
    except AttributeError:
        # print(number_error, description)
        ErrorController().add(1, 'Syntactic', '', 'EOF', 'EOF')
예제 #16
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
예제 #17
0
    def compile(self, environment):
        try:
            i = self.down.compile(environment).value
            j = self.up.compile(environment).value
            temp = ThreeAddressCode().newTemp()
            val = self.value.compile(environment).value
            dataTemp = f"{temp} = '{val}'"

            cambio = False
            if val[0] == 't':
                sub = val[1:]
                if sub.isnumeric():  # ES UN TEMPORAL
                    dataTemp = f"{temp} = {val}"
                    cambio = True
            if cambio is False:
                dataTemp = f"{temp} = '{val}'"

            tempi = ThreeAddressCode().newTemp()
            tempj = ThreeAddressCode().newTemp()
            dataTempi = f"{tempi} = {i}"
            dataTempj = f"{tempj} = {j}"
            ThreeAddressCode().addCode(dataTemp)
            ThreeAddressCode().addCode(dataTempi)
            ThreeAddressCode().addCode(dataTempj)
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal} = {temp}[{tempi}:{tempj}]")
            return PrimitiveData(DATA_TYPE.STRING, temporal, self.line,
                                 self.column)
        except:
            desc = "FATAL ERROR --- StringFuncs"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #18
0
    def compile(self, expression):
        expression1 = self.value.compile(expression)
        type_unary_or_other = self.sign
        temporal = ThreeAddressCode().newTemp()

        try:
            if expression1.data_type != DATA_TYPE.NUMBER:
                print('error')
                return
            dataTemp = f"{temporal} = 0"

            if type_unary_or_other == SymbolsUnaryOrOthers.UMINUS or type_unary_or_other == SymbolsUnaryOrOthers.BITWISE_NOT:
                dataTemp = f"{temporal} = -{expression1.value}"

            elif type_unary_or_other == SymbolsUnaryOrOthers.UPLUS:
                dataTemp = f"{temporal} = {expression1.value}"

            elif type_unary_or_other == SymbolsUnaryOrOthers.SQUARE_ROOT:
                dataTemp = f"{temporal} = sqrt({expression1.value})  # |/"

            elif type_unary_or_other == SymbolsUnaryOrOthers.CUBE_ROOT:
                temporal1 = ThreeAddressCode().newTemp()
                ThreeAddressCode().addCode(f"{temporal1} = 1 / 3")
                dataTemp = f"{temporal} = {expression1.value} ** {temporal1} # ||/"

            ThreeAddressCode().addCode(dataTemp)
            return PrimitiveData(DATA_TYPE.NUMBER, temporal, self.line,
                                 self.column)
        except:
            desc = "FATAL ERROR --- UnaryOrSquareExpressions"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #19
0
    def compile(self, environment):
        try:
            temp = ThreeAddressCode().newTemp()
            val = self.value.compile(environment).value
            tempPos = ThreeAddressCode().newTemp()
            index = self.pos.compile(environment).value
            dataTemp = f"{temp} = '{val}'"

            cambio = False
            if val[0] == 't':
                sub = val[1:]
                if sub.isnumeric():  # ES UN TEMPORAL
                    dataTemp = f"{temp} = {val}"
                    cambio = True
            if cambio is False:
                dataTemp = f"{temp} = '{val}'"

            dataPos = f'{tempPos} = {index}'
            ThreeAddressCode().addCode(dataTemp)
            ThreeAddressCode().addCode(dataPos)
            temporal = ThreeAddressCode().newTemp()
            ThreeAddressCode().addCode(f"{temporal} = ord({temp}[{tempPos}])")
            return PrimitiveData(DATA_TYPE.STRING, temporal, self.line,
                                 self.column)
        except:
            desc = "FATAL ERROR --- StringFuncs"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #20
0
    def compile(self, environment):
        try:
            if self.data_type.lower() == 'integer':
                temp = ThreeAddressCode().newTemp()
                val = self.value.compile(environment).value
                dataTemp = f"{temp} = '{val}'"

                cambio = False
                if val[0] == 't':
                    sub = val[1:]
                    if sub.isnumeric():  # ES UN TEMPORAL
                        dataTemp = f"{temp} = {val}"
                        cambio = True
                if cambio is False:
                    dataTemp = f"{temp} = '{val}'"

                ThreeAddressCode().addCode(dataTemp)
                temporal = ThreeAddressCode().newTemp()
                ThreeAddressCode().addCode(f"{temporal} = int({temp})")
                return PrimitiveData(DATA_TYPE.STRING, temporal, self.line,
                                     self.column)
            else:
                temp = ThreeAddressCode().newTemp()
                val = self.value.compile(environment).value
                dataTemp = f"{temp} = '{val}'"
                ThreeAddressCode().addCode(dataTemp)
                temporal = ThreeAddressCode().newTemp()
                ThreeAddressCode().addCode(f"{temporal} = {temp}")
                return PrimitiveData(DATA_TYPE.STRING, temporal, self.line,
                                     self.column)
        except:
            desc = "FATAL ERROR --- StringFuncs"
            ErrorController().add(34, 'Execution', desc, self.line,
                                  self.column)
예제 #21
0
    def ejecutar_sql(self):
        global report_error
        global report_ast

        DataWindow().clearConsole()
        SymbolTable().destroy()
        ThreeAddressCode().destroy()

        texto = self.entrada.get('1.0', END)
        result = parse(texto)
        # jsonStr = json.dumps(result, default=lambda o: o.__dict__) #Convierte el AST a formato JSON para poder saber como se esta formando
        # print(result)  # Imprime el AST

        report_error = ReportError()
        if len(ErrorController().getList()) > 0:
            messagebox.showerror('ERRORES', 'Se encontraron errores')
        else:
            result2 = parse2(texto)
            report_ast = result2

            # ---------- TEST ---------
            for inst in result:
                # esto es por los select anidados (subquerys), no encontre otra menera
                # de retornar la tabla dibujada, lo hacia en mi clase
                # pero si lo dejaba ahi me tronaban las subquery,
                # prueben que no les de problema
                if isinstance(inst, Select):
                    result = inst.process(0)
                    if isinstance(result, DataFrame):
                        DataWindow().consoleText(format_df(result))
                    elif isinstance(result, list):
                        DataWindow().consoleText(format_table_list(result))
                else:
                    inst.process(0)
예제 #22
0
    def generar_tac(self):
        global report_error
        global report_ast

        DataWindow().clearConsole()
        SymbolTable().destroy()
        ThreeAddressCode().destroy()

        texto = self.entrada.get('1.0', END)
        result = parse(texto)
        print(result)  # Imprime el AST
        report_error = ReportError()

        if len(ErrorController().getList()) > 0:
            messagebox.showerror('ERRORES', 'Se encontraron errores')
        else:

            ambito = Ambito(None)
            for inst in result:
                inst.compile(ambito)

            DataWindow().consoleText(ThreeAddressCode().getCode())
            ThreeAddressCode().writeFile()

            result2 = parse2(texto)  # AST GRAFICO
            report_ast = result2
예제 #23
0
    def generar_optimization(self):
        global report_error
        global report_ast
        global report_optimization

        DataWindow().clearConsole()
        OptimizationController().destroy()

        texto = self.entrada.get('1.0', END)
        list_instrucciones = parse_optimizacion(texto)
        # print(result)  # Imprime el AST
        report_error = ReportError()
        report_optimization = ReportOfOptimization()
        if len(ErrorController().getList()) > 0:
            messagebox.showerror('ERRORES', 'Se encontraron errores')
        else:
            for index, inst in enumerate(list_instrucciones):
                if inst != None:
                    result = inst.process(0)
                    regla1(result, list_instrucciones, index)
                    regla2(result, list_instrucciones, index)
                    regla3(result, list_instrucciones, index)
                    regla4y5(result, list_instrucciones, index)
                    regla6(result, list_instrucciones, index)
                    regla7(result, list_instrucciones, index)
            DataWindow().consoleText('CD3 RETURNED: Optimization Finished')
예제 #24
0
    def addForeignKey(self, listaCols, nombreTabla, listaTablasCols):

        # the len of the cols must be de same
        if len(listaCols) != len(listaTablasCols):
            desc = f": cant of params in foreign() != "
            ErrorController().add(36, 'Execution', desc, 0, 0)
            self._can_create_flag = False
            return

        typeChecker = TypeChecker()
        existForeingTable = typeChecker.searchTable(SymbolTable().useDatabase,
                                                    nombreTabla)

        # validate if the foreign table exists
        if existForeingTable == None:
            desc = f": Undefined table in foreign key ()"
            ErrorController().add(27, 'Execution', desc, 0, 0)
            self._can_create_flag = False
            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)
                self._can_create_flag = False
                return

        bandera = False
        for x in range(0, len(listaCols)):
            for columna in self._column_list:
                if isinstance(columna, CreateCol):
                    if (columna._column_name == listaCols[x]):
                        if columna._properties != None:
                            bandera = True
                            columna._properties[0]['fk_references_to'] = {
                                '_refTable': nombreTabla,
                                '_refColumn': listaTablasCols[x]
                            }
                            break
            if not bandera:
                desc = f": Undefined column in foreign key ()"
                ErrorController().add(26, 'Execution', desc, 0, 0)
                self._can_create_flag = False
                return
            bandera = False
예제 #25
0
 def process(self, environment):
     for name in self.id:
         name = name['value']
         drop = Procedures().dropProcedure(name, self.line, self.column)
         if not drop and not self.ifExists:
             desc = f": Function {name} does not exist"
             ErrorController().add(39, 'Execution', desc, self.line,
                                   self.column)
예제 #26
0
    def createColumnTable(self, table: Table, column: Column, noLine,
                          noColumn):
        """
        Method to create a column in table

        :param table: The name of table
        :param column: Number of columns
        :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

        if self.searchColumn(table, column.name):
            desc = f": Column {column.name} already exists"
            ErrorController().add(29, 'Execution', desc, noLine, noColumn)
            return

        dbStatement = data_mode(database.mode).alterAddColumn(
            database.name.lower(), table.name.lower(), column.default)

        if dbStatement == 0:
            if len(table.columns) > 0:
                column.number = table.columns[-1].number + 1

            table.columns.append(column)
            self.writeFile()
            DataWindow().consoleText(
                'Query returned successfully: Table updated')
            return True

        elif dbStatement == 1:
            desc = f": Can't update table {table.name}"
            ErrorController().add(34, 'Execution', desc, noLine, noColumn)

        elif dbStatement == 2:
            desc = f": Database {database.name} does not exist"
            ErrorController().add(35, 'Execution', desc, noLine, noColumn)

        elif dbStatement == 3:
            desc = f": Table {table.name} does not exist"
            ErrorController().add(27, 'Execution', desc, noLine, noColumn)
예제 #27
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()
예제 #28
0
 def process(self, enviroment):
     for name in self.name_index:
         isDropIndex = self.search_index(name)
         if isDropIndex:
             DataWindow().consoleText('Query returned successfully: Drop Index')
         else:
             desc = f": Name of Index not Exists"
             ErrorController().add(4, 'Execution', desc, self.line,
                                   self.column)  # manejar linea y columna
예제 #29
0
 def process(self, enviroment):
     if self.isColumn:
         isChangeName = self.rename_column(
             self.name_index, self.new_name, self.index_specific)
         if isChangeName:
             DataWindow().consoleText('Query returned successfully: Alter Index')
         else:
             desc = f": Name of Index not Exists"
             ErrorController().add(4, 'Execution', desc, self.line,
                                   self.column)  # manejar linea y columna
     else:
         isChangeName = self.search_index(self.name_index, self.new_name)
         if isChangeName:
             DataWindow().consoleText('Query returned successfully: Alter Index')
         else:
             desc = f": Name of Index not Exists"
             ErrorController().add(4, 'Execution', desc, self.line,
                                   self.column)  # manejar linea y columna
예제 #30
0
def parse_optimizacion(inpu):
    global input, contador_instr
    contador_instr = 0
    ErrorController().destroy()
    lexer = lex.lex()
    lexer.lineno = 1
    input = inpu
    get_text(input)
    return parser.parse(inpu, lexer=lexer)