sql >> Databáze >  >> RDS >> PostgreSQL

Volání uživatelem definované funkce umístěné v postgres.c v postgreSQL pomocí GUI definovaného pomocí netbeans

Problémů je zde několik.

Z SQL nemůžete volat jen jakoukoli funkci C

Za prvé, nemůžete jen volat libovolné funkce z SQL, musíte použít API a makra rozšíření PostgreSQL C; podívejte se na příklady existujících implementací funkcí volání SQL ve zdrojích.

Většinou nemusíte upravovat základní kód, často postačí rozšíření

Za druhé, pokud chcete přidat funkce do jádra PostgreSQL, musíte je přidat do src/include/catalog/pg_proc.h takže jsou definovány během initdb .

Mnohem lepší je však použít správné možnosti načítání rozšíření:

Tímto způsobem můžete LOAD rozšiřující modul CREATE FUNCTION C funguje podle dokumentů a volá je z SQL.

Ve vašem konkrétním případě to vypadá, že děláte potřeba upravit základní kódovou základnu, ale to je docela neobvyklé, takže tuto radu nechávám pro ostatní.

Funkci C v backendu PostgreSQL nelze volat "přímo" z GUI

Máte grafické uživatelské rozhraní Java Swing a představujete si, že z něj nějakým způsobem voláte funkci C v jiném procesu, možná dokonce na jiném hostiteli.

Toto nebude fungovat z mnoha důvodů, včetně:

  • Java nemůže přímo volat funkce C bez spojovacího kódu, jako je JNI nebo JNA .
  • Není možné přímo volat funkci C v jiném procesu; místo toho musíte k výměně informací používat meziprocesovou komunikaci (sdílená paměť, kanály, sokety, sdílené soubory atd.).
  • I když můžete do backendu Pg vložit interpret Javy a zavolat funkci C přes JNI tak trochu přímo, opravdu nechci se pokoušet zobrazovat Swing GUI přímo z backendu Pg.

Potřebujete vícefázový proces:

  • Sbírejte data, která chcete zachytit, v backendu PostgreSQL. Pokud k němu máte v úmyslu přistupovat ze stejného připojení, ve kterém je vytvořen, můžete použít obyčejný palloc 'd buffer. V opačném případě budete muset přidělit vyrovnávací paměť ze sdílené paměti nebo vyměnit data pomocí systému souborů.

  • Získejte přístup k těmto datům z funkce C, která byla vytvořena pomocí rozhraní s možností volání SQL podle dokumentace funkce rozšíření C PostgreSQL (výše)

  • Použijte připojení PostgreSQL k přenosu dat z funkce rozhraní s možností volání SQL do vaší Java aplikace. Dekódujte jej ve své aplikaci a zobrazte jej podle potřeby.

Alternativně:

  • Požadujte, aby váš Java program nebo jeho agent běžel na stejném systému jako PostgreSQL server a aby agent zapisoval soubory do umístění zapisovatelné do Pg a čitelné pro váš program.

  • Přečtěte si soubory pomocí svého programu nebo jeho agenta a zpracujte je pro zobrazení

Můžete dokonce nechat Pg zapisovat do soketu, na kterém váš program poslouchá, ale nedoporučuji to, protože zastavení vašeho programu by způsobilo problémy s výkonem v PostgreSQL.




  1. Vyhněte se JTextField setText opakování v programu

  2. Když do tabulky MySQL VLOŽÍM více řádků, zvýší se ID pokaždé o 1?

  3. Simulace ORDER BY FIELD() MySQL v Postgresql

  4. Oracle - sql_text zkrácen na 20 znaků pro příkazy CREATE/ALTER/GRANT?