PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Извикване на дефинирана от потребителя функция, намираща се в postgres.c в postgreSQL, използвайки GUI, дефиниран от netbeans

Тук има няколко проблема.

Не можете да извикате която и да е C функция от SQL

Първо, не можете просто да извиквате произволни функции от SQL, трябва да използвате приложните програмни интерфейси (API) и макроси на C разширението на PostgreSQL; разгледайте съществуващите реализации на SQL-извикваеми функции в изходния код за примери.

Обикновено не е нужно да променяте основния код, разширенията често са достатъчни

Второ, ако искате да добавите функции към ядрото на PostgreSQL, трябва да ги добавите към src/include/catalog/pg_proc.h така че те се дефинират по време на initdb .

Много по-добре е обаче да използвате подходящите възможности за зареждане на разширения:

По този начин можете да 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql nextval въпрос за последователности

  2. правилен начин за създаване на обобщена таблица в postgresql с помощта на CASE WHEN

  3. Каква е разликата между потребител и роля?

  4. UPDATE table_name SET col_name =varchar WHERE col_name е NULL;

  5. Интервал за съвпадение на PostgreSQL между началния и крайния час спрямо времевата марка