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

#1 06/07/2010 09:06:11

nanou86
Membre

[débutant] utilisation d'une dll C

Bonjour,

Je suis bloqué depuis 2 jours sur un "petit" problème...
Pour vous l'expose :
Je dois déterminer si il est possible de faire des appels externes à une dll déjà existante (écrite en C) à partir de PostgreSQL...

La base de données en question doit en fait permettre l'enregistrement de données prévenant d'un logiciel. Ces données étaient auparavant sauvegardées dans des fichiers. Et la structure de la base de données a été calquée à la structure de ces fichiers.
Je vais maintenant essayer de peupler la base avec ces fichiers (donc transposer ce qu'il y a dans les fichiers pour le repartir dans les différentes tables)
Il s'agit donc maintenant de pouvoir utiliser les fonctions déjà présentent dans une dll (codée en C et qui peut lire ce qu'il y a dans ces fameux fichiers et les rendre en structure de type C) plutôt que de devoir réécrire tout le code...
(je coderais en C dans postgreSQL)

Je ne sais pas si le problème est bien résumé, c'est un peu compliqué...

En tout cas si quelqu'un a une piste sur la manière dont je dois m'y prendre je vous écoute avec attention car je viens juste de commencer à comprendre ce que sont réellement les dll et je galère un peu...

Hors ligne

#2 06/07/2010 09:13:26

Marc Cousin
Membre

Re : [débutant] utilisation d'une dll C

Bonjour,

C'est possible à mon avis, mais pas la bonne solution. Il sera bien plus efficace de faire un programme externe, en C, s'appuyant sur cette DLL, et gérant les insertions en base : si vous voulez utiliser cette DLL directement de PostgreSQL, cela veut dire écrire des wrappers en C vers cette DLL, qui permettent de lire les enregistrements des fichiers à partir de la DLL. Il vous faudra développer la logique de lecture directement dans ce wrapper, vous aurez des problèmes pour gérer des transactions, etc…


Marc.

Hors ligne

#3 06/07/2010 09:30:47

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Bonjour,

Merci pour votre réponse.
A vrai dire les consignes que j'ai sont justement de faire quelque chose dans ce genre (avec wrappers donc).
Cependant je débute en C tout comme en base de données et je ne vois pas forcement les avantages et les inconvénients de chaque méthode.
Je vais me renseigner et éventuellement proposer un programme externe si cela se révèle plus adapté.
Encore merci à vous.

Hors ligne

#4 06/07/2010 11:31:51

nanou86
Membre

Re : [débutant] utilisation d'une dll C

J'aurais encore une question...
Dans le cas où la base est sur un serveur et que les logiciels qui vont communiquer avec celle-ci se situent sur différents ordinateurs du réseau. La solution qui consiste à utiliser la dll directement dans postgreSQL n'est-elle pas la meilleure ?

Hors ligne

#5 06/07/2010 11:41:09

Marc Cousin
Membre

Re : [débutant] utilisation d'une dll C

Quel rapport entre les logiciels et le programme de chargement s'appuyant sur la DLL ?

Les logiciels dont vous parlez, ce sont ceux qui vont faire votre chargement de fichier ?

En tout cas, pensez pour le moment plutôt à la maintenabilité de votre solution, avant de penser performance.


Marc.

Hors ligne

#6 06/07/2010 11:51:03

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Pour cette partie là pas vraiment de rapport mais je vais par la suite devoir coder la lecture des données de la base par l'un de ces logiciels en utilisant là encore la dll, c'est pourquoi il m'est demandé de me renseigner sur les appels externes

Hors ligne

#7 08/07/2010 09:00:20

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Encore une petite question pratique : avec quoi compilez vous vos fonctions C ?
Car j'avoue que je m'y perd un peu avec tout ce que j'ai pu lire sur différent forum.

Hors ligne

#8 08/07/2010 09:28:56

Marc Cousin
Membre

Re : [débutant] utilisation d'une dll C

Sous windows ?

Je vous recommanderais d'utiliser le même compilateur que celui qui a été utilisé pour compiler le reste de PostgreSQL. Si par exemple il s'agit du PostgreSQL One Click Installer, il a été compilé sous Visual Studio.

Mais je n'ai jamais eu l'occasion de le faire, utilisant surtout PostgreSQL sous Unix.


Marc.

Hors ligne

#9 08/07/2010 11:01:17

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Merci pour votre réponse.
Je suis en effet sous Windows mais finalement j'ai installé devcpp pour coder et il fait la compilation également.
Merci pour votre aide smile

Hors ligne

#10 19/08/2010 11:11:01

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Me revoilà pour une nouvelle question...

J'ai développé une belle dll qui s'occupe de mes fichiers mkt pour transférer leurs données dans la base mais apparemment ça coince avec les accents...
Code en C, développé sous labwindows CVI, sous windows. Base de données en UTF8...
Quand j'exécute une requête INSERT avec une chaine de caractère contenant des accents sous pgAdmin il n'y a pas de problème ça passe. Cependant quand je créais une requête (à l'aide d'un sprintf) dans mon programme puis que je l'envoie elle ne se fait pas si j'ai des accents.
Par exemple si j'ai :

char *param = "été";
char query[100];

sprintf(query, "INSERT INTO ma_table(mon_param) VALUES('%s')",param);

Et bien ça ne fonctionne pas...

Quelqu'un a une idée pour savoir d'où vient le problème ?

Hors ligne

#11 19/08/2010 12:42:13

Marc Cousin
Membre

Re : [débutant] utilisation d'une dll C

Sans message d'erreur, non. Regardez dans votre log, ou bien récupérez la chaîne d'erreur dans votre programme.


Marc.

Hors ligne

#12 19/08/2010 14:12:04

gleu
Administrateur

Re : [débutant] utilisation d'une dll C

Pour infos, pgAdmin envoie un "SET client_encoding TO UTF-8" à la connexion. Peut-être faut-il que vous le fassiez pour votre programme.


Guillaume.

Hors ligne

#13 19/08/2010 14:28:09

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Merci pour vos réponses, il faut en effet que je regarde ce qu'il y a dans la chaîne d'erreur mais je n'ai pas encore eu le temps.
Par contre j'avais effectivement testé si le client était en UTF-8 à partir de mon programme et c'était bien le cas.

Hors ligne

#14 19/08/2010 16:38:01

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Et voilà j'ai enfin trouvé le temps de faire le test et j'obtiens donc :

ERREUR:  séquence d'octets invalide pour l'encodage ┬½ UTF8 ┬╗ : 0xe974e9
HINT:  Cette erreur peut aussi survenir si la séquence d'octets ne correspond pas au jeu de caractères attendu par le serveur, le jeu étant contrôlé par ┬½ client_encoding ┬╗.

Hors ligne

#15 19/08/2010 16:45:26

gleu
Administrateur

Re : [débutant] utilisation d'une dll C

Donc la chaîne de caractères n'est pas en UTF-8. Il faut bien faire attention à ce que de l'UTF-8 soit envoyé.


Guillaume.

Hors ligne

#16 20/08/2010 14:51:03

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Oui j'essaie de faire ça.
Je mettrais la solution si je trouve.

Merci

Hors ligne

#17 23/08/2010 12:59:28

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Et me revoilà encore une fois pour un problème étrange.
Je fais l'insertion d'un bytea via mon code C et j'obtiens... un champ vide pour le bytea que je viens d'ajouter (les autres paramètres sont présents par contre)...
Pourtant aucun message d'erreur n'est renvoyé par PQresultErrorMessage, j'ai bien utilisé la fonction faisant les échappements, ma requête contient bien le bytea en question...

Quel test pourrais-je faire pour voir ce qui cloche ?

Hors ligne

#18 23/08/2010 13:11:07

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Heu question bête... si la chaine que j'essaie d'insérer dans mon bytea est trop grande est ce que la fonction PQresultErrorMessage renvoie une erreur ?
D'ailleurs pour être sur, quelle est la taille maximum (en caractère) qu'il est possible d'insérer dans un bytea ?

Désolé encore des questions de débutant...

Hors ligne

#19 23/08/2010 13:44:47

Marc Cousin
Membre

Re : [débutant] utilisation d'une dll C

Un bytea peut contenir 1 Go de données. Comment l'insérez vous ? Je présume que vous lui fournissez une chaîne. Faîtes vous les escape comme il faut ?


Marc.

Hors ligne

#20 23/08/2010 13:50:21

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Je fais l'insertion via une chaine obtenue avec sprintf. Du genre :
sprintf(query, "INSERT INTO ma_table(mon_bytea) VALUES('%s') ",ma_chaine_bytea);

Cette chaine ayant été obtenue par la fonction PQescapeByteaConn qui à priori est bien utilisée puisque je réussie l'insertion de bytea dans d'autres cas

Hors ligne

#21 23/08/2010 14:07:32

Marc Cousin
Membre

Re : [débutant] utilisation d'une dll C

Ok, c'est ce que je voulais savoir, l'escaping est donc bien fait.

Votre variable query est suffisamment dimensionnée pour le sprintf ?


Marc.

Hors ligne

#22 23/08/2010 14:08:52

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Oui pas de problème de ce côté là. Mon compilateur me préviens si c'est trop petit de toute façon

Hors ligne

#23 23/08/2010 14:27:19

Marc Cousin
Membre

Re : [débutant] utilisation d'une dll C

Ce dernier point m'étonne. Je ne vois pas comment le compilateur pourrait connaître la taille de ma_chaine_bytea, puisqu'elle est le résultat d'un malloc fait dans PQescapeByteaConn, donc allouée dynamiquement à l'exécution.


Marc.

Hors ligne

#24 23/08/2010 14:33:56

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Lorsque j'utilise un sprintf, si ce que je lui donne est trop long pour loger dans la chaine, j'ai un message d'erreur qui arrête l'exécution.
Mais je vais tester en allouant une taille dont je suis sur pour voir, on ne sait jamais

Hors ligne

#25 23/08/2010 14:38:07

nanou86
Membre

Re : [débutant] utilisation d'une dll C

Je confirme, la taille de la chaine est assez grande mais je n'ai toujours rien dans mon bytea

Hors ligne

Pied de page des forums