Skip to content
This repository was archived by the owner on Nov 9, 2022. It is now read-only.

Commit 974b022

Browse files
Merge pull request #768 from grtjn/661-app_name-query-over-rest
Fixed #661: wrap app_name query in xdmp:eval to provide appropriate context
2 parents 1326241 + f156aaa commit 974b022

File tree

1 file changed

+71
-9
lines changed

1 file changed

+71
-9
lines changed

deploy/lib/server_config.rb

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2412,8 +2412,10 @@ def execute_query_5(query, properties = {})
24122412
# 4. Any database
24132413
if properties[:db_name] != nil
24142414
db_id = get_db_id(properties[:db_name])
2415+
logger.warn "WARN: No Database with name #{properties[:db_name]} found" if db_id.nil?
24152416
elsif properties[:app_name] != nil
24162417
sid = get_sid(properties[:app_name])
2418+
logger.warn "WARN: No App-Server with name #{properties[:app_name]} found" if sid.nil?
24172419
else
24182420
sid = get_sid("Manage")
24192421
end
@@ -2454,8 +2456,10 @@ def execute_query_7(query, properties = {})
24542456
# 4. Any database
24552457
if properties[:db_name] != nil
24562458
db_id = get_db_id(properties[:db_name])
2459+
logger.warn "WARN: No Database with name #{properties[:db_name]} found" if db_id.nil?
24572460
elsif properties[:app_name] != nil
24582461
sid = get_sid(properties[:app_name])
2462+
logger.warn "WARN: No App-Server with name #{properties[:app_name]} found" if sid.nil?
24592463
else
24602464
sid = get_sid("Manage")
24612465
end
@@ -2487,22 +2491,80 @@ def execute_query_7(query, properties = {})
24872491
end
24882492

24892493
def execute_query_8(query, properties = {})
2490-
if properties[:app_name] != nil
2491-
raise ExitException.new("Executing queries with an app_name (currently) not supported with ML8+")
2494+
# check input like in older versions
2495+
if properties[:db_name] != nil
2496+
db_id = get_db_id(properties[:db_name])
2497+
raise ExitException.new("No Database with name #{properties[:db_name]} found") if db_id.nil?
2498+
elsif properties[:app_name] != nil
2499+
sid = get_sid(properties[:app_name])
2500+
raise ExitException.new("No Server with name #{properties[:app_name]} found") if sid.nil?
24922501
end
24932502

24942503
headers = {
24952504
"Content-Type" => "application/x-www-form-urlencoded"
24962505
}
2506+
params = {}
24972507

2498-
params = {
2499-
:xquery => query,
2500-
:locale => LOCALE,
2501-
:tzoffset => "-18000"
2502-
}
2508+
# If app_name is specified, wrap the eval in an xdmp:eval to create an eval context
2509+
# that matches that of the selected app-server
2510+
if properties[:app_name] != nil
2511+
params[:xquery] = %Q{
2512+
xquery version "1.0-ml";
25032513
2504-
if properties[:db_name] != nil
2505-
params[:database] = properties[:db_name]
2514+
(: derived from qconsole-amped.xqy :)
2515+
declare function local:eval-options(
2516+
$server-id as xs:unsignedLong
2517+
) as element()
2518+
{
2519+
let $database-id := xdmp:server-database($server-id)
2520+
let $collation := xdmp:server-collation($server-id)
2521+
let $modules-id := xdmp:server-modules-database($server-id)
2522+
let $xquery-version := xdmp:server-default-xquery-version($server-id)
2523+
let $modules-root := xdmp:server-root($server-id)
2524+
let $default-coordinate-system :=
2525+
(: xdmp:server-coordinate-system not supported in ML8 and older :)
2526+
for $f in fn:function-lookup(xs:QName("xdmp:server-coordinate-system"), 1)
2527+
return $f($server-id)
2528+
return
2529+
<options xmlns="xdmp:eval">{
2530+
if ($database-id eq xdmp:database()) then ()
2531+
else element database { $database-id },
2532+
2533+
if ($modules-id eq xdmp:modules-database()) then ()
2534+
else element modules { $modules-id },
2535+
2536+
if ($collation eq default-collation()) then ()
2537+
else element default-collation { $collation },
2538+
2539+
if (empty($default-coordinate-system)) then ()
2540+
else element default-coordinate-system { $default-coordinate-system },
2541+
2542+
if ($xquery-version eq xdmp:xquery-version()) then ()
2543+
else element default-xquery-version { $xquery-version },
2544+
2545+
(: we should always have a root path, but better safe than sorry :)
2546+
if (empty($modules-root) or $modules-root eq xdmp:modules-root()) then ()
2547+
else element root { $modules-root },
2548+
2549+
element isolation { "different-transaction" }
2550+
}</options>
2551+
};
2552+
2553+
let $query := <query><![CDATA[#{query}]]></query>
2554+
return xdmp:eval(
2555+
string($query),
2556+
(),
2557+
local:eval-options(xdmp:server("#{properties[:app_name]}"))
2558+
)
2559+
}
2560+
else
2561+
# No app_name, just run the straight query
2562+
params[:xquery] = query
2563+
2564+
# Pass through selected database if specified, otherwise run against App-Services
2565+
if properties[:db_name] != nil
2566+
params[:database] = properties[:db_name]
2567+
end
25062568
end
25072569

25082570
r = go "#{@protocol}://#{@hostname}:#{@qconsole_port}/v1/eval", "post", headers, params

0 commit comments

Comments
 (0)