36.11. Функции управления #
Эти функции управляют различными аспектами поведения libpq.
PQclientEncoding#Возвращает кодировку клиента.
int PQclientEncoding(const PGconn *
conn);Заметьте, что она возвращает идентификатор кодировки, а не символьную строку вида
EUC_JP. В случае ошибки она возвращает -1. Преобразовать идентификатор кодировки в имя можно, воспользовавшись следующей функцией: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#Определяет вариант обработки полей
CONTEXTв сообщениях, возвращаемых функциямиPQerrorMessageиPQresultErrorMessage.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для сообщений сервера клиенту), длину сообщения, тип сообщения и содержимое сообщения. Поля содержимого, не связанные с сообщением (отметка времени, направление, длина и тип сообщения), разделяются табуляцией. Содержимое сообщения разделяется пробелами. Строки протокола заключаются в двойные кавычки, а строки, используемые в качестве значений данных, — в апострофы. Непечатаемые символы выводятся в виде шестнадцатеричных спецпоследовательностей. Дополнительную информацию о типах сообщений можно найти в Разделе 57.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);
36.11. Control Functions #
These functions control miscellaneous details of libpq's behavior.
PQclientEncoding#Returns the client encoding.
int PQclientEncoding(const PGconn *
conn);Note that it returns the encoding ID, not a symbolic string such as
EUC_JP. If unsuccessful, it returns -1. To convert an encoding ID to an encoding name, you can use:char *pg_encoding_to_char(int
encoding_id);PQsetClientEncoding#Sets the client encoding.
int PQsetClientEncoding(PGconn *
conn, const char *encoding);connis a connection to the server, andencodingis the encoding you want to use. If the function successfully sets the encoding, it returns 0, otherwise -1. The current encoding for this connection can be determined by usingPQclientEncoding.PQsetErrorVerbosity#Determines the verbosity of messages returned by
PQerrorMessageandPQresultErrorMessage.typedef enum { PQERRORS_TERSE, PQERRORS_DEFAULT, PQERRORS_VERBOSE, PQERRORS_SQLSTATE } PGVerbosity; PGVerbosity PQsetErrorVerbosity(PGconn *conn, PGVerbosity verbosity);PQsetErrorVerbositysets the verbosity mode, returning the connection's previous setting. In TERSE mode, returned messages include severity, primary text, and position only; this will normally fit on a single line. The DEFAULT mode produces messages that include the above plus any detail, hint, or context fields (these might span multiple lines). The VERBOSE mode includes all available fields. The SQLSTATE mode includes only the error severity and theSQLSTATEerror code, if one is available (if not, the output is like TERSE mode).Changing the verbosity setting does not affect the messages available from already-existing
PGresultobjects, only subsequently-created ones. (But seePQresultVerboseErrorMessageif you want to print a previous error with a different verbosity.)PQsetErrorContextVisibility#Determines the handling of
CONTEXTfields in messages returned byPQerrorMessageandPQresultErrorMessage.typedef enum { PQSHOW_CONTEXT_NEVER, PQSHOW_CONTEXT_ERRORS, PQSHOW_CONTEXT_ALWAYS } PGContextVisibility; PGContextVisibility PQsetErrorContextVisibility(PGconn *conn, PGContextVisibility show_context);PQsetErrorContextVisibilitysets the context display mode, returning the connection's previous setting. This mode controls whether theCONTEXTfield is included in messages. The NEVER mode never includesCONTEXT, while ALWAYS always includes it if available. In ERRORS mode (the default),CONTEXTfields are included only in error messages, not in notices and warnings. (However, if the verbosity setting is TERSE or SQLSTATE,CONTEXTfields are omitted regardless of the context display mode.)Changing this mode does not affect the messages available from already-existing
PGresultobjects, only subsequently-created ones. (But seePQresultVerboseErrorMessageif you want to print a previous error with a different display mode.)PQtrace#Enables tracing of the client/server communication to a debugging file stream.
void PQtrace(PGconn *conn, FILE *stream);
Each line consists of: an optional timestamp, a direction indicator (
Ffor messages from client to server orBfor messages from server to client), message length, message type, and message contents. Non-message contents fields (timestamp, direction, length and message type) are separated by a tab. Message contents are separated by a space. Protocol strings are enclosed in double quotes, while strings used as data values are enclosed in single quotes. Non-printable chars are printed as hexadecimal escapes. Further message-type-specific detail can be found in Section 57.7.Note
On Windows, if the libpq library and an application are compiled with different flags, this function call will crash the application because the internal representation of the
FILEpointers differ. Specifically, multithreaded/single-threaded, release/debug, and static/dynamic flags should be the same for the library and all applications using that library.PQsetTraceFlags#Controls the tracing behavior of client/server communication.
void PQsetTraceFlags(PGconn *conn, int flags);
flagscontains flag bits describing the operating mode of tracing. IfflagscontainsPQTRACE_SUPPRESS_TIMESTAMPS, then the timestamp is not included when printing each message. IfflagscontainsPQTRACE_REGRESS_MODE, then some fields are redacted when printing each message, such as object OIDs, to make the output more convenient to use in testing frameworks. This function must be called after callingPQtrace.PQuntrace#Disables tracing started by
PQtrace.void PQuntrace(PGconn *conn);