411 REFERENCE · Wikibooks
XQuery/Using Triggers to Log Events
Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.
Motivation
You want to log all changes in files of a single collection.
Method
We will create a trigger that logs these events. The trigger will append a string to a log file.
There are six trigger event types:
store: Fired when a document is created in the collection or sub-collection
update: Fired when a document is updated in the collection or sub-collection
remove: Fired when a document is deleted from the collection or sub-collection
create: Fired when a sub-collection is created
rename: Fired when a sub-collection is renamed
delete: Fired when a sub-collection is deleted
Sample Code
NOTE: These examples do not reliably work on eXist 1.4! I have not yet tested on 2.0.
In this example we will be logging all store, update and remove events from the collection /db/my-collection
Here is a sample trigger configuration file. This file is placed in the /db/system/config are with the same db path added to it that you want to monitor:
/db/system/config/db/my-collection
Here is what the trigger file looks like:
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://localhost/db/triggers/log-changes.xq"/>
<parameter name="test" value="test-value"/>
</trigger>
</triggers>
</collection>
Note that the three trigger operations (store, update, remove) are listed in the event attribute and separated by commas. When these operations are fired the XQuery /db/triggers/log-changes.xq gets run. You can pass parameters to this query using the parameter element.
XQuery logger
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
References
Guide to configuring eXist triggers