Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
    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
Esempio n. 5
0
 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))