在MarkLogic 8中使用来自其他端点的依赖关系调用xquery库

时间:2015-08-13 14:49:30

标签: rest xquery marklogic

我们正在从MarkLogic 6升级到8,并且在调用库模块时遇到了一些问题。我们有xquery库模块,它们都来自自定义REST扩展和非REST xquery。

MarkLogic的documentation表示REST端点可以使用安装了新/ ext端点的库或以旧方式安装的库(放置在模块数据库中的其他位置)。但是,当库模块使用MarkLogic附带的functx软件包时,我无法使交叉工作。

假设我有两个相同的库模块,一个通过/ext安装,另一个不安装:

xquery version "1.0-ml";
module namespace test = "test/lib";
import module namespace functx = "http://www.functx.com" at "/MarkLogic/functx/functx-1.0-nodoc-2007-01.xqy";
declare function test:stuff() { 
    <foo/>
};

第一个是使用此命令安装的,如果重要:

curl --anyauth --user user:pwd -X PUT -i -d @".\\module\\testlib-ext.xqy" -H "Content-type: application/xquery" "http://host:8020/v1/ext/test/testlib-ext.xqy?perm:rest-reader=execute"

我有使用每个模块的休息端点(唯一的区别是命名空间和导入):

xquery version "1.0-ml";
module namespace te = "http://marklogic.com/rest-api/resource/test-ext-to-ext";
import module namespace test = "test/lib" at "/ext/test/testlib-ext.xqy";
declare function te:get($context as map:map, $params as map:map) as document-node()* {
    document { test:stuff() }
};

使用使用/ext安装的库的工作正常。使用简单放置在模块数据库中的模块的那个安装没有错误但是在非管理员用户调用时给出了一个错误(它在管理员调用时有效):

RESTAPI-INVALIDREQ: (err:FOER0000) Invalid request:  reason: Extension test-ext-to-lib does not exist.

我只是使用/ext安装它们,但随后使用xdmp:invoke的xquery中断。这是一个不同的错误,但它似乎是相同的潜在问题。使用放置在modules数据库中的库调用模块可以正常工作。使用通过/ext安装的库调用模块失败,并显示以下错误:

XDMP-MODNOTFOUND: (err:XQST0059) xdmp:invoke("/test/test-module-to-ext.xqy", (), ()) -- Module C:\Program Files\MarkLogic\Modules\MarkLogic\functx\functx-1.0-nodoc-2007-01.xqy not found

如果我将admin角色添加到主叫用户,则所有这些角色都有效。如果我将functx导出,他们也可以在没有管理员角色的情况下工作。

它看起来像是权限问题,但我找不到可以修复它的角色或权限。除管理员本身选中之外,用户在每个复选框中都有一个角色检查最后一个复选框是我发现的唯一能使它工作的东西,这显然不是一个可行的解决方案。

我们并不关心库的安装方式,但我们不想重复代码。我们如何使这些导入适用于REST和非REST xquery?

1 个答案:

答案 0 :(得分:2)

要使权限起作用,依赖关系链中的主模块和每个库必须至少由分配给用户的一个角色(其中赋值包括继承和放大)执行。

REST API在rest-extension-user下安装的模块上设置/ext角色。

因此,具有rest-extension-user角色的用户应该能够在/ext下调用REST API安装的模块。

更一般地说,rest-extension-user角色可执行的任何模块(无论它是如何安装的)都应该能够依赖/ext下的REST API安装的库(假设,当然,所有路径都是正确的。)