for call in calls: try: name = call["methodName"] params = call.get("params", []) if name == "system.multicall": # Recursive system.multicall forbidden raise RPCError(Faults.INCORRECT_PARAMETERS) root = AttrDict(self.namespaces) value = traverse(root, name, params) except RPCError, inst: value = {"faultCode": inst.code, "faultString": inst.text} except: errmsg = "%s:%s" % (sys.exc_type, sys.exc_value) value = {"faultCode": 1, "faultString": errmsg} producers.append(value) results = [] def multiproduce(): """ Run through all the producers in order """ if not producers: return [] callback = producers.pop(0) if isinstance(callback, types.FunctionType): try: value = callback() except RPCError, inst: value = {"faultCode": inst.code, "faultString": inst.text}
def multicall(self, calls): """Process an array of calls, and return an array of results. Calls should be structs of the form {'methodName': string, 'params': array}. Each result will either be a single-item array containing the result value, or a struct of the form {'faultCode': int, 'faultString': string}. This is useful when you need to make lots of small calls without lots of round trips. @param array calls An array of call requests @return array result An array of results """ producers = [] for call in calls: try: name = call['methodName'] params = call.get('params', []) if name == 'system.multicall': # Recursive system.multicall forbidden raise RPCError(Faults.INCORRECT_PARAMETERS) root = AttrDict(self.namespaces) value = traverse(root, name, params) except RPCError: inst = sys.exc_info()[1] value = {'faultCode': inst.code, 'faultString': inst.text} except: errmsg = "%s:%s" % (sys.exc_info()[0], sys.exc_info()[1]) value = {'faultCode': 1, 'faultString': errmsg} producers.append(value) results = [] def multiproduce(): """ Run through all the producers in order """ if not producers: return [] callback = producers.pop(0) if isinstance(callback, types.FunctionType): try: value = callback() except RPCError: inst = sys.exc_info()[1] value = {'faultCode': inst.code, 'faultString': inst.text} if value is NOT_DONE_YET: # push it back in the front of the queue because we # need to finish the calls in requested order producers.insert(0, callback) return NOT_DONE_YET else: value = callback results.append(value) if producers: # only finish when all producers are finished return NOT_DONE_YET return results multiproduce.delay = .05 return multiproduce
def multicall(self, calls): """Process an array of calls, and return an array of results. Calls should be structs of the form {'methodName': string, 'params': array}. Each result will either be a single-item array containg the result value, or a struct of the form {'faultCode': int, 'faultString': string}. This is useful when you need to make lots of small calls without lots of round trips. @param array calls An array of call requests @return array result An array of results """ producers = [] for call in calls: try: name = call['methodName'] params = call.get('params', []) if name == 'system.multicall': # Recursive system.multicall forbidden raise RPCError(Faults.INCORRECT_PARAMETERS) root = AttrDict(self.namespaces) value = traverse(root, name, params) except RPCError as inst: value = {'faultCode': inst.code, 'faultString': inst.text} except: errmsg = "%s:%s" % (sys.exc_info()[0], sys.exc_info()[1]) value = {'faultCode': 1, 'faultString': errmsg} producers.append(value) results = [] def multiproduce(): """ Run through all the producers in order """ if not producers: return [] callback = producers.pop(0) if isinstance(callback, types.FunctionType): try: value = callback() except RPCError as inst: value = {'faultCode':inst.code, 'faultString':inst.text} if value is NOT_DONE_YET: # push it back in the front of the queue because we # need to finish the calls in requested order producers.insert(0, callback) return NOT_DONE_YET else: value = callback results.append(value) if producers: # only finish when all producers are finished return NOT_DONE_YET return results multiproduce.delay = .05 return multiproduce
for call in calls: try: name = call['methodName'] params = call.get('params', []) if name == 'system.multicall': # Recursive system.multicall forbidden raise RPCError(Faults.INCORRECT_PARAMETERS) root = AttrDict(self.namespaces) value = traverse(root, name, params) except RPCError, inst: value = {'faultCode': inst.code, 'faultString': inst.text} except: errmsg = "%s:%s" % (sys.exc_type, sys.exc_value) value = {'faultCode': 1, 'faultString': errmsg} producers.append(value) results = [] def multiproduce(): """ Run through all the producers in order """ if not producers: return [] callback = producers.pop(0) if isinstance(callback, types.FunctionType): try: value = callback() except RPCError, inst: value = {'faultCode':inst.code, 'faultString':inst.text}