Thank you, Christian, for the detailed explanation!

One more question, if I may. Is it possible to run updating jobs on different databases in parallel? Or can database update operations only be run sequentially, one db at a time? I have a query that calls a function to perform a series of operations:

for $i in (0 to 9)
return (
  jobs:eval('
    declare variable $iter external;
    local:add-uris("marc.exp.20210115."||$iter)
  ', map {"iter": $i})
)

The function:
Based on some simple tests, it doesn't seem possible to run the jobs in parallel, but I thought I would ask--to see whether there was something I was missing.

Thanks again,
Tim


--
Tim A. Thompson
Discovery Metadata Librarian
Yale University Library

On Sat, Feb 6, 2021 at 5:22 PM Christian Grün <christian.gruen@gmail.com> wrote:
Hi Tim,

file:write uses the default W3 serialization method "XML". This means
that the standard entities (&, <, etc.) will be encoded. This can be
circumvented by using the 'text' output method…

  file:write(..., ..., map { 'method': 'text' })

…or file:write-text.

In BaseX, we introduced our own serialization method 'basex', which
serializes strings as strings and basex64 and hex data as bytes. With
this method (if it had been part of the official standard),
file:write-text and file:write-binary could actually have been
dropped.

> Ah, never mind. When I run the file:write-text() without jobs:eval(), I get an error, "Cannot convert xs:dateTime to xs:string." Is it possible to return the error from a job call?

You can cache the result of a query…

  let $job-id := jobs:eval(..., ..., map { 'cache': true() })

…and retrieve the result or the error with jobs:result($job-id).

Hope this helps,
Christian