sql >> Base de Datos >  >> RDS >> PostgreSQL

Llamar a una función definida por el usuario ubicada en postgres.c en postgreSQL usando una GUI definida por netbeans

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:

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 o JNA .
  • 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.