Jest tu kilka problemów.
Nie możesz wywołać dowolnej funkcji C z SQL
Po pierwsze, nie możesz po prostu wywoływać dowolnych funkcji z SQL, musisz użyć API i makr rozszerzeń języka C PostgreSQL; spójrz na istniejące implementacje funkcji wywoływanych SQL w źródłach, aby uzyskać przykłady.
Zazwyczaj nie musisz modyfikować kodu, rozszerzenia często wystarczają
Po drugie, jeśli chcesz dodać funkcje do rdzenia PostgreSQL, musisz dodać je do src/include/catalog/pg_proc.h
więc są zdefiniowane podczas initdb
.
Jednak znacznie lepiej jest korzystać z odpowiednich funkcji ładowania rozszerzeń:
- http://www.postgresql.org/docs/ bieżący/statyczny/xfunc-c.html
- http://www.postgresql.org/docs/ current/static/extend-pgxs.html
W ten sposób możesz LOAD
moduł rozszerzenia, CREATE FUNCTION
C działa zgodnie z dokumentacją i wywołuje je z SQL.
W Twoim konkretnym przypadku wygląda na to, że tak trzeba zmodyfikować podstawową bazę kodu, ale jest to dość nietypowe, więc zachowam tę radę dla innych.
Funkcja C w backendzie PostgreSQL nie może być wywołana "bezpośrednio" z GUI
Masz GUI Java Swing i wyobrażasz sobie jakoś wywołanie funkcji C w innym procesie, być może nawet na innym hoście.
To nie zadziała z wielu powodów, w tym:
- Java nie może bezpośrednio wywoływać funkcji C bez kodu kleju, takiego jak
JNI
lubJNA
. - Nie jest możliwe bezpośrednie wywołanie funkcji C w innym procesie; zamiast tego musisz użyć komunikacji między procesami (pamięć współdzielona, potoki, gniazda, współdzielone pliki itp.) do wymiany informacji
- Chociaż możesz osadzić interpreter Java w backendzie Pg i wywołać funkcję C przez JNI jakby bezpośrednio, naprawdę nie chcę próbować wyświetlać GUI Swinga bezpośrednio z wnętrza backendu Pg.
Potrzebujesz wieloetapowego procesu:
-
Zbierz dane, które chcesz przechwycić w backendzie PostgreSQL. Jeśli zamierzasz uzyskać do niego dostęp z tego samego połączenia, w którym zostało utworzone, możesz użyć zwykłego
palloc
'd bufora. W przeciwnym razie będziesz musiał przydzielić bufor z pamięci współdzielonej lub wymienić dane przy użyciu systemu plików. -
Uzyskaj dostęp do tych danych z funkcji C, która została utworzona za pomocą interfejsu wywoływanego przez SQL zgodnie z dokumentacją funkcji rozszerzenia PostgreSQL w języku C (powyżej)
-
Użyj połączenia PostgreSQL, aby przesłać dane z funkcji interfejsu, którą można wywołać w języku SQL, do aplikacji Java. Odszyfruj go w swojej aplikacji i wyświetl zgodnie z potrzebami.
Alternatywnie:
-
Wymagaj, aby Twój program Java lub jego agent działał w tym samym systemie, co serwer PostgreSQL i aby agent zapisywał pliki w lokalizacji, w której można zapisać ją na Pg i odczytać z Twojego programu.
-
Odczytaj pliki za pomocą programu lub jego agenta i przetwórz je do wyświetlenia
Mógłbyś nawet mieć możliwość zapisu Pg do gniazda, na którym nasłuchuje twój program, ale nie polecam tego, ponieważ zablokowanie w twoim programie spowodowałoby problemy z wydajnością w PostgreSQL.