34.11. 控制函数#
这些函数控制libpq行为的各种详细信息。
PQclientEncoding#返回客户端编码。
int PQclientEncoding(const PGconn *
conn);请注意,它返回编码 ID,而不是符号字符串,例如
EUC_JP。如果不成功,则返回 -1。要将编码 ID 转换为编码名称,可以使用char *pg_encoding_to_char(int
encoding_id);PQsetClientEncoding#设置客户端编码。
int PQsetClientEncoding(PGconn *
conn, const char *encoding);conn是与服务器的连接,encoding是您要使用的编码。如果函数成功设置编码,则返回 0,否则返回 -1。可以使用PQclientEncoding确定此连接的当前编码。PQsetErrorVerbosity#确定
PQerrorMessage和PQresultErrorMessage返回的消息详细程度。typedef enum { PQERRORS_TERSE, PQERRORS_DEFAULT, PQERRORS_VERBOSE, PQERRORS_SQLSTATE } PGVerbosity;PGVerbosity PQsetErrorVerbosity(PGconn *conn, PGVerbosity verbosity);
PQsetErrorVerbosity设置详细程度模式,返回连接的先前设置。在 TERSE 模式中,返回的消息仅包括严重性、主文本和位置;这通常适合单行。DEFAULT 模式生成的消息包括上述内容以及任何详细信息、提示或上下文字段(这些字段可能跨越多行)。VERBOSE 模式包括所有可用字段。SQLSTATE 模式仅包括错误严重性和SQLSTATE错误代码(如果可用)(如果没有,则输出类似于 TERSE 模式)。更改详细程度设置不会影响已存在的
PGresult对象的可用消息,只影响随后创建的对象。(但如果要使用不同的详细程度打印之前的错误,请参见PQresultVerboseErrorMessage)。PQsetErrorContextVisibility#确定
PQerrorMessage和PQresultErrorMessage返回的消息中的CONTEXT字段的处理方式。typedef enum { PQSHOW_CONTEXT_NEVER, PQSHOW_CONTEXT_ERRORS, PQSHOW_CONTEXT_ALWAYS } PGContextVisibility;PGContextVisibility PQsetErrorContextVisibility(PGconn *conn, PGContextVisibility show_context);
PQsetErrorContextVisibility设置上下文显示模式,返回连接的前一个设置。此模式控制是否在消息中包含CONTEXT字段。NEVER 模式永远不包含CONTEXT,而 ALWAYS 模式在可用时始终包含它。在 ERRORS 模式(默认模式)中,CONTEXT字段仅包含在错误消息中,不包含在通知和警告中。(但是,如果详细程度设置为 TERSE 或 SQLSTATE,CONTEXT字段将被忽略,无论上下文显示模式是什么。)更改此模式不会影响已存在的
PGresult对象的可用消息,只影响随后创建的对象。(但如果要使用不同的显示模式打印之前的错误,请参见PQresultVerboseErrorMessage)。PQtrace#启用将客户端/服务器通信跟踪到调试文件流。
void PQtrace(PGconn *conn, FILE *stream);
每行包括:可选时间戳、方向指示符(
F表示从客户端到服务器的消息,B表示从服务器到客户端的消息)、消息长度、消息类型和消息内容。非消息内容字段(时间戳、方向、长度和消息类型)用制表符分隔。消息内容用空格分隔。协议字符串用双引号括起来,而用作数据值字符串用单引号括起来。不可打印的字符以十六进制转义符打印。可以在 第 55.7 节 中找到更多特定于消息类型的详细信息。注意
在 Windows 上,如果 libpq 库和应用程序使用不同的标志编译,此函数调用将使应用程序崩溃,因为
FILE指针的内部表示不同。具体来说,多线程/单线程、发布/调试和静态/动态标志对于库和使用该库的所有应用程序应相同。PQsetTraceFlags#控制客户端/服务器通信的跟踪行为。
void PQsetTraceFlags(PGconn *conn, int flags);
flags包含描述跟踪操作模式的标志位。如果flags包含PQTRACE_SUPPRESS_TIMESTAMPS,则在打印每条消息时不包括时间戳。如果flags包含PQTRACE_REGRESS_MODE,则在打印每条消息时会编辑一些字段,例如对象 OID,以便在测试框架中更方便地使用输出。必须在调用PQtrace后调用此函数。PQuntrace#禁用由
PQtrace启动的跟踪。void PQuntrace(PGconn *conn);
