XQuery/使用觸發器分配識別符號
外觀
< 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 指令碼附加到同一個觸發器事件。對於一個事件,最後宣告的觸發器將被使用。
該指令碼將 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 ###')