OrientDB - Móc

OrientDB Hookskhông là gì ngoài các kích hoạt trong thuật ngữ cơ sở dữ liệu cho phép các sự kiện nội bộ trước và sau mỗi hoạt động CRUD trong các ứng dụng người dùng. Bạn có thể sử dụng hook để viết các quy tắc xác thực tùy chỉnh, để thực thi bảo mật hoặc để sắp xếp các sự kiện bên ngoài như sao chép lại với một DBMS quan hệ.

OrientDB hỗ trợ hai loại móc -

Dynamic Hook - Trình kích hoạt, có thể được xây dựng ở cấp lớp và / hoặc cấp Tài liệu.

Java (Native) Hook - Trình kích hoạt, có thể được xây dựng bằng các lớp Java.

Móc động

Các móc động linh hoạt hơn các móc Java, vì chúng có thể được thay đổi trong thời gian chạy và có thể chạy trên mỗi tài liệu nếu cần, nhưng chậm hơn các móc Java.

Để thực thi các hook đối với tài liệu của bạn, trước tiên hãy cho phép các lớp của bạn mở rộng OTriggeredlớp cơ sở. Sau đó, xác định thuộc tính tùy chỉnh cho sự kiện quan tâm. Sau đây là các sự kiện có sẵn.

  • onBeforeCreate - Đã gọi before tạo một tài liệu mới.

  • onAfterCreate - Đã gọi after tạo một tài liệu mới.

  • onBeforeRead - Đã gọi before đọc một tài liệu.

  • onAfterRead - Đã gọi after đọc một tài liệu.

  • onBeforeUpdate - Đã gọi before cập nhật tài liệu.

  • onAfterUpdate - Đã gọi after cập nhật tài liệu.

  • onBeforeDelete - Đã gọi before xóa một tài liệu.

  • onAfterDelete - Đã gọi after xóa một tài liệu.

Dynamic Hooks có thể gọi -

  • Các hàm, được viết bằng SQL, Javascript hoặc bất kỳ ngôn ngữ nào được OrientDB và JVM hỗ trợ.

  • Các phương thức tĩnh trong Java.

Móc cấp độ lớp

Các móc cấp lớp được định nghĩa cho tất cả các tài liệu liên quan đến một lớp. Sau đây là một ví dụ để thiết lập một hook hoạt động ở cấp độ lớp đối với các chứng từ Hóa đơn.

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

Hãy tạo hàm invoiceCreated bằng Javascript để in số hóa đơn đã tạo trong bảng điều khiển máy chủ.

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

Bây giờ hãy thử hook bằng cách tạo một Invoice tài liệu.

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

Nếu lệnh này được thực hiện thành công, bạn sẽ nhận được kết quả sau.

Invoice created: 100

Móc cấp tài liệu

Bạn chỉ có thể xác định một hành động đặc biệt đối với một hoặc nhiều tài liệu. Để làm điều này, hãy cho phép lớp học của bạn mở rộngOTriggered lớp học.

Ví dụ: hãy để chúng tôi thực thi một trình kích hoạt, dưới dạng hàm Javascript, chống lại một lớp Hồ sơ tồn tại, cho tất cả các tài liệu có tài khoản thuộc tính = 'Premium'. Trình kích hoạt sẽ được gọi để ngăn việc xóa tài liệu.

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

Hãy tạo preventDeletion() Hàm Javascript.

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

Và sau đó kiểm tra hook bằng cách xóa tài khoản '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

JAVA Hooks

Một trường hợp sử dụng phổ biến cho OrientDB Hooks (trình kích hoạt) là quản lý ngày đã tạo và cập nhật cho bất kỳ hoặc tất cả các lớp. Ví dụ: bạn có thể đặtCreatedDate bất cứ khi nào bản ghi được tạo và đặt một UpdatedDate bất cứ khi nào một bản ghi được cập nhật và thực hiện theo cách mà bạn thực hiện logic một lần ở lớp cơ sở dữ liệu và không bao giờ phải lo lắng về nó nữa ở lớp ứng dụng.

Trước khi tạo, bạn sẽ phải tải xuống orientdb-core.jarbằng cách truy cập vào liên kết sau tải về lõi OrientDB . Và sau đó sao chép tệp jar đó vào thư mục mà bạn muốn lưu tệp nguồn Java.

Tạo tệp Hook

Tạo một tệp Java có tên HookTest.java, sẽ kiểm tra cơ chế Hook bằng ngôn ngữ 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;  
   }  
}

Mã mẫu trên sẽ in nhận xét thích hợp mỗi khi bạn tạo hoặc cập nhật bản ghi của lớp đó.

Hãy thêm một tệp hook nữa setCreatedUpdatedDates.java như sau -

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

Những gì đoạn mã trên làm là tìm kiếm bất kỳ lớp nào bắt đầu bằng các chữ cái 'r' hoặc là 't'và đặt Ngày tạo và Ngày cập nhật khi bản ghi được tạo và chỉ đặt Ngày cập nhật mỗi khi bản ghi được cập nhật.

Biên dịch Java Hooks

Biên dịch mã Java bằng cách sử dụng lệnh sau. Note: Giữ tệp jar đã tải xuống và các tệp Java này vào cùng một thư mục.

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

Di chuyển mã đã biên dịch đến nơi máy chủ OrientDB có thể tìm thấy nó

Bạn cần sao chép tệp .jar đã hoàn thành vào thư mục mà máy chủ OrientDB của bạn sẽ tìm kiếm chúng. Điều này có nghĩa là './libthư mục 'trong thư mục gốc Máy chủ OrientDB của bạn sẽ trông như thế này -

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

Bật Móc kiểm tra trong Tệp Cấu hình Máy chủ OrientDB

Biên tập $ORIENTDB_HOME/config/orientdb-server-config.xml và thêm phần sau vào gần cuối tệp.

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

Khởi động lại máy chủ OrientDB

Sau khi bạn khởi động lại Máy chủ OrientDB, móc nối bạn đã xác định trong orientdb-server-config.xmlhiện đang hoạt động. Khởi chạy bảng điều khiển OrientDB, kết nối nó với cơ sở dữ liệu của bạn và chạy lệnh sau:

INSERT INTO V SET ID = 1;

Nếu lệnh này được thực hiện thành công, bạn sẽ nhận được kết quả sau.

Ran create hook

Bây giờ hãy chạy lệnh sau:

UPDATE V SET ID = 2 WHERE ID = 1;

Nếu lệnh này được thực hiện thành công, bạn sẽ nhận được kết quả sau.

Ran update hook

Kích hoạt Real Hook trong tệp cấu hình máy chủ OrientDB

Biên tập $ORIENTDB_HOME/config/orientdb-server-config.xml và thay đổi phần hooks như sau:

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

Khởi động lại máy chủ OrientDB

Tạo một lớp mới bắt đầu bằng chữ cái 'r' hoặc là 't'-

CREATE CLASS tTest EXTENDS V;

Bây giờ hãy chèn một bản ghi -

INSERT INTO tTest SET ID = 1 
SELECT FROM tTest

Nếu lệnh này được thực hiện thành công, bạn sẽ nhận được kết quả sau.

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

Mặc dù bạn không chỉ định các giá trị để đặt CreatedDateUpdatedDate, OrientDB đã đặt các trường này tự động cho bạn.

Tiếp theo, bạn cần cập nhật bản ghi bằng lệnh sau:

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

Nếu lệnh này được thực hiện thành công, bạn sẽ nhận được kết quả sau.

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

Bạn có thể thấy rằng OrientDB đã thay đổi UpdatedDate nhưng đã để CreatedDate vẫn không thay đổi.

OrientDB Java Hooks có thể là một công cụ cực kỳ có giá trị để giúp tự động hóa công việc mà bạn sẽ phải làm trong mã ứng dụng. Vì nhiều DBA không phải lúc nào cũng là chuyên gia Java, hy vọng thông tin có trong hướng dẫn này sẽ giúp bạn có một khởi đầu thuận lợi và khiến bạn cảm thấy thoải mái với công nghệ, cho phép bạn tạo thành công các trình kích hoạt cơ sở dữ liệu khi có nhu cầu.