如何在数据源名称中使用replicaid时强制使用本地数据库?

时间:2013-06-29 03:01:30

标签: xpages xpinc

我有一个XPiNC本地复制(不在服务器上)应用程序,在自定义控件上有一个数据源,如下所示:

 <xp:dominoDocument var="document1"
                    formName="demo"
                    databaseName="#{javascript:getDemoData();}"
                    action="openDocument"
                    documentId="#{compositeData.unid}">
 </xp:dominoDocument>

在我的JavaScript中,我有以下功能:

    function getDemoData() {
         return "12345678:9ABEDEFF";
    }

返回包含我的数据的数据库的replicaID(在实际代码中,它不是硬编码的,而是从配置中读取,但这不是问题)。

据我所知(可能有问题),在提供此副本语法时,我无法指定服务器名称。事实证明这是一场机会游戏。有时数据库在服务器上打开,有时在客户端上打开。我认为这是基于desktop8.dsk和哪个复制图标堆叠在顶部(?)。

我的问题
如果本地副本可用,我如何确保首先打开本地副本?

澄清
本地计算机上的NotesDatabase.getFilePath()返回该文件的绝对文件路径(在服务器上它是相对的)。一旦你使用dirlink文件,绝对路径根本不像相对路径。 示例:C:\Notes\Datadevelopment.dir文件包含E:\customers\stuff,需要添加路径为development\shiny.nsf,但NotesDatabase.getFilePath将返回E:\customers\stuff\shiny。所以似乎(?)我必须阅读注册表以找到Notes.ini中的数据路径,然后检查它与文件路径,当没有匹配时,去钓鱼dir文件,直到我找到匹配。
向更好的想法开放: - )

2 个答案:

答案 0 :(得分:3)

我会将副本ID转换为 server !! path-to-nsf 格式。尝试使用db.openByReplicaID(“”,repID)获取本地数据库。如果失败,请尝试在服务器上打开数据库。

生成的对象构建 server !! path-to-nsf 字符串并使用此字符

答案 1 :(得分:3)

更新

根据session.getDbDirectory()更改了代码,以更好地解决基于Christian db.openByReplicaID()建议的问题。添加了测试@ClientType() != 'Web'

如果数据库存在于本地,此代码将查找数据库的本地副本并返回"!!filePath"。否则返回replicaId

<xp:this.databaseName><![CDATA[#{javascript:
    var replicaId = getDemoData();
    if (@ClientType() != 'Web') {
        var db = session.getDatabase(null, null);
        try {
            if (db.openByReplicaID("", replicaId)) {
                return "!!" + db.getFilePath();
            }
        } catch (err) {
        }
    }
    return replicaId
}]]></xp:this.databaseName>

此代码适用于XPiNC和浏览器,但它仅为XPiNC查找本地副本。代码可以在服务器上的本地数据库或数据库中运行。

相关问题