@@ -25,6 +25,7 @@ declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
2525declare namespace http = "http://expath.org/ns/http-client" ;
2626import module namespace sm = "http://exist-db.org/xquery/securitymanager" ;
2727import module namespace system = "http://exist-db.org/xquery/system" ;
28+ import module namespace util = "http://exist-db.org/xquery/util" ;
2829
2930import module namespace config = "http://fusiondb.com/ns/studio/api/config" at "modules/config.xqm" ;
3031import module namespace col = "http://fusiondb.com/ns/studio/api/collection" at "modules/collection.xqm" ;
@@ -638,7 +639,10 @@ function api:query($range-header, $body) {
638639 "code" : $hsc:bad-request,
639640 "reason" : "Missing request body"
640641 },
641- ()
642+ map {
643+ "code" : 1 ,
644+ "description" : "Missing request body"
645+ }
642646 )
643647 else if (ut:is-guest ())
644648 then
@@ -652,38 +656,81 @@ function api:query($range-header, $body) {
652656 else
653657 let $json-txt := util:base64-decode ($body)
654658 let $query-data := fn:parse-json ($json-txt)
659+ let $range :=
660+ if (fn:empty ($range-header) or fn:not (fn:starts-with ($range-header, "items=" )))
661+ then
662+ ()
663+ else
664+ let $res := fn:analyze-string ($range-header, "items=([0-9]+)-([0-9]+)?" )
665+ return
666+ ($res//fn:group [@nr eq "1" ]/xs:integer (.), $res//fn:group [@nr eq "2" ]/xs:integer (.))
655667 return
656- let $range :=
657- if (fn:empty ($range-header) or fn:not (fn:starts-with ($range-header, "items=" )))
658- then
659- ()
660- else
661- let $res := fn:analyze-string ($range-header, "items=([0-9]+)-([0-9]+)?" )
662- return
663- ($res//fn:group [@nr eq "1" ]/xs:integer (.), $res//fn:group [@nr eq "2" ]/xs:integer (.))
664-
665- let $query-results := qry:execute ($query-data, $range[1 ], $range[2 ])
666-
667- let $content-range-header :=
668- if (not (empty ($range)))
669- then
670- map {
671- "Content-Range" : "items " || $range[1 ] || "-" || count ($query-results) || "/*"
672- }
673- else
674- map {}
675- return
668+ if ($query-data?query-uri and not (util:binary-doc-available ($query-data?query-uri)))
669+ then
676670 api:cors-allow (
677671 map {
678- "code" : if (not (empty ($range))) then $hsc:partial-content else $hsc:ok,
679- "headers" : map:merge ((map {
680- "Accept-Ranges" : "items"
681- }, $content-range-header))
672+ "code" : $hsc:bad-request,
673+ "reason" : "Stored query: " || $query-data?query-uri || " does not exist!"
682674 },
683675 map {
684- "results" : $query-results
676+ "code" : 2 ,
677+ "description" : "Stored query: " || $query-data?query-uri || " does not exist!"
685678 }
686679 )
680+ else
681+ let $range-start := $range[1 ]
682+ let $range-end := $range[2 ]
683+ let $query-results :=
684+ try {
685+ qry:execute ($query-data, $range-start, $range-end)
686+ } catch * {
687+ let $error-map := map {
688+ "code" : $err:code,
689+ "description" : $err:description,
690+ "value" : $err:value,
691+ "module" : $err:module,
692+ "line-number" : $err:line-number,
693+ "column-number" : $err:column-number,
694+ "additional" : $err:additional
695+ }
696+ return
697+ map {
698+ "code" : 3 ,
699+ "description" : "An error occurred whilst evaluating the query" ,
700+ "xquery-error" : ut:filter-map ($error-map, ut:filter-entry-value-empty-sequence #2 )
701+ }
702+ }
703+ return
704+ if ($query-results instance of map (*))
705+ then
706+ api:cors-allow (
707+ map {
708+ "code" : $hsc:bad-request,
709+ "reason" : "query raised an error"
710+ },
711+ $query-results
712+ )
713+ else
714+ let $content-range-header :=
715+ if (not (empty ($range)))
716+ then
717+ map {
718+ "Content-Range" : "items " || $range[1 ] || "-" || count ($query-results) || "/*"
719+ }
720+ else
721+ map {}
722+ return
723+ api:cors-allow (
724+ map {
725+ "code" : if (not (empty ($range))) then $hsc:partial-content else $hsc:ok,
726+ "headers" : map:merge ((map {
727+ "Accept-Ranges" : "items"
728+ }, $content-range-header))
729+ },
730+ map {
731+ "results" : $query-results
732+ }
733+ )
687734};
688735
689736declare
0 commit comments