PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Chiamare una funzione definita dall'utente situata in postgres.c in postgreSQL utilizzando una GUI definita da netbeans

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:

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