File: multicall.code

package info (click to toggle)
librpc-xml-perl 0.82-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 1,352 kB
  • sloc: perl: 9,665; xml: 3,020; makefile: 17
file content (62 lines) | stat: -rw-r--r-- 2,000 bytes parent folder | download | duplicates (9)
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;
}