IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Fonction C -- repertoire d'include


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    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 : 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.

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    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,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] executer fonction dans repertoire different
    Par loicounet dans le forum MATLAB
    Réponses: 2
    Dernier message: 21/01/2010, 16h41
  2. Fonction capacité repertoire et/ou USB
    Par david77320 dans le forum WinDev
    Réponses: 3
    Dernier message: 21/02/2008, 09h25
  3. [Système] Fonction Include avec repertoire
    Par traderpierre dans le forum Langage
    Réponses: 10
    Dernier message: 17/06/2007, 15h44
  4. [FPDF] Erreur après appel d'une fonction avec include
    Par orus8 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 04/11/2005, 10h49
  5. Réponses: 8
    Dernier message: 19/10/2005, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo