PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 11/05/2012 19:43:17

fonction en langage C

Salut
Je cherche a faire une fonction en langage C sur postgresql. J'ai suivie cette   démarche .
Je voulais l'adapter à l'exemple[/] de la doc postgresql...

#include "postgres.h"
#include <string.h>
#include "fmgr.h"
#include "utils/geo_decls.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

/* par valeur */

PG_FUNCTION_INFO_V1(add_one);
         
Datum
add_one(PG_FUNCTION_ARGS)
{
    int32   arg = PG_GETARG_INT32(0);

    PG_RETURN_INT32(arg + 1);
}

/* par référence, longueur fixe */

PG_FUNCTION_INFO_V1(add_one_float8);

Datum
add_one_float8(PG_FUNCTION_ARGS)
{
    /* La macro pour FLOAT8 cache sa nature de passage par référence. */
    float8   arg = PG_GETARG_FLOAT8(0);

    PG_RETURN_FLOAT8(arg + 1.0);
}

PG_FUNCTION_INFO_V1(makepoint);

Datum
makepoint(PG_FUNCTION_ARGS)
{
    /* Ici, la nature de passage par référence de Point n'est pas cachée. */
    Point     *pointx = PG_GETARG_POINT_P(0);
    Point     *pointy = PG_GETARG_POINT_P(1);
    Point     *new_point = (Point *) palloc(sizeof(Point));

    new_point->x = pointx->x;
    new_point->y = pointy->y;
       
    PG_RETURN_POINT_P(new_point);
}

/* par référence, longueur variable */

PG_FUNCTION_INFO_V1(copytext);

Datum
copytext(PG_FUNCTION_ARGS)
{
    text     *t = PG_GETARG_TEXT_P(0);
    /*
     * VARSIZE est la longueur totale de la structure en octets.
     */
    text     *new_t = (text *) palloc(VARSIZE(t));
    SET_VARSIZE(new_t, VARSIZE(t));
    /*
     * VARDATA est un pointeur vers la région de données de la structure.
     */
    memcpy((void *) VARDATA(new_t), /* destination */
           (void *) VARDATA(t),     /* source */
           VARSIZE(t) - VARHDRSZ);    /* nombre d'octets */
    PG_RETURN_TEXT_P(new_t);
}

PG_FUNCTION_INFO_V1(concat_text);

Datum
concat_text(PG_FUNCTION_ARGS)
{
    text  *arg1 = PG_GETARG_TEXT_P(0);
    text  *arg2 = PG_GETARG_TEXT_P(1);
    int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
    text *new_text = (text *) palloc(new_text_size);

    SET_VARSIZE(new_text, new_text_size);
    memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1) - VARHDRSZ);
    memcpy(VARDATA(new_text) + (VARSIZE(arg1) - VARHDRSZ),
           VARDATA(arg2), VARSIZE(arg2) - VARHDRSZ);
    PG_RETURN_TEXT_P(new_text);
}

Mais à chaque fois qu'une "#include..." apparait dans un fichier ".h" de postgresql VS2010 me dit qu'il ne trouve pas le fichier.
Je suis débutant en C et mon objectif est de récupérer (dans postgresql) les données d'une bd ACCESS par ODBC avec la DLL en C. Pour le moment je cherche juste les bases de compilation d'une fonction en C sur postgresql.
Un grand merci d'avance.

Hors ligne

#2 11/05/2012 19:52:59

gleu
Administrateur

Re : fonction en langage C

Le mieux est de copier un des modules contrib déjà existants, par exemple l'adminpack. Pour les compiler, il faut procéder comme pour le reste de PostgreSQL (outil build du répertoire src/tools/mvsc) : http://docs.postgresql.fr/9.1/install-windows.html

Hors ligne

#3 11/05/2012 22:22:43

Re : fonction en langage C

Salut et merci de la réponse.
Cela parait plus ardu que je ne le pensais. Est-ce obligatoire (en plus du SDK de microsoft) d’avoir les autres (perle, bison…).
Je viens de télécharger la source de PostgreSQL. Cela ne pose-t-il pas de problème avec l’installation déjà existante ?
Je continue les recherches.

Hors ligne

#4 12/05/2012 00:44:38

gleu
Administrateur

Re : fonction en langage C

Est-ce obligatoire (en plus du SDK de microsoft) d’avoir les autres (perle, bison…).

Comme dit dans le document, Perl est obligatoire (le script Build est en Perl). Bison n'est pas obligatoire si vous récupérez les sources packagées. Il l'est si vous récupérez PostgreSQL à partir du git.

Je viens de télécharger la source de PostgreSQL. Cela ne pose-t-il pas de problème avec l’installation déjà existante ?

Non. Il ne s'agit pas de l'installer, il s'agit seulement de le compiler.

Hors ligne

#5 15/05/2012 14:30:07

Re : fonction en langage C

Salut
Je continue de chercher (VS2008, VS2010, codeblock, developpez.com, google, youtube ...) mais rien pour le moment ne donne!
Pour VS 2010 j'ai copier le dossier "include" de la source. Cela résout le problème d'inclusion d'en-tète. Mais j'ai un autre problème dont voici le message d'erreur...

Erreur	1	error LNK2019: symbole externe non résolu "unsigned int __cdecl Float8GetDatum(double)" (?Float8GetDatum@@YAIN@Z) 
référencé dans la fonction "unsigned int __cdecl add_one_float8(struct FunctionCallInfoData *)" (?add_one_float8@@YAIPAUFunctionCallInfoData@@@Z)
C:\Users\DIAKITE\Documents\Visual Studio 2010\Projects\myfunc\myfunc\mesfnC.obj	myfunc

J'ai aussi tenté avec un fonction perle. "Create extension" passe mais à chaque fois que j'essaye de créer une fonction en perle la connexion se coupe et le serveur (le service postgresql) s'arrête. Je pensais à un problème de droit, j'ai alors pris le user postgres de win comme administrateur mais rien ne change.
Mon environnement: win7 pro, pg9.1.3, activeperle 5.14.2.
Merci d'avance.

Dernière modification par alassanediakite (15/05/2012 14:32:00)

Hors ligne

#6 16/05/2012 21:32:56

gleu
Administrateur

Re : fonction en langage C

Avez-vous lu la documentation disponible sur http://docs.postgresql.fr/9.1/install-windows.html ?

En fait, c'est assez simple. Vous installez ActivePerl (c'est un installeur Windows standard), vous récupérez les sources de PostgreSQL et vous compilez PostgreSQL comme expliqué sur ce lien. Une fois que vous avez fait ça, j'explique le reste. Rien ne sert à expliquer le reste tant que cela n'est pas fait.

Hors ligne

#7 17/05/2012 14:45:21

Re : fonction en langage C

Salut et merci de l'accompagnement.
Mon repertoire de la source ne possède pas "config.pl" mais seulement "confgi_default.pl".
Dans "config_default.pl" j'ai changé

Perl=>undef, 

en

perl=>'C:\Program Files\Perl\bin',

.
Voici ce que me donne les tentatives avec la ligne de commande de VS2008
Merci d'avance.

Hors ligne

#8 17/05/2012 16:29:17

gleu
Administrateur

Re : fonction en langage C

config_default.pl est la configuration par défaut. Vous pouvez le modifier mais il est préférable de créer le fichier config.pl et d'y ajouter votre configuration spécifique.

Mais bon, modifier config_default.pl doit aussi fonctionner.

Pour lancer le script build, vous devez être dans le répertoire qui contient ce script. Donc utilisez cd pour vous y déplacer, puis lancer la commande build exactement comme indiqué dans la documentation.

Hors ligne

#9 17/05/2012 21:38:48

Re : fonction en langage C

Salut
Les choses avancent.
J'ai pu me placer sur le répertoire. Mais j'ai le message d'erreur:"Unable to vcbuild version from first line of utput! at solution.pm line 71".
Voici le code de la ligne 66 0 72 du fichier solution.pm... (à titre indicatif, sinon j'y connais rien en ce langage!!!)

 open(P,"vcbuild /? |") || die "vcbuild command not found";
    my $line = <P>;
    close(P);
    if ($line !~ /^Microsoft\s*\(R\) Visual C\+\+ [^-]+ - \D+(\d+)\.00\.\d+/)
    {
        die "Unable to determine vcbuild version from first line of output!";
    }

J'ai vs2010 et vs2008 installé; SDK 6.0A et 7.0A. Est-ce là le problème?
Merci d'avance.

Hors ligne

#10 17/05/2012 23:26:02

gleu
Administrateur

Re : fonction en langage C

Il suffit de lire la documentation. Elle indique que VC++ 2005 et VC++ 2008 sont supportés, mais pas au-dessus. Donc je pense que c'est VC++ 2010 qui répond. Faites en sorte que ce soit VC++ 2008 et ça devrait mieux aller.

Hors ligne

#11 18/05/2012 14:11:01

Re : fonction en langage C

Salut
J'ai VS 2008 sur machine virtuelle. Le même message d'erreur apparait:"unable to determine vcbuild version..."
Le problème peut-il venir du "PATH"? Ou comment faire le build en précisant la version du build? Sachant que les deux commandes "... build" et "... build mkvcbuild.pl" donnent la même erreur.
Merci d'avance.
PS: je serai absent pour deux ou trois jours. Toutes mes excuses.

Dernière modification par alassanediakite (18/05/2012 14:13:17)

Hors ligne

#12 18/05/2012 21:22:07

gleu
Administrateur

Re : fonction en langage C

Que vous donne la commande "vcbuild /?" ?

Hors ligne

#13 22/05/2012 15:59:04

Re : fonction en langage C

Salut
Je ne déchiffre pas bien ce qu'il me dit. J'ai tenter avec "msbuild.exe" il me dit que le chemin d'accès spécifié est introuvable. J'ai tenter avec VC++ 2005 express, avec VS 2008 sous XP SP3 mais rien ne passe.
J'abandonne pour le moment!!! J'attends les prochaines versions pour voir s'il y a une facilitation pour nous qui somme habitués à "clicker"
Grand merci pour l'aide.

Dernière modification par alassanediakite (22/05/2012 17:19:42)

Hors ligne

Pied de page des forums