hch
2018-12-24 c238e45c6695d627bcc776b34f8ff46823c57e71
860312 修改数据库账号后缀工具
18个文件已添加
31035 ■■■■■ 已修改文件
Tool/数据库/ChangeAccount/ChangeAccount.py 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Collections/CollectionVesionNO.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Collections/DataServerLogData.py 7622 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Collections/DataServerPlayerData.py 21288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Collections/__init__.py 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Common/CommFunc.py 521 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Common/CommFuncEx.py 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Common/__init__.py 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Common/mylog.py 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Config/DBConfig.py 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Config/__init__.py 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/Config/config.ini 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/DBCommon/CommonDefine.py 377 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/DBCommon/GlobalFunctions.py 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/DBCommon/__init__.py 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/DBCommon/error.py 352 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/ChangeAccount/MangoDBCommon.py 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/数据库/mongorestore.bat 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/Êý¾Ý¿â/ChangeAccount/ChangeAccount.py
New file
@@ -0,0 +1,134 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
# ä¿®æ”¹è´¦å·åŽç¼€
#-------------------------------------------------------------------------------
#
# ä¿®æ”¹è¡¨
# GameLog: tagDBPlayerInfoLog
# GameUser: tagDSAccount tagDBPlayer tagDBBillboard
# å¯èƒ½ä¼šä½¿ç”¨å·²å¤„理 tagAccIDSendPrize  tagDBGMIP  tagGameWorldEvent
# å­—段不确定无法处理的 tagUniversalGameRec  éœ€è¦ç ”发人员配合
# ä¸ä¼šä½¿ç”¨çš„不处理 tagDBMailList tagExpiation tagPetExpiation tagAccCoins
#-------------------------------------------------------------------------------
# ver=1.2
#-------------------------------------------------------------------------------
import pymongo
from Collections import (DataServerPlayerData, )
DBConfig = __import__('Config.DBConfig')
def changeAccID(accID, spid, serverid):
    accpeice = accID.split("@")
    if len(accpeice) < 3:
        return ""
    if not spid:
        spid = accpeice[-2]
    if not serverid:
        serverid = accpeice[-1]
    accID = accID.replace("@%s@%s"%(accpeice[-2], accpeice[-1]), "@%s@%s"%(spid, serverid))
    return accID
def main():
    print "Connect %s:%s "%(DBConfig.USER_DB_IP, DBConfig.USER_DB_PORT)
    con = pymongo.Connection(DBConfig.USER_DB_IP, DBConfig.USER_DB_PORT)
    db = con.admin
    if not db.authenticate(DBConfig.userdb_user, DBConfig.userdb_pwd):
        print "name(%s) or password(%s) error!, Plz try input them to continue again!"%(DBConfig.userdb_user, DBConfig.userdb_pwd)
        return
    db = con[DBConfig.USER_DB_NAME]
    # ä¿®æ”¹çŽ©å®¶è¡¨å’Œè´¦å·è¡¨ä¸­çš„çŽ©å®¶è´¦å·
    col = db['tagDSAccount']
    cnt = 0
    for rec in col.find():
        accID = rec["ACCID"]
        accountObj = DataServerPlayerData.tagDSAccount()
        accountObj.ACCID = accID
        # åŠ è½½æ•°æ®
        if not accountObj.adoLoad(col):
            print 'accid %s not found!'%accID
            continue
        newAccID = changeAccID(accID, DBConfig.Spid, DBConfig.Serverid)
        if not newAccID:
            continue
        # è½½å…¥æ–°è´¦å·
        accountObj.ACCID = newAccID
        rec = accountObj.getRecord()
        col.update({'ACCID':accID}, {'$set':rec}, False, False, True, True)
        cnt += 1
    print 'table:tagDSAccount update  successfully! cnt=%s changeto %s-%s'%(cnt, DBConfig.Spid, DBConfig.Serverid)
    for table in ['tagDBPlayer', 'tagAccIDSendPrize', 'tagDBGMIP', 'tagGameWorldEvent']:
        # ä¿®æ”¹çŽ©å®¶è¡¨å’Œè´¦å·è¡¨ä¸­çš„çŽ©å®¶è´¦å·
        colPlayer = db[table]
        cnt = 0
        keyName = "AccID"
        for rec in colPlayer.find():
            accID = rec[keyName]
            newAccID = changeAccID(accID, DBConfig.Spid, DBConfig.Serverid)
            if not newAccID:
                continue
            # è½½å…¥æ–°è´¦å·
            rec[keyName]=newAccID
            del rec["_id"]
            colPlayer.update({keyName:accID}, {'$set':rec}, False, False, True, True)
            cnt += 1
        print 'table:%s update  successfully!  cnt=%s changeto %s-%s'%(table, cnt, DBConfig.Spid, DBConfig.Serverid)
    # æŽ’行榜
    # ä¿®æ”¹çŽ©å®¶è¡¨å’Œè´¦å·è¡¨ä¸­çš„çŽ©å®¶è´¦å·
    colPlayer = db['tagDBBillboard']
    cnt = 0
    keyName = "Name2"
    for rec in colPlayer.find():
        accID = rec[keyName]
        newAccID = changeAccID(accID, DBConfig.Spid, DBConfig.Serverid)
        if not newAccID:
            continue
        # è½½å…¥æ–°è´¦å·
        rec[keyName]=newAccID
        del rec["_id"]
        colPlayer.update({keyName:accID, 'Type':rec['Type']}, {'$set':rec}, False, False, True, True)
        cnt += 1
    print 'table:tagDBBillboard update  successfully!  cnt=%s changeto %s-%s'%(cnt, DBConfig.Spid, DBConfig.Serverid)
    db = con[DBConfig.USER_DB_Log]
    # ä¿®æ”¹çŽ©å®¶è¡¨å’Œè´¦å·è¡¨ä¸­çš„çŽ©å®¶è´¦å·
    colPlayer = db['tagDBPlayerInfoLog']
    cnt = 0
    for rec in colPlayer.find():
        accID = rec["AccID"]
        newAccID = changeAccID(accID, DBConfig.Spid, DBConfig.Serverid)
        if not newAccID:
            continue
        # è½½å…¥æ–°è´¦å·
        rec['AccID']=newAccID
        del rec["_id"]
        colPlayer.update({'AccID':accID}, {'$set':rec}, False, False, True, True)
        cnt += 1
        print 'table:tagDBPlayerInfoLog update  successfully!  cnt=%s changeto %s-%s'%(cnt, DBConfig.Spid, DBConfig.Serverid)
    con.disconnect()
if __name__ == "__main__":
    main()
Tool/Êý¾Ý¿â/ChangeAccount/Collections/CollectionVesionNO.py
New file
@@ -0,0 +1,12 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
######################
#存放需校验SID的表版本号,用于忽略因为表结构变更导致的SID校验错误
#%TableName%_VersionNO
tagDBPlayer_VersionNO = 3
tagDSAccount_VersionNO = 3
tagRoleItem_VersionNO = 1
Tool/Êý¾Ý¿â/ChangeAccount/Collections/DataServerLogData.py
New file
Diff too large
Tool/Êý¾Ý¿â/ChangeAccount/Collections/DataServerPlayerData.py
New file
Diff too large
Tool/Êý¾Ý¿â/ChangeAccount/Collections/__init__.py
Tool/Êý¾Ý¿â/ChangeAccount/Common/CommFunc.py
New file
@@ -0,0 +1,521 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#
#
##@package CommFunc.py
# @todo: å…¬å…±è°ƒç”¨å‡½æ•°é›†
# @author:eggxp
# @date 2010-01-01 00:00
# @version 1.6
#
# ä¿®æ”¹æ—¶é—´ ä¿®æ”¹äºº ä¿®æ”¹å†…容
# @change: "2010-01-19 16:35"  zb  ä¿®æ”¹å…¬å…±å‡½æ•°çš„一个错误,解决小喇叭输入'瞾'字会导致客户端弹框的问题
# @change: "2010-01-29 11:45"  chenxuewei  ä¿®æ”¹å…¬å…±å‡½æ•°ReplaceBig5AppointSign(srcStr,sign,desSign)的一个错误,解决字符串srcStr最后一个字节的字符替换问题
# @change: "2010-04-02 17:45"  zb  æ·»åŠ å…¬å…±å‡½æ•°ToDWORD()
# @change: "2010-04-02 20:30"  zb  å°†ReadBYTE()/ReadDWORD()/ReadDWORD(),改成无符号数读取
# @change: "2010-09-27 15:55"  chenxuewei  å°†WriteBYTE()/WriteDWORD()/WriteDWORD(),改成自动转化有无符号数写入
#
# @change: "2011-03-15 17:20"  Alee ä¸ŽGameWorld中的函数重复
#
#---------------------------------------------------------------------
#导入
import os
import struct
import string
import math
import datetime
import subprocess
#---------------------------------------------------------------------
#全局变量
MODULE_NAME = "cmd_mail"
VER = "2011-03-15 17:20"
## ç”¨äºŽå‘包,当封包是DWORD的时候
#  @param num æ•°å­—
#  @return æœ‰ç¬¦å·æ•°å­—
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼šç”¨äºŽå‘包,当封包是DWORD的时候,转换为有符号数
def ToDWORD( num ):
    if num >= 0:
        return num
    return num + 4294967296
## å°†hex转化成二进制对应的字符串,用于发包
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼šå°†hex转化成二进制对应的字符串,用于发包
def HexToBin (hexStr):
    returnStr = ''
    hexStrLen = len(hexStr)
    for i in [j for j in range(hexStrLen) if j%2==0]:
        returnStr += chr(string.atoi(hexStr[i:i+2],16))
    return returnStr
#获取异常信息#(try:...except:..GetExceptionInfo())
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def GetExceptionInfo():
    import traceback
    return traceback.format_exc()
#执行cmd指令
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def RunCmd(curCmd):
    pipe = subprocess.Popen(['cmd', ""], shell = False,
                                 stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    pipe.stdin.write('%s\n'%curCmd)
    pipe.stdin.close()
    retStr = pipe.stdout.read()
    retStr += pipe.stderr.read()
    print retStr
    return retStr
#取得代码中真实的字符串(如参数srcStr是'\n',会得到回车符)
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def GetCodeStr(srcStr):
    desStr = srcStr.replace("'", "\\'")
    cmd = "desStr='" + desStr + "'"
    exec(cmd)
    return desStr
#python写文件:
#    f = file('c:\\fuck.txt', 'a')
#    f.write(mapObsData)
#等待输入: raw_input()
#创建Socket
#s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
#s.bind(('192.168.0.81', 6112))
#s.listen(1)
#获得子目录:
#os.path.abspath
#等待输入:
#raw_input()
#得到本目录:
#os.getcwd()
#得到参数:
#os.sys.argv
#得到python路径
#os.sys.executable
#运行外部文件/结束外部文件
#processID = os.spawnl(os.P_NOWAIT, pythonPath, '-p', os.path.join(curPath, 'test.py'))
#win32api.TerminateProcess(processID, 0)
#python的读取/写入库
#------------------------读取
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def ReadBYTE(buf, pos):
    curValue = struct.unpack_from('B', buf, pos)
    pos += 1
    return curValue[0], pos
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def ReadWORD(buf, pos):
    curValue = struct.unpack_from('H', buf, pos)
    pos += 2
    return curValue[0], pos
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def ReadDWORD(buf, pos):
    curValue = struct.unpack_from('I', buf, pos)
    pos += 4
    return curValue[0], pos
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def ReadFloat(buf, pos):
    curValue = struct.unpack_from('f', buf, pos)
    pos += 4
    return curValue[0], pos
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def ReadDouble(buf, pos):
    curValue = struct.unpack_from('d', buf, pos)
    pos += 8
    return curValue[0], pos
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def ReadString(buf, pos, _len):
    curValue = struct.unpack_from('%ds'%_len, buf, pos)
    pos += _len
    return curValue[0], pos
#----------------------写入
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def Pack(sign, value):
    if value < 0:
        sign = sign.lower()
    else:
        sign = sign.upper()
    return struct.pack(sign, value)
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def WriteBYTE(buf, value):
    buf += Pack('B', value)
    return buf
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def WriteWORD(buf, value):
    buf += Pack('H', value)
    return buf
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def WriteDWORD(buf, value):
    buf += Pack('I', value)
    return buf
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def WriteFloat(buf, value):
    buf += struct.pack('f', value)
    return buf
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def WriteDouble(buf, value):
    buf += struct.pack('d', value)
    return buf
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def WriteString(buf, len, value):
    buf += struct.pack('%ds'%len, value)
    return buf
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def GetDistance(srcX, srcY, destX, destY):
    return math.sqrt(pow(srcX - destX, 2) + pow(srcY - destY, 2))
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def MovePos(srcX, srcY, destX, destY, curMoveDist):
    if curMoveDist == 0:
        return  srcX, srcY
    totalDist = GetDistance(srcX, srcY, destX, destY)
    if totalDist == 0:
        return  srcX, srcY
    resultX = curMoveDist / float(totalDist) * (destX - srcX) + srcX
    resultY = curMoveDist / float(totalDist) * (destY - srcY) + srcY
    return resultX, resultY
##测试代码:
#strs = '美香是猪'
#buf = ''
#buf = WriteString(buf, len(strs), strs)
#value, pos = ReadString(buf, 0, len(strs))
#print value
#获得当前系统时间
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def GetCurrentDataTimeStr():
    curTime = datetime.datetime.today()
    curTimeStr = str(curTime)
    curTimeStr = curTimeStr.split(".")[0]
    return curTimeStr
#字符串转换为整型, å¦‚果不能转换, è¿”回默认值
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def ToIntDef(input, defValue = 0):
    try:
        result = int(input)
        return result
    except ValueError:
        return defValue
#16进制颜色转换
#"#FFFFFF"--"255,255,255"
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def HcToSc(h):
    h="0x"+h[1:7]
    red=string.atoi(h[:2]+h[2:4], base=16)
    green=string.atoi(h[:2]+h[4:6], base=16)
    blue=string.atoi(h[:2]+h[6:8], base=16)
    cStr=str(red)+","+str(green)+","+str(blue)
    return cStr
#"255,255,255"--"#FFFFFF"
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def ScToHc(s):
    red=hex(string.atoi(s.split(",")[0]))[2:]
    green=hex(string.atoi(s.split(",")[1]))[2:]
    blue=hex(string.atoi(s.split(",")[2]))[2:]
    hStr="#"+str(red+green+blue)
    return hStr
#16进制转换
#"0xFFFFFF"--"255,255,255"
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def HdToSd(h):
    red=string.atoi(h[0:2]+h[2:4], base=16)
    green=string.atoi(h[0:2]+h[4:6], base=16)
    blue=string.atoi(h[0:2]+h[6:8], base=16)
    cStr=str(red)+","+str(green)+","+str(blue)
    return cStr
#"255,255,255"--"0xFFFFFF"
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def SdToHd(s):
    red=hex(string.atoi(s.split(",")[0]))[2:]
    green=hex(string.atoi(s.split(",")[1]))[2:]
    blue=hex(string.atoi(s.split(",")[2]))[2:]
    hStr="0x"+str(red+green+blue)
    return hStr
#提示除零错误的EVAL
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def SafeEval(value):
    try:
        return eval(value)
    except ZeroDivisionError:
        return "Division is Zero"
##生成指定文件(如par:r'E:\开发版本\Data\logo\formName1.log')
#def MakeAppointFile(par):
#    dir = os.path.dirname(par)  # èŽ·å¾—æ–‡ä»¶ç›®å½•
#    os.makedirs(dir)  # åˆ›å»ºå¤šçº§ç›®å½•
#    file = open(os.path.basename(par),'w')
#    file.close()
#
##在指定目录根据当前时间生成新目录(如par:r'E:\开发版本\Data\logo')
#def MakeCurTimeDir(par):
#    if not os.path.exists(par):  # ä¼ è¿›æ¥çš„目录不存在
#        return
#    path=par+'\\'+str(datetime.datetime.today()).split()[0]
#    if not os.path.exists(path):  # æ–‡ä»¶å¤¹æ˜¯å¦å­˜åœ¨ï¼Œä¸å­˜åœ¨åˆ™åˆ›å»º
#        os.mkdir(path)  # åˆ›å»ºæ–‡ä»¶å¤¹
#生成指定目录(如par:r'E:\开发版本\Data\logo')
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def MakeAppointDir(par):
    if not isinstance(par,str):
        return
    pathList=par.split('\\')
    path=pathList[0]
    for i in range(1,len(pathList)):
        path+='\\'+pathList[i]
        if not os.path.exists(path):  # æ–‡ä»¶å¤¹æ˜¯å¦å­˜åœ¨ï¼Œä¸å­˜åœ¨åˆ™åˆ›å»º
            os.mkdir(path)  # åˆ›å»ºæ–‡ä»¶å¤¹
#生成指定文件(如par:r'E:\开发版本\Data\logo\formName1.log')
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def MakeAppointFile(par):
    if not isinstance(par,str):
        return
    pathList=par.split('\\')
    path=pathList[0]
    for i in range(1,len(pathList)):
        path+='\\'+pathList[i]
        if i==len(pathList)-1:
            file=open(path,'w')
            file.close()
        else:
            if not os.path.exists(path):  # æ–‡ä»¶å¤¹æ˜¯å¦å­˜åœ¨ï¼Œä¸å­˜åœ¨åˆ™åˆ›å»º
                os.mkdir(path)  # åˆ›å»ºæ–‡ä»¶å¤¹
#在指定目录根据当前时间生成新目录(如par:r'E:\开发版本\Data\logo')
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def MakeCurTimeDir(par):
    if not os.path.exists(par):  # ä¼ è¿›æ¥çš„目录不存在
        return
    path=par+'\\'+str(datetime.datetime.today()).split()[0]
    if not os.path.exists(path):  # æ–‡ä»¶å¤¹æ˜¯å¦å­˜åœ¨ï¼Œä¸å­˜åœ¨åˆ™åˆ›å»º
        os.mkdir(path)  # åˆ›å»ºæ–‡ä»¶å¤¹
#得到替换后的字符串(参数:string是需要替换的字符串;varlist为不定参,为替换内容)
#如GetReplaceString('str%s%s','str1','str2','str3','str4'),return结果为'strstr1str2'
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def GetReplaceString(string,*varlist):
    if '%' not in string:
        return string
    repalceCount = len(varlist)  # æ›¿æ¢æ¬¡æ•°
    newStr = string
    if '%%' in string:
        newStr = string.replace('%%','')  # åŽ»é™¤å­—ç¬¦ä¸²str内的'%%'
    needReplaceCount = newStr.count('%')  # å­—符串newStr内的'%'个数,即需要替换的次数
    if repalceCount < needReplaceCount:
        tempList = list(varlist)
        for i in range(needReplaceCount-repalceCount):
            tempList.append(0)
        replaceTuple= tuple(tempList)
        #告诉调用者,参数传少了
        return 'func:GetReplaceString();error:the parameter lack'
#        return string%replaceTuple
    replaceTuple = tuple(varlist[:needReplaceCount])
    return string%replaceTuple
#将unicode编码转换成中文字符(参数:"#19968"-"#40869"之间)
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def UnicodeStrToGBKStr(U_STR):#如输入"#23435",获得返回值"宋"
    import re
    RegularExpression="#[0-9]+"
    if not re.match(RegularExpression,U_STR):
        return U_STR
    UnicodeNum=int(U_STR[1:])
    CODEC="GBK"
    try:
        unicode_string=eval("u'\u%s'"%((hex(UnicodeNum))[2:]))
        GBK_str=unicode_string.encode(CODEC)
    except:
        return U_STR
    return GBK_str
#用指定字符desSign替换繁体字符串srcStr的指定单字节字符sign
##
#  @param å‚æ•°
#  @return è¿”回值
#  @remarks å‡½æ•°è¯¦ç»†è¯´æ˜Žï¼š
def ReplaceBig5AppointSign(srcStr,sign,desSign):
    isContinue = False
    desStr = ''
    for i in range( len(srcStr) ):
        if isContinue:
            #如果最后两个字节刚好是一个繁体字,则倒数第二个字节时会判定,最后一个字节则在此跳过
            isContinue = False
            continue
        #已到字符串最后一个字节,操作完跳出循环
        if i == len(srcStr)-1:
            if srcStr[i] == sign:
                #替换
                desStr = desStr + desSign
            else:
                desStr = desStr + srcStr[i]
            break  # è·³å‡ºå¾ªçޝ
        if 129 <= ord(srcStr[i]) <= 254:  # åˆ¤æ–­æ˜¯å¦åœ¨Big5高位字节范围内
            if 64 <= ord(srcStr[i+1]) <= 126 or 161 <= ord(srcStr[i+1]) <= 254:  # åˆ¤æ–­æ˜¯å¦Big5低位字节范围内
                isContinue = True  # ä¸‹æ¬¡åˆ¤æ–­é«˜å­—节时,可跳过一次循环
                desStr = desStr + srcStr[i:i+2]
            else:
                #不在Big5低位字节范围内
                if srcStr[i] == sign:
                    #替换
                    desStr = desStr + desSign
                else:
                    desStr = desStr + srcStr[i]
        else:
            #不在Big5高位字节范围内
            if srcStr[i] == sign:
                #替换
                desStr = desStr + desSign
            else:
                desStr = desStr + srcStr[i]
    return desStr
Tool/Êý¾Ý¿â/ChangeAccount/Common/CommFuncEx.py
New file
@@ -0,0 +1,190 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
import mylog
from DBCommon import error
def EncodingToUnicode(srcEncoding, input):
    try:
        result = unicode(input, srcEncoding)    #translate to utf-8
    except:
        msg = error.formatMsg('error', error.ERROR_NO_5, 'encode error!srcEncoding = %s input = %s'%(srcEncoding, repr(input)))
        mylog.error(msg)
        return False, None
    return True, result
def UnicodeToEncoding(dstEncoding, input):
    try:
        result = input.encode(dstEncoding)
    except:
        msg = error.formatMsg('error', error.ERROR_NO_6, 'encode error!dstEncoding = %s input = %s'%(dstEncoding, repr(input)))
        mylog.error(msg)
        return False, None
    return True, result
crcTable = (
            0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
            0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
            0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
            0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
            0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
            0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
            0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
            0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
            0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
            0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
            0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
            0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
            0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
            0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
            0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
            0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
            0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
            0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
            0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
            0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
            0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
            0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
            0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
            0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
            0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
            0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
            0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
            0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
            0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
            0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
            0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
            0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
            0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
            0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
            0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
            0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
            0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
            0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
            0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
            0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
            0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
            0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
            0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
            0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
            0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
            0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
            0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
            0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
            0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
            0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
            0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
            0x2d02ef8dL
            )
def DO1(crc, buf, pos):
    global crcTable
#    crcTable[crc ^ ord(buf[pos]) & 0xFF]
    crc = crcTable[(crc ^ ord(buf[pos])) & 0xFF] ^ (crc >> 8)
    pos += 1
    return crc, pos
def DO(n, crc, buf, pos):
    for i in xrange(n):
        crc, pos = DO1(crc, buf, pos)
    return crc, pos
def GetCrc32(crc, buf):
    if not buf:
        return 0
    crc = crc ^ 0xffffffffL
    length = len(buf)
    pos = 0
    while length >= 8:
        stepLen = 8
        crc, pos = DO(stepLen, crc, buf, pos)
        length -= stepLen
    while length > 0:
        crc, pos = DO1(crc, buf, pos)
        length -= 1
    return crc ^ 0xffffffffL
def LoadLibraryEx(DllName):
    "DLL Load ,return the handle of the dll or None"
    from ctypes import windll
    try:
        return windll.LoadLibrary(DllName)
    except WindowsError:
        return None
    return None
#弹框类型
MB_OK = 0
MB_OKCANCEL = 1
MB_ABORTRETRYIGNORE = 2
MB_YESNOCANCEL = 3
MB_YESNO = 4
MB_RETRYCANCEL = 5
MB_ICONHAND = 16
MB_ICONQUESTION = 32
MB_ICONEXCLAMATION = 48
MB_ICONASTERISK = 64
MB_ICONWARNING = MB_ICONEXCLAMATION
MB_ICONERROR = MB_ICONHAND
MB_ICONINFORMATION = MB_ICONASTERISK
MB_ICONSTOP = MB_ICONHAND
MB_DEFBUTTON1 = 0
MB_DEFBUTTON2 = 256
MB_DEFBUTTON3 = 512
MB_DEFBUTTON4 = 768
MB_APPLMODAL = 0
MB_SYSTEMMODAL = 4096
MB_TASKMODAL = 8192
MB_HELP = 16384
MB_NOFOCUS = 32768
MB_SETFOREGROUND = 65536
MB_DEFAULT_DESKTOP_ONLY = 131072
MB_TOPMOST = 262144
MB_RIGHT = 524288
MB_RTLREADING = 1048576
MB_SERVICE_NOTIFICATION = 2097152
MB_TYPEMASK = 15
MB_USERICON = 128
MB_ICONMASK = 240
MB_DEFMASK = 3840
MB_MODEMASK = 12288
MB_MISCMASK = 49152
def MessageBox(title,msg,stype):
#    import win32api,win32gui
#    import win32con,winerror,win32event,pywintypes
#    ct = win32api.GetConsoleTitle()
#    hd = win32gui.FindWindow(0,ct)
#    win32api.MessageBox(hd,msg,title,win32con.MB_OK)
    hd = LoadLibraryEx("user32.dll")
    if hd is not None:
        hd.MessageBoxA(0,msg,title,stype)
#将Delphi的TDateTime浮点数转化成字符串格式
g_dllTDateTimeFunc = None
def TDateTimeToString(dTime,default = "1900-01-01 00:00:00"):
    global g_dllTDateTimeFunc
    from ctypes import (c_char_p,c_double)
    strTime = default#默认值
    try:
        if g_dllTDateTimeFunc == None:
            g_dllTDateTimeFunc = LoadLibraryEx("TDateTimeFunc.dll")
        if g_dllTDateTimeFunc == None:
            msg=error.formatMsg('DeployError', error.ERROR_NO_162, 'TDateTimeFunc.dll Load fail!!')
            mylog.DeployError(msg,False)
            return strTime
        strTime = c_char_p(g_dllTDateTimeFunc.TDateTimeToString(c_double(dTime))).value
    except:
        msg=error.formatMsg('error', error.ERROR_NO_162, ' Call TDateTimeToString fail!!')
        mylog.error(msg)
        return  strTime
    return  strTime
if __name__ == '__main__':
    print '0x%x'%GetCrc32(0, 'hello')
Tool/Êý¾Ý¿â/ChangeAccount/Common/__init__.py
Tool/Êý¾Ý¿â/ChangeAccount/Common/mylog.py
New file
@@ -0,0 +1,174 @@
#-*- coding: GBK -*-
#LOG定义模块
import logging
from time import localtime
import traceback
__console = None
#报错用弹框
def ErrorBox(title,msg):
    from CommFuncEx import (MessageBox, MB_ICONERROR, MB_TOPMOST)
    MessageBox("MongoDBServer:%s"%title.upper(),msg,MB_ICONERROR|MB_TOPMOST)
def InitMyLog( LogName, isDebug ):
    global __console
    # set up logging to file - see previous section for more details
    now = localtime()
    file = "%s-%d-%d-%d.log" % ( LogName, now.tm_year, now.tm_mon, now.tm_mday )
    openMode = 'a'
    logLevel = logging.INFO
    if isDebug:
        openMode = 'w'
        logLevel = logging.DEBUG
    logging.basicConfig(level=logLevel,
#                        format='%(name)-12s %(asctime)s %(name)-12s %(levelname)-8s %(message)s',
#                        format='%(name)-12s %(asctime)s %(levelname)-8s %(threadName)s %(module)s %(funcName)s %(lineno)d %(message)s',
                        format='%(levelname)-8s %(asctime)s %(threadName)s %(module)s %(funcName)s %(lineno)d: %(message)s',
                        datefmt='%Y-%m-%dT%H:%M:%S',
                        filename=file,
                        filemode=openMode)
    #日志统一不写到控制台,控制台用来显示状态
    # define a Handler which writes INFO messages or higher to the sys.stderr
    __console = logging.StreamHandler()
    __console.setLevel(logging.INFO)
    # set a format which is simpler for console use
    formatter = logging.Formatter('%(name)-12s %(asctime)s %(name)-12s %(levelname)-8s %(message)s')
    # tell the handler to use this format
    __console.setFormatter(formatter)
    # add the handler to the root logger
    logging.getLogger('').addHandler(__console)
def removeConsoleHandler():
    __console.close()
    logging.getLogger('').removeHandler(__console)
#-----------------------------------------------------------------------------------------------------------------------------------------
#不直接调用logging模块的函数,而调用以下函数以便进行出错统计
#-----------------------------------------------------------------------------------------------------------------------------------------
#CRITICAL = 50
#FATAL = CRITICAL
#ERROR = 40
#WARNING = 30
#WARN = WARNING
#INFO = 20
#DEBUG = 10
#NOTSET = 0
try:
    import threading
except ImportError:
    import dummy_threading as threading
_fatalCntLock = threading.Lock()
_fatalCnt = 0
def fatal(msg, showError = True):
    global _fatalCntLock
    global _fatalCnt
    _fatalCntLock.acquire()
    _fatalCnt += 1
    _fatalCntLock.release()
#    logging.info(traceback.format_stack())
    logging.critical("\ncallstack:\n%smsg:%s"%("".join(traceback.format_stack()), msg))
    if showError:
        ErrorBox("fatal",msg)
        return
_errorCntLock = threading.Lock()
_errorCnt = 0
def error(msg, showError = False):
    global _errorCntLock
    global _errorCnt
    _errorCntLock.acquire()
    _errorCnt += 1
    _errorCntLock.release()
    logging.error("\ncallstack:\n%smsg:%s"%("".join(traceback.format_stack()), msg))
    if showError:
        ErrorBox("error",msg)
        return
_designErrorCntLock = threading.Lock()
_designErrorCnt = 0
def DesignError(msg, showError = True):
    global _designErrorCnt
    global _designErrorCntLock
    _designErrorCntLock.acquire()
    _designErrorCnt += 1
    _designErrorCntLock.release()
    logging.error("To Design:%s"%msg)
    #调试版弹框提示
    if showError:
        ErrorBox("Design Error",msg)
        return
_DeployErrorCntLock = threading.Lock()
_DeployErrorCnt = 0
def DeployError(msg, showError):
    global _DeployErrorCntLock
    global _DeployErrorCnt
    _DeployErrorCntLock.acquire()
    _DeployErrorCnt += 1
    _DeployErrorCntLock.release()
    logging.error("To Deployer:%s"%msg)
    if showError:
        ErrorBox("Deploy Error", msg)
_warningCntLock = threading.Lock()
_warningCnt = 0
def warning(msg):
    global _warningCntLock
    global _warningCnt
    _warningCntLock.acquire()
    _warningCnt += 1
    _warningCntLock.release()
    logging.warning(msg)
def info(msg):
    logging.info(msg)
def debug(msg):
    logging.debug(msg)
def getLogStaticDict():
    dict = {}
    dict['fatal'] = _fatalCnt
    dict['error'] = _errorCnt
    dict['designError'] = _designErrorCnt
    dict['warning'] = _warningCnt
    return dict
def test_override_funcs():
    InitMyLog('test1.log')
#    info('test')
#    error('err')
def test():
    InitMyLog("test.log")
        # Now, we can log to the root logger, or any other logger. First the root...
    error('Jackdaws love my big sphinx of quartz.')
    logging.error('Jackdaws love my big sphinx of quartz.')
    # Now, define a couple of other loggers which might represent areas in your
    # application:
    logger1 = logging.getLogger('myapp.area1')
    logger2 = logging.getLogger('myapp.area2')
    logger1.debug('Quick zephyrs blow, vexing daft Jim.')
    logger1.info('How quickly daft jumping zebras vex.')
    logger2.warning('Jail zesty vixen who grabbed pay from quack.')
    logger2.error('The five boxing wizards jump quickly.')
if __name__ == '__main__':
#    test_override_funcs()
    import os
    print os.getcwd()
    test()
Tool/Êý¾Ý¿â/ChangeAccount/Config/DBConfig.py
New file
@@ -0,0 +1,87 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
from DBCommon import GlobalFunctions
import traceback
import ConfigParser
import os
from DBCommon import error
from Common import mylog
#配置字典
#格式:keyname:[defvalue, secionname],新增配置只要在下面字典定义中新增一行即可
#用法,import模块后,直接DBConfig.开关名称 å³å¯
dbconfig = {
#auth section
"userdb_user":['', "auth"],
"userdb_pwd":['', 'auth'],
#connect section
"USER_DB_PORT":[27017, "connect"], #MongoDB端口
"USER_DB_IP":["localhost", "connect"], #MongoDB IP
"USER_DB_NAME":["GameUser", "connect"], #MongoDB Name
"USER_DB_Log":["GameLog", "connect"], #MongoDB Name
#update
"Spid":["test", "update"],
"Serverid":["s1", "update"],
}
def ReadCongfigValue(config, secname, keyname, defvalue):
    try:
        if config.has_option(secname, keyname):
            value = config.get(secname, keyname)
#            if type(defvalue) == str:
#                value = type(defvalue)(value)
            if type(defvalue) == bool:
                value = type(defvalue)(int(value))
            elif type(defvalue) in (dict, list, tuple):
                value = eval(value)
            else:
                value = type(defvalue)(value)
        else:return defvalue
    except:
        msg = error.formatMsg('error', error.ERROR_NO_18, 'config = %s, secname = %s, keyname = %s, defvalue = %s\n%s'%(config, secname, keyname, defvalue, traceback.format_exc()))
        mylog.error(msg)
        return None
#    print value
    return value
def ReadDBConfig():
    try:
        config = ConfigParser.ConfigParser()
        config.read(os.path.join(GlobalFunctions.getAppPath(), 'config\\config.ini'))
        self_module = __import__(__name__)
        #读取数据库配置文件
        for k, v in dbconfig.items():
            value = ReadCongfigValue(config, v[1], k, v[0])
            if value == None:return False
            setattr(self_module, k, value)
    except:
        msg = error.formatMsg('error', error.ERROR_NO_28, '%s'%traceback.format_exc())
        mylog.error(msg)
        return False
    return True
dbconfig_init = False
if not dbconfig_init:
    if not ReadDBConfig():
        msg = error.formatMsg('fatal', error.ERROR_NO_29, "Init config failed.")
        mylog.fatal(msg)
    dbconfig_init = True
Tool/Êý¾Ý¿â/ChangeAccount/Config/__init__.py
Tool/Êý¾Ý¿â/ChangeAccount/Config/config.ini
New file
@@ -0,0 +1,15 @@
;mongodb ç”¨æˆ·æŽˆæƒå¸å·å¯†ç é…ç½®
[connect]
USER_DB_PORT=27017
USER_DB_IP=127.0.0.1
USER_DB_NAME=GameUser
USER_DB_Log=GameLog
[auth]
userdb_user=sa
userdb_pwd=sa
[update]
Spid=test
Serverid=s15
Tool/Êý¾Ý¿â/ChangeAccount/DBCommon/CommonDefine.py
New file
@@ -0,0 +1,377 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
#是否调试版本
import os
isDebugVersion = -1
def IsDebug():
    global isDebugVersion
    if isDebugVersion == -1:
        isDebugVersion = os.path.exists("BBF84B34-357E-435B-B3FF-D60370AAA6ED")
    return isDebugVersion
DATASAVE_MARK  =  0xFF88
#需开出配置
#调试用
class ShortBuf(Exception):
    "Exception raised by readData method when src buf is too shourt."
    def __init__(self, msg):
        Exception.__init__(self)
        self.msg = msg
DUMPPACKET = False
MAX_RECV = 1024
MAX_PACK_LEN = 100 * 1024 * 1024
MAX_PACK_POOL_SIZE = 10000
PACK_POOL_INCREASE_SIZE = 1000
CLIENT_POOL_SIZE = 100
CLIENT_POOL_INC_SIZE = 10
VERSION_FILE_NAME = 'Version.chver'
SYSDB_PATH = 'SysDB'
PY_SYS_DB_PATH = 'PySysDB'
CFG_PATH = 'Config'
DUMP_PATH = 'UserLogs'
#编码
ENCODING = 'gbk'
#ASCII字符串长度
ACCIDLEN = 65
PSWLEN = 33
PSWLV2LEN = 33
IPLEN = 20
USERNAMELEN = 9
SEXLEN = 3
BIRTHDAYLEN = 21
QQLEN = 41
MAILLEN = 41
PROVINCELEN = 31
CITYLEN = 31
########################### TGMOper define #############################
gmForbidFight = 0 #/<禁止战斗
gmForbidAcc = 1 #/<禁止帐号
gmForbidVisible = 2 #/<隐身
gmForbidTalk = 3 #/<禁言
########################### TPlayerState define #############################
#主角帐号状态
#0: æœªåˆ›å»º, 1: åˆ›å»ºOK,正常登录 2:封号
pysUnCreated = 0 #/<未创建
pysNormal = 1 #/<创建OK
pysForbidden = 2 #/<GM封号
pysSIDCheckErrorForbidden = 3 #/<系统封号
pysServerMerge = 4 #/<合服之后的状态
def isAccStateForbidden(accState):
    return (accState >= pysForbidden and accState <= pysSIDCheckErrorForbidden)
########################### TMapServserState define #############################
#地图服务器状态#TMapServserState
mssNone = 0 #/<不存在
mssConnecting = 1 #/<连接中
mssIniting = 2 #/<初始化之中
mssRunning = 3 #/<运行中
mssPyError = 4 #/<python错误
mssCError = 5 #/<c++错误
mssDisconnect = 6 #/<断开连接了
mssCppWarn = 7 #/<C++警告(这类错误需要知道,但不需要马上处理)
mssMax = 8
##define GAMESERVER_DATA_VERSION_NO      ((WORD)((sizeof(tagDBPlayer) + sizeof(tagRoleItem)\
#                                        + sizeof(tagFamilyInfo) + sizeof(tagPlayerFamily))%100) + 5)
#GAMESERVER_DATA_VERSION_NO = 0x3B#独立放一个文件,C++编译时生成
########################### ActionType define #############################
# å°åŒ…类型#ActionType.改动此枚举,需修改RouteServerInfo.py
atMin = 0
atNormal = 1 #普通封包
atInner = 2 #内部网通讯封包
atKickOutPlayer = 3 #服务器踢出人物
atPlayerLogin = 4 #人物登录
atDisconnect = 5 #服务器断线封包
atWorldLogic = 6 #世界逻辑封包
atHeart = 7 #服务器间心跳包
atConnect = 8 # æœåŠ¡å™¨è¿žæŽ¥æˆåŠŸ
atMapServerPlayerLogin = 9 # é€šçŸ¥åœ°å›¾æœåŠ¡å™¨çŽ©å®¶ç™»å½•
atMapServerSaveOut = 10 # é€šçŸ¥åœ°å›¾æœåŠ¡å™¨çŽ©å®¶ä¸‹çº¿
atRunGateKickOutPlayer = 11
atMax = 12 #标识封包的最大数目,不要往后添加枚举
########################### TBalanceServerToDataServer define #############################
#RouteServer发送到DataServer的封包类型#TBalanceServerToDataServer
gstPlayerLogin = 1
gstPlayerDetail = 2
gstCreatePlayer = 3 #创建玩家
gstCheckPlayerExist = 4 #检查玩家是否存在
gstQueryCanSendMail = 5 #查询玩家是否能发送邮件
gstGetPlayerMail = 6 #得到玩家邮件列表
gstGetMailDetail = 7 #得到一封邮件
gstUpdateMail = 8 #更新邮件信息
gstDeleteMail = 9 #删除邮件
gstOnDay = 10 #OnDay事件
gstFamilyVS = 11 #家族对战表
gstGetPlayerMailState = 12 #得到玩家邮件状态(已满, æ–°ä¿¡ä»¶)
gstGetCoin = 13 #取得点券数目
gstCoinChange = 14 #点券兑换金子
gstPlayerBillboardLV = 15
gstAccIDSendPrize = 16
gstInsertAcc = 17 #插入帐号
gstGMCommandListReq = 18 #GM命令列表请求
gstAddAccItem = 19 #插入虚宝物品
gstCheckItemPrize = 20 #检查是否有奖励
gstCheckLoadAcc = 21 #[网龙接口] åœ¨æ•°æ®åº“çš„Account表中插入数据.
gstUpdatePswLV2 = 22 #更新二级密码
gstGetExpiationCount = 23 #得到奖励个数
gstGetExpiation = 24 #得到奖励
gstAddExpiation = 25 #添加奖励
gstAddPlayerMailByAccID = 26 #根据帐号ID存储玩家邮件
gstServerMergeDeleteRole = 27 #因合服删除玩家
gstServerMergeChangeName = 28 #因合服而重命名
gstServerMergeUpdatePlayer = 29 #因合服而更新玩家
gstQueryIsFamilyLeader = 30 #查询是否是家族长
gstServerMergeUpdateAccState = 31 #更新账户状态
gstMapServerInfo = 32 #地图服务器信息
gstServerVersion = 33 #服务器版本号信息
#/< åˆ›å»ºå® ç‰©
#/////////////////////以下是日志记录
gstCreatePet = 34
gstSavePlayerLog = 35 #保存玩家日志
gstSaveServerState = 36 #服务器状态保存
gstRefreshGateServerIP = 37 #开服时刷新GateServer外网IP
gstDelLineInfoByLineID = 38 #/< åˆ é™¤åˆ†æµä¿¡æ¯
gstRefreshRunGateServerState = 39 #定时刷新RunGate æœåŠ¡å™¨çŠ¶æ€
gstRefreshRouteServerState = 40 # å®šæ—¶åˆ·æ–°RouteServer状态
gstRefreshDataServerState = 41 # åˆ·æ–°DataServer状态
gstAddPlayerTalkLog = 42 #添加对话信息
gstItemTransactionLog = 43 #保存交易日志
gstGMCommandResult = 44 #GM命令执行结果
gstGMCommandListLog = 45 #GM命令日志
gstInsertImpeach = 46 #插入举报信息
gstGetExpiationLog = 47 #插入补偿日志
gstCoinChangeLog = 48 #点券兑换记录
gstAccForbiddenLog = 49 #该表用于记录玩家被封停和解封的所有信息
gstHugeTrade = 50 #大额交易记录日志
gstAccTransactionLog = 51 #该表用于记录所有订单记录
gstPlayerSaveCoinLog = 52 #玩家储值记录
gstSavePlayerInfoLogOnCreate = 53 #日志玩家_创建角色更新#tagDBPlayerInfoLogCreateRole
gstSavePlayerInfoLogOnLogin = 54 #日志玩家_登录更新#tagDBPlayerInfoLogRoleLogin
gstSavePlayerInfoLogOnForbidden = 55 #日志玩家_封停更新#tagDBPlayerInfoLogForbidden
gstSavePlayerInfoLogOnLogOff = 56 #日志玩家_下线更新#tagDBPlayerLogInfoOnLogOff
gstSavePlayerInfoClearLoginSign = 57 #日志玩家_上线置0
gstSavePlayerInfoLogOnOnCoinChange = 58 #日志玩家点券修改更新
gstFunctionGrade = 59 #日志 åŠŸèƒ½ç»Ÿè®¡
gstSaveMapServerBalance = 60 #地图负载日志
gstDataServerInit = 61 # DataServer初始化
gstGetPetExpiationLog = 62 #插入宠物补偿日志
gstIOCPParamsLog = 63 #GateSeverIOCP异常断线计数日志tagDBGateServerIOCPParamsLog
gstCashRecLog = 64 #点券兑换订单日志表tagCashRecLog
#日志玩家_下线标志更新#tagDBPlayerLogInfoOnLogInOff//新增日志在这条上面插入
#/////////////以下会从高位开始
gstSavePlayerInfoLogOnLogInOff = 65
gstUpdate = 80
gstSaveMapServerCrashData = 81 #保存地图服务器所存的玩家信息(恢复用)
gstSavePlayerGMOPer = 82 # ä¿æŒå¯¹çŽ©å®¶çš„GM操作
gstSaveRunGataInfo = 83
gstPlayerIDMarkDeleted = 84
gstGetGameData = 85
gstGetMapServerPlayerData = 86
gstGetGameServerSysData = 87 #得到GameServer系统表
gstGetGameServerPlayerData = 88 #得到玩家所属表(组队表,国家表等, æ”¾GameServer中)
gstSaveGameServerData = 89
gstSaveGameServerPlayerSaveData = 90 #GameServer的玩家保存数据
gstSaveGameServerCrashData = 91 #保存世界服务器保存的玩家信息(恢复用)
gstGetBillboardInfo = 92 #取得排行榜信息
gstGetGameServerPlayerLoginData = 93 #得到GameServer玩家登录数据
gstQuerySysDBVersion = 94 #查询系统库版本号
gstUpdateSysDB = 95 #更新ChinSys库
gstReloadGameData = 96 #重读GameData
gstUpdateServerDataVersionNO = 97 #更新服务端数据库版本
gstGetServerLanguageVersion = 98 # èŽ·å–æœåŠ¡å™¨è¯­è¨€ç‰ˆæœ¬
gstGetServerVersions = 99 # èŽ·å–æœåŠ¡å™¨æ‰€æœ‰ç‰ˆæœ¬å·
gstUpdateTelLockState = 100 #通知数据库修改通讯锁功能开通状态
gstGetPetExpiation = 101 #得到宠物补偿
gstGetPetExpiationCount = 102 #得到宠物补偿数量
gstAddPetExpiation = 103 #添加宠物补偿
gstUpdateTotalSavePoint = 104 #更新累计储值
gstSavePlayerInfo = 105 # ä¿å­˜çŽ©å®¶èµ„æ–™
gstUpdateMTTUID = 106 # ä¿å­˜çŽ©å®¶èµ„æ–™
gstUpdateAccAdult = 107 #更新帐号表是否成年字段
gstCreateRoleServerRequestCreateRole = 108 #创角服务器请求创角
gstCreateRoleServerCheckPlayerExist = 109 #创角服务器请求玩家是否存在
gstCreateRoleServerCheckIsHaveRole = 110                   # åˆ›è§’服务器请求查询帐号是否存在角色
gstMax = 111  #下面的数值 éœ€è¦ä¿æŒä¸º gstMax + 1
########################### ELoginServerToDataServer define #############################
#LoginServer发送到DataServer的封包类型
# è¯¢é—®æ•°æ®åº“服务器是否准备就绪
#    lsdUpdateAccoutTotalSavePoin,            // æ›´æ–°è´¦å·ç´¯è®¡å‚¨å€¼é‡‘额
lsdDataServerPreparedAsk = 112
lsdMax = 113
#-----------------------------------------------------------------------------------------------------
# æ•°æ®åº“回应类型
# éš¾ä»¥åŒæ­¥ï¼Œå¯èƒ½è¦å†™ç”Ÿæˆå™¨
#-----------------------------------------------------------------------------------------------------
########################### TDataServerToBalanceServer define #############################
#DataServer发送的封包类型#TDataServerToBalanceServer
dgPlayerLogin = 1
dgPlayerInit = 2
dgCreatePlayer = 3
dgCheckPlayerExist = 4 #检查玩家是否存在的回应
dgQueryCanSendMail = 5 #查询玩家是否能够发送邮件
dgMailList = 6 #邮件列表
dgMailDetail = 7 #一封邮件
dgCoin = 8 #点券数目刷新
dgCoinChangeResult = 9 #点击兑换金子
dgPlayerBillboardLV = 10 #玩家排行榜等级
dgAccIDSendPrize = 11 #送出奖励
dgInsertAcc = 12 #插入帐号
dgPlayerCountryCount = 13 #按照国籍得到的人数多少
dgGMCommandList = 14
dgAddAccItemOK = 15 #添加物品成功
dgCheckItemPrizeResult = 16 #是否有奖励送出的结果
dgPlayerAccLoad = 17 #玩家读取账户记录
dgChangePswLV2 = 18 #更新二级密码
dgGetExpiationCount = 19 #得到奖励个数
dgGetExpiation = 20 #得到奖励
dgAddExpiationOK = 21 #添加奖励物品
dgAddPlayerMailByAccID = 22 #给帐号送信
dgServerMerge = 23 #合服信息
dgServerMergeDeleteRole = 24 #因合服而删除角色
dgServerMergeChangeName = 25 #因合服而重命名
dgQueryIsFamilyLeader = 26 #查询是否是家族长
dgServerMergeUpdateAccState = 27 #更新账户状态
dgReloadGameData = 28 #重读GameData
dgDataServerPrepareOK = 29 #数据库准备成功
#/< åˆ›å»ºå® ç‰©
#/////////////////以下会从高位开始
dgCreatePet = 30
dgUpDate = 0x50
dgUpdateMapServerCrashData = 0x50 + 1
dgUpGMOper = 0x50 + 2 # æ›´æ–°GM操作数据
dgGameData = 0x60 #以后要加游戏数据封包的话,
#    dgGameDataNPCRefresh,
#    dgGameDataSkill,         //要在DataServerProcesser处加上转发
#    dgGameExp,              //游戏经验值表
#    dgGameItem,             //游戏物品表
#    dgGameTransport,        //游戏传送点
#//    dgGameEvent,            //游戏事件表
#//    dgGameMission,          //游戏任务表
#//    dgGameEventTrigger,   //游戏任务触发表
#    dgGameShopItem,           //商店物品
#    dgGameBornRefresh,          //出生点刷新
#    dgGameMixItem,              //物品合成表
#    dgRepeatEvent,              //重复事件表
#    dgGameMapEffect,            //地图场景效果表
#    dgGameMap,                  //地图信息表
#    dgTitleMix,                 //称号合成表
dgPyGameData = 0x60 + 1
#家族对战表
#    dgGameDataOK,
#    dgPlayerTeam,               //玩家组队表
#    dgTeamMember,                //队伍成员表
#    dgFamilyInfo,               //玩家家族表
#    dgFamilyMember,               //家族成员表
#    dgPlayerFriend,             //玩家好友表
#    dgGMGameEvent,              //GM活动表
dgFamilyVS = 0x60 + 2
dgGameServerData = 0x60 + 3 #发送给GameServer的事件完全结束
dgGameServerSysData = 0x60 + 4 #GameServer系统表数据
dgPlayerGameServerLoginData = 0x60 + 5 #玩家在GameServer中的登录数据
dgPlayerMailList = 0x60 + 6 #邮件列表
dgPlayerMailItemList = 0x60 + 7 #邮件物品列表
dgBillboard = 0x60 + 8 #排行榜数据
dgPlayerMailState = 0x60 + 9 #玩家邮件状态(已满, æœªè¯»)
dgGameServerCrashData = 0x60 + 10 #世界服务器崩溃数据
dgPlayerSaveGameServerData = 0x60 + 11 #玩家保存世界服务器数据
dgGetServerLanguageVersion = 0x60 + 12 # å›žåº”服务器语言版本请求
dgGetServerVersions = 0x60 + 13 # å›žåº”所有版本请求
dgServerVersion = 0x60 + 14 # å›žåº”MapServer版本请求
dgGetPetExpiation = 0x60 + 15 #得到宠物补偿
dgGetPetExpiationCount = 0x60 + 16 #得到宠物补偿数量
dgAddPetExpiationOK = 0x60 + 17 #添加宠物补偿
########################### TMoneyType define #############################
TYPE_Price_Gold_Money = 1 #/<金子
TYPE_Price_Gold_Paper = 2 #/<金票
TYPE_Price_Silver_Money = 3 #/<银子
TYPE_Price_Silver_Paper = 4 #/<银票
########################### TBalanceServerToGameServer define #############################
bgPlayerTotal = 1 #/< çŽ©å®¶æœ€å¤§æ•°ç›®
bgRegisterLineNO = 2 #/< æ³¨å†Œç‰©ç†åˆ†æµç¼–号
bgPlayerCreateRole = 3 #/< çŽ©å®¶ç™»å½•
bgPlayerCanStartInit = 4 #/< çŽ©å®¶åœ¨æœåŠ¡å™¨ç™»å½•æˆåŠŸ, å¼€å§‹åˆå§‹åŒ–
bgQueryCanSendMail = 5 #/< æŸ¥è¯¢æ˜¯å¦èƒ½å¤Ÿå‘送邮件
bgGameDataSaveOK = 6 #/< GameData存储成功
bgAllMapServerInitOK = 7 #/< æ‰€æœ‰åœ°å›¾æœåŠ¡å™¨åˆå§‹åŒ–æˆåŠŸ
bgMapServerInfo = 8 #/< åœ°å›¾æœåŠ¡å™¨ä¿¡æ¯
bgServerVersion = 9 #/< æœåŠ¡å™¨ç‰ˆæœ¬
bgPlayerCountryCount = 10 #/< æŒ‰ç…§å›½ç±å¾—到的玩家数量
bgGMCommandList = 11 #/< GM命令列表
bgDeleteFamily = 12 #/< åˆ é™¤å®¶æ—
bgChangeNameCheck = 13 #/< æ£€æŸ¥æ˜¯å¦å¯ä»¥æ”¹å
bgRenamePlayer = 14 #/< çŽ©å®¶æ”¹å
bgIsFamilyLeader = 15 #/< æ˜¯å¦æ˜¯å®¶æ—é•¿
# åˆ é™¤çީ家
#    bgGetPlayerMail,                        //得到玩家邮件列表
#    bgGetMailDetail,                        //得到一封邮件
#///////////////////////以下会从高位开始
#    bgPlayerTeam = dgPlayerTeam,               //玩家组队表
#    bgTeamMember = dgTeamMember,                //队伍成员表
#    bgFamilyInfo = dgFamilyInfo,                         //玩家家族表
#    bgFamilyMember = dgFamilyMember,                         //家族成员表
#    bgGameServerOK = dgGameServerOK,
#    bgPlayerFriend = dgPlayerFriend,                    //玩家好友表
#    bgPlayerEnemy = dgPlayerEnemy,                      //玩家仇人
#    bgPlayerMailList = dgPlayerMailList,                //邮件列表
#    bgPlayerMailItemList = dgPlayerMailItemList,        //邮件物品表
#    bgGameServerPlayerLoginDataOK = dgGameServerPlayerLoginDataOK,  //GameServer玩家数据读取成功
bgDeletePlayer = 16
########################### DATA_SAVE_ID define #############################
DSI_tagRoleItem = 1
DSI_tagRoleMission = 2
DSI_tagRoleMissionDict = 3
DSI_tagRoleSkill = 4
DSI_tagRoleBuff = 5
DSI_tagRoleRepeatTime = 6
DSI_tagPlayerHorseTable = 7
DSI_tagGMOper = 8
DSI_tagRolePet = 9 #/< çŽ©å®¶å® ç‰©
DSI_tagPetSkill = 10 #/< å® ç‰©æŠ€èƒ½
DSI_tagRoleNomalDict = 11 #/<玩家字典
DSI_tagPlayerDienstgrad = 12 #/<新称号头衔
DSI_Max = 13 #/< æ­¤æžšä¸¾ç±»åž‹æžšä¸¾å€¼çš„æ•°é‡
########################### TWatchMailType define #############################
#**查看邮件类型*/
wmtUnReaded = 0 #/<未读
wmtReaded = 1 #/<已读
wmtSave = 2 #/<已保存
wmtGM = 3 #/<GMä¿¡ä»¶
MAX_PLAYER_MAIL_COUNT   =    30
########################### TPlayerMailInfo define #############################
pmiNull = 0 #/<空
pmiNewLetter = 1 #/<新邮件
pmiFull = 2 #/<邮箱已满
MailExistTime = 30 # é‚®ä»¶å­˜åœ¨æ—¶é—´ 30天
Tool/Êý¾Ý¿â/ChangeAccount/DBCommon/GlobalFunctions.py
New file
@@ -0,0 +1,79 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
import os.path
import sys
from Common import mylog
import CommonDefine
from datetime import datetime
from uuid import uuid1
import pymongo
import traceback
#from Config import DBConfig
import base64
from DBCommon import error
__state = CommonDefine.mssNone
__appPath = ''
def setServerState(newState):
    global __state
    __state = newState
def getServerState():
    global __state
    return __state
def getAppPath():
    global __appPath
    if not __appPath == '':
        return __appPath
    if len(sys.argv) < 1:
        msg = error.formatMsg('fatal', error.ERROR_NO_39, 'cmd line param error!')
        mylog.fatal(msg)
        return ''
    __appPath = os.path.dirname(sys.argv[0])
    return __appPath
def GetTransactionIDStr(len):
    nowtime = datetime.today()
    return ("%04d%02d%02d%02d%02d%02d%03d%X-%X-%X-%X%X%X"%(nowtime.timetuple()[:6] + tuple([nowtime.microsecond/1000]) + uuid1().fields))[:len]
BASE64_ENCODE_CNT = 3
XOR_KEY = 151
def GetEncodePsw(psw):
    ret = ""
    try:
        for i in range(BASE64_ENCODE_CNT):
            psw = base64.decodestring(psw)
    except:
        msg = error.formatMsg('error', error.ERROR_NO_40, '%s'%traceback.format_exc())
        mylog.error(msg)
        return False,ret
    for i in psw:
        ret += chr(ord(i)^XOR_KEY)
    return True, ret
#登录数据库验证
def LoginMongoDB(user, pwd, ip = '', port = '', connection = None ):
    try:
        if not connection:
            connection = pymongo.Connection(ip, port)
        db = connection.admin
        return db.authenticate(user, pwd)
    except:
        mylog.info('Login mongodb failed:user = %s,pwd = %s'%(user, pwd))
        msg = error.formatMsg('error', error.ERROR_NO_41, '%s'%traceback.format_exc())
        mylog.error(msg)
        return False
Tool/Êý¾Ý¿â/ChangeAccount/DBCommon/__init__.py
Tool/Êý¾Ý¿â/ChangeAccount/DBCommon/error.py
New file
@@ -0,0 +1,352 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
from Common import mylog
import CommonDefine
ERROR_NO_1 = 1
ERROR_NO_2 = 2
ERROR_NO_3 = 3
ERROR_NO_4 = 4
ERROR_NO_5 = 5
ERROR_NO_6 = 6
ERROR_NO_7 = 7
ERROR_NO_8 = 8
ERROR_NO_9 = 9
ERROR_NO_10 = 10
ERROR_NO_11 = 11
ERROR_NO_12 = 12
ERROR_NO_13 = 13
ERROR_NO_14 = 14
ERROR_NO_15 = 15
ERROR_NO_16 = 16
ERROR_NO_17 = 17
ERROR_NO_18 = 18
ERROR_NO_19 = 19
ERROR_NO_20 = 20
ERROR_NO_21 = 21
ERROR_NO_22 = 22
ERROR_NO_23 = 23
ERROR_NO_24 = 24
ERROR_NO_25 = 25
ERROR_NO_26 = 26
ERROR_NO_27 = 27
ERROR_NO_28 = 28
ERROR_NO_29 = 29
ERROR_NO_30 = 30
ERROR_NO_31 = 31
ERROR_NO_32 = 32
ERROR_NO_33 = 33
ERROR_NO_34 = 34
ERROR_NO_35 = 35
ERROR_NO_36 = 36
ERROR_NO_37 = 37
ERROR_NO_38 = 38
ERROR_NO_39 = 39
ERROR_NO_40 = 40
ERROR_NO_41 = 41
ERROR_NO_42 = 42
ERROR_NO_43 = 43
ERROR_NO_44 = 44
ERROR_NO_45 = 45
ERROR_NO_46 = 46
ERROR_NO_47 = 47
ERROR_NO_48 = 48
ERROR_NO_49 = 49
ERROR_NO_50 = 50
ERROR_NO_51 = 51
ERROR_NO_52 = 52
ERROR_NO_53 = 53
ERROR_NO_54 = 54
ERROR_NO_55 = 55
ERROR_NO_56 = 56
ERROR_NO_57 = 57
ERROR_NO_58 = 58
ERROR_NO_59 = 59
ERROR_NO_60 = 60
ERROR_NO_61 = 61
ERROR_NO_62 = 62
ERROR_NO_63 = 63
ERROR_NO_64 = 64
ERROR_NO_65 = 65
ERROR_NO_66 = 66
ERROR_NO_67 = 67
ERROR_NO_68 = 68
ERROR_NO_69 = 69
ERROR_NO_70 = 70
ERROR_NO_71 = 71
ERROR_NO_72 = 72
ERROR_NO_73 = 73
ERROR_NO_74 = 74
ERROR_NO_75 = 75
ERROR_NO_76 = 76
ERROR_NO_77 = 77
ERROR_NO_78 = 78
ERROR_NO_79 = 79
ERROR_NO_80 = 80
ERROR_NO_81 = 81
ERROR_NO_82 = 82
ERROR_NO_83 = 83
ERROR_NO_84 = 84
ERROR_NO_85 = 85
ERROR_NO_86 = 86
ERROR_NO_87 = 87
ERROR_NO_88 = 88
ERROR_NO_89 = 89
ERROR_NO_90 = 90
ERROR_NO_91 = 91
ERROR_NO_92 = 92
ERROR_NO_93 = 93
ERROR_NO_94 = 94
ERROR_NO_95 = 95
ERROR_NO_96 = 96
ERROR_NO_97 = 97
ERROR_NO_98 = 98
ERROR_NO_99 = 99
ERROR_NO_100 = 100
ERROR_NO_101 = 101
ERROR_NO_102 = 102
ERROR_NO_103 = 103
ERROR_NO_104 = 104
ERROR_NO_105 = 105
ERROR_NO_106 = 106
ERROR_NO_107 = 107
ERROR_NO_108 = 108
ERROR_NO_109 = 109
ERROR_NO_110 = 110
ERROR_NO_111 = 111
ERROR_NO_112 = 112
ERROR_NO_113 = 113
ERROR_NO_114 = 114
ERROR_NO_115 = 115
ERROR_NO_116 = 116
ERROR_NO_117 = 117
ERROR_NO_118 = 118
ERROR_NO_119 = 119
ERROR_NO_120 = 120
ERROR_NO_121 = 121
ERROR_NO_122 = 122
ERROR_NO_123 = 123
ERROR_NO_124 = 124
ERROR_NO_125 = 125
ERROR_NO_126 = 126
ERROR_NO_127 = 127
ERROR_NO_128 = 128
ERROR_NO_129 = 129
ERROR_NO_130 = 130
ERROR_NO_131 = 131
ERROR_NO_132 = 132
ERROR_NO_133 = 133
ERROR_NO_134 = 134
ERROR_NO_135 = 135
ERROR_NO_136 = 136
ERROR_NO_137 = 137
ERROR_NO_138 = 138
ERROR_NO_139 = 139
ERROR_NO_140 = 140
ERROR_NO_141 = 141
ERROR_NO_142 = 142
ERROR_NO_143 = 143
ERROR_NO_144 = 144
ERROR_NO_145 = 145
ERROR_NO_146 = 146
ERROR_NO_147 = 147
ERROR_NO_148 = 148
ERROR_NO_149 = 149
ERROR_NO_150 = 150
ERROR_NO_151 = 151
ERROR_NO_152 = 152
ERROR_NO_153 = 153
ERROR_NO_154 = 154
ERROR_NO_155 = 155
ERROR_NO_156 = 156
ERROR_NO_157 = 157
ERROR_NO_158 = 158
ERROR_NO_159 = 159
ERROR_NO_160 = 160
ERROR_NO_161 = 161
ERROR_NO_162 = 162
ERROR_NO_163 = 163
ERROR_NO_164 = 164
ERROR_NO_165 = 165
__errorDict =    \
{
    "fatal_1":(ERROR_NO_1, 'python version error!'),
    "fatal_2":(ERROR_NO_2, 'pymongo version error!'),
    "fatal_3":(ERROR_NO_3, 'mongodb version error!'),
    "fatal_4":(ERROR_NO_4, 'mongodb version error!'),
    "error_5":(ERROR_NO_5, 'encode error'),
    "error_6":(ERROR_NO_6, 'encode error'),
    "error_7":(ERROR_NO_7, 'python coding error'),
    "error_8":(ERROR_NO_8, 'python coding error'),
    "error_9":(ERROR_NO_9, 'python coding error'),
    "error_10":(ERROR_NO_10, 'invalid pos'),
    "error_11":(ERROR_NO_11, 'lack of data'),
    "fatal_12":(ERROR_NO_12, 'invalid resource version no'),
    "DeployError_13":(ERROR_NO_13, 'user db password is not correct!'),
    "DeployError_14":(ERROR_NO_14, 'sys db password is not correct!'),
    "DeployError_15":(ERROR_NO_15, 'log db password is not correct!'),
    "fatal_16":(ERROR_NO_16, 'socket error'),
    "fatal_17":(ERROR_NO_17, 'unknown error'),
    "error_18":(ERROR_NO_18, 'read config error'),
    "DeployError_19":(ERROR_NO_19, 'user db mongodb longin user name is empty'),
    "DeployError_20":(ERROR_NO_20, 'decrypt userdb password error'),
    "DeployError_21":(ERROR_NO_21, 'user db mongodb longin pwd is empty'),
    "DeployError_22":(ERROR_NO_22, 'sys db mongodb longin user name is empty'),
    "DeployError_23":(ERROR_NO_23, 'Decrypt sysdb_pwd faied'),
    "DeployError_24":(ERROR_NO_24, 'sys db mongodb longin pwd is empty'),
    "DeployError_25":(ERROR_NO_25, 'log db mongodb longin user name is empty'),
    "DeployError_26":(ERROR_NO_26, 'Decrypt logdb_pwd faied'),
    "DeployError_27":(ERROR_NO_27, 'log db mongodb longin pwd is empty'),
    "error_28":(ERROR_NO_28, 'unknown error'),
    "fatal_29":(ERROR_NO_29, 'Init config failed'),
    "DesignError_30":(ERROR_NO_30, 'read sysdb table failed'),
    "fatal_31":(ERROR_NO_31, 'read sysdb table failed'),
    "DesignError_32":(ERROR_NO_32, 'open sysdb table file failed'),
    "DesignError_33":(ERROR_NO_33, 'read sysdb table failed'),
    "DesignError_34":(ERROR_NO_34, 'open sysdb table file failed'),
    "error_35":(ERROR_NO_35, 'seq fail'),
    "error_36":(ERROR_NO_36, 'unknown error'),
    "error_37":(ERROR_NO_37, 'DumpData:write data to file fail'),
    "error_38":(ERROR_NO_38, 'DumpData:unknown error'),
    "fatal_39":(ERROR_NO_39, 'unexpceted param error'),
    "error_40":(ERROR_NO_40, 'GetEncodePsw!unknown error'),
    "error_41":(ERROR_NO_41, 'LoginMongoDB!unknown error'),
    "error_42":(ERROR_NO_42, 'requestType error'),
    "error_43":(ERROR_NO_43, 'pack not processed'),
    "fatal_44":(ERROR_NO_44, 'fail to reconnect mongod'),
    "fatal_45":(ERROR_NO_45, '__requestProcess!unknown error'),
    "error_46":(ERROR_NO_46, 'pack is none, program logic error'),
    "error_47":(ERROR_NO_47, 'pack is too short'),
    "error_48":(ERROR_NO_48, 'pack is not processed'),
    "error_49":(ERROR_NO_49, 'insert SvrStatus failed'),
    "error_50":(ERROR_NO_50, 'onCoinChangeLog!unknown error'),
    "fatal_51":(ERROR_NO_51, 'unexpceted param error'),
    "DesignError_52":(ERROR_NO_52, 'resource version file not found'),
    "fatal_53":(ERROR_NO_53, 'OnGetGameData!unknown error'),
    "DesignError_54":(ERROR_NO_54, 'load PyReadData.dll failed, may be not exist'),
    "DesignError_55":(ERROR_NO_55, 'load py sysdb data, may be not exist'),
    "DeployError_56":(ERROR_NO_56, 'mapServer SaveServer switch may be not open'),
    "error_57":(ERROR_NO_57, 'load tagDSAccount failed'),
    "error_58":(ERROR_NO_58, 'OnSavePlayerInfo handle the dismatch type'),
    "error_59":(ERROR_NO_59, 'Player save data failed!'),
    "error_60":(ERROR_NO_60, 'Player data crc error'),
    "error_61":(ERROR_NO_61, 'updatePlayerAccState!pymongo.errors.OperationFailure'),
    "error_62":(ERROR_NO_62, 'onCreateRoleServerCheckIsHaveRole!unexpetcted exception'),
    "error_63":(ERROR_NO_63, 'onCreateRoleServerCheckPlayerExist!unexpetcted exception'),
    "error_64":(ERROR_NO_64, 'onCreateRoleServerRequestCreateRole!unexpetcted exception'),
    "error_65":(ERROR_NO_65, 'insert tagDBPlayer failed'),
    "error_66":(ERROR_NO_66, 'insert player failed'),
    "error_67":(ERROR_NO_67, 'onGetPlayerDetail:unknown error'),
    "error_68":(ERROR_NO_68, 'onGetPlayerDetail:unknown error'),
    "error_69":(ERROR_NO_69, 'Player should not be leader of two familys'),
    "error_70":(ERROR_NO_70, 'onGetPlayerDetail:KeyError'),
    "fatal_71":(ERROR_NO_71, 'SERVER_DATA_VERSION_NO mismatch'),
    "error_72":(ERROR_NO_72, 'crash data crc mismatch'),
    "error_73":(ERROR_NO_73, 'crash data crc mismatch'),
    "error_74":(ERROR_NO_74, 'lack of gmcmd data'),
    "fatal_75":(ERROR_NO_75, 'Compress gameserver player data error'),
    "fatal_76":(ERROR_NO_76, 'GAMESERVER_DATA_VERSION_NO mismatch'),
    "error_77":(ERROR_NO_77, 'discompress gameserver data fail'),
    "error_78":(ERROR_NO_78, 'short of gameServerWorldData'),
    "error_79":(ERROR_NO_79, 'short of GameServerPlayerData'),
    "error_80":(ERROR_NO_80, 'discompress gameserver data fail'),
    "error_81":(ERROR_NO_81, 'short of gameServerWorldData'),
    "error_82":(ERROR_NO_82, 'invalid player mail data'),
    "error_83":(ERROR_NO_83, 'OnInsertAcc!unknown error'),
    "error_84":(ERROR_NO_84, 'OnPlayerIDMarkDeleted!unknown error'),
    "error_85":(ERROR_NO_85, 'OnGetCoin!unknown error'),
    "error_86":(ERROR_NO_86, 'CheckUpdateC tagDSAccount failed!'),
    "error_87":(ERROR_NO_87, 'insert tagAccCoins failed'),
    "error_88":(ERROR_NO_88, 'OnCoinChange!unknown error'),
    "error_89":(ERROR_NO_89, 'OnCheckPlayerExist!unknown error'),
    "error_90":(ERROR_NO_90, 'save tagGMOper failed'),
    "error_91":(ERROR_NO_91, 'lack of pack data'),
    "error_92":(ERROR_NO_92, 'insert tagServerDataVersionNO failed'),
    "error_93":(ERROR_NO_93, 'lack of pack data'),
    "error_94":(ERROR_NO_94, 'tagDBMapServerInfo adoCheckUpdateEx failed'),
    "error_95":(ERROR_NO_95, 'tagDBPlayerSaveCoinLog:lack of pack data'),
    "fatal_96":(ERROR_NO_96, 'OnUpdateTotalSavePoint!unknown error'),
    "error_97":(ERROR_NO_97, 'OnGetPlayerMailState!unknown error'),
    "error_98":(ERROR_NO_98, 'OnGetMailDetail!unknown error'),
    "error_99":(ERROR_NO_99, 'OnGetPlayerMail!unknown error'),
    "error_100":(ERROR_NO_100, 'tagDBMailList_SaveSysMail lack of pack data'),
    "error_101":(ERROR_NO_101, "OnAddPlayerMailByAccID: exist a same mailid"),
    "error_102":(ERROR_NO_102, "OnAddPlayerMailByAccID!unknown error"),
    "error_103":(ERROR_NO_103, "DeleteMail fail"),
    "error_104":(ERROR_NO_104, "Delete Mail Item fail"),
    "error_105":(ERROR_NO_105, "OnDeleteMail!unknown error"),
    "error_106":(ERROR_NO_106, "load mail fail"),
    "error_107":(ERROR_NO_107, "update mail fail"),
    "error_108":(ERROR_NO_108, "OnUpdateMail!adoDeleteByIndex failed"),
    "error_109":(ERROR_NO_109, "OnUpdateMail!unknown error"),
    "error_110":(ERROR_NO_110, "OnQueryCanSendMail!unknown error"),
    "error_111":(ERROR_NO_111, "update tagAccIDSendPrize failed"),
    "error_112":(ERROR_NO_112, "update tagAccIDSendPrize failed"),
    "error_113":(ERROR_NO_113, "OnAccIDSendPrize!unknown error"),
    "error_114":(ERROR_NO_114, "OnCheckItemPrize!unknown error"),
    "error_115":(ERROR_NO_115, "OnCheckLoadAcc!unknown error"),
    "error_116":(ERROR_NO_116, "OnAddAccItem!unknown error"),
    "error_117":(ERROR_NO_117, "UpdateTelLockState failed"),
    "error_118":(ERROR_NO_118, "OnUpdateTelLockState!unknown error"),
    "error_119":(ERROR_NO_119, "OnUpdateMTTUID failed"),
    "error_120":(ERROR_NO_120, "OnUpdateMTTUID!unknown error"),
    "error_121":(ERROR_NO_121, "OnUpdateAccAdult failed"),
    "error_122":(ERROR_NO_122, "OnUpdateAccAdult!unknown error"),
    "error_123":(ERROR_NO_123, "OnAddExpiation!unknown error"),
    "error_124":(ERROR_NO_124, "OnAddPetExpiation!unknown error"),
    "error_125":(ERROR_NO_125, "lack of pack data"),
    "error_125":(ERROR_NO_126, "ServerMergeDeleteRole failed"),
    "error_127":(ERROR_NO_127, "OnServerMergeDeleteRole failed"),
    "error_128":(ERROR_NO_128, "OnServerMergeUpdateAccState failed"),
    "error_129":(ERROR_NO_129, "OnServerMergeUpdateAccState!unknown error"),
    "error_130":(ERROR_NO_130, "insert tagDBPlayerChangeNameLog failed"),
    "error_131":(ERROR_NO_131, "OnServerMergeChangeName update failed"),
    "error_132":(ERROR_NO_132, "OnServerMergeChangeName!unknown error"),
    "error_133":(ERROR_NO_133, "Insert tagDBImpeach failed"),
    "error_134":(ERROR_NO_134, "OnServerMergeChangeName!unknown error"),
    "error_135":(ERROR_NO_135, "Invalid pack data"),
    "error_136":(ERROR_NO_136, "PackSign Error"),
    "error_137":(ERROR_NO_137, "Pack too big"),
    "error_138":(ERROR_NO_138, "getVersionByIndex!IndexError"),
    "error_139":(ERROR_NO_139, "getMinorVersionByIndex!IndexError"),
    "error_140":(ERROR_NO_140, "getLanguageVersionByIndex!IndexError"),
    "DesignError_141":(ERROR_NO_141, "LoadVersionFile!IOError.Version file may be not exist"),
    "fatal_142":(ERROR_NO_142, "LoadVersionFile!unknown error."),
    "DesignError_143":(ERROR_NO_143, "not version in Version.chver file"),
    "DesignError_144":(ERROR_NO_144, "version format error!"),
    "fatal_145":(ERROR_NO_145, "LoadVersions!unknown error"),
    "error_146":(ERROR_NO_146, "Insert failed"),
    "error_147":(ERROR_NO_147, "Lack of data"),
    "error_148":(ERROR_NO_148, "ReadData!invalid data pos"),
    "error_149":(ERROR_NO_149, "lack of data"),
    "error_150":(ERROR_NO_150, "ReadData!invalid data pos"),
    "error_151":(ERROR_NO_151, "lack of data"),
    "error_152":(ERROR_NO_152, "Insert failed"),
    "error_153":(ERROR_NO_153, "Update failed"),
    "error_154":(ERROR_NO_154, "UpdateEx failed"),
    "error_155":(ERROR_NO_155, "adoDeleteByIndex failed"),
    "DeployError_156":(ERROR_NO_156, 'Log4Me.dll not found!'),
    "warning_157":(ERROR_NO_157, "PyReadData.dll not found!"),
    "error_158":(ERROR_NO_158, "CEventShellProxy InitDll Fail!"),
    "warning_159":(ERROR_NO_159, "CEventShellProxy SendEvent Fail!"),
    "error_160":(ERROR_NO_160, "CEventShellProxy DeInitDll Fail!"),
    "error_161":(ERROR_NO_161, "#PythonError#Call EventProcess.OnDayProcess() Fail!!"),
    "DeployError_162":(ERROR_NO_162, "TDateTimeFunc.dll not found!!"),
}
SHOW_ERROR_IF_DEBUG = 1
SHOW_ERROR_IF_RELEASE = 2
SHOW_ERROR_ALL = 3
def formatMsg(type, ID, info):
    global __errorDict
    error = __errorDict.get('%s_%s'%(type, ID))
    if len(error) < 2:
        return 'Unknown Error'
    return 'ID    :#%s\r\nMsg   :%s\r\nDetail:%s'%(error[0], error[1], info)
Tool/Êý¾Ý¿â/ChangeAccount/MangoDBCommon.py
New file
@@ -0,0 +1,182 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
#-------------------------------------------------------------------------------
#
import sys
import binascii
try:
    import threading
except ImportError:
    import dummy_threading as threading
from Common import (CommFuncEx, CommFunc, mylog)
from DBCommon import (CommonDefine, error)
import traceback
SIDErrorCnt = 0
MAGIC_SID = 2266520
SIDErrorCounterLock = threading.Lock()
ADOExceptionCnt = 0
AdoExceptionCounterLock = threading.Lock()
#需要多线程保护
def addADOExceptionCount():
    global ADOExceptionCnt
    global AdoExceptionCounterLock
    AdoExceptionCounterLock.acquire()
    ADOExceptionCnt += 1
    AdoExceptionCounterLock.release()
    return ADOExceptionCnt
def getADOExceptionCount():
    return ADOExceptionCnt
def fix_outgoingText(text):
    if isinstance(text, unicode):
        return CommFuncEx.UnicodeToEncoding(CommonDefine.ENCODING, text)[1]
    #不是unicode,不处理
    return text
def fix_incomingText(text):
    if isinstance(text, str):
        return CommFuncEx.EncodingToUnicode(CommonDefine.ENCODING, text)[1]
    #不是字符串,不处理
    return text
def fix_incoming(dictObj):
    for k, v in dictObj.iteritems():
        if isinstance(v, str):
            result, convertText = CommFuncEx.EncodingToUnicode(CommonDefine.ENCODING, v)
            if result:
                dictObj[k] = convertText
def fix_outgoing(dictObj):
    for k, v in dictObj.iteritems():
        if isinstance(v, unicode):
            result, convertText = CommFuncEx.UnicodeToEncoding(CommonDefine.ENCODING, v)
            if result:
                dictObj[k] = convertText
def addSIDErrorCnt():
    global SIDErrorCnt
    global SIDErrorCounterLock
    SIDErrorCounterLock.acquire()
    SIDErrorCnt += 1
    SIDErrorCounterLock.release()
    return SIDErrorCnt
def getSIDErrorCnt():
    global SIDErrorCnt
    return SIDErrorCnt
def makeSID(data):
    #mylog.debug('makeSID(%s) = %s'%(data, binascii.crc32(data)))
    return binascii.crc32(data)
def checkSID(data, expectSID):
    global MAGIC_SID
    if expectSID == MAGIC_SID:
        return True
    calcSID = makeSID(data)
    if expectSID == calcSID:
        return True
    mylog.debug('expectSID = %s calcSID = %s'%(expectSID, calcSID))
    return False
SPLITCHAR = '\t'
def sysDBLoadFromFile(className, fileName):
    data = ''
    try:
        fileObj = open(fileName, 'rb', 0)
        mylog.info('Loading %s...'%fileName)
        try:
            rowObj = className()
            rowCnt = 0
            for line in fileObj:
                rowCnt += 1
                if rowCnt == 1:
                    continue    #skip header
#                logging.getLogger('sysDBLoadFromFile').debug('line %d = %s'%(rowCnt,line))
                rowObj.readLine(line)
                data += rowObj.getBuffer()
        except IOError,(readErrNo, readStdErr):
            msg = error.formatMsg('DesignError', error.ERROR_NO_30, 'Read file "%s" failed! errno = %s stdErr = %s'%(fileName, readErrNo, readStdErr))
            mylog.DesignError(msg, True)
            data = ''
            data = CommFunc.WriteDWORD(data, 0)
            return data
        except:
            msg = error.formatMsg('fatal', error.ERROR_NO_31, 'Read file"%s" failed!  Exception = %s'%(fileName, traceback.format_exc()))
            mylog.fatal(msg)
            data = ''
            data = CommFunc.WriteDWORD(data, 0)
            return data
        else:
            fileObj.close()
#            logging.getLogger('sysDBLoadFromFile').debug('data = %s'%binascii.b2a_hex(data))
            mylog.info('Load %s cnt = %s'%(fileName, rowCnt - 1))
            buf = ''
            buf = CommFunc.WriteDWORD(buf, rowCnt - 1)
            buf = CommFunc.WriteString(buf, len(data), data)
            return buf
    except IOError, (errno, stderr):
        msg = error.formatMsg('DesignError', error.ERROR_NO_32, 'Can not open %s!errno = %s stderr = %s'%(fileName, errno, stderr))
        mylog.DesignError(msg)
    data = ''
    data = CommFunc.WriteDWORD(data, 0)
    return data
def SysDBUpdate(className, collection, fileName):
    collection.drop()
    try:
        fileObj = open(fileName,'rb', 0)
        try:
            rowObj = className()
            row = 0
            for line in fileObj:
                row += 1
                if row == 1:
                    continue    #skip header
#                print 'line_%d=%s'%(Col,line)
                rowObj.readLine(line)
                rowObj.adoInsert(collection)
        except IOError,(readErrNo, readStdErr):
            msg = error.formatMsg('DesignError', error.ERROR_NO_33, 'Read %s failed!errno = %s stderr = %s'%(fileName, readErrNo, readStdErr))
            mylog.DesignError(msg)
        finally:
            fileObj.close()
    except IOError,(errno, stderr):
        msg = error.formatMsg('DesignError', error.ERROR_NO_34, 'Can not open %s! errno = %s stderr = %s'%(fileName, errno, stderr))
        mylog.DesignError(msg)
def seq(db, collectionName, fieldName, feed, increment):
    try:
        result = 0
        collection = db['%s_seq'%collectionName]
        resultObj = collection.find_and_modify(query={'_id':fieldName}, update={'$inc':{'seq':increment}}, new=True)
        if resultObj:
            result = resultObj['seq']
        else:
            resultObj = collection.find_and_modify(query={'_id':fieldName}, update={'$set':{'seq':feed}}, new=True,
                                                   upsert=True)
            if resultObj:
                result = resultObj['seq']
            else:
                msg = error.formatMsg('error', error.ERROR_NO_35, 'seq failed!')
                mylog.error(msg)
                return 0
    except:
        msg = error.formatMsg('error', error.ERROR_NO_36, "seq failed, colname = %s, fieldname = %s, feed = %d, increment = %d, error = %s"%(collectionName, fieldName, feed, increment, traceback.format_exc()))
        mylog.error(msg)
    return result
Tool/Êý¾Ý¿â/mongorestore.bat
New file
@@ -0,0 +1,2 @@
cd /d c:\mongo\bin
mongorestore -u sa -p sa --drop D:\2018-09-09