Hier gibt es mehrere Probleme.
Sie können nicht irgendeine C-Funktion von SQL aufrufen
Erstens können Sie nicht einfach beliebige Funktionen von SQL aus aufrufen, Sie müssen die C-Erweiterungs-APIs und Makros von PostgreSQL verwenden. Sehen Sie sich die vorhandenen Implementierungen von SQL-aufrufbaren Funktionen in den Quellen für Beispiele an.
In der Regel müssen Sie den Kerncode nicht ändern, Erweiterungen sind oft ausreichend
Zweitens, wenn Sie dem PostgreSQL-Kern Funktionen hinzufügen möchten, müssen Sie sie zu src/include/catalog/pg_proc.h
hinzufügen sie werden also während initdb
definiert .
Es ist jedoch viel besser, die richtigen Möglichkeiten zum Laden von Erweiterungen zu verwenden:
- http://www.postgresql.org/docs/ current/static/xfunc-c.html
- http://www.postgresql.org/docs/ current/static/extend-pgxs.html
Auf diese Weise können Sie LOAD
ein Erweiterungsmodul, CREATE FUNCTION
die C-Funktionen gemäß der Dokumentation und rufen Sie sie aus SQL auf.
In Ihrem speziellen Fall sieht es so aus, als ob Sie es tun müssen die Kerncodebasis ändern, aber das ist ziemlich ungewöhnlich, also hebe ich diesen Rat für andere auf.
Eine C-Funktion im PostgreSQL-Backend kann nicht "direkt" von einer GUI aus aufgerufen werden
Sie haben eine Java-Swing-GUI und stellen sich vor, irgendwie eine C-Funktion in einem anderen Prozess, möglicherweise sogar auf einem anderen Host, davon aufzurufen.
Dies wird aus einer Reihe von Gründen nicht funktionieren, darunter:
- Java kann C-Funktionen ohne Glue-Code wie
JNI
nicht direkt aufrufen oderJNA
. - Es ist nicht möglich, eine C-Funktion direkt in einem anderen Prozess aufzurufen; Sie müssen stattdessen die Kommunikation zwischen Prozessen (gemeinsam genutzter Speicher, Pipes, Sockets, gemeinsam genutzte Dateien usw.) verwenden, um Informationen auszutauschen
- Du könntest zwar einen Java-Interpreter in das Pg-Backend einbetten und die C-Funktion über JNI quasi direkt aufrufen, aber wirklich Ich möchte nicht versuchen, eine Swing-GUI direkt aus einem Pg-Backend heraus anzuzeigen.
Was Sie brauchen, ist ein mehrstufiger Prozess:
-
Sammeln Sie die Daten, die Sie erfassen möchten, im PostgreSQL-Backend. Wenn Sie beabsichtigen, über dieselbe Verbindung darauf zuzugreifen, in der es erstellt wurde, können Sie einen gewöhnlichen
palloc
verwenden würde puffern. Andernfalls müssen Sie einen Puffer aus dem gemeinsamen Speicher zuweisen oder Daten über das Dateisystem austauschen. -
Greifen Sie auf diese Daten über eine C-Funktion zu, die mit einer SQL-aufrufbaren Schnittstelle gemäß der Dokumentation der C-Erweiterungsfunktion von PostgreSQL (oben) erstellt wurde
-
Verwenden Sie eine PostgreSQL-Verbindung, um die Daten von Ihrer SQL-aufrufbaren Schnittstellenfunktion an Ihre Java-Anwendung zu übertragen. Entschlüsseln Sie es in Ihrer Anwendung und zeigen Sie es wie gewünscht an.
Alternativ:
-
Erfordern Sie, dass Ihr Java-Programm oder ein Agent dafür auf demselben System wie der PostgreSQL-Server ausgeführt wird, und lassen Sie den Agent Dateien an einem Ort schreiben, der für Pg beschreibbar und für Ihr Programm lesbar ist.
-
Lesen Sie die Dateien mit Ihrem Programm oder seinem Agenten und bereiten Sie sie für die Anzeige auf
Sie könnten Pg sogar in einen Socket schreiben lassen, auf dem Ihr Programm lauscht, aber ich empfehle dies nicht, da ein Blockieren in Ihrem Programm Leistungsprobleme in PostgreSQL verursachen würde.