OrientDB - Ganci
OrientDB Hooksnon sono altro che trigger nella terminologia del database che abilitano eventi interni prima e dopo ogni operazione CRUD nelle applicazioni utente. È possibile utilizzare hook per scrivere regole di convalida personalizzate, per applicare la sicurezza o per organizzare eventi esterni come la replica su un DBMS relazionale.
OrientDB supporta due tipi di hook:
Dynamic Hook - Trigger, che possono essere costruiti a livello di classe e / o di documento.
Java (Native) Hook - Trigger, che possono essere creati utilizzando classi Java.
Ganci dinamici
Gli hook dinamici sono più flessibili degli hook Java, perché possono essere modificati in fase di runtime e possono essere eseguiti per documento se necessario, ma sono più lenti degli hook Java.
Per eseguire hook sui tuoi documenti, prima consenti alle tue classi di estendersi OTriggeredclasse base. Successivamente, definire una proprietà personalizzata per l'evento interessato. Di seguito sono riportati gli eventi disponibili.
onBeforeCreate - Chiamato before creazione di un nuovo documento.
onAfterCreate - Chiamato after creazione di un nuovo documento.
onBeforeRead - Chiamato before leggere un documento.
onAfterRead - Chiamato after leggere un documento.
onBeforeUpdate - Chiamato before aggiornare un documento.
onAfterUpdate - Chiamato after aggiornare un documento.
onBeforeDelete - Chiamato before l'eliminazione di un documento.
onAfterDelete - Chiamato after l'eliminazione di un documento.
Gli hook dinamici possono chiamare -
Funzioni, scritte in SQL, Javascript o qualsiasi linguaggio supportato da OrientDB e JVM.
Metodi statici Java.
Ganci a livello di classe
Gli hook a livello di classe sono definiti per tutti i documenti relativi a una classe. Di seguito è riportato un esempio per impostare un hook che agisce a livello di classe contro i documenti Invoice.
CREATE CLASS Invoice EXTENDS OTriggered
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated
Creiamo la funzione invoiceCreated in Javascript che stampa nella console del server il numero della fattura creata.
CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));"
LANGUAGE Javascript
Ora prova il gancio creando un nuovo file Invoice documento.
INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}
Se questo comando viene eseguito correttamente, otterrai il seguente output.
Invoice created: 100
Gancio a livello di documento
È possibile definire un'azione speciale solo su uno o più documenti. Per fare ciò, consenti alla tua classe di estendersiOTriggered classe.
Ad esempio, eseguiamo un trigger, come funzione Javascript, contro una classe Profile esistente, per tutti i documenti con account di proprietà = 'Premium'. Il trigger verrà chiamato per impedire l'eliminazione dei documenti.
ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'
Creiamo il file preventDeletion() Funzione Javascript.
CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot
delete Premium profile ' + doc)" LANGUAGE Javascript
E poi prova l'hook provando a eliminare un account "Premium".
DELETE FROM #12:1
java.lang.RuntimeException: Cannot delete Premium profile
profile#12:1{onBeforeDelete:preventDeletion,account:Premium,name:Jill} v-1
(<Unknown source>#2) in <Unknown source> at line number 2
Ganci JAVA
Un caso d'uso comune per OrientDB Hooks (trigger) è quello di gestire le date create e aggiornate per una o tutte le classi. Ad esempio, puoi impostare un fileCreatedDate ogni volta che viene creato un record e impostare un UpdatedDate ogni volta che un record viene aggiornato e farlo in un modo in cui si implementa la logica una volta a livello del database e non ci si deve più preoccupare di essa a livello dell'applicazione.
Prima di creare, dovrai scaricare orientdb-core.jarfile visitando il seguente link scarica OrientDB core . E successivamente copia quel file jar nella cartella in cui desideri archiviare il file sorgente Java.
Crea file hook
Crea un file Java denominato HookTest.java, che testerà il meccanismo Hook utilizzando il linguaggio Java.
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.orientechnologies.orient.core.hook.ODocumentHookAbstract;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHookAbstract;
import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;
public class HookTest extends ODocumentHookAbstract implements ORecordHook {
public HookTest() {
}
@Override
public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
return DISTRIBUTED_EXECUTION_MODE.BOTH;
}
public RESULT onRecordBeforeCreate( ODocument iDocument ) {
System.out.println("Ran create hook");
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
public RESULT onRecordBeforeUpdate( ODocument iDocument ) {
System.out.println("Ran update hook");
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
}
Il codice di esempio precedente stampa il commento appropriato ogni volta che si crea o si aggiorna un record di quella classe.
Aggiungiamo un altro file hook setCreatedUpdatedDates.java come segue -
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.orientechnologies.orient.core.hook.ODocumentHookAbstract;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHookAbstract;
import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;
public class setCreatedUpdatedDates extends ODocumentHookAbstract implements ORecordHook {
public setCreatedUpdatedDates() {
}
@Override
public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
return DISTRIBUTED_EXECUTION_MODE.BOTH;
}
public RESULT onRecordBeforeCreate( ODocument iDocument ) {
if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) {
iDocument.field("CreatedDate", System.currentTimeMillis() / 1000l);
iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l);
return ORecordHook.RESULT.RECORD_CHANGED;
} else {
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
}
public RESULT onRecordBeforeUpdate( ODocument iDocument ) {
if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) {
iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l);
return ORecordHook.RESULT.RECORD_CHANGED;
} else {
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
}
}
Quello che fa il codice sopra è cercare qualsiasi classe che inizi con le lettere 'r' o 't'e imposta CreatedDate e UpdatedDate quando il record viene creato e imposta solo UpdatedDate ogni volta che il record viene aggiornato.
Compila Java Hooks
Compilare il codice Java utilizzando il seguente comando. Note: Mantieni il file jar scaricato e questi file Java nella stessa cartella.
$ jar cf hooks-1.0-SNAPSHOT.jar *.java
Spostare il codice compilato dove il server OrientDB può trovarlo
È necessario copiare il file .jar finito nella directory in cui il server OrientDB li cercherà. Ciò significa che il './lib'nella directory principale del server OrientDB sarà simile a questa:
$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"
Abilita Test Hook nel file di configurazione del server OrientDB
modificare $ORIENTDB_HOME/config/orientdb-server-config.xml e aggiungi la seguente sezione verso la fine del file.
<hooks>
<hook class = "HookTest" position = "REGULAR"/>
</hooks>
...
</orient-server>
Riavvia OrientDB Server
Dopo aver riavviato OrientDB Server, l'hook in cui hai definito orientdb-server-config.xmlè ora attivo. Avvia una console OrientDB, collegala al tuo database ed esegui il seguente comando:
INSERT INTO V SET ID = 1;
Se questo comando viene eseguito correttamente, otterrai il seguente output.
Ran create hook
Ora esegui il seguente comando:
UPDATE V SET ID = 2 WHERE ID = 1;
Se questo comando viene eseguito correttamente, otterrai il seguente output.
Ran update hook
Abilita Real Hook nel file di configurazione del server OrientDB
modificare $ORIENTDB_HOME/config/orientdb-server-config.xml e cambiare la sezione dei ganci come segue:
<hooks>
<hook class="setCreatedUpdatedDates" position="REGULAR"/>
</hooks>
...
</orient-server>
Riavvia OrientDB Server
Crea una nuova classe che inizi con la lettera 'r' o 't'-
CREATE CLASS tTest EXTENDS V;
Ora inserisci un record -
INSERT INTO tTest SET ID = 1
SELECT FROM tTest
Se questo comando viene eseguito correttamente, otterrai il seguente output.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |1 |1427597275 |1427597275
----+-----+------+----+-----------+-----------
Anche se non hai specificato valori da impostare CreatedDate e UpdatedDate, OrientDB ha impostato questi campi automaticamente per te.
Successivamente è necessario aggiornare il record utilizzando il seguente comando:
UPDATE tTest SET ID = 2 WHERE ID = 1;
SELECT FROM tTest;
Se questo comando viene eseguito correttamente, otterrai il seguente output.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |2 |1427597275 |1427597306
----+-----+------+----+-----------+-----------
Puoi vedere che OrientDB ha cambiato il file UpdatedDate ma ha lasciato il CreatedDate rimane invariato.
OrientDB Java Hooks può essere uno strumento estremamente prezioso per aiutare ad automatizzare il lavoro che altrimenti dovreste fare nel codice dell'applicazione. Poiché molti amministratori di database non sono sempre esperti di Java, si spera che le informazioni contenute in questo tutorial ti daranno un vantaggio e ti faranno sentire a tuo agio con la tecnologia, consentendoti di creare con successo trigger di database in caso di necessità.