跳转到内容

XQuery/使用触发器记录事件

来自 Wikibooks,开放的书籍,开放的世界

您希望记录单个集合中所有文件的更改。

我们将创建一个触发器来记录这些事件。触发器将一个字符串追加到日志文件中。

有六种触发器事件类型

  • store: 当在集合或子集合中创建文档时触发
  • update: 当在集合或子集合中更新文档时触发
  • remove: 当从集合或子集合中删除文档时触发
  • create: 当创建子集合时触发
  • rename: 当重命名子集合时触发
  • delete: 当删除子集合时触发

示例代码

[编辑 | 编辑源代码]

注意:这些示例在 eXist 1.4 上不可靠!我还没有在 2.0 上测试过。

在这个例子中,我们将记录集合 /db/my-collection 中的所有 store、update 和 remove 事件。

这是一个示例触发器配置文件。此文件放置在 /db/system/config 目录下,并添加了要监控的相同 db 路径。

  /db/system/config/db/my-collection

以下是触发器文件的样子

collection.xconf

<collection xmlns="http://exist-db.org/collection-config/1.0">
  <triggers>
    <trigger event="store, update, remove, create, rename, delete"
            class="org.exist.collections.triggers.XQueryTrigger">
       <parameter name="url"
           value="xmldb:exist://127.0.0.1/db/triggers/log-changes.xq"/>
       <parameter name="test" value="test-value"/>
    </trigger>
  </triggers>
</collection>

注意,三个触发器操作(store、update、remove)列在 event 属性中,并用逗号分隔。当这些操作被触发时,XQuery /db/triggers/log-changes.xq 将被运行。您可以使用 parameter 元素将参数传递给此查询。

XQuery 日志记录器

[编辑 | 编辑源代码]
xquery version "1.0";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace response="http://exist-db.org/xquery/response";
declare namespace session="http://exist-db.org/xquery/session";
declare namespace xdb="http://exist-db.org/xquery/xmldb";
declare namespace util="http://exist-db.org/xquery/util";

declare variable $local:triggerEvent external;
declare variable $local:eventType external;
declare variable $local:collectionName external;
declare variable $local:documentName external;
declare variable $local:document external;
declare variable $local:test external;
declare variable $local:triggersLogFile := "triggersLog.xml";

(: create the log file if it does not exist :)
if(not(doc-available($local:triggersLogFile)))
   then ( xmldb:store("/db", $local:triggersLogFile, <events/>) ) 
   else(),

update
   insert
      <event ts="{ current-dateTime() }"
        event="{$local:triggerEvent}"
        eventType="{$local:eventType}"
        test-1="{$local:test}"
        collectionName="{$local:collectionName}"
        documentName="{$local:documentName}" >
        {$local:document}
      </event>
    into doc(concat("/db/", $local:triggersLogFile))/events

参考资料

[编辑 | 编辑源代码]

配置 eXist 触发器的指南

华夏公益教科书