diff --git a/pysearpc/Makefile.am b/pysearpc/Makefile.am index b81efe8..ac19fa5 100644 --- a/pysearpc/Makefile.am +++ b/pysearpc/Makefile.am @@ -1,5 +1,5 @@ pysearpcdir=${pyexecdir}/pysearpc -pysearpc_PYTHON = __init__.py client.py +pysearpc_PYTHON = __init__.py common.py client.py server.py diff --git a/pysearpc/__init__.py b/pysearpc/__init__.py index 4703b7d..33c7fed 100644 --- a/pysearpc/__init__.py +++ b/pysearpc/__init__.py @@ -1,2 +1,3 @@ - -from client import SearpcClient, searpc_func, SearpcError, SearpcObjEncoder +from common import SearpcError +from client import SearpcClient, searpc_func, SearpcObjEncoder +from server import searpc_server diff --git a/pysearpc/client.py b/pysearpc/client.py index f44b1aa..2bd75e9 100644 --- a/pysearpc/client.py +++ b/pysearpc/client.py @@ -1,19 +1,12 @@ import simplejson as json - -class SearpcError(Exception): - - def __init__(self, msg): - self.msg = msg - - def __str__(self): - return self.msg +from common import SearpcError def _fret_int(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']) @@ -27,7 +20,7 @@ def _fret_string(ret_str): dicts = json.loads(ret_str) except: raise SearpcError('Invalid response format') - + if dicts.has_key('err_code'): raise SearpcError(dicts['err_msg']) @@ -67,29 +60,29 @@ def _fret_obj(ret_str): 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 diff --git a/pysearpc/common.py b/pysearpc/common.py new file mode 100644 index 0000000..82b52ea --- /dev/null +++ b/pysearpc/common.py @@ -0,0 +1,7 @@ +class SearpcError(Exception): + + def __init__(self, msg): + self.msg = msg + + def __str__(self): + return self.msg diff --git a/pysearpc/server.py b/pysearpc/server.py new file mode 100644 index 0000000..1e0a528 --- /dev/null +++ b/pysearpc/server.py @@ -0,0 +1,51 @@ +import simplejson as json + +from common import SearpcError + +class SearpcService(object): + def __init__(self, name): + self.name = name + self.func_table = {} + +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 call_function(self, svcname, fcallstr): + try: + retVal = self._call_function(svcname, fcallstr) + except Exception, e: + ret = {'err_code': 555, 'err_msg': str(e)} + else: + ret = {'ret': retVal} + + return json.dumps(ret) + +searpc_server = SearpcServer()