PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wywołanie funkcji zdefiniowanej przez użytkownika znajdującej się w postgres.c w postgreSQL przy użyciu GUI zdefiniowanego przez netbeans

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ń:

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmodyfikować pole za pomocą jsonPath w PostgreSQL?

  2. Zastąp ciąg innym ciągiem z listy w zależności od wartości

  3. Wykonuję n nie. procesów, gdzie n może wynosić od 5 do 50. Każdy proces wykonuje wiele operacji dml na postgres

  4. Usuń duplikaty z tabeli i ponownie połącz wiersze z odnośnikami do nowego wzorca

  5. Zliczanie liczby wystąpień podciągu w ciągu w PostgreSQL