OrientDB - Haczyki

OrientDB Hooksto nic innego jak wyzwalacze w terminologii bazy danych, które włączają zdarzenia wewnętrzne przed i po każdej operacji CRUD w aplikacjach użytkownika. Za pomocą punktów zaczepienia można pisać niestandardowe reguły walidacji, wymuszać bezpieczeństwo lub organizować zdarzenia zewnętrzne, takie jak replikacja względem relacyjnego systemu DBMS.

OrientDB obsługuje dwa rodzaje haków -

Dynamic Hook - Wyzwalacze, które można budować na poziomie klasy i / lub na poziomie dokumentu.

Java (Native) Hook - Wyzwalacze, które można zbudować za pomocą klas Java.

Dynamic Hooks

Dynamiczne podpięcia są bardziej elastyczne niż podpięcia Java, ponieważ można je zmieniać w czasie wykonywania i w razie potrzeby można je uruchamiać dla każdego dokumentu, ale są wolniejsze niż podpięcia Java.

Aby wykonać przechwyty na dokumentach, najpierw pozwól swoim klasom na rozszerzenie OTriggeredklasa bazowa. Później zdefiniuj właściwość niestandardową dla interesującego zdarzenia. Poniżej znajdują się dostępne wydarzenia.

  • onBeforeCreate - Zadzwoniłem before tworzenie nowego dokumentu.

  • onAfterCreate - Zadzwoniłem after tworzenie nowego dokumentu.

  • onBeforeRead - Zadzwoniłem before czytanie dokumentu.

  • onAfterRead - Zadzwoniłem after czytanie dokumentu.

  • onBeforeUpdate - Zadzwoniłem before aktualizacja dokumentu.

  • onAfterUpdate - Zadzwoniłem after aktualizacja dokumentu.

  • onBeforeDelete - Zadzwoniłem before usunięcie dokumentu.

  • onAfterDelete - Zadzwoniłem after usunięcie dokumentu.

Dynamiczne hooki mogą dzwonić -

  • Funkcje napisane w SQL, Javascript lub dowolnym języku obsługiwanym przez OrientDB i JVM.

  • Metody statyczne Java.

Haki na poziomie klasy

Haki na poziomie klasy są zdefiniowane dla wszystkich dokumentów, które odnoszą się do klasy. Poniżej znajduje się przykład konfiguracji haka, który działa na poziomie klasy w stosunku do dokumentów faktur.

CREATE CLASS Invoice EXTENDS OTriggered 
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated

Stwórzmy funkcję invoiceCreated w Javascript, który wyświetla w konsoli serwera numer utworzonej faktury.

CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));"
LANGUAGE Javascript

Teraz wypróbuj hak, tworząc nowy Invoice dokument.

INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}

Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.

Invoice created: 100

Zaczep poziomu dokumentu

Możesz zdefiniować akcję specjalną tylko dla jednego lub kilku dokumentów. Aby to zrobić, pozwól swojej klasie na rozszerzenieOTriggered klasa.

Na przykład uruchommy wyzwalacz, jako funkcję JavaScript, w odniesieniu do istniejącej klasy Profile, dla wszystkich dokumentów z właściwością konto = „Premium”. Uruchomiony zostanie wyzwalacz, aby zapobiec usunięciu dokumentów.

ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile 
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'

Stwórzmy preventDeletion() Funkcja JavaScript.

CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot 
delete Premium profile ' + doc)" LANGUAGE Javascript

Następnie przetestuj haczyk, próbując usunąć konto „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

Haczyki JAVA

Jednym z typowych przypadków użycia hooków OrientDB (wyzwalaczy) jest zarządzanie utworzonymi i zaktualizowanymi datami dla dowolnej lub wszystkich klas. Na przykład możesz ustawić plikCreatedDate za każdym razem, gdy tworzony jest rekord i ustawiany jest UpdatedDate za każdym razem, gdy rekord jest aktualizowany i rób to w taki sposób, aby logikę zaimplementować raz w warstwie bazy danych i nigdy więcej nie martwić się o to w warstwie aplikacji.

Przed utworzeniem będziesz musiał pobrać orientdb-core.jarplik, odwiedzając poniższe łącze pobierz rdzeń OrientDB . A później skopiuj ten plik jar do folderu, w którym chcesz przechowywać plik źródłowy Java.

Utwórz plik hooka

Utwórz plik Java o nazwie HookTest.java, który przetestuje mechanizm hooka przy użyciu języka 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;  
   }  
}

Powyższy przykładowy kod drukuje odpowiedni komentarz za każdym razem, gdy tworzysz lub aktualizujesz rekord tej klasy.

Dodajmy jeszcze jeden plik hook setCreatedUpdatedDates.java w następujący sposób -

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; 
      } 
   }  
}

Powyższy kod wyszukuje każdą klasę zaczynającą się od liter „r'lub't'i ustawia CreatedDate i UpdatedDate, gdy rekord zostanie utworzony, i ustawia tylko UpdatedDate za każdym razem, gdy rekord zostanie zaktualizowany.

Kompiluj hooki Java

Skompiluj kod Java za pomocą następującego polecenia. Note: Zachowaj pobrany plik jar i te pliki Java w tym samym folderze.

$ jar cf hooks-1.0-SNAPSHOT.jar *.java

Przenieś skompilowany kod do miejsca, w którym może go znaleźć serwer OrientDB

Musisz skopiować gotowy plik .jar do katalogu, w którym serwer OrientDB będzie ich szukał. Oznacza to „./lib'folder w katalogu głównym serwera OrientDB będzie wyglądał następująco -

$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"

Włącz Test Hook w pliku konfiguracyjnym serwera OrientDB

Edytować $ORIENTDB_HOME/config/orientdb-server-config.xml i dodaj następującą sekcję pod koniec pliku.

<hooks> 
      <hook class = "HookTest" position = "REGULAR"/> 
   </hooks> 
   ... 
</orient-server>

Zrestartuj serwer OrientDB

Po ponownym uruchomieniu OrientDB Server, hak zdefiniowany w orientdb-server-config.xmljest teraz aktywny. Uruchom konsolę OrientDB, podłącz ją do bazy danych i uruchom następujące polecenie -

INSERT INTO V SET ID = 1;

Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.

Ran create hook

Teraz uruchom następujące polecenie -

UPDATE V SET ID = 2 WHERE ID = 1;

Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.

Ran update hook

Włącz Real Hook w pliku konfiguracyjnym serwera OrientDB

Edytować $ORIENTDB_HOME/config/orientdb-server-config.xml i zmień sekcję haczyków w następujący sposób -

<hooks> 
      <hook class="setCreatedUpdatedDates" position="REGULAR"/> 
   </hooks> 
   ... 
</orient-server>

Zrestartuj serwer OrientDB

Utwórz nową klasę zaczynającą się na literę „r'lub't'-

CREATE CLASS tTest EXTENDS V;

Teraz wstaw rekord -

INSERT INTO tTest SET ID = 1 
SELECT FROM tTest

Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.

----+-----+------+----+-----------+----------- 
#   |@RID |@CLASS|ID  |CreatedDate|UpdatedDate 
----+-----+------+----+-----------+----------- 
0   |#19:0|tTest |1   |1427597275 |1427597275 
----+-----+------+----+-----------+-----------

Mimo że nie określono wartości do ustawienia CreatedDate i UpdatedDate, OrientDB ustawił te pola automatycznie.

Następnie musisz zaktualizować rekord za pomocą następującego polecenia -

UPDATE tTest SET ID = 2 WHERE ID = 1; 
SELECT FROM tTest;

Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.

----+-----+------+----+-----------+----------- 
#   |@RID |@CLASS|ID  |CreatedDate|UpdatedDate 
----+-----+------+----+-----------+----------- 
0   |#19:0|tTest |2   |1427597275 |1427597306 
----+-----+------+----+-----------+-----------

Możesz zobaczyć, że OrientDB zmienił UpdatedDate ale pozwolił CreatedDate pozostają bez zmian.

OrientDB Java Hooks może być niezwykle cennym narzędziem pomagającym zautomatyzować pracę, którą w innym przypadku musiałbyś wykonywać w kodzie aplikacji. Ponieważ wielu administratorów baz danych nie zawsze jest ekspertami w dziedzinie języka Java, mamy nadzieję, że informacje zawarte w tym samouczku umożliwią Ci dobry start i sprawią, że poczujesz się komfortowo z technologią, umożliwiając pomyślne tworzenie wyzwalaczy baz danych w razie potrzeby.