OrientDB - Crochets
OrientDB Hooksne sont que des déclencheurs dans la terminologie de la base de données qui activent des événements internes avant et après chaque opération CRUD dans les applications utilisateur. Vous pouvez utiliser des hooks pour écrire des règles de validation personnalisées, pour appliquer la sécurité ou pour organiser des événements externes tels que la réplication sur un SGBD relationnel.
OrientDB prend en charge deux types de crochets -
Dynamic Hook - Déclencheurs, qui peuvent être construits au niveau de la classe et / ou au niveau du document.
Java (Native) Hook - Déclencheurs, qui peuvent être construits à l'aide de classes Java.
Crochets dynamiques
Les hooks dynamiques sont plus flexibles que les hooks Java, car ils peuvent être modifiés à l'exécution et peuvent s'exécuter par document si nécessaire, mais sont plus lents que les hooks Java.
Pour exécuter des hooks sur vos documents, autorisez d'abord vos classes à s'étendre OTriggeredclasse de base. Plus tard, définissez une propriété personnalisée pour l'événement intéressé. Voici les événements disponibles.
onBeforeCreate - Appelé before créer un nouveau document.
onAfterCreate - Appelé after créer un nouveau document.
onBeforeRead - Appelé before lire un document.
onAfterRead - Appelé after lire un document.
onBeforeUpdate - Appelé before mettre à jour un document.
onAfterUpdate - Appelé after mettre à jour un document.
onBeforeDelete - Appelé before supprimer un document.
onAfterDelete - Appelé after supprimer un document.
Les Hooks dynamiques peuvent appeler -
Fonctions, écrites en SQL, Javascript ou tout autre langage pris en charge par OrientDB et JVM.
Méthodes statiques Java.
Crochets de niveau de classe
Les hooks de niveau classe sont définis pour tous les documents liés à une classe. Voici un exemple de configuration d'un hook qui agit au niveau de la classe sur les documents de facturation.
CREATE CLASS Invoice EXTENDS OTriggered
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated
Créons la fonction invoiceCreated en Javascript qui imprime dans la console du serveur le numéro de facture créé.
CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));"
LANGUAGE Javascript
Maintenant, essayez le crochet en créant un nouveau Invoice document.
INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}
Si cette commande est exécutée avec succès, vous obtiendrez la sortie suivante.
Invoice created: 100
Crochet au niveau du document
Vous ne pouvez définir une action spéciale que sur un ou plusieurs documents. Pour ce faire, autorisez votre classe à s'étendreOTriggered classe.
Par exemple, exécutons un trigger, en tant que fonction Javascript, sur une classe Profile existante, pour tous les documents avec la propriété account = 'Premium'. Le déclencheur sera appelé pour empêcher la suppression de documents.
ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'
Créons le preventDeletion() Fonction Javascript.
CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot
delete Premium profile ' + doc)" LANGUAGE Javascript
Et puis testez le hook en essayant de supprimer un compte «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
Crochets JAVA
Un cas d'utilisation courant des Hooks OrientDB (déclencheurs) est de gérer les dates de création et de mise à jour pour une ou toutes les classes. Par exemple, vous pouvez définir unCreatedDate champ chaque fois qu'un enregistrement est créé et définir un UpdatedDate chaque fois qu'un enregistrement est mis à jour, et faites-le de manière à implémenter la logique une fois au niveau de la couche de base de données et à ne plus jamais avoir à vous en soucier au niveau de la couche application.
Avant de créer, vous devrez télécharger orientdb-core.jarfichier en visitant le lien suivant télécharger OrientDB core . Et plus tard, copiez ce fichier jar dans le dossier où vous souhaitez stocker le fichier source Java.
Créer un fichier Hook
Créez un fichier Java nommé HookTest.java, qui testera le mécanisme Hook en utilisant le langage 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;
}
}
L'exemple de code ci-dessus imprime le commentaire approprié chaque fois que vous créez ou mettez à jour un enregistrement de cette classe.
Ajoutons un autre fichier hook setCreatedUpdatedDates.java comme suit -
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;
}
}
}
Ce que le code ci-dessus fait est de rechercher toute classe commençant par les lettres 'r' ou 't'et définit CreatedDate et UpdatedDate lorsque l'enregistrement est créé et définit uniquement UpdatedDate chaque fois que l'enregistrement est mis à jour.
Compiler Java Hooks
Compilez le code Java à l'aide de la commande suivante. Note: Conservez le fichier jar téléchargé et ces fichiers Java dans le même dossier.
$ jar cf hooks-1.0-SNAPSHOT.jar *.java
Déplacer le code compilé là où le serveur OrientDB peut le trouver
Vous devez copier le fichier .jar terminé dans le répertoire où votre serveur OrientDB les recherchera. Cela signifie le './libLe dossier sous votre répertoire racine du serveur OrientDB ressemblera à ceci -
$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"
Activer le crochet de test dans le fichier de configuration du serveur OrientDB
Éditer $ORIENTDB_HOME/config/orientdb-server-config.xml et ajoutez la section suivante vers la fin du fichier.
<hooks>
<hook class = "HookTest" position = "REGULAR"/>
</hooks>
...
</orient-server>
Redémarrez le serveur OrientDB
Une fois que vous redémarrez OrientDB Server, le hook que vous avez défini dans orientdb-server-config.xmlest maintenant actif. Lancez une console OrientDB, connectez-la à votre base de données et exécutez la commande suivante -
INSERT INTO V SET ID = 1;
Si cette commande est exécutée avec succès, vous obtiendrez la sortie suivante.
Ran create hook
Exécutez maintenant la commande suivante -
UPDATE V SET ID = 2 WHERE ID = 1;
Si cette commande est exécutée avec succès, vous obtiendrez la sortie suivante.
Ran update hook
Activer Real Hook dans le fichier de configuration du serveur OrientDB
Éditer $ORIENTDB_HOME/config/orientdb-server-config.xml et changez la section des crochets comme suit -
<hooks>
<hook class="setCreatedUpdatedDates" position="REGULAR"/>
</hooks>
...
</orient-server>
Redémarrez le serveur OrientDB
Créez une nouvelle classe commençant par la lettre 'r' ou 't'-
CREATE CLASS tTest EXTENDS V;
Maintenant, insérez un enregistrement -
INSERT INTO tTest SET ID = 1
SELECT FROM tTest
Si cette commande est exécutée avec succès, vous obtiendrez la sortie suivante.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |1 |1427597275 |1427597275
----+-----+------+----+-----------+-----------
Même si vous n'avez pas spécifié de valeurs à définir CreatedDate et UpdatedDate, OrientDB a défini ces champs automatiquement pour vous.
Ensuite, vous devez mettre à jour l'enregistrement à l'aide de la commande suivante -
UPDATE tTest SET ID = 2 WHERE ID = 1;
SELECT FROM tTest;
Si cette commande est exécutée avec succès, vous obtiendrez la sortie suivante.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |2 |1427597275 |1427597306
----+-----+------+----+-----------+-----------
Vous pouvez voir que OrientDB a changé le UpdatedDate mais a laissé le CreatedDate restent inchangés.
OrientDB Java Hooks peut être un outil extrêmement précieux pour aider à automatiser le travail que vous auriez autrement à faire dans le code d'application. Étant donné que de nombreux administrateurs de base de données ne sont pas toujours des experts Java, nous espérons que les informations contenues dans ce didacticiel vous donneront une longueur d'avance et vous permettront de vous sentir à l'aise avec la technologie, vous permettant de créer avec succès des déclencheurs de base de données en cas de besoin.