/
multicall.code
62 lines (53 loc) · 1.95 KB
/
multicall.code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
###############################################################################
#
# Sub Name: multicall
#
# Description: Execute multiple method calls in a single request
#
# Arguments: NAME IN/OUT TYPE DESCRIPTION
# $srv in ref Server object instance
# $list in ref List of struct's with the call
# data within.
#
# Globals: None.
#
# Environment: None.
#
# Returns: Success: listref
# Failure: fault object
#
###############################################################################
sub multicall
{
use strict;
my $srv = shift;
my $list = shift;
my ($call, $subname, $params, $result, @results);
my $name = $srv->{method_name};
for $call (@$list)
{
unless (ref($call) eq 'HASH')
{
return RPC::XML::fault->new(200,
"$name: One of the array elements " .
'passed in was not a struct');
}
return RPC::XML::fault->new(310,
"$name: Request was missing required " .
'"methodName" member')
unless ($subname = $call->{methodName});
return RPC::XML::fault->new(310,
"$name: Recursive calling of $name not " .
'allowed')
if ($subname eq $name);
$params = $call->{params} || [];
return RPC::XML::fault->new(200,
"$name: Request's value for \"params\" " .
'was not an array')
unless (ref($params) eq 'ARRAY');
$result = $srv->dispatch([ $subname, @$params ]);
return $result if $result->is_fault;
push @results, $result->value;
}
\@results;
}