↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

34.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_nameis_superuser
client_encodingscram_iterations
DateStyleserver_encoding
default_transaction_read_onlyserver_version
in_hot_standbysession_authorization
integer_datetimesstandard_conforming_strings
IntervalStyleTimeZone

(8.0 之前的版本不报告 server_encoding、TimeZone 和 integer_datetimes;8.1 之前的版本不报告 standard_conforming_strings;8.4 之前的版本不报告 IntervalStyle;9.0 之前的版本不报告 application_name;14 之前的版本不报告 default_transaction_read_only 和 in_hot_standby;16 之前的版本不报告 scram_iterations。)注意,server_version、server_encoding 和 integer_datetimes 在启动后不能改变。

如果服务器未报告 standard_conforming_strings 的值,应用程序可以假定其为 off,即反斜杠在字符串字面量中被视为转义字符。此外,服务器报告此参数也表明它接受转义字符串语法(E'...')。

返回的指针虽然被声明为 const,但实际上指向与 PGconn 结构体关联的可变存储。不能假定该指针在执行其他查询后仍然有效。

PQprotocolVersion #

查询正在使用的前端/后端协议。

int PQprotocolVersion(const PGconn *conn);

应用程序可以使用此函数判断是否支持某些特性。目前,可能的值为 3(协议 3.0)或零(连接异常)。连接启动完成后,协议版本不会改变,但理论上可能在连接重置期间改变。PostgreSQL 7.4 及更高版本的服务器支持协议 3.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 #

返回处理这个连接的后端进程的进程 ID(PID)。

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"。

作为一个特例,可以在没有连接的情况下通过将 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 文档反馈表单.