@@ -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