Re: Proposed new libpq API

From: The Hermit Hacker <scrappy(at)hub(dot)org>
To: Chris Bitmead <chrisb(at)nimrod(dot)itg(dot)telstra(dot)com(dot)au>
Cc: "pgsql-hackers(at)postgreSQL(dot)org" <pgsql-hackers(at)postgresql(dot)org>, pgsql-hackers-oo(at)postgresql(dot)org, Chris Bitmead <chris(at)bitmead(dot)com>
Subject: Re: Proposed new libpq API
Date: 2000-07-05 13:35:06
Message-ID: Pine.BSF.4.21.0007051034340.33627-100000@thelab.hub.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


Okay, first thing off the top of my head ... how does this deal with
backward compatibility, or have we just blown all old apps out to fhte
water?

On Wed, 5 Jul 2000, Chris Bitmead wrote:

> I've been thinking about what changes are necessary to the libpq
> interface to support returning variable type tuples. This was
> discussed a number of months back but an exact interface wasn't nailed
> down.
>
> Let me then put forward the following suggestion open for comment. The
> suggestion is very similar to the original postgres solution to this
> problem. What I have added is some consideration of how a streaming
> interface should work, and hopefully I will incorporate that
> enhancement while I'm at it.
>
> Into libpq will be (re)introduced the concept of a group. Tuples which
> are returned will be from a finite number of different layouts.
>
> Thus there will be an API PQnfieldsGroup(PGresult, group_num). And
> similar for PQftypeGroup etc. There will be a PQgroup(PGresult,
> tuple_num) which will tell you which group any given tuple belongs to.
>
> To support streaming of results a new function PQflush(PGresult,
> tuple_num) would
> be introduced. It discards previous results that are cached. PQexec
> would be changed so that it doesn't absorb the full result set
> straight away like it does now (*). Instead it would only absorb
> results on a need to basis when calling say PQgetValue.
>
> Currently you might read results like this...
>
> PGresult *res = PQexec("select * from foo");
> for (int i = 0; i < PQntuples(res); i++) {
> printf("%s\n", PQgetValue(res, i, 0);
> }
>
> It has the disadvantage that all the results are kept in memory at
> once. This code would in the future be modified to be...
>
> PGresult *res = PQexec("select * from foo");
> for (int i = 0; i < PQntuples(res); i++) {
> printf("%s\n", PQgetValue(res, i, 0);
> PQflush(res) // NEW NEW
> }
>
> Now PQexec doesn't absorb all the results at once. PQgetValue will
> read them on a need-to basis. PQflush will discard each result through
> the loop.
>
> I could also write...
>
> PGresult *res = PQexec("select * from foo");
> for (int i = 0; i < PQntuples(res); i++) {
> printf("%s\n", PQgetValue(res, i, 0);
> if (i % 20) {
> PQflush(res, -1)
> }
> }
>
> In this case the results are cached in chunks of 20. Or I could write...
>
> PGresult *res = PQexec("select * from foo");
> for (int i = 0; i < PQntuples(res); i++) {
> printf("%s\n", PQgetValue(res, i, 0);
> PQflush(res, i-20)
> }
>
> In this case the last 20 tuples are kept in memory in any one time as
> a sliding window. If I try to access something out of range of the
> current cache I get a NULL result.
>
> Back to the multiple tuple return types issue. psql code may do
> something like...
>
> int currentGroup = -1, group;
> PGresult *res = PQexec(someQuery);
> for (int i = 0; i < PQntuples(res); i++) {
> group = PQgroup(res, i);
> if (group != currentGroup)
> printHeaders(res, group);
> }
> currentGroup = group;
> for (j = 0; j < PQnfieldsGroup(res, group); j++) {
> printf("%s |", PQgetValue(res, i, j);
> }
> printf("\n");
> PQflush(res)
> }
>
> printHeaders(PGresult *res, int group) {
> for (j = 0; j < PQnfieldsGroup(res, group); j++) {
> printf("%s |", PQfnameGroup(res, group));
> }
> printf("\n");
> }
>
> This would print different result types with appropriate headers...
> create table a (aa text);
> create table b under a (bb text);
> select ** from a;
> aa |
> ----
> foo
> jar
>
> aa | bb
> -------
> bar|baz
> boo|bon
>
> (*) Assuming that this doesn't unduly affect current behaviour. I
> can't see that it would, but if it would another API would be needed
> PQexecStream.
>

Marc G. Fournier ICQ#7615664 IRC Nick: Scrappy
Systems Administrator @ hub.org
primary: scrappy(at)hub(dot)org secondary: scrappy(at){freebsd|postgresql}.org

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Chris Bitmead 2000-07-05 13:44:46 Re: Proposed new libpq API
Previous Message Robert B. Easter 2000-07-05 13:14:48 Re: Article on MySQL vs. Postgres