#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#-------------------------------------------------------------------------------  
 | 
# @copyright: Copyright (c) 2004, 2010 Xiamen Wangyou Network Technology Co.,Ltd., All rights reserved.  
 | 
#-------------------------------------------------------------------------------  
 | 
#  
 | 
  
 | 
import sys  
 | 
import binascii  
 | 
import base64  
 | 
try:  
 | 
    import threading  
 | 
except ImportError:  
 | 
    import dummy_threading as threading       
 | 
import CommFunc      
 | 
import MongoDBConfig    
 | 
#from Common import (CommFuncEx, CommFunc, mylog)  
 | 
#from DBCommon import (CommonDefine, )  
 | 
import traceback  
 | 
  
 | 
PLAYERID_FEED = 10000  
 | 
PLAYERID_STEP = 1  
 | 
  
 | 
SIDErrorCnt = 0  
 | 
MAGIC_SID = 2266520  
 | 
  
 | 
SIDErrorCounterLock = threading.Lock()  
 | 
  
 | 
ADOExceptionCnt = 0  
 | 
AdoExceptionCounterLock = threading.Lock()  
 | 
  
 | 
#ÐèÒª¶àÏ̱߳£»¤  
 | 
def addADOExceptionCount():  
 | 
    global ADOExceptionCnt  
 | 
    global AdoExceptionCounterLock  
 | 
    AdoExceptionCounterLock.acquire()  
 | 
    ADOExceptionCnt += 1  
 | 
    AdoExceptionCounterLock.release()  
 | 
    return ADOExceptionCnt  
 | 
  
 | 
def getADOExceptionCount():  
 | 
    return ADOExceptionCnt  
 | 
          
 | 
def fix_outgoingText(text):  
 | 
    if isinstance(text, unicode):  
 | 
        if MongoDBConfig.USER_DB_IsBase64:  
 | 
             return base64.b64decode(text)  
 | 
        return CommFunc.UnicodeToEncoding(MongoDBConfig.USER_DB_ENCODING, text)[1]  
 | 
    #²»ÊÇunicode,²»´¦Àí  
 | 
    return text  
 | 
  
 | 
def fix_incomingText(text):  
 | 
    if isinstance(text, str):  
 | 
        if MongoDBConfig.USER_DB_IsBase64:  
 | 
            return base64.b64encode(text)  
 | 
        return CommFunc.EncodingToUnicode(MongoDBConfig.USER_DB_ENCODING, text)[1]  
 | 
    #²»ÊÇ×Ö·û´®£¬²»´¦Àí  
 | 
    return text  
 | 
  
 | 
def fix_incoming(dictObj):  
 | 
    for k, v in dictObj.iteritems():  
 | 
        if isinstance(v, str):  
 | 
            result, convertText = CommFuncEx.EncodingToUnicode(CommonDefine.ENCODING, v)  
 | 
            if result:  
 | 
                dictObj[k] = convertText  
 | 
  
 | 
def fix_outgoing(dictObj):  
 | 
    for k, v in dictObj.iteritems():  
 | 
        if isinstance(v, unicode):  
 | 
            result, convertText = CommFuncEx.UnicodeToEncoding(CommonDefine.ENCODING, v)  
 | 
            if result:  
 | 
                dictObj[k] = convertText  
 | 
  
 | 
def addSIDErrorCnt():  
 | 
    global SIDErrorCnt  
 | 
    global SIDErrorCounterLock  
 | 
    SIDErrorCounterLock.acquire()  
 | 
    SIDErrorCnt += 1  
 | 
    SIDErrorCounterLock.release()  
 | 
    return SIDErrorCnt  
 | 
  
 | 
def getSIDErrorCnt():  
 | 
    global SIDErrorCnt  
 | 
    return SIDErrorCnt  
 | 
   
 | 
def makeSID(data):  
 | 
#    mylog.debug('makeSID(%s) = %s'%(data, binascii.crc32(data)))  
 | 
    return binascii.crc32(data)  
 | 
  
 | 
def checkSID(data, expectSID):  
 | 
    global MAGIC_SID  
 | 
    if expectSID == MAGIC_SID:  
 | 
        return True  
 | 
    calcSID = makeSID(data)  
 | 
    if expectSID == calcSID:  
 | 
        return True  
 | 
#    mylog.debug('expectSID = %s calcSID = %s'%(expectSID, calcSID))  
 | 
    return False  
 | 
  
 | 
SPLITCHAR = '\t'  
 | 
  
 | 
def sysDBLoadFromFile(className, fileName):  
 | 
    data = ''  
 | 
    try:  
 | 
        fileObj = open(fileName, 'rb', 0)  
 | 
        mylog.info('Loading %s...'%fileName)  
 | 
        try:  
 | 
            rowObj = className()  
 | 
            rowCnt = 0  
 | 
            for line in fileObj:  
 | 
                rowCnt += 1  
 | 
                if rowCnt == 1:  
 | 
                    continue    #skip header  
 | 
#                logging.getLogger('sysDBLoadFromFile').debug('line %d = %s'%(rowCnt,line))  
 | 
                rowObj.readLine(line)  
 | 
                data += rowObj.getBuffer()  
 | 
        except IOError,(readErrNo, readStdErr):  
 | 
            mylog.error('Read %s failed! errno = %s stdErr = %s'%(fileName, readErrNo, readStdErr))  
 | 
            data = ''  
 | 
            data = CommFunc.WriteDWORD(data, 0)  
 | 
            return data  
 | 
        except:  
 | 
            mylog.error('Exception = %s'%sys.exc_info()[0])  
 | 
            mylog.error(traceback.format_exc())   
 | 
            data = ''  
 | 
            data = CommFunc.WriteDWORD(data, 0)  
 | 
            return data  
 | 
        else:  
 | 
            fileObj.close()  
 | 
#            logging.getLogger('sysDBLoadFromFile').debug('data = %s'%binascii.b2a_hex(data))  
 | 
            mylog.info('Load %s cnt = %s'%(fileName, rowCnt - 1))  
 | 
              
 | 
            buf = ''  
 | 
            buf = CommFunc.WriteDWORD(buf, rowCnt - 1)  
 | 
            buf = CommFunc.WriteString(buf, len(data), data)  
 | 
            return buf  
 | 
    except IOError, (errno, stderr):  
 | 
        mylog.error('Can not open %s!errno = %s stderr = %s'%(fileName, errno, stderr))  
 | 
      
 | 
    data = ''  
 | 
    data = CommFunc.WriteDWORD(data, 0)  
 | 
    return data  
 | 
          
 | 
def SysDBUpdate(className, collection, fileName):  
 | 
    collection.drop()  
 | 
    try:  
 | 
        fileObj = open(fileName,'rb', 0)  
 | 
        try:  
 | 
            rowObj = className()  
 | 
            row = 0  
 | 
            for line in fileObj:  
 | 
                row += 1  
 | 
                if row == 1:  
 | 
                    continue    #skip header  
 | 
#                print 'line_%d=%s'%(Col,line)  
 | 
                rowObj.readLine(line)  
 | 
                rowObj.adoInsert(collection)  
 | 
        except IOError,(readErrNo, readStdErr):  
 | 
            mylog.error('Read %s failed!errno = %s stderr = %s'%(fileName, readErrNo, readStdErr))  
 | 
        finally:  
 | 
            fileObj.close()  
 | 
    except IOError,(errno, stderr):  
 | 
        mylog.error('Can not open %s! errno = %s stderr = %s'%(fileName, errno, stderr))  
 | 
          
 | 
def seq(db, collectionName, fieldName, feed, increment):  
 | 
    collection = db['%s_seq'%collectionName]  
 | 
    resultObj = collection.find_and_modify(query={'_id':fieldName}, update={'$inc':{'seq':increment}}, new=True)  
 | 
    if resultObj:  
 | 
        result = resultObj['seq']  
 | 
    else:  
 | 
        resultObj = collection.find_and_modify(query={'_id':fieldName}, update={'$set':{'seq':feed}}, new=True,  
 | 
                                               upsert=True)  
 | 
        if resultObj:  
 | 
            result = resultObj['seq']  
 | 
        else:  
 | 
            mylog.error('seq failed!')  
 | 
            return 0  
 | 
    return result  
 | 
          
 | 
  
 | 
  
 |