Hay varios problemas aquí.
No puede llamar a cualquier función C desde SQL
Primero, no puede simplemente llamar a funciones arbitrarias desde SQL, debe usar las API y macros de extensión C de PostgreSQL; mire las implementaciones existentes de funciones SQL-callable en las fuentes para ver ejemplos.
Normalmente no es necesario modificar el código central, las extensiones suelen ser suficientes
En segundo lugar, si desea agregar funciones al núcleo de PostgreSQL, debe agregarlas a src/include/catalog/pg_proc.h
por lo que se definen durante initdb
.
Sin embargo, es mucho mejor usar las instalaciones de carga de extensiones adecuadas:
- http://www.postgresql.org/docs/ actual/estático/xfunc-c.html
- http://www.postgresql.org/docs/ actual/estático/extender-pgxs.html
De esta forma puedes LOAD
un módulo de extensión, CREATE FUNCTION
las funciones de C según los documentos y llamarlas desde SQL.
En tu caso específico, parece que haces Necesito modificar el código base principal, pero esto es bastante inusual, por lo que preservo este consejo para los demás.
Una función C en el backend de PostgreSQL no se puede llamar "directamente" desde una GUI
Tiene una GUI de Java Swing y se imagina llamando de alguna manera a una función C en un proceso diferente, posiblemente incluso en un host diferente.
Esto no funcionará por varias razones, que incluyen:
- Java no puede llamar directamente a las funciones C sin un código de conexión como
JNI
oJNA
. - No es posible llamar directamente a una función C en un proceso diferente; en su lugar, debe utilizar la comunicación entre procesos (memoria compartida, conductos, sockets, archivos compartidos, etc.) para intercambiar información
- Si bien podría incrustar un intérprete de Java en el backend de Pg y llamar a la función C a través de JNI directamente, realmente no quiero intentar mostrar una GUI de Swing directamente desde dentro de un backend de Pg.
Lo que necesita es un proceso de varias etapas:
-
Recopile los datos que desea capturar en el backend de PostgreSQL. Si tiene la intención de acceder a él desde la misma conexión en la que se creó, puede usar un
palloc
ordinario amortiguaría. De lo contrario, deberá asignar un búfer fuera de la memoria compartida o intercambiar datos mediante el sistema de archivos. -
Acceda a esos datos desde una función C que se ha creado con una interfaz SQL-llamable según la documentación de la función de extensión C de PostgreSQL (arriba)
-
Utilice una conexión PostgreSQL para transferir los datos de su función de interfaz SQL-llamable a su aplicación Java. Descifralo en tu aplicación y muéstralo como desees.
Alternativamente:
-
Requiera que su programa Java, o un agente para él, se ejecute en el mismo sistema que el servidor PostgreSQL y que el agente escriba archivos en una ubicación que se pueda escribir en Pg y que su programa pueda leer.
-
Lea los archivos usando su programa o su agente y procéselos para mostrarlos
Incluso podría hacer que Pg escriba en un socket que su programa está escuchando, pero no lo recomiendo, ya que un bloqueo en su programa podría causar problemas de rendimiento en PostgreSQL.