mirror of
https://github.com/postgres/postgres.git
synced 2025-10-29 22:49:41 +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:
@@ -232,6 +232,26 @@ typedef enum
|
||||
PGQUERY_DESCRIBE /* Describe Statement or Portal */
|
||||
} PGQueryClass;
|
||||
|
||||
/* Target server type (decoded value of target_session_attrs) */
|
||||
typedef enum
|
||||
{
|
||||
SERVER_TYPE_ANY = 0, /* Any server (default) */
|
||||
SERVER_TYPE_READ_WRITE, /* Read-write server */
|
||||
SERVER_TYPE_READ_ONLY, /* Read-only server */
|
||||
SERVER_TYPE_PRIMARY, /* Primary server */
|
||||
SERVER_TYPE_STANDBY, /* Standby server */
|
||||
SERVER_TYPE_PREFER_STANDBY, /* Prefer standby server */
|
||||
SERVER_TYPE_PREFER_STANDBY_PASS2 /* second pass - behaves same as ANY */
|
||||
} PGTargetServerType;
|
||||
|
||||
/* Boolean value plus a not-known state, for GUCs we might have to fetch */
|
||||
typedef enum
|
||||
{
|
||||
PG_BOOL_UNKNOWN = 0, /* Currently unknown */
|
||||
PG_BOOL_YES, /* Yes (true) */
|
||||
PG_BOOL_NO /* No (false) */
|
||||
} PGTernaryBool;
|
||||
|
||||
/* PGSetenvStatusType defines the state of the pqSetenv state machine */
|
||||
|
||||
/* (this is used only for 2.0-protocol connections) */
|
||||
@@ -370,9 +390,7 @@ struct pg_conn
|
||||
* "sspi") */
|
||||
char *ssl_min_protocol_version; /* minimum TLS protocol version */
|
||||
char *ssl_max_protocol_version; /* maximum TLS protocol version */
|
||||
|
||||
/* Type of connection to make. Possible values: any, read-write. */
|
||||
char *target_session_attrs;
|
||||
char *target_session_attrs; /* desired session properties */
|
||||
|
||||
/* Optional file to write trace info to */
|
||||
FILE *Pfdebug;
|
||||
@@ -422,6 +440,7 @@ struct pg_conn
|
||||
char *write_err_msg; /* write error message, or NULL if OOM */
|
||||
|
||||
/* Transient state needed while establishing connection */
|
||||
PGTargetServerType target_server_type; /* desired session properties */
|
||||
bool try_next_addr; /* time to advance to next address/host? */
|
||||
bool try_next_host; /* time to advance to next connhost[]? */
|
||||
struct addrinfo *addrlist; /* list of addresses for current connhost */
|
||||
@@ -437,6 +456,8 @@ struct pg_conn
|
||||
pgParameterStatus *pstatus; /* ParameterStatus data */
|
||||
int client_encoding; /* encoding id */
|
||||
bool std_strings; /* standard_conforming_strings */
|
||||
PGTernaryBool default_transaction_read_only; /* default_transaction_read_only */
|
||||
PGTernaryBool in_hot_standby; /* in_hot_standby */
|
||||
PGVerbosity verbosity; /* error/notice message verbosity */
|
||||
PGContextVisibility show_context; /* whether to show CONTEXT field */
|
||||
PGlobjfuncs *lobjfuncs; /* private state for large-object access fns */
|
||||
|
||||
Reference in New Issue
Block a user