Der er flere problemer her.
Du kan ikke kalde en hvilken som helst C-funktion fra SQL
For det første kan du ikke bare kalde vilkårlige funktioner fra SQL, du skal bruge PostgreSQL's C extension API'er og makroer; se på de eksisterende implementeringer af SQL-kaldbare funktioner i kilderne for eksempler.
Du behøver normalt ikke at ændre kernekoden, udvidelser er ofte tilstrækkelige
For det andet, hvis du vil tilføje funktioner til kerne PostgreSQL, skal du tilføje dem til src/include/catalog/pg_proc.h
så de er defineret under initdb
.
Det er dog meget bedre at bruge de korrekte udvidelseslastningsfaciliteter:
- http://www.postgresql.org/docs/ current/static/xfunc-c.html
- http://www.postgresql.org/docs/ current/static/extend-pgxs.html
På denne måde kan du LOAD
et udvidelsesmodul, CREATE FUNCTION
C-funktionerne i henhold til dokumenterne og kalder dem fra SQL.
I dit specifikke tilfælde ser det ud til, at du gør det skal ændre kernekodebasen, men dette er ret usædvanligt, så jeg bevarer dette råd til andre.
En C-funktion i PostgreSQL-backend kan ikke kaldes "direkte" fra en GUI
Du har en Java Swing GUI, og du forestiller dig på en eller anden måde at kalde en C-funktion i en anden proces, muligvis endda på en anden vært, end den.
Dette vil ikke virke af en række årsager, herunder:
- Java kan ikke direkte kalde C-funktioner uden limkode som
JNI
ellerJNA
. - Det er ikke muligt at kalde en C-funktion direkte i en anden proces; du skal i stedet bruge kommunikation mellem processer (delt hukommelse, rør, sockets, delte filer osv.) til at udveksle information
- Mens du kunne indlejre en Java-fortolker i Pg-backend'en og kalde C-funktionen via JNI på en måde, er du virkelig ønsker ikke at prøve at vise en Swing GUI direkte inde fra en Pg-backend.
Det, du har brug for, er en flertrinsproces:
-
Indsaml de data, du ønsker at fange i PostgreSQL-backend. Hvis du har til hensigt at få adgang til den fra den samme forbindelse, som den er oprettet i, kan du bruge en almindelig
palloc
'd buffer. Ellers bliver du nødt til at allokere en buffer ud af delt hukommelse eller udveksle data ved hjælp af filsystemet. -
Få adgang til disse data fra en C-funktion, der er blevet oprettet med en SQL-kaldbar grænseflade i henhold til PostgreSQL's C-udvidelsesfunktionsdokumentation (ovenfor)
-
Brug en PostgreSQL-forbindelse til at overføre data fra din SQL-kaldbare grænsefladefunktion til din Java-applikation. Afkode det i din applikation og vis det som ønsket.
Alternativt:
-
Kræv, at dit Java-program, eller en agent for det, kører på det samme system som PostgreSQL-serveren, og at agenten skal skrive filer på en placering, der kan skrives til Pg og læses af dit program.
-
Læs filerne ved hjælp af dit program eller dets agent, og bearbejd dem til visning
Du kunne endda få Pg til at skrive til en socket dit program lytter på, men jeg anbefaler ikke dette, da en stall i dit program ville forårsage ydeevneproblemer i PostgreSQL.