32.2. 连接状态函数 #
这些函数可用于查询现有数据库连接对象的状态。
提示
编写 libpq 应用程序时,应注意维护 PGconn 的抽象。请使用下述访问函数获取 PGconn 的内容。不建议通过 libpq-int.h 引用 PGconn 的内部字段,因为这些字段将来可能改变。
以下函数返回建立连接时确定的参数值。这些值在连接存续期间保持不变。如果使用多主机连接字符串,并使用同一个 PGconn 对象建立新连接,则 PQhost、PQport 和 PQpass 的返回值可能改变。其他值在 PGconn 对象的整个生命周期内保持不变。
PQdb#返回该连接的数据库名。
char *PQdb(const PGconn *conn);
PQuser#返回该连接的用户名。
char *PQuser(const PGconn *conn);
PQpass#返回该连接的密码。
char *PQpass(const PGconn *conn);
PQpass将返回连接参数中指定的密码,如果连接参数中没有密码并且能从密码文件中得到密码,则它将返回得到的密码。在后一种情况中,如果连接参数中指定了多个主机,在连接被建立之前都不能依赖PQpass的结果。连接的状态可以用函数PQstatus检查。PQhost#返回活动连接的服务器主机名。可能是主机名、IP 地址或者一个目录路径(如果通过 Unix 套接字连接,路径的情况很容易区分,因为路径总是一个绝对路径,以
/开始)。char *PQhost(const PGconn *conn);
如果连接参数同时指定了
host和hostaddr,则PQhost将返回host信息。如果仅指定了hostaddr,则返回它。如果在连接参数中指定了多个主机,PQhost返回实际连接到的主机。如果
conn参数为NULL,则PQhost返回NULL。否则,如果在生成主机信息时发生错误(例如连接尚未完全建立,或出现了错误),则返回空字符串。如果在连接参数中指定了多个主机,则在连接建立之前都不能依赖于
PQhost的结果。连接的状态可以用函数PQstatus检查。PQhostaddr#返回活动连接的服务器 IP 地址。这可以是主机名解析出的地址,也可以是通过
hostaddr参数提供的 IP 地址。char *PQhostaddr(const PGconn *conn);
如果
conn参数为NULL,则PQhostaddr返回NULL。否则,如果在生成主机信息时发生错误(例如连接尚未完全建立,或出现了错误),则返回空字符串。PQport#返回活动连接的端口。
char *PQport(const PGconn *conn);
如果在连接参数中指定了多个端口,
PQport返回实际连接到的端口。如果
conn参数为NULL,则PQport返回NULL。否则,如果在生成端口信息时发生错误(例如连接尚未完全建立,或出现了错误),则返回空字符串。如果在连接参数中指定了多个端口,则在连接建立之前都不能依赖于
PQport的结果。连接的状态可以用函数PQstatus检查。PQtty#此函数已不再执行任何操作,但为保持向后兼容仍予以保留。如果
conn参数为NULL,则返回NULL;否则始终返回空字符串。char *PQtty(const PGconn *conn);
PQoptions#返回连接请求中传递的命令行选项。
char *PQoptions(const PGconn *conn);
以下函数返回的状态数据,可能随着对 PGconn 对象执行操作而改变。
PQstatus#返回该连接的状态。
ConnStatusType PQstatus(const PGconn *conn);
该状态可以是一系列值之一。不过,其中只有两个在一个异步连接过程之外可见:
CONNECTION_OK和CONNECTION_BAD。一个到数据库的完好连接的状态为CONNECTION_OK。一个失败的连接尝试则由状态CONNECTION_BAD表示。通常,一个 OK 状态将一直保持到PQfinish,但是一次通信失败可能导致该状态过早地改变为CONNECTION_BAD。在那种情况下,该应用可以通过调用PQreset尝试恢复。关于其他可能会被返回的状态代码,请见
PQconnectStartParams、PQconnectStart和PQconnectPoll的条目。PQtransactionStatus#返回服务器的当前事务内状态。
PGTransactionStatusType PQtransactionStatus(const PGconn *conn);
该状态可能是
PQTRANS_IDLE(当前空闲)、PQTRANS_ACTIVE(一个命令运行中)、PQTRANS_INTRANS(空闲,处于一个有效的事务块中)或者PQTRANS_INERROR(空闲,处于一个失败的事务块中)。如果该连接异常,将会报告PQTRANS_UNKNOWN。只有当一个查询已经被发送给服务器并且还没有完成时,才会报告PQTRANS_ACTIVE。PQparameterStatus#查找服务器某个参数的当前设置。
const char *PQparameterStatus(const PGconn *conn, const char *paramName);
服务器会在连接启动时,以及某些参数值发生变化时,自动报告这些参数值。
PQparameterStatus可用于查询这些设置。如果已知该参数,则返回其当前值;如果未知,则返回NULL。当前版本报告的参数包括:
application_namescram_iterationsclient_encodingsearch_pathDateStyleserver_encodingdefault_transaction_read_onlyserver_versionin_hot_standbysession_authorizationinteger_datetimesstandard_conforming_stringsIntervalStyleTimeZoneis_superuser(14 之前的版本不报告
default_transaction_read_only和in_hot_standby;16 之前的版本不报告scram_iterations;18 之前的版本不报告search_path。)注意,server_version、server_encoding和integer_datetimes在启动后不能改变。如果服务器未报告
standard_conforming_strings的值,应用程序可以假定其为off,即反斜杠在字符串字面量中被视为转义字符。此外,服务器报告此参数也表明它接受转义字符串语法(E'...')。返回的指针虽然被声明为
const,但实际上指向与PGconn结构体关联的可变存储。不能假定该指针在执行其他查询后仍然有效。PQfullProtocolVersion#查询正在使用的前端/后端协议。
int PQfullProtocolVersion(const PGconn *conn);
应用程序可以使用此函数确定是否支持某些功能。结果由服务器的协议主版本号乘以 10000,再加上次版本号组成。例如,版本 3.2 返回 30002,版本 4.0 返回 40000。如果连接无效,则返回零。PostgreSQL 服务器 7.4 及更高版本支持 3.0 协议。
连接启动完成后,协议版本不会改变,但在连接重置期间,理论上可能改变。
PQprotocolVersion#查询前端/后端协议的主版本号。
int PQprotocolVersion(const PGconn *conn);
与
PQfullProtocolVersion不同,此函数仅返回正在使用的协议主版本号,但支持它的 libpq 版本范围更广,最早可追溯到 7.4。目前可能的值为 3(协议 3.0)或零(连接异常)。在 14.0 之前的版本中,libpq 还可能返回 2(协议 2.0)。PQserverVersion#返回一个表示服务器版本的整数。
int PQserverVersion(const PGconn *conn);
应用可能会使用这个函数来判断它们连接到的数据库服务器的版本。结果通过将服务器的主版本号乘以 10000 再加上次版本号形成。例如,版本 10.1 将被返回为 100001,而版本 11.0 将被返回为 110000。如果连接无效则返回零。
在主版本 10 之前,PostgreSQL 采用一种由三个部分组成的版本号,其中前两部分共同表示主版本。对于那些版本,
PQserverVersion为每个部分使用两位数字,例如版本 9.1.5 将被返回为 90105,而版本 9.2.0 将被返回为 90200。因此,出于判断特性兼容性的目的,应用应该将
PQserverVersion的结果除以 100 而不是 10000 来判断逻辑的主版本号。在所有主版本系列中,各次版本(缺陷修复版本)之间只有最后两位数字不同。PQerrorMessage#返回连接上的一个操作最近产生的错误消息。
char *PQerrorMessage(const PGconn *conn);
几乎所有 libpq 函数在失败时都会设置一条供
PQerrorMessage返回的消息。注意,按照 libpq 的约定,非空的PQerrorMessage结果可能包含多行,并以换行符结尾。调用者不应直接释放该结果;当关联的PGconn句柄被传给PQfinish时,结果会被释放。不能假定在对PGconn结构体执行其他操作后,结果字符串仍保持不变。PQsocket#获取与服务器相连的套接字的文件描述符编号。有效描述符大于或等于 0。结果为 -1 表示当前没有打开服务器连接(在普通操作期间这将不会改变,但是在连接设置或重置期间可能改变)。
int PQsocket(const PGconn *conn);
PQbackendPID#int PQbackendPID(const PGconn *conn);
后端 PID 可用于调试,也可与
NOTIFY消息进行比较(消息包含发出通知的后端进程的 PID)。注意,该 PID 属于在数据库服务器主机上运行的进程,而非本地主机上的进程!PQconnectionNeedsPassword#如果连接认证方法要求一个密码但没有可用的密码,返回真(1)。否则返回假(0)。
int PQconnectionNeedsPassword(const PGconn *conn);
这个函数可以在连接尝试失败后被应用于决定是否向用户提示要求一个密码。
PQconnectionUsedPassword#如果连接认证方法使用一个密码,返回真(1)。否则返回假(0)。
int PQconnectionUsedPassword(const PGconn *conn);
这个函数能在一次连接尝试失败或成功后用于检测该服务器是否要求一个密码。
PQconnectionUsedGSSAPI#如果连接的认证方法使用了 GSSAPI,则返回真(1);否则返回假(0)。
int PQconnectionUsedGSSAPI(const PGconn *conn);
此函数可用于检测连接是否使用 GSSAPI 进行了认证。
以下函数返回与 SSL 相关的信息。这些信息通常在连接建立后不会改变。
PQsslInUse#如果连接使用 SSL,则返回真(1);否则返回假(0)。
int PQsslInUse(const PGconn *conn);
PQsslAttribute#返回连接的 SSL 相关信息。
const char *PQsslAttribute(const PGconn *conn, const char *attribute_name);
可用属性列表因使用的 SSL 库和连接类型而异。如果连接不使用 SSL 或指定的属性名称对于所使用的库未定义,则返回 NULL。
通常可以获取以下属性:
library#使用的 SSL 实现的名称。(目前只实现了
"OpenSSL")protocol#使用的 SSL/TLS 版本。常见值为
"TLSv1"、"TLSv1.1"和"TLSv1.2",但如果使用其他协议,则实现可能返回其他字符串。key_bits#加密算法使用的密钥位数。
cipher#使用的密码套件的简称,例如
"DHE-RSA-DES-CBC3-SHA"。这些名称特定于每个 SSL 实现。compression#如果使用 SSL 压缩,则返回"on",否则返回"off"。
alpn#TLS 应用层协议协商(ALPN)扩展选定的应用协议。libpq 唯一支持的协议是
postgresql,因此该属性主要用于检查服务器是否支持 ALPN。如果未使用 ALPN,则为空字符串。
作为一个特例,可以在没有连接的情况下通过将 NULL 作为
conn参数来查询library属性。结果将是默认的 SSL 库名称,或者如果 libpq 在没有任何 SSL 支持的情况下编译,则为 NULL。(在 PostgreSQL 版本 15 之前,将 NULL 作为conn参数传递总是导致 NULL。需要区分这种情况的新旧实现的客户端程序可以检查LIBPQ_HAS_SSL_LIBRARY_DETECTION特征宏。)PQsslAttributeNames#返回可用于
PQsslAttribute()的 SSL 属性名称数组。数组以 NULL 指针结尾。const char * const * PQsslAttributeNames(const PGconn *conn);
如果
conn为 NULL,则返回默认 SSL 库可用的属性;如果 libpq 编译时未启用任何 SSL 支持,则返回空列表。如果conn不为 NULL,则返回该连接所用 SSL 库可用的属性;如果连接未加密,则返回空列表。PQsslStruct#返回指向描述此连接的对象的指针,该对象的类型由 SSL 实现决定。如果连接未加密,或连接所用的 SSL 实现不提供所请求的对象类型,则返回 NULL。
void *PQsslStruct(const PGconn *conn, const char *struct_name);
可用的结构体取决于所使用的 SSL 实现。对于 OpenSSL,可以通过名称
OpenSSL获取一个结构体,函数返回指向 OpenSSL 的SSL结构体的指针。可以使用如下代码调用此函数:#include <libpq-fe.h> #include <openssl/ssl.h> ... SSL *ssl; dbconn = PQconnectdb(...); ... ssl = PQsslStruct(dbconn, "OpenSSL"); if (ssl) { /* 使用OpenSSL函数访问ssl */ }这个结构体可用于验证加密级别,检查服务器证书等。请参考 OpenSSL 文档以获取有关此结构体的信息。
PQgetssl#返回在连接中使用的 SSL 结构体,如果未使用 SSL,则返回 NULL。
void *PQgetssl(const PGconn *conn);
这个函数等同于
PQsslStruct(conn, "OpenSSL")。不应该在新应用程序中使用,因为返回的结构体特定于 OpenSSL,如果使用另一个 SSL 实现,则不可用。要检查连接是否使用 SSL,请调用PQsslInUse,要获取有关连接的更多详细信息,请使用PQsslAttribute。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.