Skip to main content

  | मौसम…

411 समाचार
Public archive edition · Attributed source reporting with original dates · AI drafts are excluded

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