Class XmlRpc.multicall

class multicall : client -> object .. end

Convenience class for system.multicall calls.

Instances take an XmlRpc.client as an argument:

        # let mc = new XmlRpc.multicall client;;
        val mc : XmlRpc.multicall = <obj>
    

The "call" method works like client#call, but it returns a lazy value:

        # let a = mc#call "demo.addTwoNumbers" [`Int 3; `Int 4];;
        val a : XmlRpc.value Lazy.t = <lazy>
        # let b = mc#call "demo.addTwoNumbers" [`Int 42; `String "oh noes!"];;
        val b : XmlRpc.value Lazy.t = <lazy>
        # let c = mc#call "demo.addTwoNumbers" [`Double 3.0; `Double 4.0];;
        val c : XmlRpc.value Lazy.t = <lazy>
    

At this point, the call has not been executed yet:

        # mc#executed;;
        -- : bool = false
    

As soon as one of the return values is forced, the call is executed:

        # Lazy.force a;;
        -- : XmlRpc.value = `Int 7
        # mc#executed;;
        -- : bool = true
    

Once a call has been executed, this instance cannot be used to make any further calls; instead, a new multicall instance must be created:

        # mc#call "demo.addTwoNumbers" [`Int 2; `Int 2];;
        Exception: Failure "multicall#call: already executed".
    

If an XmlRpc fault occurred, the exception will be thrown when the lazy value is forced:

        # Lazy.force b;;
        Exception: XmlRpc.Error (-32602, "server error. invalid method parameters").
    

This will not prevent further methods from executing successfully:

        # Lazy.force c;;
        -- : XmlRpc.value = `Double 7.
    

It is possible for a multicall to be executed but not completed, for example if a transport error occurs. Aside from catching the exception, the completed property indicates if the call actually went through or not:

        # mc#completed;;
        -- : bool = true
    

It is not necessary to use lazy values. Instead, the call can be executed explicitly, and the results can be retrieved by number:

        # let mc = new XmlRpc.multicall client;;
        val mc : XmlRpc.multicall = <obj>
        # ignore (mc#call "demo.addTwoNumbers" [`Int 2; `Int 2]);;
        -- : unit = ()
        # ignore (mc#call "demo.addTwoNumbers" [`Int 3; `Int 3]);;
        -- : unit = ()
        # mc#result 1;;
        -- : XmlRpc.value = `Int 6
    

method call : string -> value list -> value Stdlib.Lazy.t

Adds a call to this multicall instance. If the call has already executed, the following exception will be raised: Failure "multicall#call: already executed".

method execute : unit -> unit

Forces the call to execute immediately. If the call has already executed and completed successfully, the following exception will be raised: Failure "multicall#execute: already completed".

method result : int -> value

Returns a multicall result, executing the call if necessary. The results are numbered starting with zero.

method executed : bool

True if the call has executed, whether or not it succeeded.

method completed : bool

True of the call has executed and completed successfully.