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 02/07/2008, 11h12   #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] Visual C++ 6.0

Bonjour à tous,

suite à un précédent post sur ce forum, j'aimerai développé des fonctions C pour ma BDD. Je dois donc créé une bibliothèque partagée (extension .so).

Je voulais savoir si ces bibliothèques sont supporté par Win32 (ma question révéle sûrement mon manque de compréhension à ce sujet)...

Si c'est le cas, est-il possible de développer une bibliothèque C partagée sous un environnement Win32 en utilisant Visual C++ ?

Quels type de projet dois-je choisir ? Quelles options passer au compilo ?

Merci à tous.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 12h23   #2
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
Bonjour
De la .so chez Bill ???
Vous cherchez le mouton a cinq pattes...
Cordialement
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 15h15   #3
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 Correctif

Bonjour bustaf.

Suite au lien que tu m'avais donné pour l'écriture des fonctions C sous postgresql j'ai bêtement cherché à appliquer la méthode pour Linux or je suis sous Bill ... enfin façon de parler ;-)

Peux-tu m'aider un peu ?

En fait j'imagines qu'il faut que je crée une DLL (pas de so donc) partagée qui contiennent mes fonctions C, puis que je l'appelles depuis postgre.

Mais est-ce que cela fonctionnera ? La syntaxe d'import sera-t-elle la même etc...

Aurais-tu par le plus grand des hazards de la documentation ou des liens (le précédent était super ormis qu'il est dédiés à tout les SE sauf Bill) qui justement explique comment faire les mêmes manip mais sous SE Bill -création de fonction C- ?

J'ai beau fouiné partout je ne trouve pas et partir à l'aventure (créer une dll puis voir si je peux l'importer) me semble un peu risqué au niveau du rapport réussite/temps passé.

En plus j'ai un peu de mal à compiler ma dll... mon #include 'postgre.h' engendre pas mal d'erreur de fichiers non trouvé... dois-je ajouter des bibliothèques statiques pour compiler ma dll ?

Cordialement,
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 16h30   #4
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 Suite ...

Re,

j'ai un peu avancé mais au final je bloque.

J'ai fait une DLL dont je donne le code ici.

dll.h :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef _DLL_H_
#define _DLL_H_
 
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
 
 
DLLIMPORT int add_one(int arg);
 
 
#endif /* _DLL_H_ */
dllmain.c :
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
36
37
38
39
40
/* Replace "dll.h" with the name of your header */
#include "postgres.h"
#include <string.h>
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
 
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
 
DLLIMPORT int add_one(int arg)
{
    RETURN arg +1;
}
 
 
BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;
 
      case DLL_PROCESS_DETACH:
        break;
 
      case DLL_THREAD_ATTACH:
        break;
 
      case DLL_THREAD_DETACH:
        break;
    }
 
    /* Returns TRUE on success, FALSE on failure */
    RETURN TRUE;
}
Tout compile. Je mets la dll, le .a, et tout le reste (même le source!) dans un repertoire direct dans $libdir.

Enfin quand je cherche à créer ma fonction C sous postgresql :
Code :
1
2
3
4
CREATE OR REPLACE FUNCTION _add_one(integer) RETURNS integer AS
'$libdir/postgresql_fonctionC/test1', 'add_one'
  LANGUAGE 'c' IMMUTABLE STRICT;
ALTER FUNCTION _add_one(integer) OWNER TO "postgres";
PostGreSQL me renvoie :
Code :
1
2
3
4
5
6
7
8
 
ERROR:  incompatible library "C:/Program Files/PostgreSQL/8.2/lib/postgresql_fonctionC/test1.dll": missing magic block
ASTUCE : Extension libraries are required TO USE the PG_MODULE_MAGIC macro.
 
********** Erreur **********
 
ERROR: incompatible library "C:/Program Files/PostgreSQL/8.2/lib/postgresql_fonctionC/test1.dll": missing magic block
État SQL :XX000
Pourtant ce magic bloc est bien dans le code source ma dll ?
Là je vois pas mais bon c'est pas la première fois ni la dernière...

Peut-être que cela vient des options du compilo (je les ai laissé par défaut et ne suis pas sûr que je crée bien une librairie partagée) ou encore du fait que j'ai juste modifié (sans trop maitrisé) l'ossature de programme fourni par Dev Cpp...

Si qq peut m'aider je prends.

Merci.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 16h44   #5
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
Bonjour
Je veux bien vous aider mais le problème je n'ai pas de station Bill sous la
main pour vous répondre de suite.. avec un exemple precis.
(Bill n'a aucune connotation péjorative dans mon expression j'apprécie grandement les poduits Microsoft)

essayez sans definir

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

Cordialement
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 17h21   #6
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 Je suis le post...

En fait j'ai déjà essayé (faute d'oubli) d'enlever le 'magic bloc' comme il l'appelle mais le résultat reste le même.

Du coup je suivrai ce post au cas où vous ayez le temps d'y regarder de plus près.

En attendant je vais essayer différentes manips.

PS : je n'ai pas non plus d'a priori sur le système windows (c'est l'OS sur lequel je passe 95 % de mon temps) (ormis quand je vois le prix des licences !!!! et l'acharnement des hackers sur cet OS en particulier) mais je regrette juste la difficulté parfois rencontré lorsqu'on utilise un logiciel initialement développé pour une autre plateforme. Ainsi, j'ai beaucoup de mal à trouver de la doc pour l'utilisation de postgre pour win spécifiquement et les tutoriaux sont presque inexistants. Ce qui est génant c'est qu'un développeur et souvent amené à se spécitialisé sur un système particulier. En quelque mots c'est plus le cloisonnement de chaque OS qui me gène. Mais peut-être qu'avec l'expérience les choses me paraîtront plus claires.
VASAPANCH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 17h21   #7
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
J'ai regardé sur le net
Le problème peut se produire si la version de la lib utilisée pour la compi est differente de celle utilisée dans la version executable .
????
Cordialement.
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 18h17   #8
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 !!!!!!!!!!!!!!

Je suis fou de joie bustaf !!!

Du fait que tu m'as tenu en haleine j'ai cherché chrché et euréka j'ai compris que pour utiliser de C fonctions avec win il faut ABSOLUMENT utiliser la version V1 d'édition des fonctions.
Du coup tout roule : j'ai une fonction add_one qui ajoute 1 à une donnée !!!

C'est bidon mais faut avoué qu'avant de rentrer à la maison ça le fait...

Merci pour tout. Ne pas être seul dans une galère est très encourageant.
Si ça t'intéresse je poste le code. C'est un bon programme d'exemple pour créer une fonction C postgre sous Windows avec DevCpp.

Merci et re merci encore.

Bonne soirée.

PS: si tu veux les codes n'hésite pas !
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 03h43.


 
 
 
 
Partenaires

Hébergement Web