class pushMes(object):
    """docstring for pushMes"""
    def __init__(self, dbName, dbPassword, tableName, coinbasePassword,
                 contractAddress, contractAbi):
        super(pushMes, self).__init__()
        self.sql = Sql("localhost", 3306, 'root', dbPassword, dbName)
        self.tableNeedRead = tableName
        self.databaseName = dbName
        self.geth = Ethereum(coinbasePassword, contractAddress, contractAbi)
        # self.dataLength=
    def getData(self):
        self.sql.connect()
        command = 'select * from %s' % self.tableNeedRead
        result = self.sql.extractSql(command)
        self.sql.close()
        datas = []
        keys = []
        keyJson = json.loads(self.getKeys())
        # 获取字段
        for item in keyJson:
            keys.append(keyJson.get(item))
        #处理数据
        for i, item in enumerate(result):
            data = {}
            for i, perValue in enumerate(item):
                data[keys[i]] = perValue
            # data[i]=
            datas.append(json.dumps(data, ensure_ascii=False))

        return datas

    def getKeys(self):
        self.sql.connect()
        command = "select COLUMN_NAME from information_schema.COLUMNS where table_name = '%s' and table_schema = '%s'" % (
            self.tableNeedRead, self.databaseName)
        result = self.sql.extractSql(command)
        self.sql.close()
        keys = {}
        for i, item in enumerate(result):
            keys[i] = item[0]
        # print(keys)
        return json.dumps(keys, ensure_ascii=False)

    def waitMined(self, index):
        print("第 " + str(index + 1) + " 条数据上传完成")
        self.uploadedLength = self.uploadedLength + 1
        if self.uploadedLength == self.needUploadLength:
            print("全部上传完成\n从区块链获取数据库" + self.databaseName + "获取表" +
                  self.tableNeedRead + "...")
            for data in self.getFromBlockChain(self.databaseName,
                                               self.tableNeedRead):
                print(data)

    def pushToBlockChain(self, needUploadDB, needUploadTable):
        print("获取本地数据库数据 ...")
        keys = self.getKeys()
        values = self.getData()
        self.needUploadLength = len(values)
        self.uploadedLength = 0

        print("本地数据库获取完毕")
        if not self.geth.existSuchDatabase(needUploadDB):
            print("在区块链创建数据库  " + needUploadDB + " ...")
            #创建数据库
            self.geth.createDatabase(needUploadDB)
            print("在区块链创建数据库  " + needUploadDB + " 完毕")
        else:
            print("数据库  " + needUploadDB + "在区块链已存在")

        if not self.geth.exsitSuchTable(needUploadDB, needUploadTable):

            print("在区块链中创建表 " + needUploadTable + " ...")
            self.geth.createTable(needUploadDB, needUploadTable, keys)
            print("在区块链创建表 " + needUploadTable + " 成功")

        else:
            print("区块链数据库 " + needUploadDB + " 中已存在表 " + needUploadTable +
                  "  将删除旧表")
            self.geth.dropTable(needUploadDB, needUploadTable)
        print("准备上传数据 ...")
        self.geth.pushData(needUploadDB, needUploadTable, values,
                           self.waitMined)

    def getFromBlockChain(self, needGetDB, needGetTable):
        if not geth.exsitSuchTable(needGetDB, needGetTable):
            print("区块中不存在这样的表")
            return
        else:
            length = geth.getTableLength(needGetDB, needGetTable)
            result = []
            print(length)
            for index in range(length):
                result.append(geth.getTable(needGetDB, needGetTable, index))
            return result