Vous n'êtes pas identifié(e).
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
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
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
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
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
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
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
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
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
Hors ligne
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
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
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
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
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
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
Oui j'essaie de faire ça.
Je mettrais la solution si je trouve.
Merci
Hors ligne
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
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
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
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
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
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
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
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
Je confirme, la taille de la chaine est assez grande mais je n'ai toujours rien dans mon bytea
Hors ligne