예제 #1
0
    def conecta(self, sgbd, servidor, usuario, senha, banco):
        self.con = Conection(sgbd, servidor, usuario, senha, banco)

        self.map['database'] = {
            'engine': sgbd,
            'server': servidor,
            'user': usuario,
            'password': senha,
            'database': banco
        }
        self.map['tabelas'] = {}
        self.map['foreign_keys'] = dict()

        self.getTables()
예제 #2
0
class Mapper(object):
    def __init__(self, arquivo=None):
        if arquivo:
            #Implementar função para leitura e parser do arquivo json
            pass
        else:
            self.map = dict()

        self.map = {}

    def conecta(self, sgbd, servidor, usuario, senha, banco):
        self.con = Conection(sgbd, servidor, usuario, senha, banco)

        self.map['database'] = {
            'engine': sgbd,
            'server': servidor,
            'user': usuario,
            'password': senha,
            'database': banco
        }
        self.map['tabelas'] = {}
        self.map['foreign_keys'] = dict()

        self.getTables()
        # self.calcOrder()

    def addChild(self, chave, valor):
        self.map[chave] = valor

    def updateMapper(self, Conection):
        pass

    def getTables(self):
        print "processando tabelas"
        tabelas = self.con.listaTabelas()

        for tabela in tabelas:
            campos = self.con.listCampos(tabela)
            dcampos = {}
            for campo in campos:
                nome = str(campo.name)
                tipo = str(campo.type)
                nulo = str(campo.nullable)
                primario = str(campo.primary_key)
                chaves = campo.foreign_keys
                opcoes = self.getTipo(nome, tipo, primario, nulo)
                p_size = re.compile("\(\d*\)$")


                #Definir relacionamentos
                chaves = {}
                for chave in campo.foreign_keys:
                    self.addChaves(chave)
                if p_size.match(tipo):
                    print "possui tamanho"
                    # print vars(campo)
                # print 'Campo: %s - Tipo: %s - Chave Primaria: %s' % (nome, tipo, primario)
                dcampos[nome] = {
                    'tipo': tipo,
                    'primario': primario,
                    'nulo': nulo,
                    'opcoes': opcoes
                }

            #Adicionando relações da tabela ao mapeamento
            self.map['tabelas'][tabela] = dcampos

    def addChaves(self, chave):
        '''
        Método que adiciona as propriedades da foreign key ao mapeamento do banco
        '''

        tabela = str(chave.constraint.table)

        if not self.map['foreign_keys'].has_key(tabela):
            self.map['foreign_keys'][tabela] = {}

        k_tabela = str(chave.column.table)
        k_campo = str(chave.column.name)
        k_delete = str(chave.ondelete)
        k_update = str(chave.onupdate)
        k_constraint = str(chave.constraint.name)
        self.map['foreign_keys'][tabela][k_constraint] = {
            'tabela_referencia': k_tabela,
            'campo': k_campo,
            'delete': k_delete,
            'update': k_update
        }

    def getField(self):
        pass

    def getAtribute(self):
        pass

    def getTipo(self, nome, tipo, primario, nulo):
        """"
        Método responsável por reconhecer o tipo de dado a ser inserido no campo, baseando-se no nome da coluna
        e no tipo da dados aceito.
        """""
        opcoes = {}
        #Reconhecer o tipo de dado
        if re.match(r'.*(VARCHAR|TEXT).*', tipo):
            opcoes['inserir'] = 'lerolero'
            p_email = re.compile('email')
            p_address = re.compile("(logradouro|end(ereco)+)")
            p_phone = re.compile("(tele(fone)+|phone)")
            if re.match(r'(nome|name)', nome):
                opcoes['inserir'] = 'nome'
            elif p_email.match(nome):
                opcoes['inserir'] = 'email'
            elif p_address.match(nome):
                opcoes['inserir'] = 'endereco'
            elif p_phone.match(nome):
                opcoes['inserir'] = 'telefone'
                opcoes['mascara'] = "(99) 9999-9999"

        elif re.match(r'(INT|DECIMAL)', tipo):
            opcoes['inserir'] = 'inteiro'
            if primario == 'True':
                opcoes['inserir'] = 'primario'
            tamanho = re.match(r'(\d*)', tipo)
        elif re.match(r'(TIME|DATE)', tipo):
            opcoes['inserir'] = 'data'

        return opcoes

    def calcOrder(self):
        '''
        Método responsável por definir a ordem de insersão dos dados nas tabelas, levando em consideração
        as foreign_keys dependentes
        '''
        pass

        # print len(tabela.keys)

    def saveFile(self,filename):
        with open('datamap.json', 'w') as outfile:
            json.dump(map.map, outfile)

    def quicksort(self, v):
        if len(v) <= 1:
            return v # uma lista vazia ou com 1 elemento ja esta ordenada
        less, equal, greater = [], [], [] # cria as sublistas dos maiores, menores e iguais ao pivo
        pivot = v[0] # escolhe o pivo. neste caso, o primeiro elemento da lista
        for x in v:
            # adiciona o elemento x a lista corespondeste
            if x < pivot:
                less.append(x)
            elif x == pivot:
                equal.append(x)
            else:
                greater.append(x)
        return self.quicksort(less) + equal + self.quicksort(greater) # concatena e retorna recursivamente