dba/files 
                    library moduleR
Summary
Upload backups.
- Authors
 - Christian Grün, BaseX Team 2005-23, BSD License
 
Imports
This module is imported by 0 modules. It imports 1 modules.
Variables
Functions
4.1 dba:file-upload
Arities: #1R
dba:file-upload
		  ( 
			$files as map(xs:string, xs:base64Binary) ) as element(rest:response)- files
asmap(xs:string, xs:base64Binary)map with uploaded files 
element(rest:response)redirection
Invoked by 0 functions from 0 modules
Annotations (3)
%rest:POST | () | 
%rest:path | ('/dba/backup-upload') | 
%rest:form-param | ('files','{$files}') | 
Source ( 26 lines)
function dba:file-upload(
  $files  as map(xs:string, xs:base64Binary)
) as element(rest:response) {
  (: save files :)
  let $dir := db:option('dbpath') || '/'
  return try {
    (: reject backups with invalid content :)
    map:for-each($files, function($file, $content) {
      let $name := replace($file, $util:BACKUP-ZIP-REGEX, '$1')
      let $entries := archive:entries($content) ! data()
      where not(if($name) then (
        every $entry in $entries satisfies starts-with($entry, $name || '/') and
        $entries = $name || '/inf.basex'
      ) else (
        every $entry in $entries satisfies matches($entry, '\.(xml|basex)')
      ))
      return error((), 'Invalid backup file: ' || $file)
    }),
    map:for-each($files, function($file, $content) {
      file:write-binary($dir || $file, $content)
    }),
    web:redirect($dba:CAT, map { 'info': util:info(map:keys($files), 'backup', 'uploaded') })
  } catch * {
    web:redirect($dba:CAT, map { 'error': $err:description })
  }
}Namespaces
The following namespaces are defined:
| Prefix | Uri | 
|---|---|
| archive | http://basex.org/modules/archive | 
| db | http://basex.org/modules/db | 
| dba | dba/files 2 3 4 5 6 7 8 | 
| err | http://www.w3.org/2005/xqt-errors | 
| file | http://expath.org/ns/file | 
| map | http://www.w3.org/2005/xpath-functions/map | 
| rest | http://exquery.org/ns/restxq | 
| util | dba/util | 
| web | http://basex.org/modules/web | 
| xs | http://www.w3.org/2001/XMLSchema | 
Source Code
(:~
 : Upload backups.
 :
 : @author Christian Grün, BaseX Team 2005-23, BSD License
 :)
module namespace dba = 'dba/files';
import module namespace util = 'dba/util' at '../../lib/util.xqm';
(:~ Top category :)
declare variable $dba:CAT := 'databases';
(:~
 : Uploads backups.
 : @param  $files  map with uploaded files
 : @return redirection
 :)
declare
  %rest:POST
  %rest:path('/dba/backup-upload')
  %rest:form-param('files', '{$files}')
function dba:file-upload(
  $files  as map(xs:string, xs:base64Binary)
) as element(rest:response) {
  (: save files :)
  let $dir := db:option('dbpath') || '/'
  return try {
    (: reject backups with invalid content :)
    map:for-each($files, function($file, $content) {
      let $name := replace($file, $util:BACKUP-ZIP-REGEX, '$1')
      let $entries := archive:entries($content) ! data()
      where not(if($name) then (
        every $entry in $entries satisfies starts-with($entry, $name || '/') and
        $entries = $name || '/inf.basex'
      ) else (
        every $entry in $entries satisfies matches($entry, '\.(xml|basex)')
      ))
      return error((), 'Invalid backup file: ' || $file)
    }),
    map:for-each($files, function($file, $content) {
      file:write-binary($dir || $file, $content)
    }),
    web:redirect($dba:CAT, map { 'info': util:info(map:keys($files), 'backup', 'uploaded') })
  } catch * {
    web:redirect($dba:CAT, map { 'error': $err:description })
  }
};