跳轉到內容

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:///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 觸發器的指南

華夏公益教科書