यहां कई समस्याएं हैं।
आप SQL से किसी भी C फ़ंक्शन को कॉल नहीं कर सकते
सबसे पहले, आप केवल SQL से मनमाने कार्यों को कॉल नहीं कर सकते हैं, आपको PostgreSQL के C एक्सटेंशन API और मैक्रोज़ का उपयोग करना चाहिए; उदाहरण के लिए स्रोतों में SQL- कॉल करने योग्य फ़ंक्शन के मौजूदा कार्यान्वयन को देखें।
आपको आमतौर पर कोर कोड को संशोधित करने की आवश्यकता नहीं होती है, एक्सटेंशन अक्सर पर्याप्त होते हैं
दूसरा, यदि आप कोर पोस्टग्रेएसक्यूएल में फ़ंक्शन जोड़ना चाहते हैं, तो आपको उन्हें src/include/catalog/pg_proc.h
में जोड़ना होगा। इसलिए उन्हें initdb
. के दौरान परिभाषित किया गया है ।
हालांकि, उचित एक्सटेंशन लोडिंग सुविधाओं का उपयोग करना बेहतर है:
- http://www.postgresql.org/docs/ वर्तमान/स्थिर/xfunc-c.html
- http://www.postgresql.org/docs/ current/static/extend-pgxs.html
इस तरह आप LOAD
. कर सकते हैं एक एक्सटेंशन मॉड्यूल, CREATE FUNCTION
C डॉक्स के अनुसार कार्य करता है, और उन्हें SQL से कॉल करता है।
आपके विशिष्ट मामले में ऐसा लगता है कि आप करते हैं कोर कोडबेस को संशोधित करने की आवश्यकता है, लेकिन यह काफी असामान्य है, इसलिए मैं इस सलाह को दूसरों के लिए संरक्षित कर रहा हूं।
पोस्टग्रेएसक्यूएल बैकएंड में एसी फ़ंक्शन को जीयूआई से "सीधे" नहीं कहा जा सकता है
आपके पास जावा स्विंग जीयूआई है और आप कल्पना करते हैं कि किसी तरह सी फ़ंक्शन को एक अलग प्रक्रिया में कॉल करना, संभवतः एक अलग होस्ट पर भी।
यह कई कारणों से काम नहीं करेगा, जिनमें शामिल हैं:
- जावा
JNI
जैसे ग्लू कोड के बिना C फंक्शन को सीधे कॉल नहीं कर सकता है याJNA
। - सी फ़ंक्शन को किसी भिन्न प्रक्रिया में सीधे कॉल करना संभव नहीं है; इसके बजाय आपको सूचनाओं का आदान-प्रदान करने के लिए अंतर-प्रक्रिया संचार (साझा स्मृति, पाइप, सॉकेट, साझा फ़ाइलें, आदि) का उपयोग करना चाहिए
- जबकि आप पीजी बैकएंड में जावा दुभाषिया एम्बेड कर सकते हैं और सी फ़ंक्शन को सीधे जेएनआई के माध्यम से कॉल कर सकते हैं, आप वास्तव में सीधे एक पीजी बैकएंड के अंदर से एक स्विंग जीयूआई प्रदर्शित करने की कोशिश नहीं करना चाहता।
आपको एक बहु-चरणीय प्रक्रिया की आवश्यकता है:
-
वह डेटा एकत्र करें जिसे आप PostgreSQL बैकएंड में कैप्चर करना चाहते हैं। यदि आप इसे उसी कनेक्शन से एक्सेस करने का इरादा रखते हैं जो इसे आप में बनाया गया है तो एक सामान्य
palloc
का उपयोग कर सकते हैं 'डी बफर। अन्यथा आपको साझा मेमोरी से बफर आवंटित करना होगा या फ़ाइल सिस्टम का उपयोग करके डेटा का आदान-प्रदान करना होगा। -
उस डेटा को C फ़ंक्शन से एक्सेस करें जिसे PostgreSQL के C एक्सटेंशन फ़ंक्शन दस्तावेज़ (ऊपर) के अनुसार SQL-कॉल करने योग्य इंटरफ़ेस के साथ बनाया गया है
-
अपने SQL-कॉल करने योग्य इंटरफ़ेस फ़ंक्शन से डेटा को अपने Java एप्लिकेशन में स्थानांतरित करने के लिए PostgreSQL कनेक्शन का उपयोग करें। इसे अपने आवेदन में डीकोड करें और इसे इच्छानुसार प्रदर्शित करें।
वैकल्पिक रूप से:
-
यह आवश्यक है कि आपका जावा प्रोग्राम, या इसके लिए एक एजेंट, PostgreSQL सर्वर के समान सिस्टम पर चलता है और एजेंट को Pg के लिए लिखने योग्य और आपके प्रोग्राम द्वारा पढ़ने योग्य स्थान पर फ़ाइलें लिखने के लिए कहता है।
-
अपने प्रोग्राम या उसके एजेंट का उपयोग करके फ़ाइलें पढ़ें और उन्हें प्रदर्शन के लिए संसाधित करें
आप उस सॉकेट पर पीजी लिख सकते हैं जिस पर आपका प्रोग्राम सुन रहा है, लेकिन मैं इसकी अनुशंसा नहीं करता क्योंकि आपके प्रोग्राम में एक स्टाल पोस्टग्रेएसक्यूएल में प्रदर्शन समस्याओं का कारण बन जाएगा।