OVH Cloud OVH Cloud

libpq, PostGreSQL, accès en C à une valeur dans un tableau?

1 réponse
Avatar
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

1 réponse

Avatar
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