Changes

Jump to navigation Jump to search
126 bytes added ,  18:39, 1 December 2023
m
Text replacement - "syntaxhighlight" to "pre"
|- valign="top"
| XQuery Values
| Introduced with {{Announce|Version 10}}: Results of XQuery expressions, stored in a binary representation for fast retrieval. All value types are supported, including maps and arrays, but excluding any other [[Higher-Order Functions#Function Items|function items]].
|}
You can access multiple databases in a single query:
<syntaxhighlight pre lang="'xquery"'>
for $i in 1 to 100
return db:get('books' || $i)//book/title
</syntaxhighlightpre>
If the {{Option|DEFAULTDB}} option is turned on, the path argument of the {{Code|fn:doc}} or {{Code|fn:collection}} functions will first be resolved against the globally opened database.
The {{Code|fn:document-uri}} and {{Code|fn:base-uri}} functions return URIs that can also be reused as arguments for the {{Code|fn:doc}} and {{Code|fn:collection}} functions. As a result, the following example query always returns {{Code|true}}:
<syntaxhighlight pre lang="'xquery"'>
every $c in collection('anyDB')
satisfies doc-available(document-uri($c))
</syntaxhighlightpre>
If the argument of {{Code|fn:doc}} or {{Code|fn:collection}} does not start with a valid database name, or if the addressed database does not exist, the string is interpreted as URI reference, and the documents found at this location will be returned. Examples:
If the API you use does not support binary output (which is e.g. the case for various [[Clients|Client]] language bindings), you can convert your binary data to its string representation before returning it to the client:
<syntaxhighlight pre lang="'xquery"'>
string(db:get-binary('multimedia', 'sample.avi'))
</syntaxhighlightpre>
==XQuery Values==
With {{Function|Database|db:get-value}}, XQuery values can be retrieved. In the following example, we assume that an XQuery map {{Code|cities}} was stored in an {{Code|indexes}} database:
<syntaxhighlight pre lang="'xquery"'>
let $city-map := db:get-value('indexes', 'cities')
return $city-map?Chile
</syntaxhighlightpre>
=Update Resources=
You can also use functions from the [[Database Module]] to add, replace, or delete XML documents:
<syntaxhighlight pre lang="'xquery"'>db:add('databasedocuments', '/path/to/xml/resources/')</syntaxhighlightpre>
Function from other modules, such as the [[File Module]], can be utilized to filter the input. With the following code, all files that contain numbers in the filename are selected, and stored as XML. If an input file contains no well-formed XML, it is stored as binary resource, and the error message is stored as a string value:
<syntaxhighlight pre lang="'xquery"'>
let $db := 'documents'
let $root := '/path/to/resources/'
db:put-value($db, $err:description, $path || '.error')
}
</syntaxhighlightpre>
The error messages can e.g. be analyzed in a second step:
<syntaxhighlight pre lang="'xquery"'>let $errors := db:get-value('resourcesdocuments')
for $filename in map:keys($errors)
where ends-with($filename, '.error')
return $filename || ': ' || $errors?($filename)
</syntaxhighlightpre>
=Export DataDatabase=
All resources stored in a database can be ''exported'', i.e., written back to disk, e.g., as follows:
* WebDAV: Locate the database directory (or a subdirectory of it) and copy all contents to another location.
=Main-Memory Databases= A database can be created in main-memory by enabling the {{Option|MAINMEM}} option. Next, in the standalone context, a main-memory database can be created, which can then be accessed by subsequent commands. If a BaseX server is started, and if a database is created in its context at startup time, e.g., with the [[Command-Line Options|command-line option -c]] and a {{Command|CREATE DB}} call, BaseX clients can then access and update this database: <pre lang="perl"># Serverbasexserver -c"SET mainmem on" -c"CREATE DB mainmem document.xml"BaseX [Server]Server was started (port: 1984).MAINMEM: trueDatabase Instances='mainmem' created in 1782.80 ms.
A database can be created # ClientbasexclientUsername: ...Password: ...BaseX [Client]Try 'help' to get more information.> XQUERY count(db:get('mainmem')//*)1876462Query executed in main-memory by enabling the {{Option|MAINMEM}} option0.97 ms. Next,</pre>
* in the standalone context, a main-memory database can be created (using {{Command|CREATE DB}}), which can then be accessed by subsequent commands.* If a BaseX server instance is started, and if a database is created in its context at startup time (e.g., with the {{Command-Line Options|command-line option -c}}), other BaseX client instances can access and update this database.Additional notes:
* You can force an ordinary database, or parts of it, to being temporarily copied to memory by applying an empty [[XQuery_Update#Main-Memory_Updates|main-memory update]] on a database node: <code>db:get('some-db') update { }</code>
 '''Note:''' * If you open local or remote documents with <code>fn:doc</code> or <code>fn:collection</code>, the resulting internal representation is identical to those of main-memory database instances (regardless of which value is set for {{Option|MAINMEM}}).
=Changelog=
;Version 8.4
* Updated: [[#Raw Files|Raw Files]]: Items of binary type can be output without specifying the obsolete <code>raw</code> serialization method.
;Version 7.2.1
* Updated: {{Code|fn:document-uri}} and {{Code|fn:base-uri}} now return strings that can be reused with {{Code|fn:doc}} or {{Code|fn:collection}} to reopen the original document.
Bureaucrats, editor, reviewer, Administrators
13,554

edits

Navigation menu