mirror of
https://github.com/postgres/postgres.git
synced 2025-07-21 16:02:15 +03:00
Extend the abilities of libpq's target_session_attrs parameter.
In addition to the existing options of "any" and "read-write", we now support "read-only", "primary", "standby", and "prefer-standby". "read-write" retains its previous meaning of "transactions are read-write by default", and "read-only" inverts that. The other three modes test specifically for hot-standby status, which is not quite the same thing. (Setting default_transaction_read_only on a primary server renders it read-only to this logic, but not a standby.) Furthermore, if talking to a v14 or later server, no extra network round trip is needed to detect the session's status; the GUC_REPORT variables delivered by the server are enough. When talking to an older server, a SHOW or SELECT query is issued to detect session read-only-ness or server hot-standby state, as needed. Haribabu Kommi, Greg Nancarrow, Vignesh C, Tom Lane; reviewed at various times by Laurenz Albe, Takayuki Tsunakawa, Peter Smith. Discussion: https://postgr.es/m/CAF3+xM+8-ztOkaV9gHiJ3wfgENTq97QcjXQt+rbFQ6F7oNzt9A@mail.gmail.com
This commit is contained in:
@ -1008,11 +1008,11 @@ pqSaveParameterStatus(PGconn *conn, const char *name, const char *value)
|
||||
}
|
||||
|
||||
/*
|
||||
* Special hacks: remember client_encoding and
|
||||
* standard_conforming_strings, and convert server version to a numeric
|
||||
* form. We keep the first two of these in static variables as well, so
|
||||
* that PQescapeString and PQescapeBytea can behave somewhat sanely (at
|
||||
* least in single-connection-using programs).
|
||||
* Save values of settings that are of interest to libpq in fields of the
|
||||
* PGconn object. We keep client_encoding and standard_conforming_strings
|
||||
* in static variables as well, so that PQescapeString and PQescapeBytea
|
||||
* can behave somewhat sanely (at least in single-connection-using
|
||||
* programs).
|
||||
*/
|
||||
if (strcmp(name, "client_encoding") == 0)
|
||||
{
|
||||
@ -1029,6 +1029,7 @@ pqSaveParameterStatus(PGconn *conn, const char *name, const char *value)
|
||||
}
|
||||
else if (strcmp(name, "server_version") == 0)
|
||||
{
|
||||
/* We convert the server version to numeric form. */
|
||||
int cnt;
|
||||
int vmaj,
|
||||
vmin,
|
||||
@ -1062,6 +1063,16 @@ pqSaveParameterStatus(PGconn *conn, const char *name, const char *value)
|
||||
else
|
||||
conn->sversion = 0; /* unknown */
|
||||
}
|
||||
else if (strcmp(name, "default_transaction_read_only") == 0)
|
||||
{
|
||||
conn->default_transaction_read_only =
|
||||
(strcmp(value, "on") == 0) ? PG_BOOL_YES : PG_BOOL_NO;
|
||||
}
|
||||
else if (strcmp(name, "in_hot_standby") == 0)
|
||||
{
|
||||
conn->in_hot_standby =
|
||||
(strcmp(value, "on") == 0) ? PG_BOOL_YES : PG_BOOL_NO;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user