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 : 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, .....
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
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 : 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'
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
 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.