Jan 17, 2012

To Oracle XML DB repository (μέρος 3ο)

Στα προηγούμενα δυο άρθρα δημιουργήσαμε δυο χρήστες, με σαφώς καθορισμένα δικαιώματα, που πρόκειται να προσθέτουν περιεχόμενο σε έναν δεδομένο κατάλογο. Η δημιουργία περιεχομένου είναι κάτι που μας ενδιαφέρει πολύ, καθώς μπορεί να εκκινεί διαδικασίες περαιτέρω επεξεργασίας των άρτι αφιχθέντων εγγράφων. Το XML DB παρέχει τη δυνατότητα διαχείρισης των γεγονότων (events) που συμβαίνουν στο repository, όπως η δημιουργία, η μεταβολή ή η διαγραφή στοιχείων (περισσότερες πληροφορίες εδώ) Δεν έχουμε παρά να γράψουμε ένα PL/SQL package που θα διαχειρίζεται τα συμβάντα του ενδιαφέροντος μας. Για παράδειγμα το specification ενός τέτοιου PL/SQL package, που θα ανήκει στον υπερδιαχειριστή του XML DB (λογαριασμός xmlrepos1 που δημιουργήσαμε νωρίτερα):

create or replace package xml_event_pkg as
/**
* Handle the event of adding new content into the repository.
*/
PROCEDURE handlePostLinkTo (eventObject DBMS_XEVENT.XDBRepositoryEvent);
/**
* Handle the event of updating content on the repository.
*/
PROCEDURE handlePreUpdate (eventObject DBMS_XEVENT.XDBRepositoryEvent);
/**
* Handle the event of removing content from the repository.
*/
PROCEDURE handlePreDelete (eventObject DBMS_XEVENT.XDBRepositoryEvent);
end xml_event_pkg;

με μια ενδεικτική υλοποίηση:

PROCEDURE handlePostLinkTo (eventObject DBMS_XEVENT.XDBRepositoryEvent) as
XDBPathobj DBMS_XEVENT.XDBPath;
ResPath VARCHAR2(1000);
XDBResourceObj DBMS_XDBRESOURCE.XDBResource;
ResDisplayName VARCHAR2(100);
BEGIN
XDBResourceObj := DBMS_XEVENT.getResource(eventObject);
XDBPathobj := DBMS_XEVENT.getPath(eventObject);
ResDisplayName := DBMS_XDBRESOURCE.getDisplayName(XDBResourceObj);
ResPath := DBMS_XEVENT.getName(XDBPathObj);
...
το πακέτο DBMS_XDB παρέχει διάφορες συναρτήσεις και διαδικασίες που μπορούμε να αξιοποιήσουμε για το περιεχόμενο μας, να το λάβουμε σε μορφή BLOB, CLOB, XML, να διαβάσουμε metadata του, κτλ. Προκειμένου να ενεργοποιήσουμε σε έναν δεδομένο κατάλογο τον event listener που μόλις φτιάξαμε, κατασκευάζουμε ένα XML έγγραφο παραμετροποίησης και εκτελούμε τον εξής κώδικα:

DECLARE
b BOOLEAN := FALSE;
BEGIN
b:= DBMS_XDB.createFolder('/public/resconfig');
COMMIT;

b := DBMS_XDB.createResource(
'/public/resconfig/appfilelistener-uploadFolder.xml',
'<ResConfig xmlns="http://xmlns.oracle.com/xdb/XDBResConfig.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/xdb/XDBResConfig.xsd
http://xmlns.oracle.com/xdb/XDBResConfig.xsd">
<event-listeners set-invoker="false">
<listener>
<description>File listener</description>
<schema>XMLREPOS1</schema>
<source>XML_EVENT_USER_EVT_PKG</source>
<language>PL/SQL</language>
<events>
<Post-LinkTo/>
<Pre-Update/>
<Pre-Delete />
</events>
</listener>
</event-listeners>
<defaultChildConfig>
<configuration>
<path>/public/resconfig/appfilelistener-uploadFolder.xml</path>
</configuration>
</defaultChildConfig>
</ResConfig>',
'http://xmlns.oracle.com/xdb/XDBResConfig.xsd',
'ResConfig');
DBMS_RESCONFIG.appendResConfig('/uploadFolder',
'/public/resconfig/appfilelistener-uploadFolder.xml',
DBMS_RESCONFIG.APPEND_RECURSIVE);
commit;
END;

Έχουμε σχεδόν τελειώσει με την παραμετροποίηση του DB repository μας. Ας ανοίξουμε τα κανάλια διάθεσης περιεχομένου στους τελικούς μας χρήστες, ενεργοποιώντας τους FTP και WebDAV listeners της βάσης:
begin
DBMS_XDB.setFTPPort(2100);
DBMS_XDB.setHTTPPort(8080);
end;

Τώρα οι χρήστες μας είναι σε θέση να προσθέσουν περιεχόμενο, να διαχειριστούν φακέλους και αρχεία, όπως σε ένα τυπικό σύστημα αρχείων. Στο επόμενο άρθρο θα εστιάσουμε στις ευκολίες προγραμματισμού και στο περιβάλλον διαχείρισης του XML DB.

No comments: