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.
- PQhostaddr
- Возвращает IP-адрес сервера для активного соединения. Это может быть адрес, в который разрешилось имя компьютера, или IP-адрес, переданный в параметре - hostaddr.- char *PQhostaddr(const PGconn *conn); - PQhostaddrвозвращает- NULL, если аргумент- connравен- NULL. Иначе в случае ошибки при получении информации об узле (это возможно, если соединение не установлено до конца или произошла ошибка) она возвращает пустую строку.
- PQport
- Возвращает номер порта активного соединения. - char *PQport(const PGconn *conn); - Если в параметрах подключения было задано несколько портов, - PQportвозвращает порт, с которым фактически установлено соединение.- PQportвозвращает- NULL, если аргумент- connравен- NULL. Иначе в случае ошибки при получении информации о порте (это возможно, если соединение не установлено до конца или произошла ошибка) она возвращает пустую строку.- Если в параметрах подключения указаны несколько портов, на результат - PQportнельзя полагаться, пока соединение не будет установлено. Проверить состояние соединения позволяет функция- PQstatus.
- PQtty
- Эта функция теперь ничего не делает, но необходима для обратной совместимости. Функция всегда возвращает пустую строку или - NULL, если аргумент- connимеет значение- NULL.- 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нельзя изменить после запуска.- Если для - standard_conforming_stringsне передано никакого значения, то приложения могут принять его равным- off. Это означает, что символы обратной косой черты в строковых литералах интерпретируются в качестве спецсимволов. Также, наличие этого параметра может рассматриваться как указание на то, что синтаксис escape-строк (- E'...') является приемлемым.- Хотя возвращаемый указатель объявлен со спецификатором - const, фактически он указывает на изменяемое хранилище, связанное со структурой- PGconn. Не стоит рассчитывать на то, что указатель останется действительным при последующих запросах.
- PQprotocolVersion
- Запрашивает протокол, используемый между клиентом и сервером. - int PQprotocolVersion(const PGconn *conn); - Приложения могут использовать эту функцию, чтобы определить, поддерживаются ли опредёленные функциональные возможности. В настоящее время возможными значениями являются 3 (протокол версии 3.0) или ноль (проблемы в подключении). Версия протокола не будет изменяться после завершения процедуры подключения, но теоретически она могла бы измениться в процессе переподключения. Версия протокола 3.0 обычно используется при взаимодействии с серверами PostgreSQL версии 7.4 или более поздними. 
- 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
- Возвращает - on, если используется сжатие SSL, или- 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.