PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Appel d'une fonction définie par l'utilisateur située dans postgres.c dans postgreSQL à l'aide d'une interface graphique définie par netbeans

Il y a plusieurs problèmes ici.

Vous ne pouvez pas appeler n'importe quelle fonction C depuis SQL

Premièrement, vous ne pouvez pas simplement appeler des fonctions arbitraires à partir de SQL, vous devez utiliser les API et les macros d'extension C de PostgreSQL ; regardez les implémentations existantes des fonctions appelables SQL dans les sources pour des exemples.

Vous n'avez généralement pas besoin de modifier le code principal, les extensions sont souvent suffisantes

Deuxièmement, si vous souhaitez ajouter des fonctions au cœur de PostgreSQL, vous devez les ajouter à src/include/catalog/pg_proc.h ils sont donc définis pendant initdb .

Il est toutefois préférable d'utiliser les fonctions de chargement d'extension appropriées :

De cette façon, vous pouvez LOAD un module d'extension, CREATE FUNCTION les fonctions C selon les docs, et les appeler depuis SQL.

Dans votre cas spécifique, il semble que vous faites besoin de modifier la base de code principale, mais c'est assez inhabituel, donc je préserve ce conseil pour les autres.

Une fonction C dans le backend PostgreSQL ne peut pas être appelée "directement" depuis une interface graphique

Vous avez une interface graphique Java Swing et vous envisagez d'appeler d'une manière ou d'une autre une fonction C dans un processus différent, peut-être même sur un hôte différent.

Cela ne fonctionnera pas pour un tas de raisons, notamment :

  • Java ne peut pas appeler directement les fonctions C sans code glue comme JNI ou JNA .
  • Il n'est pas possible d'appeler directement une fonction C dans un processus différent ; vous devez plutôt utiliser la communication inter-processus (mémoire partagée, tubes, sockets, fichiers partagés, etc.) pour échanger des informations
  • Bien que vous puissiez intégrer un interpréteur Java dans le backend Pg et appeler la fonction C via JNI en quelque sorte directement, vous vraiment ne voulez pas essayer d'afficher une interface graphique Swing directement depuis un backend Pg.

Ce qu'il vous faut, c'est un processus en plusieurs étapes :

  • Collectez les données que vous souhaitez capturer dans le backend PostgreSQL. Si vous avez l'intention d'y accéder à partir de la même connexion que celle dans laquelle il a été créé, vous pouvez utiliser un palloc ordinaire 'd tampon. Sinon, vous devrez allouer un tampon hors de la mémoire partagée ou échanger des données à l'aide du système de fichiers.

  • Accédez à ces données à partir d'une fonction C qui a été créée avec une interface appelable SQL conformément à la documentation de la fonction d'extension C de PostgreSQL (ci-dessus)

  • Utilisez une connexion PostgreSQL pour transférer les données de votre fonction d'interface appelable SQL vers votre application Java. Décodez-le dans votre application et affichez-le comme vous le souhaitez.

Alternativement :

  • Exigez que votre programme Java, ou un agent pour celui-ci, s'exécute sur le même système que le serveur PostgreSQL et que l'agent écrive des fichiers dans un emplacement inscriptible pour Pg et lisible par votre programme.

  • Lisez les fichiers à l'aide de votre programme ou de son agent et traitez-les pour les afficher

Vous pouvez même demander à Pg d'écrire sur un socket sur lequel votre programme écoute, mais je ne le recommande pas car un blocage de votre programme entraînerait des problèmes de performances dans PostgreSQL.