def _fret_obj(ret_str): try: dicts = json.loads(ret_str) except: raise SearpcError('Invalid response format') if dicts.has_key('err_code'): raise SearpcError(dicts['err_msg']) if dicts['ret']: return _SearpcObj(dicts['ret']) else: return None
def _fret_objlist(ret_str): try: dicts = json.loads(ret_str) except: raise SearpcError('Invalid response format') if dicts.has_key('err_code'): raise SearpcError(dicts['err_msg']) l = [] if dicts['ret']: for elt in dicts['ret']: l.append(_SearpcObj(elt)) return l
class SearpcServer(object): def __init__(self): self.services = {} def create_service(self, svcname): service = SearpcService(svcname) self.services[svcname] = service def register_function(self, svcname, fn, fname=None): service = self.services[svcname] if fname == None: fname = fn.__name__ service.func_table[fname] = fn def _call_function(self, svcname, fcallstr): """input str -> output str""" try: argv = json.loads(fcallstr) except Exception, e: raise SearpcError('bad call str: ' + str(e)) service = self.services[svcname] fname = argv[0] fn = service.func_table.get(fname, None) if fn is None: raise SearpcError('No such funtion %s' % fname) ret = fn(*argv[1:]) return ret
def decorate(func): if ret_type == "void": fret = None elif ret_type == "object": fret = _fret_obj elif ret_type == "objlist": fret = _fret_objlist elif ret_type == "int": fret = _fret_int elif ret_type == "int64": fret = _fret_int elif ret_type == "string": fret = _fret_string elif ret_type == "json": fret = _fret_json else: raise SearpcError('Invial return type') def newfunc(self, *args): array = [func.__name__] + list(args) fcall_str = json.dumps(array) ret_str = self.call_remote_func_sync(fcall_str) if fret: return fret(ret_str) return newfunc
def _call_function(self, svcname, fcallstr): """input str -> output str""" try: argv = json.loads(fcallstr) except Exception, e: raise SearpcError('bad call str: ' + str(e))