Fonction C -- repertoire d'include
Bonjour à tous,
je cherche à tester les capacités des fonctions C sous Postgre.
Dans un premier temps j'ai réussi à créer une dll relativement simple dont j'apelle les différents éléments fonctionnels au sein de différentes fonction C sous Postgre. Tout fonctionne bien quand je travaille avec des valeurs simples en entrée et en sortie.
Je développe sous Windows XP avec DevCpp. J'utilise donc la version 1 de définition des fonction C. Pour inclure les fonctions fournies par Postgre je dois mettre les includes suivant : "postgres.h" et "fmgr.h". Pour compiler mon projet j'ajoutes les répertoires d'inclusion suivant : "\include\server" et "\include\server\port\win32".
Comme je l'ai déjà indiqué, à ce stade tout fonctionne. Ma dll compile et je peux rappatrier chacun de ses éléments fonctionnels dans des fonctions C de Postgre.
Exemple de code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include "postgres.h"
#include <string.h>
#include "fmgr.h"
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
PG_FUNCTION_INFO_V1(restruct_voie);
DLLIMPORT Datum restruct_voie(PG_FUNCTION_ARGS)
{
chdir("D:\\Echanges\\mdp_ta_init_lib_c\\RestructVoie");
system("FBM_RestructVoie.BAT");
chdir("C:\\Program Files\\PostgreSQL\\8.2\\data");
PG_RETURN_NULL();
}
etc, ..... |
Par contre j'ai essayé de suivre l'exemple fourni par la documentation pour gérer les records en entrée et là j'ai un soucis. Mon code ressemble à ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include "postgres.h"
#include <string.h>
#include "fmgr.h"
#include "executor/executor.h"
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
PG_FUNCTION_INFO_V1(test_record);
DLLIMPORT Datum test_record(PG_FUNCTION_ARGS)
{
HeapTupleHeader *t = (HeapTupleHeader *) PG_GETARG_HEAPTUPLEHEADER(0);
int32 limite = PG_GETARG_INT32(1);
bool isNULL;
Datum l;
int32 longueur;
l = GetAttributeByName(t, "longueur", &isNULL);
if (isNULL)
{ PG_RETURN_BOOL(false); }
else
{
longueur = DatumGetInt32(l);
if (longueur > limite)
{ PG_RETURN_BOOL(false); }
else
{ PG_RETURN_BOOL(true); }
}
} |
J'ai du rajouter "executor/executor.h" en include pour pouvoir utiliser la fonction GetAttributeByName.
Mais à la compilation j'ai l'erreur suivante :
Code:
1 2 3
| dllmain.c [Warning] passing arg 1 of `GetAttributeByName' from incompatible pointer type
[Linker error] undefined reference to `pg_detoast_datum'
[Linker error] undefined reference to `GetAttributeByName' |
Or cette fonction est bien définie dans "executor.h". De plus il la reconnait vu qu'il m'indique un warning que je peux faire disparaitre en respectant scrupuleusement le prototype défini dans "executor.h" :
Code:
l = GetAttributeByName(*t, "longueur", &isNULL);
Donc pourquoi ce problème de link ? Est-ce un lien dynamique qui manque car le prototype de la fonction lui est bel et bien reconnu ? Y-a-t-il par le plus grand des hazards une bibliothèque qu'il faille inclure ? Et d'où vient ce message d'erreur concernant "pg_detoast_datum" ? Je ne retrouve cette fonction nul part dans mes fichiers d'include.
Si quelqu'un voit la solution....
Cordialement.