Chris,

Nice find!

I was able to adapt this into a quick example that I hope everyone will find 
useful.

First, run this in query console. It will insert a "trace.xqy" module I made 
based off of reflection.xqy and a module to test it called "foo.xqy":


xquery version "1.0-ml";

xdmp:document-insert("/foo.xqy", document{'module namespace foo = 
"http://marklogic.com/foo";;

import module namespace trace = "http://marklogic.com/trace"; at "/trace.xqy";

declare function foo:foo()
{
  try
  {
    fn:error(xs:QName("boom"), "")
  }
  catch($e)
  {
    trace:getTrace()
  }
};'}),

xdmp:document-insert("/trace.xqy", document{'

(:
Copyright 2012-2015 MarkLogic Corporation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
   http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
:)

module namespace trace = "http://marklogic.com/trace";; declare function 
trace:getTrace()
as map:map
{

let $trace := map:map()

let $PREVIOUS_LINE_FILE :=
  try {
   fn:error(xs:QName("boom"), "")
  }
  catch($ex) {
    map:put($trace, "previous_line_file", 
fn:concat($ex/error:stack/error:frame[3]/error:uri, " : Line ", 
$ex/error:stack/error:frame[3]/error:line))
  }

let $__LINE__ :=
  try {
   fn:error(xs:QName("boom"), "")
  }
  catch($ex) {
    map:put($trace, "line", $ex/error:stack/error:frame[2]/error:line)
  }

let $__FILE__ :=
  try {
   fn:error(xs:QName("boom"), "")
  }
  catch($ex) {
    map:put($trace, "file", ($ex/error:stack/error:frame[2]/error:uri, "no 
file")[1])
  }

let $__CALLER_FILE__ :=
  try {
   fn:error(xs:QName("boom"), "")
  }
  catch($ex) {
    map:put($trace, "caller_file", ($ex/error:stack/error:frame[3]/error:uri, 
"no file")[1])
  }

return $trace
};'});


Next, run this in query console to test it:

xquery version "1.0-ml";

import module namespace foo = "http://marklogic.com/foo"; at "/foo.xqy";

foo:foo()


It will return this output:

map <http://localhost:8000/qconsole/#>
<map:map xmlns:map="http://marklogic.com/xdmp/map"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xs="http://www.w3.org/2001/XMLSchema";>
<map:entry key="caller_file">
<map:value xsi:type="xs:string">
no file
</map:value>
</map:entry>
<map:entry key="line">
<map:value>
<error:line xmlns:error="http://marklogic.com/xdmp/error";>
13
</error:line>
</map:value>
</map:entry>
<map:entry key="file">
<map:value>
<error:uri xmlns:error="http://marklogic.com/xdmp/error";>
/foo.xqy
</error:uri>
</map:value>
</map:entry>
<map:entry key="previous_line_file">
<map:value xsi:type="xs:string">
: Line 5
</map:value>
</map:entry>
</map:map>


In practice, in your code, after importing the trace module, you could do 
something like this:

let $trace :=
try
  {
    fn:error(xs:QName("boom"), "")
  }
  catch($e)
  {
    trace:getTrace()
  }

And then you'd have a map stored in $trace with information about exactly where 
you are in your code.

Best,
Rob

Rob Szkutak
Associate Consultant
MarkLogic Corporation
[email protected]
Cell +1.716.562.8464
www.marklogic.com<http://www.marklogic.com>

________________________________
From: [email protected] 
[[email protected]] on behalf of Chris Grimes 
[[email protected]]
Sent: Wednesday, December 30, 2015 7:07 PM
To: MarkLogic Developer Discussion
Subject: Re: [MarkLogic Dev General] API to get the executing function name and 
the xquery file

I have not used this code directly but it looks like it may be what you're 
after:

https://github.com/marklogic/roxy/blob/master/src/roxy/lib/reflection.xqy

Sent from Outlook Mobile<https://aka.ms/qtex0l>




On Wed, Dec 30, 2015 at 9:22 AM -0800, "Will Thompson" 
<[email protected]<mailto:[email protected]>> wrote:

None that I am aware of. I have seen this done, however, by throwing an 
exception in a try block, and using the catch block inspect the error XML to 
determine contextual information.

try {
  error((), 'BOGUS-ERROR')
} catch ($e)
{
  ** get context from $e **
}

-Will

> On Dec 30, 2015, at 1:30 AM, Tyagi, Devesh <[email protected]> wrote:
>
> Hi,
>
> Is there an API in Marklogic 7 which can give me the context which is 
> executing. For example if I have a module "sample.xqy" and a function 
> "sample:foo()" in it, I want the API to give me at least "sample:foo()".
>
> Regards,
> Devesh
> "This e-mail and any attachments transmitted with it are for the sole use of 
> the intended recipient(s) and may contain confidential , proprietary or 
> privileged information. If you are not the intended recipient, please contact 
> the sender by reply e-mail and destroy all copies of the original message. 
> Any unauthorized review, use, disclosure, dissemination, forwarding, printing 
> or copying of this e-mail or any action taken in reliance on this e-mail is 
> strictly prohibited and may be unlawful." 
> _______________________________________________
> General mailing list
> [email protected]
> Manage your subscription at:
> http://developer.marklogic.com/mailman/listinfo/general

_______________________________________________
General mailing list
[email protected]
Manage your subscription at:
http://developer.marklogic.com/mailman/listinfo/general
_______________________________________________
General mailing list
[email protected]
Manage your subscription at: 
http://developer.marklogic.com/mailman/listinfo/general

Reply via email to