32.2. Функции, описывающие текущее состояние подключения
Эти функции могут использоваться для опроса состояния объекта, описывающего существующее подключение к базе данных.
Подсказка
  Разработчики приложений на основе libpq должны тщательно поддерживать абстракцию PGconn. Следует использовать функции доступа, описанные ниже, для получения содержимого PGconn. Обращение напрямую к внутренним полям PGconn, используя сведения из libpq-int.h, не рекомендуется, поскольку они могут измениться в будущем.
Следующие функции возвращают значения параметров, которые были установлены в момент подключения. Эти значения не изменяются во время жизни соединения. Если используется строка соединения с несколькими узлами, значения 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возвращает адрес узла, с которым фактически установлено соединение.- PQhostвозвращает- NULL, если аргумент- connравен- NULL. Иначе в случае ошибки при получении информации об узле (это возможно, если соединение не установлено до конца или произошла ошибка) она возвращает пустую строку.- Если в параметрах подключения указаны несколько узлов, на результат - PQhostнельзя полагаться, пока соединение не будет установлено. Проверить состояние соединения позволяет функция- PQstatus.
-  PQport
- Возвращает номер порта активного соединения. - char *PQport(const PGconn *conn); - Если в параметрах подключения было задано несколько портов, - PQportвозвращает порт, с которым фактически установлено соединение.- PQportвозвращает- NULL, если аргумент- connравен- 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. (Значения параметров- server_encoding,- TimeZoneи- integer_datetimesсервер до версии 8.0 не сообщал;- standard_conforming_stringsсервер до версии 8.1 не сообщал;- IntervalStyleсервер до версии 8.4 не сообщал;- application_nameсервер до версии 9.0 не сообщал.) Учтите, что- server_version,- server_encodingи- integer_datetimesнельзя изменить после запуска.- Серверы, поддерживающие протокол только до версии 3.0, не могут сообщать установки параметров, но libpq включает средства, чтобы получить значения для - server_versionи- client_encodingв любом случае. Поощряется использование в приложениях- PQparameterStatus, а не специально написанного (ad hoc) кода, для определения этих значений. (Примите к сведению, однако, что в соединениях, основанных на протоколе версии до 3.0, изменение- client_encodingпосредством команды- SETпосле начала процедуры подключения не будет отражаться функцией- PQparameterStatus.) Сведения о- server_versionприведены также в описании функции- PQserverVersion, возвращающей информацию в числовой форме, в которой гораздо легче выполнять сравнение.- Если для - standard_conforming_stringsне передано никакого значения, то приложения могут принять его равным- off. Это означает, что символы обратной косой черты в строковых литералах интерпретируются в качестве спецсимволов. Также, наличие этого параметра может рассматриваться как указание на то, что синтаксис escape-строк (- E'...') является приемлемым.- Хотя возвращаемый указатель объявлен со спецификатором - const, фактически он указывает на изменяемое хранилище, связанное со структурой- PGconn. Не стоит рассчитывать на то, что указатель останется действительным при последующих запросах.
-  PQprotocolVersion
- Запрашивает протокол, используемый между клиентом и сервером. - int PQprotocolVersion(const PGconn *conn); - Приложения могут использовать эту функцию, чтобы определить, поддерживаются ли опредёленные функциональные возможности. В настоящее время возможными значениями являются 2 (протокол версии 2.0), 3 (протокол версии 3.0) или ноль (проблемы в подключении). Версия протокола не будет изменяться после завершения процедуры подключения, но теоретически она могла бы измениться в процессе переподключения. Версия протокола 3.0 обычно используется при взаимодействии с серверами PostgreSQL версии 7.4 или более поздними; серверы до версии 7.4 поддерживают только протокол версии 2.0. (Протокол версии 1.0 является устаревшим и не поддерживается библиотекой libpq.) 
-  PQserverVersion
- Возвращает целочисленное представление версии сервера. - int PQserverVersion(const PGconn *conn); - Приложения могут использовать эту функцию, чтобы определить версию сервера баз данных, к которому они подключены. Возвращаемое ей число получается в результате умножения номера основной версии на 10000 и добавления номера дополнительной версии. Например, для версии 10.1 будет выдано число 100001, а для версии 11.0 — 110000. Если соединение не работает, то возвращается ноль. - До версии 10, в Postgres Pro номера версий образовывались из трёх чисел, первые два из которых представляли основную версию. Для таких версий - 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
- Получает номер файлового дескриптора для сокета соединения с сервером. Действительный дескриптор будет больше или равен 0; значение -1 показывает, что в данный момент не открыто ни одного соединения с сервером. (Значение не изменится во время обычной работы, но может измениться во время установки или переустановки подключения.) - int PQsocket(const PGconn *conn); 
- PQbackendPID
- Возвращает ID (PID) серверного процесса, обрабатывающего это подключение. - int PQbackendPID(const PGconn *conn); - PID серверного процесса полезен для отладочных целей и для сопоставления с сообщениями команды - NOTIFY(которые включают PID уведомляющего серверного процесса). Примите к сведению, что PID принадлежит процессу, выполняющемуся на компьютере сервера баз данных, а не на локальном компьютере.
- PQconnectionNeedsPassword
- Возвращает true (1), если метод аутентификации соединения требовал пароля, однако он не был предоставлен. Возвращает false (0), если пароль не требовался. - int PQconnectionNeedsPassword(const PGconn *conn); - Эту функцию можно применить после неудачной попытки подключения, чтобы решить, нужно ли предлагать пользователю ввести пароль. 
- PQconnectionUsedPassword
- Возвращает true (1), если метод аутентификации соединения использовал пароль. Возвращает false (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 и типа подключения. Если атрибут недоступен, возвращается 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 объект, описывающий подключение. - void *PQsslStruct(const PGconn *conn, const char *struct_name); - Доступная структура (или структуры) зависит от того, какая реализация SSL применяется. Для OpenSSL выдаётся одна структура под именем "OpenSSL", и эта структура, на которую указывает возвращённый указатель, имеет тип - SSL(определённый в OpenSSL). Для обращения к этой функции можно воспользоваться кодом в следующих строках:- #include <libpq-fe.h> #include <openssl/ssl.h> ... SSL *ssl; dbconn = PQconnectdb(...); ... ssl = PQsslStruct(dbconn, "OpenSSL"); if (ssl) { /* use OpenSSL functions to access ssl */ }- Эта структура может использоваться, чтобы сличить уровни шифрования, проверить сертификаты сервера и т. д. За информацией об этой структуре обратитесь к документации по OpenSSL. 
- PQgetssl
- Возвращает структуру SSL, использовавшуюся в соединении, или null, если SSL не используется. - void *PQgetssl(const PGconn *conn); - Эта функция равнозначна - PQsslStruct(conn, "OpenSSL"). Её не следует применять в новых приложениях, так как возвращаемая структура специфична для OpenSSL и её нельзя будет получить с другой реализацией SSL. Чтобы проверить, использует ли подключение SSL, лучше вызвать- PQsslInUse, а чтобы получить свойства подключения —- PQsslAttribute.