python/dist/src/Lib xmlrpclib.py,1.30,1.31
Update of /cvsroot/python/python/dist/src/Lib In directory sc8-pr-cvs1:/tmp/cvs-serv14689/Lib Modified Files: xmlrpclib.py Log Message: Patch #531629: Add multicall support. Index: xmlrpclib.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/xmlrpclib.py,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** xmlrpclib.py 20 Oct 2003 14:01:51 -0000 1.30 --- xmlrpclib.py 31 Oct 2003 13:49:36 -0000 1.31 *************** *** 51,54 **** --- 51,55 ---- # 2003-06-15 gn Add support for time.struct_time # 2003-07-12 gp Correct marshalling of Faults + # 2003-10-31 mvl Add multicall support # # Copyright (c) 1999-2002 by Secret Labs AB. *************** *** 109,112 **** --- 110,114 ---- ServerProxy Represents a logical connection to an XML-RPC server + MultiCall Executor of boxcared xmlrpc requests Boolean boolean wrapper to generate a "boolean" XML-RPC value DateTime dateTime wrapper for an ISO 8601 string or time tuple or *************** *** 876,880 **** --- 878,944 ---- dispatch["methodName"] = end_methodName + ## Multicall support + # + + class _MultiCallMethod: + # some lesser magic to store calls made to a MultiCall object + # for batch execution + def __init__(self, call_list, name): + self.__call_list = call_list + self.__name = name + def __getattr__(self, name): + return _MultiCallMethod(self.__call_list, "%s.%s" % (self.__name, name)) + def __call__(self, *args): + self.__call_list.append((self.__name, args)) + + def MultiCallIterator(results): + """Iterates over the results of a multicall. Exceptions are + thrown in response to xmlrpc faults.""" + + for i in results: + if type(i) == type({}): + raise Fault(i['faultCode'], i['faultString']) + elif type(i) == type([]): + yield i[0] + else: + raise ValueError,\ + "unexpected type in multicall result" + + class MultiCall: + """server -> a object used to boxcar method calls + + server should be a ServerProxy object. + + Methods can be added to the MultiCall using normal + method call syntax e.g.: + + multicall = MultiCall(server_proxy) + multicall.add(2,3) + multicall.get_address("Guido") + + To execute the multicall, call the MultiCall object e.g.: + add_result, address = multicall() + """ + + def __init__(self, server): + self.__server = server + self.__call_list = [] + + def __repr__(self): + return "<MultiCall at %x>" % id(self) + + __str__ = __repr__ + + def __getattr__(self, name): + return _MultiCallMethod(self.__call_list, name) + + def __call__(self): + marshalled_list = [] + for name, args in self.__call_list: + marshalled_list.append({'methodName' : name, 'params' : args}) + + return MultiCallIterator(self.__server.system.multicall(marshalled_list)) + # -------------------------------------------------------------------- # convenience functions *************** *** 1329,1333 **** __str__ = __repr__ ! def __getattr__(self, name): # magic method dispatcher --- 1393,1397 ---- __str__ = __repr__ ! def __getattr__(self, name): # magic method dispatcher
participants (1)
-
loewis@users.sourceforge.net