跳轉到內容

XQuery/使用觸發器分配識別符號

來自華夏公益教科書,開放的書籍,開放的世界

您希望自動地為所有新傳入的文件或 XML 節點分配唯一的識別符號:無論它們是由您編寫的控制器建立的,還是由 REST 呼叫中的 HTTP PUT 操作產生的,還是由 webdav COPY 操作產生的,還是從 java 管理 RPC 客戶端上傳的。

我們將建立一個觸發器,它將在所有文件儲存操作上觸發。觸發器將修改要儲存在資料庫中的文件。我們的識別符號將從 util:uuid() 函式的輸出中獲取。一個簡單的賦值將盡職盡責。不需要特殊的許可權,例如增量計數器。

系統配置

[編輯 | 編輯原始碼]

此示例假設您要使用識別符號標記的文件位於 /db/my-collection 下。eXist 觸發器在 /db/system/config 區域中的配置檔案中宣告,上面路徑新增到它。包含相關行的檔案將如下所示

/db/system/config/db/my-collection/collection.xconf

<collection xmlns="http://exist-db.org/collection-config/1.0">
  <triggers>
    <trigger event="store" class="org.exist.collections.triggers.XQueryTrigger">
       <parameter name="url" value="xmldb:exist:///db/triggers/assign-id.xq"/>
    </trigger>
  </triggers>
</collection>

現在,每次對該集合發生儲存或更新事件時,XQuery 指令碼 /db/triggers/assign-id.xq 都會執行。

注意!由於當前(<=1.5dev)設計的限制,您不能將多個 xquery 指令碼附加到同一個觸發器事件。對於一個事件,最後宣告的觸發器將被使用。

XQuery 指令碼

[編輯 | 編輯原始碼]

該指令碼將 uuid 作為屬性新增到傳入文件的 元素,覆蓋任何已存在的 uuid 屬性。

注意:這些示例不能可靠地工作:一旦您的 xquery 在它執行的執行緒中導致異常,那麼它就會無限期地掛起,例如,如果您在它工作的路徑下儲存二進位制資源。然後,對已處理資源的進一步操作將不會觸發指令碼,直到整個資料庫重新啟動。

xquery version "1.0";

(:
  An XQueryTrigger that
  adds a uuid to all documents
  when they are stored in the database.
:)

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:coll := "/db/my-collection";
declare variable $local:uuid := string($local:document/@uuid);
declare variable $local:match := collection($local:coll)/*[@uuid = $local:uuid];

(:
  This is still the xquery prolog:
  from my experiments, an xquery trigger MUST NOT hava an xquery body.
  A severe limit: no conditionals allowed, just straight procedural action.
:)

util:log('debug', '### assign-id.xq trigger fired ###'),

update insert attribute {'uuid'} {util:uuid()} into doc($local:documentName)/*,

util:log('debug', '### assign-id.xq trigger done ###')

參考資料

[編輯 | 編輯原始碼]

配置 eXist 觸發器的指南

華夏公益教科書