XQuery/使用触发器记录事件
外观
< XQuery
您希望记录单个集合中所有文件的更改。
我们将创建一个触发器来记录这些事件。触发器将一个字符串追加到日志文件中。
有六种触发器事件类型
- 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 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