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 :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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, .....
J'ai du rajouter "executor/executor.h" en include pour pouvoir utiliser la fonction GetAttributeByName.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } } }
Mais à la compilation j'ai l'erreur suivante :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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'
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part l = GetAttributeByName(*t, "longueur", &isNULL);
Si quelqu'un voit la solution....
Cordialement.
Partager