XQuery/Using Triggers to Log Events

      Motivation

      You want to log all changes in files of a single collection.

      ↑Jump back a section

      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
      ↑Jump back a section

      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.

      ↑Jump back a section

      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
      
      ↑Jump back a section
      Last modified on 26 June 2012, at 12:19