libpq, PostGreSQL, accès en C à une valeur dans un tableau?
1 réponse
Basile Starynkevitch [news]
Bonjour,
Je débute sous PostGresql8 (je connais un peu mieux MySQL4) et j'ai
quelques questions basiques:
Avec PostGRESQL8 (et donc sa libpq4) sous Linux (Debian/Sid) en C,
j'ai une table
CREATE TABLE tab1 (
num INTEGER UNIQUE,
vals BYTEA[]
);
je souhaite écrire en C (avec libpq) la routine (dont la signature en C serait
char** obtenir_valeurs(int num);
) qui à un num donné me renvoie le tableau C de chaines (donc un
char**, alloué par calloc) associés dans vals.
Une premiere solution serait de faire
char *params[1];
char numbuf[20];
snprintf(numbuf, sizeof(numbuf), "%d", num);
params[0] = numbuf;
PGresult* res
= PQexecParams(conndb,
"SELECT vals FROM tab1 WHERE num=$1",
1,
(const Oid *)0, //paramTypes,
params,
(const int*)0,
(const int*)0,
0);
if (res && PQresultStatus(res)==PGRES_TUPLES_OK) {
char* vstr = PQgetvalue(res,0,0);
/***** mais la je ne sais pas décoder facilement vstr *****/
}
je seche alors sur comment facilement décoder la valeur vstr obtenue
ainsi (je voudrais éviter, si possible, un parsing de representations
textuelles). Une solution un peu plus hideuse serait alors d'obtenir
la longueur du tableau vals par une requete SELECT array_upper(vals,1)
AS nb_val FROM tab1 WHERE num=$1
puis de faire une autre requete (dont la commande SQL est calculée par
le programme C en fonction du resultat N précédent, par exemple si N=3)
SELECT vals[1] AS v1, vals[2] AS v2, vals[3] AS v3 FROM tab1 WHERE num=$1
la documentation
http://www.postgresql.org/docs/8.0/interactive/libpq-exec.html suggère
d'obtenir le Oid du type dans la table pg_type, mias j'ai du mal à
comprendre comment exactement, puis que faire de cet Oid
http://www.postgresql.org/docs/current/static/catalog-pg-type.html
Faut-il utiliser le typreceive et comment?
Autre question trahissant mon ignorance: comment (interactivement dans
psql) demander la structure d'une table (ie l'equivalent de DESCRIBE
dans MySQL) et la liste des tables (ie l'équivalent de SHOW TABLES
dans MySQL)?
Merci de votre attention!
NB: J'espère que c'est le bon groupe pour poser ce genre de
questions. D'habitude on parle ici seulement de requêtes MySQL, mais
j'ai aussi des questions sur l'API C de la libpq
--
Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basile(at)starynkevitch(dot)net
8, rue de la Faïencerie, 92340 Bourg La Reine, France
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Miko
"Basile Starynkevitch [news]" a écrit dans le message de news:
Bonjour,
Je débute sous PostGresql8 (je connais un peu mieux MySQL4) et j'ai quelques questions basiques:
Avec PostGRESQL8 (et donc sa libpq4) sous Linux (Debian/Sid) en C, j'ai une table .......
Ta question n'a rien de basique, et je pense que tu as bien fait de poster également sur pgsql-interfaces. J'ai fait également un tour sur comp.databases.postgresql, à peine une douzaine de messages...
Y a t'il un expert pg/libpq dans l'avion?
Miko qui sèche
"Basile Starynkevitch [news]" <basile-news@starynkevitch.net> a écrit dans
le message de news: slrndmh852.bc7.basile-news@ours.starynkevitch.net...
Bonjour,
Je débute sous PostGresql8 (je connais un peu mieux MySQL4) et j'ai
quelques questions basiques:
Avec PostGRESQL8 (et donc sa libpq4) sous Linux (Debian/Sid) en C,
j'ai une table
.......
Ta question n'a rien de basique, et je pense que tu as bien fait de poster
également sur pgsql-interfaces.
J'ai fait également un tour sur comp.databases.postgresql, à peine une
douzaine de messages...
"Basile Starynkevitch [news]" a écrit dans le message de news:
Bonjour,
Je débute sous PostGresql8 (je connais un peu mieux MySQL4) et j'ai quelques questions basiques:
Avec PostGRESQL8 (et donc sa libpq4) sous Linux (Debian/Sid) en C, j'ai une table .......
Ta question n'a rien de basique, et je pense que tu as bien fait de poster également sur pgsql-interfaces. J'ai fait également un tour sur comp.databases.postgresql, à peine une douzaine de messages...