#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # import sys import binascii try: import threading except ImportError: import dummy_threading as threading from Common import (CommFuncEx, CommFunc, mylog) from DBCommon import (CommonDefine, error) import traceback DBConfig = __import__('Config.DBConfig') import base64 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 DBConfig.base64: return base64.b64decode(text) return CommFuncEx.UnicodeToEncoding(DBConfig.encoding, text)[1] #²»ÊÇunicode,²»´¦Àí return text def fix_incomingText(text): if isinstance(text, str): if DBConfig.base64: return base64.b64encode(text) return CommFuncEx.EncodingToUnicode(DBConfig.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 not DBConfig.checkSID: return True if expectSID == MAGIC_SID: return True calcSID = makeSID(data) if expectSID == calcSID: return True mylog.debug('expectSID = %s calcSID = %s'%(expectSID, calcSID)) return False SPLITCHAR = '\t' def sysDBLoadFromFile(className, fileName): data = '' try: fileObj = open(fileName, 'rb', 0) mylog.info('Loading %s...'%fileName) try: rowObj = className() rowCnt = 0 for line in fileObj: rowCnt += 1 if rowCnt == 1: continue #skip header # logging.getLogger('sysDBLoadFromFile').debug('line %d = %s'%(rowCnt,line)) rowObj.readLine(line) data += rowObj.getBuffer() except IOError,(readErrNo, readStdErr): msg = error.formatMsg('DesignError', error.ERROR_NO_30, 'Read file "%s" failed! errno = %s stdErr = %s'%(fileName, readErrNo, readStdErr)) mylog.DesignError(msg, True) data = '' data = CommFunc.WriteDWORD(data, 0) return data except: msg = error.formatMsg('fatal', error.ERROR_NO_31, 'Read file"%s" failed! Exception = %s'%(fileName, traceback.format_exc())) mylog.fatal(msg) data = '' data = CommFunc.WriteDWORD(data, 0) return data else: fileObj.close() # logging.getLogger('sysDBLoadFromFile').debug('data = %s'%binascii.b2a_hex(data)) mylog.info('Load %s cnt = %s'%(fileName, rowCnt - 1)) buf = '' buf = CommFunc.WriteDWORD(buf, rowCnt - 1) buf = CommFunc.WriteString(buf, len(data), data) return buf except IOError, (errno, stderr): msg = error.formatMsg('DesignError', error.ERROR_NO_32, 'Can not open %s!errno = %s stderr = %s'%(fileName, errno, stderr)) mylog.DesignError(msg) data = '' data = CommFunc.WriteDWORD(data, 0) return data def SysDBUpdate(className, collection, fileName): collection.drop() try: fileObj = open(fileName,'rb', 0) try: rowObj = className() row = 0 for line in fileObj: row += 1 if row == 1: continue #skip header # print 'line_%d=%s'%(Col,line) rowObj.readLine(line) rowObj.adoInsert(collection) except IOError,(readErrNo, readStdErr): msg = error.formatMsg('DesignError', error.ERROR_NO_33, 'Read %s failed!errno = %s stderr = %s'%(fileName, readErrNo, readStdErr)) mylog.DesignError(msg) finally: fileObj.close() except IOError,(errno, stderr): msg = error.formatMsg('DesignError', error.ERROR_NO_34, 'Can not open %s! errno = %s stderr = %s'%(fileName, errno, stderr)) mylog.DesignError(msg) def seq(db, collectionName, fieldName, feed, increment): try: result = 0 collection = db['%s_seq'%collectionName] resultObj = collection.find_and_modify(query={'_id':fieldName}, update={'$inc':{'seq':increment}}, new=True) if resultObj: result = resultObj['seq'] else: resultObj = collection.find_and_modify(query={'_id':fieldName}, update={'$set':{'seq':feed}}, new=True, upsert=True) if resultObj: result = resultObj['seq'] else: msg = error.formatMsg('error', error.ERROR_NO_35, 'seq failed!') mylog.error(msg) return 0 except: msg = error.formatMsg('error', error.ERROR_NO_36, "seq failed, colname = %s, fieldname = %s, feed = %d, increment = %d, error = %s"%(collectionName, fieldName, feed, increment, traceback.format_exc())) mylog.error(msg) return result