PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Chamando uma função definida pelo usuário localizada em postgres.c no postgreSQL usando uma GUI definida pelo netbeans


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:

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 ou JNA .
  • 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 um palloc 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.