版本:
目录导航

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);
       

如果连接参数同时指定了 hosthostaddr, 则 PQhost 将返回 host 信息。 如果仅指定了 hostaddr,则返回它。 如果在连接参数中指定了多个主机,PQhost 返回实际连接到的主机。

PQhost 返回 NULL 如果 conn 参数是 NULL。 否则,如果有一个错误产生主机信息(或许是连接没有被完全建立或者有什么错误),它会返回一个空字符串。

如果在连接参数中指定了多个主机,则在连接建立之前都不能依赖于 PQhost 的结果。 连接的状态可以用函数 PQstatus 检查。

PQhostaddr

返回活动连接的服务器 IP 地址。这可以是主机名解析出的地址,也可以是通过 hostaddr 参数提供的 IP 地址。

    char *PQhostaddr(const PGconn *conn);

PQhostaddr 返回 NULL 如果 conn 参数是 NULL。 否则,如果生成主机信息时出现错误(如果连接尚未完全建立或出现错误),则返回一个空字符串。

PQport

返回活跃连接的端口。

       char *PQport(const PGconn *conn);
      

如果在连接参数中指定了多个端口,PQport 返回实际连接到的端口。

PQport 返回 NULL 如果 conn 参数是 NULL。 否则,如果有一个错误产生端口信息(或许是连接没有被完全建立或者有什么错误),它会返回一个空字符串。

如果在连接参数中指定了多个端口,则在连接建立之前都不能依赖于 PQport 的结果。 连接的状态可以用函数 PQstatus 检查。

PQtty

这个函数不再做任何事,但是它保持了向后兼容。 这个函数总是返回一个空字符串,或者 NULL,如果 connNULL

       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_versionserver_encodingclient_encodingapplication_namedefault_transaction_read_only, in_hot_standby, is_superusersession_authorizationDateStyleIntervalStyleTimeZoneinteger_datetimes以及 standard_conforming_strings。 (server_encodingTimeZone以及integer_datetimes在 8.0 以前的发布中不被报告; standard_conforming_strings在 8.1 以前的发布中不被报告; IntervalStyle在 8.4 以前的发布中不被报告; application_name在 9.0 以前的发布中不被报告; default_transaction_read_onlyin_hot_standby 再14以前的发布中不被报告) 注意 server_versionserver_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

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

返回 true (1) 如果连接使用 SSL,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"。

作为一个特例,可以在没有连接的情况下通过将 NULL 作为 conn 参数来查询 library 属性。 结果将是默认的 SSL 库名称,或者如果 libpq 在没有任何 SSL 支持的情况下编译,则为 NULL。 (在 PostgreSQL 版本 15 之前,将 NULL 作为 conn 参数传递总是导致 NULL。 需要区分这种情况的新旧实现的客户端程序可以检查 LIBPQ_HAS_SSL_LIBRARY_DETECTION 特征宏。)

PQsslAttributeNames

返回可用的SSL属性名称数组。 数组以NULL指针结尾。

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

PQsslStruct

返回一个指向描述连接的SSL实现特定对象的指针。如果连接未加密或SSL实现不提供连接的请求对象类型,则返回NULL。

void *PQsslStruct(const PGconn *conn, const char *struct_name);

可用的结构体取决于正在使用的SSL实现。 对于OpenSSL,有一个结构体, 可以通过名称OpenSSL获得, 并返回一个指向OpenSSLSSL结构体的指针。 要使用这个函数,可以使用以下代码:

#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