Ci sono diversi problemi qui.
Non puoi chiamare qualsiasi funzione C da SQL
Innanzitutto, non puoi semplicemente chiamare funzioni arbitrarie da SQL, devi utilizzare le API e le macro di estensione C di PostgreSQL; guarda le implementazioni esistenti delle funzioni richiamabili SQL nei sorgenti per esempi.
Di solito non è necessario modificare il codice principale, spesso le estensioni sono sufficienti
Secondo, se vuoi aggiungere funzioni al core di PostgreSQL, devi aggiungerle a src/include/catalog/pg_proc.h
quindi vengono definiti durante initdb
.
È molto meglio, tuttavia, utilizzare le corrette funzionalità di caricamento delle estensioni:
- http://www.postgresql.org/docs/ corrente/statico/xfunc-c.html
- http://www.postgresql.org/docs/ current/static/extend-pgxs.html
In questo modo puoi LOAD
un modulo di estensione, CREATE FUNCTION
le funzioni C come per i documenti e chiamarle da SQL.
Nel tuo caso specifico sembra che tu fai è necessario modificare la base di codice principale, ma questo è piuttosto insolito, quindi conservo questo consiglio per gli altri.
Una funzione C nel backend PostgreSQL non può essere chiamata "direttamente" da una GUI
Hai una GUI Java Swing e immagini in qualche modo di chiamare una funzione C in un processo diverso, possibilmente anche su un host diverso, da esso.
Questo non funzionerà per una serie di motivi, tra cui:
- Java non può chiamare direttamente le funzioni C senza codice adesivo come
JNI
oJNA
. - Non è possibile chiamare direttamente una funzione C in un processo diverso; devi invece utilizzare la comunicazione tra processi (memoria condivisa, pipe, socket, file condivisi, ecc.) per scambiare informazioni
- Anche se potresti incorporare un interprete Java nel backend Pg e chiamare la funzione C tramite JNI tipo-direttamente, tu davvero non voglio provare a visualizzare una GUI Swing direttamente dall'interno di un backend Pg.
Ciò di cui hai bisogno è un processo in più fasi:
-
Raccogli i dati che desideri acquisire nel backend di PostgreSQL. Se intendi accedervi dalla stessa connessione in cui è stato creato puoi utilizzare un normale
palloc
'd buffer. Altrimenti dovrai allocare un buffer dalla memoria condivisa o scambiare dati usando il file system. -
Accedi a quei dati da una funzione C che è stata creata con un'interfaccia richiamabile SQL secondo la documentazione della funzione di estensione C di PostgreSQL (sopra)
-
Utilizzare una connessione PostgreSQL per trasferire i dati dalla funzione di interfaccia richiamabile SQL all'applicazione Java. Decodificalo nella tua applicazione e visualizzalo come desideri.
In alternativa:
-
Richiedi che il tuo programma Java, o un agente per esso, venga eseguito sullo stesso sistema del server PostgreSQL e che l'agente scriva i file in una posizione scrivibile su Pg e leggibile dal tuo programma.
-
Leggi i file usando il tuo programma o il suo agente ed elaborali per la visualizzazione
Potresti anche fare in modo che Pg scriva su un socket su cui è in ascolto il tuo programma, ma non lo consiglio poiché uno stallo nel tuo programma causerebbe problemi di prestazioni in PostgreSQL.