This page is part of the [[Getting Started]] Section.
In BaseX, a ''database'' is a pretty light-weight concept. It may contain one or more '''resources''', which are addressed by a unique database path. There is no explicit layer for collections: Instead, collections are implicitly created and deleted, and collections result from the existence of documents in specific paths. The resource types exist: '''XML documents''', '''Binary data''', and '''XQuery Values'''. Additional information on [[Binary Data|binary data]] can be found on an extra page.
Multiple databases can be addressed (queried, updated) with a single XQuery expression. As a single database is restricted to 2 billion XML nodes (see [[Statistics]]), but resources can easily be distributed across multiple database instances.Multiple databases can be addressed (queried, updated) by a single XQuery expression. Three different resource types exist: {|class="wikitable"|- valign="top"| '''Resource Type'''| '''Description'''|- valign="top"| XML Documents| The default resource type. The storage and index features are optimized for XML contents, or any other contents stored in an XML representation.|- valign="top"| Binary Data| Binary data: Raw data of any type, stored in its binary representation. See [[Binary Data]] for more information.|- valign="top"| XQuery Values| 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]].|}
=Create Databases=
Databases can be created via [[Commands]], via [[XQuery]], in the [[GUI]], and with various [[Developing|APIs]]. If an initial input is specified with a create operation, some time can be saved, as the specified resources will be added to the database in a bulk operation:
* [[Startup#BaseX Standalone|ConsoleCommand-Line]]: <code>CREATE DB db documents /path/to/resources</code>: Add documents resources in the specified path to a databasenamed {{Code|documents}}.
* [[Startup#BaseX GUI|GUI]]: Go to ''Database'' → ''New'', press ''Browse…'' to choose an initial file or directory, and press ''OK''.
The database name of a database is composed of a restricted set of characters (see [[Valid Names]]). Various [[parsersParsers]] can be selected to control the import process, or to convert data of different formats input type to XML. '''Note:''' A database can be created in main-memory by enabling the {{Option|MAINMEM}} option ([[Databases#In Memory Database|see below]] for more details).
=Access Resources=
{| class="wikitable"
|-valign="top"
!Function
!Example
!Description
|-valign="top"
|{{Function|Database|db:get}}
|{{Code|db:get("db", "path/to/docs")}}
|Returns all documents that are found in the database {{Code|db}} at the (optional) path {{Code|path/to/docs}}.
|-valign="top"
|<code>[http://www.xqueryfunctions.com/xq/fn_collection.html fn:collection]</code>
|{{Code|collection("db/path/to/docs")}}
|Returns all documents at the location {{Code|path/to/docs}} in the database {{Code|db}}.<br/>If no path is specified after the database, all documents in the database will be returned.<br/>If no argument is specified, all documents of the database will be returned that has been opened in the global context.
|-valign="top"
|<code>[http://www.xqueryfunctions.com/xq/fn_doc.html fn:doc]</code>
|{{Code|doc("db/path/to/doc.xml")}}
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.
!Example
!Description
|-valign="top"
|{{Function|Database|db:name}}
|{{Code|db:name($node)}}
|Returns the name of the database in which the specified {{Code|$node}} is stored.
|-valign="top"
|{{Function|Database|db:path}}
|{{Code|db:path($node)}}
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/documentsresources/')</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/documentsresources/'
for $path in file:list($root)
where matches($path, '\d+')
} catch * {
db:put-binary($db, $root || $path, $path),
db:put-value($db, $err:description, $path || '.infoerror')
}
</syntaxhighlightpre>
The error messages can e.g. be analyzed in a second step:
<syntaxhighlight pre lang="'xquery"'>let $failures errors := db:get-value('miscdocuments')return for $filename in map:for-eachkeys($failures, functionerrors)where ends-with($filename, $'.error') { return $filename || ': ' || $error}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 Database InstancesDatabases=
* In 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 (using <code>CREATE DB</code>), which can then be accessed by subsequent commands.* If a BaseX server instance is started, and if a database is created in its context (using <code>at startup time, e.g., with the [[Command-Line Options|command-line option -c]] and a {{Command|CREATE DB</code>)}} call, other BaseX client instances 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 (using OPEN, dbport:get, etc1984).) as long as no other database is opened/MAINMEM: trueDatabase 'mainmem' created by the serverin 1782.80 ms. # ClientbasexclientUsername: ...Password: ...* You can force an ordinary database to being copied to memory by applying an empty BaseX [[XQuery_Update#Main-Memory_Updates|main-memory updateClient]] on a database node: <codeTry 'help' to get more information.>XQUERY count(db:get('some-dbmainmem') update { }//*)1876462Query executed in 0.97 ms.</codepre>
'''NoteAdditional 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>* 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.