Тук има няколко проблема.
Не можете да извикате която и да е C функция от SQL
Първо, не можете просто да извиквате произволни функции от SQL, трябва да използвате приложните програмни интерфейси (API) и макроси на C разширението на PostgreSQL; разгледайте съществуващите реализации на SQL-извикваеми функции в изходния код за примери.
Обикновено не е нужно да променяте основния код, разширенията често са достатъчни
Второ, ако искате да добавите функции към ядрото на PostgreSQL, трябва да ги добавите към src/include/catalog/pg_proc.h
така че те се дефинират по време на initdb
.
Много по-добре е обаче да използвате подходящите възможности за зареждане на разширения:
- http://www.postgresql.org/docs/ current/static/xfunc-c.html
- http://www.postgresql.org/docs/ current/static/extend-pgxs.html
По този начин можете да LOAD
модул за разширение, CREATE FUNCTION
C функционира според документите и ги извиквайте от SQL.
Във вашия конкретен случай изглежда, че правите трябва да модифицирам основната кодова база, но това е доста необичайно, така че запазвам този съвет за другите.
C функция в бекенда на PostgreSQL не може да бъде извикана „директно“ от GUI
Имате Java Swing GUI и си представяте по някакъв начин да извикате C функция в различен процес, вероятно дори на различен хост, от него.
Това няма да работи поради куп причини, включително:
- Java не може директно да извиква C функции без свързващ код като
JNI
илиJNA
. - Не е възможно да се извика C функция в различен процес директно; вместо това трябва да използвате комуникация между процесите (споделена памет, канали, сокети, споделени файлове и т.н.) за обмен на информация
- Въпреки че бихте могли да вградите Java интерпретатор в Pg бекенда и да извикате C функцията чрез JNI някак директно, вие наистина не искам да се опитвам да показвам Swing GUI директно от вътрешността на Pg backend.
Това, от което се нуждаете, е многоетапен процес:
-
Съберете данните, които искате да заснемете в бекенда на PostgreSQL. Ако възнамерявате да получите достъп до него от същата връзка, в която е създаден, можете да използвате обикновен
palloc
ще буферирам. В противен случай ще трябва да разпределите буфер извън споделената памет или да обмените данни с помощта на файловата система. -
Осъществете достъп до тези данни от C функция, която е създадена с интерфейс, който може да се извиква от SQL, съгласно документацията за функцията за разширение на C на PostgreSQL (по-горе)
-
Използвайте PostgreSQL връзка, за да прехвърлите данните от вашата SQL-извикваща се интерфейсна функция към вашето Java приложение. Декодирайте го във вашето приложение и го покажете по желание.
Алтернативно:
-
Изисквайте вашата Java програма или агент за нея да работи на същата система като PostgreSQL сървъра и накарайте агента да записва файлове на място, което може да се записва в Pg и да се чете от вашата програма.
-
Прочетете файловете с помощта на вашата програма или нейния агент и ги обработете за показване
Можете дори да накарате Pg да пише в сокет, който вашата програма слуша, но не препоръчвам това, тъй като спирането във вашата програма би причинило проблеми с производителността в PostgreSQL.