1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-16 06:01:02 +03:00

Add PQsendFlushRequest to libpq

This new libpq function allows the application to send an 'H' message,
which instructs the server to flush its outgoing buffer.

This hasn't been needed so far because the Sync message already requests
a buffer; and I failed to realize that this was needed in pipeline mode
because PQpipelineSync also causes the buffer to be flushed.  However,
sometimes it is useful to request a flush without establishing a
synchronization point.

Backpatch to 14, where pipeline mode was introduced in libpq.

Reported-by: Boris Kolpackov <boris@codesynthesis.com>
Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
Discussion: https://postgr.es/m/202106252350.t76x73nt643j@alvherre.pgsql
This commit is contained in:
Alvaro Herrera
2021-06-29 14:37:39 -04:00
parent dd2364ced9
commit a7192326c7
4 changed files with 70 additions and 3 deletions

View File

@ -184,4 +184,5 @@ PQexitPipelineMode 181
PQpipelineSync 182
PQpipelineStatus 183
PQsetTraceFlags 184
PQmblenBounded 185
PQmblenBounded 185
PQsendFlushRequest 186

View File

@ -3099,6 +3099,42 @@ sendFailed:
return 0;
}
/*
* PQsendFlushRequest
* Send request for server to flush its buffer. Useful in pipeline
* mode when a sync point is not desired.
*/
int
PQsendFlushRequest(PGconn *conn)
{
if (!conn)
return 0;
/* Don't try to send if we know there's no live connection. */
if (conn->status != CONNECTION_OK)
{
appendPQExpBufferStr(&conn->errorMessage,
libpq_gettext("no connection to the server\n"));
return 0;
}
/* Can't send while already busy, either, unless enqueuing for later */
if (conn->asyncStatus != PGASYNC_IDLE &&
conn->pipelineStatus == PQ_PIPELINE_OFF)
{
appendPQExpBufferStr(&conn->errorMessage,
libpq_gettext("another command is already in progress\n"));
return false;
}
if (pqPutMsgStart('H', conn) < 0 ||
pqPutMsgEnd(conn) < 0)
{
return 0;
}
return 1;
}
/* ====== accessor funcs for PGresult ======== */

View File

@ -470,6 +470,7 @@ extern int PQconsumeInput(PGconn *conn);
extern int PQenterPipelineMode(PGconn *conn);
extern int PQexitPipelineMode(PGconn *conn);
extern int PQpipelineSync(PGconn *conn);
extern int PQsendFlushRequest(PGconn *conn);
/* LISTEN/NOTIFY support */
extern PGnotify *PQnotifies(PGconn *conn);