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