# -*- coding: utf-8 -*- #!/usr/bin/python import os import sys import time import json import redis import pymysql import datetime import pprint import _utils from string import Template class Combine: def __init__(self): self._rule_conf = _utils.readCombineRule() self._server_list_conf = _utils.readServerListConf() self._main_serverid = self._server_list_conf[0]['serverid'] self._curr_serverid = 0 self._main_server_arena_max_rank = 0 self._role_arena_rank_list = [] def run(self): _utils.checkDB(self._server_list_conf, self._rule_conf) self._convertDB() def _convertDB(self): for conf in self._server_list_conf: conn = pymysql.connect(host = conf['db_host'], port = conf['db_port'], user = conf['db_user'], passwd = conf['db_passwd'], db = 'legend_' + str(conf['serverid']), charset = 'utf8' ) assert conn self._curr_serverid = conf['serverid'] for rule in self._rule_conf.values(): fetch_sql = self._replaceSqlTemplate(rule['fetch_sql']) print(fetch_sql) cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) cursor.execute(fetch_sql) rows = cursor.fetchall() self._writeSql(conn, rule, rows) self._oneRulePostProc(conn, rule, rows) #end for rule self._rulePostProc(conn, rule) self._appendSql() def _writeSql(self, conn, rule, rows): # file_name = 'out/' + rule['table_name'] + '.sql' file_name = 'out/all.sql' with open(file_name, 'a+') as out_file: for row in rows: assert len(row) > 0 field_names = '' field_values = '' for key in row.keys(): field_names += '`%s`,' % key if row[key] == None: field_values += 'null,' else: field_values += '"%s",' % pymysql.escape_string(str(row[key])) #end for key insert_sql = 'INSERT INTO ' + rule['table_name'] + '(' + field_names[0:-1] + ')' + \ ' VALUES (' + field_values[0:-1] + ");\n" out_file.write(insert_sql) #end for row def _appendSql(self): file_name = 'out/all.sql' with open(file_name, 'a+') as out_file: out_file.write("UPDATE tribe_member SET position=5;\n") curr_rank = self._main_server_arena_max_rank + 1 for row in self._role_arena_rank_list: out_file.write("UPDATE role_arena SET rank=%d where role_id=%d;\n" % (curr_rank, row['roleid'])) curr_rank += 1 def _replaceSqlTemplate(self, sql): str_tpl = Template(sql) tmp_str = sql tmp_str = tmp_str.replace('${main_server_id}', str(self._main_serverid)) tmp_str = tmp_str.replace('${curr_server_id}', str(self._curr_serverid)) return tmp_str #return str_tpl.safe_substitute({ # 'main_serverid': self._main_serverid, # 'curr_serverid': self._curr_serverid #}) def _oneRulePostProc(self, conn, rule, rows): if rule['table_name'] == 'role_arena': for row in rows: if self._main_serverid == self._curr_serverid: if row['rank'] > self._main_server_arena_max_rank: self._main_server_arena_max_rank = row['rank'] #end for row else: self._role_arena_rank_list.append( { 'roleid' : row['role_id'], 'old_rank' : row['rank'] }) def _rulePostProc(self, conn, rule): pass combine = Combine() combine.run()