#!/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%  
 | 
  
 |