这些函数可用于查询现有数据库连接对象的状态。
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_name |
is_superuser |
client_encoding |
scram_iterations |
DateStyle |
server_encoding |
default_transaction_read_only |
server_version |
in_hot_standby |
session_authorization |
integer_datetimes |
standard_conforming_strings |
IntervalStyle |
TimeZone |
(default_transaction_read_only
和 in_hot_standby
在 14 版本之前的版本中未报告;scram_iterations
在 16 版本之前的版本中未报告。)请注意,server_version
、server_encoding
和 integer_datetimes
在启动后无法更改。
如果未报告 standard_conforming_strings
的值,应用程序可以假定它是 off
,也就是说,反斜杠在字符串字面量中被视为转义符。此外,此参数的存在可以被视为接受转义字符串语法(E'...'
)的指示。
尽管返回的指针被声明为 const
,但实际上它指向与 PGconn
结构关联的可变存储。假设该指针在查询中保持有效是不明智的。
PQprotocolVersion
#查询正在使用的前端/后端协议。
int PQprotocolVersion(const PGconn *conn);
应用程序可能希望使用此函数来确定是否支持某些功能。目前,可能的值为 3(3.0 协议)或零(连接错误)。协议版本在连接启动完成后不会更改,但在连接重置期间理论上可能会更改。 3.0 协议受 PostgreSQL 服务器版本 7.4 及以上版本支持。
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
#如果连接身份验证方法需要密码,但没有可用密码,则返回 true (1)。否则,返回 false (0)。
int PQconnectionNeedsPassword(const PGconn *conn);
此函数可以在连接尝试失败后应用,以决定是否提示用户输入密码。
PQconnectionUsedPassword
#如果连接身份验证方法使用了密码,则返回 true (1)。否则,返回 false (0)。
int PQconnectionUsedPassword(const PGconn *conn);
此函数可以在连接尝试失败或成功后应用,以检测服务器是否需要密码。
PQconnectionUsedGSSAPI
#如果连接身份验证方法使用了 GSSAPI,则返回 true (1)。否则,返回 false (0)。
int PQconnectionUsedGSSAPI(const PGconn *conn);
此函数可以应用来检测连接是否使用 GSSAPI 进行了身份验证。
以下函数返回与 SSL 相关的信息。此信息通常在建立连接后不会更改。
PQsslInUse
#如果连接使用 SSL,则返回 true (1),否则返回 false (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) { /* use OpenSSL functions to access ssl */ }
此结构可用于验证加密级别、检查服务器证书等。有关此结构的信息,请参阅 OpenSSL 文档。
PQgetssl
#返回连接中使用的 SSL 结构,如果未使用 SSL,则返回 NULL。
void *PQgetssl(const PGconn *conn);
此函数等效于 PQsslStruct(conn, "OpenSSL")
。它不应在新应用程序中使用,因为返回的结构特定于 OpenSSL,如果使用其他SSL实现,则不可用。要检查连接是否使用 SSL,请调用 PQsslInUse
,有关连接的更多详细信息,请使用 PQsslAttribute
。
如果您在文档中发现任何不正确、与您使用特定功能的体验不符或需要进一步澄清的地方,请使用此表单报告文档问题。