Há vários problemas aqui.
Você não pode chamar qualquer função C do SQL
Primeiro, você não pode simplesmente chamar funções arbitrárias do SQL, você deve usar as APIs e macros de extensão C do PostgreSQL; veja as implementações existentes de funções que podem ser chamadas por SQL nas fontes para obter exemplos.
Você geralmente não precisa modificar o código principal, as extensões geralmente são suficientes
Segundo, se você deseja adicionar funções ao núcleo do PostgreSQL, você deve adicioná-las a
src/include/catalog/pg_proc.h
então eles são definidos durante o initdb
. É muito melhor, no entanto, usar as instalações de carregamento de extensão adequadas:
- http://www.postgresql.org/docs/ current/static/xfunc-c.html
- http://www.postgresql.org/docs/ current/static/extend-pgxs.html
Desta forma você pode
LOAD
um módulo de extensão, CREATE FUNCTION
as funções C de acordo com os documentos e chame-as do SQL. No seu caso específico, parece que você faz precisa modificar a base de código principal, mas isso é bastante incomum, então estou preservando este conselho para outros.
Uma função C no backend do PostgreSQL não pode ser chamada "diretamente" de uma GUI
Você tem uma GUI Java Swing e imagina de alguma forma chamar uma função C em um processo diferente, possivelmente até em um host diferente dele.
Isso não funcionará por vários motivos, incluindo:
- Java não pode chamar funções C diretamente sem código de cola como
JNI
ouJNA
. - Não é possível chamar uma função C em um processo diferente diretamente; você deve usar comunicação entre processos (memória compartilhada, pipes, soquetes, arquivos compartilhados, etc) para trocar informações
- Embora você possa incorporar um interpretador Java no backend Pg e chamar a função C via JNI meio que diretamente, você realmente não quero tentar exibir uma GUI Swing diretamente de dentro de um backend Pg.
O que você precisa é de um processo de vários estágios:
-
Colete os dados que deseja capturar no backend do PostgreSQL. Se você pretende acessá-lo da mesma conexão em que foi criado, você pode usar umpalloc
comum 'd buffer. Caso contrário, você precisará alocar um buffer fora da memória compartilhada ou trocar dados usando o sistema de arquivos.
-
Acesse esses dados de uma função C que foi criada com uma interface que pode ser chamada por SQL conforme a documentação da função de extensão C do PostgreSQL (acima)
-
Use uma conexão PostgreSQL para transferir os dados de sua função de interface que pode ser chamada por SQL para seu aplicativo Java. Decodifique-o em seu aplicativo e exiba-o conforme desejado.
Alternativamente:
-
Exija que seu programa Java, ou um agente para ele, seja executado no mesmo sistema que o servidor PostgreSQL e que o agente grave arquivos em um local gravável em Pg e legível por seu programa.
-
Leia os arquivos usando seu programa ou seu agente e processe-os para exibição
Você pode até fazer o Pg gravar em um soquete em que seu programa está ouvindo, mas eu não recomendo isso, pois um travamento em seu programa causaria problemas de desempenho no PostgreSQL.