#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
# @copyright: Copyright (c) 2004, 2010 Xiamen Wangyou Network Technology Co.,Ltd., All rights reserved.
|
#-------------------------------------------------------------------------------
|
#
|
import pymongo
|
import binascii
|
import CommFunc
|
import ctypes
|
import logging
|
import CollectionVesionNO
|
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 )
|
#MangoDBStruct.py%
|
#------------------------------------------------------
|
#------------------------------------------------------
|
#Íæ¼ÒÏêϸÐÅÏ¢#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 * 1000),
|
('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),
|
('Signature', ctypes.c_char * 101),
|
('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),
|
('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'Signature'] = fix_incomingText(self.Signature)
|
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'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.Signature = fix_outgoingText(rec.get(u'Signature', u''))
|
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.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,
|
Signature = %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,
|
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.Signature,
|
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.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'''%(
|
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.Signature,
|
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,
|
)
|
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)<=1000:
|
self.Setting = Str
|
else:
|
self.Setting = Str[:1000]
|
|
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 SetSignature(self,Str):
|
if len(Str)<=101:
|
self.Signature = Str
|
else:
|
self.Signature = Str[:101]
|
|
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]
|
|
#------------------------------------------------------
|
#Íæ¼ÒÕË»§ÐÅÏ¢#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),
|
('AccountMoney', ctypes.c_ulong),
|
('AccountMoneyPaper', ctypes.c_ulong),
|
('Adult', ctypes.c_ubyte),
|
('RegIP', ctypes.c_char * 20),
|
('Presentee', ctypes.c_ubyte),
|
('GMLevelForGMTool', ctypes.c_ulong),
|
('TotalSavePoint', ctypes.c_ulong),
|
('TelLockState', ctypes.c_ubyte),
|
('szName', ctypes.c_char * 15),
|
('szSex', ctypes.c_char * 3),
|
('Age', ctypes.c_ushort),
|
('Birthday', ctypes.c_char * 21),
|
('QQ', ctypes.c_char * 19),
|
('Mail', ctypes.c_char * 41),
|
('Province', ctypes.c_char * 11),
|
('City', ctypes.c_char * 11),
|
('MTTUID', ctypes.c_longlong),
|
('IdCard', ctypes.c_char * 19),
|
('BalanceInfo', ctypes.c_ulong),
|
('AppID', ctypes.c_ulong),
|
('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 * 30),
|
('LastLoginTime', ctypes.c_char * 30),
|
('Operator', ctypes.c_char * 15),
|
('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'AccountMoney'] = self.AccountMoney
|
rec[u'AccountMoneyPaper'] = self.AccountMoneyPaper
|
rec[u'Adult'] = self.Adult
|
rec[u'RegIP'] = fix_incomingText(self.RegIP)
|
rec[u'Presentee'] = self.Presentee
|
rec[u'GMLevelForGMTool'] = self.GMLevelForGMTool
|
rec[u'TotalSavePoint'] = self.TotalSavePoint
|
rec[u'TelLockState'] = self.TelLockState
|
rec[u'szName'] = fix_incomingText(self.szName)
|
rec[u'szSex'] = fix_incomingText(self.szSex)
|
rec[u'Age'] = self.Age
|
rec[u'Birthday'] = fix_incomingText(self.Birthday)
|
rec[u'QQ'] = fix_incomingText(self.QQ)
|
rec[u'Mail'] = fix_incomingText(self.Mail)
|
rec[u'Province'] = fix_incomingText(self.Province)
|
rec[u'City'] = fix_incomingText(self.City)
|
rec[u'MTTUID'] = self.MTTUID
|
rec[u'IdCard'] = fix_incomingText(self.IdCard)
|
rec[u'BalanceInfo'] = self.BalanceInfo
|
rec[u'AppID'] = 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'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.AccountMoney = rec.get(u'AccountMoney', 0)
|
self.AccountMoneyPaper = rec.get(u'AccountMoneyPaper', 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.GMLevelForGMTool = rec.get(u'GMLevelForGMTool', 0)
|
self.TotalSavePoint = rec.get(u'TotalSavePoint', 0)
|
self.TelLockState = rec.get(u'TelLockState', 0)
|
self.szName = fix_outgoingText(rec.get(u'szName', u''))
|
self.szSex = fix_outgoingText(rec.get(u'szSex', u''))
|
self.Age = rec.get(u'Age', 0)
|
self.Birthday = fix_outgoingText(rec.get(u'Birthday', u''))
|
self.QQ = fix_outgoingText(rec.get(u'QQ', u''))
|
self.Mail = fix_outgoingText(rec.get(u'Mail', u''))
|
self.Province = fix_outgoingText(rec.get(u'Province', u''))
|
self.City = fix_outgoingText(rec.get(u'City', u''))
|
self.MTTUID = rec.get(u'MTTUID', 0)
|
self.IdCard = fix_outgoingText(rec.get(u'IdCard', u''))
|
self.BalanceInfo = rec.get(u'BalanceInfo', 0)
|
self.AppID = rec.get(u'AppID', 0)
|
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.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,
|
AccountMoney = %s,
|
AccountMoneyPaper = %s,
|
Adult = %s,
|
RegIP = %s,
|
Presentee = %s,
|
GMLevelForGMTool = %s,
|
TotalSavePoint = %s,
|
TelLockState = %s,
|
szName = %s,
|
szSex = %s,
|
Age = %s,
|
Birthday = %s,
|
QQ = %s,
|
Mail = %s,
|
Province = %s,
|
City = %s,
|
MTTUID = %s,
|
IdCard = %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,
|
ADOResult = %s,
|
SID = %s,
|
VerNO = %s,
|
'''%(
|
self.ACCID,
|
self.Psw,
|
self.PswLV2,
|
self.LogNum,
|
self.AccountMoney,
|
self.AccountMoneyPaper,
|
self.Adult,
|
self.RegIP,
|
self.Presentee,
|
self.GMLevelForGMTool,
|
self.TotalSavePoint,
|
self.TelLockState,
|
self.szName,
|
self.szSex,
|
self.Age,
|
self.Birthday,
|
self.QQ,
|
self.Mail,
|
self.Province,
|
self.City,
|
self.MTTUID,
|
self.IdCard,
|
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.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'''%(
|
self.ACCID,
|
self.Psw,
|
self.PswLV2,
|
self.LogNum,
|
self.AccountMoney,
|
self.AccountMoneyPaper,
|
self.Adult,
|
self.RegIP,
|
self.Presentee,
|
self.GMLevelForGMTool,
|
self.TotalSavePoint,
|
self.TelLockState,
|
self.szName,
|
self.szSex,
|
self.Age,
|
self.Birthday,
|
self.QQ,
|
self.Mail,
|
self.Province,
|
self.City,
|
self.MTTUID,
|
self.IdCard,
|
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,
|
)
|
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 SetszName(self,Str):
|
if len(Str)<=15:
|
self.szName = Str
|
else:
|
self.szName = Str[:15]
|
|
def SetszSex(self,Str):
|
if len(Str)<=3:
|
self.szSex = Str
|
else:
|
self.szSex = Str[:3]
|
|
def SetBirthday(self,Str):
|
if len(Str)<=21:
|
self.Birthday = Str
|
else:
|
self.Birthday = Str[:21]
|
|
def SetQQ(self,Str):
|
if len(Str)<=19:
|
self.QQ = Str
|
else:
|
self.QQ = Str[:19]
|
|
def SetMail(self,Str):
|
if len(Str)<=41:
|
self.Mail = Str
|
else:
|
self.Mail = Str[:41]
|
|
def SetProvince(self,Str):
|
if len(Str)<=11:
|
self.Province = Str
|
else:
|
self.Province = Str[:11]
|
|
def SetCity(self,Str):
|
if len(Str)<=11:
|
self.City = Str
|
else:
|
self.City = Str[:11]
|
|
def SetIdCard(self,Str):
|
if len(Str)<=19:
|
self.IdCard = Str
|
else:
|
self.IdCard = Str[:19]
|
|
def SetRegisterTime(self,Str):
|
if len(Str)<=30:
|
self.RegisterTime = Str
|
else:
|
self.RegisterTime = Str[:30]
|
|
def SetLastLoginTime(self,Str):
|
if len(Str)<=30:
|
self.LastLoginTime = Str
|
else:
|
self.LastLoginTime = Str[:30]
|
|
def SetOperator(self,Str):
|
if len(Str)<=15:
|
self.Operator = Str
|
else:
|
self.Operator = Str[:15]
|
|
#------------------------------------------------------
|
#ÈËÎïÎïÆ·#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),
|
('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),
|
('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),
|
('PetID', ctypes.c_ulong),
|
('EquipMagicDefValue', ctypes.c_ulong),
|
('EquipMinMagicAtkValue', ctypes.c_ulong),
|
('EquipMaxMagicAtkValue', 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):
|
self.ItemGUID = ''
|
self.PlayerID = 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.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.PetID = 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.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.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.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.PetID, pos = CommFunc.ReadDWORD(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.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.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.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.PetID)
|
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_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_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_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)
|
length += sizeof(ctypes.c_ulong)
|
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'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'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'PetID'] = self.PetID
|
rec[u'EquipMagicDefValue'] = self.EquipMagicDefValue
|
rec[u'EquipMinMagicAtkValue'] = self.EquipMinMagicAtkValue
|
rec[u'EquipMaxMagicAtkValue'] = self.EquipMaxMagicAtkValue
|
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.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.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.PetID = rec.get(u'PetID', 0)
|
self.EquipMagicDefValue = rec.get(u'EquipMagicDefValue', 0)
|
self.EquipMinMagicAtkValue = rec.get(u'EquipMinMagicAtkValue', 0)
|
self.EquipMaxMagicAtkValue = rec.get(u'EquipMaxMagicAtkValue', 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,
|
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,
|
IsRenZhu = %s,
|
EquipDefenseValue = %s,
|
EquipMinAtkValue = %s,
|
EquipMaxAtkValue = %s,
|
UserDataLen = %s,
|
UserData = %s,
|
FitLV = %s,
|
Proficiency = %s,
|
IsSuite = %s,
|
BaseHP = %s,
|
BaseMagicDef = %s,
|
MaxAddSkillCnt = %s,
|
PetID = %s,
|
EquipMagicDefValue = %s,
|
EquipMinMagicAtkValue = %s,
|
EquipMaxMagicAtkValue = %s,
|
ADOResult = %s,
|
SID = %s,
|
VerNO = %s,
|
'''%(
|
self.ItemGUID,
|
self.PlayerID,
|
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.IsRenZhu,
|
self.EquipDefenseValue,
|
self.EquipMinAtkValue,
|
self.EquipMaxAtkValue,
|
self.UserDataLen,
|
self.UserData,
|
self.FitLV,
|
self.Proficiency,
|
self.IsSuite,
|
self.BaseHP,
|
self.BaseMagicDef,
|
self.MaxAddSkillCnt,
|
self.PetID,
|
self.EquipMagicDefValue,
|
self.EquipMinMagicAtkValue,
|
self.EquipMaxMagicAtkValue,
|
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'''%(
|
self.ItemGUID,
|
self.PlayerID,
|
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.IsRenZhu,
|
self.EquipDefenseValue,
|
self.EquipMinAtkValue,
|
self.EquipMaxAtkValue,
|
self.UserDataLen,
|
self.UserData,
|
self.FitLV,
|
self.Proficiency,
|
self.IsSuite,
|
self.BaseHP,
|
self.BaseMagicDef,
|
self.MaxAddSkillCnt,
|
self.PetID,
|
self.EquipMagicDefValue,
|
self.EquipMinMagicAtkValue,
|
self.EquipMaxMagicAtkValue,
|
)
|
return output
|
|
#CharÊý×éÀàÐÍSet½Ó¿Ú,ʹÓøýӿڶԴËÀàÐÍÊý¾Ý¸³Öµ£¬·ÀÖ¹¸³ÖµµÄÊý¾Ý¹ý³¤±¨´í
|
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]
|
|
def SetCreateTime(self,Str):
|
if len(Str)<=30:
|
self.CreateTime = Str
|
else:
|
self.CreateTime = Str[:30]
|
|
|
#------------------------------------------------------
|
#Íæ¼Ò¼¼Äܱí#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
|
|
#------------------------------------------------------
|
#Íæ¼Ò³èÎï±í#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]
|
|
|
#------------------------------------------------------
|
#Íæ¼Ò³èÎï¼¼Äܱí#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
|
|
#WarnInfo%
|
|