Documentation PostgreSQL 9.0.23 > Programmation serveur > Étendre SQL > Utiliser le langage C++ | |
Interfacer des extensions d'index | Déclencheurs (triggers) |
Il est possible d'utiliser un compilateur C++ pour construire des extensions PostgreSQL™ en suivant les règles suivantes :
Toutes les fonctions utilisées par le serveur doivent présentées une interface C au serveur ; ces fonctions C peuvent ensuite appeler des fonctions C++. Par exemple, le lien extern C est requis pour les fonctions utilisées par le serveur. Il est aussi nécessaire que chaque fonction passée comme pointeur entre le serveur et le code C++.
Libérer la mémoire en utilisant la méthode appropriée de libération. Par exemple, la majorité de la mémoire serveur est allouée en utilisant la fonction palloc(), donc utilisez pfree() pour la libérer. Utiliser la fonction delete() de C++ pour ces cas échouera.
Empêcher la propagation des exceptions dans le code C (utilisez un bloc capable de récupérer toutes les exceptions au plus haut niveau des fonctions extern C). Ceci est nécessaire même si le code C++ ne renvoie aucune exceptions car les événements comme les manques de mémoire renvoient toujours des exceptions. Toute exception doit être récupérée et une erreur appropriée doit être envoyée à l'interface C. Si possible, compilez C++ avec l'option -fno-exceptions pour complètement éliminer les exceptions ; dans ce cas, vous devez vérifier les erreurs dans votre code C++, par exemple vérifier le renvoi de NULL suite à l'appel de la méthode new().
S'il doit y avoir des appels aux fonctions du serveur à partir du code C++, assurez-vous que la pile d'appels C++ contient seulement l'ancienne structure de données (POD). Cela est nécessaire car des erreurs du serveur génèrent un appel distant à longjmp() qui ne dépile par proprement la pile d'appels C++ avec les objets autre que POD.
Pour résumé, il est préférable de placer le code C++ derrière un mur de fonctions extern C qui font l'interface avec le serveur, et d'éviter les fuites d'exception, de mémoire et de pile d'appels.