From c238e45c6695d627bcc776b34f8ff46823c57e71 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期一, 24 十二月 2018 20:40:19 +0800
Subject: [PATCH] 860312 修改数据库账号后缀工具

---
 Tool/数据库/ChangeAccount/ChangeAccount.py                    |  134 
 Tool/数据库/ChangeAccount/Config/DBConfig.py                  |   87 
 Tool/数据库/ChangeAccount/DBCommon/GlobalFunctions.py         |   79 
 Tool/数据库/ChangeAccount/Collections/__init__.py             |    0 
 Tool/数据库/ChangeAccount/Config/__init__.py                  |    0 
 Tool/数据库/ChangeAccount/Common/CommFuncEx.py                |  190 
 Tool/数据库/ChangeAccount/Common/__init__.py                  |    0 
 Tool/数据库/ChangeAccount/Common/mylog.py                     |  174 
 Tool/数据库/ChangeAccount/DBCommon/__init__.py                |    0 
 Tool/数据库/ChangeAccount/Common/CommFunc.py                  |  521 +
 Tool/数据库/mongorestore.bat                                  |    2 
 Tool/数据库/ChangeAccount/Collections/CollectionVesionNO.py   |   12 
 Tool/数据库/ChangeAccount/Collections/DataServerLogData.py    | 7622 ++++++++++++++
 Tool/数据库/ChangeAccount/Config/config.ini                   |   15 
 Tool/数据库/ChangeAccount/DBCommon/CommonDefine.py            |  377 
 Tool/数据库/ChangeAccount/DBCommon/error.py                   |  352 
 Tool/数据库/ChangeAccount/MangoDBCommon.py                    |  182 
 Tool/数据库/ChangeAccount/Collections/DataServerPlayerData.py | 21288 +++++++++++++++++++++++++++++++++++++++++
 18 files changed, 31,035 insertions(+), 0 deletions(-)

diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/ChangeAccount.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/ChangeAccount.py"
new file mode 100644
index 0000000..bcd004c
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/ChangeAccount.py"
@@ -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()
\ No newline at end of file
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/CollectionVesionNO.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/CollectionVesionNO.py"
new file mode 100644
index 0000000..0b3074b
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/CollectionVesionNO.py"
@@ -0,0 +1,12 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+#-------------------------------------------------------------------------------
+######################
+#存放需校验SID的表版本号,用于忽略因为表结构变更导致的SID校验错误
+#%TableName%_VersionNO
+
+tagDBPlayer_VersionNO = 3
+tagDSAccount_VersionNO = 3
+tagRoleItem_VersionNO = 1
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerLogData.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerLogData.py"
new file mode 100644
index 0000000..22289d4
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerLogData.py"
@@ -0,0 +1,7622 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+#-------------------------------------------------------------------------------
+#
+
+#-------------------------------------------------------------------------------
+#日志表的处理
+#使用ProtocolStudio CodeMaker MongoDBUserData.py生成
+#-------------------------------------------------------------------------------
+
+import pymongo
+from Common import (CommFunc, mylog,CommFuncEx)
+import ctypes
+from ctypes import (c_ushort, c_int, c_ubyte, c_char, c_ulong, Structure, memset,
+                    memmove, sizeof, addressof, create_string_buffer, string_at)
+from MangoDBCommon import( fix_outgoingText, fix_incomingText, fix_incoming, fix_outgoing,
+                          addSIDErrorCnt, getSIDErrorCnt, makeSID, checkSID, addADOExceptionCount )
+import inspect
+DBConfig = __import__('Config.DBConfig')
+from DBCommon import error
+
+#点券兑换订单表#tagCashRecLog
+class tagCashRecLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('Account', ctypes.c_char * 65),
+        ('OrderId', ctypes.c_char * 40),
+        ('Coin', ctypes.c_ulong),
+        ('PrizeCoin', ctypes.c_ulong),
+        ('AppendixLen', ctypes.c_ubyte),
+        ('Appendix', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.Account = ''
+        self.OrderId = ''
+        self.Coin = 0
+        self.PrizeCoin = 0
+        self.AppendixLen = 0
+        self.Appendix = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.Account, pos = CommFunc.ReadString(buf, pos, 65)
+        self.OrderId, pos = CommFunc.ReadString(buf, pos, 40)
+        self.Coin, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PrizeCoin, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AppendixLen, pos = CommFunc.ReadBYTE(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.AppendixLen)
+        self.Appendix = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.Account)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.OrderId)
+        buf = CommFunc.WriteDWORD(buf, self.Coin)
+        buf = CommFunc.WriteDWORD(buf, self.PrizeCoin)
+        buf = CommFunc.WriteBYTE(buf, self.AppendixLen)
+        buf = CommFunc.WriteString(buf, self.AppendixLen, self.Appendix)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += self.AppendixLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'Account'] = fix_incomingText(self.Account)
+        rec[u'OrderId'] = fix_incomingText(self.OrderId)
+        rec[u'Coin'] = self.Coin
+        rec[u'PrizeCoin'] = self.PrizeCoin
+        rec[u'AppendixLen'] = self.AppendixLen
+        rec[u'Appendix'] = fix_incomingText(self.Appendix)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.Account = fix_outgoingText(rec.get(u'Account', u''))
+        self.OrderId = fix_outgoingText(rec.get(u'OrderId', u''))
+        self.Coin = rec.get(u'Coin', 0)
+        self.PrizeCoin = rec.get(u'PrizeCoin', 0)
+        self.AppendixLen = rec.get(u'AppendixLen', 0)
+        self.Appendix = fix_outgoingText(rec.get(u'Appendix', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'OrderId':fix_incomingText(self.OrderId)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!OrderId = %s, error = %s, trycnt = %d'%(self.OrderId, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'OrderId':fix_incomingText(self.OrderId)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!OrderId = %s, error = %s, trycnt = %d'%(self.OrderId, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!OrderId = %s, error = %s, trycnt = %d'%(self.OrderId, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'OrderId':fix_incomingText(self.OrderId)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'OrderId':fix_incomingText(self.OrderId)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'OrderId':fix_incomingText(self.OrderId)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:OrderId = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.OrderId))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.OrderId = %s, error = %s, trycnt = %d'%(self.OrderId, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//点券兑换订单表#tagCashRecLog:
+            Account = %s,
+            OrderId = %s,
+            Coin = %s,
+            PrizeCoin = %s,
+            AppendixLen = %s,
+            Appendix = %s,
+            ADOResult = %s,
+            '''%(
+                self.Account,
+                self.OrderId,
+                self.Coin,
+                self.PrizeCoin,
+                self.AppendixLen,
+                self.Appendix,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.Account,
+                self.OrderId,
+                self.Coin,
+                self.PrizeCoin,
+                self.AppendixLen,
+                self.Appendix,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccount(self,Str):
+        if len(Str)<=65:
+            self.Account = Str
+        else:
+            self.Account = Str[:65]
+            
+    def SetOrderId(self,Str):
+        if len(Str)<=40:
+            self.OrderId = Str
+        else:
+            self.OrderId = Str[:40]
+
+#服务器异常断线日志#tagDBGateServerIOCPParamsLog
+class tagDBGateServerIOCPParamsLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('MapID', ctypes.c_ulong),
+        ('State', ctypes.c_ubyte),
+        ('RefreshTime', ctypes.c_double),
+        ('ComkeyNullErrorCount', ctypes.c_longlong),
+        ('IOHandleOLPNullErrorCount', ctypes.c_longlong),
+        ('RetErrorCount', ctypes.c_longlong),
+        ('ClientNormalDisCount', ctypes.c_longlong),
+        ('MaxConnectRefuseCount', ctypes.c_longlong),
+        ('CheckHackRefuseCount', ctypes.c_longlong),
+        ('InitiativeCloseSocketCount', ctypes.c_longlong),
+        ('PostRecvErrorCount', ctypes.c_longlong),
+        ('PostSendErrorCount', ctypes.c_longlong),
+        ('PostAcceptErrorCount', ctypes.c_longlong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBGateServerIOCPParamsLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'MapID'] = self.MapID
+        rec[u'State'] = self.State
+        rec[u'RefreshTime'] = self.RefreshTime
+        rec[u'ComkeyNullErrorCount'] = self.ComkeyNullErrorCount
+        rec[u'IOHandleOLPNullErrorCount'] = self.IOHandleOLPNullErrorCount
+        rec[u'RetErrorCount'] = self.RetErrorCount
+        rec[u'ClientNormalDisCount'] = self.ClientNormalDisCount
+        rec[u'MaxConnectRefuseCount'] = self.MaxConnectRefuseCount
+        rec[u'CheckHackRefuseCount'] = self.CheckHackRefuseCount
+        rec[u'InitiativeCloseSocketCount'] = self.InitiativeCloseSocketCount
+        rec[u'PostRecvErrorCount'] = self.PostRecvErrorCount
+        rec[u'PostSendErrorCount'] = self.PostSendErrorCount
+        rec[u'PostAcceptErrorCount'] = self.PostAcceptErrorCount
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.MapID = rec.get(u'MapID', 0)
+        self.State = rec.get(u'State', 0)
+        self.RefreshTime = rec.get(u'RefreshTime', 0)
+        self.ComkeyNullErrorCount = rec.get(u'ComkeyNullErrorCount', 0)
+        self.IOHandleOLPNullErrorCount = rec.get(u'IOHandleOLPNullErrorCount', 0)
+        self.RetErrorCount = rec.get(u'RetErrorCount', 0)
+        self.ClientNormalDisCount = rec.get(u'ClientNormalDisCount', 0)
+        self.MaxConnectRefuseCount = rec.get(u'MaxConnectRefuseCount', 0)
+        self.CheckHackRefuseCount = rec.get(u'CheckHackRefuseCount', 0)
+        self.InitiativeCloseSocketCount = rec.get(u'InitiativeCloseSocketCount', 0)
+        self.PostRecvErrorCount = rec.get(u'PostRecvErrorCount', 0)
+        self.PostSendErrorCount = rec.get(u'PostSendErrorCount', 0)
+        self.PostAcceptErrorCount = rec.get(u'PostAcceptErrorCount', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'MapID':self.MapID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'MapID':self.MapID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:MapID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.MapID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//服务器异常断线日志#tagDBGateServerIOCPParamsLog:
+            MapID = %s,
+            State = %s,
+            RefreshTime = %s,
+            ComkeyNullErrorCount = %s,
+            IOHandleOLPNullErrorCount = %s,
+            RetErrorCount = %s,
+            ClientNormalDisCount = %s,
+            MaxConnectRefuseCount = %s,
+            CheckHackRefuseCount = %s,
+            InitiativeCloseSocketCount = %s,
+            PostRecvErrorCount = %s,
+            PostSendErrorCount = %s,
+            PostAcceptErrorCount = %s,
+            ADOResult = %s,
+            '''%(
+                self.MapID,
+                self.State,
+                self.RefreshTime,
+                self.ComkeyNullErrorCount,
+                self.IOHandleOLPNullErrorCount,
+                self.RetErrorCount,
+                self.ClientNormalDisCount,
+                self.MaxConnectRefuseCount,
+                self.CheckHackRefuseCount,
+                self.InitiativeCloseSocketCount,
+                self.PostRecvErrorCount,
+                self.PostSendErrorCount,
+                self.PostAcceptErrorCount,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.MapID,
+                self.State,
+                self.RefreshTime,
+                self.ComkeyNullErrorCount,
+                self.IOHandleOLPNullErrorCount,
+                self.RetErrorCount,
+                self.ClientNormalDisCount,
+                self.MaxConnectRefuseCount,
+                self.CheckHackRefuseCount,
+                self.InitiativeCloseSocketCount,
+                self.PostRecvErrorCount,
+                self.PostSendErrorCount,
+                self.PostAcceptErrorCount,
+            )
+        return output
+
+#日志玩家_下线标志更新#tagDBPlayerLogInfoOnLogInOff
+class tagDBPlayerLogInfoOnLogInOff(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('IsOnline', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerLogInfoOnLogInOff)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'IsOnline'] = self.IsOnline
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.IsOnline = rec.get(u'IsOnline', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'AccID':fix_incomingText(self.AccID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//日志玩家_下线标志更新#tagDBPlayerLogInfoOnLogInOff:
+            AccID = %s,
+            IsOnline = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.IsOnline,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.AccID,
+                self.IsOnline,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+
+#GM命令执行日志结果#tagDBGMCommandResultLog
+class tagDBGMCommandResultLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('CmdIndex', ctypes.c_ulong),
+        ('CMDLen', ctypes.c_ushort),
+        ('CMD', ctypes.c_char_p),
+        ('Result', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.CmdIndex = 0
+        self.CMDLen = 0
+        self.CMD = ''
+        self.Result = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.CmdIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CMDLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.CMDLen)
+        self.CMD = ctypes.c_char_p(tmp)
+        self.Result, pos = CommFunc.ReadBYTE(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.CmdIndex)
+        buf = CommFunc.WriteWORD(buf, self.CMDLen)
+        buf = CommFunc.WriteString(buf, self.CMDLen, self.CMD)
+        buf = CommFunc.WriteBYTE(buf, self.Result)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += self.CMDLen
+        length += sizeof(ctypes.c_ubyte)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'CmdIndex'] = self.CmdIndex
+        rec[u'CMDLen'] = self.CMDLen
+        rec[u'CMD'] = fix_incomingText(self.CMD)
+        rec[u'Result'] = self.Result
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.CmdIndex = rec.get(u'CmdIndex', 0)
+        self.CMDLen = rec.get(u'CMDLen', 0)
+        self.CMD = fix_outgoingText(rec.get(u'CMD', u''))
+        self.Result = rec.get(u'Result', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'CmdIndex':self.CmdIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'CmdIndex':self.CmdIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:CmdIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.CmdIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//GM命令执行日志结果#tagDBGMCommandResultLog:
+            CmdIndex = %s,
+            CMDLen = %s,
+            CMD = %s,
+            Result = %s,
+            ADOResult = %s,
+            '''%(
+                self.CmdIndex,
+                self.CMDLen,
+                self.CMD,
+                self.Result,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s'''%(
+                self.CmdIndex,
+                self.CMDLen,
+                self.CMD,
+                self.Result,
+            )
+        return output
+
+#在线人数统计#SvrStatus
+class SvrStatus(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('fldIndex', ctypes.c_int),
+        ('fldDate', ctypes.c_double),
+        ('fldLine', ctypes.c_int),
+        ('fldCount', ctypes.c_int),
+        ('fldInfo', ctypes.c_char * 30),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(SvrStatus)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'fldIndex'] = self.fldIndex
+        rec[u'fldDate'] = self.fldDate
+        rec[u'fldLine'] = self.fldLine
+        rec[u'fldCount'] = self.fldCount
+        rec[u'fldInfo'] = fix_incomingText(self.fldInfo)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.fldIndex = rec.get(u'fldIndex', 0)
+        self.fldDate = rec.get(u'fldDate', 0)
+        self.fldLine = rec.get(u'fldLine', 0)
+        self.fldCount = rec.get(u'fldCount', 0)
+        self.fldInfo = fix_outgoingText(rec.get(u'fldInfo', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'fldIndex':self.fldIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!fldIndex = %s, error = %s, trycnt = %d'%(self.fldIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'fldIndex':self.fldIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!fldIndex = %s, error = %s, trycnt = %d'%(self.fldIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!fldIndex = %s, error = %s, trycnt = %d'%(self.fldIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'fldIndex':self.fldIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'fldIndex':self.fldIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'fldIndex':self.fldIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:fldIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.fldIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.fldIndex = %s, error = %s, trycnt = %d'%(self.fldIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//在线人数统计#SvrStatus:
+            fldIndex = %s,
+            fldDate = %s,
+            fldLine = %s,
+            fldCount = %s,
+            fldInfo = %s,
+            ADOResult = %s,
+            '''%(
+                self.fldIndex,
+                self.fldDate,
+                self.fldLine,
+                self.fldCount,
+                self.fldInfo,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.fldIndex,
+                self.fldDate,
+                self.fldLine,
+                self.fldCount,
+                self.fldInfo,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetfldInfo(self,Str):
+        if len(Str)<=30:
+            self.fldInfo = Str
+        else:
+            self.fldInfo = Str[:30]
+
+#封停/解封帐号信息表#tagAccForbiddenLog
+class tagAccForbiddenLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('StateID', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('PlayerID', ctypes.c_ulong),
+        ('Oper', ctypes.c_ushort),
+        ('OperTime', ctypes.c_double),
+        ('TimeLimit', ctypes.c_ulong),
+        ('GMAccID', ctypes.c_char * 65),
+        ('Msg', ctypes.c_char * 100),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagAccForbiddenLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'StateID'] = self.StateID
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'Oper'] = self.Oper
+        rec[u'OperTime'] = self.OperTime
+        rec[u'TimeLimit'] = self.TimeLimit
+        rec[u'GMAccID'] = fix_incomingText(self.GMAccID)
+        rec[u'Msg'] = fix_incomingText(self.Msg)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.StateID = rec.get(u'StateID', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.Oper = rec.get(u'Oper', 0)
+        self.OperTime = rec.get(u'OperTime', 0)
+        self.TimeLimit = rec.get(u'TimeLimit', 0)
+        self.GMAccID = fix_outgoingText(rec.get(u'GMAccID', u''))
+        self.Msg = fix_outgoingText(rec.get(u'Msg', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'StateID':self.StateID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!StateID = %s, error = %s, trycnt = %d'%(self.StateID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'StateID':self.StateID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!StateID = %s, error = %s, trycnt = %d'%(self.StateID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!StateID = %s, error = %s, trycnt = %d'%(self.StateID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'StateID':self.StateID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'StateID':self.StateID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'StateID':self.StateID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:StateID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.StateID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.StateID = %s, error = %s, trycnt = %d'%(self.StateID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//封停/解封帐号信息表#tagAccForbiddenLog:
+            StateID = %s,
+            AccID = %s,
+            PlayerID = %s,
+            Oper = %s,
+            OperTime = %s,
+            TimeLimit = %s,
+            GMAccID = %s,
+            Msg = %s,
+            ADOResult = %s,
+            '''%(
+                self.StateID,
+                self.AccID,
+                self.PlayerID,
+                self.Oper,
+                self.OperTime,
+                self.TimeLimit,
+                self.GMAccID,
+                self.Msg,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.StateID,
+                self.AccID,
+                self.PlayerID,
+                self.Oper,
+                self.OperTime,
+                self.TimeLimit,
+                self.GMAccID,
+                self.Msg,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetGMAccID(self,Str):
+        if len(Str)<=65:
+            self.GMAccID = Str
+        else:
+            self.GMAccID = Str[:65]
+            
+    def SetMsg(self,Str):
+        if len(Str)<=100:
+            self.Msg = Str
+        else:
+            self.Msg = Str[:100]
+
+#记录所有订单记录#tagAccTransactionLog
+class tagAccTransactionLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('TransactionID', ctypes.c_char * 26),
+        ('AccID', ctypes.c_char * 65),
+        ('ChargeType', ctypes.c_ulong),
+        ('GoldCoins', ctypes.c_ulong),
+        ('SilverCoins', ctypes.c_ulong),
+        ('CheckValue', ctypes.c_char * 33),
+        ('OperReason', ctypes.c_char * 20),
+        ('ProcessTime', ctypes.c_double),
+        ('ItemID', ctypes.c_ulong),
+        ('ItemCount', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagAccTransactionLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'TransactionID'] = fix_incomingText(self.TransactionID)
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'ChargeType'] = self.ChargeType
+        rec[u'GoldCoins'] = self.GoldCoins
+        rec[u'SilverCoins'] = self.SilverCoins
+        rec[u'CheckValue'] = fix_incomingText(self.CheckValue)
+        rec[u'OperReason'] = fix_incomingText(self.OperReason)
+        rec[u'ProcessTime'] = self.ProcessTime
+        rec[u'ItemID'] = self.ItemID
+        rec[u'ItemCount'] = self.ItemCount
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.TransactionID = fix_outgoingText(rec.get(u'TransactionID', u''))
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.ChargeType = rec.get(u'ChargeType', 0)
+        self.GoldCoins = rec.get(u'GoldCoins', 0)
+        self.SilverCoins = rec.get(u'SilverCoins', 0)
+        self.CheckValue = fix_outgoingText(rec.get(u'CheckValue', u''))
+        self.OperReason = fix_outgoingText(rec.get(u'OperReason', u''))
+        self.ProcessTime = rec.get(u'ProcessTime', 0)
+        self.ItemID = rec.get(u'ItemID', 0)
+        self.ItemCount = rec.get(u'ItemCount', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'TransactionID':fix_incomingText(self.TransactionID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!TransactionID = %s, error = %s, trycnt = %d'%(self.TransactionID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'TransactionID':fix_incomingText(self.TransactionID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!TransactionID = %s, error = %s, trycnt = %d'%(self.TransactionID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!TransactionID = %s, error = %s, trycnt = %d'%(self.TransactionID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'TransactionID':fix_incomingText(self.TransactionID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'TransactionID':fix_incomingText(self.TransactionID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'TransactionID':fix_incomingText(self.TransactionID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:TransactionID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.TransactionID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.TransactionID = %s, error = %s, trycnt = %d'%(self.TransactionID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//记录所有订单记录#tagAccTransactionLog:
+            TransactionID = %s,
+            AccID = %s,
+            ChargeType = %s,
+            GoldCoins = %s,
+            SilverCoins = %s,
+            CheckValue = %s,
+            OperReason = %s,
+            ProcessTime = %s,
+            ItemID = %s,
+            ItemCount = %s,
+            ADOResult = %s,
+            '''%(
+                self.TransactionID,
+                self.AccID,
+                self.ChargeType,
+                self.GoldCoins,
+                self.SilverCoins,
+                self.CheckValue,
+                self.OperReason,
+                self.ProcessTime,
+                self.ItemID,
+                self.ItemCount,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.TransactionID,
+                self.AccID,
+                self.ChargeType,
+                self.GoldCoins,
+                self.SilverCoins,
+                self.CheckValue,
+                self.OperReason,
+                self.ProcessTime,
+                self.ItemID,
+                self.ItemCount,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetTransactionID(self,Str):
+        if len(Str)<=26:
+            self.TransactionID = Str
+        else:
+            self.TransactionID = Str[:26]
+            
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetCheckValue(self,Str):
+        if len(Str)<=33:
+            self.CheckValue = Str
+        else:
+            self.CheckValue = Str[:33]
+            
+    def SetOperReason(self,Str):
+        if len(Str)<=20:
+            self.OperReason = Str
+        else:
+            self.OperReason = Str[:20]
+
+#APex踢人日志记录#tagDBApexKickLog
+class tagDBApexKickLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('KickLogIndex', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('MapID', ctypes.c_ulong),
+        ('Time', ctypes.c_double),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBApexKickLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'KickLogIndex'] = self.KickLogIndex
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'MapID'] = self.MapID
+        rec[u'Time'] = self.Time
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.KickLogIndex = rec.get(u'KickLogIndex', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.MapID = rec.get(u'MapID', 0)
+        self.Time = rec.get(u'Time', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!KickLogIndex = %s, error = %s, trycnt = %d'%(self.KickLogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!KickLogIndex = %s, error = %s, trycnt = %d'%(self.KickLogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'KickLogIndex':self.KickLogIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'KickLogIndex':self.KickLogIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:KickLogIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.KickLogIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.KickLogIndex = %s, error = %s, trycnt = %d'%(self.KickLogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//APex踢人日志记录#tagDBApexKickLog:
+            KickLogIndex = %s,
+            PlayerID = %s,
+            AccID = %s,
+            MapID = %s,
+            Time = %s,
+            ADOResult = %s,
+            '''%(
+                self.KickLogIndex,
+                self.PlayerID,
+                self.AccID,
+                self.MapID,
+                self.Time,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.KickLogIndex,
+                self.PlayerID,
+                self.AccID,
+                self.MapID,
+                self.Time,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+
+#点券兑换记录#tagDBCoinChangeLog
+class tagDBCoinChangeLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('LogIndex', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('PlayerID', ctypes.c_ulong),
+        ('Coin', ctypes.c_ulong),
+        ('ChangeTime', ctypes.c_double),
+        ('GoldBefore', ctypes.c_ulong),
+        ('Gold', ctypes.c_ulong),
+        ('PrizeCoin', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBCoinChangeLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'LogIndex'] = self.LogIndex
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'Coin'] = self.Coin
+        rec[u'ChangeTime'] = self.ChangeTime
+        rec[u'GoldBefore'] = self.GoldBefore
+        rec[u'Gold'] = self.Gold
+        rec[u'PrizeCoin'] = self.PrizeCoin
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.LogIndex = rec.get(u'LogIndex', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.Coin = rec.get(u'Coin', 0)
+        self.ChangeTime = rec.get(u'ChangeTime', 0)
+        self.GoldBefore = rec.get(u'GoldBefore', 0)
+        self.Gold = rec.get(u'Gold', 0)
+        self.PrizeCoin = rec.get(u'PrizeCoin', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'LogIndex':self.LogIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//点券兑换记录#tagDBCoinChangeLog:
+            LogIndex = %s,
+            AccID = %s,
+            PlayerID = %s,
+            Coin = %s,
+            ChangeTime = %s,
+            GoldBefore = %s,
+            Gold = %s,
+            PrizeCoin = %s,
+            ADOResult = %s,
+            '''%(
+                self.LogIndex,
+                self.AccID,
+                self.PlayerID,
+                self.Coin,
+                self.ChangeTime,
+                self.GoldBefore,
+                self.Gold,
+                self.PrizeCoin,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.LogIndex,
+                self.AccID,
+                self.PlayerID,
+                self.Coin,
+                self.ChangeTime,
+                self.GoldBefore,
+                self.Gold,
+                self.PrizeCoin,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+#游戏功能事件日志#tagDBGameFunctionEventLog
+class tagDBGameFunctionEventLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('EventLen', ctypes.c_ulong),
+        ('EventID', ctypes.c_char_p),
+        ('TrigCount', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.EventLen = 0
+        self.EventID = ''
+        self.TrigCount = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.EventLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.EventLen)
+        self.EventID = ctypes.c_char_p(tmp)
+        self.TrigCount, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.EventLen)
+        buf = CommFunc.WriteString(buf, self.EventLen, self.EventID)
+        buf = CommFunc.WriteDWORD(buf, self.TrigCount)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += self.EventLen
+        length += sizeof(ctypes.c_ulong)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'EventLen'] = self.EventLen
+        rec[u'EventID'] = fix_incomingText(self.EventID)
+        rec[u'TrigCount'] = self.TrigCount
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.EventLen = rec.get(u'EventLen', 0)
+        self.EventID = fix_outgoingText(rec.get(u'EventID', u''))
+        self.TrigCount = rec.get(u'TrigCount', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'EventID':fix_incomingText(self.EventID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'EventID':fix_incomingText(self.EventID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'EventID':fix_incomingText(self.EventID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'EventID':fix_incomingText(self.EventID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'EventID':fix_incomingText(self.EventID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:EventID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.EventID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//游戏功能事件日志#tagDBGameFunctionEventLog:
+            EventLen = %s,
+            EventID = %s,
+            TrigCount = %s,
+            ADOResult = %s,
+            '''%(
+                self.EventLen,
+                self.EventID,
+                self.TrigCount,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.EventLen,
+                self.EventID,
+                self.TrigCount,
+            )
+        return output
+
+#保存物理分流GateServerIP#tagDBGateServerIP
+class tagDBGateServerIP(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('LogIndex', ctypes.c_ulong),
+        ('RefreshTime', ctypes.c_double),
+        ('RouteServerIndex', ctypes.c_ubyte),
+        ('LineID', ctypes.c_ulong),
+        ('GateServerIndex', ctypes.c_ubyte),
+        ('IP', ctypes.c_char * 30),
+        ('Port', ctypes.c_ushort),
+        ('CurPlayerCnt', ctypes.c_ulong),
+        ('MaxPlayerCnt', ctypes.c_ulong),
+        ('LineType', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBGateServerIP)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'LogIndex'] = self.LogIndex
+        rec[u'RefreshTime'] = self.RefreshTime
+        rec[u'RouteServerIndex'] = self.RouteServerIndex
+        rec[u'LineID'] = self.LineID
+        rec[u'GateServerIndex'] = self.GateServerIndex
+        rec[u'IP'] = fix_incomingText(self.IP)
+        rec[u'Port'] = self.Port
+        rec[u'CurPlayerCnt'] = self.CurPlayerCnt
+        rec[u'MaxPlayerCnt'] = self.MaxPlayerCnt
+        rec[u'LineType'] = self.LineType
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.LogIndex = rec.get(u'LogIndex', 0)
+        self.RefreshTime = rec.get(u'RefreshTime', 0)
+        self.RouteServerIndex = rec.get(u'RouteServerIndex', 0)
+        self.LineID = rec.get(u'LineID', 0)
+        self.GateServerIndex = rec.get(u'GateServerIndex', 0)
+        self.IP = fix_outgoingText(rec.get(u'IP', u''))
+        self.Port = rec.get(u'Port', 0)
+        self.CurPlayerCnt = rec.get(u'CurPlayerCnt', 0)
+        self.MaxPlayerCnt = rec.get(u'MaxPlayerCnt', 0)
+        self.LineType = rec.get(u'LineType', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!LineID = %s, error = %s, trycnt = %d'%(self.LineID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'LogIndex':self.LogIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!LineID = %s, error = %s, trycnt = %d'%(self.LineID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!LineID = %s, error = %s, trycnt = %d'%(self.LineID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'LineID':self.LineID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'LineID':self.LineID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:LineID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.LineID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.LineID = %s, error = %s, trycnt = %d'%(self.LineID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//保存物理分流GateServerIP#tagDBGateServerIP:
+            LogIndex = %s,
+            RefreshTime = %s,
+            RouteServerIndex = %s,
+            LineID = %s,
+            GateServerIndex = %s,
+            IP = %s,
+            Port = %s,
+            CurPlayerCnt = %s,
+            MaxPlayerCnt = %s,
+            LineType = %s,
+            ADOResult = %s,
+            '''%(
+                self.LogIndex,
+                self.RefreshTime,
+                self.RouteServerIndex,
+                self.LineID,
+                self.GateServerIndex,
+                self.IP,
+                self.Port,
+                self.CurPlayerCnt,
+                self.MaxPlayerCnt,
+                self.LineType,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.LogIndex,
+                self.RefreshTime,
+                self.RouteServerIndex,
+                self.LineID,
+                self.GateServerIndex,
+                self.IP,
+                self.Port,
+                self.CurPlayerCnt,
+                self.MaxPlayerCnt,
+                self.LineType,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetIP(self,Str):
+        if len(Str)<=30:
+            self.IP = Str
+        else:
+            self.IP = Str[:30]
+
+#GM命令执行日志#tagDBGMCommandLog
+class tagDBGMCommandLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('CmdIndex', ctypes.c_ulong),
+        ('PostTime', ctypes.c_double),
+        ('ExecTime', ctypes.c_double),
+        ('GMAcc', ctypes.c_char * 65),
+        ('CMDLen', ctypes.c_ubyte),
+        ('CMD', ctypes.c_char_p),
+        ('Result', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.CmdIndex = 0
+        self.PostTime = 0.0
+        self.ExecTime = 0.0
+        self.GMAcc = ''
+        self.CMDLen = 0
+        self.CMD = ''
+        self.Result = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.CmdIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PostTime, pos = CommFunc.ReadDouble(buf, pos)
+        self.ExecTime, pos = CommFunc.ReadDouble(buf, pos)
+        self.GMAcc, pos = CommFunc.ReadString(buf, pos, 65)
+        self.CMDLen, pos = CommFunc.ReadBYTE(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.CMDLen)
+        self.CMD = ctypes.c_char_p(tmp)
+        self.Result, pos = CommFunc.ReadBYTE(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.CmdIndex)
+        buf = CommFunc.WriteDouble(buf, self.PostTime)
+        buf = CommFunc.WriteDouble(buf, self.ExecTime)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.GMAcc)
+        buf = CommFunc.WriteBYTE(buf, self.CMDLen)
+        buf = CommFunc.WriteString(buf, self.CMDLen, self.CMD)
+        buf = CommFunc.WriteBYTE(buf, self.Result)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_ubyte)
+        length += self.CMDLen
+        length += sizeof(ctypes.c_ubyte)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'CmdIndex'] = self.CmdIndex
+        rec[u'PostTime'] = self.PostTime
+        rec[u'ExecTime'] = self.ExecTime
+        rec[u'GMAcc'] = fix_incomingText(self.GMAcc)
+        rec[u'CMDLen'] = self.CMDLen
+        rec[u'CMD'] = fix_incomingText(self.CMD)
+        rec[u'Result'] = self.Result
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.CmdIndex = rec.get(u'CmdIndex', 0)
+        self.PostTime = rec.get(u'PostTime', 0)
+        self.ExecTime = rec.get(u'ExecTime', 0)
+        self.GMAcc = fix_outgoingText(rec.get(u'GMAcc', u''))
+        self.CMDLen = rec.get(u'CMDLen', 0)
+        self.CMD = fix_outgoingText(rec.get(u'CMD', u''))
+        self.Result = rec.get(u'Result', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'CmdIndex':self.CmdIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'CmdIndex':self.CmdIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'CmdIndex':self.CmdIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'CmdIndex':self.CmdIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'CmdIndex':self.CmdIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:CmdIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.CmdIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//GM命令执行日志#tagDBGMCommandLog:
+            CmdIndex = %s,
+            PostTime = %s,
+            ExecTime = %s,
+            GMAcc = %s,
+            CMDLen = %s,
+            CMD = %s,
+            Result = %s,
+            ADOResult = %s,
+            '''%(
+                self.CmdIndex,
+                self.PostTime,
+                self.ExecTime,
+                self.GMAcc,
+                self.CMDLen,
+                self.CMD,
+                self.Result,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.CmdIndex,
+                self.PostTime,
+                self.ExecTime,
+                self.GMAcc,
+                self.CMDLen,
+                self.CMD,
+                self.Result,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetGMAcc(self,Str):
+        if len(Str)<=65:
+            self.GMAcc = Str
+        else:
+            self.GMAcc = Str[:65]
+
+#大额交易#tagDBHugeTrade
+class tagDBHugeTrade(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('TradeIndex', ctypes.c_ulong),
+        ('Time', ctypes.c_double),
+        ('TradeGold', ctypes.c_ulong),
+        ('TradeSilver', ctypes.c_ulong),
+        ('TradeItemID', ctypes.c_ulong),
+        ('TradeItemCount', ctypes.c_ulong),
+        ('SenderID', ctypes.c_ulong),
+        ('SenderGold', ctypes.c_ulong),
+        ('SenderSilver', ctypes.c_ulong),
+        ('ReceiverID', ctypes.c_ulong),
+        ('ReceiverGold', ctypes.c_ulong),
+        ('ReceiverSilver', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBHugeTrade)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'TradeIndex'] = self.TradeIndex
+        rec[u'Time'] = self.Time
+        rec[u'TradeGold'] = self.TradeGold
+        rec[u'TradeSilver'] = self.TradeSilver
+        rec[u'TradeItemID'] = self.TradeItemID
+        rec[u'TradeItemCount'] = self.TradeItemCount
+        rec[u'SenderID'] = self.SenderID
+        rec[u'SenderGold'] = self.SenderGold
+        rec[u'SenderSilver'] = self.SenderSilver
+        rec[u'ReceiverID'] = self.ReceiverID
+        rec[u'ReceiverGold'] = self.ReceiverGold
+        rec[u'ReceiverSilver'] = self.ReceiverSilver
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.TradeIndex = rec.get(u'TradeIndex', 0)
+        self.Time = rec.get(u'Time', 0)
+        self.TradeGold = rec.get(u'TradeGold', 0)
+        self.TradeSilver = rec.get(u'TradeSilver', 0)
+        self.TradeItemID = rec.get(u'TradeItemID', 0)
+        self.TradeItemCount = rec.get(u'TradeItemCount', 0)
+        self.SenderID = rec.get(u'SenderID', 0)
+        self.SenderGold = rec.get(u'SenderGold', 0)
+        self.SenderSilver = rec.get(u'SenderSilver', 0)
+        self.ReceiverID = rec.get(u'ReceiverID', 0)
+        self.ReceiverGold = rec.get(u'ReceiverGold', 0)
+        self.ReceiverSilver = rec.get(u'ReceiverSilver', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!TradeIndex = %s, error = %s, trycnt = %d'%(self.TradeIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!TradeIndex = %s, error = %s, trycnt = %d'%(self.TradeIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'TradeIndex':self.TradeIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'TradeIndex':self.TradeIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:TradeIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.TradeIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.TradeIndex = %s, error = %s, trycnt = %d'%(self.TradeIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//大额交易#tagDBHugeTrade:
+            TradeIndex = %s,
+            Time = %s,
+            TradeGold = %s,
+            TradeSilver = %s,
+            TradeItemID = %s,
+            TradeItemCount = %s,
+            SenderID = %s,
+            SenderGold = %s,
+            SenderSilver = %s,
+            ReceiverID = %s,
+            ReceiverGold = %s,
+            ReceiverSilver = %s,
+            ADOResult = %s,
+            '''%(
+                self.TradeIndex,
+                self.Time,
+                self.TradeGold,
+                self.TradeSilver,
+                self.TradeItemID,
+                self.TradeItemCount,
+                self.SenderID,
+                self.SenderGold,
+                self.SenderSilver,
+                self.ReceiverID,
+                self.ReceiverGold,
+                self.ReceiverSilver,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.TradeIndex,
+                self.Time,
+                self.TradeGold,
+                self.TradeSilver,
+                self.TradeItemID,
+                self.TradeItemCount,
+                self.SenderID,
+                self.SenderGold,
+                self.SenderSilver,
+                self.ReceiverID,
+                self.ReceiverGold,
+                self.ReceiverSilver,
+            )
+        return output
+
+#地图服务器负载#tagDBMapServerBalance
+class tagDBMapServerBalance(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('LogIndex', ctypes.c_ulong),
+        ('RouteServerIndex', ctypes.c_ubyte),
+        ('MapID', ctypes.c_ushort),
+        ('LineID', ctypes.c_ubyte),
+        ('CurPlayerCount', ctypes.c_ushort),
+        ('MaxPlayerCount', ctypes.c_ushort),
+        ('RefreshTime', ctypes.c_double),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBMapServerBalance)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'LogIndex'] = self.LogIndex
+        rec[u'RouteServerIndex'] = self.RouteServerIndex
+        rec[u'MapID'] = self.MapID
+        rec[u'LineID'] = self.LineID
+        rec[u'CurPlayerCount'] = self.CurPlayerCount
+        rec[u'MaxPlayerCount'] = self.MaxPlayerCount
+        rec[u'RefreshTime'] = self.RefreshTime
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.LogIndex = rec.get(u'LogIndex', 0)
+        self.RouteServerIndex = rec.get(u'RouteServerIndex', 0)
+        self.MapID = rec.get(u'MapID', 0)
+        self.LineID = rec.get(u'LineID', 0)
+        self.CurPlayerCount = rec.get(u'CurPlayerCount', 0)
+        self.MaxPlayerCount = rec.get(u'MaxPlayerCount', 0)
+        self.RefreshTime = rec.get(u'RefreshTime', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!RouteServerIndex = %s, error = %s, trycnt = %d'%(self.RouteServerIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'LogIndex':self.LogIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!RouteServerIndex = %s, error = %s, trycnt = %d'%(self.RouteServerIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!RouteServerIndex = %s, error = %s, trycnt = %d'%(self.RouteServerIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'RouteServerIndex':self.RouteServerIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'RouteServerIndex':self.RouteServerIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:RouteServerIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.RouteServerIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.RouteServerIndex = %s, error = %s, trycnt = %d'%(self.RouteServerIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//地图服务器负载#tagDBMapServerBalance:
+            LogIndex = %s,
+            RouteServerIndex = %s,
+            MapID = %s,
+            LineID = %s,
+            CurPlayerCount = %s,
+            MaxPlayerCount = %s,
+            RefreshTime = %s,
+            ADOResult = %s,
+            '''%(
+                self.LogIndex,
+                self.RouteServerIndex,
+                self.MapID,
+                self.LineID,
+                self.CurPlayerCount,
+                self.MaxPlayerCount,
+                self.RefreshTime,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.LogIndex,
+                self.RouteServerIndex,
+                self.MapID,
+                self.LineID,
+                self.CurPlayerCount,
+                self.MaxPlayerCount,
+                self.RefreshTime,
+            )
+        return output
+
+#日志玩家信息#tagDBPlayerInfoLog
+class tagDBPlayerInfoLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('AccRegisterTime', ctypes.c_double),
+        ('IsAdult', ctypes.c_ubyte),
+        ('PlayerName', ctypes.c_char * 33),
+        ('RegisterIP', ctypes.c_char * 30),
+        ('PlayerRegisterTime', ctypes.c_double),
+        ('Sex', ctypes.c_ubyte),
+        ('Face', ctypes.c_ubyte),
+        ('Hair', ctypes.c_ubyte),
+        ('LastLoginTime', ctypes.c_double),
+        ('LastLoginIP', ctypes.c_char * 30),
+        ('ForbiddenTime', ctypes.c_double),
+        ('AccState', ctypes.c_ubyte),
+        ('LV', ctypes.c_ushort),
+        ('AccountMoney', ctypes.c_ulong),
+        ('Gold', ctypes.c_ulong),
+        ('GoldPaper', ctypes.c_ulong),
+        ('Silver', ctypes.c_ulong),
+        ('SilverPaper', ctypes.c_ulong),
+        ('GMLevel', ctypes.c_ubyte),
+        ('Job', ctypes.c_ubyte),
+        ('TJGTime', ctypes.c_ulong),
+        ('TJGState', ctypes.c_ubyte),
+        ('LastLogoffTime', ctypes.c_double),
+        ('IsOnline', ctypes.c_ubyte),
+        ('UseCoin', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('FirstLoginTime', ctypes.c_double),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerInfoLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'AccRegisterTime'] = self.AccRegisterTime
+        rec[u'IsAdult'] = self.IsAdult
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'RegisterIP'] = fix_incomingText(self.RegisterIP)
+        rec[u'PlayerRegisterTime'] = self.PlayerRegisterTime
+        rec[u'Sex'] = self.Sex
+        rec[u'Face'] = self.Face
+        rec[u'Hair'] = self.Hair
+        rec[u'LastLoginTime'] = self.LastLoginTime
+        rec[u'LastLoginIP'] = fix_incomingText(self.LastLoginIP)
+        rec[u'ForbiddenTime'] = self.ForbiddenTime
+        rec[u'AccState'] = self.AccState
+        rec[u'LV'] = self.LV
+        rec[u'AccountMoney'] = self.AccountMoney
+        rec[u'Gold'] = self.Gold
+        rec[u'GoldPaper'] = self.GoldPaper
+        rec[u'Silver'] = self.Silver
+        rec[u'SilverPaper'] = self.SilverPaper
+        rec[u'GMLevel'] = self.GMLevel
+        rec[u'Job'] = self.Job
+        rec[u'TJGTime'] = self.TJGTime
+        rec[u'TJGState'] = self.TJGState
+        rec[u'LastLogoffTime'] = self.LastLogoffTime
+        rec[u'IsOnline'] = self.IsOnline
+        rec[u'UseCoin'] = self.UseCoin
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'FirstLoginTime'] = self.FirstLoginTime
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.AccRegisterTime = rec.get(u'AccRegisterTime', 0)
+        self.IsAdult = rec.get(u'IsAdult', 0)
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.RegisterIP = fix_outgoingText(rec.get(u'RegisterIP', u''))
+        self.PlayerRegisterTime = rec.get(u'PlayerRegisterTime', 0)
+        self.Sex = rec.get(u'Sex', 0)
+        self.Face = rec.get(u'Face', 0)
+        self.Hair = rec.get(u'Hair', 0)
+        self.LastLoginTime = rec.get(u'LastLoginTime', 0)
+        self.LastLoginIP = fix_outgoingText(rec.get(u'LastLoginIP', u''))
+        self.ForbiddenTime = rec.get(u'ForbiddenTime', 0)
+        self.AccState = rec.get(u'AccState', 0)
+        self.LV = rec.get(u'LV', 0)
+        self.AccountMoney = rec.get(u'AccountMoney', 0)
+        self.Gold = rec.get(u'Gold', 0)
+        self.GoldPaper = rec.get(u'GoldPaper', 0)
+        self.Silver = rec.get(u'Silver', 0)
+        self.SilverPaper = rec.get(u'SilverPaper', 0)
+        self.GMLevel = rec.get(u'GMLevel', 0)
+        self.Job = rec.get(u'Job', 0)
+        self.TJGTime = rec.get(u'TJGTime', 0)
+        self.TJGState = rec.get(u'TJGState', 0)
+        self.LastLogoffTime = rec.get(u'LastLogoffTime', 0)
+        self.IsOnline = rec.get(u'IsOnline', 0)
+        self.UseCoin = rec.get(u'UseCoin', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.FirstLoginTime = rec.get(u'FirstLoginTime', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'AccID':fix_incomingText(self.AccID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//日志玩家信息#tagDBPlayerInfoLog:
+            AccID = %s,
+            AccRegisterTime = %s,
+            IsAdult = %s,
+            PlayerName = %s,
+            RegisterIP = %s,
+            PlayerRegisterTime = %s,
+            Sex = %s,
+            Face = %s,
+            Hair = %s,
+            LastLoginTime = %s,
+            LastLoginIP = %s,
+            ForbiddenTime = %s,
+            AccState = %s,
+            LV = %s,
+            AccountMoney = %s,
+            Gold = %s,
+            GoldPaper = %s,
+            Silver = %s,
+            SilverPaper = %s,
+            GMLevel = %s,
+            Job = %s,
+            TJGTime = %s,
+            TJGState = %s,
+            LastLogoffTime = %s,
+            IsOnline = %s,
+            UseCoin = %s,
+            PlayerID = %s,
+            FirstLoginTime = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.AccRegisterTime,
+                self.IsAdult,
+                self.PlayerName,
+                self.RegisterIP,
+                self.PlayerRegisterTime,
+                self.Sex,
+                self.Face,
+                self.Hair,
+                self.LastLoginTime,
+                self.LastLoginIP,
+                self.ForbiddenTime,
+                self.AccState,
+                self.LV,
+                self.AccountMoney,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.GMLevel,
+                self.Job,
+                self.TJGTime,
+                self.TJGState,
+                self.LastLogoffTime,
+                self.IsOnline,
+                self.UseCoin,
+                self.PlayerID,
+                self.FirstLoginTime,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.AccID,
+                self.AccRegisterTime,
+                self.IsAdult,
+                self.PlayerName,
+                self.RegisterIP,
+                self.PlayerRegisterTime,
+                self.Sex,
+                self.Face,
+                self.Hair,
+                self.LastLoginTime,
+                self.LastLoginIP,
+                self.ForbiddenTime,
+                self.AccState,
+                self.LV,
+                self.AccountMoney,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.GMLevel,
+                self.Job,
+                self.TJGTime,
+                self.TJGState,
+                self.LastLogoffTime,
+                self.IsOnline,
+                self.UseCoin,
+                self.PlayerID,
+                self.FirstLoginTime,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+    def SetRegisterIP(self,Str):
+        if len(Str)<=30:
+            self.RegisterIP = Str
+        else:
+            self.RegisterIP = Str[:30]
+            
+    def SetLastLoginIP(self,Str):
+        if len(Str)<=30:
+            self.LastLoginIP = Str
+        else:
+            self.LastLoginIP = Str[:30]
+            
+
+
+            
+#日志玩家_创建角色更新#tagDBPlayerInfoLogCreateRole
+class tagDBPlayerInfoLogCreateRole(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('PlayerName', ctypes.c_char * 33),
+        ('Sex', ctypes.c_ubyte),
+        ('Face', ctypes.c_ubyte),
+        ('Hair', ctypes.c_ubyte),
+        ('PlayerRegisterTime', ctypes.c_double),
+        ('PlayerID', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerInfoLogCreateRole)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'Sex'] = self.Sex
+        rec[u'Face'] = self.Face
+        rec[u'Hair'] = self.Hair
+        rec[u'PlayerRegisterTime'] = self.PlayerRegisterTime
+        rec[u'PlayerID'] = self.PlayerID
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.Sex = rec.get(u'Sex', 0)
+        self.Face = rec.get(u'Face', 0)
+        self.Hair = rec.get(u'Hair', 0)
+        self.PlayerRegisterTime = rec.get(u'PlayerRegisterTime', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'AccID':fix_incomingText(self.AccID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//日志玩家_创建角色更新#tagDBPlayerInfoLogCreateRole:
+            AccID = %s,
+            PlayerName = %s,
+            Sex = %s,
+            Face = %s,
+            Hair = %s,
+            PlayerRegisterTime = %s,
+            PlayerID = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.PlayerName,
+                self.Sex,
+                self.Face,
+                self.Hair,
+                self.PlayerRegisterTime,
+                self.PlayerID,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.AccID,
+                self.PlayerName,
+                self.Sex,
+                self.Face,
+                self.Hair,
+                self.PlayerRegisterTime,
+                self.PlayerID,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+#日志玩家_封停更新#tagDBPlayerInfoLogForbidden
+class tagDBPlayerInfoLogForbidden(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('IsForbidden', ctypes.c_ubyte),
+        ('ForbiddenTime', ctypes.c_double),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerInfoLogForbidden)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'IsForbidden'] = self.IsForbidden
+        rec[u'ForbiddenTime'] = self.ForbiddenTime
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.IsForbidden = rec.get(u'IsForbidden', 0)
+        self.ForbiddenTime = rec.get(u'ForbiddenTime', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'AccID':fix_incomingText(self.AccID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//日志玩家_封停更新#tagDBPlayerInfoLogForbidden:
+            AccID = %s,
+            IsForbidden = %s,
+            ForbiddenTime = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.IsForbidden,
+                self.ForbiddenTime,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.AccID,
+                self.IsForbidden,
+                self.ForbiddenTime,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+           
+#日志玩家_登录更新#tagDBPlayerInfoLogRoleLogin
+class tagDBPlayerInfoLogRoleLogin(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('LastLoginTime', ctypes.c_double),
+        ('LastLoginIP', ctypes.c_char * 30),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerInfoLogRoleLogin)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'LastLoginTime'] = self.LastLoginTime
+        rec[u'LastLoginIP'] = fix_incomingText(self.LastLoginIP)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.LastLoginTime = rec.get(u'LastLoginTime', 0)
+        self.LastLoginIP = fix_outgoingText(rec.get(u'LastLoginIP', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//日志玩家_登录更新#tagDBPlayerInfoLogRoleLogin:
+            AccID = %s,
+            LastLoginTime = %s,
+            LastLoginIP = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.LastLoginTime,
+                self.LastLoginIP,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.AccID,
+                self.LastLoginTime,
+                self.LastLoginIP,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetLastLoginIP(self,Str):
+        if len(Str)<=30:
+            self.LastLoginIP = Str
+        else:
+            self.LastLoginIP = Str[:30]
+
+#日志记录#tagDBPlayerLog
+class tagDBPlayerLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('LogIndex', ctypes.c_ulong),
+        ('Oper', ctypes.c_ushort),
+        ('Time', ctypes.c_double),
+        ('MapID', ctypes.c_ushort),
+        ('PlayerID', ctypes.c_ulong),
+        ('TagID', ctypes.c_ulong),
+        ('Par', ctypes.c_ulong),
+        ('MsgLen', ctypes.c_ushort),
+        ('Msg', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.LogIndex = 0
+        self.Oper = 0
+        self.Time = 0.0
+        self.MapID = 0
+        self.PlayerID = 0
+        self.TagID = 0
+        self.Par = 0
+        self.MsgLen = 0
+        self.Msg = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.LogIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Oper, pos = CommFunc.ReadWORD(buf, pos)
+        self.Time, pos = CommFunc.ReadDouble(buf, pos)
+        self.MapID, pos = CommFunc.ReadWORD(buf, pos)
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.TagID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Par, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MsgLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.MsgLen)
+        self.Msg = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.LogIndex)
+        buf = CommFunc.WriteWORD(buf, self.Oper)
+        buf = CommFunc.WriteDouble(buf, self.Time)
+        buf = CommFunc.WriteWORD(buf, self.MapID)
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteDWORD(buf, self.TagID)
+        buf = CommFunc.WriteDWORD(buf, self.Par)
+        buf = CommFunc.WriteWORD(buf, self.MsgLen)
+        buf = CommFunc.WriteString(buf, self.MsgLen, self.Msg)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += self.MsgLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'LogIndex'] = self.LogIndex
+        rec[u'Oper'] = self.Oper
+        rec[u'Time'] = self.Time
+        rec[u'MapID'] = self.MapID
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TagID'] = self.TagID
+        rec[u'Par'] = self.Par
+        rec[u'MsgLen'] = self.MsgLen
+        rec[u'Msg'] = fix_incomingText(self.Msg)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.LogIndex = rec.get(u'LogIndex', 0)
+        self.Oper = rec.get(u'Oper', 0)
+        self.Time = rec.get(u'Time', 0)
+        self.MapID = rec.get(u'MapID', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TagID = rec.get(u'TagID', 0)
+        self.Par = rec.get(u'Par', 0)
+        self.MsgLen = rec.get(u'MsgLen', 0)
+        self.Msg = fix_outgoingText(rec.get(u'Msg', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'LogIndex':self.LogIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'LogIndex':self.LogIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:LogIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.LogIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//日志记录#tagDBPlayerLog:
+            LogIndex = %s,
+            Oper = %s,
+            Time = %s,
+            MapID = %s,
+            PlayerID = %s,
+            TagID = %s,
+            Par = %s,
+            MsgLen = %s,
+            Msg = %s,
+            ADOResult = %s,
+            '''%(
+                self.LogIndex,
+                self.Oper,
+                self.Time,
+                self.MapID,
+                self.PlayerID,
+                self.TagID,
+                self.Par,
+                self.MsgLen,
+                self.Msg,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.LogIndex,
+                self.Oper,
+                self.Time,
+                self.MapID,
+                self.PlayerID,
+                self.TagID,
+                self.Par,
+                self.MsgLen,
+                self.Msg,
+            )
+        return output
+
+#日志玩家_点券使用更新#tagDBPlayerLogInfoOnCoinChange
+class tagDBPlayerLogInfoOnCoinChange(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('Coin', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerLogInfoOnCoinChange)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'Coin'] = self.Coin
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.Coin = rec.get(u'Coin', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//日志玩家_点券使用更新#tagDBPlayerLogInfoOnCoinChange:
+            AccID = %s,
+            Coin = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.Coin,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.AccID,
+                self.Coin,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+                       
+#日志玩家_下线更新#tagDBPlayerLogInfoOnLogOff
+class tagDBPlayerLogInfoOnLogOff(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('PlayerName', ctypes.c_char * 33),
+        ('AccState', ctypes.c_ubyte),
+        ('LV', ctypes.c_ushort),
+        ('Gold', ctypes.c_ulong),
+        ('GoldPaper', ctypes.c_ulong),
+        ('Silver', ctypes.c_ulong),
+        ('SilverPaper', ctypes.c_ulong),
+        ('GMLevel', ctypes.c_ubyte),
+        ('Job', ctypes.c_ubyte),
+        ('LastLogoffTime', ctypes.c_double),
+        ('PlayerID', ctypes.c_ulong),
+        ('TJGTime', ctypes.c_ulong),
+        ('TJGState', ctypes.c_ubyte),
+        ('IsOnline', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerLogInfoOnLogOff)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'AccState'] = self.AccState
+        rec[u'LV'] = self.LV
+        rec[u'Gold'] = self.Gold
+        rec[u'GoldPaper'] = self.GoldPaper
+        rec[u'Silver'] = self.Silver
+        rec[u'SilverPaper'] = self.SilverPaper
+        rec[u'GMLevel'] = self.GMLevel
+        rec[u'Job'] = self.Job
+        rec[u'LastLogoffTime'] = self.LastLogoffTime
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TJGTime'] = self.TJGTime
+        rec[u'TJGState'] = self.TJGState
+        rec[u'IsOnline'] = self.IsOnline
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.AccState = rec.get(u'AccState', 0)
+        self.LV = rec.get(u'LV', 0)
+        self.Gold = rec.get(u'Gold', 0)
+        self.GoldPaper = rec.get(u'GoldPaper', 0)
+        self.Silver = rec.get(u'Silver', 0)
+        self.SilverPaper = rec.get(u'SilverPaper', 0)
+        self.GMLevel = rec.get(u'GMLevel', 0)
+        self.Job = rec.get(u'Job', 0)
+        self.LastLogoffTime = rec.get(u'LastLogoffTime', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TJGTime = rec.get(u'TJGTime', 0)
+        self.TJGState = rec.get(u'TJGState', 0)
+        self.IsOnline = rec.get(u'IsOnline', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'AccID':fix_incomingText(self.AccID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//日志玩家_下线更新#tagDBPlayerLogInfoOnLogOff:
+            AccID = %s,
+            PlayerName = %s,
+            AccState = %s,
+            LV = %s,
+            Gold = %s,
+            GoldPaper = %s,
+            Silver = %s,
+            SilverPaper = %s,
+            GMLevel = %s,
+            Job = %s,
+            LastLogoffTime = %s,
+            PlayerID = %s,
+            TJGTime = %s,
+            TJGState = %s,
+            IsOnline = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.PlayerName,
+                self.AccState,
+                self.LV,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.GMLevel,
+                self.Job,
+                self.LastLogoffTime,
+                self.PlayerID,
+                self.TJGTime,
+                self.TJGState,
+                self.IsOnline,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.AccID,
+                self.PlayerName,
+                self.AccState,
+                self.LV,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.GMLevel,
+                self.Job,
+                self.LastLogoffTime,
+                self.PlayerID,
+                self.TJGTime,
+                self.TJGState,
+                self.IsOnline,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+            
+#玩家储值日志#tagDBPlayerSaveCoinLog
+class tagDBPlayerSaveCoinLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('LogIndex', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('Coin', ctypes.c_ulong),
+        ('Msg', ctypes.c_char * 50),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerSaveCoinLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'LogIndex'] = self.LogIndex
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'Coin'] = self.Coin
+        rec[u'Msg'] = fix_incomingText(self.Msg)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.LogIndex = rec.get(u'LogIndex', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.Coin = rec.get(u'Coin', 0)
+        self.Msg = fix_outgoingText(rec.get(u'Msg', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'LogIndex':self.LogIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'LogIndex':self.LogIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:LogIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.LogIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家储值日志#tagDBPlayerSaveCoinLog:
+            LogIndex = %s,
+            AccID = %s,
+            Coin = %s,
+            Msg = %s,
+            ADOResult = %s,
+            '''%(
+                self.LogIndex,
+                self.AccID,
+                self.Coin,
+                self.Msg,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s'''%(
+                self.LogIndex,
+                self.AccID,
+                self.Coin,
+                self.Msg,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetMsg(self,Str):
+        if len(Str)<=50:
+            self.Msg = Str
+        else:
+            self.Msg = Str[:50]
+
+#服务器踢人#tagDBServerKickLog
+class tagDBServerKickLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('LogIndex', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('MapID', ctypes.c_ulong),
+        ('Time', ctypes.c_double),
+        ('MsgLen', ctypes.c_ushort),
+        ('Msg', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.LogIndex = 0
+        self.PlayerID = 0
+        self.AccID = ''
+        self.MapID = 0
+        self.Time = 0.0
+        self.MsgLen = 0
+        self.Msg = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.LogIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AccID, pos = CommFunc.ReadString(buf, pos, 65)
+        self.MapID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Time, pos = CommFunc.ReadDouble(buf, pos)
+        self.MsgLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.MsgLen)
+        self.Msg = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.LogIndex)
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.AccID)
+        buf = CommFunc.WriteDWORD(buf, self.MapID)
+        buf = CommFunc.WriteDouble(buf, self.Time)
+        buf = CommFunc.WriteWORD(buf, self.MsgLen)
+        buf = CommFunc.WriteString(buf, self.MsgLen, self.Msg)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_ushort)
+        length += self.MsgLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'LogIndex'] = self.LogIndex
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'MapID'] = self.MapID
+        rec[u'Time'] = self.Time
+        rec[u'MsgLen'] = self.MsgLen
+        rec[u'Msg'] = fix_incomingText(self.Msg)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.LogIndex = rec.get(u'LogIndex', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.MapID = rec.get(u'MapID', 0)
+        self.Time = rec.get(u'Time', 0)
+        self.MsgLen = rec.get(u'MsgLen', 0)
+        self.Msg = fix_outgoingText(rec.get(u'Msg', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'LogIndex':self.LogIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'LogIndex':self.LogIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:LogIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.LogIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//服务器踢人#tagDBServerKickLog:
+            LogIndex = %s,
+            PlayerID = %s,
+            AccID = %s,
+            MapID = %s,
+            Time = %s,
+            MsgLen = %s,
+            Msg = %s,
+            ADOResult = %s,
+            '''%(
+                self.LogIndex,
+                self.PlayerID,
+                self.AccID,
+                self.MapID,
+                self.Time,
+                self.MsgLen,
+                self.Msg,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.LogIndex,
+                self.PlayerID,
+                self.AccID,
+                self.MapID,
+                self.Time,
+                self.MsgLen,
+                self.Msg,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+
+#服务器金钱日志#tagDBServerMoneyLog
+class tagDBServerMoneyLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('LogIndex', ctypes.c_ulong),
+        ('Oper', ctypes.c_ulong),
+        ('Time', ctypes.c_double),
+        ('PlayerID', ctypes.c_ulong),
+        ('TagID', ctypes.c_ulong),
+        ('Par', ctypes.c_ulong),
+        ('MoneyType', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBServerMoneyLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'LogIndex'] = self.LogIndex
+        rec[u'Oper'] = self.Oper
+        rec[u'Time'] = self.Time
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TagID'] = self.TagID
+        rec[u'Par'] = self.Par
+        rec[u'MoneyType'] = self.MoneyType
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.LogIndex = rec.get(u'LogIndex', 0)
+        self.Oper = rec.get(u'Oper', 0)
+        self.Time = rec.get(u'Time', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TagID = rec.get(u'TagID', 0)
+        self.Par = rec.get(u'Par', 0)
+        self.MoneyType = rec.get(u'MoneyType', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!Oper = %s, error = %s, trycnt = %d'%(self.Oper, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'LogIndex':self.LogIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!Oper = %s, error = %s, trycnt = %d'%(self.Oper, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!Oper = %s, error = %s, trycnt = %d'%(self.Oper, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'Oper':self.Oper})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'Oper':self.Oper})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:Oper = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.Oper))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.Oper = %s, error = %s, trycnt = %d'%(self.Oper, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//服务器金钱日志#tagDBServerMoneyLog:
+            LogIndex = %s,
+            Oper = %s,
+            Time = %s,
+            PlayerID = %s,
+            TagID = %s,
+            Par = %s,
+            MoneyType = %s,
+            ADOResult = %s,
+            '''%(
+                self.LogIndex,
+                self.Oper,
+                self.Time,
+                self.PlayerID,
+                self.TagID,
+                self.Par,
+                self.MoneyType,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.LogIndex,
+                self.Oper,
+                self.Time,
+                self.PlayerID,
+                self.TagID,
+                self.Par,
+                self.MoneyType,
+            )
+        return output
+
+#服务器状态日志#tagDBServerStateLog
+class tagDBServerStateLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('MapID', ctypes.c_ulong),
+        ('State', ctypes.c_ubyte),
+        ('RefreshTime', ctypes.c_double),
+        ('MapServerNumber', ctypes.c_ubyte),
+        ('IP', ctypes.c_char * 30),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBServerStateLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'MapID'] = self.MapID
+        rec[u'State'] = self.State
+        rec[u'RefreshTime'] = self.RefreshTime
+        rec[u'MapServerNumber'] = self.MapServerNumber
+        rec[u'IP'] = fix_incomingText(self.IP)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.MapID = rec.get(u'MapID', 0)
+        self.State = rec.get(u'State', 0)
+        self.RefreshTime = rec.get(u'RefreshTime', 0)
+        self.MapServerNumber = rec.get(u'MapServerNumber', 0)
+        self.IP = fix_outgoingText(rec.get(u'IP', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'MapID':self.MapID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'MapID':self.MapID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'MapID':self.MapID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'MapID':self.MapID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'MapID':self.MapID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:MapID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.MapID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//服务器状态日志#tagDBServerStateLog:
+            MapID = %s,
+            State = %s,
+            RefreshTime = %s,
+            MapServerNumber = %s,
+            IP = %s,
+            ADOResult = %s,
+            '''%(
+                self.MapID,
+                self.State,
+                self.RefreshTime,
+                self.MapServerNumber,
+                self.IP,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.MapID,
+                self.State,
+                self.RefreshTime,
+                self.MapServerNumber,
+                self.IP,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetIP(self,Str):
+        if len(Str)<=30:
+            self.IP = Str
+        else:
+            self.IP = Str[:30]
+
+#金钱补偿日志#tagExpiationLog
+class tagExpiationLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ExpiationIndex', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('ExpiationTime', ctypes.c_double),
+        ('ReceiveDate', ctypes.c_double),
+        ('Gold', ctypes.c_ulong),
+        ('GoldPaper', ctypes.c_ulong),
+        ('Silver', ctypes.c_ulong),
+        ('SilverPaper', ctypes.c_ulong),
+        ('ItemTypeID', ctypes.c_ulong),
+        ('Count', ctypes.c_ushort),
+        ('IsLocked', ctypes.c_ubyte),
+        ('ItemPlaceType', ctypes.c_ubyte),
+        ('ItemPlaceIndex', ctypes.c_ushort),
+        ('IsBind', ctypes.c_ubyte),
+        ('ItemStarLV', ctypes.c_ubyte),
+        ('IdentifyPar', ctypes.c_ubyte),
+        ('CurDurg', ctypes.c_ulong),
+        ('MaxDurg', ctypes.c_ulong),
+        ('CanPlaceStoneCount', ctypes.c_ubyte),
+        ('ItemProperty', ctypes.c_ubyte),
+        ('SoulProperty', ctypes.c_ushort),
+        ('Maker', ctypes.c_ulong),
+        ('MakerName', ctypes.c_char * 33),
+        ('Stone1', ctypes.c_ulong),
+        ('Stone2', ctypes.c_ulong),
+        ('Stone3', ctypes.c_ulong),
+        ('Stone4', ctypes.c_ulong),
+        ('Stone5', ctypes.c_ulong),
+        ('Stone6', ctypes.c_ulong),
+        ('Stone7', ctypes.c_ulong),
+        ('Stone8', ctypes.c_ulong),
+        ('Stone9', ctypes.c_ulong),
+        ('RemainHour', ctypes.c_ushort),
+        ('CreateTime', ctypes.c_char * 30),
+        ('ElementEffect', ctypes.c_ubyte),
+        ('IsSuite', ctypes.c_ubyte),
+        ('FitLV', ctypes.c_ubyte),
+        ('EquipAddSkillCnt', ctypes.c_ubyte),
+        ('ExpireTime', ctypes.c_ushort),
+        ('BaseAtkPlus', ctypes.c_ulong),
+        ('BaseDefPlus', ctypes.c_ulong),
+        ('AddSkillData', ctypes.c_char * 300),
+        ('BaseHP', ctypes.c_ulong),
+        ('BaseMagicDef', ctypes.c_ulong),
+        ('EquipMinAtkValue', ctypes.c_ulong),
+        ('Proficiency', ctypes.c_ulong),
+        ('RelMaxAddSkillCnt', ctypes.c_ubyte),
+        ('FamilyActiveValue', ctypes.c_ulong),
+        ('UserDataLen', ctypes.c_ulong),
+        ('UserData', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.ExpiationIndex = 0
+        self.AccID = ''
+        self.ExpiationTime = 0.0
+        self.ReceiveDate = 0.0
+        self.Gold = 0
+        self.GoldPaper = 0
+        self.Silver = 0
+        self.SilverPaper = 0
+        self.ItemTypeID = 0
+        self.Count = 0
+        self.IsLocked = 0
+        self.ItemPlaceType = 0
+        self.ItemPlaceIndex = 0
+        self.IsBind = 0
+        self.ItemStarLV = 0
+        self.IdentifyPar = 0
+        self.CurDurg = 0
+        self.MaxDurg = 0
+        self.CanPlaceStoneCount = 0
+        self.ItemProperty = 0
+        self.SoulProperty = 0
+        self.Maker = 0
+        self.MakerName = ''
+        self.Stone1 = 0
+        self.Stone2 = 0
+        self.Stone3 = 0
+        self.Stone4 = 0
+        self.Stone5 = 0
+        self.Stone6 = 0
+        self.Stone7 = 0
+        self.Stone8 = 0
+        self.Stone9 = 0
+        self.RemainHour = 0
+        self.CreateTime = ''
+        self.ElementEffect = 0
+        self.IsSuite = 0
+        self.FitLV = 0
+        self.EquipAddSkillCnt = 0
+        self.ExpireTime = 0
+        self.BaseAtkPlus = 0
+        self.BaseDefPlus = 0
+        self.AddSkillData = ''
+        self.BaseHP = 0
+        self.BaseMagicDef = 0
+        self.EquipMinAtkValue = 0
+        self.Proficiency = 0
+        self.RelMaxAddSkillCnt = 0
+        self.FamilyActiveValue = 0
+        self.UserDataLen = 0
+        self.UserData = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.ExpiationIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AccID, pos = CommFunc.ReadString(buf, pos, 65)
+        self.ExpiationTime, pos = CommFunc.ReadDouble(buf, pos)
+        self.ReceiveDate, pos = CommFunc.ReadDouble(buf, pos)
+        self.Gold, pos = CommFunc.ReadDWORD(buf, pos)
+        self.GoldPaper, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Silver, pos = CommFunc.ReadDWORD(buf, pos)
+        self.SilverPaper, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ItemTypeID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Count, pos = CommFunc.ReadWORD(buf, pos)
+        self.IsLocked, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemPlaceType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemPlaceIndex, pos = CommFunc.ReadWORD(buf, pos)
+        self.IsBind, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemStarLV, pos = CommFunc.ReadBYTE(buf, pos)
+        self.IdentifyPar, pos = CommFunc.ReadBYTE(buf, pos)
+        self.CurDurg, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MaxDurg, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CanPlaceStoneCount, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemProperty, pos = CommFunc.ReadBYTE(buf, pos)
+        self.SoulProperty, pos = CommFunc.ReadWORD(buf, pos)
+        self.Maker, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MakerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.Stone1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone5, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone6, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone7, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone8, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone9, pos = CommFunc.ReadDWORD(buf, pos)
+        self.RemainHour, pos = CommFunc.ReadWORD(buf, pos)
+        self.CreateTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.ElementEffect, pos = CommFunc.ReadBYTE(buf, pos)
+        self.IsSuite, pos = CommFunc.ReadBYTE(buf, pos)
+        self.FitLV, pos = CommFunc.ReadBYTE(buf, pos)
+        self.EquipAddSkillCnt, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ExpireTime, pos = CommFunc.ReadWORD(buf, pos)
+        self.BaseAtkPlus, pos = CommFunc.ReadDWORD(buf, pos)
+        self.BaseDefPlus, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AddSkillData, pos = CommFunc.ReadString(buf, pos, 300)
+        self.BaseHP, pos = CommFunc.ReadDWORD(buf, pos)
+        self.BaseMagicDef, pos = CommFunc.ReadDWORD(buf, pos)
+        self.EquipMinAtkValue, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Proficiency, pos = CommFunc.ReadDWORD(buf, pos)
+        self.RelMaxAddSkillCnt, pos = CommFunc.ReadBYTE(buf, pos)
+        self.FamilyActiveValue, pos = CommFunc.ReadDWORD(buf, pos)
+        self.UserDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.ExpiationIndex)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.AccID)
+        buf = CommFunc.WriteDouble(buf, self.ExpiationTime)
+        buf = CommFunc.WriteDouble(buf, self.ReceiveDate)
+        buf = CommFunc.WriteDWORD(buf, self.Gold)
+        buf = CommFunc.WriteDWORD(buf, self.GoldPaper)
+        buf = CommFunc.WriteDWORD(buf, self.Silver)
+        buf = CommFunc.WriteDWORD(buf, self.SilverPaper)
+        buf = CommFunc.WriteDWORD(buf, self.ItemTypeID)
+        buf = CommFunc.WriteWORD(buf, self.Count)
+        buf = CommFunc.WriteBYTE(buf, self.IsLocked)
+        buf = CommFunc.WriteBYTE(buf, self.ItemPlaceType)
+        buf = CommFunc.WriteWORD(buf, self.ItemPlaceIndex)
+        buf = CommFunc.WriteBYTE(buf, self.IsBind)
+        buf = CommFunc.WriteBYTE(buf, self.ItemStarLV)
+        buf = CommFunc.WriteBYTE(buf, self.IdentifyPar)
+        buf = CommFunc.WriteDWORD(buf, self.CurDurg)
+        buf = CommFunc.WriteDWORD(buf, self.MaxDurg)
+        buf = CommFunc.WriteBYTE(buf, self.CanPlaceStoneCount)
+        buf = CommFunc.WriteBYTE(buf, self.ItemProperty)
+        buf = CommFunc.WriteWORD(buf, self.SoulProperty)
+        buf = CommFunc.WriteDWORD(buf, self.Maker)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.MakerName)
+        buf = CommFunc.WriteDWORD(buf, self.Stone1)
+        buf = CommFunc.WriteDWORD(buf, self.Stone2)
+        buf = CommFunc.WriteDWORD(buf, self.Stone3)
+        buf = CommFunc.WriteDWORD(buf, self.Stone4)
+        buf = CommFunc.WriteDWORD(buf, self.Stone5)
+        buf = CommFunc.WriteDWORD(buf, self.Stone6)
+        buf = CommFunc.WriteDWORD(buf, self.Stone7)
+        buf = CommFunc.WriteDWORD(buf, self.Stone8)
+        buf = CommFunc.WriteDWORD(buf, self.Stone9)
+        buf = CommFunc.WriteWORD(buf, self.RemainHour)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.CreateTime)
+        buf = CommFunc.WriteBYTE(buf, self.ElementEffect)
+        buf = CommFunc.WriteBYTE(buf, self.IsSuite)
+        buf = CommFunc.WriteBYTE(buf, self.FitLV)
+        buf = CommFunc.WriteBYTE(buf, self.EquipAddSkillCnt)
+        buf = CommFunc.WriteWORD(buf, self.ExpireTime)
+        buf = CommFunc.WriteDWORD(buf, self.BaseAtkPlus)
+        buf = CommFunc.WriteDWORD(buf, self.BaseDefPlus)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 300, self.AddSkillData)
+        buf = CommFunc.WriteDWORD(buf, self.BaseHP)
+        buf = CommFunc.WriteDWORD(buf, self.BaseMagicDef)
+        buf = CommFunc.WriteDWORD(buf, self.EquipMinAtkValue)
+        buf = CommFunc.WriteDWORD(buf, self.Proficiency)
+        buf = CommFunc.WriteBYTE(buf, self.RelMaxAddSkillCnt)
+        buf = CommFunc.WriteDWORD(buf, self.FamilyActiveValue)
+        buf = CommFunc.WriteDWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 300
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += self.UserDataLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ExpiationIndex'] = self.ExpiationIndex
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'ExpiationTime'] = self.ExpiationTime
+        rec[u'ReceiveDate'] = self.ReceiveDate
+        rec[u'Gold'] = self.Gold
+        rec[u'GoldPaper'] = self.GoldPaper
+        rec[u'Silver'] = self.Silver
+        rec[u'SilverPaper'] = self.SilverPaper
+        rec[u'ItemTypeID'] = self.ItemTypeID
+        rec[u'Count'] = self.Count
+        rec[u'IsLocked'] = self.IsLocked
+        rec[u'ItemPlaceType'] = self.ItemPlaceType
+        rec[u'ItemPlaceIndex'] = self.ItemPlaceIndex
+        rec[u'IsBind'] = self.IsBind
+        rec[u'ItemStarLV'] = self.ItemStarLV
+        rec[u'IdentifyPar'] = self.IdentifyPar
+        rec[u'CurDurg'] = self.CurDurg
+        rec[u'MaxDurg'] = self.MaxDurg
+        rec[u'CanPlaceStoneCount'] = self.CanPlaceStoneCount
+        rec[u'ItemProperty'] = self.ItemProperty
+        rec[u'SoulProperty'] = self.SoulProperty
+        rec[u'Maker'] = self.Maker
+        rec[u'MakerName'] = fix_incomingText(self.MakerName)
+        rec[u'Stone1'] = self.Stone1
+        rec[u'Stone2'] = self.Stone2
+        rec[u'Stone3'] = self.Stone3
+        rec[u'Stone4'] = self.Stone4
+        rec[u'Stone5'] = self.Stone5
+        rec[u'Stone6'] = self.Stone6
+        rec[u'Stone7'] = self.Stone7
+        rec[u'Stone8'] = self.Stone8
+        rec[u'Stone9'] = self.Stone9
+        rec[u'RemainHour'] = self.RemainHour
+        rec[u'CreateTime'] = fix_incomingText(self.CreateTime)
+        rec[u'ElementEffect'] = self.ElementEffect
+        rec[u'IsSuite'] = self.IsSuite
+        rec[u'FitLV'] = self.FitLV
+        rec[u'EquipAddSkillCnt'] = self.EquipAddSkillCnt
+        rec[u'ExpireTime'] = self.ExpireTime
+        rec[u'BaseAtkPlus'] = self.BaseAtkPlus
+        rec[u'BaseDefPlus'] = self.BaseDefPlus
+        rec[u'AddSkillData'] = fix_incomingText(self.AddSkillData)
+        rec[u'BaseHP'] = self.BaseHP
+        rec[u'BaseMagicDef'] = self.BaseMagicDef
+        rec[u'EquipMinAtkValue'] = self.EquipMinAtkValue
+        rec[u'Proficiency'] = self.Proficiency
+        rec[u'RelMaxAddSkillCnt'] = self.RelMaxAddSkillCnt
+        rec[u'FamilyActiveValue'] = self.FamilyActiveValue
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ExpiationIndex = rec.get(u'ExpiationIndex', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.ExpiationTime = rec.get(u'ExpiationTime', 0)
+        self.ReceiveDate = rec.get(u'ReceiveDate', 0)
+        self.Gold = rec.get(u'Gold', 0)
+        self.GoldPaper = rec.get(u'GoldPaper', 0)
+        self.Silver = rec.get(u'Silver', 0)
+        self.SilverPaper = rec.get(u'SilverPaper', 0)
+        self.ItemTypeID = rec.get(u'ItemTypeID', 0)
+        self.Count = rec.get(u'Count', 0)
+        self.IsLocked = rec.get(u'IsLocked', 0)
+        self.ItemPlaceType = rec.get(u'ItemPlaceType', 0)
+        self.ItemPlaceIndex = rec.get(u'ItemPlaceIndex', 0)
+        self.IsBind = rec.get(u'IsBind', 0)
+        self.ItemStarLV = rec.get(u'ItemStarLV', 0)
+        self.IdentifyPar = rec.get(u'IdentifyPar', 0)
+        self.CurDurg = rec.get(u'CurDurg', 0)
+        self.MaxDurg = rec.get(u'MaxDurg', 0)
+        self.CanPlaceStoneCount = rec.get(u'CanPlaceStoneCount', 0)
+        self.ItemProperty = rec.get(u'ItemProperty', 0)
+        self.SoulProperty = rec.get(u'SoulProperty', 0)
+        self.Maker = rec.get(u'Maker', 0)
+        self.MakerName = fix_outgoingText(rec.get(u'MakerName', u''))
+        self.Stone1 = rec.get(u'Stone1', 0)
+        self.Stone2 = rec.get(u'Stone2', 0)
+        self.Stone3 = rec.get(u'Stone3', 0)
+        self.Stone4 = rec.get(u'Stone4', 0)
+        self.Stone5 = rec.get(u'Stone5', 0)
+        self.Stone6 = rec.get(u'Stone6', 0)
+        self.Stone7 = rec.get(u'Stone7', 0)
+        self.Stone8 = rec.get(u'Stone8', 0)
+        self.Stone9 = rec.get(u'Stone9', 0)
+        self.RemainHour = rec.get(u'RemainHour', 0)
+        self.CreateTime = fix_outgoingText(rec.get(u'CreateTime', u''))
+        self.ElementEffect = rec.get(u'ElementEffect', 0)
+        self.IsSuite = rec.get(u'IsSuite', 0)
+        self.FitLV = rec.get(u'FitLV', 0)
+        self.EquipAddSkillCnt = rec.get(u'EquipAddSkillCnt', 0)
+        self.ExpireTime = rec.get(u'ExpireTime', 0)
+        self.BaseAtkPlus = rec.get(u'BaseAtkPlus', 0)
+        self.BaseDefPlus = rec.get(u'BaseDefPlus', 0)
+        self.AddSkillData = fix_outgoingText(rec.get(u'AddSkillData', u''))
+        self.BaseHP = rec.get(u'BaseHP', 0)
+        self.BaseMagicDef = rec.get(u'BaseMagicDef', 0)
+        self.EquipMinAtkValue = rec.get(u'EquipMinAtkValue', 0)
+        self.Proficiency = rec.get(u'Proficiency', 0)
+        self.RelMaxAddSkillCnt = rec.get(u'RelMaxAddSkillCnt', 0)
+        self.FamilyActiveValue = rec.get(u'FamilyActiveValue', 0)
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'ExpiationIndex':self.ExpiationIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'ExpiationIndex':self.ExpiationIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'ExpiationIndex':self.ExpiationIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//金钱补偿日志#tagExpiationLog:
+            ExpiationIndex = %s,
+            AccID = %s,
+            ExpiationTime = %s,
+            ReceiveDate = %s,
+            Gold = %s,
+            GoldPaper = %s,
+            Silver = %s,
+            SilverPaper = %s,
+            ItemTypeID = %s,
+            Count = %s,
+            IsLocked = %s,
+            ItemPlaceType = %s,
+            ItemPlaceIndex = %s,
+            IsBind = %s,
+            ItemStarLV = %s,
+            IdentifyPar = %s,
+            CurDurg = %s,
+            MaxDurg = %s,
+            CanPlaceStoneCount = %s,
+            ItemProperty = %s,
+            SoulProperty = %s,
+            Maker = %s,
+            MakerName = %s,
+            Stone1 = %s,
+            Stone2 = %s,
+            Stone3 = %s,
+            Stone4 = %s,
+            Stone5 = %s,
+            Stone6 = %s,
+            Stone7 = %s,
+            Stone8 = %s,
+            Stone9 = %s,
+            RemainHour = %s,
+            CreateTime = %s,
+            ElementEffect = %s,
+            IsSuite = %s,
+            FitLV = %s,
+            EquipAddSkillCnt = %s,
+            ExpireTime = %s,
+            BaseAtkPlus = %s,
+            BaseDefPlus = %s,
+            AddSkillData = %s,
+            BaseHP = %s,
+            BaseMagicDef = %s,
+            EquipMinAtkValue = %s,
+            Proficiency = %s,
+            RelMaxAddSkillCnt = %s,
+            FamilyActiveValue = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            ADOResult = %s,
+            '''%(
+                self.ExpiationIndex,
+                self.AccID,
+                self.ExpiationTime,
+                self.ReceiveDate,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.ItemTypeID,
+                self.Count,
+                self.IsLocked,
+                self.ItemPlaceType,
+                self.ItemPlaceIndex,
+                self.IsBind,
+                self.ItemStarLV,
+                self.IdentifyPar,
+                self.CurDurg,
+                self.MaxDurg,
+                self.CanPlaceStoneCount,
+                self.ItemProperty,
+                self.SoulProperty,
+                self.Maker,
+                self.MakerName,
+                self.Stone1,
+                self.Stone2,
+                self.Stone3,
+                self.Stone4,
+                self.Stone5,
+                self.Stone6,
+                self.Stone7,
+                self.Stone8,
+                self.Stone9,
+                self.RemainHour,
+                self.CreateTime,
+                self.ElementEffect,
+                self.IsSuite,
+                self.FitLV,
+                self.EquipAddSkillCnt,
+                self.ExpireTime,
+                self.BaseAtkPlus,
+                self.BaseDefPlus,
+                self.AddSkillData,
+                self.BaseHP,
+                self.BaseMagicDef,
+                self.EquipMinAtkValue,
+                self.Proficiency,
+                self.RelMaxAddSkillCnt,
+                self.FamilyActiveValue,
+                self.UserDataLen,
+                self.UserData,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.ExpiationIndex,
+                self.AccID,
+                self.ExpiationTime,
+                self.ReceiveDate,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.ItemTypeID,
+                self.Count,
+                self.IsLocked,
+                self.ItemPlaceType,
+                self.ItemPlaceIndex,
+                self.IsBind,
+                self.ItemStarLV,
+                self.IdentifyPar,
+                self.CurDurg,
+                self.MaxDurg,
+                self.CanPlaceStoneCount,
+                self.ItemProperty,
+                self.SoulProperty,
+                self.Maker,
+                self.MakerName,
+                self.Stone1,
+                self.Stone2,
+                self.Stone3,
+                self.Stone4,
+                self.Stone5,
+                self.Stone6,
+                self.Stone7,
+                self.Stone8,
+                self.Stone9,
+                self.RemainHour,
+                self.CreateTime,
+                self.ElementEffect,
+                self.IsSuite,
+                self.FitLV,
+                self.EquipAddSkillCnt,
+                self.ExpireTime,
+                self.BaseAtkPlus,
+                self.BaseDefPlus,
+                self.AddSkillData,
+                self.BaseHP,
+                self.BaseMagicDef,
+                self.EquipMinAtkValue,
+                self.Proficiency,
+                self.RelMaxAddSkillCnt,
+                self.FamilyActiveValue,
+                self.UserDataLen,
+                self.UserData,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetMakerName(self,Str):
+        if len(Str)<=33:
+            self.MakerName = Str
+        else:
+            self.MakerName = Str[:33]
+            
+    def SetCreateTime(self,Str):
+        if len(Str)<=30:
+            self.CreateTime = Str
+        else:
+            self.CreateTime = Str[:30]
+            
+    def SetAddSkillData(self,Str):
+        if len(Str)<=300:
+            self.AddSkillData = Str
+        else:
+            self.AddSkillData = Str[:300]
+            
+#宠物补偿日志#tagPetExpiationLog
+class tagPetExpiationLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ExpiationIndex', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('ExpiationTime', ctypes.c_double),
+        ('ReceiveDate', ctypes.c_double),
+        ('NPCID', ctypes.c_ulong),
+        ('Lv', ctypes.c_ushort),
+        ('Exp', ctypes.c_ulong),
+        ('BindType', ctypes.c_ubyte),
+        ('UseCreatorDrugCnt', ctypes.c_ubyte),
+        ('Friendliness', ctypes.c_ushort),
+        ('SkillIDList', ctypes.c_char * 300),
+        ('HPTalent', ctypes.c_ushort),
+        ('PhysicAtkTalent', ctypes.c_ushort),
+        ('MagicAtkTalent', ctypes.c_ushort),
+        ('PhysicDefTalent', ctypes.c_ushort),
+        ('MagicDefTalent', ctypes.c_ushort),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagPetExpiationLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ExpiationIndex'] = self.ExpiationIndex
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'ExpiationTime'] = self.ExpiationTime
+        rec[u'ReceiveDate'] = self.ReceiveDate
+        rec[u'NPCID'] = self.NPCID
+        rec[u'Lv'] = self.Lv
+        rec[u'Exp'] = self.Exp
+        rec[u'BindType'] = self.BindType
+        rec[u'UseCreatorDrugCnt'] = self.UseCreatorDrugCnt
+        rec[u'Friendliness'] = self.Friendliness
+        rec[u'SkillIDList'] = fix_incomingText(self.SkillIDList)
+        rec[u'HPTalent'] = self.HPTalent
+        rec[u'PhysicAtkTalent'] = self.PhysicAtkTalent
+        rec[u'MagicAtkTalent'] = self.MagicAtkTalent
+        rec[u'PhysicDefTalent'] = self.PhysicDefTalent
+        rec[u'MagicDefTalent'] = self.MagicDefTalent
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ExpiationIndex = rec.get(u'ExpiationIndex', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.ExpiationTime = rec.get(u'ExpiationTime', 0)
+        self.ReceiveDate = rec.get(u'ReceiveDate', 0)
+        self.NPCID = rec.get(u'NPCID', 0)
+        self.Lv = rec.get(u'Lv', 0)
+        self.Exp = rec.get(u'Exp', 0)
+        self.BindType = rec.get(u'BindType', 0)
+        self.UseCreatorDrugCnt = rec.get(u'UseCreatorDrugCnt', 0)
+        self.Friendliness = rec.get(u'Friendliness', 0)
+        self.SkillIDList = fix_outgoingText(rec.get(u'SkillIDList', u''))
+        self.HPTalent = rec.get(u'HPTalent', 0)
+        self.PhysicAtkTalent = rec.get(u'PhysicAtkTalent', 0)
+        self.MagicAtkTalent = rec.get(u'MagicAtkTalent', 0)
+        self.PhysicDefTalent = rec.get(u'PhysicDefTalent', 0)
+        self.MagicDefTalent = rec.get(u'MagicDefTalent', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'ExpiationIndex':self.ExpiationIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'ExpiationIndex':self.ExpiationIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'ExpiationIndex':self.ExpiationIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//宠物补偿日志#tagPetExpiationLog:
+            ExpiationIndex = %s,
+            AccID = %s,
+            ExpiationTime = %s,
+            ReceiveDate = %s,
+            NPCID = %s,
+            Lv = %s,
+            Exp = %s,
+            BindType = %s,
+            UseCreatorDrugCnt = %s,
+            Friendliness = %s,
+            SkillIDList = %s,
+            HPTalent = %s,
+            PhysicAtkTalent = %s,
+            MagicAtkTalent = %s,
+            PhysicDefTalent = %s,
+            MagicDefTalent = %s,
+            ADOResult = %s,
+            '''%(
+                self.ExpiationIndex,
+                self.AccID,
+                self.ExpiationTime,
+                self.ReceiveDate,
+                self.NPCID,
+                self.Lv,
+                self.Exp,
+                self.BindType,
+                self.UseCreatorDrugCnt,
+                self.Friendliness,
+                self.SkillIDList,
+                self.HPTalent,
+                self.PhysicAtkTalent,
+                self.MagicAtkTalent,
+                self.PhysicDefTalent,
+                self.MagicDefTalent,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.ExpiationIndex,
+                self.AccID,
+                self.ExpiationTime,
+                self.ReceiveDate,
+                self.NPCID,
+                self.Lv,
+                self.Exp,
+                self.BindType,
+                self.UseCreatorDrugCnt,
+                self.Friendliness,
+                self.SkillIDList,
+                self.HPTalent,
+                self.PhysicAtkTalent,
+                self.MagicAtkTalent,
+                self.PhysicDefTalent,
+                self.MagicDefTalent,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetSkillIDList(self,Str):
+        if len(Str)<=300:
+            self.SkillIDList = Str
+        else:
+            self.SkillIDList = Str[:300]
+            
+
+#聊天追踪#tagDBTalkTraceLog
+class tagDBTalkTraceLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('LogIndex', ctypes.c_ulong),
+        ('TalkTime', ctypes.c_double),
+        ('TalkType', ctypes.c_char * 5),
+        ('PlayerID', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('PlayerName', ctypes.c_char * 33),
+        ('ToPlayerID', ctypes.c_ulong),
+        ('ToAccID', ctypes.c_char * 65),
+        ('ToPlayerName', ctypes.c_char * 33),
+        ('TalkLen', ctypes.c_ushort),
+        ('Talk', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.LogIndex = 0
+        self.TalkTime = 0.0
+        self.TalkType = ''
+        self.PlayerID = 0
+        self.AccID = ''
+        self.PlayerName = ''
+        self.ToPlayerID = 0
+        self.ToAccID = ''
+        self.ToPlayerName = ''
+        self.TalkLen = 0
+        self.Talk = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.LogIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.TalkTime, pos = CommFunc.ReadDouble(buf, pos)
+        self.TalkType, pos = CommFunc.ReadString(buf, pos, 5)
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AccID, pos = CommFunc.ReadString(buf, pos, 65)
+        self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.ToPlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ToAccID, pos = CommFunc.ReadString(buf, pos, 65)
+        self.ToPlayerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.TalkLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.TalkLen)
+        self.Talk = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.LogIndex)
+        buf = CommFunc.WriteDouble(buf, self.TalkTime)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 5, self.TalkType)
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.AccID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.PlayerName)
+        buf = CommFunc.WriteDWORD(buf, self.ToPlayerID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.ToAccID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.ToPlayerName)
+        buf = CommFunc.WriteWORD(buf, self.TalkLen)
+        buf = CommFunc.WriteString(buf, self.TalkLen, self.Talk)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_char) * 5
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ushort)
+        length += self.TalkLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'LogIndex'] = self.LogIndex
+        rec[u'TalkTime'] = self.TalkTime
+        rec[u'TalkType'] = fix_incomingText(self.TalkType)
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'ToPlayerID'] = self.ToPlayerID
+        rec[u'ToAccID'] = fix_incomingText(self.ToAccID)
+        rec[u'ToPlayerName'] = fix_incomingText(self.ToPlayerName)
+        rec[u'TalkLen'] = self.TalkLen
+        rec[u'Talk'] = fix_incomingText(self.Talk)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.LogIndex = rec.get(u'LogIndex', 0)
+        self.TalkTime = rec.get(u'TalkTime', 0)
+        self.TalkType = fix_outgoingText(rec.get(u'TalkType', u''))
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.ToPlayerID = rec.get(u'ToPlayerID', 0)
+        self.ToAccID = fix_outgoingText(rec.get(u'ToAccID', u''))
+        self.ToPlayerName = fix_outgoingText(rec.get(u'ToPlayerName', u''))
+        self.TalkLen = rec.get(u'TalkLen', 0)
+        self.Talk = fix_outgoingText(rec.get(u'Talk', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'LogIndex':self.LogIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'LogIndex':self.LogIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:LogIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.LogIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.LogIndex = %s, error = %s, trycnt = %d'%(self.LogIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//聊天追踪#tagDBTalkTraceLog:
+            LogIndex = %s,
+            TalkTime = %s,
+            TalkType = %s,
+            PlayerID = %s,
+            AccID = %s,
+            PlayerName = %s,
+            ToPlayerID = %s,
+            ToAccID = %s,
+            ToPlayerName = %s,
+            TalkLen = %s,
+            Talk = %s,
+            ADOResult = %s,
+            '''%(
+                self.LogIndex,
+                self.TalkTime,
+                self.TalkType,
+                self.PlayerID,
+                self.AccID,
+                self.PlayerName,
+                self.ToPlayerID,
+                self.ToAccID,
+                self.ToPlayerName,
+                self.TalkLen,
+                self.Talk,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.LogIndex,
+                self.TalkTime,
+                self.TalkType,
+                self.PlayerID,
+                self.AccID,
+                self.PlayerName,
+                self.ToPlayerID,
+                self.ToAccID,
+                self.ToPlayerName,
+                self.TalkLen,
+                self.Talk,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetTalkType(self,Str):
+        if len(Str)<=5:
+            self.TalkType = Str
+        else:
+            self.TalkType = Str[:5]
+            
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+    def SetToAccID(self,Str):
+        if len(Str)<=65:
+            self.ToAccID = Str
+        else:
+            self.ToAccID = Str[:65]
+            
+    def SetToPlayerName(self,Str):
+        if len(Str)<=33:
+            self.ToPlayerName = Str
+        else:
+            self.ToPlayerName = Str[:33]
\ No newline at end of file
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py"
new file mode 100644
index 0000000..4ee595f
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/DataServerPlayerData.py"
@@ -0,0 +1,21288 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+#-------------------------------------------------------------------------------
+#
+
+#-------------------------------------------------------------------------------
+#玩家数据存取
+#使用ProtocolStudio CodeMaker MongoDBUserData.py或MongoDBUserDataSID.py生成
+
+#修改有SID的表时,需要同步修改 CollectionVesionNO中的SID表版本号
+#-------------------------------------------------------------------------------
+
+import pymongo
+import binascii
+import CollectionVesionNO
+from Common import (CommFunc, mylog)
+import ctypes
+from ctypes import (c_ushort, c_int, c_ubyte, c_char, c_ulong, Structure, memset,
+                    memmove, sizeof, addressof, create_string_buffer, string_at)
+from MangoDBCommon import( fix_outgoingText, fix_incomingText, fix_incoming, fix_outgoing,
+                          addSIDErrorCnt, getSIDErrorCnt, makeSID, checkSID, addADOExceptionCount )
+from DBCommon import error
+
+import inspect
+DBConfig = __import__('Config.DBConfig')
+
+#玩家详细信息#tagDBPlayer
+class tagDBPlayer(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('PlayerName', ctypes.c_char * 33),
+        ('AccState', ctypes.c_ubyte),
+        ('IsDeleted', ctypes.c_ubyte),
+        ('GMLevel', ctypes.c_ubyte),
+        ('Sex', ctypes.c_int),
+        ('Hair', ctypes.c_int),
+        ('HairColor', ctypes.c_int),
+        ('Face', ctypes.c_int),
+        ('FacePic', ctypes.c_int),
+        ('Job', ctypes.c_int),
+        ('ReincarnationLv', ctypes.c_ushort),
+        ('LV', ctypes.c_int),
+        ('TotalExp', ctypes.c_ulong),
+        ('FamilyID', ctypes.c_ulong),
+        ('FamilyName', ctypes.c_char * 33),
+        ('Country', ctypes.c_int),
+        ('TeamHornor', ctypes.c_ulong),
+        ('FamilyHornor', ctypes.c_ulong),
+        ('FamilyActiveValue', ctypes.c_ulong),
+        ('LastWeekFamilyActiveValue', ctypes.c_ulong),
+        ('CountryHornor', ctypes.c_ulong),
+        ('CountryLastWeekHornor', ctypes.c_ulong),
+        ('Mate', ctypes.c_ulong),
+        ('Gold', ctypes.c_ulong),
+        ('GoldPaper', ctypes.c_ulong),
+        ('Silver', ctypes.c_ulong),
+        ('SilverPaper', ctypes.c_ulong),
+        ('FightPoint', ctypes.c_ulong),
+        ('HappyPoint', ctypes.c_ulong),
+        ('MapID', ctypes.c_ulong),
+        ('DataMapID', ctypes.c_ulong),
+        ('CopyMapID', ctypes.c_ulong),
+        ('PosX', ctypes.c_ushort),
+        ('PosY', ctypes.c_ushort),
+        ('FromMapID', ctypes.c_ulong),
+        ('FromCopyMapID', ctypes.c_ulong),
+        ('FromPosX', ctypes.c_ushort),
+        ('FromPosY', ctypes.c_ushort),
+        ('State', ctypes.c_int),
+        ('HP', ctypes.c_ulong),
+        ('MP', ctypes.c_ulong),
+        ('XP', ctypes.c_ulong),
+        ('HPRestoreSetting', ctypes.c_ushort),
+        ('MPRestoreSetting', ctypes.c_ushort),
+        ('FreePoint', ctypes.c_ulong),
+        ('FreeSkillPoint', ctypes.c_ulong),
+        ('STR', ctypes.c_int),
+        ('PNE', ctypes.c_int),
+        ('PHY', ctypes.c_int),
+        ('CON', ctypes.c_int),
+        ('TotalSTR', ctypes.c_int),
+        ('TotalPNE', ctypes.c_int),
+        ('TotalPHY', ctypes.c_int),
+        ('TotalCON', ctypes.c_int),
+        ('Setting', ctypes.c_char * 100),
+        ('PKValue', ctypes.c_ushort),
+        ('FightPower', ctypes.c_ulong),
+        ('ActiveValue', ctypes.c_ushort),
+        ('PlayerType', ctypes.c_ubyte),
+        ('BackpackLV', ctypes.c_ubyte),
+        ('WarehouseLV', ctypes.c_ubyte),
+        ('HaveWarehousePsw', ctypes.c_ubyte),
+        ('WarehousePsw', ctypes.c_char * 15),
+        ('WarehouseLocked', ctypes.c_ubyte),
+        ('WarehouseGold', ctypes.c_ulong),
+        ('WarehouseSilver', ctypes.c_ulong),
+        ('TeamID', ctypes.c_ulong),
+        ('UseGoldType', ctypes.c_ubyte),
+        ('UseSilverType', ctypes.c_ubyte),
+        ('AttackMode', ctypes.c_ubyte),
+        ('RebornMapID', ctypes.c_ushort),
+        ('RebornPosX', ctypes.c_ushort),
+        ('RebornPosY', ctypes.c_ushort),
+        ('WeekOnlineTime', ctypes.c_ulong),
+        ('LastWeekOnlineTime', ctypes.c_ulong),
+        ('LogoffTime', ctypes.c_char * 30),
+        ('IsHideMask', ctypes.c_ubyte),
+        ('DayProcessGameEventCount', ctypes.c_ulong),
+        ('LoginIP', ctypes.c_char * 20),
+        ('LoginTime', ctypes.c_char * 30),
+        ('OnlineTime', ctypes.c_ulong),
+        ('FriendFavor', ctypes.c_ulong),
+        ('TeamPrivity', ctypes.c_ulong),
+        ('OfflineMinutes', ctypes.c_ulong),
+        ('Energy', ctypes.c_ulong),
+        ('ReceivedSalary', ctypes.c_ulong),
+        ('EquipShowSwitch', ctypes.c_ulong),
+        ('LuckValue', ctypes.c_ushort),
+        ('ExAttr1', ctypes.c_ulong),
+        ('ExAttr2', ctypes.c_ulong),
+        ('ExAttr3', ctypes.c_ulong),
+        ('ExAttr4', ctypes.c_ulong),
+        ('ExAttr5', ctypes.c_ulong),
+        ('Faction', ctypes.c_int),
+        ('InfamyValue', ctypes.c_ulong),
+        ('OfficialRank', ctypes.c_ubyte),
+        ('IsFindByLabel', ctypes.c_ubyte),
+        ('IsCloseFriendLabel', ctypes.c_ubyte),
+        ('ChangeCoinPointTotal', ctypes.c_ulong),
+        ('VIPLv', ctypes.c_ubyte),
+        ('VIPLvForPhone', ctypes.c_ubyte),
+        ('PhoneVIPStartTime', ctypes.c_double),
+        ('PhoneVIPEndTime', ctypes.c_double),
+        ('VsRoomId', ctypes.c_ulong),
+        ('ExAttr6', ctypes.c_ulong),
+        ('ExAttr7', ctypes.c_ulong),
+        ('ExAttr8', ctypes.c_ulong),
+        ('ExAttr9', ctypes.c_ulong),
+        ('ExAttr10', ctypes.c_ulong),
+        ('ModelMark', ctypes.c_ulong),
+        ('FromDataMapID', ctypes.c_ulong),
+        ('LastOrderId', ctypes.c_char * 40),
+        ('PrizeCoin', ctypes.c_ulong),
+        ('ExAttr11', ctypes.c_ulong),
+        ('ExAttr12', ctypes.c_ulong),
+        ('ExAttr13', ctypes.c_ulong),
+        ('ExAttr14', ctypes.c_ulong),
+        ('CreateRoleTime', ctypes.c_char * 30),
+        ('LVEx', ctypes.c_ushort),
+        ('LV2', ctypes.c_ushort),
+        ('ExpPoint', ctypes.c_ulong),
+        ('OperateInfo', ctypes.c_ulong),
+        ('Operate', ctypes.c_char * 15),
+        ('ServerID', ctypes.c_ulong),
+        ('ExAttr15', ctypes.c_ulong),
+        ('ExAttr16', ctypes.c_ulong),
+        ('ExAttr17', ctypes.c_ulong),
+        ('ExAttr18', ctypes.c_ulong),
+        ('ExAttr19', ctypes.c_ulong),
+        ('ExAttr20', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+        ('SID', ctypes.c_int),    #用于校验
+        ('VerNO', ctypes.c_ulong)   #用于SID校验时比较版本号
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayer)
+
+
+    def getSID(self):
+        return self.SID
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'AccState'] = self.AccState
+        rec[u'IsDeleted'] = self.IsDeleted
+        rec[u'GMLevel'] = self.GMLevel
+        rec[u'Sex'] = self.Sex
+        rec[u'Hair'] = self.Hair
+        rec[u'HairColor'] = self.HairColor
+        rec[u'Face'] = self.Face
+        rec[u'FacePic'] = self.FacePic
+        rec[u'Job'] = self.Job
+        rec[u'ReincarnationLv'] = self.ReincarnationLv
+        rec[u'LV'] = self.LV
+        rec[u'TotalExp'] = self.TotalExp
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'FamilyName'] = fix_incomingText(self.FamilyName)
+        rec[u'Country'] = self.Country
+        rec[u'TeamHornor'] = self.TeamHornor
+        rec[u'FamilyHornor'] = self.FamilyHornor
+        rec[u'FamilyActiveValue'] = self.FamilyActiveValue
+        rec[u'LastWeekFamilyActiveValue'] = self.LastWeekFamilyActiveValue
+        rec[u'CountryHornor'] = self.CountryHornor
+        rec[u'CountryLastWeekHornor'] = self.CountryLastWeekHornor
+        rec[u'Mate'] = self.Mate
+        rec[u'Gold'] = self.Gold
+        rec[u'GoldPaper'] = self.GoldPaper
+        rec[u'Silver'] = self.Silver
+        rec[u'SilverPaper'] = self.SilverPaper
+        rec[u'FightPoint'] = self.FightPoint
+        rec[u'HappyPoint'] = self.HappyPoint
+        rec[u'MapID'] = self.MapID
+        rec[u'DataMapID'] = self.DataMapID
+        rec[u'CopyMapID'] = self.CopyMapID
+        rec[u'PosX'] = self.PosX
+        rec[u'PosY'] = self.PosY
+        rec[u'FromMapID'] = self.FromMapID
+        rec[u'FromCopyMapID'] = self.FromCopyMapID
+        rec[u'FromPosX'] = self.FromPosX
+        rec[u'FromPosY'] = self.FromPosY
+        rec[u'State'] = self.State
+        rec[u'HP'] = self.HP
+        rec[u'MP'] = self.MP
+        rec[u'XP'] = self.XP
+        rec[u'HPRestoreSetting'] = self.HPRestoreSetting
+        rec[u'MPRestoreSetting'] = self.MPRestoreSetting
+        rec[u'FreePoint'] = self.FreePoint
+        rec[u'FreeSkillPoint'] = self.FreeSkillPoint
+        rec[u'STR'] = self.STR
+        rec[u'PNE'] = self.PNE
+        rec[u'PHY'] = self.PHY
+        rec[u'CON'] = self.CON
+        rec[u'TotalSTR'] = self.TotalSTR
+        rec[u'TotalPNE'] = self.TotalPNE
+        rec[u'TotalPHY'] = self.TotalPHY
+        rec[u'TotalCON'] = self.TotalCON
+        rec[u'Setting'] = fix_incomingText(self.Setting)
+        rec[u'PKValue'] = self.PKValue
+        rec[u'FightPower'] = self.FightPower
+        rec[u'ActiveValue'] = self.ActiveValue
+        rec[u'PlayerType'] = self.PlayerType
+        rec[u'BackpackLV'] = self.BackpackLV
+        rec[u'WarehouseLV'] = self.WarehouseLV
+        rec[u'HaveWarehousePsw'] = self.HaveWarehousePsw
+        rec[u'WarehousePsw'] = fix_incomingText(self.WarehousePsw)
+        rec[u'WarehouseLocked'] = self.WarehouseLocked
+        rec[u'WarehouseGold'] = self.WarehouseGold
+        rec[u'WarehouseSilver'] = self.WarehouseSilver
+        rec[u'TeamID'] = self.TeamID
+        rec[u'UseGoldType'] = self.UseGoldType
+        rec[u'UseSilverType'] = self.UseSilverType
+        rec[u'AttackMode'] = self.AttackMode
+        rec[u'RebornMapID'] = self.RebornMapID
+        rec[u'RebornPosX'] = self.RebornPosX
+        rec[u'RebornPosY'] = self.RebornPosY
+        rec[u'WeekOnlineTime'] = self.WeekOnlineTime
+        rec[u'LastWeekOnlineTime'] = self.LastWeekOnlineTime
+        rec[u'LogoffTime'] = fix_incomingText(self.LogoffTime)
+        rec[u'IsHideMask'] = self.IsHideMask
+        rec[u'DayProcessGameEventCount'] = self.DayProcessGameEventCount
+        rec[u'LoginIP'] = fix_incomingText(self.LoginIP)
+        rec[u'LoginTime'] = fix_incomingText(self.LoginTime)
+        rec[u'OnlineTime'] = self.OnlineTime
+        rec[u'FriendFavor'] = self.FriendFavor
+        rec[u'TeamPrivity'] = self.TeamPrivity
+        rec[u'OfflineMinutes'] = self.OfflineMinutes
+        rec[u'Energy'] = self.Energy
+        rec[u'ReceivedSalary'] = self.ReceivedSalary
+        rec[u'EquipShowSwitch'] = self.EquipShowSwitch
+        rec[u'LuckValue'] = self.LuckValue
+        rec[u'ExAttr1'] = self.ExAttr1
+        rec[u'ExAttr2'] = self.ExAttr2
+        rec[u'ExAttr3'] = self.ExAttr3
+        rec[u'ExAttr4'] = self.ExAttr4
+        rec[u'ExAttr5'] = self.ExAttr5
+        rec[u'Faction'] = self.Faction
+        rec[u'InfamyValue'] = self.InfamyValue
+        rec[u'OfficialRank'] = self.OfficialRank
+        rec[u'IsFindByLabel'] = self.IsFindByLabel
+        rec[u'IsCloseFriendLabel'] = self.IsCloseFriendLabel
+        rec[u'ChangeCoinPointTotal'] = self.ChangeCoinPointTotal
+        rec[u'VIPLv'] = self.VIPLv
+        rec[u'VIPLvForPhone'] = self.VIPLvForPhone
+        rec[u'PhoneVIPStartTime'] = self.PhoneVIPStartTime
+        rec[u'PhoneVIPEndTime'] = self.PhoneVIPEndTime
+        rec[u'VsRoomId'] = self.VsRoomId
+        rec[u'ExAttr6'] = self.ExAttr6
+        rec[u'ExAttr7'] = self.ExAttr7
+        rec[u'ExAttr8'] = self.ExAttr8
+        rec[u'ExAttr9'] = self.ExAttr9
+        rec[u'ExAttr10'] = self.ExAttr10
+        rec[u'ModelMark'] = self.ModelMark
+        rec[u'FromDataMapID'] = self.FromDataMapID
+        rec[u'LastOrderId'] = fix_incomingText(self.LastOrderId)
+        rec[u'PrizeCoin'] = self.PrizeCoin
+        rec[u'ExAttr11'] = self.ExAttr11
+        rec[u'ExAttr12'] = self.ExAttr12
+        rec[u'ExAttr13'] = self.ExAttr13
+        rec[u'ExAttr14'] = self.ExAttr14
+        rec[u'CreateRoleTime'] = fix_incomingText(self.CreateRoleTime)
+        rec[u'LVEx'] = self.LVEx
+        rec[u'LV2'] = self.LV2
+        rec[u'ExpPoint'] = self.ExpPoint
+        rec[u'OperateInfo'] = self.OperateInfo
+        rec[u'Operate'] = fix_incomingText(self.Operate)
+        rec[u'ServerID'] = self.ServerID
+        rec[u'ExAttr15'] = self.ExAttr15
+        rec[u'ExAttr16'] = self.ExAttr16
+        rec[u'ExAttr17'] = self.ExAttr17
+        rec[u'ExAttr18'] = self.ExAttr18
+        rec[u'ExAttr19'] = self.ExAttr19
+        rec[u'ExAttr20'] = self.ExAttr20
+        rec[u'SID'] = self.SID
+        rec[u'VerNO'] = self.VerNO
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.AccState = rec.get(u'AccState', 0)
+        self.IsDeleted = rec.get(u'IsDeleted', 0)
+        self.GMLevel = rec.get(u'GMLevel', 0)
+        self.Sex = rec.get(u'Sex', 0)
+        self.Hair = rec.get(u'Hair', 0)
+        self.HairColor = rec.get(u'HairColor', 0)
+        self.Face = rec.get(u'Face', 0)
+        self.FacePic = rec.get(u'FacePic', 0)
+        self.Job = rec.get(u'Job', 0)
+        self.ReincarnationLv = rec.get(u'ReincarnationLv', 0)
+        self.LV = rec.get(u'LV', 0)
+        self.TotalExp = rec.get(u'TotalExp', 0)
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.FamilyName = fix_outgoingText(rec.get(u'FamilyName', u''))
+        self.Country = rec.get(u'Country', 0)
+        self.TeamHornor = rec.get(u'TeamHornor', 0)
+        self.FamilyHornor = rec.get(u'FamilyHornor', 0)
+        self.FamilyActiveValue = rec.get(u'FamilyActiveValue', 0)
+        self.LastWeekFamilyActiveValue = rec.get(u'LastWeekFamilyActiveValue', 0)
+        self.CountryHornor = rec.get(u'CountryHornor', 0)
+        self.CountryLastWeekHornor = rec.get(u'CountryLastWeekHornor', 0)
+        self.Mate = rec.get(u'Mate', 0)
+        self.Gold = rec.get(u'Gold', 0)
+        self.GoldPaper = rec.get(u'GoldPaper', 0)
+        self.Silver = rec.get(u'Silver', 0)
+        self.SilverPaper = rec.get(u'SilverPaper', 0)
+        self.FightPoint = rec.get(u'FightPoint', 0)
+        self.HappyPoint = rec.get(u'HappyPoint', 0)
+        self.MapID = rec.get(u'MapID', 0)
+        self.DataMapID = rec.get(u'DataMapID', 0)
+        self.CopyMapID = rec.get(u'CopyMapID', 0)
+        self.PosX = rec.get(u'PosX', 0)
+        self.PosY = rec.get(u'PosY', 0)
+        self.FromMapID = rec.get(u'FromMapID', 0)
+        self.FromCopyMapID = rec.get(u'FromCopyMapID', 0)
+        self.FromPosX = rec.get(u'FromPosX', 0)
+        self.FromPosY = rec.get(u'FromPosY', 0)
+        self.State = rec.get(u'State', 0)
+        self.HP = rec.get(u'HP', 0)
+        self.MP = rec.get(u'MP', 0)
+        self.XP = rec.get(u'XP', 0)
+        self.HPRestoreSetting = rec.get(u'HPRestoreSetting', 0)
+        self.MPRestoreSetting = rec.get(u'MPRestoreSetting', 0)
+        self.FreePoint = rec.get(u'FreePoint', 0)
+        self.FreeSkillPoint = rec.get(u'FreeSkillPoint', 0)
+        self.STR = rec.get(u'STR', 0)
+        self.PNE = rec.get(u'PNE', 0)
+        self.PHY = rec.get(u'PHY', 0)
+        self.CON = rec.get(u'CON', 0)
+        self.TotalSTR = rec.get(u'TotalSTR', 0)
+        self.TotalPNE = rec.get(u'TotalPNE', 0)
+        self.TotalPHY = rec.get(u'TotalPHY', 0)
+        self.TotalCON = rec.get(u'TotalCON', 0)
+        self.Setting = fix_outgoingText(rec.get(u'Setting', u''))
+        self.PKValue = rec.get(u'PKValue', 0)
+        self.FightPower = rec.get(u'FightPower', 0)
+        self.ActiveValue = rec.get(u'ActiveValue', 0)
+        self.PlayerType = rec.get(u'PlayerType', 0)
+        self.BackpackLV = rec.get(u'BackpackLV', 0)
+        self.WarehouseLV = rec.get(u'WarehouseLV', 0)
+        self.HaveWarehousePsw = rec.get(u'HaveWarehousePsw', 0)
+        self.WarehousePsw = fix_outgoingText(rec.get(u'WarehousePsw', u''))
+        self.WarehouseLocked = rec.get(u'WarehouseLocked', 0)
+        self.WarehouseGold = rec.get(u'WarehouseGold', 0)
+        self.WarehouseSilver = rec.get(u'WarehouseSilver', 0)
+        self.TeamID = rec.get(u'TeamID', 0)
+        self.UseGoldType = rec.get(u'UseGoldType', 0)
+        self.UseSilverType = rec.get(u'UseSilverType', 0)
+        self.AttackMode = rec.get(u'AttackMode', 0)
+        self.RebornMapID = rec.get(u'RebornMapID', 0)
+        self.RebornPosX = rec.get(u'RebornPosX', 0)
+        self.RebornPosY = rec.get(u'RebornPosY', 0)
+        self.WeekOnlineTime = rec.get(u'WeekOnlineTime', 0)
+        self.LastWeekOnlineTime = rec.get(u'LastWeekOnlineTime', 0)
+        self.LogoffTime = fix_outgoingText(rec.get(u'LogoffTime', u''))
+        self.IsHideMask = rec.get(u'IsHideMask', 0)
+        self.DayProcessGameEventCount = rec.get(u'DayProcessGameEventCount', 0)
+        self.LoginIP = fix_outgoingText(rec.get(u'LoginIP', u''))
+        self.LoginTime = fix_outgoingText(rec.get(u'LoginTime', u''))
+        self.OnlineTime = rec.get(u'OnlineTime', 0)
+        self.FriendFavor = rec.get(u'FriendFavor', 0)
+        self.TeamPrivity = rec.get(u'TeamPrivity', 0)
+        self.OfflineMinutes = rec.get(u'OfflineMinutes', 0)
+        self.Energy = rec.get(u'Energy', 0)
+        self.ReceivedSalary = rec.get(u'ReceivedSalary', 0)
+        self.EquipShowSwitch = rec.get(u'EquipShowSwitch', 0)
+        self.LuckValue = rec.get(u'LuckValue', 0)
+        self.ExAttr1 = rec.get(u'ExAttr1', 0)
+        self.ExAttr2 = rec.get(u'ExAttr2', 0)
+        self.ExAttr3 = rec.get(u'ExAttr3', 0)
+        self.ExAttr4 = rec.get(u'ExAttr4', 0)
+        self.ExAttr5 = rec.get(u'ExAttr5', 0)
+        self.Faction = rec.get(u'Faction', 0)
+        self.InfamyValue = rec.get(u'InfamyValue', 0)
+        self.OfficialRank = rec.get(u'OfficialRank', 0)
+        self.IsFindByLabel = rec.get(u'IsFindByLabel', 0)
+        self.IsCloseFriendLabel = rec.get(u'IsCloseFriendLabel', 0)
+        self.ChangeCoinPointTotal = rec.get(u'ChangeCoinPointTotal', 0)
+        self.VIPLv = rec.get(u'VIPLv', 0)
+        self.VIPLvForPhone = rec.get(u'VIPLvForPhone', 0)
+        self.PhoneVIPStartTime = rec.get(u'PhoneVIPStartTime', 0)
+        self.PhoneVIPEndTime = rec.get(u'PhoneVIPEndTime', 0)
+        self.VsRoomId = rec.get(u'VsRoomId', 0)
+        self.ExAttr6 = rec.get(u'ExAttr6', 0)
+        self.ExAttr7 = rec.get(u'ExAttr7', 0)
+        self.ExAttr8 = rec.get(u'ExAttr8', 0)
+        self.ExAttr9 = rec.get(u'ExAttr9', 0)
+        self.ExAttr10 = rec.get(u'ExAttr10', 0)
+        self.ModelMark = rec.get(u'ModelMark', 0)
+        self.FromDataMapID = rec.get(u'FromDataMapID', 0)
+        self.LastOrderId = fix_outgoingText(rec.get(u'LastOrderId', u''))
+        self.PrizeCoin = rec.get(u'PrizeCoin', 0)
+        self.ExAttr11 = rec.get(u'ExAttr11', 0)
+        self.ExAttr12 = rec.get(u'ExAttr12', 0)
+        self.ExAttr13 = rec.get(u'ExAttr13', 0)
+        self.ExAttr14 = rec.get(u'ExAttr14', 0)
+        self.CreateRoleTime = fix_outgoingText(rec.get(u'CreateRoleTime', u''))
+        self.LVEx = rec.get(u'LVEx', 0)
+        self.LV2 = rec.get(u'LV2', 0)
+        self.ExpPoint = rec.get(u'ExpPoint', 0)
+        self.OperateInfo = rec.get(u'OperateInfo', 0)
+        self.Operate = fix_outgoingText(rec.get(u'Operate', u''))
+        self.ServerID = rec.get(u'ServerID', 0)
+        self.ExAttr15 = rec.get(u'ExAttr15', 0)
+        self.ExAttr16 = rec.get(u'ExAttr16', 0)
+        self.ExAttr17 = rec.get(u'ExAttr17', 0)
+        self.ExAttr18 = rec.get(u'ExAttr18', 0)
+        self.ExAttr19 = rec.get(u'ExAttr19', 0)
+        self.ExAttr20 = rec.get(u'ExAttr20', 0)
+        self.SID = rec['SID']
+        self.VerNO = rec.get(u'VerNO', 0)
+
+
+    def makeSID(self):
+        self.SID = 0
+        self.VerNO = CollectionVesionNO.tagDBPlayer_VersionNO
+        self.SID = makeSID(self.getBuffer())
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+    def adoLoadC(self, collection):
+        '''使用KEY查找,进行校验,并读取'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        saveSID = self.SID
+        self.SID = 0
+        if self.VerNO == CollectionVesionNO.tagDBPlayer_VersionNO:
+            if not checkSID(self.getBuffer(), saveSID):
+                addSIDErrorCnt()
+                mylog.warning('SID checksum error!AccID = %s'%rec['AccID'])
+
+                return False
+        #校验通过
+        return True
+
+    def adoLoadCEx(self, collection, query):
+        resultCollection = collection.find(query)
+
+        if resultCollection.count() <= 0:
+            return False
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        saveSID = self.SID
+        self.SID = 0
+        if self.VerNO == CollectionVesionNO.tagDBPlayer_VersionNO:
+            if not checkSID(self.getBuffer(), saveSID):
+                addSIDErrorCnt()
+                mylog.warning('SID checksum error!query = %s'%query)
+
+                return False
+        #校验通过
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoInsertC(self, collection):
+        self.makeSID()
+        return self.adoInsert(collection)
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PlayerID':self.PlayerID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateC(self, collection):
+        self.makeSID()
+        return self.adoUpdate(collection)
+
+
+    def adoUpdateExC(self, collection, spec):
+        self.makeSID()
+        return self.adoUpdateEx(collection, spec)
+
+
+    def adoCheckUpdateC(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsertC(collection)
+        return self.adoUpdateC(collection)
+
+
+    def adoCheckUpdateCEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsertC(collection, spec)
+        return self.adoUpdateExC(collection, spec)
+
+
+    def getAdoRecordsC(self, resultCollection):
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            #校验SID
+            self.readRecord(rec)
+            saveSID = self.SID
+            self.SID = 0
+            if self.VerNO == CollectionVesionNO.tagDBPlayer_VersionNO:
+                if not checkSID(self.getBuffer(), saveSID):
+                    addSIDErrorCnt()
+                    mylog.warning('SID error AccID = %s'%self.AccID)
+
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndexC(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecordsC(resultCollection)
+
+
+    def adoQueryCustomC(self, collection, queryDict):
+        '''自定义查找'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecordsC(resultCollection)
+        
+
+    def adoQueryAllC(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecordsC(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家详细信息#tagDBPlayer:
+            PlayerID = %s,
+            AccID = %s,
+            PlayerName = %s,
+            AccState = %s,
+            IsDeleted = %s,
+            GMLevel = %s,
+            Sex = %s,
+            Hair = %s,
+            HairColor = %s,
+            Face = %s,
+            FacePic = %s,
+            Job = %s,
+            ReincarnationLv = %s,
+            LV = %s,
+            TotalExp = %s,
+            FamilyID = %s,
+            FamilyName = %s,
+            Country = %s,
+            TeamHornor = %s,
+            FamilyHornor = %s,
+            FamilyActiveValue = %s,
+            LastWeekFamilyActiveValue = %s,
+            CountryHornor = %s,
+            CountryLastWeekHornor = %s,
+            Mate = %s,
+            Gold = %s,
+            GoldPaper = %s,
+            Silver = %s,
+            SilverPaper = %s,
+            FightPoint = %s,
+            HappyPoint = %s,
+            MapID = %s,
+            DataMapID = %s,
+            CopyMapID = %s,
+            PosX = %s,
+            PosY = %s,
+            FromMapID = %s,
+            FromCopyMapID = %s,
+            FromPosX = %s,
+            FromPosY = %s,
+            State = %s,
+            HP = %s,
+            MP = %s,
+            XP = %s,
+            HPRestoreSetting = %s,
+            MPRestoreSetting = %s,
+            FreePoint = %s,
+            FreeSkillPoint = %s,
+            STR = %s,
+            PNE = %s,
+            PHY = %s,
+            CON = %s,
+            TotalSTR = %s,
+            TotalPNE = %s,
+            TotalPHY = %s,
+            TotalCON = %s,
+            Setting = %s,
+            PKValue = %s,
+            FightPower = %s,
+            ActiveValue = %s,
+            PlayerType = %s,
+            BackpackLV = %s,
+            WarehouseLV = %s,
+            HaveWarehousePsw = %s,
+            WarehousePsw = %s,
+            WarehouseLocked = %s,
+            WarehouseGold = %s,
+            WarehouseSilver = %s,
+            TeamID = %s,
+            UseGoldType = %s,
+            UseSilverType = %s,
+            AttackMode = %s,
+            RebornMapID = %s,
+            RebornPosX = %s,
+            RebornPosY = %s,
+            WeekOnlineTime = %s,
+            LastWeekOnlineTime = %s,
+            LogoffTime = %s,
+            IsHideMask = %s,
+            DayProcessGameEventCount = %s,
+            LoginIP = %s,
+            LoginTime = %s,
+            OnlineTime = %s,
+            FriendFavor = %s,
+            TeamPrivity = %s,
+            OfflineMinutes = %s,
+            Energy = %s,
+            ReceivedSalary = %s,
+            EquipShowSwitch = %s,
+            LuckValue = %s,
+            ExAttr1 = %s,
+            ExAttr2 = %s,
+            ExAttr3 = %s,
+            ExAttr4 = %s,
+            ExAttr5 = %s,
+            Faction = %s,
+            InfamyValue = %s,
+            OfficialRank = %s,
+            IsFindByLabel = %s,
+            IsCloseFriendLabel = %s,
+            ChangeCoinPointTotal = %s,
+            VIPLv = %s,
+            VIPLvForPhone = %s,
+            PhoneVIPStartTime = %s,
+            PhoneVIPEndTime = %s,
+            VsRoomId = %s,
+            ExAttr6 = %s,
+            ExAttr7 = %s,
+            ExAttr8 = %s,
+            ExAttr9 = %s,
+            ExAttr10 = %s,
+            ModelMark = %s,
+            FromDataMapID = %s,
+            LastOrderId = %s,
+            PrizeCoin = %s,
+            ExAttr11 = %s,
+            ExAttr12 = %s,
+            ExAttr13 = %s,
+            ExAttr14 = %s,
+            CreateRoleTime = %s,
+            LVEx = %s,
+            LV2 = %s,
+            ExpPoint = %s,
+            OperateInfo = %s,
+            Operate = %s,
+            ServerID = %s,
+            ExAttr15 = %s,
+            ExAttr16 = %s,
+            ExAttr17 = %s,
+            ExAttr18 = %s,
+            ExAttr19 = %s,
+            ExAttr20 = %s,
+            ADOResult = %s,
+            SID = %s,
+            VerNO = %s,
+            '''%(
+                self.PlayerID,
+                self.AccID,
+                self.PlayerName,
+                self.AccState,
+                self.IsDeleted,
+                self.GMLevel,
+                self.Sex,
+                self.Hair,
+                self.HairColor,
+                self.Face,
+                self.FacePic,
+                self.Job,
+                self.ReincarnationLv,
+                self.LV,
+                self.TotalExp,
+                self.FamilyID,
+                self.FamilyName,
+                self.Country,
+                self.TeamHornor,
+                self.FamilyHornor,
+                self.FamilyActiveValue,
+                self.LastWeekFamilyActiveValue,
+                self.CountryHornor,
+                self.CountryLastWeekHornor,
+                self.Mate,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.FightPoint,
+                self.HappyPoint,
+                self.MapID,
+                self.DataMapID,
+                self.CopyMapID,
+                self.PosX,
+                self.PosY,
+                self.FromMapID,
+                self.FromCopyMapID,
+                self.FromPosX,
+                self.FromPosY,
+                self.State,
+                self.HP,
+                self.MP,
+                self.XP,
+                self.HPRestoreSetting,
+                self.MPRestoreSetting,
+                self.FreePoint,
+                self.FreeSkillPoint,
+                self.STR,
+                self.PNE,
+                self.PHY,
+                self.CON,
+                self.TotalSTR,
+                self.TotalPNE,
+                self.TotalPHY,
+                self.TotalCON,
+                self.Setting,
+                self.PKValue,
+                self.FightPower,
+                self.ActiveValue,
+                self.PlayerType,
+                self.BackpackLV,
+                self.WarehouseLV,
+                self.HaveWarehousePsw,
+                self.WarehousePsw,
+                self.WarehouseLocked,
+                self.WarehouseGold,
+                self.WarehouseSilver,
+                self.TeamID,
+                self.UseGoldType,
+                self.UseSilverType,
+                self.AttackMode,
+                self.RebornMapID,
+                self.RebornPosX,
+                self.RebornPosY,
+                self.WeekOnlineTime,
+                self.LastWeekOnlineTime,
+                self.LogoffTime,
+                self.IsHideMask,
+                self.DayProcessGameEventCount,
+                self.LoginIP,
+                self.LoginTime,
+                self.OnlineTime,
+                self.FriendFavor,
+                self.TeamPrivity,
+                self.OfflineMinutes,
+                self.Energy,
+                self.ReceivedSalary,
+                self.EquipShowSwitch,
+                self.LuckValue,
+                self.ExAttr1,
+                self.ExAttr2,
+                self.ExAttr3,
+                self.ExAttr4,
+                self.ExAttr5,
+                self.Faction,
+                self.InfamyValue,
+                self.OfficialRank,
+                self.IsFindByLabel,
+                self.IsCloseFriendLabel,
+                self.ChangeCoinPointTotal,
+                self.VIPLv,
+                self.VIPLvForPhone,
+                self.PhoneVIPStartTime,
+                self.PhoneVIPEndTime,
+                self.VsRoomId,
+                self.ExAttr6,
+                self.ExAttr7,
+                self.ExAttr8,
+                self.ExAttr9,
+                self.ExAttr10,
+                self.ModelMark,
+                self.FromDataMapID,
+                self.LastOrderId,
+                self.PrizeCoin,
+                self.ExAttr11,
+                self.ExAttr12,
+                self.ExAttr13,
+                self.ExAttr14,
+                self.CreateRoleTime,
+                self.LVEx,
+                self.LV2,
+                self.ExpPoint,
+                self.OperateInfo,
+                self.Operate,
+                self.ServerID,
+                self.ExAttr15,
+                self.ExAttr16,
+                self.ExAttr17,
+                self.ExAttr18,
+                self.ExAttr19,
+                self.ExAttr20,
+                self.ADOResult,
+                self.SID,
+                self.VerNO
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.AccID,
+                self.PlayerName,
+                self.AccState,
+                self.IsDeleted,
+                self.GMLevel,
+                self.Sex,
+                self.Hair,
+                self.HairColor,
+                self.Face,
+                self.FacePic,
+                self.Job,
+                self.ReincarnationLv,
+                self.LV,
+                self.TotalExp,
+                self.FamilyID,
+                self.FamilyName,
+                self.Country,
+                self.TeamHornor,
+                self.FamilyHornor,
+                self.FamilyActiveValue,
+                self.LastWeekFamilyActiveValue,
+                self.CountryHornor,
+                self.CountryLastWeekHornor,
+                self.Mate,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.FightPoint,
+                self.HappyPoint,
+                self.MapID,
+                self.DataMapID,
+                self.CopyMapID,
+                self.PosX,
+                self.PosY,
+                self.FromMapID,
+                self.FromCopyMapID,
+                self.FromPosX,
+                self.FromPosY,
+                self.State,
+                self.HP,
+                self.MP,
+                self.XP,
+                self.HPRestoreSetting,
+                self.MPRestoreSetting,
+                self.FreePoint,
+                self.FreeSkillPoint,
+                self.STR,
+                self.PNE,
+                self.PHY,
+                self.CON,
+                self.TotalSTR,
+                self.TotalPNE,
+                self.TotalPHY,
+                self.TotalCON,
+                self.Setting,
+                self.PKValue,
+                self.FightPower,
+                self.ActiveValue,
+                self.PlayerType,
+                self.BackpackLV,
+                self.WarehouseLV,
+                self.HaveWarehousePsw,
+                self.WarehousePsw,
+                self.WarehouseLocked,
+                self.WarehouseGold,
+                self.WarehouseSilver,
+                self.TeamID,
+                self.UseGoldType,
+                self.UseSilverType,
+                self.AttackMode,
+                self.RebornMapID,
+                self.RebornPosX,
+                self.RebornPosY,
+                self.WeekOnlineTime,
+                self.LastWeekOnlineTime,
+                self.LogoffTime,
+                self.IsHideMask,
+                self.DayProcessGameEventCount,
+                self.LoginIP,
+                self.LoginTime,
+                self.OnlineTime,
+                self.FriendFavor,
+                self.TeamPrivity,
+                self.OfflineMinutes,
+                self.Energy,
+                self.ReceivedSalary,
+                self.EquipShowSwitch,
+                self.LuckValue,
+                self.ExAttr1,
+                self.ExAttr2,
+                self.ExAttr3,
+                self.ExAttr4,
+                self.ExAttr5,
+                self.Faction,
+                self.InfamyValue,
+                self.OfficialRank,
+                self.IsFindByLabel,
+                self.IsCloseFriendLabel,
+                self.ChangeCoinPointTotal,
+                self.VIPLv,
+                self.VIPLvForPhone,
+                self.PhoneVIPStartTime,
+                self.PhoneVIPEndTime,
+                self.VsRoomId,
+                self.ExAttr6,
+                self.ExAttr7,
+                self.ExAttr8,
+                self.ExAttr9,
+                self.ExAttr10,
+                self.ModelMark,
+                self.FromDataMapID,
+                self.LastOrderId,
+                self.PrizeCoin,
+                self.ExAttr11,
+                self.ExAttr12,
+                self.ExAttr13,
+                self.ExAttr14,
+                self.CreateRoleTime,
+                self.LVEx,
+                self.LV2,
+                self.ExpPoint,
+                self.OperateInfo,
+                self.Operate,
+                self.ServerID,
+                self.ExAttr15,
+                self.ExAttr16,
+                self.ExAttr17,
+                self.ExAttr18,
+                self.ExAttr19,
+                self.ExAttr20,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+    def SetFamilyName(self,Str):
+        if len(Str)<=33:
+            self.FamilyName = Str
+        else:
+            self.FamilyName = Str[:33]
+            
+    def SetSetting(self,Str):
+        if len(Str)<=100:
+            self.Setting = Str
+        else:
+            self.Setting = Str[:100]
+            
+    def SetWarehousePsw(self,Str):
+        if len(Str)<=15:
+            self.WarehousePsw = Str
+        else:
+            self.WarehousePsw = Str[:15]
+            
+    def SetLogoffTime(self,Str):
+        if len(Str)<=30:
+            self.LogoffTime = Str
+        else:
+            self.LogoffTime = Str[:30]
+            
+    def SetLoginIP(self,Str):
+        if len(Str)<=20:
+            self.LoginIP = Str
+        else:
+            self.LoginIP = Str[:20]
+            
+    def SetLoginTime(self,Str):
+        if len(Str)<=30:
+            self.LoginTime = Str
+        else:
+            self.LoginTime = Str[:30]
+            
+    def SetLastOrderId(self,Str):
+        if len(Str)<=40:
+            self.LastOrderId = Str
+        else:
+            self.LastOrderId = Str[:40]
+            
+    def SetCreateRoleTime(self,Str):
+        if len(Str)<=30:
+            self.CreateRoleTime = Str
+        else:
+            self.CreateRoleTime = Str[:30]
+            
+    def SetOperate(self,Str):
+        if len(Str)<=15:
+            self.Operate = Str
+        else:
+            self.Operate = Str[:15]
+            
+
+
+
+#----------------------------------------------------------------------
+#玩家账户信息#tagDSAccount
+class tagDSAccount(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ACCID', ctypes.c_char * 65),
+        ('Psw', ctypes.c_char * 33),
+        ('PswLV2', ctypes.c_char * 33),
+        ('LogNum', ctypes.c_ulong),
+        ('Adult', ctypes.c_ubyte),
+        ('RegIP', ctypes.c_char * 20),
+        ('Presentee', ctypes.c_ubyte),
+        ('TelLockState', ctypes.c_ubyte),
+        ('GeTuiClientID', ctypes.c_char * 33),
+        ('TotalSavePoint', ctypes.c_ulong),
+        ('BalanceInfo', ctypes.c_ulong),
+        ('AppID', ctypes.c_char * 20),
+        ('AreaID', ctypes.c_ulong),
+        ('fobbiddenAccount', ctypes.c_ubyte),
+        ('ApplyingAdult', ctypes.c_ubyte),
+        ('SpreadedUser', ctypes.c_ubyte),
+        ('Spreader', ctypes.c_ubyte),
+        ('onlineSMSNotice', ctypes.c_ubyte),
+        ('EkeyType', ctypes.c_ubyte),
+        ('EkeyBindFlag', ctypes.c_ubyte),
+        ('IPBan', ctypes.c_ubyte),
+        ('RegisterTime', ctypes.c_char * 20),
+        ('LastLoginTime', ctypes.c_char * 20),
+        ('Operator', ctypes.c_char * 15),
+        ('AccountID', ctypes.c_ulong),
+        ('TokenExpire', ctypes.c_char * 20),
+        ('Phone', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+        ('SID', ctypes.c_int),    #用于校验
+        ('VerNO', ctypes.c_ulong)   #用于SID校验时比较版本号
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDSAccount)
+
+
+    def getSID(self):
+        return self.SID
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ACCID'] = fix_incomingText(self.ACCID)
+        rec[u'Psw'] = fix_incomingText(self.Psw)
+        rec[u'PswLV2'] = fix_incomingText(self.PswLV2)
+        rec[u'LogNum'] = self.LogNum
+        rec[u'Adult'] = self.Adult
+        rec[u'RegIP'] = fix_incomingText(self.RegIP)
+        rec[u'Presentee'] = self.Presentee
+        rec[u'TelLockState'] = self.TelLockState
+        rec[u'GeTuiClientID'] = fix_incomingText(self.GeTuiClientID)
+        rec[u'TotalSavePoint'] = self.TotalSavePoint
+        rec[u'BalanceInfo'] = self.BalanceInfo
+        rec[u'AppID'] = fix_incomingText(self.AppID)
+        rec[u'AreaID'] = self.AreaID
+        rec[u'fobbiddenAccount'] = self.fobbiddenAccount
+        rec[u'ApplyingAdult'] = self.ApplyingAdult
+        rec[u'SpreadedUser'] = self.SpreadedUser
+        rec[u'Spreader'] = self.Spreader
+        rec[u'onlineSMSNotice'] = self.onlineSMSNotice
+        rec[u'EkeyType'] = self.EkeyType
+        rec[u'EkeyBindFlag'] = self.EkeyBindFlag
+        rec[u'IPBan'] = self.IPBan
+        rec[u'RegisterTime'] = fix_incomingText(self.RegisterTime)
+        rec[u'LastLoginTime'] = fix_incomingText(self.LastLoginTime)
+        rec[u'Operator'] = fix_incomingText(self.Operator)
+        rec[u'AccountID'] = self.AccountID
+        rec[u'TokenExpire'] = fix_incomingText(self.TokenExpire)
+        rec[u'Phone'] = self.Phone
+        rec[u'SID'] = self.SID
+        rec[u'VerNO'] = self.VerNO
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ACCID = fix_outgoingText(rec.get(u'ACCID', u''))
+        self.Psw = fix_outgoingText(rec.get(u'Psw', u''))
+        self.PswLV2 = fix_outgoingText(rec.get(u'PswLV2', u''))
+        self.LogNum = rec.get(u'LogNum', 0)
+        self.Adult = rec.get(u'Adult', 0)
+        self.RegIP = fix_outgoingText(rec.get(u'RegIP', u''))
+        self.Presentee = rec.get(u'Presentee', 0)
+        self.TelLockState = rec.get(u'TelLockState', 0)
+        self.GeTuiClientID = fix_outgoingText(rec.get(u'GeTuiClientID', u''))
+        self.TotalSavePoint = rec.get(u'TotalSavePoint', 0)
+        self.BalanceInfo = rec.get(u'BalanceInfo', 0)
+        self.AppID = fix_outgoingText(rec.get(u'AppID', u''))
+        self.AreaID = rec.get(u'AreaID', 0)
+        self.fobbiddenAccount = rec.get(u'fobbiddenAccount', 0)
+        self.ApplyingAdult = rec.get(u'ApplyingAdult', 0)
+        self.SpreadedUser = rec.get(u'SpreadedUser', 0)
+        self.Spreader = rec.get(u'Spreader', 0)
+        self.onlineSMSNotice = rec.get(u'onlineSMSNotice', 0)
+        self.EkeyType = rec.get(u'EkeyType', 0)
+        self.EkeyBindFlag = rec.get(u'EkeyBindFlag', 0)
+        self.IPBan = rec.get(u'IPBan', 0)
+        self.RegisterTime = fix_outgoingText(rec.get(u'RegisterTime', u''))
+        self.LastLoginTime = fix_outgoingText(rec.get(u'LastLoginTime', u''))
+        self.Operator = fix_outgoingText(rec.get(u'Operator', u''))
+        self.AccountID = rec.get(u'AccountID', 0)
+        self.TokenExpire = fix_outgoingText(rec.get(u'TokenExpire', u''))
+        self.Phone = rec.get(u'Phone', 0)
+        self.SID = rec['SID']
+        self.VerNO = rec.get(u'VerNO', 0)
+
+
+    def makeSID(self):
+        self.SID = 0
+        self.VerNO = CollectionVesionNO.tagDSAccount_VersionNO
+        self.SID = makeSID(self.getBuffer())
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'ACCID':fix_incomingText(self.ACCID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+    def adoLoadC(self, collection):
+        '''使用KEY查找,进行校验,并读取'''
+        resultCollection = collection.find({'ACCID':fix_incomingText(self.ACCID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        saveSID = self.SID
+        self.SID = 0
+        if self.VerNO == CollectionVesionNO.tagDSAccount_VersionNO:
+            if not checkSID(self.getBuffer(), saveSID):
+                addSIDErrorCnt()
+                mylog.warning('SID checksum error!ACCID = %s'%rec['ACCID'])
+
+                return False
+        #校验通过
+        return True
+
+    def adoLoadCEx(self, collection, query):
+        resultCollection = collection.find(query)
+
+        if resultCollection.count() <= 0:
+            return False
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        saveSID = self.SID
+        self.SID = 0
+        if self.VerNO == CollectionVesionNO.tagDSAccount_VersionNO:
+            if not checkSID(self.getBuffer(), saveSID):
+                addSIDErrorCnt()
+                mylog.warning('SID checksum error!query = %s'%query)
+
+                return False
+        #校验通过
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!ACCID = %s, error = %s, trycnt = %d'%(self.ACCID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoInsertC(self, collection):
+        self.makeSID()
+        return self.adoInsert(collection)
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'ACCID':fix_incomingText(self.ACCID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!ACCID = %s, error = %s, trycnt = %d'%(self.ACCID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!ACCID = %s, error = %s, trycnt = %d'%(self.ACCID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateC(self, collection):
+        self.makeSID()
+        return self.adoUpdate(collection)
+
+
+    def adoUpdateExC(self, collection, spec):
+        self.makeSID()
+        return self.adoUpdateEx(collection, spec)
+
+
+    def adoCheckUpdateC(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'ACCID':fix_incomingText(self.ACCID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsertC(collection)
+        return self.adoUpdateC(collection)
+
+
+    def adoCheckUpdateCEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsertC(collection, spec)
+        return self.adoUpdateExC(collection, spec)
+
+
+    def getAdoRecordsC(self, resultCollection):
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            #校验SID
+            self.readRecord(rec)
+            saveSID = self.SID
+            self.SID = 0
+            if self.VerNO == CollectionVesionNO.tagDSAccount_VersionNO:
+                if not checkSID(self.getBuffer(), saveSID):
+                    addSIDErrorCnt()
+                    mylog.warning('SID error ACCID = %s'%self.ACCID)
+
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndexC(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'ACCID':fix_incomingText(self.ACCID)})
+         
+        return self.getAdoRecordsC(resultCollection)
+
+
+    def adoQueryCustomC(self, collection, queryDict):
+        '''自定义查找'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecordsC(resultCollection)
+        
+
+    def adoQueryAllC(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecordsC(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'ACCID':fix_incomingText(self.ACCID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:ACCID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.ACCID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.ACCID = %s, error = %s, trycnt = %d'%(self.ACCID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家账户信息#tagDSAccount:
+            ACCID = %s,
+            Psw = %s,
+            PswLV2 = %s,
+            LogNum = %s,
+            Adult = %s,
+            RegIP = %s,
+            Presentee = %s,
+            TelLockState = %s,
+            GeTuiClientID = %s,
+            TotalSavePoint = %s,
+            BalanceInfo = %s,
+            AppID = %s,
+            AreaID = %s,
+            fobbiddenAccount = %s,
+            ApplyingAdult = %s,
+            SpreadedUser = %s,
+            Spreader = %s,
+            onlineSMSNotice = %s,
+            EkeyType = %s,
+            EkeyBindFlag = %s,
+            IPBan = %s,
+            RegisterTime = %s,
+            LastLoginTime = %s,
+            Operator = %s,
+            AccountID = %s,
+            TokenExpire = %s,
+            Phone = %s,
+            ADOResult = %s,
+            SID = %s,
+            VerNO = %s,
+            '''%(
+                self.ACCID,
+                self.Psw,
+                self.PswLV2,
+                self.LogNum,
+                self.Adult,
+                self.RegIP,
+                self.Presentee,
+                self.TelLockState,
+                self.GeTuiClientID,
+                self.TotalSavePoint,
+                self.BalanceInfo,
+                self.AppID,
+                self.AreaID,
+                self.fobbiddenAccount,
+                self.ApplyingAdult,
+                self.SpreadedUser,
+                self.Spreader,
+                self.onlineSMSNotice,
+                self.EkeyType,
+                self.EkeyBindFlag,
+                self.IPBan,
+                self.RegisterTime,
+                self.LastLoginTime,
+                self.Operator,
+                self.AccountID,
+                self.TokenExpire,
+                self.Phone,
+                self.ADOResult,
+                self.SID,
+                self.VerNO
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.ACCID,
+                self.Psw,
+                self.PswLV2,
+                self.LogNum,
+                self.Adult,
+                self.RegIP,
+                self.Presentee,
+                self.TelLockState,
+                self.GeTuiClientID,
+                self.TotalSavePoint,
+                self.BalanceInfo,
+                self.AppID,
+                self.AreaID,
+                self.fobbiddenAccount,
+                self.ApplyingAdult,
+                self.SpreadedUser,
+                self.Spreader,
+                self.onlineSMSNotice,
+                self.EkeyType,
+                self.EkeyBindFlag,
+                self.IPBan,
+                self.RegisterTime,
+                self.LastLoginTime,
+                self.Operator,
+                self.AccountID,
+                self.TokenExpire,
+                self.Phone,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetACCID(self,Str):
+        if len(Str)<=65:
+            self.ACCID = Str
+        else:
+            self.ACCID = Str[:65]
+            
+    def SetPsw(self,Str):
+        if len(Str)<=33:
+            self.Psw = Str
+        else:
+            self.Psw = Str[:33]
+            
+    def SetPswLV2(self,Str):
+        if len(Str)<=33:
+            self.PswLV2 = Str
+        else:
+            self.PswLV2 = Str[:33]
+            
+    def SetRegIP(self,Str):
+        if len(Str)<=20:
+            self.RegIP = Str
+        else:
+            self.RegIP = Str[:20]
+            
+    def SetGeTuiClientID(self,Str):
+        if len(Str)<=33:
+            self.GeTuiClientID = Str
+        else:
+            self.GeTuiClientID = Str[:33]
+            
+    def SetAppID(self,Str):
+        if len(Str)<=20:
+            self.AppID = Str
+        else:
+            self.AppID = Str[:20]
+            
+    def SetRegisterTime(self,Str):
+        if len(Str)<=20:
+            self.RegisterTime = Str
+        else:
+            self.RegisterTime = Str[:20]
+            
+    def SetLastLoginTime(self,Str):
+        if len(Str)<=20:
+            self.LastLoginTime = Str
+        else:
+            self.LastLoginTime = Str[:20]
+            
+    def SetOperator(self,Str):
+        if len(Str)<=15:
+            self.Operator = Str
+        else:
+            self.Operator = Str[:15]
+            
+    def SetTokenExpire(self,Str):
+        if len(Str)<=20:
+            self.TokenExpire = Str
+        else:
+            self.TokenExpire = Str[:20]
+            
+            
+#------------------------------------------------------
+#人物物品#tagRoleItem
+class tagRoleItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ItemGUID', ctypes.c_char * 40),
+        ('PlayerID', ctypes.c_ulong),
+        ('ItemTypeID', ctypes.c_ulong),
+        ('Count', ctypes.c_ushort),
+        ('IsLocked', ctypes.c_ubyte),
+        ('ItemPlaceType', ctypes.c_ubyte),
+        ('ItemPlaceIndex', ctypes.c_ushort),
+        ('IsBind', ctypes.c_ubyte),
+        ('GearScore', ctypes.c_ulong),
+        ('RemainHour', ctypes.c_ushort),
+        ('CreateTime', ctypes.c_char * 30),
+        ('UserDataLen', ctypes.c_ulong),
+        ('UserData', ctypes.c_char_p),
+        ('IsSuite', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+        ('SID', ctypes.c_int),    #用于校验
+        ('VerNO', ctypes.c_ulong)   #用于SID校验时比较版本号
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.ItemGUID = ''
+        self.PlayerID = 0
+        self.ItemTypeID = 0
+        self.Count = 0
+        self.IsLocked = 0
+        self.ItemPlaceType = 0
+        self.ItemPlaceIndex = 0
+        self.IsBind = 0
+        self.GearScore = 0
+        self.RemainHour = 0
+        self.CreateTime = ''
+        self.UserDataLen = 0
+        self.UserData = ''
+        self.IsSuite = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.ItemGUID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ItemTypeID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Count, pos = CommFunc.ReadWORD(buf, pos)
+        self.IsLocked, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemPlaceType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemPlaceIndex, pos = CommFunc.ReadWORD(buf, pos)
+        self.IsBind, pos = CommFunc.ReadBYTE(buf, pos)
+        self.GearScore, pos = CommFunc.ReadDWORD(buf, pos)
+        self.RemainHour, pos = CommFunc.ReadWORD(buf, pos)
+        self.CreateTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.UserDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        self.IsSuite, pos = CommFunc.ReadBYTE(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.ItemGUID)
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteDWORD(buf, self.ItemTypeID)
+        buf = CommFunc.WriteWORD(buf, self.Count)
+        buf = CommFunc.WriteBYTE(buf, self.IsLocked)
+        buf = CommFunc.WriteBYTE(buf, self.ItemPlaceType)
+        buf = CommFunc.WriteWORD(buf, self.ItemPlaceIndex)
+        buf = CommFunc.WriteBYTE(buf, self.IsBind)
+        buf = CommFunc.WriteDWORD(buf, self.GearScore)
+        buf = CommFunc.WriteWORD(buf, self.RemainHour)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.CreateTime)
+        buf = CommFunc.WriteDWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        buf = CommFunc.WriteBYTE(buf, self.IsSuite)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_ulong)
+        length += self.UserDataLen
+        length += sizeof(ctypes.c_ubyte)
+        return length
+
+
+    def getSID(self):
+        return self.SID
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ItemGUID'] = fix_incomingText(self.ItemGUID)
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'ItemTypeID'] = self.ItemTypeID
+        rec[u'Count'] = self.Count
+        rec[u'IsLocked'] = self.IsLocked
+        rec[u'ItemPlaceType'] = self.ItemPlaceType
+        rec[u'ItemPlaceIndex'] = self.ItemPlaceIndex
+        rec[u'IsBind'] = self.IsBind
+        rec[u'GearScore'] = self.GearScore
+        rec[u'RemainHour'] = self.RemainHour
+        rec[u'CreateTime'] = fix_incomingText(self.CreateTime)
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        rec[u'IsSuite'] = self.IsSuite
+        rec[u'SID'] = self.SID
+        rec[u'VerNO'] = self.VerNO
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ItemGUID = fix_outgoingText(rec.get(u'ItemGUID', u''))
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.ItemTypeID = rec.get(u'ItemTypeID', 0)
+        self.Count = rec.get(u'Count', 0)
+        self.IsLocked = rec.get(u'IsLocked', 0)
+        self.ItemPlaceType = rec.get(u'ItemPlaceType', 0)
+        self.ItemPlaceIndex = rec.get(u'ItemPlaceIndex', 0)
+        self.IsBind = rec.get(u'IsBind', 0)
+        self.GearScore = rec.get(u'GearScore', 0)
+        self.RemainHour = rec.get(u'RemainHour', 0)
+        self.CreateTime = fix_outgoingText(rec.get(u'CreateTime', u''))
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+        self.IsSuite = rec.get(u'IsSuite', 0)
+        self.SID = rec['SID']
+        self.VerNO = rec.get(u'VerNO', 0)
+
+
+    def makeSID(self):
+        self.SID = 0
+        self.VerNO = CollectionVesionNO.tagRoleItem_VersionNO
+        self.SID = makeSID(self.getBuffer())
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoLoadCStr method:No key defined!
+    def adoLoadCEx(self, collection, query):
+        resultCollection = collection.find(query)
+
+        if resultCollection.count() <= 0:
+            return False
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        saveSID = self.SID
+        self.SID = 0
+        if self.VerNO == CollectionVesionNO.tagRoleItem_VersionNO:
+            if not checkSID(self.getBuffer(), saveSID):
+                addSIDErrorCnt()
+                mylog.warning('SID checksum error!query = %s'%query)
+
+                return False
+        #校验通过
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!ItemGUID = %s, error = %s, trycnt = %d'%(self.ItemGUID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoInsertC(self, collection):
+        self.makeSID()
+        return self.adoInsert(collection)
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!ItemGUID = %s, error = %s, trycnt = %d'%(self.ItemGUID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateC(self, collection):
+        self.makeSID()
+        return self.adoUpdate(collection)
+
+
+    def adoUpdateExC(self, collection, spec):
+        self.makeSID()
+        return self.adoUpdateEx(collection, spec)
+
+#Can not implement adoCheckUpdateCStr method:No key defined!
+#Can not implement adoCheckUpdateCExStr method:No key defined!
+
+    def getAdoRecordsC(self, resultCollection):
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            #校验SID
+            self.readRecord(rec)
+            saveSID = self.SID
+            self.SID = 0
+            if self.VerNO == CollectionVesionNO.tagRoleItem_VersionNO:
+                if not checkSID(self.getBuffer(), saveSID):
+                    addSIDErrorCnt()
+                    mylog.warning('SID error ItemGUID = %s'%self.ItemGUID)
+
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndexC(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'ItemGUID':fix_incomingText(self.ItemGUID)})
+         
+        return self.getAdoRecordsC(resultCollection)
+
+
+    def adoQueryCustomC(self, collection, queryDict):
+        '''自定义查找'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecordsC(resultCollection)
+        
+
+    def adoQueryAllC(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecordsC(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'ItemGUID':fix_incomingText(self.ItemGUID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:ItemGUID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.ItemGUID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.ItemGUID = %s, error = %s, trycnt = %d'%(self.ItemGUID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//人物物品#tagRoleItem:
+            ItemGUID = %s,
+            PlayerID = %s,
+            ItemTypeID = %s,
+            Count = %s,
+            IsLocked = %s,
+            ItemPlaceType = %s,
+            ItemPlaceIndex = %s,
+            IsBind = %s,
+            GearScore = %s,
+            RemainHour = %s,
+            CreateTime = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            IsSuite = %s,
+            ADOResult = %s,
+            SID = %s,
+            VerNO = %s,
+            '''%(
+                self.ItemGUID,
+                self.PlayerID,
+                self.ItemTypeID,
+                self.Count,
+                self.IsLocked,
+                self.ItemPlaceType,
+                self.ItemPlaceIndex,
+                self.IsBind,
+                self.GearScore,
+                self.RemainHour,
+                self.CreateTime,
+                self.UserDataLen,
+                self.UserData,
+                self.IsSuite,
+                self.ADOResult,
+                self.SID,
+                self.VerNO
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.ItemGUID,
+                self.PlayerID,
+                self.ItemTypeID,
+                self.Count,
+                self.IsLocked,
+                self.ItemPlaceType,
+                self.ItemPlaceIndex,
+                self.IsBind,
+                self.GearScore,
+                self.RemainHour,
+                self.CreateTime,
+                self.UserDataLen,
+                self.UserData,
+                self.IsSuite,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetItemGUID(self,Str):
+        if len(Str)<=40:
+            self.ItemGUID = Str
+        else:
+            self.ItemGUID = Str[:40]
+            
+    def SetCreateTime(self,Str):
+        if len(Str)<=30:
+            self.CreateTime = Str
+        else:
+            self.CreateTime = Str[:30]
+            
+
+
+                         
+############################################################################
+##################下面的接口是非SID的##########################################
+############################################################################        
+#------------------------------------------------------
+#家族奖励表#tagDBFamilyReward
+class tagDBFamilyReward(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('FamilyID', ctypes.c_ulong),
+        ('ItemID', ctypes.c_ulong),
+        ('Count', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBFamilyReward)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'ItemID'] = self.ItemID
+        rec[u'Count'] = self.Count
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.ItemID = rec.get(u'ItemID', 0)
+        self.Count = rec.get(u'Count', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'FamilyID':self.FamilyID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:FamilyID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.FamilyID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//家族奖励表#tagDBFamilyReward:
+            FamilyID = %s,
+            ItemID = %s,
+            Count = %s,
+            ADOResult = %s,
+            '''%(
+                self.FamilyID,
+                self.ItemID,
+                self.Count,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.FamilyID,
+                self.ItemID,
+                self.Count,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#家族奖励兑换记录#tagDBFamilyRewardRec
+class tagDBFamilyRewardRec(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('FamilyID', ctypes.c_ulong),
+        ('PlayID', ctypes.c_ulong),
+        ('ItemID', ctypes.c_ulong),
+        ('Count', ctypes.c_ulong),
+        ('Time', ctypes.c_double),
+        ('PlayerName', ctypes.c_char * 33),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBFamilyRewardRec)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'PlayID'] = self.PlayID
+        rec[u'ItemID'] = self.ItemID
+        rec[u'Count'] = self.Count
+        rec[u'Time'] = self.Time
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.PlayID = rec.get(u'PlayID', 0)
+        self.ItemID = rec.get(u'ItemID', 0)
+        self.Count = rec.get(u'Count', 0)
+        self.Time = rec.get(u'Time', 0)
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'FamilyID':self.FamilyID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:FamilyID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.FamilyID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//家族奖励兑换记录#tagDBFamilyRewardRec:
+            FamilyID = %s,
+            PlayID = %s,
+            ItemID = %s,
+            Count = %s,
+            Time = %s,
+            PlayerName = %s,
+            ADOResult = %s,
+            '''%(
+                self.FamilyID,
+                self.PlayID,
+                self.ItemID,
+                self.Count,
+                self.Time,
+                self.PlayerName,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.FamilyID,
+                self.PlayID,
+                self.ItemID,
+                self.Count,
+                self.Time,
+                self.PlayerName,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+#------------------------------------------------------
+#玩家标签印象表#tagDBPlayerLabel
+class tagDBPlayerLabel(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('LabelID', ctypes.c_ulong),
+        ('LabelContent', ctypes.c_char * 21),
+        ('LabelType', ctypes.c_ubyte),
+        ('IsSelfAdd', ctypes.c_ubyte),
+        ('AddPlayerID', ctypes.c_ulong),
+        ('AddPlayerName', ctypes.c_char * 33),
+        ('AddTime', ctypes.c_char * 20),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerLabel)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'LabelID'] = self.LabelID
+        rec[u'LabelContent'] = fix_incomingText(self.LabelContent)
+        rec[u'LabelType'] = self.LabelType
+        rec[u'IsSelfAdd'] = self.IsSelfAdd
+        rec[u'AddPlayerID'] = self.AddPlayerID
+        rec[u'AddPlayerName'] = fix_incomingText(self.AddPlayerName)
+        rec[u'AddTime'] = fix_incomingText(self.AddTime)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.LabelID = rec.get(u'LabelID', 0)
+        self.LabelContent = fix_outgoingText(rec.get(u'LabelContent', u''))
+        self.LabelType = rec.get(u'LabelType', 0)
+        self.IsSelfAdd = rec.get(u'IsSelfAdd', 0)
+        self.AddPlayerID = rec.get(u'AddPlayerID', 0)
+        self.AddPlayerName = fix_outgoingText(rec.get(u'AddPlayerName', u''))
+        self.AddTime = fix_outgoingText(rec.get(u'AddTime', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家标签印象表#tagDBPlayerLabel:
+            PlayerID = %s,
+            LabelID = %s,
+            LabelContent = %s,
+            LabelType = %s,
+            IsSelfAdd = %s,
+            AddPlayerID = %s,
+            AddPlayerName = %s,
+            AddTime = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.LabelID,
+                self.LabelContent,
+                self.LabelType,
+                self.IsSelfAdd,
+                self.AddPlayerID,
+                self.AddPlayerName,
+                self.AddTime,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.LabelID,
+                self.LabelContent,
+                self.LabelType,
+                self.IsSelfAdd,
+                self.AddPlayerID,
+                self.AddPlayerName,
+                self.AddTime,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetLabelContent(self,Str):
+        if len(Str)<=21:
+            self.LabelContent = Str
+        else:
+            self.LabelContent = Str[:21]
+            
+    def SetAddPlayerName(self,Str):
+        if len(Str)<=33:
+            self.AddPlayerName = Str
+        else:
+            self.AddPlayerName = Str[:33]
+            
+    def SetAddTime(self,Str):
+        if len(Str)<=20:
+            self.AddTime = Str
+        else:
+            self.AddTime = Str[:20]
+
+#------------------------------------------------------
+#玩家召回表#tagDBPlayerRecall
+class tagDBPlayerRecall(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('RecallCount', ctypes.c_ushort),
+        ('ReceiveFlag', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerRecall)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'RecallCount'] = self.RecallCount
+        rec[u'ReceiveFlag'] = self.ReceiveFlag
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.RecallCount = rec.get(u'RecallCount', 0)
+        self.ReceiveFlag = rec.get(u'ReceiveFlag', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PlayerID':self.PlayerID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家召回表#tagDBPlayerRecall:
+            PlayerID = %s,
+            RecallCount = %s,
+            ReceiveFlag = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.RecallCount,
+                self.ReceiveFlag,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.RecallCount,
+                self.ReceiveFlag,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#竞技场系统奖惩表#tagDBVsReward
+class tagDBVsReward(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('VsPoint', ctypes.c_ulong),
+        ('VsValue', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBVsReward)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'VsPoint'] = self.VsPoint
+        rec[u'VsValue'] = self.VsValue
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.VsPoint = rec.get(u'VsPoint', 0)
+        self.VsValue = rec.get(u'VsValue', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PlayerID':self.PlayerID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//竞技场系统奖惩表#tagDBVsReward:
+            PlayerID = %s,
+            VsPoint = %s,
+            VsValue = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.VsPoint,
+                self.VsValue,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.VsPoint,
+                self.VsValue,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#更新玩家帐号表是否成年字段#tagDSAccount_UpdateAdult
+class tagDSAccount_UpdateAdult(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('Adult', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDSAccount_UpdateAdult)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'Adult'] = self.Adult
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.Adult = rec.get(u'Adult', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//更新玩家帐号表是否成年字段#tagDSAccount_UpdateAdult:
+            AccID = %s,
+            Adult = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.Adult,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.AccID,
+                self.Adult,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+
+
+#------------------------------------------------------
+#更新账号梦天堂通行证UID#tagDSAccount_UpdateMTTUID
+class tagDSAccount_UpdateMTTUID(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('MTTUID', ctypes.c_longlong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDSAccount_UpdateMTTUID)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'MTTUID'] = self.MTTUID
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.MTTUID = rec.get(u'MTTUID', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//更新账号梦天堂通行证UID#tagDSAccount_UpdateMTTUID:
+            AccID = %s,
+            MTTUID = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.MTTUID,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.AccID,
+                self.MTTUID,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+
+
+#------------------------------------------------------
+#更新账号通讯锁功能开通状态#tagDSAccount_UpdateTelLockState
+class tagDSAccount_UpdateTelLockState(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('TelLockState', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDSAccount_UpdateTelLockState)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'TelLockState'] = self.TelLockState
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.TelLockState = rec.get(u'TelLockState', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//更新账号通讯锁功能开通状态#tagDSAccount_UpdateTelLockState:
+            AccID = %s,
+            TelLockState = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.TelLockState,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.AccID,
+                self.TelLockState,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+
+
+#------------------------------------------------------
+#副本通关记录#tagGameFBPassRec
+class tagGameFBPassRec(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('FBID', ctypes.c_ulong),
+        ('Time', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('PlayerName', ctypes.c_char * 33),
+        ('Type', ctypes.c_ubyte),
+        ('ExtraInfo', ctypes.c_char * 256),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagGameFBPassRec)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'FBID'] = self.FBID
+        rec[u'Time'] = self.Time
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'Type'] = self.Type
+        rec[u'ExtraInfo'] = fix_incomingText(self.ExtraInfo)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.FBID = rec.get(u'FBID', 0)
+        self.Time = rec.get(u'Time', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.Type = rec.get(u'Type', 0)
+        self.ExtraInfo = fix_outgoingText(rec.get(u'ExtraInfo', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!FBID = %s, error = %s, trycnt = %d'%(self.FBID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!FBID = %s, error = %s, trycnt = %d'%(self.FBID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'FBID':self.FBID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'FBID':self.FBID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:FBID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.FBID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.FBID = %s, error = %s, trycnt = %d'%(self.FBID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//副本通关记录#tagGameFBPassRec:
+            FBID = %s,
+            Time = %s,
+            PlayerID = %s,
+            PlayerName = %s,
+            Type = %s,
+            ExtraInfo = %s,
+            ADOResult = %s,
+            '''%(
+                self.FBID,
+                self.Time,
+                self.PlayerID,
+                self.PlayerName,
+                self.Type,
+                self.ExtraInfo,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.FBID,
+                self.Time,
+                self.PlayerID,
+                self.PlayerName,
+                self.Type,
+                self.ExtraInfo,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+    def SetExtraInfo(self,Str):
+        if len(Str)<=256:
+            self.ExtraInfo = Str
+        else:
+            self.ExtraInfo = Str[:256]
+            
+#------------------------------------------------------
+#游戏组合表,用于记录组合的公共属性#tagGameGroup
+class tagGameGroup(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('Type', ctypes.c_ubyte),
+        ('GroupID', ctypes.c_ulong),
+        ('GroupNameLen', ctypes.c_ubyte),
+        ('GroupName', ctypes.c_char_p),
+        ('MemberCount', ctypes.c_ubyte),
+        ('GroupDataLen', ctypes.c_ulong),
+        ('GroupData', ctypes.c_char_p),
+        ('Extra1', ctypes.c_ulong),
+        ('Extra2', ctypes.c_ulong),
+        ('Extra3', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.Type = 0
+        self.GroupID = 0
+        self.GroupNameLen = 0
+        self.GroupName = ''
+        self.MemberCount = 0
+        self.GroupDataLen = 0
+        self.GroupData = ''
+        self.Extra1 = 0
+        self.Extra2 = 0
+        self.Extra3 = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.Type, pos = CommFunc.ReadBYTE(buf, pos)
+        self.GroupID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.GroupNameLen, pos = CommFunc.ReadBYTE(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.GroupNameLen)
+        self.GroupName = ctypes.c_char_p(tmp)
+        self.MemberCount, pos = CommFunc.ReadBYTE(buf, pos)
+        self.GroupDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.GroupDataLen)
+        self.GroupData = ctypes.c_char_p(tmp)
+        self.Extra1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Extra2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Extra3, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteBYTE(buf, self.Type)
+        buf = CommFunc.WriteDWORD(buf, self.GroupID)
+        buf = CommFunc.WriteBYTE(buf, self.GroupNameLen)
+        buf = CommFunc.WriteString(buf, self.GroupNameLen, self.GroupName)
+        buf = CommFunc.WriteBYTE(buf, self.MemberCount)
+        buf = CommFunc.WriteDWORD(buf, self.GroupDataLen)
+        buf = CommFunc.WriteString(buf, self.GroupDataLen, self.GroupData)
+        buf = CommFunc.WriteDWORD(buf, self.Extra1)
+        buf = CommFunc.WriteDWORD(buf, self.Extra2)
+        buf = CommFunc.WriteDWORD(buf, self.Extra3)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += self.GroupNameLen
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += self.GroupDataLen
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'Type'] = self.Type
+        rec[u'GroupID'] = self.GroupID
+        rec[u'GroupNameLen'] = self.GroupNameLen
+        rec[u'GroupName'] = fix_incomingText(self.GroupName)
+        rec[u'MemberCount'] = self.MemberCount
+        rec[u'GroupDataLen'] = self.GroupDataLen
+        rec[u'GroupData'] = fix_incomingText(self.GroupData)
+        rec[u'Extra1'] = self.Extra1
+        rec[u'Extra2'] = self.Extra2
+        rec[u'Extra3'] = self.Extra3
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.Type = rec.get(u'Type', 0)
+        self.GroupID = rec.get(u'GroupID', 0)
+        self.GroupNameLen = rec.get(u'GroupNameLen', 0)
+        self.GroupName = fix_outgoingText(rec.get(u'GroupName', u''))
+        self.MemberCount = rec.get(u'MemberCount', 0)
+        self.GroupDataLen = rec.get(u'GroupDataLen', 0)
+        self.GroupData = fix_outgoingText(rec.get(u'GroupData', u''))
+        self.Extra1 = rec.get(u'Extra1', 0)
+        self.Extra2 = rec.get(u'Extra2', 0)
+        self.Extra3 = rec.get(u'Extra3', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'Type':self.Type})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'Type':self.Type})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:Type = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.Type))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//游戏组合表,用于记录组合的公共属性#tagGameGroup:
+            Type = %s,
+            GroupID = %s,
+            GroupNameLen = %s,
+            GroupName = %s,
+            MemberCount = %s,
+            GroupDataLen = %s,
+            GroupData = %s,
+            Extra1 = %s,
+            Extra2 = %s,
+            Extra3 = %s,
+            ADOResult = %s,
+            '''%(
+                self.Type,
+                self.GroupID,
+                self.GroupNameLen,
+                self.GroupName,
+                self.MemberCount,
+                self.GroupDataLen,
+                self.GroupData,
+                self.Extra1,
+                self.Extra2,
+                self.Extra3,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.Type,
+                self.GroupID,
+                self.GroupNameLen,
+                self.GroupName,
+                self.MemberCount,
+                self.GroupDataLen,
+                self.GroupData,
+                self.Extra1,
+                self.Extra2,
+                self.Extra3,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#游戏组合成员表,用于记录成员基本属性#tagGameGroupMember
+class tagGameGroupMember(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('Type', ctypes.c_ubyte),
+        ('GroupID', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('PlayerName', ctypes.c_char * 33),
+        ('PositionIndex', ctypes.c_ubyte),
+        ('PlayerDataLen', ctypes.c_ulong),
+        ('PlayerData', ctypes.c_char_p),
+        ('Extra1', ctypes.c_ulong),
+        ('Extra2', ctypes.c_ulong),
+        ('Extra3', ctypes.c_ulong),
+        ('Extra4', ctypes.c_ulong),
+        ('Extra5', ctypes.c_ulong),
+        ('Extra6', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.Type = 0
+        self.GroupID = 0
+        self.PlayerID = 0
+        self.PlayerName = ''
+        self.PositionIndex = 0
+        self.PlayerDataLen = 0
+        self.PlayerData = ''
+        self.Extra1 = 0
+        self.Extra2 = 0
+        self.Extra3 = 0
+        self.Extra4 = 0
+        self.Extra5 = 0
+        self.Extra6 = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.Type, pos = CommFunc.ReadBYTE(buf, pos)
+        self.GroupID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.PositionIndex, pos = CommFunc.ReadBYTE(buf, pos)
+        self.PlayerDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.PlayerDataLen)
+        self.PlayerData = ctypes.c_char_p(tmp)
+        self.Extra1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Extra2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Extra3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Extra4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Extra5, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Extra6, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteBYTE(buf, self.Type)
+        buf = CommFunc.WriteDWORD(buf, self.GroupID)
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.PlayerName)
+        buf = CommFunc.WriteBYTE(buf, self.PositionIndex)
+        buf = CommFunc.WriteDWORD(buf, self.PlayerDataLen)
+        buf = CommFunc.WriteString(buf, self.PlayerDataLen, self.PlayerData)
+        buf = CommFunc.WriteDWORD(buf, self.Extra1)
+        buf = CommFunc.WriteDWORD(buf, self.Extra2)
+        buf = CommFunc.WriteDWORD(buf, self.Extra3)
+        buf = CommFunc.WriteDWORD(buf, self.Extra4)
+        buf = CommFunc.WriteDWORD(buf, self.Extra5)
+        buf = CommFunc.WriteDWORD(buf, self.Extra6)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += self.PlayerDataLen
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'Type'] = self.Type
+        rec[u'GroupID'] = self.GroupID
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'PositionIndex'] = self.PositionIndex
+        rec[u'PlayerDataLen'] = self.PlayerDataLen
+        rec[u'PlayerData'] = fix_incomingText(self.PlayerData)
+        rec[u'Extra1'] = self.Extra1
+        rec[u'Extra2'] = self.Extra2
+        rec[u'Extra3'] = self.Extra3
+        rec[u'Extra4'] = self.Extra4
+        rec[u'Extra5'] = self.Extra5
+        rec[u'Extra6'] = self.Extra6
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.Type = rec.get(u'Type', 0)
+        self.GroupID = rec.get(u'GroupID', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.PositionIndex = rec.get(u'PositionIndex', 0)
+        self.PlayerDataLen = rec.get(u'PlayerDataLen', 0)
+        self.PlayerData = fix_outgoingText(rec.get(u'PlayerData', u''))
+        self.Extra1 = rec.get(u'Extra1', 0)
+        self.Extra2 = rec.get(u'Extra2', 0)
+        self.Extra3 = rec.get(u'Extra3', 0)
+        self.Extra4 = rec.get(u'Extra4', 0)
+        self.Extra5 = rec.get(u'Extra5', 0)
+        self.Extra6 = rec.get(u'Extra6', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'Type':self.Type})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'Type':self.Type})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:Type = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.Type))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//游戏组合成员表,用于记录成员基本属性#tagGameGroupMember:
+            Type = %s,
+            GroupID = %s,
+            PlayerID = %s,
+            PlayerName = %s,
+            PositionIndex = %s,
+            PlayerDataLen = %s,
+            PlayerData = %s,
+            Extra1 = %s,
+            Extra2 = %s,
+            Extra3 = %s,
+            Extra4 = %s,
+            Extra5 = %s,
+            Extra6 = %s,
+            ADOResult = %s,
+            '''%(
+                self.Type,
+                self.GroupID,
+                self.PlayerID,
+                self.PlayerName,
+                self.PositionIndex,
+                self.PlayerDataLen,
+                self.PlayerData,
+                self.Extra1,
+                self.Extra2,
+                self.Extra3,
+                self.Extra4,
+                self.Extra5,
+                self.Extra6,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.Type,
+                self.GroupID,
+                self.PlayerID,
+                self.PlayerName,
+                self.PositionIndex,
+                self.PlayerDataLen,
+                self.PlayerData,
+                self.Extra1,
+                self.Extra2,
+                self.Extra3,
+                self.Extra4,
+                self.Extra5,
+                self.Extra6,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+
+#------------------------------------------------------
+#游戏组合成员交互信息表,用于记录PlayerID玩家对TargetID玩家的关系信息#tagGameGroupMutualInfo
+class tagGameGroupMutualInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('Type', ctypes.c_ubyte),
+        ('GroupID', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('TargetID', ctypes.c_ulong),
+        ('Friendliness', ctypes.c_ulong),
+        ('Extra1', ctypes.c_ulong),
+        ('Extra2', ctypes.c_ulong),
+        ('Extra3', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagGameGroupMutualInfo)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'Type'] = self.Type
+        rec[u'GroupID'] = self.GroupID
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TargetID'] = self.TargetID
+        rec[u'Friendliness'] = self.Friendliness
+        rec[u'Extra1'] = self.Extra1
+        rec[u'Extra2'] = self.Extra2
+        rec[u'Extra3'] = self.Extra3
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.Type = rec.get(u'Type', 0)
+        self.GroupID = rec.get(u'GroupID', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TargetID = rec.get(u'TargetID', 0)
+        self.Friendliness = rec.get(u'Friendliness', 0)
+        self.Extra1 = rec.get(u'Extra1', 0)
+        self.Extra2 = rec.get(u'Extra2', 0)
+        self.Extra3 = rec.get(u'Extra3', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'Type':self.Type})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'Type':self.Type})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:Type = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.Type))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//游戏组合成员交互信息表,用于记录PlayerID玩家对TargetID玩家的关系信息#tagGameGroupMutualInfo:
+            Type = %s,
+            GroupID = %s,
+            PlayerID = %s,
+            TargetID = %s,
+            Friendliness = %s,
+            Extra1 = %s,
+            Extra2 = %s,
+            Extra3 = %s,
+            ADOResult = %s,
+            '''%(
+                self.Type,
+                self.GroupID,
+                self.PlayerID,
+                self.TargetID,
+                self.Friendliness,
+                self.Extra1,
+                self.Extra2,
+                self.Extra3,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.Type,
+                self.GroupID,
+                self.PlayerID,
+                self.TargetID,
+                self.Friendliness,
+                self.Extra1,
+                self.Extra2,
+                self.Extra3,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#玩家头衔表#tagPlayerDienstgrad
+class tagPlayerDienstgrad(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('GradID', ctypes.c_ulong),
+        ('CreateTime', ctypes.c_double),
+        ('State', ctypes.c_ubyte),
+        ('ExpireTime', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagPlayerDienstgrad)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'GradID'] = self.GradID
+        rec[u'CreateTime'] = self.CreateTime
+        rec[u'State'] = self.State
+        rec[u'ExpireTime'] = self.ExpireTime
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.GradID = rec.get(u'GradID', 0)
+        self.CreateTime = rec.get(u'CreateTime', 0)
+        self.State = rec.get(u'State', 0)
+        self.ExpireTime = rec.get(u'ExpireTime', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家头衔表#tagPlayerDienstgrad:
+            PlayerID = %s,
+            GradID = %s,
+            CreateTime = %s,
+            State = %s,
+            ExpireTime = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.GradID,
+                self.CreateTime,
+                self.State,
+                self.ExpireTime,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.GradID,
+                self.CreateTime,
+                self.State,
+                self.ExpireTime,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#存储玩家元宝的流量#tagAccCoins
+class tagAccCoins(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('GoldCoins', ctypes.c_ulong),
+        ('SilverCoins', ctypes.c_ulong),
+        ('UseGoldCoins', ctypes.c_ulong),
+        ('UseSilverCoins', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagAccCoins)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'GoldCoins'] = self.GoldCoins
+        rec[u'SilverCoins'] = self.SilverCoins
+        rec[u'UseGoldCoins'] = self.UseGoldCoins
+        rec[u'UseSilverCoins'] = self.UseSilverCoins
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.GoldCoins = rec.get(u'GoldCoins', 0)
+        self.SilverCoins = rec.get(u'SilverCoins', 0)
+        self.UseGoldCoins = rec.get(u'UseGoldCoins', 0)
+        self.UseSilverCoins = rec.get(u'UseSilverCoins', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'AccID':fix_incomingText(self.AccID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//存储玩家元宝的流量#tagAccCoins:
+            AccID = %s,
+            GoldCoins = %s,
+            SilverCoins = %s,
+            UseGoldCoins = %s,
+            UseSilverCoins = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.GoldCoins,
+                self.SilverCoins,
+                self.UseGoldCoins,
+                self.UseSilverCoins,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.AccID,
+                self.GoldCoins,
+                self.SilverCoins,
+                self.UseGoldCoins,
+                self.UseSilverCoins,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+
+
+#------------------------------------------------------
+#给指定玩家送出奖励的结果#tagAccIDSendPrize
+class tagAccIDSendPrize(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('CheckValue', ctypes.c_char * 33),
+        ('AccID', ctypes.c_char * 65),
+        ('PrizeID', ctypes.c_ulong),
+        ('PrizeNum', ctypes.c_ulong),
+        ('ExpiredTime', ctypes.c_double),
+        ('PrizeReason', ctypes.c_char * 20),
+        ('IsAccept', ctypes.c_ushort),
+        ('SendPrizeTime', ctypes.c_double),
+        ('GetPrizeTime', ctypes.c_double),
+        ('IsBind', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagAccIDSendPrize)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'CheckValue'] = fix_incomingText(self.CheckValue)
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'PrizeID'] = self.PrizeID
+        rec[u'PrizeNum'] = self.PrizeNum
+        rec[u'ExpiredTime'] = self.ExpiredTime
+        rec[u'PrizeReason'] = fix_incomingText(self.PrizeReason)
+        rec[u'IsAccept'] = self.IsAccept
+        rec[u'SendPrizeTime'] = self.SendPrizeTime
+        rec[u'GetPrizeTime'] = self.GetPrizeTime
+        rec[u'IsBind'] = self.IsBind
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.CheckValue = fix_outgoingText(rec.get(u'CheckValue', u''))
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.PrizeID = rec.get(u'PrizeID', 0)
+        self.PrizeNum = rec.get(u'PrizeNum', 0)
+        self.ExpiredTime = rec.get(u'ExpiredTime', 0)
+        self.PrizeReason = fix_outgoingText(rec.get(u'PrizeReason', u''))
+        self.IsAccept = rec.get(u'IsAccept', 0)
+        self.SendPrizeTime = rec.get(u'SendPrizeTime', 0)
+        self.GetPrizeTime = rec.get(u'GetPrizeTime', 0)
+        self.IsBind = rec.get(u'IsBind', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'CheckValue':fix_incomingText(self.CheckValue)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'CheckValue':fix_incomingText(self.CheckValue)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'CheckValue':fix_incomingText(self.CheckValue)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//给指定玩家送出奖励的结果#tagAccIDSendPrize:
+            CheckValue = %s,
+            AccID = %s,
+            PrizeID = %s,
+            PrizeNum = %s,
+            ExpiredTime = %s,
+            PrizeReason = %s,
+            IsAccept = %s,
+            SendPrizeTime = %s,
+            GetPrizeTime = %s,
+            IsBind = %s,
+            ADOResult = %s,
+            '''%(
+                self.CheckValue,
+                self.AccID,
+                self.PrizeID,
+                self.PrizeNum,
+                self.ExpiredTime,
+                self.PrizeReason,
+                self.IsAccept,
+                self.SendPrizeTime,
+                self.GetPrizeTime,
+                self.IsBind,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.CheckValue,
+                self.AccID,
+                self.PrizeID,
+                self.PrizeNum,
+                self.ExpiredTime,
+                self.PrizeReason,
+                self.IsAccept,
+                self.SendPrizeTime,
+                self.GetPrizeTime,
+                self.IsBind,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetCheckValue(self,Str):
+        if len(Str)<=33:
+            self.CheckValue = Str
+        else:
+            self.CheckValue = Str[:33]
+            
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetPrizeReason(self,Str):
+        if len(Str)<=20:
+            self.PrizeReason = Str
+        else:
+            self.PrizeReason = Str[:20]
+            
+
+
+#------------------------------------------------------
+#排行榜#tagDBBillboard
+class tagDBBillboard(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('Type', ctypes.c_ubyte),
+        ('ID', ctypes.c_ulong),
+        ('ID2', ctypes.c_ulong),
+        ('Name1', ctypes.c_char * 33),
+        ('Name2', ctypes.c_char * 33),
+        ('Type2', ctypes.c_ubyte),
+        ('Value1', ctypes.c_ulong),
+        ('Value2', ctypes.c_ulong),
+        ('CmpValue', ctypes.c_ulong),
+        ('CmpValue2', ctypes.c_ulong),
+        ('CmpValue3', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBBillboard)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'Type'] = self.Type
+        rec[u'ID'] = self.ID
+        rec[u'ID2'] = self.ID2
+        rec[u'Name1'] = fix_incomingText(self.Name1)
+        rec[u'Name2'] = fix_incomingText(self.Name2)
+        rec[u'Type2'] = self.Type2
+        rec[u'Value1'] = self.Value1
+        rec[u'Value2'] = self.Value2
+        rec[u'CmpValue'] = self.CmpValue
+        rec[u'CmpValue2'] = self.CmpValue2
+        rec[u'CmpValue3'] = self.CmpValue3
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.Type = rec.get(u'Type', 0)
+        self.ID = rec.get(u'ID', 0)
+        self.ID2 = rec.get(u'ID2', 0)
+        self.Name1 = fix_outgoingText(rec.get(u'Name1', u''))
+        self.Name2 = fix_outgoingText(rec.get(u'Name2', u''))
+        self.Type2 = rec.get(u'Type2', 0)
+        self.Value1 = rec.get(u'Value1', 0)
+        self.Value2 = rec.get(u'Value2', 0)
+        self.CmpValue = rec.get(u'CmpValue', 0)
+        self.CmpValue2 = rec.get(u'CmpValue2', 0)
+        self.CmpValue3 = rec.get(u'CmpValue3', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'Type':self.Type,'ID':self.ID,})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'Type':self.Type,'ID':self.ID,}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'Type':self.Type,'ID':self.ID,})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'Type':self.Type})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'Type':self.Type})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:Type = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.Type))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//排行榜#tagDBBillboard:
+            Type = %s,
+            ID = %s,
+            ID2 = %s,
+            Name1 = %s,
+            Name2 = %s,
+            Type2 = %s,
+            Value1 = %s,
+            Value2 = %s,
+            CmpValue = %s,
+            CmpValue2 = %s,
+            CmpValue3 = %s,
+            ADOResult = %s,
+            '''%(
+                self.Type,
+                self.ID,
+                self.ID2,
+                self.Name1,
+                self.Name2,
+                self.Type2,
+                self.Value1,
+                self.Value2,
+                self.CmpValue,
+                self.CmpValue2,
+                self.CmpValue3,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.Type,
+                self.ID,
+                self.ID2,
+                self.Name1,
+                self.Name2,
+                self.Type2,
+                self.Value1,
+                self.Value2,
+                self.CmpValue,
+                self.CmpValue2,
+                self.CmpValue3,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetName1(self,Str):
+        if len(Str)<=33:
+            self.Name1 = Str
+        else:
+            self.Name1 = Str[:33]
+            
+    def SetName2(self,Str):
+        if len(Str)<=33:
+            self.Name2 = Str
+        else:
+            self.Name2 = Str[:33]
+            
+
+#------------------------------------------------------
+#国家家族战排位赛表#tagDBCountryFamilyWarRace
+class tagDBCountryFamilyWarRace(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('Warindex', ctypes.c_ulong),
+        ('AttackerFamilyID', ctypes.c_ulong),
+        ('DefanceFamilyID', ctypes.c_ulong),
+        ('BattleID', ctypes.c_ulong),
+        ('Result', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBCountryFamilyWarRace)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'Warindex'] = self.Warindex
+        rec[u'AttackerFamilyID'] = self.AttackerFamilyID
+        rec[u'DefanceFamilyID'] = self.DefanceFamilyID
+        rec[u'BattleID'] = self.BattleID
+        rec[u'Result'] = self.Result
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.Warindex = rec.get(u'Warindex', 0)
+        self.AttackerFamilyID = rec.get(u'AttackerFamilyID', 0)
+        self.DefanceFamilyID = rec.get(u'DefanceFamilyID', 0)
+        self.BattleID = rec.get(u'BattleID', 0)
+        self.Result = rec.get(u'Result', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!Warindex = %s, error = %s, trycnt = %d'%(self.Warindex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!Warindex = %s, error = %s, trycnt = %d'%(self.Warindex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'Warindex':self.Warindex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'Warindex':self.Warindex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:Warindex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.Warindex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.Warindex = %s, error = %s, trycnt = %d'%(self.Warindex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//国家家族战排位赛表#tagDBCountryFamilyWarRace:
+            Warindex = %s,
+            AttackerFamilyID = %s,
+            DefanceFamilyID = %s,
+            BattleID = %s,
+            Result = %s,
+            ADOResult = %s,
+            '''%(
+                self.Warindex,
+                self.AttackerFamilyID,
+                self.DefanceFamilyID,
+                self.BattleID,
+                self.Result,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.Warindex,
+                self.AttackerFamilyID,
+                self.DefanceFamilyID,
+                self.BattleID,
+                self.Result,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#国家家族战报名表#tagDBCountryFamilyWarRequest
+class tagDBCountryFamilyWarRequest(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('FamilyID', ctypes.c_ulong),
+        ('Value', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBCountryFamilyWarRequest)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'Value'] = self.Value
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.Value = rec.get(u'Value', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'FamilyID':self.FamilyID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'FamilyID':self.FamilyID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:FamilyID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.FamilyID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//国家家族战报名表#tagDBCountryFamilyWarRequest:
+            FamilyID = %s,
+            Value = %s,
+            ADOResult = %s,
+            '''%(
+                self.FamilyID,
+                self.Value,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.FamilyID,
+                self.Value,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#国家家族战结果表#tagDBCountryFamilyWarResult
+class tagDBCountryFamilyWarResult(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('FamilyID', ctypes.c_ulong),
+        ('Billboard', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBCountryFamilyWarResult)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'Billboard'] = self.Billboard
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.Billboard = rec.get(u'Billboard', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'FamilyID':self.FamilyID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'FamilyID':self.FamilyID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:FamilyID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.FamilyID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//国家家族战结果表#tagDBCountryFamilyWarResult:
+            FamilyID = %s,
+            Billboard = %s,
+            ADOResult = %s,
+            '''%(
+                self.FamilyID,
+                self.Billboard,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.FamilyID,
+                self.Billboard,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#国家表#tagDBCountryInfo
+class tagDBCountryInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('CountryID', ctypes.c_ulong),
+        ('KingID', ctypes.c_ulong),
+        ('KingName', ctypes.c_char * 33),
+        ('KingFamilyID', ctypes.c_ulong),
+        ('KingXiHongMingCount', ctypes.c_ulong),
+        ('DrawGoldSpeaker', ctypes.c_ulong),
+        ('Revenue', ctypes.c_ulong),
+        ('KingSummonBoss', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBCountryInfo)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'CountryID'] = self.CountryID
+        rec[u'KingID'] = self.KingID
+        rec[u'KingName'] = fix_incomingText(self.KingName)
+        rec[u'KingFamilyID'] = self.KingFamilyID
+        rec[u'KingXiHongMingCount'] = self.KingXiHongMingCount
+        rec[u'DrawGoldSpeaker'] = self.DrawGoldSpeaker
+        rec[u'Revenue'] = self.Revenue
+        rec[u'KingSummonBoss'] = self.KingSummonBoss
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.CountryID = rec.get(u'CountryID', 0)
+        self.KingID = rec.get(u'KingID', 0)
+        self.KingName = fix_outgoingText(rec.get(u'KingName', u''))
+        self.KingFamilyID = rec.get(u'KingFamilyID', 0)
+        self.KingXiHongMingCount = rec.get(u'KingXiHongMingCount', 0)
+        self.DrawGoldSpeaker = rec.get(u'DrawGoldSpeaker', 0)
+        self.Revenue = rec.get(u'Revenue', 0)
+        self.KingSummonBoss = rec.get(u'KingSummonBoss', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'CountryID':self.CountryID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!CountryID = %s, error = %s, trycnt = %d'%(self.CountryID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'CountryID':self.CountryID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!CountryID = %s, error = %s, trycnt = %d'%(self.CountryID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!CountryID = %s, error = %s, trycnt = %d'%(self.CountryID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'CountryID':self.CountryID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'CountryID':self.CountryID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'CountryID':self.CountryID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:CountryID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.CountryID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.CountryID = %s, error = %s, trycnt = %d'%(self.CountryID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//国家表#tagDBCountryInfo:
+            CountryID = %s,
+            KingID = %s,
+            KingName = %s,
+            KingFamilyID = %s,
+            KingXiHongMingCount = %s,
+            DrawGoldSpeaker = %s,
+            Revenue = %s,
+            KingSummonBoss = %s,
+            ADOResult = %s,
+            '''%(
+                self.CountryID,
+                self.KingID,
+                self.KingName,
+                self.KingFamilyID,
+                self.KingXiHongMingCount,
+                self.DrawGoldSpeaker,
+                self.Revenue,
+                self.KingSummonBoss,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.CountryID,
+                self.KingID,
+                self.KingName,
+                self.KingFamilyID,
+                self.KingXiHongMingCount,
+                self.DrawGoldSpeaker,
+                self.Revenue,
+                self.KingSummonBoss,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetKingName(self,Str):
+        if len(Str)<=33:
+            self.KingName = Str
+        else:
+            self.KingName = Str[:33]         
+
+#------------------------------------------------------
+#家族行为表#tagDBFamilyAction
+class tagDBFamilyAction(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('FamilyID', ctypes.c_ulong),
+        ('ActionType', ctypes.c_ubyte),
+        ('Name', ctypes.c_char * 33),
+        ('Time', ctypes.c_double),
+        ('Value1', ctypes.c_ulong),
+        ('Value2', ctypes.c_ulong),
+        ('Value3', ctypes.c_ulong),
+        ('Value4', ctypes.c_ulong),
+        ('Value5', ctypes.c_ulong),
+        ('Value6', ctypes.c_ulong),
+        ('DataLen', ctypes.c_ushort),
+        ('Data', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.FamilyID = 0
+        self.ActionType = 0
+        self.Name = ''
+        self.Time = 0.0
+        self.Value1 = 0
+        self.Value2 = 0
+        self.Value3 = 0
+        self.Value4 = 0
+        self.Value5 = 0
+        self.Value6 = 0
+        self.DataLen = 0
+        self.Data = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ActionType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.Name, pos = CommFunc.ReadString(buf, pos, 33)
+        self.Time, pos = CommFunc.ReadDouble(buf, pos)
+        self.Value1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value5, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Value6, pos = CommFunc.ReadDWORD(buf, pos)
+        self.DataLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.DataLen)
+        self.Data = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.FamilyID)
+        buf = CommFunc.WriteBYTE(buf, self.ActionType)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.Name)
+        buf = CommFunc.WriteDouble(buf, self.Time)
+        buf = CommFunc.WriteDWORD(buf, self.Value1)
+        buf = CommFunc.WriteDWORD(buf, self.Value2)
+        buf = CommFunc.WriteDWORD(buf, self.Value3)
+        buf = CommFunc.WriteDWORD(buf, self.Value4)
+        buf = CommFunc.WriteDWORD(buf, self.Value5)
+        buf = CommFunc.WriteDWORD(buf, self.Value6)
+        buf = CommFunc.WriteWORD(buf, self.DataLen)
+        buf = CommFunc.WriteString(buf, self.DataLen, self.Data)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += self.DataLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'ActionType'] = self.ActionType
+        rec[u'Name'] = fix_incomingText(self.Name)
+        rec[u'Time'] = self.Time
+        rec[u'Value1'] = self.Value1
+        rec[u'Value2'] = self.Value2
+        rec[u'Value3'] = self.Value3
+        rec[u'Value4'] = self.Value4
+        rec[u'Value5'] = self.Value5
+        rec[u'Value6'] = self.Value6
+        rec[u'DataLen'] = self.DataLen
+        rec[u'Data'] = fix_incomingText(self.Data)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.ActionType = rec.get(u'ActionType', 0)
+        self.Name = fix_outgoingText(rec.get(u'Name', u''))
+        self.Time = rec.get(u'Time', 0)
+        self.Value1 = rec.get(u'Value1', 0)
+        self.Value2 = rec.get(u'Value2', 0)
+        self.Value3 = rec.get(u'Value3', 0)
+        self.Value4 = rec.get(u'Value4', 0)
+        self.Value5 = rec.get(u'Value5', 0)
+        self.Value6 = rec.get(u'Value6', 0)
+        self.DataLen = rec.get(u'DataLen', 0)
+        self.Data = fix_outgoingText(rec.get(u'Data', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'FamilyID':self.FamilyID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:FamilyID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.FamilyID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//家族行为表#tagDBFamilyAction:
+            FamilyID = %s,
+            ActionType = %s,
+            Name = %s,
+            Time = %s,
+            Value1 = %s,
+            Value2 = %s,
+            Value3 = %s,
+            Value4 = %s,
+            Value5 = %s,
+            Value6 = %s,
+            DataLen = %s,
+            Data = %s,
+            ADOResult = %s,
+            '''%(
+                self.FamilyID,
+                self.ActionType,
+                self.Name,
+                self.Time,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+                self.Value6,
+                self.DataLen,
+                self.Data,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.FamilyID,
+                self.ActionType,
+                self.Name,
+                self.Time,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+                self.Value6,
+                self.DataLen,
+                self.Data,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetName(self,Str):
+        if len(Str)<=33:
+            self.Name = Str
+        else:
+            self.Name = Str[:33]
+            
+
+#------------------------------------------------------
+#帮会科技表#tagDBFamilyTech
+class tagDBFamilyTech(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('FamilyID', ctypes.c_ulong),
+        ('TechID', ctypes.c_ulong),
+        ('StartTime', ctypes.c_double),
+        ('IsSpeedup', ctypes.c_ubyte),
+        ('IsBlessing', ctypes.c_ubyte),
+        ('StartBlessingTime', ctypes.c_double),
+        ('BlessingTime', ctypes.c_ulong),
+        ('TechBlessingLV', ctypes.c_ushort),
+        ('TechCurLV', ctypes.c_ushort),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBFamilyTech)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'TechID'] = self.TechID
+        rec[u'StartTime'] = self.StartTime
+        rec[u'IsSpeedup'] = self.IsSpeedup
+        rec[u'IsBlessing'] = self.IsBlessing
+        rec[u'StartBlessingTime'] = self.StartBlessingTime
+        rec[u'BlessingTime'] = self.BlessingTime
+        rec[u'TechBlessingLV'] = self.TechBlessingLV
+        rec[u'TechCurLV'] = self.TechCurLV
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.TechID = rec.get(u'TechID', 0)
+        self.StartTime = rec.get(u'StartTime', 0)
+        self.IsSpeedup = rec.get(u'IsSpeedup', 0)
+        self.IsBlessing = rec.get(u'IsBlessing', 0)
+        self.StartBlessingTime = rec.get(u'StartBlessingTime', 0)
+        self.BlessingTime = rec.get(u'BlessingTime', 0)
+        self.TechBlessingLV = rec.get(u'TechBlessingLV', 0)
+        self.TechCurLV = rec.get(u'TechCurLV', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'FamilyID':self.FamilyID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:FamilyID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.FamilyID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//帮会科技表#tagDBFamilyTech:
+            FamilyID = %s,
+            TechID = %s,
+            StartTime = %s,
+            IsSpeedup = %s,
+            IsBlessing = %s,
+            StartBlessingTime = %s,
+            BlessingTime = %s,
+            TechBlessingLV = %s,
+            TechCurLV = %s,
+            ADOResult = %s,
+            '''%(
+                self.FamilyID,
+                self.TechID,
+                self.StartTime,
+                self.IsSpeedup,
+                self.IsBlessing,
+                self.StartBlessingTime,
+                self.BlessingTime,
+                self.TechBlessingLV,
+                self.TechCurLV,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.FamilyID,
+                self.TechID,
+                self.StartTime,
+                self.IsSpeedup,
+                self.IsBlessing,
+                self.StartBlessingTime,
+                self.BlessingTime,
+                self.TechBlessingLV,
+                self.TechCurLV,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#家族战对战表#tagDBFamilyVS
+class tagDBFamilyVS(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('MapID', ctypes.c_ulong),
+        ('FamilyID', ctypes.c_ulong),
+        ('FamilyName', ctypes.c_char * 33),
+        ('VSFamilyID', ctypes.c_ulong),
+        ('VSFamilyName', ctypes.c_char * 33),
+        ('IsAccept', ctypes.c_ubyte),
+        ('RemainDate', ctypes.c_ushort),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBFamilyVS)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'MapID'] = self.MapID
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'FamilyName'] = fix_incomingText(self.FamilyName)
+        rec[u'VSFamilyID'] = self.VSFamilyID
+        rec[u'VSFamilyName'] = fix_incomingText(self.VSFamilyName)
+        rec[u'IsAccept'] = self.IsAccept
+        rec[u'RemainDate'] = self.RemainDate
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.MapID = rec.get(u'MapID', 0)
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.FamilyName = fix_outgoingText(rec.get(u'FamilyName', u''))
+        self.VSFamilyID = rec.get(u'VSFamilyID', 0)
+        self.VSFamilyName = fix_outgoingText(rec.get(u'VSFamilyName', u''))
+        self.IsAccept = rec.get(u'IsAccept', 0)
+        self.RemainDate = rec.get(u'RemainDate', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'MapID':self.MapID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'MapID':self.MapID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:MapID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.MapID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.MapID = %s, error = %s, trycnt = %d'%(self.MapID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//家族战对战表#tagDBFamilyVS:
+            MapID = %s,
+            FamilyID = %s,
+            FamilyName = %s,
+            VSFamilyID = %s,
+            VSFamilyName = %s,
+            IsAccept = %s,
+            RemainDate = %s,
+            ADOResult = %s,
+            '''%(
+                self.MapID,
+                self.FamilyID,
+                self.FamilyName,
+                self.VSFamilyID,
+                self.VSFamilyName,
+                self.IsAccept,
+                self.RemainDate,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.MapID,
+                self.FamilyID,
+                self.FamilyName,
+                self.VSFamilyID,
+                self.VSFamilyName,
+                self.IsAccept,
+                self.RemainDate,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetFamilyName(self,Str):
+        if len(Str)<=33:
+            self.FamilyName = Str
+        else:
+            self.FamilyName = Str[:33]
+            
+    def SetVSFamilyName(self,Str):
+        if len(Str)<=33:
+            self.VSFamilyName = Str
+        else:
+            self.VSFamilyName = Str[:33]
+            
+
+
+            
+
+
+#------------------------------------------------------
+#GameServer事件触发表#tagDBGameServerEventTrig
+class tagDBGameServerEventTrig(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('EventLen', ctypes.c_ulong),
+        ('EventID', ctypes.c_char_p),
+        ('IsEvent', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.EventLen = 0
+        self.EventID = ''
+        self.IsEvent = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.EventLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.EventLen)
+        self.EventID = ctypes.c_char_p(tmp)
+        self.IsEvent, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.EventLen)
+        buf = CommFunc.WriteString(buf, self.EventLen, self.EventID)
+        buf = CommFunc.WriteDWORD(buf, self.IsEvent)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += self.EventLen
+        length += sizeof(ctypes.c_ulong)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'EventLen'] = self.EventLen
+        rec[u'EventID'] = fix_incomingText(self.EventID)
+        rec[u'IsEvent'] = self.IsEvent
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.EventLen = rec.get(u'EventLen', 0)
+        self.EventID = fix_outgoingText(rec.get(u'EventID', u''))
+        self.IsEvent = rec.get(u'IsEvent', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'EventID':fix_incomingText(self.EventID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'EventID':fix_incomingText(self.EventID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'EventID':fix_incomingText(self.EventID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'EventID':fix_incomingText(self.EventID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'EventID':fix_incomingText(self.EventID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:EventID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.EventID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//GameServer事件触发表#tagDBGameServerEventTrig:
+            EventLen = %s,
+            EventID = %s,
+            IsEvent = %s,
+            ADOResult = %s,
+            '''%(
+                self.EventLen,
+                self.EventID,
+                self.IsEvent,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.EventLen,
+                self.EventID,
+                self.IsEvent,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#GM命令执行队列#tagDBGMCommandList
+class tagDBGMCommandList(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('CmdIndex', ctypes.c_ulong),
+        ('PostTime', ctypes.c_double),
+        ('GMAcc', ctypes.c_char * 65),
+        ('CMDLen', ctypes.c_ubyte),
+        ('CMD', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.CmdIndex = 0
+        self.PostTime = 0.0
+        self.GMAcc = ''
+        self.CMDLen = 0
+        self.CMD = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.CmdIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PostTime, pos = CommFunc.ReadDouble(buf, pos)
+        self.GMAcc, pos = CommFunc.ReadString(buf, pos, 65)
+        self.CMDLen, pos = CommFunc.ReadBYTE(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.CMDLen)
+        self.CMD = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.CmdIndex)
+        buf = CommFunc.WriteDouble(buf, self.PostTime)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.GMAcc)
+        buf = CommFunc.WriteBYTE(buf, self.CMDLen)
+        buf = CommFunc.WriteString(buf, self.CMDLen, self.CMD)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_ubyte)
+        length += self.CMDLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'CmdIndex'] = self.CmdIndex
+        rec[u'PostTime'] = self.PostTime
+        rec[u'GMAcc'] = fix_incomingText(self.GMAcc)
+        rec[u'CMDLen'] = self.CMDLen
+        rec[u'CMD'] = fix_incomingText(self.CMD)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.CmdIndex = rec.get(u'CmdIndex', 0)
+        self.PostTime = rec.get(u'PostTime', 0)
+        self.GMAcc = fix_outgoingText(rec.get(u'GMAcc', u''))
+        self.CMDLen = rec.get(u'CMDLen', 0)
+        self.CMD = fix_outgoingText(rec.get(u'CMD', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'CmdIndex':self.CmdIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'CmdIndex':self.CmdIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'CmdIndex':self.CmdIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'CmdIndex':self.CmdIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'CmdIndex':self.CmdIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:CmdIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.CmdIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.CmdIndex = %s, error = %s, trycnt = %d'%(self.CmdIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//GM命令执行队列#tagDBGMCommandList:
+            CmdIndex = %s,
+            PostTime = %s,
+            GMAcc = %s,
+            CMDLen = %s,
+            CMD = %s,
+            ADOResult = %s,
+            '''%(
+                self.CmdIndex,
+                self.PostTime,
+                self.GMAcc,
+                self.CMDLen,
+                self.CMD,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.CmdIndex,
+                self.PostTime,
+                self.GMAcc,
+                self.CMDLen,
+                self.CMD,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetGMAcc(self,Str):
+        if len(Str)<=65:
+            self.GMAcc = Str
+        else:
+            self.GMAcc = Str[:65]
+            
+
+
+#------------------------------------------------------
+#GMIP管理#tagDBGMIP
+class tagDBGMIP(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('AccID', ctypes.c_char * 65),
+        ('IP', ctypes.c_char * 20),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBGMIP)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'IP'] = fix_incomingText(self.IP)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.IP = fix_outgoingText(rec.get(u'IP', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//GMIP管理#tagDBGMIP:
+            AccID = %s,
+            IP = %s,
+            ADOResult = %s,
+            '''%(
+                self.AccID,
+                self.IP,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.AccID,
+                self.IP,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetIP(self,Str):
+        if len(Str)<=20:
+            self.IP = Str
+        else:
+            self.IP = Str[:20]
+            
+
+
+#------------------------------------------------------
+#元宝购买表#tagDBGoldOrderForm
+class tagDBGoldOrderForm(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('UnitPrice', ctypes.c_ulong),
+        ('LefGold', ctypes.c_ulong),
+        ('LeftTime', ctypes.c_ushort),
+        ('FormID', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBGoldOrderForm)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'UnitPrice'] = self.UnitPrice
+        rec[u'LefGold'] = self.LefGold
+        rec[u'LeftTime'] = self.LeftTime
+        rec[u'FormID'] = self.FormID
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.UnitPrice = rec.get(u'UnitPrice', 0)
+        self.LefGold = rec.get(u'LefGold', 0)
+        self.LeftTime = rec.get(u'LeftTime', 0)
+        self.FormID = rec.get(u'FormID', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PlayerID':self.PlayerID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//元宝购买表#tagDBGoldOrderForm:
+            PlayerID = %s,
+            UnitPrice = %s,
+            LefGold = %s,
+            LeftTime = %s,
+            FormID = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.UnitPrice,
+                self.LefGold,
+                self.LeftTime,
+                self.FormID,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.UnitPrice,
+                self.LefGold,
+                self.LeftTime,
+                self.FormID,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#玩家检举表#tagDBImpeach
+class tagDBImpeach(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ImpeachIndex', ctypes.c_ulong),
+        ('ProcessTime', ctypes.c_double),
+        ('PlayerAcc', ctypes.c_char * 65),
+        ('PlayerIP', ctypes.c_char * 20),
+        ('ToPlayerAcc', ctypes.c_char * 65),
+        ('ToPlayerIP', ctypes.c_char * 20),
+        ('MsgLen', ctypes.c_ushort),
+        ('Msg', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.ImpeachIndex = 0
+        self.ProcessTime = 0.0
+        self.PlayerAcc = ''
+        self.PlayerIP = ''
+        self.ToPlayerAcc = ''
+        self.ToPlayerIP = ''
+        self.MsgLen = 0
+        self.Msg = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.ImpeachIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ProcessTime, pos = CommFunc.ReadDouble(buf, pos)
+        self.PlayerAcc, pos = CommFunc.ReadString(buf, pos, 65)
+        self.PlayerIP, pos = CommFunc.ReadString(buf, pos, 20)
+        self.ToPlayerAcc, pos = CommFunc.ReadString(buf, pos, 65)
+        self.ToPlayerIP, pos = CommFunc.ReadString(buf, pos, 20)
+        self.MsgLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.MsgLen)
+        self.Msg = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.ImpeachIndex)
+        buf = CommFunc.WriteDouble(buf, self.ProcessTime)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.PlayerAcc)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 20, self.PlayerIP)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.ToPlayerAcc)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 20, self.ToPlayerIP)
+        buf = CommFunc.WriteWORD(buf, self.MsgLen)
+        buf = CommFunc.WriteString(buf, self.MsgLen, self.Msg)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_char) * 20
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_char) * 20
+        length += sizeof(ctypes.c_ushort)
+        length += self.MsgLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ImpeachIndex'] = self.ImpeachIndex
+        rec[u'ProcessTime'] = self.ProcessTime
+        rec[u'PlayerAcc'] = fix_incomingText(self.PlayerAcc)
+        rec[u'PlayerIP'] = fix_incomingText(self.PlayerIP)
+        rec[u'ToPlayerAcc'] = fix_incomingText(self.ToPlayerAcc)
+        rec[u'ToPlayerIP'] = fix_incomingText(self.ToPlayerIP)
+        rec[u'MsgLen'] = self.MsgLen
+        rec[u'Msg'] = fix_incomingText(self.Msg)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ImpeachIndex = rec.get(u'ImpeachIndex', 0)
+        self.ProcessTime = rec.get(u'ProcessTime', 0)
+        self.PlayerAcc = fix_outgoingText(rec.get(u'PlayerAcc', u''))
+        self.PlayerIP = fix_outgoingText(rec.get(u'PlayerIP', u''))
+        self.ToPlayerAcc = fix_outgoingText(rec.get(u'ToPlayerAcc', u''))
+        self.ToPlayerIP = fix_outgoingText(rec.get(u'ToPlayerIP', u''))
+        self.MsgLen = rec.get(u'MsgLen', 0)
+        self.Msg = fix_outgoingText(rec.get(u'Msg', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'ImpeachIndex':self.ImpeachIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!ImpeachIndex = %s, error = %s, trycnt = %d'%(self.ImpeachIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'ImpeachIndex':self.ImpeachIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!ImpeachIndex = %s, error = %s, trycnt = %d'%(self.ImpeachIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!ImpeachIndex = %s, error = %s, trycnt = %d'%(self.ImpeachIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'ImpeachIndex':self.ImpeachIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'ImpeachIndex':self.ImpeachIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'ImpeachIndex':self.ImpeachIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:ImpeachIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.ImpeachIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.ImpeachIndex = %s, error = %s, trycnt = %d'%(self.ImpeachIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家检举表#tagDBImpeach:
+            ImpeachIndex = %s,
+            ProcessTime = %s,
+            PlayerAcc = %s,
+            PlayerIP = %s,
+            ToPlayerAcc = %s,
+            ToPlayerIP = %s,
+            MsgLen = %s,
+            Msg = %s,
+            ADOResult = %s,
+            '''%(
+                self.ImpeachIndex,
+                self.ProcessTime,
+                self.PlayerAcc,
+                self.PlayerIP,
+                self.ToPlayerAcc,
+                self.ToPlayerIP,
+                self.MsgLen,
+                self.Msg,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.ImpeachIndex,
+                self.ProcessTime,
+                self.PlayerAcc,
+                self.PlayerIP,
+                self.ToPlayerAcc,
+                self.ToPlayerIP,
+                self.MsgLen,
+                self.Msg,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetPlayerAcc(self,Str):
+        if len(Str)<=65:
+            self.PlayerAcc = Str
+        else:
+            self.PlayerAcc = Str[:65]
+            
+    def SetPlayerIP(self,Str):
+        if len(Str)<=20:
+            self.PlayerIP = Str
+        else:
+            self.PlayerIP = Str[:20]
+            
+    def SetToPlayerAcc(self,Str):
+        if len(Str)<=65:
+            self.ToPlayerAcc = Str
+        else:
+            self.ToPlayerAcc = Str[:65]
+            
+    def SetToPlayerIP(self,Str):
+        if len(Str)<=20:
+            self.ToPlayerIP = Str
+        else:
+            self.ToPlayerIP = Str[:20]
+            
+
+
+#------------------------------------------------------
+#IP管理列表#tagDBIPManage
+class tagDBIPManage(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('IPIndex', ctypes.c_ulong),
+        ('IP', ctypes.c_char * 20),
+        ('Oper', ctypes.c_ushort),
+        ('MsgLen', ctypes.c_ushort),
+        ('Msg', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.IPIndex = 0
+        self.IP = ''
+        self.Oper = 0
+        self.MsgLen = 0
+        self.Msg = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.IPIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.IP, pos = CommFunc.ReadString(buf, pos, 20)
+        self.Oper, pos = CommFunc.ReadWORD(buf, pos)
+        self.MsgLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.MsgLen)
+        self.Msg = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.IPIndex)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 20, self.IP)
+        buf = CommFunc.WriteWORD(buf, self.Oper)
+        buf = CommFunc.WriteWORD(buf, self.MsgLen)
+        buf = CommFunc.WriteString(buf, self.MsgLen, self.Msg)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 20
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += self.MsgLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'IPIndex'] = self.IPIndex
+        rec[u'IP'] = fix_incomingText(self.IP)
+        rec[u'Oper'] = self.Oper
+        rec[u'MsgLen'] = self.MsgLen
+        rec[u'Msg'] = fix_incomingText(self.Msg)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.IPIndex = rec.get(u'IPIndex', 0)
+        self.IP = fix_outgoingText(rec.get(u'IP', u''))
+        self.Oper = rec.get(u'Oper', 0)
+        self.MsgLen = rec.get(u'MsgLen', 0)
+        self.Msg = fix_outgoingText(rec.get(u'Msg', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'IPIndex':self.IPIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!IPIndex = %s, error = %s, trycnt = %d'%(self.IPIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'IPIndex':self.IPIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!IPIndex = %s, error = %s, trycnt = %d'%(self.IPIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!IPIndex = %s, error = %s, trycnt = %d'%(self.IPIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'IPIndex':self.IPIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'IPIndex':self.IPIndex})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'IPIndex':self.IPIndex})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:IPIndex = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.IPIndex))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.IPIndex = %s, error = %s, trycnt = %d'%(self.IPIndex, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//IP管理列表#tagDBIPManage:
+            IPIndex = %s,
+            IP = %s,
+            Oper = %s,
+            MsgLen = %s,
+            Msg = %s,
+            ADOResult = %s,
+            '''%(
+                self.IPIndex,
+                self.IP,
+                self.Oper,
+                self.MsgLen,
+                self.Msg,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.IPIndex,
+                self.IP,
+                self.Oper,
+                self.MsgLen,
+                self.Msg,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetIP(self,Str):
+        if len(Str)<=20:
+            self.IP = Str
+        else:
+            self.IP = Str[:20]
+            
+
+
+#------------------------------------------------------
+#邮件物品列表#tagDBMailItemList
+class tagDBMailItemList(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('MailID', ctypes.c_char * 40),
+        ('ItemIndex', ctypes.c_ubyte),
+        ('ItemGUID', ctypes.c_char * 40),
+        ('ItemID', ctypes.c_ulong),
+        ('Count', ctypes.c_ushort),
+        ('ItemStarLV', ctypes.c_ubyte),
+        ('IdentifyPar', ctypes.c_ubyte),
+        ('CurDurg', ctypes.c_ulong),
+        ('MaxDurg', ctypes.c_ulong),
+        ('CanPlaceStoneCount', ctypes.c_ubyte),
+        ('ItemProperty', ctypes.c_ubyte),
+        ('SoulProperty', ctypes.c_ushort),
+        ('Maker', ctypes.c_ulong),
+        ('MakerName', ctypes.c_char * 33),
+        ('Stone1', ctypes.c_ushort),
+        ('Stone2', ctypes.c_ushort),
+        ('Stone3', ctypes.c_ushort),
+        ('Stone4', ctypes.c_ushort),
+        ('Stone5', ctypes.c_ushort),
+        ('Stone6', ctypes.c_ushort),
+        ('Stone7', ctypes.c_ushort),
+        ('Stone8', ctypes.c_ushort),
+        ('Stone9', ctypes.c_ushort),
+        ('UserDataLen', ctypes.c_ulong),
+        ('UserData', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.MailID = ''
+        self.ItemIndex = 0
+        self.ItemGUID = ''
+        self.ItemID = 0
+        self.Count = 0
+        self.ItemStarLV = 0
+        self.IdentifyPar = 0
+        self.CurDurg = 0
+        self.MaxDurg = 0
+        self.CanPlaceStoneCount = 0
+        self.ItemProperty = 0
+        self.SoulProperty = 0
+        self.Maker = 0
+        self.MakerName = ''
+        self.Stone1 = 0
+        self.Stone2 = 0
+        self.Stone3 = 0
+        self.Stone4 = 0
+        self.Stone5 = 0
+        self.Stone6 = 0
+        self.Stone7 = 0
+        self.Stone8 = 0
+        self.Stone9 = 0
+        self.UserDataLen = 0
+        self.UserData = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.MailID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.ItemIndex, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemGUID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.ItemID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Count, pos = CommFunc.ReadWORD(buf, pos)
+        self.ItemStarLV, pos = CommFunc.ReadBYTE(buf, pos)
+        self.IdentifyPar, pos = CommFunc.ReadBYTE(buf, pos)
+        self.CurDurg, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MaxDurg, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CanPlaceStoneCount, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemProperty, pos = CommFunc.ReadBYTE(buf, pos)
+        self.SoulProperty, pos = CommFunc.ReadWORD(buf, pos)
+        self.Maker, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MakerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.Stone1, pos = CommFunc.ReadWORD(buf, pos)
+        self.Stone2, pos = CommFunc.ReadWORD(buf, pos)
+        self.Stone3, pos = CommFunc.ReadWORD(buf, pos)
+        self.Stone4, pos = CommFunc.ReadWORD(buf, pos)
+        self.Stone5, pos = CommFunc.ReadWORD(buf, pos)
+        self.Stone6, pos = CommFunc.ReadWORD(buf, pos)
+        self.Stone7, pos = CommFunc.ReadWORD(buf, pos)
+        self.Stone8, pos = CommFunc.ReadWORD(buf, pos)
+        self.Stone9, pos = CommFunc.ReadWORD(buf, pos)
+        self.UserDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.MailID)
+        buf = CommFunc.WriteBYTE(buf, self.ItemIndex)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.ItemGUID)
+        buf = CommFunc.WriteDWORD(buf, self.ItemID)
+        buf = CommFunc.WriteWORD(buf, self.Count)
+        buf = CommFunc.WriteBYTE(buf, self.ItemStarLV)
+        buf = CommFunc.WriteBYTE(buf, self.IdentifyPar)
+        buf = CommFunc.WriteDWORD(buf, self.CurDurg)
+        buf = CommFunc.WriteDWORD(buf, self.MaxDurg)
+        buf = CommFunc.WriteBYTE(buf, self.CanPlaceStoneCount)
+        buf = CommFunc.WriteBYTE(buf, self.ItemProperty)
+        buf = CommFunc.WriteWORD(buf, self.SoulProperty)
+        buf = CommFunc.WriteDWORD(buf, self.Maker)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.MakerName)
+        buf = CommFunc.WriteWORD(buf, self.Stone1)
+        buf = CommFunc.WriteWORD(buf, self.Stone2)
+        buf = CommFunc.WriteWORD(buf, self.Stone3)
+        buf = CommFunc.WriteWORD(buf, self.Stone4)
+        buf = CommFunc.WriteWORD(buf, self.Stone5)
+        buf = CommFunc.WriteWORD(buf, self.Stone6)
+        buf = CommFunc.WriteWORD(buf, self.Stone7)
+        buf = CommFunc.WriteWORD(buf, self.Stone8)
+        buf = CommFunc.WriteWORD(buf, self.Stone9)
+        buf = CommFunc.WriteDWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += self.UserDataLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'MailID'] = fix_incomingText(self.MailID)
+        rec[u'ItemIndex'] = self.ItemIndex
+        rec[u'ItemGUID'] = fix_incomingText(self.ItemGUID)
+        rec[u'ItemID'] = self.ItemID
+        rec[u'Count'] = self.Count
+        rec[u'ItemStarLV'] = self.ItemStarLV
+        rec[u'IdentifyPar'] = self.IdentifyPar
+        rec[u'CurDurg'] = self.CurDurg
+        rec[u'MaxDurg'] = self.MaxDurg
+        rec[u'CanPlaceStoneCount'] = self.CanPlaceStoneCount
+        rec[u'ItemProperty'] = self.ItemProperty
+        rec[u'SoulProperty'] = self.SoulProperty
+        rec[u'Maker'] = self.Maker
+        rec[u'MakerName'] = fix_incomingText(self.MakerName)
+        rec[u'Stone1'] = self.Stone1
+        rec[u'Stone2'] = self.Stone2
+        rec[u'Stone3'] = self.Stone3
+        rec[u'Stone4'] = self.Stone4
+        rec[u'Stone5'] = self.Stone5
+        rec[u'Stone6'] = self.Stone6
+        rec[u'Stone7'] = self.Stone7
+        rec[u'Stone8'] = self.Stone8
+        rec[u'Stone9'] = self.Stone9
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.MailID = fix_outgoingText(rec.get(u'MailID', u''))
+        self.ItemIndex = rec.get(u'ItemIndex', 0)
+        self.ItemGUID = fix_outgoingText(rec.get(u'ItemGUID', u''))
+        self.ItemID = rec.get(u'ItemID', 0)
+        self.Count = rec.get(u'Count', 0)
+        self.ItemStarLV = rec.get(u'ItemStarLV', 0)
+        self.IdentifyPar = rec.get(u'IdentifyPar', 0)
+        self.CurDurg = rec.get(u'CurDurg', 0)
+        self.MaxDurg = rec.get(u'MaxDurg', 0)
+        self.CanPlaceStoneCount = rec.get(u'CanPlaceStoneCount', 0)
+        self.ItemProperty = rec.get(u'ItemProperty', 0)
+        self.SoulProperty = rec.get(u'SoulProperty', 0)
+        self.Maker = rec.get(u'Maker', 0)
+        self.MakerName = fix_outgoingText(rec.get(u'MakerName', u''))
+        self.Stone1 = rec.get(u'Stone1', 0)
+        self.Stone2 = rec.get(u'Stone2', 0)
+        self.Stone3 = rec.get(u'Stone3', 0)
+        self.Stone4 = rec.get(u'Stone4', 0)
+        self.Stone5 = rec.get(u'Stone5', 0)
+        self.Stone6 = rec.get(u'Stone6', 0)
+        self.Stone7 = rec.get(u'Stone7', 0)
+        self.Stone8 = rec.get(u'Stone8', 0)
+        self.Stone9 = rec.get(u'Stone9', 0)
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!MailID = %s, error = %s, trycnt = %d'%(self.MailID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!MailID = %s, error = %s, trycnt = %d'%(self.MailID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'MailID':fix_incomingText(self.MailID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'MailID':fix_incomingText(self.MailID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:MailID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.MailID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.MailID = %s, error = %s, trycnt = %d'%(self.MailID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//邮件物品列表#tagDBMailItemList:
+            MailID = %s,
+            ItemIndex = %s,
+            ItemGUID = %s,
+            ItemID = %s,
+            Count = %s,
+            ItemStarLV = %s,
+            IdentifyPar = %s,
+            CurDurg = %s,
+            MaxDurg = %s,
+            CanPlaceStoneCount = %s,
+            ItemProperty = %s,
+            SoulProperty = %s,
+            Maker = %s,
+            MakerName = %s,
+            Stone1 = %s,
+            Stone2 = %s,
+            Stone3 = %s,
+            Stone4 = %s,
+            Stone5 = %s,
+            Stone6 = %s,
+            Stone7 = %s,
+            Stone8 = %s,
+            Stone9 = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            ADOResult = %s,
+            '''%(
+                self.MailID,
+                self.ItemIndex,
+                self.ItemGUID,
+                self.ItemID,
+                self.Count,
+                self.ItemStarLV,
+                self.IdentifyPar,
+                self.CurDurg,
+                self.MaxDurg,
+                self.CanPlaceStoneCount,
+                self.ItemProperty,
+                self.SoulProperty,
+                self.Maker,
+                self.MakerName,
+                self.Stone1,
+                self.Stone2,
+                self.Stone3,
+                self.Stone4,
+                self.Stone5,
+                self.Stone6,
+                self.Stone7,
+                self.Stone8,
+                self.Stone9,
+                self.UserDataLen,
+                self.UserData,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.MailID,
+                self.ItemIndex,
+                self.ItemGUID,
+                self.ItemID,
+                self.Count,
+                self.ItemStarLV,
+                self.IdentifyPar,
+                self.CurDurg,
+                self.MaxDurg,
+                self.CanPlaceStoneCount,
+                self.ItemProperty,
+                self.SoulProperty,
+                self.Maker,
+                self.MakerName,
+                self.Stone1,
+                self.Stone2,
+                self.Stone3,
+                self.Stone4,
+                self.Stone5,
+                self.Stone6,
+                self.Stone7,
+                self.Stone8,
+                self.Stone9,
+                self.UserDataLen,
+                self.UserData,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetMailID(self,Str):
+        if len(Str)<=40:
+            self.MailID = Str
+        else:
+            self.MailID = Str[:40]
+            
+    def SetItemGUID(self,Str):
+        if len(Str)<=40:
+            self.ItemGUID = Str
+        else:
+            self.ItemGUID = Str[:40]
+            
+    def SetMakerName(self,Str):
+        if len(Str)<=33:
+            self.MakerName = Str
+        else:
+            self.MakerName = Str[:33]
+
+#------------------------------------------------------
+#邮件列表#tagDBMailList
+class tagDBMailList(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('SenderID', ctypes.c_ulong),
+        ('ReceverID', ctypes.c_ulong),
+        ('MailID', ctypes.c_char * 40),
+        ('MailType', ctypes.c_ubyte),
+        ('SenderName', ctypes.c_char * 33),
+        ('Title', ctypes.c_char * 21),
+        ('Money', ctypes.c_ulong),
+        ('LetterType', ctypes.c_ubyte),
+        ('ExistTime', ctypes.c_ubyte),
+        ('ContentLen', ctypes.c_ushort),
+        ('Content', ctypes.c_char_p),
+        ('TitleUseSysMessage', ctypes.c_ubyte),
+        ('ContentUseSysMessage', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.SenderID = 0
+        self.ReceverID = 0
+        self.MailID = ''
+        self.MailType = 0
+        self.SenderName = ''
+        self.Title = ''
+        self.Money = 0
+        self.LetterType = 0
+        self.ExistTime = 0
+        self.ContentLen = 0
+        self.Content = ''
+        self.TitleUseSysMessage = 0
+        self.ContentUseSysMessage = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.SenderID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ReceverID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MailID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.MailType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.SenderName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.Title, pos = CommFunc.ReadString(buf, pos, 21)
+        self.Money, pos = CommFunc.ReadDWORD(buf, pos)
+        self.LetterType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ExistTime, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ContentLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.ContentLen)
+        self.Content = ctypes.c_char_p(tmp)
+        self.TitleUseSysMessage, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ContentUseSysMessage, pos = CommFunc.ReadBYTE(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.SenderID)
+        buf = CommFunc.WriteDWORD(buf, self.ReceverID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.MailID)
+        buf = CommFunc.WriteBYTE(buf, self.MailType)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.SenderName)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 21, self.Title)
+        buf = CommFunc.WriteDWORD(buf, self.Money)
+        buf = CommFunc.WriteBYTE(buf, self.LetterType)
+        buf = CommFunc.WriteBYTE(buf, self.ExistTime)
+        buf = CommFunc.WriteWORD(buf, self.ContentLen)
+        buf = CommFunc.WriteString(buf, self.ContentLen, self.Content)
+        buf = CommFunc.WriteBYTE(buf, self.TitleUseSysMessage)
+        buf = CommFunc.WriteBYTE(buf, self.ContentUseSysMessage)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_char) * 21
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += self.ContentLen
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'SenderID'] = self.SenderID
+        rec[u'ReceverID'] = self.ReceverID
+        rec[u'MailID'] = fix_incomingText(self.MailID)
+        rec[u'MailType'] = self.MailType
+        rec[u'SenderName'] = fix_incomingText(self.SenderName)
+        rec[u'Title'] = fix_incomingText(self.Title)
+        rec[u'Money'] = self.Money
+        rec[u'LetterType'] = self.LetterType
+        rec[u'ExistTime'] = self.ExistTime
+        rec[u'ContentLen'] = self.ContentLen
+        rec[u'Content'] = fix_incomingText(self.Content)
+        rec[u'TitleUseSysMessage'] = self.TitleUseSysMessage
+        rec[u'ContentUseSysMessage'] = self.ContentUseSysMessage
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.SenderID = rec.get(u'SenderID', 0)
+        self.ReceverID = rec.get(u'ReceverID', 0)
+        self.MailID = fix_outgoingText(rec.get(u'MailID', u''))
+        self.MailType = rec.get(u'MailType', 0)
+        self.SenderName = fix_outgoingText(rec.get(u'SenderName', u''))
+        self.Title = fix_outgoingText(rec.get(u'Title', u''))
+        self.Money = rec.get(u'Money', 0)
+        self.LetterType = rec.get(u'LetterType', 0)
+        self.ExistTime = rec.get(u'ExistTime', 0)
+        self.ContentLen = rec.get(u'ContentLen', 0)
+        self.Content = fix_outgoingText(rec.get(u'Content', u''))
+        self.TitleUseSysMessage = rec.get(u'TitleUseSysMessage', 0)
+        self.ContentUseSysMessage = rec.get(u'ContentUseSysMessage', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'MailID':fix_incomingText(self.MailID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!MailID = %s, error = %s, trycnt = %d'%(self.MailID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'MailID':fix_incomingText(self.MailID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!MailID = %s, error = %s, trycnt = %d'%(self.MailID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!MailID = %s, error = %s, trycnt = %d'%(self.MailID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'MailID':fix_incomingText(self.MailID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'MailID':fix_incomingText(self.MailID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'MailID':fix_incomingText(self.MailID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:MailID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.MailID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.MailID = %s, error = %s, trycnt = %d'%(self.MailID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//邮件列表#tagDBMailList:
+            SenderID = %s,
+            ReceverID = %s,
+            MailID = %s,
+            MailType = %s,
+            SenderName = %s,
+            Title = %s,
+            Money = %s,
+            LetterType = %s,
+            ExistTime = %s,
+            ContentLen = %s,
+            Content = %s,
+            TitleUseSysMessage = %s,
+            ContentUseSysMessage = %s,
+            ADOResult = %s,
+            '''%(
+                self.SenderID,
+                self.ReceverID,
+                self.MailID,
+                self.MailType,
+                self.SenderName,
+                self.Title,
+                self.Money,
+                self.LetterType,
+                self.ExistTime,
+                self.ContentLen,
+                self.Content,
+                self.TitleUseSysMessage,
+                self.ContentUseSysMessage,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.SenderID,
+                self.ReceverID,
+                self.MailID,
+                self.MailType,
+                self.SenderName,
+                self.Title,
+                self.Money,
+                self.LetterType,
+                self.ExistTime,
+                self.ContentLen,
+                self.Content,
+                self.TitleUseSysMessage,
+                self.ContentUseSysMessage,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetMailID(self,Str):
+        if len(Str)<=40:
+            self.MailID = Str
+        else:
+            self.MailID = Str[:40]
+            
+    def SetSenderName(self,Str):
+        if len(Str)<=33:
+            self.SenderName = Str
+        else:
+            self.SenderName = Str[:33]
+            
+    def SetTitle(self,Str):
+        if len(Str)<=21:
+            self.Title = Str
+        else:
+            self.Title = Str[:21]
+
+#------------------------------------------------------
+#地图服务器状态#tagDBMapServerInfo
+class tagDBMapServerInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('LogIndex', ctypes.c_ulong),
+        ('LogID', ctypes.c_ulong),
+        ('Msg', ctypes.c_char * 20),
+        ('Value', ctypes.c_ulong),
+        ('Time', ctypes.c_double),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBMapServerInfo)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'LogIndex'] = self.LogIndex
+        rec[u'LogID'] = self.LogID
+        rec[u'Msg'] = fix_incomingText(self.Msg)
+        rec[u'Value'] = self.Value
+        rec[u'Time'] = self.Time
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.LogIndex = rec.get(u'LogIndex', 0)
+        self.LogID = rec.get(u'LogID', 0)
+        self.Msg = fix_outgoingText(rec.get(u'Msg', u''))
+        self.Value = rec.get(u'Value', 0)
+        self.Time = rec.get(u'Time', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!LogID = %s, error = %s, trycnt = %d'%(self.LogID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'LogIndex':self.LogIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!LogID = %s, error = %s, trycnt = %d'%(self.LogID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!LogID = %s, error = %s, trycnt = %d'%(self.LogID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'LogIndex':self.LogIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'LogID':self.LogID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'LogID':self.LogID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:LogID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.LogID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.LogID = %s, error = %s, trycnt = %d'%(self.LogID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//地图服务器状态#tagDBMapServerInfo:
+            LogIndex = %s,
+            LogID = %s,
+            Msg = %s,
+            Value = %s,
+            Time = %s,
+            ADOResult = %s,
+            '''%(
+                self.LogIndex,
+                self.LogID,
+                self.Msg,
+                self.Value,
+                self.Time,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.LogIndex,
+                self.LogID,
+                self.Msg,
+                self.Value,
+                self.Time,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetMsg(self,Str):
+        if len(Str)<=20:
+            self.Msg = Str
+        else:
+            self.Msg = Str[:20]
+            
+
+
+#------------------------------------------------------
+#任务发布表#tagDBMissionPub
+class tagDBMissionPub(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('MissionID', ctypes.c_ulong),
+        ('MissinoPubType', ctypes.c_ubyte),
+        ('PubID', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBMissionPub)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'MissionID'] = self.MissionID
+        rec[u'MissinoPubType'] = self.MissinoPubType
+        rec[u'PubID'] = self.PubID
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.MissionID = rec.get(u'MissionID', 0)
+        self.MissinoPubType = rec.get(u'MissinoPubType', 0)
+        self.PubID = rec.get(u'PubID', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!MissionID = %s, error = %s, trycnt = %d'%(self.MissionID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!MissionID = %s, error = %s, trycnt = %d'%(self.MissionID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'MissionID':self.MissionID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'MissionID':self.MissionID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:MissionID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.MissionID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.MissionID = %s, error = %s, trycnt = %d'%(self.MissionID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//任务发布表#tagDBMissionPub:
+            MissionID = %s,
+            MissinoPubType = %s,
+            PubID = %s,
+            ADOResult = %s,
+            '''%(
+                self.MissionID,
+                self.MissinoPubType,
+                self.PubID,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.MissionID,
+                self.MissinoPubType,
+                self.PubID,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#新手卡状态#tagDBNewGuyCardState
+class tagDBNewGuyCardState(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('CardIDLen', ctypes.c_ubyte),
+        ('CardID', ctypes.c_char_p),
+        ('IsUsed', ctypes.c_ubyte),
+        ('UserDataLen', ctypes.c_ulong),
+        ('UserData', ctypes.c_char_p),
+        ('CardType', ctypes.c_ubyte),
+        ('ValidTime', ctypes.c_char * 20),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.CardIDLen = 0
+        self.CardID = ''
+        self.IsUsed = 0
+        self.UserDataLen = 0
+        self.UserData = ''
+        self.CardType = 0
+        self.ValidTime = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.CardIDLen, pos = CommFunc.ReadBYTE(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.CardIDLen)
+        self.CardID = ctypes.c_char_p(tmp)
+        self.IsUsed, pos = CommFunc.ReadBYTE(buf, pos)
+        self.UserDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        self.CardType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ValidTime, pos = CommFunc.ReadString(buf, pos, 20)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteBYTE(buf, self.CardIDLen)
+        buf = CommFunc.WriteString(buf, self.CardIDLen, self.CardID)
+        buf = CommFunc.WriteBYTE(buf, self.IsUsed)
+        buf = CommFunc.WriteDWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        buf = CommFunc.WriteBYTE(buf, self.CardType)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 20, self.ValidTime)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ubyte)
+        length += self.CardIDLen
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += self.UserDataLen
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_char) * 20
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'CardIDLen'] = self.CardIDLen
+        rec[u'CardID'] = fix_incomingText(self.CardID)
+        rec[u'IsUsed'] = self.IsUsed
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        rec[u'CardType'] = self.CardType
+        rec[u'ValidTime'] = fix_incomingText(self.ValidTime)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.CardIDLen = rec.get(u'CardIDLen', 0)
+        self.CardID = fix_outgoingText(rec.get(u'CardID', u''))
+        self.IsUsed = rec.get(u'IsUsed', 0)
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+        self.CardType = rec.get(u'CardType', 0)
+        self.ValidTime = fix_outgoingText(rec.get(u'ValidTime', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'CardID':fix_incomingText(self.CardID)})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!CardID = %s, error = %s, trycnt = %d'%(self.CardID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'CardID':fix_incomingText(self.CardID)}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!CardID = %s, error = %s, trycnt = %d'%(self.CardID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!CardID = %s, error = %s, trycnt = %d'%(self.CardID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'CardID':fix_incomingText(self.CardID)})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'CardID':fix_incomingText(self.CardID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'CardID':fix_incomingText(self.CardID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:CardID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.CardID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.CardID = %s, error = %s, trycnt = %d'%(self.CardID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//新手卡状态#tagDBNewGuyCardState:
+            CardIDLen = %s,
+            CardID = %s,
+            IsUsed = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            CardType = %s,
+            ValidTime = %s,
+            ADOResult = %s,
+            '''%(
+                self.CardIDLen,
+                self.CardID,
+                self.IsUsed,
+                self.UserDataLen,
+                self.UserData,
+                self.CardType,
+                self.ValidTime,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.CardIDLen,
+                self.CardID,
+                self.IsUsed,
+                self.UserDataLen,
+                self.UserData,
+                self.CardType,
+                self.ValidTime,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetValidTime(self,Str):
+        if len(Str)<=20:
+            self.ValidTime = Str
+        else:
+            self.ValidTime = Str[:20]
+            
+
+
+#------------------------------------------------------
+#过期元宝购买表#tagDBOverdueGoldOrderForm
+class tagDBOverdueGoldOrderForm(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('LefSilver', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBOverdueGoldOrderForm)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'LefSilver'] = self.LefSilver
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.LefSilver = rec.get(u'LefSilver', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PlayerID':self.PlayerID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//过期元宝购买表#tagDBOverdueGoldOrderForm:
+            PlayerID = %s,
+            LefSilver = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.LefSilver,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.PlayerID,
+                self.LefSilver,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#玩家改名记录#tagDBPlayerChangeNameLog
+class tagDBPlayerChangeNameLog(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('SrcPlayerID', ctypes.c_ulong),
+        ('OldPlayerName', ctypes.c_char * 15),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayerChangeNameLog)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'SrcPlayerID'] = self.SrcPlayerID
+        rec[u'OldPlayerName'] = fix_incomingText(self.OldPlayerName)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.SrcPlayerID = rec.get(u'SrcPlayerID', 0)
+        self.OldPlayerName = fix_outgoingText(rec.get(u'OldPlayerName', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PlayerID':self.PlayerID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家改名记录#tagDBPlayerChangeNameLog:
+            PlayerID = %s,
+            SrcPlayerID = %s,
+            OldPlayerName = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.SrcPlayerID,
+                self.OldPlayerName,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.SrcPlayerID,
+                self.OldPlayerName,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetOldPlayerName(self,Str):
+        if len(Str)<=15:
+            self.OldPlayerName = Str
+        else:
+            self.OldPlayerName = Str[:15]
+            
+
+
+#------------------------------------------------------
+#修改账户状态#tagDBPlayer_ChangeAccState
+class tagDBPlayer_ChangeAccState(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('AccState', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayer_ChangeAccState)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'AccState'] = self.AccState
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.AccState = rec.get(u'AccState', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//修改账户状态#tagDBPlayer_ChangeAccState:
+            PlayerID = %s,
+            AccState = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.AccState,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.PlayerID,
+                self.AccState,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#玩家合服改名#tagDBPlayer_ChangeName
+class tagDBPlayer_ChangeName(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('PlayerName', ctypes.c_char * 33),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayer_ChangeName)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家合服改名#tagDBPlayer_ChangeName:
+            PlayerID = %s,
+            PlayerName = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.PlayerName,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.PlayerID,
+                self.PlayerName,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+#------------------------------------------------------
+#玩家删除角色刷新#tagDBPlayer_DeleteRoleUpdateRole
+class tagDBPlayer_DeleteRoleUpdateRole(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('DeletePlayerID', ctypes.c_ulong),
+        ('UpdatePlayerID', ctypes.c_ulong),
+        ('Gold', ctypes.c_ulong),
+        ('GoldPaper', ctypes.c_ulong),
+        ('Silver', ctypes.c_ulong),
+        ('SilverPaper', ctypes.c_ulong),
+        ('WarehouseGold', ctypes.c_ulong),
+        ('WarehouseSilver', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPlayer_DeleteRoleUpdateRole)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'DeletePlayerID'] = self.DeletePlayerID
+        rec[u'UpdatePlayerID'] = self.UpdatePlayerID
+        rec[u'Gold'] = self.Gold
+        rec[u'GoldPaper'] = self.GoldPaper
+        rec[u'Silver'] = self.Silver
+        rec[u'SilverPaper'] = self.SilverPaper
+        rec[u'WarehouseGold'] = self.WarehouseGold
+        rec[u'WarehouseSilver'] = self.WarehouseSilver
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.DeletePlayerID = rec.get(u'DeletePlayerID', 0)
+        self.UpdatePlayerID = rec.get(u'UpdatePlayerID', 0)
+        self.Gold = rec.get(u'Gold', 0)
+        self.GoldPaper = rec.get(u'GoldPaper', 0)
+        self.Silver = rec.get(u'Silver', 0)
+        self.SilverPaper = rec.get(u'SilverPaper', 0)
+        self.WarehouseGold = rec.get(u'WarehouseGold', 0)
+        self.WarehouseSilver = rec.get(u'WarehouseSilver', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!DeletePlayerID = %s, error = %s, trycnt = %d'%(self.DeletePlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!DeletePlayerID = %s, error = %s, trycnt = %d'%(self.DeletePlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'DeletePlayerID':self.DeletePlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'DeletePlayerID':self.DeletePlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:DeletePlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.DeletePlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.DeletePlayerID = %s, error = %s, trycnt = %d'%(self.DeletePlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家删除角色刷新#tagDBPlayer_DeleteRoleUpdateRole:
+            DeletePlayerID = %s,
+            UpdatePlayerID = %s,
+            Gold = %s,
+            GoldPaper = %s,
+            Silver = %s,
+            SilverPaper = %s,
+            WarehouseGold = %s,
+            WarehouseSilver = %s,
+            ADOResult = %s,
+            '''%(
+                self.DeletePlayerID,
+                self.UpdatePlayerID,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.WarehouseGold,
+                self.WarehouseSilver,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.DeletePlayerID,
+                self.UpdatePlayerID,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.WarehouseGold,
+                self.WarehouseSilver,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#存储系统邮件#tagDBMailList_SaveSysMail
+class tagDBMailList_SaveSysMail(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('SenderID', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('MailID', ctypes.c_char * 40),
+        ('MailType', ctypes.c_ubyte),
+        ('SenderName', ctypes.c_char * 33),
+        ('Title', ctypes.c_char * 21),
+        ('Money', ctypes.c_ulong),
+        ('LetterType', ctypes.c_ubyte),
+        ('ExistTime', ctypes.c_ubyte),
+        ('ContentLen', ctypes.c_ushort),
+        ('Content', ctypes.c_char_p),
+        ('TitleUseSysMessage', ctypes.c_ubyte),
+        ('ContentUseSysMessage', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.SenderID = 0
+        self.AccID = ''
+        self.MailID = ''
+        self.MailType = 0
+        self.SenderName = ''
+        self.Title = ''
+        self.Money = 0
+        self.LetterType = 0
+        self.ExistTime = 0
+        self.ContentLen = 0
+        self.Content = ''
+        self.TitleUseSysMessage = 0
+        self.ContentUseSysMessage = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.SenderID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AccID, pos = CommFunc.ReadString(buf, pos, 65)
+        self.MailID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.MailType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.SenderName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.Title, pos = CommFunc.ReadString(buf, pos, 21)
+        self.Money, pos = CommFunc.ReadDWORD(buf, pos)
+        self.LetterType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ExistTime, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ContentLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.ContentLen)
+        self.Content = ctypes.c_char_p(tmp)
+        self.TitleUseSysMessage, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ContentUseSysMessage, pos = CommFunc.ReadBYTE(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.SenderID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.AccID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.MailID)
+        buf = CommFunc.WriteBYTE(buf, self.MailType)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.SenderName)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 21, self.Title)
+        buf = CommFunc.WriteDWORD(buf, self.Money)
+        buf = CommFunc.WriteBYTE(buf, self.LetterType)
+        buf = CommFunc.WriteBYTE(buf, self.ExistTime)
+        buf = CommFunc.WriteWORD(buf, self.ContentLen)
+        buf = CommFunc.WriteString(buf, self.ContentLen, self.Content)
+        buf = CommFunc.WriteBYTE(buf, self.TitleUseSysMessage)
+        buf = CommFunc.WriteBYTE(buf, self.ContentUseSysMessage)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_char) * 21
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += self.ContentLen
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'SenderID'] = self.SenderID
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'MailID'] = fix_incomingText(self.MailID)
+        rec[u'MailType'] = self.MailType
+        rec[u'SenderName'] = fix_incomingText(self.SenderName)
+        rec[u'Title'] = fix_incomingText(self.Title)
+        rec[u'Money'] = self.Money
+        rec[u'LetterType'] = self.LetterType
+        rec[u'ExistTime'] = self.ExistTime
+        rec[u'ContentLen'] = self.ContentLen
+        rec[u'Content'] = fix_incomingText(self.Content)
+        rec[u'TitleUseSysMessage'] = self.TitleUseSysMessage
+        rec[u'ContentUseSysMessage'] = self.ContentUseSysMessage
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.SenderID = rec.get(u'SenderID', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.MailID = fix_outgoingText(rec.get(u'MailID', u''))
+        self.MailType = rec.get(u'MailType', 0)
+        self.SenderName = fix_outgoingText(rec.get(u'SenderName', u''))
+        self.Title = fix_outgoingText(rec.get(u'Title', u''))
+        self.Money = rec.get(u'Money', 0)
+        self.LetterType = rec.get(u'LetterType', 0)
+        self.ExistTime = rec.get(u'ExistTime', 0)
+        self.ContentLen = rec.get(u'ContentLen', 0)
+        self.Content = fix_outgoingText(rec.get(u'Content', u''))
+        self.TitleUseSysMessage = rec.get(u'TitleUseSysMessage', 0)
+        self.ContentUseSysMessage = rec.get(u'ContentUseSysMessage', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!SenderID = %s, error = %s, trycnt = %d'%(self.SenderID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!SenderID = %s, error = %s, trycnt = %d'%(self.SenderID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'SenderID':self.SenderID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'SenderID':self.SenderID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:SenderID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.SenderID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.SenderID = %s, error = %s, trycnt = %d'%(self.SenderID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//存储系统邮件#tagDBMailList_SaveSysMail:
+            SenderID = %s,
+            AccID = %s,
+            MailID = %s,
+            MailType = %s,
+            SenderName = %s,
+            Title = %s,
+            Money = %s,
+            LetterType = %s,
+            ExistTime = %s,
+            ContentLen = %s,
+            Content = %s,
+            TitleUseSysMessage = %s,
+            ContentUseSysMessage = %s,
+            ADOResult = %s,
+            '''%(
+                self.SenderID,
+                self.AccID,
+                self.MailID,
+                self.MailType,
+                self.SenderName,
+                self.Title,
+                self.Money,
+                self.LetterType,
+                self.ExistTime,
+                self.ContentLen,
+                self.Content,
+                self.TitleUseSysMessage,
+                self.ContentUseSysMessage,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.SenderID,
+                self.AccID,
+                self.MailID,
+                self.MailType,
+                self.SenderName,
+                self.Title,
+                self.Money,
+                self.LetterType,
+                self.ExistTime,
+                self.ContentLen,
+                self.Content,
+                self.TitleUseSysMessage,
+                self.ContentUseSysMessage,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetMailID(self,Str):
+        if len(Str)<=40:
+            self.MailID = Str
+        else:
+            self.MailID = Str[:40]
+            
+    def SetSenderName(self,Str):
+        if len(Str)<=33:
+            self.SenderName = Str
+        else:
+            self.SenderName = Str[:33]
+            
+    def SetTitle(self,Str):
+        if len(Str)<=21:
+            self.Title = Str
+        else:
+            self.Title = Str[:21]
+
+#------------------------------------------------------
+#未领取元宝表#tagDBUnclaimedGoldForm
+class tagDBUnclaimedGoldForm(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('DealGoldCount', ctypes.c_ulong),
+        ('CostOfSilver', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBUnclaimedGoldForm)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'DealGoldCount'] = self.DealGoldCount
+        rec[u'CostOfSilver'] = self.CostOfSilver
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.DealGoldCount = rec.get(u'DealGoldCount', 0)
+        self.CostOfSilver = rec.get(u'CostOfSilver', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//未领取元宝表#tagDBUnclaimedGoldForm:
+            PlayerID = %s,
+            DealGoldCount = %s,
+            CostOfSilver = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.DealGoldCount,
+                self.CostOfSilver,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.DealGoldCount,
+                self.CostOfSilver,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#金钱补偿表#tagExpiation
+class tagExpiation(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ExpiationIndex', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('ExpiationTime', ctypes.c_double),
+        ('Gold', ctypes.c_ulong),
+        ('GoldPaper', ctypes.c_ulong),
+        ('Silver', ctypes.c_ulong),
+        ('SilverPaper', ctypes.c_ulong),
+        ('ItemTypeID', ctypes.c_ulong),
+        ('Count', ctypes.c_ushort),
+        ('IsLocked', ctypes.c_ubyte),
+        ('ItemPlaceType', ctypes.c_ubyte),
+        ('ItemPlaceIndex', ctypes.c_ushort),
+        ('IsBind', ctypes.c_ubyte),
+        ('ItemStarLV', ctypes.c_ubyte),
+        ('IdentifyPar', ctypes.c_ubyte),
+        ('CurDurg', ctypes.c_ulong),
+        ('MaxDurg', ctypes.c_ulong),
+        ('CanPlaceStoneCount', ctypes.c_ubyte),
+        ('ItemProperty', ctypes.c_ubyte),
+        ('SoulProperty', ctypes.c_ushort),
+        ('Maker', ctypes.c_ulong),
+        ('MakerName', ctypes.c_char * 33),
+        ('Stone1', ctypes.c_ulong),
+        ('Stone2', ctypes.c_ulong),
+        ('Stone3', ctypes.c_ulong),
+        ('Stone4', ctypes.c_ulong),
+        ('Stone5', ctypes.c_ulong),
+        ('Stone6', ctypes.c_ulong),
+        ('Stone7', ctypes.c_ulong),
+        ('Stone8', ctypes.c_ulong),
+        ('Stone9', ctypes.c_ulong),
+        ('RemainHour', ctypes.c_ushort),
+        ('CreateTime', ctypes.c_char * 30),
+        ('ElementEffect', ctypes.c_ubyte),
+        ('IsSuite', ctypes.c_ubyte),
+        ('FitLV', ctypes.c_ubyte),
+        ('EquipAddSkillCnt', ctypes.c_ubyte),
+        ('ExpireTime', ctypes.c_ushort),
+        ('BaseAtkPlus', ctypes.c_ulong),
+        ('BaseDefPlus', ctypes.c_ulong),
+        ('AddSkillData', ctypes.c_char * 300),
+        ('BaseHP', ctypes.c_ulong),
+        ('BaseMagicDef', ctypes.c_ulong),
+        ('EquipMinAtkValue', ctypes.c_ulong),
+        ('Proficiency', ctypes.c_ulong),
+        ('RelMaxAddSkillCnt', ctypes.c_ubyte),
+        ('FamilyActiveValue', ctypes.c_ulong),
+        ('UserDataLen', ctypes.c_ulong),
+        ('UserData', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.ExpiationIndex = 0
+        self.AccID = ''
+        self.ExpiationTime = 0.0
+        self.Gold = 0
+        self.GoldPaper = 0
+        self.Silver = 0
+        self.SilverPaper = 0
+        self.ItemTypeID = 0
+        self.Count = 0
+        self.IsLocked = 0
+        self.ItemPlaceType = 0
+        self.ItemPlaceIndex = 0
+        self.IsBind = 0
+        self.ItemStarLV = 0
+        self.IdentifyPar = 0
+        self.CurDurg = 0
+        self.MaxDurg = 0
+        self.CanPlaceStoneCount = 0
+        self.ItemProperty = 0
+        self.SoulProperty = 0
+        self.Maker = 0
+        self.MakerName = ''
+        self.Stone1 = 0
+        self.Stone2 = 0
+        self.Stone3 = 0
+        self.Stone4 = 0
+        self.Stone5 = 0
+        self.Stone6 = 0
+        self.Stone7 = 0
+        self.Stone8 = 0
+        self.Stone9 = 0
+        self.RemainHour = 0
+        self.CreateTime = ''
+        self.ElementEffect = 0
+        self.IsSuite = 0
+        self.FitLV = 0
+        self.EquipAddSkillCnt = 0
+        self.ExpireTime = 0
+        self.BaseAtkPlus = 0
+        self.BaseDefPlus = 0
+        self.AddSkillData = ''
+        self.BaseHP = 0
+        self.BaseMagicDef = 0
+        self.EquipMinAtkValue = 0
+        self.Proficiency = 0
+        self.RelMaxAddSkillCnt = 0
+        self.FamilyActiveValue = 0
+        self.UserDataLen = 0
+        self.UserData = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.ExpiationIndex, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AccID, pos = CommFunc.ReadString(buf, pos, 65)
+        self.ExpiationTime, pos = CommFunc.ReadDouble(buf, pos)
+        self.Gold, pos = CommFunc.ReadDWORD(buf, pos)
+        self.GoldPaper, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Silver, pos = CommFunc.ReadDWORD(buf, pos)
+        self.SilverPaper, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ItemTypeID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Count, pos = CommFunc.ReadWORD(buf, pos)
+        self.IsLocked, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemPlaceType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemPlaceIndex, pos = CommFunc.ReadWORD(buf, pos)
+        self.IsBind, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemStarLV, pos = CommFunc.ReadBYTE(buf, pos)
+        self.IdentifyPar, pos = CommFunc.ReadBYTE(buf, pos)
+        self.CurDurg, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MaxDurg, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CanPlaceStoneCount, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemProperty, pos = CommFunc.ReadBYTE(buf, pos)
+        self.SoulProperty, pos = CommFunc.ReadWORD(buf, pos)
+        self.Maker, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MakerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.Stone1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone5, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone6, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone7, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone8, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone9, pos = CommFunc.ReadDWORD(buf, pos)
+        self.RemainHour, pos = CommFunc.ReadWORD(buf, pos)
+        self.CreateTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.ElementEffect, pos = CommFunc.ReadBYTE(buf, pos)
+        self.IsSuite, pos = CommFunc.ReadBYTE(buf, pos)
+        self.FitLV, pos = CommFunc.ReadBYTE(buf, pos)
+        self.EquipAddSkillCnt, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ExpireTime, pos = CommFunc.ReadWORD(buf, pos)
+        self.BaseAtkPlus, pos = CommFunc.ReadDWORD(buf, pos)
+        self.BaseDefPlus, pos = CommFunc.ReadDWORD(buf, pos)
+        self.AddSkillData, pos = CommFunc.ReadString(buf, pos, 300)
+        self.BaseHP, pos = CommFunc.ReadDWORD(buf, pos)
+        self.BaseMagicDef, pos = CommFunc.ReadDWORD(buf, pos)
+        self.EquipMinAtkValue, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Proficiency, pos = CommFunc.ReadDWORD(buf, pos)
+        self.RelMaxAddSkillCnt, pos = CommFunc.ReadBYTE(buf, pos)
+        self.FamilyActiveValue, pos = CommFunc.ReadDWORD(buf, pos)
+        self.UserDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.ExpiationIndex)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 65, self.AccID)
+        buf = CommFunc.WriteDouble(buf, self.ExpiationTime)
+        buf = CommFunc.WriteDWORD(buf, self.Gold)
+        buf = CommFunc.WriteDWORD(buf, self.GoldPaper)
+        buf = CommFunc.WriteDWORD(buf, self.Silver)
+        buf = CommFunc.WriteDWORD(buf, self.SilverPaper)
+        buf = CommFunc.WriteDWORD(buf, self.ItemTypeID)
+        buf = CommFunc.WriteWORD(buf, self.Count)
+        buf = CommFunc.WriteBYTE(buf, self.IsLocked)
+        buf = CommFunc.WriteBYTE(buf, self.ItemPlaceType)
+        buf = CommFunc.WriteWORD(buf, self.ItemPlaceIndex)
+        buf = CommFunc.WriteBYTE(buf, self.IsBind)
+        buf = CommFunc.WriteBYTE(buf, self.ItemStarLV)
+        buf = CommFunc.WriteBYTE(buf, self.IdentifyPar)
+        buf = CommFunc.WriteDWORD(buf, self.CurDurg)
+        buf = CommFunc.WriteDWORD(buf, self.MaxDurg)
+        buf = CommFunc.WriteBYTE(buf, self.CanPlaceStoneCount)
+        buf = CommFunc.WriteBYTE(buf, self.ItemProperty)
+        buf = CommFunc.WriteWORD(buf, self.SoulProperty)
+        buf = CommFunc.WriteDWORD(buf, self.Maker)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.MakerName)
+        buf = CommFunc.WriteDWORD(buf, self.Stone1)
+        buf = CommFunc.WriteDWORD(buf, self.Stone2)
+        buf = CommFunc.WriteDWORD(buf, self.Stone3)
+        buf = CommFunc.WriteDWORD(buf, self.Stone4)
+        buf = CommFunc.WriteDWORD(buf, self.Stone5)
+        buf = CommFunc.WriteDWORD(buf, self.Stone6)
+        buf = CommFunc.WriteDWORD(buf, self.Stone7)
+        buf = CommFunc.WriteDWORD(buf, self.Stone8)
+        buf = CommFunc.WriteDWORD(buf, self.Stone9)
+        buf = CommFunc.WriteWORD(buf, self.RemainHour)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.CreateTime)
+        buf = CommFunc.WriteBYTE(buf, self.ElementEffect)
+        buf = CommFunc.WriteBYTE(buf, self.IsSuite)
+        buf = CommFunc.WriteBYTE(buf, self.FitLV)
+        buf = CommFunc.WriteBYTE(buf, self.EquipAddSkillCnt)
+        buf = CommFunc.WriteWORD(buf, self.ExpireTime)
+        buf = CommFunc.WriteDWORD(buf, self.BaseAtkPlus)
+        buf = CommFunc.WriteDWORD(buf, self.BaseDefPlus)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 300, self.AddSkillData)
+        buf = CommFunc.WriteDWORD(buf, self.BaseHP)
+        buf = CommFunc.WriteDWORD(buf, self.BaseMagicDef)
+        buf = CommFunc.WriteDWORD(buf, self.EquipMinAtkValue)
+        buf = CommFunc.WriteDWORD(buf, self.Proficiency)
+        buf = CommFunc.WriteBYTE(buf, self.RelMaxAddSkillCnt)
+        buf = CommFunc.WriteDWORD(buf, self.FamilyActiveValue)
+        buf = CommFunc.WriteDWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 65
+        length += sizeof(ctypes.c_double)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 300
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += self.UserDataLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ExpiationIndex'] = self.ExpiationIndex
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'ExpiationTime'] = self.ExpiationTime
+        rec[u'Gold'] = self.Gold
+        rec[u'GoldPaper'] = self.GoldPaper
+        rec[u'Silver'] = self.Silver
+        rec[u'SilverPaper'] = self.SilverPaper
+        rec[u'ItemTypeID'] = self.ItemTypeID
+        rec[u'Count'] = self.Count
+        rec[u'IsLocked'] = self.IsLocked
+        rec[u'ItemPlaceType'] = self.ItemPlaceType
+        rec[u'ItemPlaceIndex'] = self.ItemPlaceIndex
+        rec[u'IsBind'] = self.IsBind
+        rec[u'ItemStarLV'] = self.ItemStarLV
+        rec[u'IdentifyPar'] = self.IdentifyPar
+        rec[u'CurDurg'] = self.CurDurg
+        rec[u'MaxDurg'] = self.MaxDurg
+        rec[u'CanPlaceStoneCount'] = self.CanPlaceStoneCount
+        rec[u'ItemProperty'] = self.ItemProperty
+        rec[u'SoulProperty'] = self.SoulProperty
+        rec[u'Maker'] = self.Maker
+        rec[u'MakerName'] = fix_incomingText(self.MakerName)
+        rec[u'Stone1'] = self.Stone1
+        rec[u'Stone2'] = self.Stone2
+        rec[u'Stone3'] = self.Stone3
+        rec[u'Stone4'] = self.Stone4
+        rec[u'Stone5'] = self.Stone5
+        rec[u'Stone6'] = self.Stone6
+        rec[u'Stone7'] = self.Stone7
+        rec[u'Stone8'] = self.Stone8
+        rec[u'Stone9'] = self.Stone9
+        rec[u'RemainHour'] = self.RemainHour
+        rec[u'CreateTime'] = fix_incomingText(self.CreateTime)
+        rec[u'ElementEffect'] = self.ElementEffect
+        rec[u'IsSuite'] = self.IsSuite
+        rec[u'FitLV'] = self.FitLV
+        rec[u'EquipAddSkillCnt'] = self.EquipAddSkillCnt
+        rec[u'ExpireTime'] = self.ExpireTime
+        rec[u'BaseAtkPlus'] = self.BaseAtkPlus
+        rec[u'BaseDefPlus'] = self.BaseDefPlus
+        rec[u'AddSkillData'] = fix_incomingText(self.AddSkillData)
+        rec[u'BaseHP'] = self.BaseHP
+        rec[u'BaseMagicDef'] = self.BaseMagicDef
+        rec[u'EquipMinAtkValue'] = self.EquipMinAtkValue
+        rec[u'Proficiency'] = self.Proficiency
+        rec[u'RelMaxAddSkillCnt'] = self.RelMaxAddSkillCnt
+        rec[u'FamilyActiveValue'] = self.FamilyActiveValue
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ExpiationIndex = rec.get(u'ExpiationIndex', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.ExpiationTime = rec.get(u'ExpiationTime', 0)
+        self.Gold = rec.get(u'Gold', 0)
+        self.GoldPaper = rec.get(u'GoldPaper', 0)
+        self.Silver = rec.get(u'Silver', 0)
+        self.SilverPaper = rec.get(u'SilverPaper', 0)
+        self.ItemTypeID = rec.get(u'ItemTypeID', 0)
+        self.Count = rec.get(u'Count', 0)
+        self.IsLocked = rec.get(u'IsLocked', 0)
+        self.ItemPlaceType = rec.get(u'ItemPlaceType', 0)
+        self.ItemPlaceIndex = rec.get(u'ItemPlaceIndex', 0)
+        self.IsBind = rec.get(u'IsBind', 0)
+        self.ItemStarLV = rec.get(u'ItemStarLV', 0)
+        self.IdentifyPar = rec.get(u'IdentifyPar', 0)
+        self.CurDurg = rec.get(u'CurDurg', 0)
+        self.MaxDurg = rec.get(u'MaxDurg', 0)
+        self.CanPlaceStoneCount = rec.get(u'CanPlaceStoneCount', 0)
+        self.ItemProperty = rec.get(u'ItemProperty', 0)
+        self.SoulProperty = rec.get(u'SoulProperty', 0)
+        self.Maker = rec.get(u'Maker', 0)
+        self.MakerName = fix_outgoingText(rec.get(u'MakerName', u''))
+        self.Stone1 = rec.get(u'Stone1', 0)
+        self.Stone2 = rec.get(u'Stone2', 0)
+        self.Stone3 = rec.get(u'Stone3', 0)
+        self.Stone4 = rec.get(u'Stone4', 0)
+        self.Stone5 = rec.get(u'Stone5', 0)
+        self.Stone6 = rec.get(u'Stone6', 0)
+        self.Stone7 = rec.get(u'Stone7', 0)
+        self.Stone8 = rec.get(u'Stone8', 0)
+        self.Stone9 = rec.get(u'Stone9', 0)
+        self.RemainHour = rec.get(u'RemainHour', 0)
+        self.CreateTime = fix_outgoingText(rec.get(u'CreateTime', u''))
+        self.ElementEffect = rec.get(u'ElementEffect', 0)
+        self.IsSuite = rec.get(u'IsSuite', 0)
+        self.FitLV = rec.get(u'FitLV', 0)
+        self.EquipAddSkillCnt = rec.get(u'EquipAddSkillCnt', 0)
+        self.ExpireTime = rec.get(u'ExpireTime', 0)
+        self.BaseAtkPlus = rec.get(u'BaseAtkPlus', 0)
+        self.BaseDefPlus = rec.get(u'BaseDefPlus', 0)
+        self.AddSkillData = fix_outgoingText(rec.get(u'AddSkillData', u''))
+        self.BaseHP = rec.get(u'BaseHP', 0)
+        self.BaseMagicDef = rec.get(u'BaseMagicDef', 0)
+        self.EquipMinAtkValue = rec.get(u'EquipMinAtkValue', 0)
+        self.Proficiency = rec.get(u'Proficiency', 0)
+        self.RelMaxAddSkillCnt = rec.get(u'RelMaxAddSkillCnt', 0)
+        self.FamilyActiveValue = rec.get(u'FamilyActiveValue', 0)
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'ExpiationIndex':self.ExpiationIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'ExpiationIndex':self.ExpiationIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'ExpiationIndex':self.ExpiationIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//金钱补偿表#tagExpiation:
+            ExpiationIndex = %s,
+            AccID = %s,
+            ExpiationTime = %s,
+            Gold = %s,
+            GoldPaper = %s,
+            Silver = %s,
+            SilverPaper = %s,
+            ItemTypeID = %s,
+            Count = %s,
+            IsLocked = %s,
+            ItemPlaceType = %s,
+            ItemPlaceIndex = %s,
+            IsBind = %s,
+            ItemStarLV = %s,
+            IdentifyPar = %s,
+            CurDurg = %s,
+            MaxDurg = %s,
+            CanPlaceStoneCount = %s,
+            ItemProperty = %s,
+            SoulProperty = %s,
+            Maker = %s,
+            MakerName = %s,
+            Stone1 = %s,
+            Stone2 = %s,
+            Stone3 = %s,
+            Stone4 = %s,
+            Stone5 = %s,
+            Stone6 = %s,
+            Stone7 = %s,
+            Stone8 = %s,
+            Stone9 = %s,
+            RemainHour = %s,
+            CreateTime = %s,
+            ElementEffect = %s,
+            IsSuite = %s,
+            FitLV = %s,
+            EquipAddSkillCnt = %s,
+            ExpireTime = %s,
+            BaseAtkPlus = %s,
+            BaseDefPlus = %s,
+            AddSkillData = %s,
+            BaseHP = %s,
+            BaseMagicDef = %s,
+            EquipMinAtkValue = %s,
+            Proficiency = %s,
+            RelMaxAddSkillCnt = %s,
+            FamilyActiveValue = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            ADOResult = %s,
+            '''%(
+                self.ExpiationIndex,
+                self.AccID,
+                self.ExpiationTime,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.ItemTypeID,
+                self.Count,
+                self.IsLocked,
+                self.ItemPlaceType,
+                self.ItemPlaceIndex,
+                self.IsBind,
+                self.ItemStarLV,
+                self.IdentifyPar,
+                self.CurDurg,
+                self.MaxDurg,
+                self.CanPlaceStoneCount,
+                self.ItemProperty,
+                self.SoulProperty,
+                self.Maker,
+                self.MakerName,
+                self.Stone1,
+                self.Stone2,
+                self.Stone3,
+                self.Stone4,
+                self.Stone5,
+                self.Stone6,
+                self.Stone7,
+                self.Stone8,
+                self.Stone9,
+                self.RemainHour,
+                self.CreateTime,
+                self.ElementEffect,
+                self.IsSuite,
+                self.FitLV,
+                self.EquipAddSkillCnt,
+                self.ExpireTime,
+                self.BaseAtkPlus,
+                self.BaseDefPlus,
+                self.AddSkillData,
+                self.BaseHP,
+                self.BaseMagicDef,
+                self.EquipMinAtkValue,
+                self.Proficiency,
+                self.RelMaxAddSkillCnt,
+                self.FamilyActiveValue,
+                self.UserDataLen,
+                self.UserData,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.ExpiationIndex,
+                self.AccID,
+                self.ExpiationTime,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.SilverPaper,
+                self.ItemTypeID,
+                self.Count,
+                self.IsLocked,
+                self.ItemPlaceType,
+                self.ItemPlaceIndex,
+                self.IsBind,
+                self.ItemStarLV,
+                self.IdentifyPar,
+                self.CurDurg,
+                self.MaxDurg,
+                self.CanPlaceStoneCount,
+                self.ItemProperty,
+                self.SoulProperty,
+                self.Maker,
+                self.MakerName,
+                self.Stone1,
+                self.Stone2,
+                self.Stone3,
+                self.Stone4,
+                self.Stone5,
+                self.Stone6,
+                self.Stone7,
+                self.Stone8,
+                self.Stone9,
+                self.RemainHour,
+                self.CreateTime,
+                self.ElementEffect,
+                self.IsSuite,
+                self.FitLV,
+                self.EquipAddSkillCnt,
+                self.ExpireTime,
+                self.BaseAtkPlus,
+                self.BaseDefPlus,
+                self.AddSkillData,
+                self.BaseHP,
+                self.BaseMagicDef,
+                self.EquipMinAtkValue,
+                self.Proficiency,
+                self.RelMaxAddSkillCnt,
+                self.FamilyActiveValue,
+                self.UserDataLen,
+                self.UserData,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetMakerName(self,Str):
+        if len(Str)<=33:
+            self.MakerName = Str
+        else:
+            self.MakerName = Str[:33]
+            
+    def SetCreateTime(self,Str):
+        if len(Str)<=30:
+            self.CreateTime = Str
+        else:
+            self.CreateTime = Str[:30]
+            
+    def SetAddSkillData(self,Str):
+        if len(Str)<=300:
+            self.AddSkillData = Str
+        else:
+            self.AddSkillData = Str[:300]
+
+#------------------------------------------------------
+
+#家族表#tagFamilyInfo
+class tagFamilyInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ID', ctypes.c_ulong),
+        ('Name', ctypes.c_char * 33),
+        ('LeaderID', ctypes.c_ulong),
+        ('LeaderName', ctypes.c_char * 33),
+        ('LeaderOfficialRank', ctypes.c_ubyte),
+        ('Broadcast', ctypes.c_char * 200),
+        ('LV', ctypes.c_ubyte),
+        ('Money', ctypes.c_ulong),
+        ('Hornor', ctypes.c_ulong),
+        ('BillboardPlace', ctypes.c_ushort),
+        ('AcceptJoin', ctypes.c_ubyte),
+        ('CreateTime', ctypes.c_char * 30),
+        ('Point', ctypes.c_ulong),
+        ('FamilyActiveValue', ctypes.c_ulong),
+        ('LastWeekFamilyActiveValue', ctypes.c_ulong),
+        ('BeChallengedTime', ctypes.c_char * 20),
+        ('Extra1', ctypes.c_ulong),
+        ('Extra2', ctypes.c_ulong),
+        ('Extra3', ctypes.c_ulong),
+        ('Extra4', ctypes.c_ulong),
+        ('Extra5', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagFamilyInfo)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ID'] = self.ID
+        rec[u'Name'] = fix_incomingText(self.Name)
+        rec[u'LeaderID'] = self.LeaderID
+        rec[u'LeaderName'] = fix_incomingText(self.LeaderName)
+        rec[u'LeaderOfficialRank'] = self.LeaderOfficialRank
+        rec[u'Broadcast'] = fix_incomingText(self.Broadcast)
+        rec[u'LV'] = self.LV
+        rec[u'Money'] = self.Money
+        rec[u'Hornor'] = self.Hornor
+        rec[u'BillboardPlace'] = self.BillboardPlace
+        rec[u'AcceptJoin'] = self.AcceptJoin
+        rec[u'CreateTime'] = fix_incomingText(self.CreateTime)
+        rec[u'Point'] = self.Point
+        rec[u'FamilyActiveValue'] = self.FamilyActiveValue
+        rec[u'LastWeekFamilyActiveValue'] = self.LastWeekFamilyActiveValue
+        rec[u'BeChallengedTime'] = fix_incomingText(self.BeChallengedTime)
+        rec[u'Extra1'] = self.Extra1
+        rec[u'Extra2'] = self.Extra2
+        rec[u'Extra3'] = self.Extra3
+        rec[u'Extra4'] = self.Extra4
+        rec[u'Extra5'] = self.Extra5
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ID = rec.get(u'ID', 0)
+        self.Name = fix_outgoingText(rec.get(u'Name', u''))
+        self.LeaderID = rec.get(u'LeaderID', 0)
+        self.LeaderName = fix_outgoingText(rec.get(u'LeaderName', u''))
+        self.LeaderOfficialRank = rec.get(u'LeaderOfficialRank', 0)
+        self.Broadcast = fix_outgoingText(rec.get(u'Broadcast', u''))
+        self.LV = rec.get(u'LV', 0)
+        self.Money = rec.get(u'Money', 0)
+        self.Hornor = rec.get(u'Hornor', 0)
+        self.BillboardPlace = rec.get(u'BillboardPlace', 0)
+        self.AcceptJoin = rec.get(u'AcceptJoin', 0)
+        self.CreateTime = fix_outgoingText(rec.get(u'CreateTime', u''))
+        self.Point = rec.get(u'Point', 0)
+        self.FamilyActiveValue = rec.get(u'FamilyActiveValue', 0)
+        self.LastWeekFamilyActiveValue = rec.get(u'LastWeekFamilyActiveValue', 0)
+        self.BeChallengedTime = fix_outgoingText(rec.get(u'BeChallengedTime', u''))
+        self.Extra1 = rec.get(u'Extra1', 0)
+        self.Extra2 = rec.get(u'Extra2', 0)
+        self.Extra3 = rec.get(u'Extra3', 0)
+        self.Extra4 = rec.get(u'Extra4', 0)
+        self.Extra5 = rec.get(u'Extra5', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'ID':self.ID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!ID = %s, error = %s, trycnt = %d'%(self.ID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'ID':self.ID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!ID = %s, error = %s, trycnt = %d'%(self.ID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!ID = %s, error = %s, trycnt = %d'%(self.ID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'ID':self.ID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'ID':self.ID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'ID':self.ID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:ID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.ID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.ID = %s, error = %s, trycnt = %d'%(self.ID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//家族表#tagFamilyInfo:
+            ID = %s,
+            Name = %s,
+            LeaderID = %s,
+            LeaderName = %s,
+            LeaderOfficialRank = %s,
+            Broadcast = %s,
+            LV = %s,
+            Money = %s,
+            Hornor = %s,
+            BillboardPlace = %s,
+            AcceptJoin = %s,
+            CreateTime = %s,
+            Point = %s,
+            FamilyActiveValue = %s,
+            LastWeekFamilyActiveValue = %s,
+            BeChallengedTime = %s,
+            Extra1 = %s,
+            Extra2 = %s,
+            Extra3 = %s,
+            Extra4 = %s,
+            Extra5 = %s,
+            ADOResult = %s,
+            '''%(
+                self.ID,
+                self.Name,
+                self.LeaderID,
+                self.LeaderName,
+                self.LeaderOfficialRank,
+                self.Broadcast,
+                self.LV,
+                self.Money,
+                self.Hornor,
+                self.BillboardPlace,
+                self.AcceptJoin,
+                self.CreateTime,
+                self.Point,
+                self.FamilyActiveValue,
+                self.LastWeekFamilyActiveValue,
+                self.BeChallengedTime,
+                self.Extra1,
+                self.Extra2,
+                self.Extra3,
+                self.Extra4,
+                self.Extra5,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.ID,
+                self.Name,
+                self.LeaderID,
+                self.LeaderName,
+                self.LeaderOfficialRank,
+                self.Broadcast,
+                self.LV,
+                self.Money,
+                self.Hornor,
+                self.BillboardPlace,
+                self.AcceptJoin,
+                self.CreateTime,
+                self.Point,
+                self.FamilyActiveValue,
+                self.LastWeekFamilyActiveValue,
+                self.BeChallengedTime,
+                self.Extra1,
+                self.Extra2,
+                self.Extra3,
+                self.Extra4,
+                self.Extra5,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetName(self,Str):
+        if len(Str)<=33:
+            self.Name = Str
+        else:
+            self.Name = Str[:33]
+            
+    def SetLeaderName(self,Str):
+        if len(Str)<=33:
+            self.LeaderName = Str
+        else:
+            self.LeaderName = Str[:33]
+            
+    def SetBroadcast(self,Str):
+        if len(Str)<=200:
+            self.Broadcast = Str
+        else:
+            self.Broadcast = Str[:200]
+            
+    def SetCreateTime(self,Str):
+        if len(Str)<=30:
+            self.CreateTime = Str
+        else:
+            self.CreateTime = Str[:30]
+            
+    def SetBeChallengedTime(self,Str):
+        if len(Str)<=20:
+            self.BeChallengedTime = Str
+        else:
+            self.BeChallengedTime = Str[:20]
+            
+
+
+#------------------------------------------------------
+#服务器活动#tagGameWorldEvent
+class tagGameWorldEvent(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('EventID', ctypes.c_ulong),
+        ('StartTime', ctypes.c_char * 30),
+        ('EndTime', ctypes.c_char * 30),
+        ('IsProcessing', ctypes.c_ubyte),
+        ('AccID', ctypes.c_char * 65),
+        ('Par', ctypes.c_char * 201),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagGameWorldEvent)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'EventID'] = self.EventID
+        rec[u'StartTime'] = fix_incomingText(self.StartTime)
+        rec[u'EndTime'] = fix_incomingText(self.EndTime)
+        rec[u'IsProcessing'] = self.IsProcessing
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'Par'] = fix_incomingText(self.Par)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.EventID = rec.get(u'EventID', 0)
+        self.StartTime = fix_outgoingText(rec.get(u'StartTime', u''))
+        self.EndTime = fix_outgoingText(rec.get(u'EndTime', u''))
+        self.IsProcessing = rec.get(u'IsProcessing', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.Par = fix_outgoingText(rec.get(u'Par', u''))
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'EventID':self.EventID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'EventID':self.EventID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'EventID':self.EventID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'EventID':self.EventID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'EventID':self.EventID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:EventID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.EventID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.EventID = %s, error = %s, trycnt = %d'%(self.EventID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//服务器活动#tagGameWorldEvent:
+            EventID = %s,
+            StartTime = %s,
+            EndTime = %s,
+            IsProcessing = %s,
+            AccID = %s,
+            Par = %s,
+            ADOResult = %s,
+            '''%(
+                self.EventID,
+                self.StartTime,
+                self.EndTime,
+                self.IsProcessing,
+                self.AccID,
+                self.Par,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.EventID,
+                self.StartTime,
+                self.EndTime,
+                self.IsProcessing,
+                self.AccID,
+                self.Par,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetStartTime(self,Str):
+        if len(Str)<=30:
+            self.StartTime = Str
+        else:
+            self.StartTime = Str[:30]
+            
+    def SetEndTime(self,Str):
+        if len(Str)<=30:
+            self.EndTime = Str
+        else:
+            self.EndTime = Str[:30]
+            
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetPar(self,Str):
+        if len(Str)<=201:
+            self.Par = Str
+        else:
+            self.Par = Str[:201]
+            
+
+
+#------------------------------------------------------
+#GM对玩家的操作#tagGMOper
+class tagGMOper(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('Oper', ctypes.c_ubyte),
+        ('StartTime', ctypes.c_double),
+        ('EndTime', ctypes.c_double),
+        ('GMAccID', ctypes.c_char * 65),
+        ('Msg', ctypes.c_char * 100),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagGMOper)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'Oper'] = self.Oper
+        rec[u'StartTime'] = self.StartTime
+        rec[u'EndTime'] = self.EndTime
+        rec[u'GMAccID'] = fix_incomingText(self.GMAccID)
+        rec[u'Msg'] = fix_incomingText(self.Msg)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.Oper = rec.get(u'Oper', 0)
+        self.StartTime = rec.get(u'StartTime', 0)
+        self.EndTime = rec.get(u'EndTime', 0)
+        self.GMAccID = fix_outgoingText(rec.get(u'GMAccID', u''))
+        self.Msg = fix_outgoingText(rec.get(u'Msg', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//GM对玩家的操作#tagGMOper:
+            PlayerID = %s,
+            Oper = %s,
+            StartTime = %s,
+            EndTime = %s,
+            GMAccID = %s,
+            Msg = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.Oper,
+                self.StartTime,
+                self.EndTime,
+                self.GMAccID,
+                self.Msg,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.Oper,
+                self.StartTime,
+                self.EndTime,
+                self.GMAccID,
+                self.Msg,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetGMAccID(self,Str):
+        if len(Str)<=65:
+            self.GMAccID = Str
+        else:
+            self.GMAccID = Str[:65]
+            
+    def SetMsg(self,Str):
+        if len(Str)<=100:
+            self.Msg = Str
+        else:
+            self.Msg = Str[:100]
+            
+
+
+#------------------------------------------------------
+#宠物补偿表#tagPetExpiation
+class tagPetExpiation(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ExpiationIndex', ctypes.c_ulong),
+        ('AccID', ctypes.c_char * 65),
+        ('ExpiationTime', ctypes.c_double),
+        ('NPCID', ctypes.c_ulong),
+        ('Lv', ctypes.c_ushort),
+        ('Exp', ctypes.c_ulong),
+        ('Friendliness', ctypes.c_ushort),
+        ('BindType', ctypes.c_ubyte),
+        ('UseCreatorDrugCnt', ctypes.c_ubyte),
+        ('SkillIDList', ctypes.c_char * 300),
+        ('HPTalent', ctypes.c_ushort),
+        ('PhysicAtkTalent', ctypes.c_ushort),
+        ('MagicAtkTalent', ctypes.c_ushort),
+        ('PhysicDefTalent', ctypes.c_ushort),
+        ('MagicDefTalent', ctypes.c_ushort),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagPetExpiation)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ExpiationIndex'] = self.ExpiationIndex
+        rec[u'AccID'] = fix_incomingText(self.AccID)
+        rec[u'ExpiationTime'] = self.ExpiationTime
+        rec[u'NPCID'] = self.NPCID
+        rec[u'Lv'] = self.Lv
+        rec[u'Exp'] = self.Exp
+        rec[u'Friendliness'] = self.Friendliness
+        rec[u'BindType'] = self.BindType
+        rec[u'UseCreatorDrugCnt'] = self.UseCreatorDrugCnt
+        rec[u'SkillIDList'] = fix_incomingText(self.SkillIDList)
+        rec[u'HPTalent'] = self.HPTalent
+        rec[u'PhysicAtkTalent'] = self.PhysicAtkTalent
+        rec[u'MagicAtkTalent'] = self.MagicAtkTalent
+        rec[u'PhysicDefTalent'] = self.PhysicDefTalent
+        rec[u'MagicDefTalent'] = self.MagicDefTalent
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ExpiationIndex = rec.get(u'ExpiationIndex', 0)
+        self.AccID = fix_outgoingText(rec.get(u'AccID', u''))
+        self.ExpiationTime = rec.get(u'ExpiationTime', 0)
+        self.NPCID = rec.get(u'NPCID', 0)
+        self.Lv = rec.get(u'Lv', 0)
+        self.Exp = rec.get(u'Exp', 0)
+        self.Friendliness = rec.get(u'Friendliness', 0)
+        self.BindType = rec.get(u'BindType', 0)
+        self.UseCreatorDrugCnt = rec.get(u'UseCreatorDrugCnt', 0)
+        self.SkillIDList = fix_outgoingText(rec.get(u'SkillIDList', u''))
+        self.HPTalent = rec.get(u'HPTalent', 0)
+        self.PhysicAtkTalent = rec.get(u'PhysicAtkTalent', 0)
+        self.MagicAtkTalent = rec.get(u'MagicAtkTalent', 0)
+        self.PhysicDefTalent = rec.get(u'PhysicDefTalent', 0)
+        self.MagicDefTalent = rec.get(u'MagicDefTalent', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'ExpiationIndex':self.ExpiationIndex})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'ExpiationIndex':self.ExpiationIndex}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'ExpiationIndex':self.ExpiationIndex})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'AccID':fix_incomingText(self.AccID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'AccID':fix_incomingText(self.AccID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:AccID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.AccID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.AccID = %s, error = %s, trycnt = %d'%(self.AccID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//宠物补偿表#tagPetExpiation:
+            ExpiationIndex = %s,
+            AccID = %s,
+            ExpiationTime = %s,
+            NPCID = %s,
+            Lv = %s,
+            Exp = %s,
+            Friendliness = %s,
+            BindType = %s,
+            UseCreatorDrugCnt = %s,
+            SkillIDList = %s,
+            HPTalent = %s,
+            PhysicAtkTalent = %s,
+            MagicAtkTalent = %s,
+            PhysicDefTalent = %s,
+            MagicDefTalent = %s,
+            ADOResult = %s,
+            '''%(
+                self.ExpiationIndex,
+                self.AccID,
+                self.ExpiationTime,
+                self.NPCID,
+                self.Lv,
+                self.Exp,
+                self.Friendliness,
+                self.BindType,
+                self.UseCreatorDrugCnt,
+                self.SkillIDList,
+                self.HPTalent,
+                self.PhysicAtkTalent,
+                self.MagicAtkTalent,
+                self.PhysicDefTalent,
+                self.MagicDefTalent,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.ExpiationIndex,
+                self.AccID,
+                self.ExpiationTime,
+                self.NPCID,
+                self.Lv,
+                self.Exp,
+                self.Friendliness,
+                self.BindType,
+                self.UseCreatorDrugCnt,
+                self.SkillIDList,
+                self.HPTalent,
+                self.PhysicAtkTalent,
+                self.MagicAtkTalent,
+                self.PhysicDefTalent,
+                self.MagicDefTalent,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetAccID(self,Str):
+        if len(Str)<=65:
+            self.AccID = Str
+        else:
+            self.AccID = Str[:65]
+            
+    def SetSkillIDList(self,Str):
+        if len(Str)<=300:
+            self.SkillIDList = Str
+        else:
+            self.SkillIDList = Str[:300]
+            
+#------------------------------------------------------
+#玩家宠物技能表#tagPetSkill
+class tagPetSkill(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PetID', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('SkillID', ctypes.c_ushort),
+        ('RemainTime', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagPetSkill)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PetID'] = self.PetID
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'SkillID'] = self.SkillID
+        rec[u'RemainTime'] = self.RemainTime
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PetID = rec.get(u'PetID', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.SkillID = rec.get(u'SkillID', 0)
+        self.RemainTime = rec.get(u'RemainTime', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PetID':self.PetID,'SkillID':self.SkillID,})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PetID = %s, error = %s, trycnt = %d'%(self.PetID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PetID':self.PetID,'SkillID':self.SkillID,}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!PetID = %s, error = %s, trycnt = %d'%(self.PetID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PetID = %s, error = %s, trycnt = %d'%(self.PetID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PetID':self.PetID,'SkillID':self.SkillID,})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PetID':self.PetID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PetID':self.PetID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PetID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PetID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PetID = %s, error = %s, trycnt = %d'%(self.PetID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家宠物技能表#tagPetSkill:
+            PetID = %s,
+            PlayerID = %s,
+            SkillID = %s,
+            RemainTime = %s,
+            ADOResult = %s,
+            '''%(
+                self.PetID,
+                self.PlayerID,
+                self.SkillID,
+                self.RemainTime,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s'''%(
+                self.PetID,
+                self.PlayerID,
+                self.SkillID,
+                self.RemainTime,
+            )
+        return output
+
+
+
+            
+#------------------------------------------------------
+#玩家家族表#tagPlayerFamily
+class tagPlayerFamily(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('FamilyID', ctypes.c_ulong),
+        ('Name', ctypes.c_char * 33),
+        ('Sex', ctypes.c_ubyte),
+        ('LV', ctypes.c_ushort),
+        ('Job', ctypes.c_ubyte),
+        ('FamilyLV', ctypes.c_ubyte),
+        ('FamilyName', ctypes.c_char * 33),
+        ('FamilyActiveValue', ctypes.c_ulong),
+        ('OfficialRank', ctypes.c_ubyte),
+        ('Exattr1', ctypes.c_ulong),
+        ('Exattr2', ctypes.c_ulong),
+        ('Exattr3', ctypes.c_ulong),
+        ('Exattr4', ctypes.c_ulong),
+        ('Exattr5', ctypes.c_ulong),
+        ('ReincarnationLv', ctypes.c_ushort),
+        ('OperateInfo', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagPlayerFamily)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'Name'] = fix_incomingText(self.Name)
+        rec[u'Sex'] = self.Sex
+        rec[u'LV'] = self.LV
+        rec[u'Job'] = self.Job
+        rec[u'FamilyLV'] = self.FamilyLV
+        rec[u'FamilyName'] = fix_incomingText(self.FamilyName)
+        rec[u'FamilyActiveValue'] = self.FamilyActiveValue
+        rec[u'OfficialRank'] = self.OfficialRank
+        rec[u'Exattr1'] = self.Exattr1
+        rec[u'Exattr2'] = self.Exattr2
+        rec[u'Exattr3'] = self.Exattr3
+        rec[u'Exattr4'] = self.Exattr4
+        rec[u'Exattr5'] = self.Exattr5
+        rec[u'ReincarnationLv'] = self.ReincarnationLv
+        rec[u'OperateInfo'] = self.OperateInfo
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.Name = fix_outgoingText(rec.get(u'Name', u''))
+        self.Sex = rec.get(u'Sex', 0)
+        self.LV = rec.get(u'LV', 0)
+        self.Job = rec.get(u'Job', 0)
+        self.FamilyLV = rec.get(u'FamilyLV', 0)
+        self.FamilyName = fix_outgoingText(rec.get(u'FamilyName', u''))
+        self.FamilyActiveValue = rec.get(u'FamilyActiveValue', 0)
+        self.OfficialRank = rec.get(u'OfficialRank', 0)
+        self.Exattr1 = rec.get(u'Exattr1', 0)
+        self.Exattr2 = rec.get(u'Exattr2', 0)
+        self.Exattr3 = rec.get(u'Exattr3', 0)
+        self.Exattr4 = rec.get(u'Exattr4', 0)
+        self.Exattr5 = rec.get(u'Exattr5', 0)
+        self.ReincarnationLv = rec.get(u'ReincarnationLv', 0)
+        self.OperateInfo = rec.get(u'OperateInfo', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PlayerID':self.PlayerID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家家族表#tagPlayerFamily:
+            PlayerID = %s,
+            FamilyID = %s,
+            Name = %s,
+            Sex = %s,
+            LV = %s,
+            Job = %s,
+            FamilyLV = %s,
+            FamilyName = %s,
+            FamilyActiveValue = %s,
+            OfficialRank = %s,
+            Exattr1 = %s,
+            Exattr2 = %s,
+            Exattr3 = %s,
+            Exattr4 = %s,
+            Exattr5 = %s,
+            ReincarnationLv = %s,
+            OperateInfo = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.FamilyID,
+                self.Name,
+                self.Sex,
+                self.LV,
+                self.Job,
+                self.FamilyLV,
+                self.FamilyName,
+                self.FamilyActiveValue,
+                self.OfficialRank,
+                self.Exattr1,
+                self.Exattr2,
+                self.Exattr3,
+                self.Exattr4,
+                self.Exattr5,
+                self.ReincarnationLv,
+                self.OperateInfo,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.FamilyID,
+                self.Name,
+                self.Sex,
+                self.LV,
+                self.Job,
+                self.FamilyLV,
+                self.FamilyName,
+                self.FamilyActiveValue,
+                self.OfficialRank,
+                self.Exattr1,
+                self.Exattr2,
+                self.Exattr3,
+                self.Exattr4,
+                self.Exattr5,
+                self.ReincarnationLv,
+                self.OperateInfo,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetName(self,Str):
+        if len(Str)<=33:
+            self.Name = Str
+        else:
+            self.Name = Str[:33]
+            
+    def SetFamilyName(self,Str):
+        if len(Str)<=33:
+            self.FamilyName = Str
+        else:
+            self.FamilyName = Str[:33]
+            
+
+
+            
+#------------------------------------------------------
+#玩家骠车马匹表#tagPlayerHorseTable
+class tagPlayerHorseTable(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('TruckID', ctypes.c_ulong),
+        ('EventID', ctypes.c_ulong),
+        ('HorseLV', ctypes.c_ubyte),
+        ('RemainTime', ctypes.c_ulong),
+        ('TruckState', ctypes.c_ubyte),
+        ('TruckMoney', ctypes.c_ulong),
+        ('TruckMoneyType', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagPlayerHorseTable)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TruckID'] = self.TruckID
+        rec[u'EventID'] = self.EventID
+        rec[u'HorseLV'] = self.HorseLV
+        rec[u'RemainTime'] = self.RemainTime
+        rec[u'TruckState'] = self.TruckState
+        rec[u'TruckMoney'] = self.TruckMoney
+        rec[u'TruckMoneyType'] = self.TruckMoneyType
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TruckID = rec.get(u'TruckID', 0)
+        self.EventID = rec.get(u'EventID', 0)
+        self.HorseLV = rec.get(u'HorseLV', 0)
+        self.RemainTime = rec.get(u'RemainTime', 0)
+        self.TruckState = rec.get(u'TruckState', 0)
+        self.TruckMoney = rec.get(u'TruckMoney', 0)
+        self.TruckMoneyType = rec.get(u'TruckMoneyType', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家骠车马匹表#tagPlayerHorseTable:
+            PlayerID = %s,
+            TruckID = %s,
+            EventID = %s,
+            HorseLV = %s,
+            RemainTime = %s,
+            TruckState = %s,
+            TruckMoney = %s,
+            TruckMoneyType = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.TruckID,
+                self.EventID,
+                self.HorseLV,
+                self.RemainTime,
+                self.TruckState,
+                self.TruckMoney,
+                self.TruckMoneyType,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.TruckID,
+                self.EventID,
+                self.HorseLV,
+                self.RemainTime,
+                self.TruckState,
+                self.TruckMoney,
+                self.TruckMoneyType,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#玩家队伍表#tagPlayerTeamTable
+class tagPlayerTeamTable(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('TeamID', ctypes.c_ulong),
+        ('TeamType', ctypes.c_ubyte),
+        ('TagMapID', ctypes.c_ulong),
+        ('TagMapEx', ctypes.c_ushort),
+        ('ReqMinLV', ctypes.c_ushort),
+        ('ReqMaxLV', ctypes.c_ushort),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagPlayerTeamTable)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'TeamID'] = self.TeamID
+        rec[u'TeamType'] = self.TeamType
+        rec[u'TagMapID'] = self.TagMapID
+        rec[u'TagMapEx'] = self.TagMapEx
+        rec[u'ReqMinLV'] = self.ReqMinLV
+        rec[u'ReqMaxLV'] = self.ReqMaxLV
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.TeamID = rec.get(u'TeamID', 0)
+        self.TeamType = rec.get(u'TeamType', 0)
+        self.TagMapID = rec.get(u'TagMapID', 0)
+        self.TagMapEx = rec.get(u'TagMapEx', 0)
+        self.ReqMinLV = rec.get(u'ReqMinLV', 0)
+        self.ReqMaxLV = rec.get(u'ReqMaxLV', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'TeamID':self.TeamID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!TeamID = %s, error = %s, trycnt = %d'%(self.TeamID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'TeamID':self.TeamID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!TeamID = %s, error = %s, trycnt = %d'%(self.TeamID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!TeamID = %s, error = %s, trycnt = %d'%(self.TeamID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'TeamID':self.TeamID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'TeamID':self.TeamID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'TeamID':self.TeamID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:TeamID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.TeamID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.TeamID = %s, error = %s, trycnt = %d'%(self.TeamID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家队伍表#tagPlayerTeamTable:
+            TeamID = %s,
+            TeamType = %s,
+            TagMapID = %s,
+            TagMapEx = %s,
+            ReqMinLV = %s,
+            ReqMaxLV = %s,
+            ADOResult = %s,
+            '''%(
+                self.TeamID,
+                self.TeamType,
+                self.TagMapID,
+                self.TagMapEx,
+                self.ReqMinLV,
+                self.ReqMaxLV,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.TeamID,
+                self.TeamType,
+                self.TagMapID,
+                self.TagMapEx,
+                self.ReqMinLV,
+                self.ReqMaxLV,
+            )
+        return output
+
+
+#------------------------------------------------------
+#玩家Buff表#tagRoleBuff
+class tagRoleBuff(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('BuffType', ctypes.c_ubyte),
+        ('BuffID', ctypes.c_ushort),
+        ('RemainTime', ctypes.c_ulong),
+        ('Value', ctypes.c_ulong),
+        ('OwnerID', ctypes.c_ulong),
+        ('OwnerType', ctypes.c_ulong),
+        ('Value1', ctypes.c_ulong),
+        ('Value2', ctypes.c_ulong),
+        ('Layer', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagRoleBuff)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'BuffType'] = self.BuffType
+        rec[u'BuffID'] = self.BuffID
+        rec[u'RemainTime'] = self.RemainTime
+        rec[u'Value'] = self.Value
+        rec[u'OwnerID'] = self.OwnerID
+        rec[u'OwnerType'] = self.OwnerType
+        rec[u'Value1'] = self.Value1
+        rec[u'Value2'] = self.Value2
+        rec[u'Layer'] = self.Layer
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.BuffType = rec.get(u'BuffType', 0)
+        self.BuffID = rec.get(u'BuffID', 0)
+        self.RemainTime = rec.get(u'RemainTime', 0)
+        self.Value = rec.get(u'Value', 0)
+        self.OwnerID = rec.get(u'OwnerID', 0)
+        self.OwnerType = rec.get(u'OwnerType', 0)
+        self.Value1 = rec.get(u'Value1', 0)
+        self.Value2 = rec.get(u'Value2', 0)
+        self.Layer = rec.get(u'Layer', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家Buff表#tagRoleBuff:
+            PlayerID = %s,
+            BuffType = %s,
+            BuffID = %s,
+            RemainTime = %s,
+            Value = %s,
+            OwnerID = %s,
+            OwnerType = %s,
+            Value1 = %s,
+            Value2 = %s,
+            Layer = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.BuffType,
+                self.BuffID,
+                self.RemainTime,
+                self.Value,
+                self.OwnerID,
+                self.OwnerType,
+                self.Value1,
+                self.Value2,
+                self.Layer,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.BuffType,
+                self.BuffID,
+                self.RemainTime,
+                self.Value,
+                self.OwnerID,
+                self.OwnerType,
+                self.Value1,
+                self.Value2,
+                self.Layer,
+            )
+        return output
+
+
+
+
+#------------------------------------------------------
+#玩家任务表#tagRoleMission
+class tagRoleMission(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('MissionID', ctypes.c_ulong),
+        ('State', ctypes.c_int),
+        ('MissionState', ctypes.c_ushort),
+        ('DescriptionIndex', ctypes.c_ushort),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagRoleMission)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'MissionID'] = self.MissionID
+        rec[u'State'] = self.State
+        rec[u'MissionState'] = self.MissionState
+        rec[u'DescriptionIndex'] = self.DescriptionIndex
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.MissionID = rec.get(u'MissionID', 0)
+        self.State = rec.get(u'State', 0)
+        self.MissionState = rec.get(u'MissionState', 0)
+        self.DescriptionIndex = rec.get(u'DescriptionIndex', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家任务表#tagRoleMission:
+            PlayerID = %s,
+            MissionID = %s,
+            State = %s,
+            MissionState = %s,
+            DescriptionIndex = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.MissionID,
+                self.State,
+                self.MissionState,
+                self.DescriptionIndex,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.MissionID,
+                self.State,
+                self.MissionState,
+                self.DescriptionIndex,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#任务详情表#tagRoleMissionDict
+class tagRoleMissionDict(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('MissionID', ctypes.c_ulong),
+        ('DictName', ctypes.c_char * 30),
+        ('DictValue', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagRoleMissionDict)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'MissionID'] = self.MissionID
+        rec[u'DictName'] = fix_incomingText(self.DictName)
+        rec[u'DictValue'] = self.DictValue
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.MissionID = rec.get(u'MissionID', 0)
+        self.DictName = fix_outgoingText(rec.get(u'DictName', u''))
+        self.DictValue = rec.get(u'DictValue', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//任务详情表#tagRoleMissionDict:
+            PlayerID = %s,
+            MissionID = %s,
+            DictName = %s,
+            DictValue = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.MissionID,
+                self.DictName,
+                self.DictValue,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.MissionID,
+                self.DictName,
+                self.DictValue,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetDictName(self,Str):
+        if len(Str)<=30:
+            self.DictName = Str
+        else:
+            self.DictName = Str[:30]
+            
+
+
+#------------------------------------------------------
+#玩家字典表#tagRoleNomalDict
+class tagRoleNomalDict(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('DictName', ctypes.c_char * 30),
+        ('DictValue', ctypes.c_ulong),
+        ('Type', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagRoleNomalDict)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'DictName'] = fix_incomingText(self.DictName)
+        rec[u'DictValue'] = self.DictValue
+        rec[u'Type'] = self.Type
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.DictName = fix_outgoingText(rec.get(u'DictName', u''))
+        self.DictValue = rec.get(u'DictValue', 0)
+        self.Type = rec.get(u'Type', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':fix_incomingText(self.PlayerID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家字典表#tagRoleNomalDict:
+            PlayerID = %s,
+            DictName = %s,
+            DictValue = %s,
+            Type = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.DictName,
+                self.DictValue,
+                self.Type,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.DictName,
+                self.DictValue,
+                self.Type,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetDictName(self,Str):
+        if len(Str)<=30:
+            self.DictName = Str
+        else:
+            self.DictName = Str[:30]
+            
+
+
+
+#------------------------------------------------------
+#玩家宠物表#tagRolePet
+class tagRolePet(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PetID', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('NPCID', ctypes.c_ulong),
+        ('Name', ctypes.c_char * 24),
+        ('Friendliness', ctypes.c_ushort),
+        ('HP', ctypes.c_ulong),
+        ('MP', ctypes.c_ulong),
+        ('Lv', ctypes.c_ushort),
+        ('Exp', ctypes.c_ulong),
+        ('HPTalent', ctypes.c_ushort),
+        ('MPTalent', ctypes.c_ushort),
+        ('PhysicAtkTalent', ctypes.c_ushort),
+        ('MagicAtkTalent', ctypes.c_ushort),
+        ('PhysicDefTalent', ctypes.c_ushort),
+        ('MagicDefTalent', ctypes.c_ushort),
+        ('BindType', ctypes.c_ubyte),
+        ('STR', ctypes.c_ulong),
+        ('PNE', ctypes.c_ulong),
+        ('PHY', ctypes.c_ulong),
+        ('CON', ctypes.c_ulong),
+        ('Pos', ctypes.c_ubyte),
+        ('DailyTrainCnt', ctypes.c_ubyte),
+        ('RemainTrainTime', ctypes.c_ulong),
+        ('UseCreatorDrugCnt', ctypes.c_ubyte),
+        ('LeftPoints', ctypes.c_ushort),
+        ('AIMode', ctypes.c_ubyte),
+        ('IsBattle', ctypes.c_ubyte),
+        ('BattlePower', ctypes.c_ulong),
+        ('IncreateSkillCnt', ctypes.c_ubyte),
+        ('TrainType', ctypes.c_ubyte),
+        ('PetIndex', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagRolePet)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PetID'] = self.PetID
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'NPCID'] = self.NPCID
+        rec[u'Name'] = fix_incomingText(self.Name)
+        rec[u'Friendliness'] = self.Friendliness
+        rec[u'HP'] = self.HP
+        rec[u'MP'] = self.MP
+        rec[u'Lv'] = self.Lv
+        rec[u'Exp'] = self.Exp
+        rec[u'HPTalent'] = self.HPTalent
+        rec[u'MPTalent'] = self.MPTalent
+        rec[u'PhysicAtkTalent'] = self.PhysicAtkTalent
+        rec[u'MagicAtkTalent'] = self.MagicAtkTalent
+        rec[u'PhysicDefTalent'] = self.PhysicDefTalent
+        rec[u'MagicDefTalent'] = self.MagicDefTalent
+        rec[u'BindType'] = self.BindType
+        rec[u'STR'] = self.STR
+        rec[u'PNE'] = self.PNE
+        rec[u'PHY'] = self.PHY
+        rec[u'CON'] = self.CON
+        rec[u'Pos'] = self.Pos
+        rec[u'DailyTrainCnt'] = self.DailyTrainCnt
+        rec[u'RemainTrainTime'] = self.RemainTrainTime
+        rec[u'UseCreatorDrugCnt'] = self.UseCreatorDrugCnt
+        rec[u'LeftPoints'] = self.LeftPoints
+        rec[u'AIMode'] = self.AIMode
+        rec[u'IsBattle'] = self.IsBattle
+        rec[u'BattlePower'] = self.BattlePower
+        rec[u'IncreateSkillCnt'] = self.IncreateSkillCnt
+        rec[u'TrainType'] = self.TrainType
+        rec[u'PetIndex'] = self.PetIndex
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PetID = rec.get(u'PetID', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.NPCID = rec.get(u'NPCID', 0)
+        self.Name = fix_outgoingText(rec.get(u'Name', u''))
+        self.Friendliness = rec.get(u'Friendliness', 0)
+        self.HP = rec.get(u'HP', 0)
+        self.MP = rec.get(u'MP', 0)
+        self.Lv = rec.get(u'Lv', 0)
+        self.Exp = rec.get(u'Exp', 0)
+        self.HPTalent = rec.get(u'HPTalent', 0)
+        self.MPTalent = rec.get(u'MPTalent', 0)
+        self.PhysicAtkTalent = rec.get(u'PhysicAtkTalent', 0)
+        self.MagicAtkTalent = rec.get(u'MagicAtkTalent', 0)
+        self.PhysicDefTalent = rec.get(u'PhysicDefTalent', 0)
+        self.MagicDefTalent = rec.get(u'MagicDefTalent', 0)
+        self.BindType = rec.get(u'BindType', 0)
+        self.STR = rec.get(u'STR', 0)
+        self.PNE = rec.get(u'PNE', 0)
+        self.PHY = rec.get(u'PHY', 0)
+        self.CON = rec.get(u'CON', 0)
+        self.Pos = rec.get(u'Pos', 0)
+        self.DailyTrainCnt = rec.get(u'DailyTrainCnt', 0)
+        self.RemainTrainTime = rec.get(u'RemainTrainTime', 0)
+        self.UseCreatorDrugCnt = rec.get(u'UseCreatorDrugCnt', 0)
+        self.LeftPoints = rec.get(u'LeftPoints', 0)
+        self.AIMode = rec.get(u'AIMode', 0)
+        self.IsBattle = rec.get(u'IsBattle', 0)
+        self.BattlePower = rec.get(u'BattlePower', 0)
+        self.IncreateSkillCnt = rec.get(u'IncreateSkillCnt', 0)
+        self.TrainType = rec.get(u'TrainType', 0)
+        self.PetIndex = rec.get(u'PetIndex', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PetID':self.PetID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PetID':self.PetID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PetID':self.PetID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家宠物表#tagRolePet:
+            PetID = %s,
+            PlayerID = %s,
+            NPCID = %s,
+            Name = %s,
+            Friendliness = %s,
+            HP = %s,
+            MP = %s,
+            Lv = %s,
+            Exp = %s,
+            HPTalent = %s,
+            MPTalent = %s,
+            PhysicAtkTalent = %s,
+            MagicAtkTalent = %s,
+            PhysicDefTalent = %s,
+            MagicDefTalent = %s,
+            BindType = %s,
+            STR = %s,
+            PNE = %s,
+            PHY = %s,
+            CON = %s,
+            Pos = %s,
+            DailyTrainCnt = %s,
+            RemainTrainTime = %s,
+            UseCreatorDrugCnt = %s,
+            LeftPoints = %s,
+            AIMode = %s,
+            IsBattle = %s,
+            BattlePower = %s,
+            IncreateSkillCnt = %s,
+            TrainType = %s,
+            PetIndex = %s,
+            ADOResult = %s,
+            '''%(
+                self.PetID,
+                self.PlayerID,
+                self.NPCID,
+                self.Name,
+                self.Friendliness,
+                self.HP,
+                self.MP,
+                self.Lv,
+                self.Exp,
+                self.HPTalent,
+                self.MPTalent,
+                self.PhysicAtkTalent,
+                self.MagicAtkTalent,
+                self.PhysicDefTalent,
+                self.MagicDefTalent,
+                self.BindType,
+                self.STR,
+                self.PNE,
+                self.PHY,
+                self.CON,
+                self.Pos,
+                self.DailyTrainCnt,
+                self.RemainTrainTime,
+                self.UseCreatorDrugCnt,
+                self.LeftPoints,
+                self.AIMode,
+                self.IsBattle,
+                self.BattlePower,
+                self.IncreateSkillCnt,
+                self.TrainType,
+                self.PetIndex,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PetID,
+                self.PlayerID,
+                self.NPCID,
+                self.Name,
+                self.Friendliness,
+                self.HP,
+                self.MP,
+                self.Lv,
+                self.Exp,
+                self.HPTalent,
+                self.MPTalent,
+                self.PhysicAtkTalent,
+                self.MagicAtkTalent,
+                self.PhysicDefTalent,
+                self.MagicDefTalent,
+                self.BindType,
+                self.STR,
+                self.PNE,
+                self.PHY,
+                self.CON,
+                self.Pos,
+                self.DailyTrainCnt,
+                self.RemainTrainTime,
+                self.UseCreatorDrugCnt,
+                self.LeftPoints,
+                self.AIMode,
+                self.IsBattle,
+                self.BattlePower,
+                self.IncreateSkillCnt,
+                self.TrainType,
+                self.PetIndex,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetName(self,Str):
+        if len(Str)<=24:
+            self.Name = Str
+        else:
+            self.Name = Str[:24]
+            
+
+
+#------------------------------------------------------
+#玩家重复事件表#tagRoleRepeatTime
+class tagRoleRepeatTime(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('EventID', ctypes.c_ushort),
+        ('CurrentTime', ctypes.c_ushort),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagRoleRepeatTime)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'EventID'] = self.EventID
+        rec[u'CurrentTime'] = self.CurrentTime
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.EventID = rec.get(u'EventID', 0)
+        self.CurrentTime = rec.get(u'CurrentTime', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家重复事件表#tagRoleRepeatTime:
+            PlayerID = %s,
+            EventID = %s,
+            CurrentTime = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.EventID,
+                self.CurrentTime,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.EventID,
+                self.CurrentTime,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#玩家技能表#tagRoleSkill
+class tagRoleSkill(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('SkillID', ctypes.c_ushort),
+        ('RemainTime', ctypes.c_ulong),
+        ('Proficiency', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagRoleSkill)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'SkillID'] = self.SkillID
+        rec[u'RemainTime'] = self.RemainTime
+        rec[u'Proficiency'] = self.Proficiency
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.SkillID = rec.get(u'SkillID', 0)
+        self.RemainTime = rec.get(u'RemainTime', 0)
+        self.Proficiency = rec.get(u'Proficiency', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家技能表#tagRoleSkill:
+            PlayerID = %s,
+            SkillID = %s,
+            RemainTime = %s,
+            Proficiency = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.SkillID,
+                self.RemainTime,
+                self.Proficiency,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.SkillID,
+                self.RemainTime,
+                self.Proficiency,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#保存服务器端数据库版本#tagServerDataVersionNO
+class tagServerDataVersionNO(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('Type', ctypes.c_ubyte),
+        ('ServerDataVersionNO', ctypes.c_ulong),
+        ('GameServerDataVersionNO', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagServerDataVersionNO)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'Type'] = self.Type
+        rec[u'ServerDataVersionNO'] = self.ServerDataVersionNO
+        rec[u'GameServerDataVersionNO'] = self.GameServerDataVersionNO
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.Type = rec.get(u'Type', 0)
+        self.ServerDataVersionNO = rec.get(u'ServerDataVersionNO', 0)
+        self.GameServerDataVersionNO = rec.get(u'GameServerDataVersionNO', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'Type':self.Type})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'Type':self.Type})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:Type = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.Type))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//保存服务器端数据库版本#tagServerDataVersionNO:
+            Type = %s,
+            ServerDataVersionNO = %s,
+            GameServerDataVersionNO = %s,
+            ADOResult = %s,
+            '''%(
+                self.Type,
+                self.ServerDataVersionNO,
+                self.GameServerDataVersionNO,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.Type,
+                self.ServerDataVersionNO,
+                self.GameServerDataVersionNO,
+            )
+        return output
+
+
+
+#------------------------------------------------------
+#队伍成员表#tagTeamMemberTable
+class tagTeamMemberTable(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('TeamID', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('TeamIndex', ctypes.c_ubyte),
+        ('TeamLV', ctypes.c_ubyte),
+        ('PlayerName', ctypes.c_char * 33),
+        ('Job', ctypes.c_ubyte),
+        ('JobLevel', ctypes.c_ubyte),
+        ('LV', ctypes.c_ushort),
+        ('RealmLV', ctypes.c_ushort),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagTeamMemberTable)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'TeamID'] = self.TeamID
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TeamIndex'] = self.TeamIndex
+        rec[u'TeamLV'] = self.TeamLV
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'Job'] = self.Job
+        rec[u'JobLevel'] = self.JobLevel
+        rec[u'LV'] = self.LV
+        rec[u'RealmLV'] = self.RealmLV
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.TeamID = rec.get(u'TeamID', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TeamIndex = rec.get(u'TeamIndex', 0)
+        self.TeamLV = rec.get(u'TeamLV', 0)
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.Job = rec.get(u'Job', 0)
+        self.JobLevel = rec.get(u'JobLevel', 0)
+        self.LV = rec.get(u'LV', 0)
+        self.RealmLV = rec.get(u'RealmLV', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!TeamID = %s, error = %s, trycnt = %d'%(self.TeamID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!TeamID = %s, error = %s, trycnt = %d'%(self.TeamID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'TeamID':self.TeamID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'TeamID':self.TeamID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:TeamID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.TeamID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.TeamID = %s, error = %s, trycnt = %d'%(self.TeamID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//队伍成员表#tagTeamMemberTable:
+            TeamID = %s,
+            PlayerID = %s,
+            TeamIndex = %s,
+            TeamLV = %s,
+            PlayerName = %s,
+            Job = %s,
+            JobLevel = %s,
+            LV = %s,
+            RealmLV = %s,
+            ADOResult = %s,
+            '''%(
+                self.TeamID,
+                self.PlayerID,
+                self.TeamIndex,
+                self.TeamLV,
+                self.PlayerName,
+                self.Job,
+                self.JobLevel,
+                self.LV,
+                self.RealmLV,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.TeamID,
+                self.PlayerID,
+                self.TeamIndex,
+                self.TeamLV,
+                self.PlayerName,
+                self.Job,
+                self.JobLevel,
+                self.LV,
+                self.RealmLV,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+
+
+
+#通用记录表#tagUniversalGameRec
+class tagUniversalGameRec(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('Type', ctypes.c_ubyte),
+        ('Time', ctypes.c_double),
+        ('StrValue1', ctypes.c_char * 33),
+        ('StrValue2', ctypes.c_char * 33),
+        ('Value1', ctypes.c_ulong),
+        ('Value2', ctypes.c_ulong),
+        ('Value3', ctypes.c_ulong),
+        ('Value4', ctypes.c_ulong),
+        ('Value5', ctypes.c_ulong),
+        ('StrValue3', ctypes.c_char * 256),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagUniversalGameRec)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'Type'] = self.Type
+        rec[u'Time'] = self.Time
+        rec[u'StrValue1'] = fix_incomingText(self.StrValue1)
+        rec[u'StrValue2'] = fix_incomingText(self.StrValue2)
+        rec[u'Value1'] = self.Value1
+        rec[u'Value2'] = self.Value2
+        rec[u'Value3'] = self.Value3
+        rec[u'Value4'] = self.Value4
+        rec[u'Value5'] = self.Value5
+        rec[u'StrValue3'] = fix_incomingText(self.StrValue3)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.Type = rec.get(u'Type', 0)
+        self.Time = rec.get(u'Time', 0)
+        self.StrValue1 = fix_outgoingText(rec.get(u'StrValue1', u''))
+        self.StrValue2 = fix_outgoingText(rec.get(u'StrValue2', u''))
+        self.Value1 = rec.get(u'Value1', 0)
+        self.Value2 = rec.get(u'Value2', 0)
+        self.Value3 = rec.get(u'Value3', 0)
+        self.Value4 = rec.get(u'Value4', 0)
+        self.Value5 = rec.get(u'Value5', 0)
+        self.StrValue3 = fix_outgoingText(rec.get(u'StrValue3', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'Type':self.Type})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'Type':self.Type})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:Type = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.Type))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.Type = %s, error = %s, trycnt = %d'%(self.Type, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//通用记录表#tagUniversalGameRec:
+            Type = %s,
+            Time = %s,
+            StrValue1 = %s,
+            StrValue2 = %s,
+            Value1 = %s,
+            Value2 = %s,
+            Value3 = %s,
+            Value4 = %s,
+            Value5 = %s,
+            StrValue3 = %s,
+            ADOResult = %s,
+            '''%(
+                self.Type,
+                self.Time,
+                self.StrValue1,
+                self.StrValue2,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+                self.StrValue3,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.Type,
+                self.Time,
+                self.StrValue1,
+                self.StrValue2,
+                self.Value1,
+                self.Value2,
+                self.Value3,
+                self.Value4,
+                self.Value5,
+                self.StrValue3,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetStrValue1(self,Str):
+        if len(Str)<=33:
+            self.StrValue1 = Str
+        else:
+            self.StrValue1 = Str[:33]
+            
+    def SetStrValue2(self,Str):
+        if len(Str)<=33:
+            self.StrValue2 = Str
+        else:
+            self.StrValue2 = Str[:33]
+            
+    def SetStrValue3(self,Str):
+        if len(Str)<=256:
+            self.StrValue3 = Str
+        else:
+            self.StrValue3 = Str[:256]
+                                   
+
+#阵法#tagBattleFormation
+class tagBattleFormation(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('FormationID', ctypes.c_ulong),
+        ('PlayerID', ctypes.c_ulong),
+        ('IsActive', ctypes.c_ubyte),
+        ('LV', ctypes.c_ushort),
+        ('Pos1', ctypes.c_ulong),
+        ('Pos2', ctypes.c_ulong),
+        ('Pos3', ctypes.c_ulong),
+        ('Pos4', ctypes.c_ulong),
+        ('Pos5', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagBattleFormation)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'FormationID'] = self.FormationID
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'IsActive'] = self.IsActive
+        rec[u'LV'] = self.LV
+        rec[u'Pos1'] = self.Pos1
+        rec[u'Pos2'] = self.Pos2
+        rec[u'Pos3'] = self.Pos3
+        rec[u'Pos4'] = self.Pos4
+        rec[u'Pos5'] = self.Pos5
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.FormationID = rec.get(u'FormationID', 0)
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.IsActive = rec.get(u'IsActive', 0)
+        self.LV = rec.get(u'LV', 0)
+        self.Pos1 = rec.get(u'Pos1', 0)
+        self.Pos2 = rec.get(u'Pos2', 0)
+        self.Pos3 = rec.get(u'Pos3', 0)
+        self.Pos4 = rec.get(u'Pos4', 0)
+        self.Pos5 = rec.get(u'Pos5', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//阵法#tagBattleFormation:
+            FormationID = %s,
+            PlayerID = %s,
+            IsActive = %s,
+            LV = %s,
+            Pos1 = %s,
+            Pos2 = %s,
+            Pos3 = %s,
+            Pos4 = %s,
+            Pos5 = %s,
+            ADOResult = %s,
+            '''%(
+                self.FormationID,
+                self.PlayerID,
+                self.IsActive,
+                self.LV,
+                self.Pos1,
+                self.Pos2,
+                self.Pos3,
+                self.Pos4,
+                self.Pos5,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.FormationID,
+                self.PlayerID,
+                self.IsActive,
+                self.LV,
+                self.Pos1,
+                self.Pos2,
+                self.Pos3,
+                self.Pos4,
+                self.Pos5,
+            )
+        return output
+
+#交易所物品#tagGameBourseItem
+class tagGameBourseItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ItemGUID', ctypes.c_char * 40),
+        ('PlayerID', ctypes.c_ulong),
+        ('ItemTypeID', ctypes.c_ulong),
+        ('PlayerName', ctypes.c_char * 33),
+        ('IsSoldOut', ctypes.c_ubyte),
+        ('CustomerPlayerID', ctypes.c_ulong),
+        ('CustomerPlayerName', ctypes.c_char * 33),
+        ('PriceType', ctypes.c_ubyte),
+        ('PriceCount', ctypes.c_ulong),
+        ('OnSaleTime', ctypes.c_char * 30),
+        ('SoldOutTime', ctypes.c_char * 30),
+        ('Type', ctypes.c_ulong),
+        ('EquipPlace', ctypes.c_ubyte),
+        ('LV', ctypes.c_ushort),
+        ('UseLV', ctypes.c_ushort),
+        ('JobLimit', ctypes.c_ulong),
+        ('ItemQuality', ctypes.c_ubyte),
+        ('Count', ctypes.c_ushort),
+        ('ItemColor', ctypes.c_ubyte),
+        ('UserDataLen', ctypes.c_ulong),
+        ('UserData', ctypes.c_char_p),
+        ('OperateInfo', ctypes.c_ulong),
+        ('Pwd', ctypes.c_char * 8),
+        ('EquipGS', ctypes.c_ulong),
+        ('ItemName', ctypes.c_char * 33),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.ItemGUID = ''
+        self.PlayerID = 0
+        self.ItemTypeID = 0
+        self.PlayerName = ''
+        self.IsSoldOut = 0
+        self.CustomerPlayerID = 0
+        self.CustomerPlayerName = ''
+        self.PriceType = 0
+        self.PriceCount = 0
+        self.OnSaleTime = ''
+        self.SoldOutTime = ''
+        self.Type = 0
+        self.EquipPlace = 0
+        self.LV = 0
+        self.UseLV = 0
+        self.JobLimit = 0
+        self.ItemQuality = 0
+        self.Count = 0
+        self.ItemColor = 0
+        self.UserDataLen = 0
+        self.UserData = ''
+        self.OperateInfo = 0
+        self.Pwd = ''
+        self.EquipGS = 0
+        self.ItemName = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.ItemGUID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ItemTypeID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.IsSoldOut, pos = CommFunc.ReadBYTE(buf, pos)
+        self.CustomerPlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CustomerPlayerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.PriceType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.PriceCount, pos = CommFunc.ReadDWORD(buf, pos)
+        self.OnSaleTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.SoldOutTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.Type, pos = CommFunc.ReadDWORD(buf, pos)
+        self.EquipPlace, pos = CommFunc.ReadBYTE(buf, pos)
+        self.LV, pos = CommFunc.ReadWORD(buf, pos)
+        self.UseLV, pos = CommFunc.ReadWORD(buf, pos)
+        self.JobLimit, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ItemQuality, pos = CommFunc.ReadBYTE(buf, pos)
+        self.Count, pos = CommFunc.ReadWORD(buf, pos)
+        self.ItemColor, pos = CommFunc.ReadBYTE(buf, pos)
+        self.UserDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        self.OperateInfo, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Pwd, pos = CommFunc.ReadString(buf, pos, 8)
+        self.EquipGS, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ItemName, pos = CommFunc.ReadString(buf, pos, 33)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.ItemGUID)
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteDWORD(buf, self.ItemTypeID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.PlayerName)
+        buf = CommFunc.WriteBYTE(buf, self.IsSoldOut)
+        buf = CommFunc.WriteDWORD(buf, self.CustomerPlayerID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.CustomerPlayerName)
+        buf = CommFunc.WriteBYTE(buf, self.PriceType)
+        buf = CommFunc.WriteDWORD(buf, self.PriceCount)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.OnSaleTime)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.SoldOutTime)
+        buf = CommFunc.WriteDWORD(buf, self.Type)
+        buf = CommFunc.WriteBYTE(buf, self.EquipPlace)
+        buf = CommFunc.WriteWORD(buf, self.LV)
+        buf = CommFunc.WriteWORD(buf, self.UseLV)
+        buf = CommFunc.WriteDWORD(buf, self.JobLimit)
+        buf = CommFunc.WriteBYTE(buf, self.ItemQuality)
+        buf = CommFunc.WriteWORD(buf, self.Count)
+        buf = CommFunc.WriteBYTE(buf, self.ItemColor)
+        buf = CommFunc.WriteDWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        buf = CommFunc.WriteDWORD(buf, self.OperateInfo)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 8, self.Pwd)
+        buf = CommFunc.WriteDWORD(buf, self.EquipGS)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.ItemName)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += self.UserDataLen
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 8
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ItemGUID'] = fix_incomingText(self.ItemGUID)
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'ItemTypeID'] = self.ItemTypeID
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'IsSoldOut'] = self.IsSoldOut
+        rec[u'CustomerPlayerID'] = self.CustomerPlayerID
+        rec[u'CustomerPlayerName'] = fix_incomingText(self.CustomerPlayerName)
+        rec[u'PriceType'] = self.PriceType
+        rec[u'PriceCount'] = self.PriceCount
+        rec[u'OnSaleTime'] = fix_incomingText(self.OnSaleTime)
+        rec[u'SoldOutTime'] = fix_incomingText(self.SoldOutTime)
+        rec[u'Type'] = self.Type
+        rec[u'EquipPlace'] = self.EquipPlace
+        rec[u'LV'] = self.LV
+        rec[u'UseLV'] = self.UseLV
+        rec[u'JobLimit'] = self.JobLimit
+        rec[u'ItemQuality'] = self.ItemQuality
+        rec[u'Count'] = self.Count
+        rec[u'ItemColor'] = self.ItemColor
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        rec[u'OperateInfo'] = self.OperateInfo
+        rec[u'Pwd'] = fix_incomingText(self.Pwd)
+        rec[u'EquipGS'] = self.EquipGS
+        rec[u'ItemName'] = fix_incomingText(self.ItemName)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ItemGUID = fix_outgoingText(rec.get(u'ItemGUID', u''))
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.ItemTypeID = rec.get(u'ItemTypeID', 0)
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.IsSoldOut = rec.get(u'IsSoldOut', 0)
+        self.CustomerPlayerID = rec.get(u'CustomerPlayerID', 0)
+        self.CustomerPlayerName = fix_outgoingText(rec.get(u'CustomerPlayerName', u''))
+        self.PriceType = rec.get(u'PriceType', 0)
+        self.PriceCount = rec.get(u'PriceCount', 0)
+        self.OnSaleTime = fix_outgoingText(rec.get(u'OnSaleTime', u''))
+        self.SoldOutTime = fix_outgoingText(rec.get(u'SoldOutTime', u''))
+        self.Type = rec.get(u'Type', 0)
+        self.EquipPlace = rec.get(u'EquipPlace', 0)
+        self.LV = rec.get(u'LV', 0)
+        self.UseLV = rec.get(u'UseLV', 0)
+        self.JobLimit = rec.get(u'JobLimit', 0)
+        self.ItemQuality = rec.get(u'ItemQuality', 0)
+        self.Count = rec.get(u'Count', 0)
+        self.ItemColor = rec.get(u'ItemColor', 0)
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+        self.OperateInfo = rec.get(u'OperateInfo', 0)
+        self.Pwd = fix_outgoingText(rec.get(u'Pwd', u''))
+        self.EquipGS = rec.get(u'EquipGS', 0)
+        self.ItemName = fix_outgoingText(rec.get(u'ItemName', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!ItemGUID = %s, error = %s, trycnt = %d'%(self.ItemGUID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!ItemGUID = %s, error = %s, trycnt = %d'%(self.ItemGUID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'ItemGUID':fix_incomingText(self.ItemGUID)})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'ItemGUID':fix_incomingText(self.ItemGUID)})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:ItemGUID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.ItemGUID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.ItemGUID = %s, error = %s, trycnt = %d'%(self.ItemGUID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//交易所物品#tagGameBourseItem:
+            ItemGUID = %s,
+            PlayerID = %s,
+            ItemTypeID = %s,
+            PlayerName = %s,
+            IsSoldOut = %s,
+            CustomerPlayerID = %s,
+            CustomerPlayerName = %s,
+            PriceType = %s,
+            PriceCount = %s,
+            OnSaleTime = %s,
+            SoldOutTime = %s,
+            Type = %s,
+            EquipPlace = %s,
+            LV = %s,
+            UseLV = %s,
+            JobLimit = %s,
+            ItemQuality = %s,
+            Count = %s,
+            ItemColor = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            OperateInfo = %s,
+            Pwd = %s,
+            EquipGS = %s,
+            ItemName = %s,
+            ADOResult = %s,
+            '''%(
+                self.ItemGUID,
+                self.PlayerID,
+                self.ItemTypeID,
+                self.PlayerName,
+                self.IsSoldOut,
+                self.CustomerPlayerID,
+                self.CustomerPlayerName,
+                self.PriceType,
+                self.PriceCount,
+                self.OnSaleTime,
+                self.SoldOutTime,
+                self.Type,
+                self.EquipPlace,
+                self.LV,
+                self.UseLV,
+                self.JobLimit,
+                self.ItemQuality,
+                self.Count,
+                self.ItemColor,
+                self.UserDataLen,
+                self.UserData,
+                self.OperateInfo,
+                self.Pwd,
+                self.EquipGS,
+                self.ItemName,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.ItemGUID,
+                self.PlayerID,
+                self.ItemTypeID,
+                self.PlayerName,
+                self.IsSoldOut,
+                self.CustomerPlayerID,
+                self.CustomerPlayerName,
+                self.PriceType,
+                self.PriceCount,
+                self.OnSaleTime,
+                self.SoldOutTime,
+                self.Type,
+                self.EquipPlace,
+                self.LV,
+                self.UseLV,
+                self.JobLimit,
+                self.ItemQuality,
+                self.Count,
+                self.ItemColor,
+                self.UserDataLen,
+                self.UserData,
+                self.OperateInfo,
+                self.Pwd,
+                self.EquipGS,
+                self.ItemName,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetItemGUID(self,Str):
+        if len(Str)<=40:
+            self.ItemGUID = Str
+        else:
+            self.ItemGUID = Str[:40]
+            
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+    def SetCustomerPlayerName(self,Str):
+        if len(Str)<=33:
+            self.CustomerPlayerName = Str
+        else:
+            self.CustomerPlayerName = Str[:33]
+            
+    def SetOnSaleTime(self,Str):
+        if len(Str)<=30:
+            self.OnSaleTime = Str
+        else:
+            self.OnSaleTime = Str[:30]
+            
+    def SetSoldOutTime(self,Str):
+        if len(Str)<=30:
+            self.SoldOutTime = Str
+        else:
+            self.SoldOutTime = Str[:30]
+            
+    def SetPwd(self,Str):
+        if len(Str)<=8:
+            self.Pwd = Str
+        else:
+            self.Pwd = Str[:8]
+            
+    def SetItemName(self,Str):
+        if len(Str)<=33:
+            self.ItemName = Str
+        else:
+            self.ItemName = Str[:33]
+            
+
+
+
+#天梯竞技场玩家记录表#tagHighLadderPlayer
+class tagHighLadderPlayer(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('Oreder', ctypes.c_ushort),
+        ('PlayerName', ctypes.c_char * 33),
+        ('PlayerLV', ctypes.c_ushort),
+        ('FightPower', ctypes.c_ulong),
+        ('FightPropertyDataLen', ctypes.c_ulong),
+        ('FightPropertyData', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.PlayerID = 0
+        self.Oreder = 0
+        self.PlayerName = ''
+        self.PlayerLV = 0
+        self.FightPower = 0
+        self.FightPropertyDataLen = 0
+        self.FightPropertyData = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Oreder, pos = CommFunc.ReadWORD(buf, pos)
+        self.PlayerName, pos = CommFunc.ReadString(buf, pos, 33)
+        self.PlayerLV, pos = CommFunc.ReadWORD(buf, pos)
+        self.FightPower, pos = CommFunc.ReadDWORD(buf, pos)
+        self.FightPropertyDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.FightPropertyDataLen)
+        self.FightPropertyData = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteWORD(buf, self.Oreder)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.PlayerName)
+        buf = CommFunc.WriteWORD(buf, self.PlayerLV)
+        buf = CommFunc.WriteDWORD(buf, self.FightPower)
+        buf = CommFunc.WriteDWORD(buf, self.FightPropertyDataLen)
+        buf = CommFunc.WriteString(buf, self.FightPropertyDataLen, self.FightPropertyData)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += self.FightPropertyDataLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'Oreder'] = self.Oreder
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'PlayerLV'] = self.PlayerLV
+        rec[u'FightPower'] = self.FightPower
+        rec[u'FightPropertyDataLen'] = self.FightPropertyDataLen
+        rec[u'FightPropertyData'] = fix_incomingText(self.FightPropertyData)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.Oreder = rec.get(u'Oreder', 0)
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.PlayerLV = rec.get(u'PlayerLV', 0)
+        self.FightPower = rec.get(u'FightPower', 0)
+        self.FightPropertyDataLen = rec.get(u'FightPropertyDataLen', 0)
+        self.FightPropertyData = fix_outgoingText(rec.get(u'FightPropertyData', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//天梯竞技场玩家记录表#tagHighLadderPlayer:
+            PlayerID = %s,
+            Oreder = %s,
+            PlayerName = %s,
+            PlayerLV = %s,
+            FightPower = %s,
+            FightPropertyDataLen = %s,
+            FightPropertyData = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.Oreder,
+                self.PlayerName,
+                self.PlayerLV,
+                self.FightPower,
+                self.FightPropertyDataLen,
+                self.FightPropertyData,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.Oreder,
+                self.PlayerName,
+                self.PlayerLV,
+                self.FightPower,
+                self.FightPropertyDataLen,
+                self.FightPropertyData,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+
+
+            
+
+#天梯竞技场对战记录#tagHighLadderVSRec
+class tagHighLadderVSRec(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('VsPlayerID', ctypes.c_ulong),
+        ('Order', ctypes.c_ushort),
+        ('VsOrder', ctypes.c_ushort),
+        ('VsPlayerName', ctypes.c_char * 33),
+        ('Position', ctypes.c_ubyte),
+        ('Result', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagHighLadderVSRec)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'VsPlayerID'] = self.VsPlayerID
+        rec[u'Order'] = self.Order
+        rec[u'VsOrder'] = self.VsOrder
+        rec[u'VsPlayerName'] = fix_incomingText(self.VsPlayerName)
+        rec[u'Position'] = self.Position
+        rec[u'Result'] = self.Result
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.VsPlayerID = rec.get(u'VsPlayerID', 0)
+        self.Order = rec.get(u'Order', 0)
+        self.VsOrder = rec.get(u'VsOrder', 0)
+        self.VsPlayerName = fix_outgoingText(rec.get(u'VsPlayerName', u''))
+        self.Position = rec.get(u'Position', 0)
+        self.Result = rec.get(u'Result', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//天梯竞技场对战记录#tagHighLadderVSRec:
+            PlayerID = %s,
+            VsPlayerID = %s,
+            Order = %s,
+            VsOrder = %s,
+            VsPlayerName = %s,
+            Position = %s,
+            Result = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.VsPlayerID,
+                self.Order,
+                self.VsOrder,
+                self.VsPlayerName,
+                self.Position,
+                self.Result,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.VsPlayerID,
+                self.Order,
+                self.VsOrder,
+                self.VsPlayerName,
+                self.Position,
+                self.Result,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetVsPlayerName(self,Str):
+        if len(Str)<=33:
+            self.VsPlayerName = Str
+        else:
+            self.VsPlayerName = Str[:33]
+            
+#天梯竞技场玩家装备表#tagDBHighLadderItem
+class tagDBHighLadderItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('ItemTypeID', ctypes.c_ulong),
+        ('ItemPlaceType', ctypes.c_ubyte),
+        ('ItemPlaceIndex', ctypes.c_ushort),
+        ('Count', ctypes.c_ushort),
+        ('ItemStarLV', ctypes.c_ubyte),
+        ('IdentifyPar', ctypes.c_ubyte),
+        ('CurDurg', ctypes.c_ulong),
+        ('MaxDurg', ctypes.c_ulong),
+        ('CanPlaceStoneCount', ctypes.c_ubyte),
+        ('ItemProperty', ctypes.c_ubyte),
+        ('SoulProperty', ctypes.c_ushort),
+        ('Stone1', ctypes.c_ulong),
+        ('Stone2', ctypes.c_ulong),
+        ('Stone3', ctypes.c_ulong),
+        ('Stone4', ctypes.c_ulong),
+        ('Stone5', ctypes.c_ulong),
+        ('Stone6', ctypes.c_ulong),
+        ('Stone7', ctypes.c_ulong),
+        ('Stone8', ctypes.c_ulong),
+        ('Stone9', ctypes.c_ulong),
+        ('IsRenZhu', ctypes.c_ubyte),
+        ('EquipDefenseValue', ctypes.c_ulong),
+        ('EquipMinAtkValue', ctypes.c_ulong),
+        ('EquipMaxAtkValue', ctypes.c_ulong),
+        ('UserDataLen', ctypes.c_ulong),
+        ('UserData', ctypes.c_char_p),
+        ('FitLV', ctypes.c_ubyte),
+        ('Proficiency', ctypes.c_ulong),
+        ('IsSuite', ctypes.c_ubyte),
+        ('BaseHP', ctypes.c_ulong),
+        ('BaseMagicDef', ctypes.c_ulong),
+        ('MaxAddSkillCnt', ctypes.c_ubyte),
+        ('EquipMagicDefValue', ctypes.c_ulong),
+        ('EquipMinMagicAtkValue', ctypes.c_ulong),
+        ('EquipMaxMagicAtkValue', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.PlayerID = 0
+        self.ItemTypeID = 0
+        self.ItemPlaceType = 0
+        self.ItemPlaceIndex = 0
+        self.Count = 0
+        self.ItemStarLV = 0
+        self.IdentifyPar = 0
+        self.CurDurg = 0
+        self.MaxDurg = 0
+        self.CanPlaceStoneCount = 0
+        self.ItemProperty = 0
+        self.SoulProperty = 0
+        self.Stone1 = 0
+        self.Stone2 = 0
+        self.Stone3 = 0
+        self.Stone4 = 0
+        self.Stone5 = 0
+        self.Stone6 = 0
+        self.Stone7 = 0
+        self.Stone8 = 0
+        self.Stone9 = 0
+        self.IsRenZhu = 0
+        self.EquipDefenseValue = 0
+        self.EquipMinAtkValue = 0
+        self.EquipMaxAtkValue = 0
+        self.UserDataLen = 0
+        self.UserData = ''
+        self.FitLV = 0
+        self.Proficiency = 0
+        self.IsSuite = 0
+        self.BaseHP = 0
+        self.BaseMagicDef = 0
+        self.MaxAddSkillCnt = 0
+        self.EquipMagicDefValue = 0
+        self.EquipMinMagicAtkValue = 0
+        self.EquipMaxMagicAtkValue = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ItemTypeID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ItemPlaceType, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemPlaceIndex, pos = CommFunc.ReadWORD(buf, pos)
+        self.Count, pos = CommFunc.ReadWORD(buf, pos)
+        self.ItemStarLV, pos = CommFunc.ReadBYTE(buf, pos)
+        self.IdentifyPar, pos = CommFunc.ReadBYTE(buf, pos)
+        self.CurDurg, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MaxDurg, pos = CommFunc.ReadDWORD(buf, pos)
+        self.CanPlaceStoneCount, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemProperty, pos = CommFunc.ReadBYTE(buf, pos)
+        self.SoulProperty, pos = CommFunc.ReadWORD(buf, pos)
+        self.Stone1, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone2, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone3, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone4, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone5, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone6, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone7, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone8, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Stone9, pos = CommFunc.ReadDWORD(buf, pos)
+        self.IsRenZhu, pos = CommFunc.ReadBYTE(buf, pos)
+        self.EquipDefenseValue, pos = CommFunc.ReadDWORD(buf, pos)
+        self.EquipMinAtkValue, pos = CommFunc.ReadDWORD(buf, pos)
+        self.EquipMaxAtkValue, pos = CommFunc.ReadDWORD(buf, pos)
+        self.UserDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        self.FitLV, pos = CommFunc.ReadBYTE(buf, pos)
+        self.Proficiency, pos = CommFunc.ReadDWORD(buf, pos)
+        self.IsSuite, pos = CommFunc.ReadBYTE(buf, pos)
+        self.BaseHP, pos = CommFunc.ReadDWORD(buf, pos)
+        self.BaseMagicDef, pos = CommFunc.ReadDWORD(buf, pos)
+        self.MaxAddSkillCnt, pos = CommFunc.ReadBYTE(buf, pos)
+        self.EquipMagicDefValue, pos = CommFunc.ReadDWORD(buf, pos)
+        self.EquipMinMagicAtkValue, pos = CommFunc.ReadDWORD(buf, pos)
+        self.EquipMaxMagicAtkValue, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteDWORD(buf, self.ItemTypeID)
+        buf = CommFunc.WriteBYTE(buf, self.ItemPlaceType)
+        buf = CommFunc.WriteWORD(buf, self.ItemPlaceIndex)
+        buf = CommFunc.WriteWORD(buf, self.Count)
+        buf = CommFunc.WriteBYTE(buf, self.ItemStarLV)
+        buf = CommFunc.WriteBYTE(buf, self.IdentifyPar)
+        buf = CommFunc.WriteDWORD(buf, self.CurDurg)
+        buf = CommFunc.WriteDWORD(buf, self.MaxDurg)
+        buf = CommFunc.WriteBYTE(buf, self.CanPlaceStoneCount)
+        buf = CommFunc.WriteBYTE(buf, self.ItemProperty)
+        buf = CommFunc.WriteWORD(buf, self.SoulProperty)
+        buf = CommFunc.WriteDWORD(buf, self.Stone1)
+        buf = CommFunc.WriteDWORD(buf, self.Stone2)
+        buf = CommFunc.WriteDWORD(buf, self.Stone3)
+        buf = CommFunc.WriteDWORD(buf, self.Stone4)
+        buf = CommFunc.WriteDWORD(buf, self.Stone5)
+        buf = CommFunc.WriteDWORD(buf, self.Stone6)
+        buf = CommFunc.WriteDWORD(buf, self.Stone7)
+        buf = CommFunc.WriteDWORD(buf, self.Stone8)
+        buf = CommFunc.WriteDWORD(buf, self.Stone9)
+        buf = CommFunc.WriteBYTE(buf, self.IsRenZhu)
+        buf = CommFunc.WriteDWORD(buf, self.EquipDefenseValue)
+        buf = CommFunc.WriteDWORD(buf, self.EquipMinAtkValue)
+        buf = CommFunc.WriteDWORD(buf, self.EquipMaxAtkValue)
+        buf = CommFunc.WriteDWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        buf = CommFunc.WriteBYTE(buf, self.FitLV)
+        buf = CommFunc.WriteDWORD(buf, self.Proficiency)
+        buf = CommFunc.WriteBYTE(buf, self.IsSuite)
+        buf = CommFunc.WriteDWORD(buf, self.BaseHP)
+        buf = CommFunc.WriteDWORD(buf, self.BaseMagicDef)
+        buf = CommFunc.WriteBYTE(buf, self.MaxAddSkillCnt)
+        buf = CommFunc.WriteDWORD(buf, self.EquipMagicDefValue)
+        buf = CommFunc.WriteDWORD(buf, self.EquipMinMagicAtkValue)
+        buf = CommFunc.WriteDWORD(buf, self.EquipMaxMagicAtkValue)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += self.UserDataLen
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'ItemTypeID'] = self.ItemTypeID
+        rec[u'ItemPlaceType'] = self.ItemPlaceType
+        rec[u'ItemPlaceIndex'] = self.ItemPlaceIndex
+        rec[u'Count'] = self.Count
+        rec[u'ItemStarLV'] = self.ItemStarLV
+        rec[u'IdentifyPar'] = self.IdentifyPar
+        rec[u'CurDurg'] = self.CurDurg
+        rec[u'MaxDurg'] = self.MaxDurg
+        rec[u'CanPlaceStoneCount'] = self.CanPlaceStoneCount
+        rec[u'ItemProperty'] = self.ItemProperty
+        rec[u'SoulProperty'] = self.SoulProperty
+        rec[u'Stone1'] = self.Stone1
+        rec[u'Stone2'] = self.Stone2
+        rec[u'Stone3'] = self.Stone3
+        rec[u'Stone4'] = self.Stone4
+        rec[u'Stone5'] = self.Stone5
+        rec[u'Stone6'] = self.Stone6
+        rec[u'Stone7'] = self.Stone7
+        rec[u'Stone8'] = self.Stone8
+        rec[u'Stone9'] = self.Stone9
+        rec[u'IsRenZhu'] = self.IsRenZhu
+        rec[u'EquipDefenseValue'] = self.EquipDefenseValue
+        rec[u'EquipMinAtkValue'] = self.EquipMinAtkValue
+        rec[u'EquipMaxAtkValue'] = self.EquipMaxAtkValue
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        rec[u'FitLV'] = self.FitLV
+        rec[u'Proficiency'] = self.Proficiency
+        rec[u'IsSuite'] = self.IsSuite
+        rec[u'BaseHP'] = self.BaseHP
+        rec[u'BaseMagicDef'] = self.BaseMagicDef
+        rec[u'MaxAddSkillCnt'] = self.MaxAddSkillCnt
+        rec[u'EquipMagicDefValue'] = self.EquipMagicDefValue
+        rec[u'EquipMinMagicAtkValue'] = self.EquipMinMagicAtkValue
+        rec[u'EquipMaxMagicAtkValue'] = self.EquipMaxMagicAtkValue
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.ItemTypeID = rec.get(u'ItemTypeID', 0)
+        self.ItemPlaceType = rec.get(u'ItemPlaceType', 0)
+        self.ItemPlaceIndex = rec.get(u'ItemPlaceIndex', 0)
+        self.Count = rec.get(u'Count', 0)
+        self.ItemStarLV = rec.get(u'ItemStarLV', 0)
+        self.IdentifyPar = rec.get(u'IdentifyPar', 0)
+        self.CurDurg = rec.get(u'CurDurg', 0)
+        self.MaxDurg = rec.get(u'MaxDurg', 0)
+        self.CanPlaceStoneCount = rec.get(u'CanPlaceStoneCount', 0)
+        self.ItemProperty = rec.get(u'ItemProperty', 0)
+        self.SoulProperty = rec.get(u'SoulProperty', 0)
+        self.Stone1 = rec.get(u'Stone1', 0)
+        self.Stone2 = rec.get(u'Stone2', 0)
+        self.Stone3 = rec.get(u'Stone3', 0)
+        self.Stone4 = rec.get(u'Stone4', 0)
+        self.Stone5 = rec.get(u'Stone5', 0)
+        self.Stone6 = rec.get(u'Stone6', 0)
+        self.Stone7 = rec.get(u'Stone7', 0)
+        self.Stone8 = rec.get(u'Stone8', 0)
+        self.Stone9 = rec.get(u'Stone9', 0)
+        self.IsRenZhu = rec.get(u'IsRenZhu', 0)
+        self.EquipDefenseValue = rec.get(u'EquipDefenseValue', 0)
+        self.EquipMinAtkValue = rec.get(u'EquipMinAtkValue', 0)
+        self.EquipMaxAtkValue = rec.get(u'EquipMaxAtkValue', 0)
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+        self.FitLV = rec.get(u'FitLV', 0)
+        self.Proficiency = rec.get(u'Proficiency', 0)
+        self.IsSuite = rec.get(u'IsSuite', 0)
+        self.BaseHP = rec.get(u'BaseHP', 0)
+        self.BaseMagicDef = rec.get(u'BaseMagicDef', 0)
+        self.MaxAddSkillCnt = rec.get(u'MaxAddSkillCnt', 0)
+        self.EquipMagicDefValue = rec.get(u'EquipMagicDefValue', 0)
+        self.EquipMinMagicAtkValue = rec.get(u'EquipMinMagicAtkValue', 0)
+        self.EquipMaxMagicAtkValue = rec.get(u'EquipMaxMagicAtkValue', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//天梯竞技场玩家装备表#tagDBHighLadderItem:
+            PlayerID = %s,
+            ItemTypeID = %s,
+            ItemPlaceType = %s,
+            ItemPlaceIndex = %s,
+            Count = %s,
+            ItemStarLV = %s,
+            IdentifyPar = %s,
+            CurDurg = %s,
+            MaxDurg = %s,
+            CanPlaceStoneCount = %s,
+            ItemProperty = %s,
+            SoulProperty = %s,
+            Stone1 = %s,
+            Stone2 = %s,
+            Stone3 = %s,
+            Stone4 = %s,
+            Stone5 = %s,
+            Stone6 = %s,
+            Stone7 = %s,
+            Stone8 = %s,
+            Stone9 = %s,
+            IsRenZhu = %s,
+            EquipDefenseValue = %s,
+            EquipMinAtkValue = %s,
+            EquipMaxAtkValue = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            FitLV = %s,
+            Proficiency = %s,
+            IsSuite = %s,
+            BaseHP = %s,
+            BaseMagicDef = %s,
+            MaxAddSkillCnt = %s,
+            EquipMagicDefValue = %s,
+            EquipMinMagicAtkValue = %s,
+            EquipMaxMagicAtkValue = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.ItemTypeID,
+                self.ItemPlaceType,
+                self.ItemPlaceIndex,
+                self.Count,
+                self.ItemStarLV,
+                self.IdentifyPar,
+                self.CurDurg,
+                self.MaxDurg,
+                self.CanPlaceStoneCount,
+                self.ItemProperty,
+                self.SoulProperty,
+                self.Stone1,
+                self.Stone2,
+                self.Stone3,
+                self.Stone4,
+                self.Stone5,
+                self.Stone6,
+                self.Stone7,
+                self.Stone8,
+                self.Stone9,
+                self.IsRenZhu,
+                self.EquipDefenseValue,
+                self.EquipMinAtkValue,
+                self.EquipMaxAtkValue,
+                self.UserDataLen,
+                self.UserData,
+                self.FitLV,
+                self.Proficiency,
+                self.IsSuite,
+                self.BaseHP,
+                self.BaseMagicDef,
+                self.MaxAddSkillCnt,
+                self.EquipMagicDefValue,
+                self.EquipMinMagicAtkValue,
+                self.EquipMaxMagicAtkValue,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.ItemTypeID,
+                self.ItemPlaceType,
+                self.ItemPlaceIndex,
+                self.Count,
+                self.ItemStarLV,
+                self.IdentifyPar,
+                self.CurDurg,
+                self.MaxDurg,
+                self.CanPlaceStoneCount,
+                self.ItemProperty,
+                self.SoulProperty,
+                self.Stone1,
+                self.Stone2,
+                self.Stone3,
+                self.Stone4,
+                self.Stone5,
+                self.Stone6,
+                self.Stone7,
+                self.Stone8,
+                self.Stone9,
+                self.IsRenZhu,
+                self.EquipDefenseValue,
+                self.EquipMinAtkValue,
+                self.EquipMaxAtkValue,
+                self.UserDataLen,
+                self.UserData,
+                self.FitLV,
+                self.Proficiency,
+                self.IsSuite,
+                self.BaseHP,
+                self.BaseMagicDef,
+                self.MaxAddSkillCnt,
+                self.EquipMagicDefValue,
+                self.EquipMinMagicAtkValue,
+                self.EquipMaxMagicAtkValue,
+            )
+        return output
+
+#补偿物品信息表 #tagDBCompensationItem
+class tagDBCompensationItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('GUID', ctypes.c_char * 40),
+        ('Index', ctypes.c_ubyte),
+        ('ItemID', ctypes.c_ulong),
+        ('Count', ctypes.c_ulong),
+        ('IsBind', ctypes.c_ubyte),
+        ('UserDataLen', ctypes.c_ulong),
+        ('UserData', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.GUID = ''
+        self.Index = 0
+        self.ItemID = 0
+        self.Count = 0
+        self.IsBind = 0
+        self.UserDataLen = 0
+        self.UserData = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.GUID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.Index, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Count, pos = CommFunc.ReadDWORD(buf, pos)
+        self.IsBind, pos = CommFunc.ReadBYTE(buf, pos)
+        self.UserDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.GUID)
+        buf = CommFunc.WriteBYTE(buf, self.Index)
+        buf = CommFunc.WriteDWORD(buf, self.ItemID)
+        buf = CommFunc.WriteDWORD(buf, self.Count)
+        buf = CommFunc.WriteBYTE(buf, self.IsBind)
+        buf = CommFunc.WriteDWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += self.UserDataLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'GUID'] = fix_incomingText(self.GUID)
+        rec[u'Index'] = self.Index
+        rec[u'ItemID'] = self.ItemID
+        rec[u'Count'] = self.Count
+        rec[u'IsBind'] = self.IsBind
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.GUID = fix_outgoingText(rec.get(u'GUID', u''))
+        self.Index = rec.get(u'Index', 0)
+        self.ItemID = rec.get(u'ItemID', 0)
+        self.Count = rec.get(u'Count', 0)
+        self.IsBind = rec.get(u'IsBind', 0)
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//补偿物品信息表 #tagDBCompensationItem:
+            GUID = %s,
+            Index = %s,
+            ItemID = %s,
+            Count = %s,
+            IsBind = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            ADOResult = %s,
+            '''%(
+                self.GUID,
+                self.Index,
+                self.ItemID,
+                self.Count,
+                self.IsBind,
+                self.UserDataLen,
+                self.UserData,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.GUID,
+                self.Index,
+                self.ItemID,
+                self.Count,
+                self.IsBind,
+                self.UserDataLen,
+                self.UserData,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetGUID(self,Str):
+        if len(Str)<=40:
+            self.GUID = Str
+        else:
+            self.GUID = Str[:40]
+            
+
+#补偿物品全服领取条件表 #tagDBEntireCompensationRequire
+class tagDBEntireCompensationRequire(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('GUID', ctypes.c_char * 40),
+        ('CreateTime', ctypes.c_char * 30),
+        ('LimitTime', ctypes.c_char * 30),
+        ('PlayerLV', ctypes.c_ulong),
+        ('PlayerJob', ctypes.c_ubyte),
+        ('TextLen', ctypes.c_ulong),
+        ('Text', ctypes.c_char_p),
+        ('Gold', ctypes.c_ulong),
+        ('GoldPaper', ctypes.c_ulong),
+        ('Silver', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.GUID = ''
+        self.CreateTime = ''
+        self.LimitTime = ''
+        self.PlayerLV = 0
+        self.PlayerJob = 0
+        self.TextLen = 0
+        self.Text = ''
+        self.Gold = 0
+        self.GoldPaper = 0
+        self.Silver = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.GUID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.CreateTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.LimitTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.PlayerLV, pos = CommFunc.ReadDWORD(buf, pos)
+        self.PlayerJob, pos = CommFunc.ReadBYTE(buf, pos)
+        self.TextLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.TextLen)
+        self.Text = ctypes.c_char_p(tmp)
+        self.Gold, pos = CommFunc.ReadDWORD(buf, pos)
+        self.GoldPaper, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Silver, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.GUID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.CreateTime)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.LimitTime)
+        buf = CommFunc.WriteDWORD(buf, self.PlayerLV)
+        buf = CommFunc.WriteBYTE(buf, self.PlayerJob)
+        buf = CommFunc.WriteDWORD(buf, self.TextLen)
+        buf = CommFunc.WriteString(buf, self.TextLen, self.Text)
+        buf = CommFunc.WriteDWORD(buf, self.Gold)
+        buf = CommFunc.WriteDWORD(buf, self.GoldPaper)
+        buf = CommFunc.WriteDWORD(buf, self.Silver)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += self.TextLen
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'GUID'] = fix_incomingText(self.GUID)
+        rec[u'CreateTime'] = fix_incomingText(self.CreateTime)
+        rec[u'LimitTime'] = fix_incomingText(self.LimitTime)
+        rec[u'PlayerLV'] = self.PlayerLV
+        rec[u'PlayerJob'] = self.PlayerJob
+        rec[u'TextLen'] = self.TextLen
+        rec[u'Text'] = fix_incomingText(self.Text)
+        rec[u'Gold'] = self.Gold
+        rec[u'GoldPaper'] = self.GoldPaper
+        rec[u'Silver'] = self.Silver
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.GUID = fix_outgoingText(rec.get(u'GUID', u''))
+        self.CreateTime = fix_outgoingText(rec.get(u'CreateTime', u''))
+        self.LimitTime = fix_outgoingText(rec.get(u'LimitTime', u''))
+        self.PlayerLV = rec.get(u'PlayerLV', 0)
+        self.PlayerJob = rec.get(u'PlayerJob', 0)
+        self.TextLen = rec.get(u'TextLen', 0)
+        self.Text = fix_outgoingText(rec.get(u'Text', u''))
+        self.Gold = rec.get(u'Gold', 0)
+        self.GoldPaper = rec.get(u'GoldPaper', 0)
+        self.Silver = rec.get(u'Silver', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//补偿物品全服领取条件表 #tagDBEntireCompensationRequire:
+            GUID = %s,
+            CreateTime = %s,
+            LimitTime = %s,
+            PlayerLV = %s,
+            PlayerJob = %s,
+            TextLen = %s,
+            Text = %s,
+            Gold = %s,
+            GoldPaper = %s,
+            Silver = %s,
+            ADOResult = %s,
+            '''%(
+                self.GUID,
+                self.CreateTime,
+                self.LimitTime,
+                self.PlayerLV,
+                self.PlayerJob,
+                self.TextLen,
+                self.Text,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.GUID,
+                self.CreateTime,
+                self.LimitTime,
+                self.PlayerLV,
+                self.PlayerJob,
+                self.TextLen,
+                self.Text,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetGUID(self,Str):
+        if len(Str)<=40:
+            self.GUID = Str
+        else:
+            self.GUID = Str[:40]
+            
+    def SetCreateTime(self,Str):
+        if len(Str)<=30:
+            self.CreateTime = Str
+        else:
+            self.CreateTime = Str[:30]
+            
+    def SetLimitTime(self,Str):
+        if len(Str)<=30:
+            self.LimitTime = Str
+        else:
+            self.LimitTime = Str[:30]
+            
+
+
+            
+#补偿物品个人领取表 #tagDBPersonalCompensation
+class tagDBPersonalCompensation(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('GUID', ctypes.c_char * 40),
+        ('Type', ctypes.c_ubyte),
+        ('CreateTime', ctypes.c_char * 30),
+        ('LimitTime', ctypes.c_char * 30),
+        ('TextLen', ctypes.c_ulong),
+        ('Text', ctypes.c_char_p),
+        ('Gold', ctypes.c_ulong),
+        ('GoldPaper', ctypes.c_ulong),
+        ('Silver', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.PlayerID = 0
+        self.GUID = ''
+        self.Type = 0
+        self.CreateTime = ''
+        self.LimitTime = ''
+        self.TextLen = 0
+        self.Text = ''
+        self.Gold = 0
+        self.GoldPaper = 0
+        self.Silver = 0
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.GUID, pos = CommFunc.ReadString(buf, pos, 40)
+        self.Type, pos = CommFunc.ReadBYTE(buf, pos)
+        self.CreateTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.LimitTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.TextLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.TextLen)
+        self.Text = ctypes.c_char_p(tmp)
+        self.Gold, pos = CommFunc.ReadDWORD(buf, pos)
+        self.GoldPaper, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Silver, pos = CommFunc.ReadDWORD(buf, pos)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 40, self.GUID)
+        buf = CommFunc.WriteBYTE(buf, self.Type)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.CreateTime)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.LimitTime)
+        buf = CommFunc.WriteDWORD(buf, self.TextLen)
+        buf = CommFunc.WriteString(buf, self.TextLen, self.Text)
+        buf = CommFunc.WriteDWORD(buf, self.Gold)
+        buf = CommFunc.WriteDWORD(buf, self.GoldPaper)
+        buf = CommFunc.WriteDWORD(buf, self.Silver)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 40
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_ulong)
+        length += self.TextLen
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'GUID'] = fix_incomingText(self.GUID)
+        rec[u'Type'] = self.Type
+        rec[u'CreateTime'] = fix_incomingText(self.CreateTime)
+        rec[u'LimitTime'] = fix_incomingText(self.LimitTime)
+        rec[u'TextLen'] = self.TextLen
+        rec[u'Text'] = fix_incomingText(self.Text)
+        rec[u'Gold'] = self.Gold
+        rec[u'GoldPaper'] = self.GoldPaper
+        rec[u'Silver'] = self.Silver
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.GUID = fix_outgoingText(rec.get(u'GUID', u''))
+        self.Type = rec.get(u'Type', 0)
+        self.CreateTime = fix_outgoingText(rec.get(u'CreateTime', u''))
+        self.LimitTime = fix_outgoingText(rec.get(u'LimitTime', u''))
+        self.TextLen = rec.get(u'TextLen', 0)
+        self.Text = fix_outgoingText(rec.get(u'Text', u''))
+        self.Gold = rec.get(u'Gold', 0)
+        self.GoldPaper = rec.get(u'GoldPaper', 0)
+        self.Silver = rec.get(u'Silver', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//补偿物品个人领取表 #tagDBPersonalCompensation:
+            PlayerID = %s,
+            GUID = %s,
+            Type = %s,
+            CreateTime = %s,
+            LimitTime = %s,
+            TextLen = %s,
+            Text = %s,
+            Gold = %s,
+            GoldPaper = %s,
+            Silver = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.GUID,
+                self.Type,
+                self.CreateTime,
+                self.LimitTime,
+                self.TextLen,
+                self.Text,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.GUID,
+                self.Type,
+                self.CreateTime,
+                self.LimitTime,
+                self.TextLen,
+                self.Text,
+                self.Gold,
+                self.GoldPaper,
+                self.Silver,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetGUID(self,Str):
+        if len(Str)<=40:
+            self.GUID = Str
+        else:
+            self.GUID = Str[:40]
+            
+    def SetCreateTime(self,Str):
+        if len(Str)<=30:
+            self.CreateTime = Str
+        else:
+            self.CreateTime = Str[:30]
+            
+    def SetLimitTime(self,Str):
+        if len(Str)<=30:
+            self.LimitTime = Str
+        else:
+            self.LimitTime = Str[:30]
+
+
+#补偿物品领取状态表 #tagCompensationPlayerRec
+class tagCompensationPlayerRec(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('GUID', ctypes.c_char * 40),
+        ('RecState', ctypes.c_ubyte),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagCompensationPlayerRec)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'GUID'] = fix_incomingText(self.GUID)
+        rec[u'RecState'] = self.RecState
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.GUID = fix_outgoingText(rec.get(u'GUID', u''))
+        self.RecState = rec.get(u'RecState', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+#Can not implement adoInsertStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+#Can not implement adoQueryIndexStr method:No key defined!
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+#Can not implement adoDeleteByIndexStr method:No key defined!
+    def outputString(self):
+        output = '''//补偿物品领取状态表 #tagCompensationPlayerRec:
+            PlayerID = %s,
+            GUID = %s,
+            RecState = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.GUID,
+                self.RecState,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.GUID,
+                self.RecState,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetGUID(self,Str):
+        if len(Str)<=40:
+            self.GUID = Str
+        else:
+            self.GUID = Str[:40]
+            
+            
+#玩家数据查看缓存表#tagPlayerViewCache
+class tagPlayerViewCache(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('UpdateTime', ctypes.c_char * 30),
+        ('PropDataSize', ctypes.c_ulong),
+        ('PropData', ctypes.c_char_p),
+        ('ItemDataSize', ctypes.c_ulong),
+        ('ItemData', ctypes.c_char_p),
+        ('PlusDataSize', ctypes.c_ulong),
+        ('PlusData', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.PlayerID = 0
+        self.UpdateTime = ''
+        self.PropDataSize = 0
+        self.PropData = ''
+        self.ItemDataSize = 0
+        self.ItemData = ''
+        self.PlusDataSize = 0
+        self.PlusData = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.UpdateTime, pos = CommFunc.ReadString(buf, pos, 30)
+        self.PropDataSize, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.PropDataSize)
+        self.PropData = ctypes.c_char_p(tmp)
+        self.ItemDataSize, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.ItemDataSize)
+        self.ItemData = ctypes.c_char_p(tmp)
+        self.PlusDataSize, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.PlusDataSize)
+        self.PlusData = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 30, self.UpdateTime)
+        buf = CommFunc.WriteDWORD(buf, self.PropDataSize)
+        buf = CommFunc.WriteString(buf, self.PropDataSize, self.PropData)
+        buf = CommFunc.WriteDWORD(buf, self.ItemDataSize)
+        buf = CommFunc.WriteString(buf, self.ItemDataSize, self.ItemData)
+        buf = CommFunc.WriteDWORD(buf, self.PlusDataSize)
+        buf = CommFunc.WriteString(buf, self.PlusDataSize, self.PlusData)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 30
+        length += sizeof(ctypes.c_ulong)
+        length += self.PropDataSize
+        length += sizeof(ctypes.c_ulong)
+        length += self.ItemDataSize
+        length += sizeof(ctypes.c_ulong)
+        length += self.PlusDataSize
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'UpdateTime'] = fix_incomingText(self.UpdateTime)
+        rec[u'PropDataSize'] = self.PropDataSize
+        rec[u'PropData'] = fix_incomingText(self.PropData)
+        rec[u'ItemDataSize'] = self.ItemDataSize
+        rec[u'ItemData'] = fix_incomingText(self.ItemData)
+        rec[u'PlusDataSize'] = self.PlusDataSize
+        rec[u'PlusData'] = fix_incomingText(self.PlusData)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.UpdateTime = fix_outgoingText(rec.get(u'UpdateTime', u''))
+        self.PropDataSize = rec.get(u'PropDataSize', 0)
+        self.PropData = fix_outgoingText(rec.get(u'PropData', u''))
+        self.ItemDataSize = rec.get(u'ItemDataSize', 0)
+        self.ItemData = fix_outgoingText(rec.get(u'ItemData', u''))
+        self.PlusDataSize = rec.get(u'PlusDataSize', 0)
+        self.PlusData = fix_outgoingText(rec.get(u'PlusData', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家数据查看缓存表#tagPlayerViewCache:
+            PlayerID = %s,
+            UpdateTime = %s,
+            PropDataSize = %s,
+            PropData = %s,
+            ItemDataSize = %s,
+            ItemData = %s,
+            PlusDataSize = %s,
+            PlusData = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.UpdateTime,
+                self.PropDataSize,
+                self.PropData,
+                self.ItemDataSize,
+                self.ItemData,
+                self.PlusDataSize,
+                self.PlusData,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.UpdateTime,
+                self.PropDataSize,
+                self.PropData,
+                self.ItemDataSize,
+                self.ItemData,
+                self.PlusDataSize,
+                self.PlusData,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetUpdateTime(self,Str):
+        if len(Str)<=30:
+            self.UpdateTime = Str
+        else:
+            self.UpdateTime = Str[:30]
+            
+
+
+#玩家好友表#tagDBPyPlayerFriend
+class tagDBPyPlayerFriend(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('TagID', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPyPlayerFriend)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TagID'] = self.TagID
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TagID = rec.get(u'TagID', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家好友表#tagDBPyPlayerFriend:
+            PlayerID = %s,
+            TagID = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.TagID,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.PlayerID,
+                self.TagID,
+            )
+        return output
+
+#个人社交总表 #tagPersonalSocial
+class tagPersonalSocial(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('PlayerName', ctypes.c_char * 33),
+        ('Job', ctypes.c_ubyte),
+        ('LV', ctypes.c_ushort),
+        ('RealmLV', ctypes.c_ushort),
+        ('OnlineType', ctypes.c_ubyte),
+        ('RefCount', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagPersonalSocial)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'PlayerName'] = fix_incomingText(self.PlayerName)
+        rec[u'Job'] = self.Job
+        rec[u'LV'] = self.LV
+        rec[u'RealmLV'] = self.RealmLV
+        rec[u'OnlineType'] = self.OnlineType
+        rec[u'RefCount'] = self.RefCount
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.PlayerName = fix_outgoingText(rec.get(u'PlayerName', u''))
+        self.Job = rec.get(u'Job', 0)
+        self.LV = rec.get(u'LV', 0)
+        self.RealmLV = rec.get(u'RealmLV', 0)
+        self.OnlineType = rec.get(u'OnlineType', 0)
+        self.RefCount = rec.get(u'RefCount', 0)
+
+    def adoLoad(self, collection):
+        '''使用KEY查找并读取'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+
+        if resultCollection.count() <= 0:
+            return False
+        #由于是KEY查找,所有如果存在就只有一条记录
+        rec = resultCollection[0]
+        #读取数据
+        self.readRecord(rec)
+        return True
+
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdate(self, collection):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update({'PlayerID':self.PlayerID}, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_153, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+
+    def adoCheckUpdate(self, collection):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdate(collection)
+
+
+    def adoCheckUpdateEx(self, collection, spec):
+        '''根据情况执行插入或更新'''
+        resultCollection = collection.find(spec)
+         
+        if resultCollection.count() <= 0:
+            return self.adoInsert(collection)
+        return self.adoUpdateEx(collection, spec)
+
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//个人社交总表 #tagPersonalSocial:
+            PlayerID = %s,
+            PlayerName = %s,
+            Job = %s,
+            LV = %s,
+            RealmLV = %s,
+            OnlineType = %s,
+            RefCount = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.PlayerName,
+                self.Job,
+                self.LV,
+                self.RealmLV,
+                self.OnlineType,
+                self.RefCount,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.PlayerName,
+                self.Job,
+                self.LV,
+                self.RealmLV,
+                self.OnlineType,
+                self.RefCount,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetPlayerName(self,Str):
+        if len(Str)<=33:
+            self.PlayerName = Str
+        else:
+            self.PlayerName = Str[:33]
+            
+
+
+            
+
+#玩家黑名单 #tagDBPyPlayerBlack
+class tagDBPyPlayerBlack(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('TagID', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPyPlayerBlack)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TagID'] = self.TagID
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TagID = rec.get(u'TagID', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家黑名单 #tagDBPyPlayerBlack:
+            PlayerID = %s,
+            TagID = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.TagID,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.PlayerID,
+                self.TagID,
+            )
+        return output
+
+
+#最近联系人 #tagDBPyPlayerContacts
+class tagDBPyPlayerContacts(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('TagID', ctypes.c_ulong),
+        ('Timestamp', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPyPlayerContacts)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TagID'] = self.TagID
+        rec[u'Timestamp'] = self.Timestamp
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TagID = rec.get(u'TagID', 0)
+        self.Timestamp = rec.get(u'Timestamp', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//最近联系人 #tagDBPyPlayerContacts:
+            PlayerID = %s,
+            TagID = %s,
+            Timestamp = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.TagID,
+                self.Timestamp,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.TagID,
+                self.Timestamp,
+            )
+        return output
+
+
+#玩家仇人表#tagPlayerEnemy
+class tagPlayerEnemy(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('TagID', ctypes.c_ulong),
+        ('Timestamp', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagPlayerEnemy)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'TagID'] = self.TagID
+        rec[u'Timestamp'] = self.Timestamp
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.TagID = rec.get(u'TagID', 0)
+        self.Timestamp = rec.get(u'Timestamp', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//玩家仇人表#tagPlayerEnemy:
+            PlayerID = %s,
+            TagID = %s,
+            Timestamp = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.TagID,
+                self.Timestamp,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.TagID,
+                self.Timestamp,
+            )
+        return output
+
+
+# 家族仓库物品表#tagDBPyFamilyStoreItem
+class tagDBPyFamilyStoreItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('FamilyID', ctypes.c_ulong),
+        ('ItemIndex', ctypes.c_ubyte),
+        ('ItemID', ctypes.c_ulong),
+        ('UserDataLen', ctypes.c_ulong),
+        ('UserData', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.FamilyID = 0
+        self.ItemIndex = 0
+        self.ItemID = 0
+        self.UserDataLen = 0
+        self.UserData = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.FamilyID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.ItemIndex, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ItemID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.UserDataLen, pos = CommFunc.ReadDWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.FamilyID)
+        buf = CommFunc.WriteBYTE(buf, self.ItemIndex)
+        buf = CommFunc.WriteDWORD(buf, self.ItemID)
+        buf = CommFunc.WriteDWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += self.UserDataLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'FamilyID'] = self.FamilyID
+        rec[u'ItemIndex'] = self.ItemIndex
+        rec[u'ItemID'] = self.ItemID
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.FamilyID = rec.get(u'FamilyID', 0)
+        self.ItemIndex = rec.get(u'ItemIndex', 0)
+        self.ItemID = rec.get(u'ItemID', 0)
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'FamilyID':self.FamilyID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'FamilyID':self.FamilyID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:FamilyID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.FamilyID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.FamilyID = %s, error = %s, trycnt = %d'%(self.FamilyID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''// 家族仓库物品表#tagDBPyFamilyStoreItem:
+            FamilyID = %s,
+            ItemIndex = %s,
+            ItemID = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            ADOResult = %s,
+            '''%(
+                self.FamilyID,
+                self.ItemIndex,
+                self.ItemID,
+                self.UserDataLen,
+                self.UserData,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.FamilyID,
+                self.ItemIndex,
+                self.ItemID,
+                self.UserDataLen,
+                self.UserData,
+            )
+        return output
+
+
+#交易所记录表#tagDBPyBourseRecord
+class tagDBPyBourseRecord(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('Type', ctypes.c_ubyte),
+        ('Timestamp', ctypes.c_ulong),
+        ('TradeTax', ctypes.c_ulong),
+        ('TradeMoney', ctypes.c_ulong),
+        ('UserDataLen', ctypes.c_ushort),
+        ('UserData', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.PlayerID = 0
+        self.Type = 0
+        self.Timestamp = 0
+        self.TradeTax = 0
+        self.TradeMoney = 0
+        self.UserDataLen = 0
+        self.UserData = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Type, pos = CommFunc.ReadBYTE(buf, pos)
+        self.Timestamp, pos = CommFunc.ReadDWORD(buf, pos)
+        self.TradeTax, pos = CommFunc.ReadDWORD(buf, pos)
+        self.TradeMoney, pos = CommFunc.ReadDWORD(buf, pos)
+        self.UserDataLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.UserDataLen)
+        self.UserData = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteBYTE(buf, self.Type)
+        buf = CommFunc.WriteDWORD(buf, self.Timestamp)
+        buf = CommFunc.WriteDWORD(buf, self.TradeTax)
+        buf = CommFunc.WriteDWORD(buf, self.TradeMoney)
+        buf = CommFunc.WriteWORD(buf, self.UserDataLen)
+        buf = CommFunc.WriteString(buf, self.UserDataLen, self.UserData)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += self.UserDataLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'Type'] = self.Type
+        rec[u'Timestamp'] = self.Timestamp
+        rec[u'TradeTax'] = self.TradeTax
+        rec[u'TradeMoney'] = self.TradeMoney
+        rec[u'UserDataLen'] = self.UserDataLen
+        rec[u'UserData'] = fix_incomingText(self.UserData)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.Type = rec.get(u'Type', 0)
+        self.Timestamp = rec.get(u'Timestamp', 0)
+        self.TradeTax = rec.get(u'TradeTax', 0)
+        self.TradeMoney = rec.get(u'TradeMoney', 0)
+        self.UserDataLen = rec.get(u'UserDataLen', 0)
+        self.UserData = fix_outgoingText(rec.get(u'UserData', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//交易所记录表#tagDBPyBourseRecord:
+            PlayerID = %s,
+            Type = %s,
+            Timestamp = %s,
+            TradeTax = %s,
+            TradeMoney = %s,
+            UserDataLen = %s,
+            UserData = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.Type,
+                self.Timestamp,
+                self.TradeTax,
+                self.TradeMoney,
+                self.UserDataLen,
+                self.UserData,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.Type,
+                self.Timestamp,
+                self.TradeTax,
+                self.TradeMoney,
+                self.UserDataLen,
+                self.UserData,
+            )
+        return output
+
+
+#交易所物品最近成交单价表#tagDBPyBourseItemLastPrice
+class tagDBPyBourseItemLastPrice(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('ItemID', ctypes.c_ulong),
+        ('LastPrice', ctypes.c_ulong),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPyBourseItemLastPrice)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'ItemID'] = self.ItemID
+        rec[u'LastPrice'] = self.LastPrice
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.ItemID = rec.get(u'ItemID', 0)
+        self.LastPrice = rec.get(u'LastPrice', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!ItemID = %s, error = %s, trycnt = %d'%(self.ItemID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!ItemID = %s, error = %s, trycnt = %d'%(self.ItemID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'ItemID':self.ItemID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'ItemID':self.ItemID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:ItemID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.ItemID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.ItemID = %s, error = %s, trycnt = %d'%(self.ItemID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//交易所物品最近成交单价表#tagDBPyBourseItemLastPrice:
+            ItemID = %s,
+            LastPrice = %s,
+            ADOResult = %s,
+            '''%(
+                self.ItemID,
+                self.LastPrice,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s'''%(
+                self.ItemID,
+                self.LastPrice,
+            )
+        return output
+
+
+#Boss关注记录表#tagDBPyBossAttention
+class tagDBPyBossAttention(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('DataLen', ctypes.c_ushort),
+        ('RecordData', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.PlayerID = 0
+        self.DataLen = 0
+        self.RecordData = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.DataLen, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.DataLen)
+        self.RecordData = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteWORD(buf, self.DataLen)
+        buf = CommFunc.WriteString(buf, self.DataLen, self.RecordData)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += self.DataLen
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'DataLen'] = self.DataLen
+        rec[u'RecordData'] = fix_incomingText(self.RecordData)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.DataLen = rec.get(u'DataLen', 0)
+        self.RecordData = fix_outgoingText(rec.get(u'RecordData', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//Boss关注记录表#tagDBPyBossAttention:
+            PlayerID = %s,
+            DataLen = %s,
+            RecordData = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.DataLen,
+                self.RecordData,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.DataLen,
+                self.RecordData,
+            )
+        return output
+
+
+#封魔坛记录表#tagDBPySealDemonRecord
+class tagDBPySealDemonRecord(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('LineID', ctypes.c_ubyte),
+        ('Rank', ctypes.c_ushort),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+
+    def clear(self):
+        memset(addressof(self), 0, self.getLength())
+
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_150, '(pos = %s)> (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_151, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+            return -1
+        self.clear()
+        memmove(addressof(self), buf[pos:], self.getLength())
+        return self.getLength()
+
+
+    def getBuffer(self):
+        buf = create_string_buffer(self.getLength())
+        memmove(addressof(buf), addressof(self), self.getLength())
+        return string_at(addressof(buf), self.getLength())
+
+    def getLength(self):
+        return sizeof(tagDBPySealDemonRecord)
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'LineID'] = self.LineID
+        rec[u'Rank'] = self.Rank
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.LineID = rec.get(u'LineID', 0)
+        self.Rank = rec.get(u'Rank', 0)
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//封魔坛记录表#tagDBPySealDemonRecord:
+            PlayerID = %s,
+            LineID = %s,
+            Rank = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.LineID,
+                self.Rank,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.LineID,
+                self.Rank,
+            )
+        return output
+
+
+#仙魔之争记录表#tagDBPyXMZZ
+class tagDBPyXMZZ(Structure):
+    _pack_ = 1
+    _fields_ = [
+        ('PlayerID', ctypes.c_ulong),
+        ('Name', ctypes.c_char * 33),
+        ('Faction', ctypes.c_ubyte),
+        ('Score', ctypes.c_ushort),
+        ('WinCnt', ctypes.c_ubyte),
+        ('LoseCnt', ctypes.c_ubyte),
+        ('ConWinCnt', ctypes.c_ubyte),
+        ('WinAwardRecord', ctypes.c_ulong),
+        ('Len', ctypes.c_ushort),
+        ('BetRecord', ctypes.c_char_p),
+        ('ADOResult', ctypes.c_ulong),
+    ]
+
+    def __init__(self):
+        Structure.__init__(self)
+        self.clear()
+
+    def clear(self):
+        self.PlayerID = 0
+        self.Name = ''
+        self.Faction = 0
+        self.Score = 0
+        self.WinCnt = 0
+        self.LoseCnt = 0
+        self.ConWinCnt = 0
+        self.WinAwardRecord = 0
+        self.Len = 0
+        self.BetRecord = ''
+
+    def readData(self, buf, pos = 0, length = 0):
+        if not pos <= length:
+            msg = error.formatMsg('error', error.ERROR_NO_148, '(pos = %s) > (length = %s)'%(pos, length))
+            mylog.error(msg)
+            return -1
+        if len(buf) < pos + self.getLength():
+            msg = error.formatMsg('error', error.ERROR_NO_149, 'len = %s while %s expected!'%(len(buf) - pos, self.getLength()))
+            mylog.error(msg)
+        self.clear()
+        self.PlayerID, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Name, pos = CommFunc.ReadString(buf, pos, 33)
+        self.Faction, pos = CommFunc.ReadBYTE(buf, pos)
+        self.Score, pos = CommFunc.ReadWORD(buf, pos)
+        self.WinCnt, pos = CommFunc.ReadBYTE(buf, pos)
+        self.LoseCnt, pos = CommFunc.ReadBYTE(buf, pos)
+        self.ConWinCnt, pos = CommFunc.ReadBYTE(buf, pos)
+        self.WinAwardRecord, pos = CommFunc.ReadDWORD(buf, pos)
+        self.Len, pos = CommFunc.ReadWORD(buf, pos)
+        tmp, pos = CommFunc.ReadString(buf, pos, self.Len)
+        self.BetRecord = ctypes.c_char_p(tmp)
+        return self.getLength()
+
+    def getBuffer(self):
+        buf = ''
+        buf = CommFunc.WriteDWORD(buf, self.PlayerID)
+        buf = CommFunc.WriteString(buf, sizeof(ctypes.c_char) * 33, self.Name)
+        buf = CommFunc.WriteBYTE(buf, self.Faction)
+        buf = CommFunc.WriteWORD(buf, self.Score)
+        buf = CommFunc.WriteBYTE(buf, self.WinCnt)
+        buf = CommFunc.WriteBYTE(buf, self.LoseCnt)
+        buf = CommFunc.WriteBYTE(buf, self.ConWinCnt)
+        buf = CommFunc.WriteDWORD(buf, self.WinAwardRecord)
+        buf = CommFunc.WriteWORD(buf, self.Len)
+        buf = CommFunc.WriteString(buf, self.Len, self.BetRecord)
+        return buf
+
+    def getLength(self):
+        length = 0
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_char) * 33
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ushort)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ubyte)
+        length += sizeof(ctypes.c_ulong)
+        length += sizeof(ctypes.c_ushort)
+        length += self.Len
+        return length
+
+    def getRecord(self):
+        '''组织存储记录'''
+        rec = {}
+        rec[u'PlayerID'] = self.PlayerID
+        rec[u'Name'] = fix_incomingText(self.Name)
+        rec[u'Faction'] = self.Faction
+        rec[u'Score'] = self.Score
+        rec[u'WinCnt'] = self.WinCnt
+        rec[u'LoseCnt'] = self.LoseCnt
+        rec[u'ConWinCnt'] = self.ConWinCnt
+        rec[u'WinAwardRecord'] = self.WinAwardRecord
+        rec[u'Len'] = self.Len
+        rec[u'BetRecord'] = fix_incomingText(self.BetRecord)
+        return rec
+
+    def readRecord(self, rec):
+        '''由于MongoDB读出来是unicode,所有字符串需要进行转换'''
+        self.PlayerID = rec.get(u'PlayerID', 0)
+        self.Name = fix_outgoingText(rec.get(u'Name', u''))
+        self.Faction = rec.get(u'Faction', 0)
+        self.Score = rec.get(u'Score', 0)
+        self.WinCnt = rec.get(u'WinCnt', 0)
+        self.LoseCnt = rec.get(u'LoseCnt', 0)
+        self.ConWinCnt = rec.get(u'ConWinCnt', 0)
+        self.WinAwardRecord = rec.get(u'WinAwardRecord', 0)
+        self.Len = rec.get(u'Len', 0)
+        self.BetRecord = fix_outgoingText(rec.get(u'BetRecord', u''))
+
+#Can not implement adoLoadStr method:No key defined!
+
+    def adoInsert(self, collection):
+        '''执行插入'''
+
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.insert(rec, False, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                    
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_152, 'Insert failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoUpdateStr method:No key defined!
+
+    def adoUpdateEx(self, collection, spec):
+        '''执行更新'''
+        trycnt = 0
+        rec = self.getRecord()
+        while(True):
+            try:
+                collection.update(spec, {'$set':rec}, False, False, True, True)
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:rec = %s"%(self.__class__.__name__, inspect.stack()[0][3], rec))
+                msg = error.formatMsg('error', error.ERROR_NO_154, 'Update failed!PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+#Can not implement adoCheckUpdateStr method:No key defined!
+#Can not implement adoCheckUpdateExStr method:No key defined!
+
+    def getAdoRecords(self, resultCollection):
+        '''查询结果打包成二进制流'''
+        result = ''
+        result = CommFunc.WriteDWORD(result, resultCollection.count())
+        for rec in resultCollection:
+            self.readRecord(rec)
+            result += self.getBuffer()
+        return result
+
+
+    def adoQueryIndex(self, collection):
+        '''用索引字段查找'''
+        resultCollection = collection.find({'PlayerID':self.PlayerID})
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryCustom(self, collection, queryDict):
+        '''自定义查询'''
+        resultCollection = collection.find(queryDict)
+
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoQueryAll(self, collection):
+        '''查询所有''' 
+        resultCollection = collection.find()
+         
+        return self.getAdoRecords(resultCollection)
+
+
+    def adoDeleteByIndex(self, collection):
+        '''根据索引删除'''
+        trycnt = 0
+        while(True):
+            try:
+                collection.remove({'PlayerID':self.PlayerID})
+                break
+            except pymongo.errors.OperationFailure, err:
+                if(DBConfig.TryCntOnWriteFail > trycnt):
+                    trycnt += 1
+                    continue
+                addADOExceptionCount()
+                mylog.info("%s.%s:PlayerID = %s"%(self.__class__.__name__, inspect.stack()[0][3], self.PlayerID))
+                msg = error.formatMsg('error', error.ERROR_NO_155, 'delete failure!self.PlayerID = %s, error = %s, trycnt = %d'%(self.PlayerID, err, trycnt))
+                mylog.error(msg)
+
+                return False
+        return True
+
+    def outputString(self):
+        output = '''//仙魔之争记录表#tagDBPyXMZZ:
+            PlayerID = %s,
+            Name = %s,
+            Faction = %s,
+            Score = %s,
+            WinCnt = %s,
+            LoseCnt = %s,
+            ConWinCnt = %s,
+            WinAwardRecord = %s,
+            Len = %s,
+            BetRecord = %s,
+            ADOResult = %s,
+            '''%(
+                self.PlayerID,
+                self.Name,
+                self.Faction,
+                self.Score,
+                self.WinCnt,
+                self.LoseCnt,
+                self.ConWinCnt,
+                self.WinAwardRecord,
+                self.Len,
+                self.BetRecord,
+                self.ADOResult,
+            )
+        return output
+
+    def dumpString(self):
+        output = '''%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s\t%1s'''%(
+                self.PlayerID,
+                self.Name,
+                self.Faction,
+                self.Score,
+                self.WinCnt,
+                self.LoseCnt,
+                self.ConWinCnt,
+                self.WinAwardRecord,
+                self.Len,
+                self.BetRecord,
+            )
+        return output
+
+    #Char数组类型Set接口,使用该接口对此类型数据赋值,防止赋值的数据过长报错
+    def SetName(self,Str):
+        if len(Str)<=33:
+            self.Name = Str
+        else:
+            self.Name = Str[:33]
+            
+
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/__init__.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/__init__.py"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Collections/__init__.py"
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/CommFunc.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/CommFunc.py"
new file mode 100644
index 0000000..a003a33
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/CommFunc.py"
@@ -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
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/CommFuncEx.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/CommFuncEx.py"
new file mode 100644
index 0000000..a2e9afd
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/CommFuncEx.py"
@@ -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')
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/__init__.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/__init__.py"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/__init__.py"
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/mylog.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/mylog.py"
new file mode 100644
index 0000000..1086836
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Common/mylog.py"
@@ -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()
+
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Config/DBConfig.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Config/DBConfig.py"
new file mode 100644
index 0000000..0ee0f55
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Config/DBConfig.py"
@@ -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
+    
+
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Config/__init__.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Config/__init__.py"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Config/__init__.py"
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Config/config.ini" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Config/config.ini"
new file mode 100644
index 0000000..3c353a3
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/Config/config.ini"
@@ -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 
+
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/CommonDefine.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/CommonDefine.py"
new file mode 100644
index 0000000..ee8431d
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/CommonDefine.py"
@@ -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天
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/GlobalFunctions.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/GlobalFunctions.py"
new file mode 100644
index 0000000..ae5e69f
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/GlobalFunctions.py"
@@ -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 
+    
+    
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/__init__.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/__init__.py"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/__init__.py"
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/error.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/error.py"
new file mode 100644
index 0000000..9066559
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/DBCommon/error.py"
@@ -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)
\ No newline at end of file
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/MangoDBCommon.py" "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/MangoDBCommon.py"
new file mode 100644
index 0000000..7cfb0fa
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/ChangeAccount/MangoDBCommon.py"
@@ -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
+        
+
+ 
\ No newline at end of file
diff --git "a/Tool/\346\225\260\346\215\256\345\272\223/mongorestore.bat" "b/Tool/\346\225\260\346\215\256\345\272\223/mongorestore.bat"
new file mode 100644
index 0000000..bd0b31b
--- /dev/null
+++ "b/Tool/\346\225\260\346\215\256\345\272\223/mongorestore.bat"
@@ -0,0 +1,2 @@
+cd /d c:\mongo\bin
+mongorestore -u sa -p sa --drop D:\2018-09-09
\ No newline at end of file

--
Gitblit v1.8.0