Monday, November 08, 2010 at 12:02 AM.


on clientMultiCall (rpcServer="localhost", rpcPort=user.inetd.config.http.port, adrCallTable=nil, fldebug=false, ticksToTimeOut=nil, flShowMessages=true, rpcPath=nil, flAsynch=false, adrCallback=nil, extraInfo=nil, adrErrorCallback=nil, username="", password="") {
		<<4/9/01; 8:09:48 PM by DW
			<<Created. Interfaces to the multicall capability.
	local (multicallparamlist = {}, adrsub, call);
	for adrsub in adrCallTable {
		new (tabletype, @call);
		call.methodName = adrsub^.methodName;
		call.params = adrsub^.params;
		multicallparamlist = multicallparamlist + {call}};
	local (params = {multicallparamlist});
	local (returnedlist = betty.rpc.client (rpcServer, rpcPort, "system.multicall", @params, fldebug, ticksToTimeOut, flShowMessages, rpcPath, username:username, password:password));
	local (returnedtable, ixlist = 1);
	new (tabletype, @returnedtable);
	for adrsub in adrCallTable {
		adrreturnsub = @returnedtable.[nameof (adrsub^)];
		new (tabletype, adrreturnsub);
		case typeof (returnedlist [ixlist]) {
			listtype {
				adrreturnsub^.flError = false;
				adrreturnsub^.value = returnedlist [ixlist] [1]};
			tabletype {
				local (t = returnedlist [ixlist]);
				adrreturnsub^.flError = true;
				adrreturnsub^.faultCode = t.faultCode;
				adrreturnsub^.faultString = t.faultString}};
	return (returnedtable)};
bundle { //test code
		<<For this test we use a special version of examples.getStateName that errors if the statenum is out of range.
		<<The handler follows, copy this into a new script at user.betty.rpcHandlers.examples.getStateNameWithError.
			<<on getStateNameWithError (statenum)
				<<if (statenum < 1) or (statenum > 50)
					<<scripterror ("Can't get the state name because the state num is less than 1 or greater than 50.")
				<<return (states.nthState (statenum))
	local (calltable, i);
	new (tabletype, @calltable);
	for i = 1 to 10 {
		new (tabletype, @onecall);
		onecall.methodName = "examples.getStateNameWithError";
		onecall.params = {random (35, 65)};
		calltable.[string.padwithzeros (i, 3)] = onecall};
	scratchpad.multicallresult = clientMultiCall (adrCallTable:@calltable);
	edit (@scratchpad.multicallresult)}

This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.