Ada beberapa masalah di sini.
Anda tidak dapat memanggil sembarang fungsi C dari SQL
Pertama, Anda tidak bisa hanya memanggil fungsi arbitrer dari SQL, Anda harus menggunakan API dan makro ekstensi C PostgreSQL; lihat implementasi fungsi SQL-callable yang ada di sumber sebagai contoh.
Anda biasanya tidak perlu mengubah kode inti, ekstensi seringkali sudah cukup
Kedua, jika Anda ingin menambahkan fungsi ke inti PostgreSQL, Anda harus menambahkannya ke src/include/catalog/pg_proc.h
jadi mereka didefinisikan selama initdb
.
Namun, jauh lebih baik menggunakan fasilitas pemuatan ekstensi yang tepat:
- http://www.postgresql.org/docs/ current/static/xfunc-c.html
- http://www.postgresql.org/docs/ current/static/extend-pgxs.html
Dengan cara ini Anda dapat LOAD
modul ekstensi, CREATE FUNCTION
fungsi C sesuai dengan dokumen, dan memanggilnya dari SQL.
Dalam kasus khusus Anda, sepertinya Anda melakukannya perlu memodifikasi basis kode inti, tetapi ini sangat tidak biasa, jadi saya menyimpan saran ini untuk orang lain.
Fungsi C di backend PostgreSQL tidak dapat dipanggil "langsung" dari GUI
Anda memiliki Java Swing GUI dan Anda membayangkan entah bagaimana memanggil fungsi C dalam proses yang berbeda, bahkan mungkin pada host yang berbeda, darinya.
Ini tidak akan berhasil karena banyak alasan, termasuk:
- Java tidak bisa langsung memanggil fungsi C tanpa kode lem seperti
JNI
atauJNA
. - Tidak mungkin memanggil fungsi C dalam proses yang berbeda secara langsung; Anda harus menggunakan komunikasi antar-proses (memori bersama, pipa, soket, file bersama, dll) untuk bertukar informasi
- Meskipun Anda dapat menyematkan penerjemah Java di backend Pg dan memanggil fungsi C melalui JNI secara langsung, Anda benar-benar tidak ingin mencoba menampilkan GUI Swing langsung dari dalam backend Pg.
Yang Anda butuhkan adalah proses multi-tahap:
-
Kumpulkan data yang ingin Anda ambil di backend PostgreSQL. Jika Anda ingin mengaksesnya dari koneksi yang sama dengan yang dibuat, Anda dapat menggunakan
palloc
biasa akan buffer. Jika tidak, Anda perlu mengalokasikan buffer dari memori bersama atau bertukar data menggunakan sistem file. -
Akses data tersebut dari fungsi C yang telah dibuat dengan antarmuka yang dapat dipanggil SQL sesuai dengan dokumentasi fungsi ekstensi C PostgreSQL (di atas)
-
Gunakan koneksi PostgreSQL untuk mentransfer data dari fungsi antarmuka SQL-callable Anda ke aplikasi Java Anda. Dekode di aplikasi Anda dan tampilkan sesuai keinginan.
Bergantian:
-
Mengharuskan program Java Anda, atau agennya, berjalan pada sistem yang sama dengan server PostgreSQL dan meminta agen menulis file di lokasi yang dapat ditulis ke Pg dan dibaca oleh program Anda.
-
Baca file menggunakan program Anda atau agennya dan proses untuk ditampilkan
Anda bahkan dapat meminta Pg menulis ke soket yang sedang didengarkan oleh program Anda, tetapi saya tidak menyarankan ini karena penghentian di program Anda akan menyebabkan masalah kinerja di PostgreSQL.