Changes

Jump to navigation Jump to search
1,013 bytes added ,  13:52, 1 August 2022
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| 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]].|}
=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")}}
!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)}}
<syntaxhighlight lang="xquery">
db:add('databasedocuments', '/path/to/xml/documentsresources/')
</syntaxhighlight>
<syntaxhighlight 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')
}
</syntaxhighlight>
<syntaxhighlight 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)
</syntaxhighlight>
=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 : <syntaxhighlight 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.</codesyntaxhighlight>
'''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.
Bureaucrats, editor, reviewer, Administrators
13,550

edits

Navigation menu