32.2. 连接状态函数 #
这些函数可用于查询现有数据库连接对象的状态。
提示
编写 libpq 应用程序时,应注意维护 PGconn 的抽象。请使用下述访问函数获取 PGconn 的内容。不建议通过 libpq-int.h 引用 PGconn 的内部字段,因为这些字段将来可能改变。
以下函数返回建立连接时确定的参数值。这些值在PGconn对象的生命周期内保持不变。
PQdb#返回该连接的数据库名。
char *PQdb(const PGconn *conn);
PQuser#返回该连接的用户名。
char *PQuser(const PGconn *conn);
PQpass#返回该连接的密码。
char *PQpass(const PGconn *conn);
PQhost#返回连接的服务器主机名。可能是主机名、IP 地址或者一个目录路径(如果通过 Unix 套接字连接,路径的情况很容易区分,因为路径总是一个绝对路径,以
/开始)。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_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。当前版本报告的参数包括:
server_version、server_encoding、client_encoding、application_name、is_superuser、session_authorization、DateStyle、IntervalStyle、TimeZone、integer_datetimes、standard_conforming_strings。(8.0 之前的版本不报告server_encoding、TimeZone和integer_datetimes;8.1 之前的版本不报告standard_conforming_strings;8.4 之前的版本不报告IntervalStyle;9.0 之前的版本不报告application_name。)注意,server_version、server_encoding和integer_datetimes在启动后不能改变。使用 3.0 之前协议的服务器不报告参数设置,但 libpq 仍包含获取
server_version和client_encoding值的逻辑。建议应用程序使用PQparameterStatus,而不是专门编写代码来确定这些值。(但要注意,在使用 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);
应用可能会使用这个函数来判断它们连接到的数据库服务器的版本。这个数字是这样形成的:将主版本、次版本和修订版本号分别转换成两位十进制数,然后把它们拼接在一起。例如,版本8.1.5将被返回为80105,而版本8.2将被返回为80200(不显示前导零)。如果连接无效则返回零。
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#如果连接认证方法要求一个密码但没有可用的密码,返回真(1)。否则返回假(0)。
int PQconnectionNeedsPassword(const PGconn *conn);
这个函数可以在连接尝试失败后被应用于决定是否向用户提示要求一个密码。
PQconnectionUsedPassword#如果连接认证方法使用一个密码,返回真(1)。否则返回假(0)。
int PQconnectionUsedPassword(const PGconn *conn);
这个函数能在一次连接尝试失败或成功后用于检测该服务器是否要求一个密码。
以下函数返回与 SSL 相关的信息。这些信息通常在连接建立后不会改变。
PQsslInUse#如果连接使用 SSL,则返回真(1);否则返回假(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版本。常见值为
"SSLv2"、"SSLv3"、"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) { /* 使用OpenSSL函数访问ssl */ }这个结构体可用于验证加密级别,检查服务器证书等。请参考OpenSSL 文档以获取有关此结构体的信息。
PQgetssl#返回在连接中使用的SSL结构体,如果未使用SSL,则返回NULL。
void *PQgetssl(const PGconn *conn);
这个函数等同于
PQsslStruct(conn, "OpenSSL")。不应该在新应用程序中使用,因为返回的结构体特定于OpenSSL,如果使用另一个SSL实现,则不可用。要检查连接是否使用SSL,请调用PQsslInUse,要获取有关连接的更多详细信息,请使用PQsslAttribute。