def __epollIn(self, fileno): try: #取得当前链接对象 conn = self.__client_connections[fileno] #取得当前内容 requests = self.__client_requests[fileno] #取得头信息 header = self.__socket_parser.getHeader(conn) cmd = header['cmd'] if cmd == 0: self.__epoll_close(fileno) return False #获取内容长度 body_info = self.__socket_parser.getBody(conn, header['body_len']) #获取处理程序 handler_name = self.__getHandler(cmd) if len(handler_name) > 0: send_list = eval(handler_name)(body_info) else: send_list = [0,{"error":"cmd not defined"}] self.__send_list = send_list #处理程序的返回值发送回调用者,返回值格式为[标识符, {}] #self.__socket_parser.send(conn, send_list[0], send_list[1]) #修改文件描述符为可读状态 self.__epoll.modify(fileno, select.EPOLLOUT) except: Log.error() self.__epoll_close(fileno) return False
def handler_8003(self, p): q = self.__sq try: temp = (q['rear'] - q['front'] + self.__maxsize) % self.__maxsize except: Log.error() return [0, {"msg": "error"}] return [8003, temp]
def handler_8003(self, p): queue_type = p.get('queue_type', "") if queue_type not in self.__sqs: return [4001, {"msg": "queue type error"}] try: temp = len(self.__sqs[queue_type]) except: Log.error() return [8003, temp]
def close(): try: if None != self.queryID: self.queryID.close() if '' != self.clinkID: self.clinkID.close() except pymysql.Error as e: Log.error(e) self.clinkID = '' self.queryID = None
def handler_8002(self, p): queue_type = p.get('queue_type', "") if queue_type not in self.__sqs: return [4001, {"msg": "queue type error"}] try: temp = self.__sqs[queue_type].popleft() if temp == -1: return [4002, {"msg": "queue is empty"}] except: Log.error() return [8002, temp]
def handler_8001(self, p): i = p.get('i', 0) queue_type = p.get('queue_type', "") if queue_type not in self.__sqs: return [4001, {"msg": "queue type error"}] try: del p['queue_type'] self.__sqs[queue_type].append(p) except: Log.error() return [8001, {"msg": "success" + str(i)}]
def handler_8002(self, p): q = self.__sq try: if q['front'] == q['rear']: return [0, {"msg": "error"}] e = q['data'][q['front']] q['front'] = (q['front'] + 1) % self.__maxsize except: Log.error() return [0, {"msg": "error"}] return [8002, e]
def connect(self, type=""): if '' == type: type = self.config.get("cache.data_cache_type") module_type = type.title() module = "caches." + module_type m = getattr(__import__(module), module_type) # print(m) className = getattr(m, module_type) # print(className) try: cache = className(self.options) except: Log.error(L('_CACHE_TYPE_INVALID_') + ':' + type) return cache
def getHeader(self, socket_obj): recv_cmd = 0 #命令号 body_len = 0 #内容长度 header = {'cmd': recv_cmd, 'body_len': body_len} try: #获取头信息 header_msg = socket_obj.recv(self.__header_len) #判断头的长度是否合法 if len(header_msg) == self.__header_len: recv_cmd, body_len = struct.unpack('HH', header_msg) header['cmd'] = socket.ntohs(recv_cmd) header['body_len'] = socket.ntohs(body_len) except: Log.error() return header
def send(self, socket_obj, command=0, body={}): #"命令号"转网络字节序 command = socket.htons(command) #字典编码JSON字符串,在python3中pack必须转换成bytes类型 content = json.dumps(body).encode(encoding='utf-8') send_len = len(content) #"正文长度"转网络字节序 body_len = socket.htons(send_len) send_data = struct.pack('HH' + str(send_len) + 's', command, body_len, content) try: return socket_obj.send(send_data) except: Log.error() return False
def handler_8001(self, p): sql = p.get("sql", "") self.__i = self.__i + 1 sql = sql % self.__i print(sql) q = self.__sq print("rear = %d" % q['rear']) try: if ((q['rear'] + 1) % self.__maxsize == q['front']): return [0, {"msg": "error"}] q['data'].append(sql) q['rear'] = (q['rear'] + 1) % self.__maxsize except: Log.error() return [0, {"msg": "error"}] return [8001, {"msg": "success"}]
def __init__(self, options={}): self.config = Config() if "redis" not in sys.modules: Log.error(L('_NO_MODULE_')+":redis") if len(options) == 0: options = { "host":self.config.get("redis.host") if self.config.get("redis.host") else "127.0.0.1", "port":self.config.get("redis.port") if self.config.get("redis.port") else "6397" } self.options = options self.handler = redis.Redis(**options) #set prefix if 'prefix' in options: self.options['prefix'] = options['prefix'] else: self.options['prefix'] = self.config.get("redis.prefix")
def getBody(self, socket_obj, body_len=0): if body_len <= 0: return '' body_contents = '' try: while len(body_contents) < body_len: #python3中要将(字节)对象转换成(字符)后,才能执行连接操作 temp = socket_obj.recv(body_len - len(body_contents)).decode( encoding='utf-8') body_contents += temp except: Log.error() return '' #内容解析 blen = len(body_contents) if blen != body_len or blen == 0: return '' return json.loads(body_contents)
def factory(self, db_config=''): # 读取数据库配置 db_config = self.__parseConfig(db_config) # print(db_config) if db_config['dbms'] == '': Log.error(L('_NO_DB_CONFIG_')) # 数据库类型 self.dbType = db_config['dbms'].capitalize() # 首字母大写 # 加载数据库驱动 module_name = "dbs." + self.dbType # print(dir(__import__(module_name))) # print(sys.modules) m = getattr(__import__(module_name), self.dbType) # print(m) if module_name not in sys.modules: Log.error(L('_NO_DB_MODULE_')) # 实例化数据库驱动类 if hasattr(m, self.dbType): dbClass = getattr(m, self.dbType) db = dbClass(db_config) if "pdo" != db_config['dbms'].lower(): db.dbType = self.dbType.upper() if self.config.get('debug'): db.debug = True else: Log.error(L('_NO_SUPPORT_DB_')) return db
def connect(self, db_config='', linkNum=0): #print("db_config = %s" % db_config) #print("linkNum = %s" % linkNum) try: self.linkID[linkNum] except Exception as e: if db_config == '': db_config = self.dbConfig #print(db_config) #创建数据库连接 try: database = { "host":str(db_config['hostname']), "user":str(db_config['username']), "passwd":str(db_config['password']) } #处理不带端口号的socket连接情 if '' != db_config['hostport']: database['port']=int(db_config['hostport']) #print(database) self.linkID[linkNum] = pymysql.connect(**database) if '' != db_config['database']: self.linkID[linkNum].select_db(str(db_config['database'])) dbVersion = self.linkID[linkNum].server_version if dbVersion >= "4.1": self.linkID[linkNum].query("SET NAMES %s" % self.config.get("db.charset")) #设置sql_mode if dbVersion > "5.0.1": self.linkID[linkNum].query("SET sql_mode=''") #标记连接成功 self.connected = True #注销数据库连接配置信息 if 1 != self.config.get("db.deploy_type"): self.dbConfig = '' except pymysql.Error as e: Log.error(e) #print(self.linkID[linkNum]) return self.linkID[linkNum]