Re: libpq pipelining

From: Heikki Linnakangas <hlinnakangas(at)vmware(dot)com>
To: Matt Newell <newellm(at)blur(dot)com>
Cc: <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: libpq pipelining
Date: 2014-12-05 10:22:38
Message-ID: 5481876E.3000701@vmware.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 12/05/2014 02:30 AM, Matt Newell wrote:
>>
>>> The explanation of PQgetFirstQuery makes it sound pretty hard to match
>>> up the result with the query. You have to pay attention to PQisBusy.
>>
>> PQgetFirstQuery should also be valid after
>> calling PQgetResult and then you don't have to worry about PQisBusy, so I
>> should probably change the documentation to indicate that is the preferred
>> usage, or maybe make that the only guaranteed usage, and say the results
>> are undefined if you call it before calling PQgetResult. That usage also
>> makes it consistent with PQgetLastQuery being called immediately after
>> PQsendQuery.
>>
> I changed my second example to call PQgetFirstQuery after PQgetResult instead
> of before, and that removes the need to call PQconsumeInput and PQisBusy when
> you don't mind blocking. It makes the example super simple:
>
> PQsendQuery(conn, "INSERT INTO test(id) VALUES (DEFAULT),(DEFAULT)
> RETURNING id");
> query1 = PQgetLastQuery(conn);
>
> /* Duplicate primary key error */
> PQsendQuery(conn, "UPDATE test SET id=2 WHERE id=1");
> query2 = PQgetLastQuery(conn);
>
> PQsendQuery(conn, "SELECT * FROM test");
> query3 = PQgetLastQuery(conn);
>
> while( (result = PQgetResult(conn)) != NULL )
> {
> curQuery = PQgetFirstQuery(conn);
>
> if (curQuery == query1)
> checkResult(conn,result,curQuery,PGRES_TUPLES_OK);
> if (curQuery == query2)
> checkResult(conn,result,curQuery,PGRES_FATAL_ERROR);
> if (curQuery == query3)
> checkResult(conn,result,curQuery,PGRES_TUPLES_OK);
> }
>
> Note that the curQuery == queryX check will work no matter how many results a
> query produces.

Oh, that's what the PQgetLastQuery/PQgetNextQuery functions work! I
didn't understand that before. I'd suggest renaming them to something
like PQgetSentQuery() and PQgetResultQuery(). The first/last/next names
made me think that they're used to iterate a list of queries, but in
fact they're supposed to be used at very different stages.

- Heikki

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message David Rowley 2014-12-05 12:03:11 Re: [Windows,PATCH] Use faster, higher precision timer API
Previous Message Heikki Linnakangas 2014-12-05 10:18:48 Re: check-world failure: dummy_seclabel