以下函数可用来询问现有数据库连接对象的状况。
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
将返回实际连接到的主机。
PQhost
如果 conn
参数是 NULL
,则返回 NULL
。否则,如果生成主机信息时出现错误(可能因为连接尚未完全建立或出现错误),则返回空字符串。
如果在连接参数中指定了多个主机,那么在建立连接之前无法依赖 PQhost
的结果。可以使用函数 PQstatus
检查连接状态。
PQhostaddr
#返回活动连接的服务器 IP 地址。这可以是主机名解析成的地址或通过 hostaddr
参数提供的 IP 地址。
char *PQhostaddr(const PGconn *conn);
PQhostaddr
如果 conn
参数是 NULL
,则返回 NULL
。否则,如果生成主机信息时出现错误(可能因为连接尚未完全建立或出现错误),则返回空字符串。
PQport
#返回活动连接的端口。
char *PQport(const PGconn *conn);
如果在连接参数中指定了多个端口,PQport
将返回实际连接到的端口。
PQport
如果 conn
参数是 NULL
,则返回 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
#返回服务器当前的 in-transaction 状态。
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 协议)或 0(连接不良)。完成连接启动后协议版本不会发生更改,但理论上它可能会在连接重置期间发生更改。3.0 协议受 PostgreSQL 服务器版本 7.4 及更高版本支持。
PQserverVersion
#返回表示服务器版本的一个整数。
int PQserverVersion(const PGconn *conn);
应用程序可以使用此函数来确定已连接到的数据库服务器的版本。结果是通过将服务器的主版本号乘以 10000 并添加次版本号来形成的。例如,版本 10.1 将返回为 100001,版本 11.0 将返回为 110000。如果连接不良,则返回 0。
在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
#返回一个 SSL 属性名称数组,可用于 PQsslAttribute()
中。数组以 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
。