PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.2. 连接状态函数

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 33.2. 连接状态函数 这些函数可以被用来询问一个已有数据库连接对象的状态。 提示 libpq应用程序员应该小心地维护PGconn抽象。使用下面描述的访问函数来理解PGconn的内容。我们不推荐使用libpq-int.h引用内部的PGconn域,因为它们可能在未来改变。

33.2. 连接状态函数

这些函数可以被用来询问一个已有数据库连接对象的状态。

提示

libpq应用程序员应该小心地维护PGconn抽象。使用下面描述的访问函数来理解PGconn的内容。我们不推荐使用libpq-int.h引用内部的PGconn域,因为它们可能在未来改变。

下列函数返回一个连接所建立的参数值。 这些值在连接的生命期中是固定的。如果使用了多个主机连接字符串, 则如果使用同一个PGconn对象建立了一个新的连接, PQhostPQportPQpass的值可以改变。 其他值在PGconn对象的生命期中是固定的。

PQdb

返回该连接的数据库名。

char *PQdb(const PGconn *conn);

PQuser

返回该连接的用户名。

char *PQuser(const PGconn *conn);

PQpass

返回该连接的口令。

char *PQpass(const PGconn *conn);

PQhost

返回该连接的服务器主机名。

char *PQhost(const PGconn *conn);

PQport

返回该连接的端口。

char *PQport(const PGconn *conn);

PQtty

返回该连接的调试TTY(这已被废弃,因为服务器不再关心TTY设置,但这个函数保持了向后兼容)。

char *PQtty(const PGconn *conn);

PQoptions

返回被传递给连接请求的命令行选项。

char *PQoptions(const PGconn *conn);

下列函数返回会随着在PGconn对象上执行的操作改变的状态数据。

PQstatus

返回该连接的状态。

ConnStatusType PQstatus(const PGconn *conn);

该状态可以是一系列值之一。不过,其中只有两个在一个异步连接过程之外可见:CONNECTION_OKCONNECTION_BAD。一个到数据库的完好连接的状态为CONNECTION_OK。一个失败的连接尝试则由状态CONNECTION_BAD表示。通常,一个 OK 状态将一直保持到PQfinish,但是一次通信失败可能导致该状态过早地改变为CONNECTION_BAD。在那种情况下,该应用可以通过调用PQreset尝试恢复。

关于其他可能会被返回的状态代码,请见PQconnectStartParamsPQconnectStartPQconnectPoll的条目。

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

自当前发布开始会被报告的参数包括 server_version、 server_encoding、 client_encoding、 application_name、 is_superuser、 session_authorization、 DateStyle、 IntervalStyle、 TimeZoneinteger_datetimes以及 standard_conforming_strings( server_encodingTimeZone以及integer_datetimes在 8.0 以前的发布中不被报告;standard_conforming_strings在 8.1 以前的发布中不被报告;IntervalStyle在 8.4 以前的发布中不被报告;application_name在 9.0 以前的发布中不被报告)。注意 server_version、 server_encoding以及 integer_datetimes在启动之后无法改变。

3.0 之前协议的服务器不报告参数设置,但是libpq包括获得server_version以及client_encoding值的逻辑。我们鼓励应用使用PQparameterStatus而不是ad hoc代码来确定这些值(不过注意在一个 3.0 之前的连接上,连接开始后通过SET改变client_encoding不会被PQparameterStatus反映)。对于server_version(另见PQserverVersion),它以一种数字形式返回信息,这样更容易进行比较。

如果没有为standard_conforming_strings报告值,应用能假设它是off,也就是说反斜线会被视为字符串中的转义。还有,这个参数的存在可以被作为转义字符串语法(E'...')被接受的指示。

尽管被返回的指针被声明成const,它事实上指向与PGconn结构相关的可变存储。假定该指针在查询之间保持有效是不明智的。

PQprotocolVersion

询问所使用的 前端/后端协议。

int PQprotocolVersion(const PGconn *conn);

应用可能希望用这个函数来确定某些特性是否被支持。当前,可能值是 2(2.0 协议)、3(3.0 协议)或零(连接损坏)。协议版本在连接启动完成后将不会改变,但是理论上在连接重置期间是可以改变的。当与PostgreSQL 7.4 或以后的服务器通信时通常使用 3.0 协议,7.4 之前的服务器只支持协议 2.0(协议 1.0 已被废弃并且不再被libpq支持)。

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

获得到服务器连接套接字的文件描述符号。一个合法的描述符将会大于等于零。结果为 -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);

这个函数能在一次连接尝试失败或成功后用于检测该服务器是否要求一个口令。

以下函数返回与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库和连接类型而异。如果某个属性不可用,则返回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”。

PQsslAttributeNames

返回可用的SSL属性名称数组。该数组由NULL指针终止。

const char * const * PQsslAttributeNames(const PGconn *conn);

PQsslStruct

返回指向描述连接的特定于SSL实现的对象的指针。

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 则返回空。

void *PQgetssl(const PGconn *conn);

此函数等效于PQsslStruct(conn, "OpenSSL")。 它不应该在新的应用程序中使用,因为返回的结构是特定于OpenSSL的, 并且如果使用了另一个SSL实现则返回的结构将不可用。要检查一个连接是否使用了SSL, 请调用PQsslInUse,有关连接的更多详细信息, 请使用PQsslAttribute

本文转自PostgreSQL中文社区,原文链接:33.2. 连接状态函数

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1天前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
【5月更文挑战第13天】PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
9 0
|
1天前
|
关系型数据库 Java 数据库
docker部署postgresql数据库和整合springboot连接数据源
docker部署postgresql数据库和整合springboot连接数据源
18 0
|
1天前
|
SQL JSON 关系型数据库
[UE虚幻引擎插件DTPostgreSQL] PostgreSQL Connector 使用蓝图连接操作 PostgreSQL 数据库说明
本插件主要是支持在UE蓝图中连接和操作PostgreSQL 数据库。
18 2
|
1天前
|
关系型数据库 分布式数据库 PolarDB
PolarDB产品使用合集之PolarDB-X启动容器时出现32886连接失败的问题,如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
1天前
|
关系型数据库 数据库
关系型数据库使用连接(JOIN)代替子查询
对于复杂的查询优化问题,建议使用数据库的性能分析工具或咨询数据库管理员或专家来获取更具体的建议。
26 1
|
1天前
|
关系型数据库 Linux 网络安全
postgresql 出现连接不上问题(或者安装完连接不上)附加安装教程 亲测有效!
postgresql 出现连接不上问题(或者安装完连接不上)附加安装教程 亲测有效!
20 0
|
1天前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
【2月更文挑战第16天】PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
29 1
|
1天前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因
【2月更文挑战第5天】PolarDB for MySQL数据库外网连接解析失败的原因
67 8
|
1天前
|
关系型数据库 分布式数据库 数据库
PolarDB for PostgreSQL报错问题之psql连接数据库报错如何解决
PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。
|
1天前
|
关系型数据库 分布式数据库 PolarDB
在 Flask 中连接 OceanBase 或 PolarDB
在 Flask 中连接 OceanBase 或 PolarDB【1月更文挑战第12天】【1月更文挑战第59篇】
103 6