这些函数用于检视和获取已建立的数据库物理连接对象的状态信息。
libpq 应用程序开发者应注意保持 PGconn 的对象封装抽象。应始终使用下文所述的公开访问函数获取 PGconn 的内容。强烈不建议包含 libpq-int.h 直接访问结构体内部私有成员,因为它们在未来版本中随时可能发生变动。
以下函数返回在建立连接时确定的参数值。在当前物理连接的生命周期内,这些值保持固定。如果使用了多主机连接字符串,若通过同一个 PGconn 对象重新发起连接,PQhost、PQport 和 PQpass 的值可能会随实际连上的新主机而改变;其他值在 PGconn 对象的整个生命周期中均保持固定。
PQdb #返回该连接所访问的数据库名称。
char *PQdb(const PGconn *conn);
PQuser #返回该连接所使用的认证登录用户名。
char *PQuser(const PGconn *conn);
PQpass #返回该连接所使用的口令密码。
char *PQpass(const PGconn *conn);
PQpass 将返回连接参数中指定的密码;若未显式指定而从本地 密码文件(.pgpass)中检索到了密码,则返回该密码。在后一种情况下,若连接串中指定了多个主机,在真正成功建立连接之前不能依赖该返回值。连接是否就绪可以通过 PQstatus 检查。
PQhost #
返回当前活跃物理连接的服务端主机名。它可以是域名、IP 地址,或者在通过 Unix 域套接字连接时的套接字所在目录物理路径(路径情形可通过其始终是以 / 开头的绝对路径来区分)。
char *PQhost(const PGconn *conn);
如果连接参数中同时指定了 host 和 hostaddr,则 PQhost 返回 host 属性。若仅指定了 hostaddr,则返回该值。在指定了多个候选主机的场景下,该函数返回实际成功建立物理连接的主机。
若传入的 conn 参数为 NULL,该函数返回 NULL。否则若在获取主机信息时出错(例如连接尚未完全建立),则返回空字符串。
若在连接参数中指定了多个主机,在物理连接正式建立之前不可依赖该返回值。连接的就绪状态可通过 PQstatus 查询。
PQhostaddr #
返回当前活跃连接的服务端物理 IP 地址。它可以是主机名 DNS 解析后的 IP,或是直接通过 hostaddr 参数提供的物理 IP。
char *PQhostaddr(const PGconn *conn);
若 conn 参数为 NULL,则返回 NULL。若获取过程中发生错误,则返回空字符串。
PQport #返回当前活跃连接的服务端网络端口号。
char *PQport(const PGconn *conn);
若在连接参数中指定了多个端口,该函数返回实际连上的物理端口。
若 conn 为空指针则返回 NULL;若获取出错则返回空字符串。
若指定了多个备选端口,在连接真正建立前不可依赖该函数返回值。
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 | scram_iterations |
client_encoding | search_path |
DateStyle | server_encoding |
default_transaction_read_only | server_version |
in_hot_standby | session_authorization |
integer_datetimes | standard_conforming_strings |
IntervalStyle | TimeZone |
is_superuser |
(default_transaction_read_only 和
in_hot_standby
在 14 之前的发行版中不被报告;
scram_iterations
在 16 之前的发行版中不被报告;
search_path
在 18 之前的发行版中不被报告。)
注意,
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
#返回当前连接对象上发生的最近一次错误消息字符串。 an operation on the connection.
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 #
返回一个 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。