Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/07/2008, 10h57   #1
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut 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.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2008, 11h03   #2
Membre du Club
 
Inscription : avril 2008
Messages : 89
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 89
Points : 58
Points : 58
Par défaut Résolu

Par le plus grand des hazards j'ai tenté d'ajouter "libpostgres.a" et ça marche ...
Enocre fallait-il le savoir...
Désolé pour ce post intempestif.

Cordialement,
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h11.


 
 
 
 
Partenaires

Hébergement Web