这些函数可以被用来询问一个已有数据库连接对象的状态。
以下函数返回建立连接时确定的参数值。这些值在连接存续期间保持不变。如果使用多主机连接字符串,以下函数的值:PQhost, PQport和PQpass可能会在使用同一个PGconn对象建立新连接时改变。其他值在以下对象的整个生命周期内保持不变: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检查。
PQport #返回活跃连接的端口。
char *PQport(const PGconn *conn);
如果在连接参数中指定了多个端口,PQport返回实际连接到的端口。
如果conn参数是NULL,则PQport返回NULL。否则,如果在生成端口信息时发生错误(或许是连接没有被完全建立或者有什么错误),它会返回一个空字符串。
如果在连接参数中指定了多个端口,则在连接建立之前都不能依赖于PQport的结果。连接的状态可以用函数PQstatus检查。
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)或零(连接无效)。连接启动完成后,协议版本不会改变,但理论上可能在重置连接时改变。与PostgreSQL7.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 #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"。
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。