ओरिएंटबीडी - हुक
OrientDB Hooksडेटाबेस शब्दावली में ट्रिगर के अलावा कुछ भी नहीं है जो उपयोगकर्ता अनुप्रयोगों में प्रत्येक सीआरयूडी संचालन से पहले और बाद में आंतरिक घटनाओं को सक्षम करता है। आप कस्टम सत्यापन नियमों को लिखने के लिए, सुरक्षा को लागू करने के लिए या एक रिलेशनल DBMS के खिलाफ प्रतिकृति जैसी बाहरी घटनाओं की व्यवस्था करने के लिए हुक का उपयोग कर सकते हैं।
ओरिएंटबीडी दो प्रकार के हुक का समर्थन करता है -
Dynamic Hook - ट्रिगर, जिसे कक्षा स्तर और / या दस्तावेज़ स्तर पर बनाया जा सकता है।
Java (Native) Hook - ट्रिगर, जो जावा कक्षाओं का उपयोग करके बनाया जा सकता है।
गतिशील हुक
जावा हुक की तुलना में डायनेमिक हुक अधिक लचीले होते हैं, क्योंकि उन्हें रनटाइम में बदला जा सकता है और यदि आवश्यक हो तो प्रति दस्तावेज़ चला सकते हैं, लेकिन जावा हुक की तुलना में धीमी होती हैं।
अपने दस्तावेजों के खिलाफ हुक निष्पादित करने के लिए, पहले अपनी कक्षाओं का विस्तार करने की अनुमति दें OTriggeredआधार वर्ग। बाद में, इच्छुक घटना के लिए एक कस्टम संपत्ति को परिभाषित करें। उपलब्ध घटनाओं का अनुसरण कर रहे हैं।
onBeforeCreate - फोन किया before एक नया दस्तावेज़ बनाना।
onAfterCreate - फोन किया after एक नया दस्तावेज़ बनाना।
onBeforeRead - फोन किया before एक दस्तावेज़ पढ़ना।
onAfterRead - फोन किया after एक दस्तावेज़ पढ़ना।
onBeforeUpdate - फोन किया before एक दस्तावेज़ को अद्यतन करना।
onAfterUpdate - फोन किया after एक दस्तावेज़ को अद्यतन करना।
onBeforeDelete - फोन किया before दस्तावेज़ हटाना।
onAfterDelete - फोन किया after दस्तावेज़ हटाना।
डायनेमिक हुक कह सकते हैं -
कार्य, SQL, जावास्क्रिप्ट या ओरिएंटडीबी और जेवीएम द्वारा समर्थित किसी भी भाषा में लिखे गए हैं।
जावा स्थिर विधियाँ।
कक्षा स्तर के हुक
क्लास लेवल हुक को उन सभी दस्तावेजों के लिए परिभाषित किया गया है जो एक क्लास से संबंधित हैं। निम्नलिखित एक हुक स्थापित करने के लिए एक उदाहरण है जो इनवॉइस दस्तावेजों के खिलाफ वर्ग स्तर पर कार्य करता है।
CREATE CLASS Invoice EXTENDS OTriggered
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated
चलिए फंक्शन बनाते हैं invoiceCreated जावास्क्रिप्ट में जो सर्वर में प्रिंट करता है वह बनाए गए इनवॉइस नंबर को कंसोल करता है।
CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));"
LANGUAGE Javascript
अब एक नया बनाकर हुक का प्रयास करें Invoice दस्तावेज़।
INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}
यदि इस कमांड को सफलतापूर्वक निष्पादित किया जाता है, तो आपको निम्न आउटपुट मिलेगा।
Invoice created: 100
दस्तावेज़ स्तर हुक
आप केवल एक या अधिक दस्तावेजों के खिलाफ एक विशेष कार्रवाई को परिभाषित कर सकते हैं। ऐसा करने के लिए, अपनी कक्षा को विस्तारित करने की अनुमति देंOTriggered कक्षा।
उदाहरण के लिए, हमें एक ट्रिगर निष्पादित करें, जावास्क्रिप्ट फ़ंक्शन के रूप में, एक प्रचलित प्रोफ़ाइल वर्ग के खिलाफ, संपत्ति खाते के साथ सभी दस्तावेजों के लिए = 'प्रीमियम'। दस्तावेजों को हटाने से रोकने के लिए ट्रिगर को बुलाया जाएगा।
ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'
आइए बनाते हैं preventDeletion() जावास्क्रिप्ट समारोह।
CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot
delete Premium profile ' + doc)" LANGUAGE Javascript
और फिर 'प्रीमियम' खाते को हटाने की कोशिश करके हुक का परीक्षण करें।
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
जावा हुक
ओरिएंटडीबी हुक (ट्रिगर्स) के लिए एक सामान्य उपयोग मामला किसी भी या सभी वर्गों के लिए बनाई गई और अद्यतित तिथियों का प्रबंधन करना है। उदाहरण के लिए, आप एक सेट कर सकते हैंCreatedDate जब भी कोई रिकॉर्ड बनाया जाता है और सेट किया जाता है UpdatedDate जब भी कोई रिकॉर्ड अपडेट किया जाता है, तो उसे फ़ील्ड में रखें और डेटाबेस लेयर पर एक बार लॉजिक को लागू करें और एप्लिकेशन लेयर पर फिर कभी इसके बारे में चिंता न करें।
बनाने से पहले, आपको डाउनलोड करना होगा orientdb-core.jarनिम्न लिंक पर जाकर फाइल डाउनलोड करें ओरिएंटबीडी कोर । और बाद में उस जार फ़ाइल को उस फ़ोल्डर में कॉपी करें जहाँ आप जावा सोर्स फाइल को स्टोर करना चाहते हैं।
हुक फ़ाइल बनाएँ
नाम से एक जावा फ़ाइल बनाएँ HookTest.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;
}
}
उपरोक्त नमूना कोड आपके द्वारा उस कक्षा का रिकॉर्ड बनाते या अद्यतन करने पर हर बार उपयुक्त टिप्पणी छापता है।
आइए एक और हुक फ़ाइल जोड़ें setCreatedUpdatedDates.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 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;
}
}
}
उपरोक्त कोड किसी भी वर्ग के लिए क्या है जो अक्षरों से शुरू होता है 'r''t'और क्रिएटेडडेट और अपडेटडेट सेट करता है जब रिकॉर्ड बनता है और रिकॉर्ड अपडेट होने पर हर बार सिर्फ अपडेटेड सेट करता है।
संकलित जावा हुक
निम्न आदेश का उपयोग करके जावा कोड संकलित करें। Note: डाउनलोड की गई जार फाइल और इन जावा फाइलों को एक ही फोल्डर में रखें।
$ jar cf hooks-1.0-SNAPSHOT.jar *.java
संकलित कोड को स्थानांतरित करें जहां OrientDB सर्वर इसे पा सकते हैं
आपको तैयार .jar फ़ाइल को उस निर्देशिका में कॉपी करना होगा जहां आपका ओरिएंटबीडी सर्वर उनके लिए दिखेगा। इसका मतलब है './lib'ओरिएंटबीडी सर्वर रूट डायरेक्टरी के तहत फ़ोल्डर इस तरह दिखेगा -
$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"
OrientDB सर्वर कॉन्फ़िगरेशन फ़ाइल में परीक्षण हुक सक्षम करें
संपादित करें $ORIENTDB_HOME/config/orientdb-server-config.xml और फ़ाइल के अंत के पास निम्न अनुभाग जोड़ें।
<hooks>
<hook class = "HookTest" position = "REGULAR"/>
</hooks>
...
</orient-server>
ओरिएंटबीडी सर्वर को पुनरारंभ करें
एक बार जब आप ओरिएंटबीडी सर्वर को पुनरारंभ करते हैं, तो जिस हुक को आपने परिभाषित किया है orientdb-server-config.xmlअब सक्रिय है। एक OrientDB कंसोल लॉन्च करें, इसे अपने डेटाबेस से कनेक्ट करें, और निम्न कमांड चलाएं -
INSERT INTO V SET ID = 1;
यदि इस कमांड को सफलतापूर्वक निष्पादित किया जाता है, तो आपको निम्न आउटपुट मिलेगा।
Ran create hook
अब निम्नलिखित कमांड चलाएँ -
UPDATE V SET ID = 2 WHERE ID = 1;
यदि इस कमांड को सफलतापूर्वक निष्पादित किया जाता है, तो आपको निम्न आउटपुट मिलेगा।
Ran update hook
OrientDB सर्वर कॉन्फ़िगरेशन फ़ाइल में वास्तविक हुक सक्षम करें
संपादित करें $ORIENTDB_HOME/config/orientdb-server-config.xml और हुक सेक्शन को इस प्रकार बदलें -
<hooks>
<hook class="setCreatedUpdatedDates" position="REGULAR"/>
</hooks>
...
</orient-server>
ओरिएंटबीडी सर्वर को पुनरारंभ करें
एक नया वर्ग बनाएं जो अक्षर से शुरू होता है 'r''t'-
CREATE CLASS tTest EXTENDS V;
अब एक रिकॉर्ड डालें -
INSERT INTO tTest SET ID = 1
SELECT FROM tTest
यदि इस कमांड को सफलतापूर्वक निष्पादित किया जाता है, तो आपको निम्न आउटपुट मिलेगा।
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |1 |1427597275 |1427597275
----+-----+------+----+-----------+-----------
भले ही आपने मानों को निर्धारित करने के लिए निर्दिष्ट नहीं किया है CreatedDate तथा UpdatedDate, OrientDB ने आपके लिए इन फ़ील्ड्स को स्वचालित रूप से सेट किया है।
अगला आपको निम्नलिखित कमांड का उपयोग करके रिकॉर्ड को अपडेट करने की आवश्यकता है -
UPDATE tTest SET ID = 2 WHERE ID = 1;
SELECT FROM tTest;
यदि इस कमांड को सफलतापूर्वक निष्पादित किया जाता है, तो आपको निम्न आउटपुट मिलेगा।
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |2 |1427597275 |1427597306
----+-----+------+----+-----------+-----------
आप देख सकते हैं कि ओरिएंटबीडी ने बदल दिया है UpdatedDate लेकिन चलो CreatedDate कोई बदलाव नहीं।
ओरिएंटबीडी जावा हुक आपके काम को स्वचालित करने में मदद करने के लिए एक अत्यंत मूल्यवान उपकरण हो सकता है अन्यथा आपको आवेदन कोड में करना होगा। चूंकि कई डीबीए हमेशा जावा विशेषज्ञ नहीं होते हैं, उम्मीद है कि इस ट्यूटोरियल में निहित जानकारी आपको एक हेड स्टार्ट देगी और आपको तकनीक के साथ सहज महसूस कराएगी, जिससे आपको डेटाबेस ट्रिगर्स बनाने की शक्ति मिलती है।