Det finns flera problem här.
Du kan inte anropa vilken C-funktion som helst från SQL
För det första kan du inte bara anropa godtyckliga funktioner från SQL, du måste använda PostgreSQL:s C-tilläggs-API:er och makron; titta på de befintliga implementeringarna av SQL-anropbara funktioner i källorna för exempel.
Du behöver vanligtvis inte ändra kärnkoden, tillägg räcker ofta
För det andra, om du vill lägga till funktioner till kärnan i PostgreSQL, måste du lägga till dem i src/include/catalog/pg_proc.h
så de definieras under initdb
.
Det är dock mycket bättre att använda rätt förlängningslastningsmöjligheter:
- http://www.postgresql.org/docs/ current/static/xfunc-c.html
- http://www.postgresql.org/docs/ current/static/extend-pgxs.html
På så sätt kan du LOAD
en tilläggsmodul, CREATE FUNCTION
C fungerar enligt dokumenten och anropar dem från SQL.
I ditt specifika fall ser det ut som du gör måste modifiera kärnkodbasen, men detta är ganska ovanligt, så jag bevarar det här rådet för andra.
En C-funktion i PostgreSQL-backend kan inte anropas "direkt" från ett GUI
Du har ett Java Swing GUI och du föreställer dig att på något sätt anropa en C-funktion i en annan process, möjligen till och med på en annan värd, än den.
Detta kommer inte att fungera av en massa anledningar, inklusive:
- Java kan inte direkt anropa C-funktioner utan limkod som
JNI
ellerJNA
. - Det är inte möjligt att anropa en C-funktion i en annan process direkt; du måste istället använda kommunikation mellan processer (delat minne, rör, sockets, delade filer, etc) för att utbyta information
- Medan du kan bädda in en Java-tolk i Pg-backend och anropa C-funktionen via JNI typ direkt, är du verkligen vill inte försöka visa ett Swing-gränssnitt direkt inifrån en Pg-backend.
Vad du behöver är en process i flera steg:
-
Samla data du vill fånga i PostgreSQL-backend. Om du tänker komma åt den från samma anslutning som den skapades i kan du använda en vanlig
palloc
'd buffert. Annars måste du allokera en buffert från delat minne eller utbyta data med hjälp av filsystemet. -
Få åtkomst till dessa data från en C-funktion som har skapats med ett SQL-anropbart gränssnitt enligt PostgreSQL:s C-tilläggsfunktionsdokumentation (ovan)
-
Använd en PostgreSQL-anslutning för att överföra data från din SQL-anropbara gränssnittsfunktion till din Java-applikation. Avkoda den i din applikation och visa den efter önskemål.
Alternativt:
-
Kräv att ditt Java-program, eller en agent för det, körs på samma system som PostgreSQL-servern och att agenten skriver filer på en plats som är skrivbar till Pg och läsbar av ditt program.
-
Läs filerna med ditt program eller dess agent och bearbeta dem för visning
Du kan till och med låta Pg skriva till en socket som ditt program lyssnar på, men jag rekommenderar inte detta eftersom ett stopp i ditt program skulle orsaka prestandaproblem i PostgreSQL.