32.1. Функции управления подключением к базе данных
Следующие функции имеют дело с созданием подключения к серверу Postgres Pro. Прикладная программа может иметь несколько подключений к серверу, открытых одновременно. (Одна из причин этого заключается в необходимости доступа к более чем одной базе данных.) Каждое соединение представляется объектом PGconn, который можно получить от функций PQconnectdb, PQconnectdbParams или PQsetdbLogin. Обратите внимание, что эти функции всегда возвратят ненулевой указатель на объект, если только, возможно, не осталось слишком мало памяти даже для того, чтобы выделить её для объекта PGconn. Прежде чем передавать запросы через объект подключения, следует вызвать функцию PQstatus для проверки возвращаемого значения в случае успешного подключения.
Предупреждение
Если к базе данных, которая не приведена в соответствие шаблону безопасного использования схем, имеют доступ недоверенные пользователи, начинайте сеанс с удаления доступных им для записи схем из пути поиска (search_path). Для этого можно присвоить параметру с ключом options значение -csearch_path=. Также можно выполнить PQexec( после подключения. Это касается не только psql, но и любых других интерфейсов для выполнения произвольных SQL-команд.соединение, "SELECT pg_catalog.set_config('search_path', '', false)")
Предупреждение
В системе Unix создание дочернего процесса на основе процесса, уже имеющего открытые подключения с помощью libpq, может привести к непредсказуемым результатам, потому что родительский и дочерний процессы совместно используют одни и те же сокеты и ресурсы операционной системы. По этой причине подобный подход не рекомендуется. Однако использование системного вызова exec из дочернего процесса для загрузки нового исполняемого файла является безопасным.
PQconnectdbParamsСоздаёт новое подключение к серверу баз данных.
PGconn *PQconnectdbParams(const char * const *keywords, const char * const *values, int expand_dbname);Эта функция открывает новое соединение с базой данных, используя параметры, содержащиеся в двух массивах, завершающихся символом
NULL. Первый из них,keywords, определяется как массив строк, каждая из которых представляет собой ключевое слово. Второй,values, даёт значение для каждого ключевого слова. В отличие отPQsetdbLogin, описываемой ниже, набор параметров может быть расширен без изменения сигнатуры функции, поэтому использование данной функции (или её неблокирующих аналоговPQconnectStartParamsиPQconnectPoll) является предпочтительным при разработке новых приложений.Ключевые слова-параметры, распознаваемые в настоящее время, приведены в Подразделе 32.1.2.
Когда
expand_dbnameимеет ненулевое значение, тогда в качестве значения, соответствующего ключевому словуdbname, может быть указана строка подключения. Только первый экземплярdbnameрасширяется таким образом, а все последующие значенияdbnameбудут обработаны как обычные имена базы данных. Дополнительные сведения о возможных форматах строки подключения можно найти в Подразделе 32.1.1.Передаваемые массивы могут быть пустыми. В этом случае используются все параметры по умолчанию. Массивы могут также содержать один или более элементов и должны быть согласованы по длине. Обработка прекращается, когда найден первый элемент со значением
NULLв массивеkeywords.Если какой-либо параметр имеет значение
NULLили содержит пустую строку, проверяется значение соответствующей переменной окружения (см. Раздел 32.14). Если и переменная окружения не установлена, используется встроенное значение по умолчанию.В общем случае ключевые слова обрабатываются в индексном порядке, начиная с начала этих массивов. Вследствие такого подхода, когда ключевые слова повторяются, сохраняется последнее обработанное значение. Следовательно, за счёт соответствующего расположения ключевого слова
dbnameможно регулировать, что может быть переопределено строкойconninfo, а что не может.PQconnectdbСоздаёт новое подключение к серверу баз данных.
PGconn *PQconnectdb(const char *conninfo);
Эта функция открывает новое соединение с базой данных, используя параметры, полученные из строки
conninfo.Передаваемая строка может быть пустой. В этом случае используются все параметры по умолчанию. Она также может содержать одно или более значений параметров, разделённых пробелами, или URI. За подробностями обратитесь к Подразделу 32.1.1.
PQsetdbLoginСоздаёт новое подключение к серверу баз данных.
PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd);Это предшественница функции
PQconnectdbс фиксированным набором параметров. Она имеет такую же функциональность, за исключением того, что непереданные параметры всегда принимают значения по умолчанию. ПодставьтеNULLили пустую строку в качестве любого из фиксированных параметров, которые должны принять значения по умолчанию.Если параметр
dbNameсодержит знак=или имеет допустимый префикс URI для подключения, то он воспринимается в качестве строкиconninfoточно таким же образом, как если бы он был передан функцииPQconnectdb, а оставшиеся параметры затем применяются, как указано дляPQconnectdbParams.PQsetdbСоздаёт новое подключение к серверу баз данных.
PGconn *PQsetdb(char *pghost, char *pgport, char *pgoptions, char *pgtty, char *dbName);Это макрос, который вызывает
PQsetdbLoginс нулевыми указателями в качестве значений параметровloginиpwd. Обеспечивает обратную совместимость с очень старыми программами.PQconnectStartParamsPQconnectStartPQconnectPollСоздают подключение к серверу баз данных неблокирующим способом.
PGconn *PQconnectStartParams(const char * const *keywords, const char * const *values, int expand_dbname); PGconn *PQconnectStart(const char *conninfo); PostgresPollingStatusType PQconnectPoll(PGconn *conn);Три эти функции используются для того, чтобы открыть подключение к серверу баз данных таким образом, чтобы поток исполнения вашего приложения не был заблокирован при выполнении удалённой операции ввода/вывода в процессе подключения. Суть этого подхода в том, чтобы ожидание завершения операций ввода/вывода могло происходить в главном цикле приложения, а не в внутри функций
PQconnectdbParamsилиPQconnectdb, с тем, чтобы приложение могло управлять этой операцией параллельно с другой работой.С помощью функции
PQconnectStartParamsподключение к базе данных выполняется, используя параметры, взятые из массивовkeywordsиvalues, а управление осуществляется с помощьюexpand_dbname, как описано выше дляPQconnectdbParams.С помощью функции
PQconnectStartподключение к базе данных выполняется, используя параметры, взятые из строкиconninfo, как описано выше дляPQconnectdb.Ни
PQconnectStartParams, ниPQconnectStart, ниPQconnectPollне заблокируются до тех пор, пока выполняется ряд ограничений:Параметр
hostaddrдолжен использоваться так, чтобы для разрешения заданного имени не требовалось выполнять запросы DNS. Подробнее этот параметр описан в Подразделе 32.1.2.Если вы вызываете
PQtrace, обеспечьте, чтобы поток, в который выводится трассировочная информация, не заблокировался.Перед вызовом
PQconnectPollвы должны перевести сокет в соответствующее состояние, как описано ниже.
Чтобы начать неблокирующий запрос на подключение, вызовите
PQconnectStartилиPQconnectStartParams. Если результатом будет null, значит libpq не смогла выделить память для новой структурыPGconn. В противном случае возвращается действительный указательPGconn(хотя он ещё не представляет установленное подключение к базе данных). Затем вызовитеPQstatus(conn). Если результатом будетCONNECTION_BAD, значит попытка подключения уже не будет успешной, возможно, из-за неверных параметров.Если вызов
PQconnectStartилиPQconnectStartParamsоказался успешным, теперь нужно опросить libpq для продолжения процедуры подключения. ВызовитеPQsocket(conn)для получения дескриптора нижележащего сокета, через который устанавливается соединение. (Внимание: этот сокет может меняться от вызова к вызовуPQconnectPoll.) Организуйте цикл таким образом: еслиPQconnectPoll(conn)при последнем вызове возвращаетPGRES_POLLING_READING, ожидайте, пока сокет не окажется готовым для чтения (это покажет функцияselect(),poll()или подобная системная функция). Затем снова вызовитеPQconnectPoll(conn). Если жеPQconnectPoll(conn)при последнем вызове возвратилаPGRES_POLLING_WRITING, дождитесь готовности сокета к записи, а затем снова вызовитеPQconnectPoll(conn). На первой итерации, то есть когда вы ещё не вызывалиPQconnectPoll, реализуйте то же поведение, что и после полученияPGRES_POLLING_WRITING. Продолжайте этот цикл, покаPQconnectPoll(conn)не выдаст значениеPGRES_POLLING_FAILED, сигнализирующее об ошибке при установлении соединения, илиPGRES_POLLING_OK, показывающее, что соединение установлено успешно.В любое время в процессе подключения его состояние можно проверить, вызвав
PQstatus. Если этот вызов возвратитCONNECTION_BAD, значит, процедура подключения завершилась сбоем; если вызов возвратитCONNECTION_OK, значит, соединение готово. Оба эти состояния можно определить на основе возвращаемого значения функцииPQconnectPoll, описанной выше. Другие состояния могут также иметь место в течение (и только в течение) асинхронной процедуры подключения. Они показывают текущую стадию процедуры подключения и могут быть полезны, например, для предоставления обратной связи пользователю. Вот эти состояния:CONNECTION_STARTEDОжидание, пока соединение будет установлено.
CONNECTION_MADEСоединение установлено; ожидание отправки.
CONNECTION_AWAITING_RESPONSEОжидание ответа от сервера.
CONNECTION_AUTH_OKАутентификация получена; ожидание завершения запуска серверной части.
CONNECTION_SSL_STARTUPСогласование SSL-шифрования.
CONNECTION_SETENVСогласование значений параметров, зависящих от программной среды.
CONNECTION_CHECK_WRITABLEПроверка, можно ли через подключение выполнять пишущие транзакции.
CONNECTION_CONSUMEПрочтение всех оставшихся ответных сообщений через подключение.
Заметьте, что, хотя эти константы и сохранятся (для поддержания совместимости), приложение никогда не должно полагаться на то, что они появятся в каком-то конкретном порядке или вообще появятся, а также на то, что состояние всегда примет одно из этих документированных значений. Приложение может сделать что-то наподобие:
switch(PQstatus(conn)) { case CONNECTION_STARTED: feedback = "Подключение..."; break; case CONNECTION_MADE: feedback = "Подключён к серверу..."; break; . . . default: feedback = "Подключение..."; }Параметр подключения
connect_timeoutигнорируется, когда используетсяPQconnectPoll; именно приложение отвечает за принятие решения о том, является ли истекшее время чрезмерным. В противном случае вызовPQconnectStartс последующим вызовомPQconnectPoll в циклебудут эквивалентны вызовуPQconnectdb.Заметьте, что если функция
PQconnectStartилиPQconnectStartParamsвозвращает ненулевой указатель, вы должны вызватьPQfinish, закончив его использование, чтобы освободить полученную структуру и все связанные с ней блоки памяти. Это нужно сделать, даже если попытка подключения не последует или окажется неуспешной.PQconndefaultsВозвращает значения по умолчанию для параметров подключения.
PQconninfoOption *PQconndefaults(void); typedef struct { char *keyword; /* Ключевое слово для данного параметра */ char *envvar; /* Имя альтернативной переменной окружения */ char *compiled; /* Альтернативное значение по умолчанию, назначенное при компиляции */ char *val; /* Текущее значение параметра или NULL */ char *label; /* Обозначение этого поля в диалоге подключения */ char *dispchar; /* Показывает, как отображать это поле в диалоге подключения. Значения следующие: "" Отображать введённое значение "как есть" "*" Поле пароля — скрывать значение "D" Параметр отладки — не показывать по умолчанию */ int dispsize; /* Размер поля в символах для диалога */ } PQconninfoOption;Возвращает массив параметров подключения. Он может использоваться для определения всех возможных параметров
PQconnectdbи их текущих значений по умолчанию. Возвращаемое значение указывает на массив структурPQconninfoOption, который завершается элементом, имеющим нулевой указательkeyword. Если выделить память не удалось, то возвращается нулевой указатель. Обратите внимание, что текущие значения по умолчанию (поляval) будут зависеть от переменных среды и другого контекста. Отсутствующий или неверный сервисный файл будет молча проигнорирован. Вызывающие функции должны рассматривать данные параметров по умолчанию как "только для чтения".После обработки массива параметров освободите память, передав его функции
PQconninfoFree. Если этого не делать, то при каждом вызове функцииPQconndefaultsбудут происходить небольшие "утечки" памяти.PQconninfoВозвращает параметры подключения, используемые действующим соединением.
PQconninfoOption *PQconninfo(PGconn *conn);
Возвращает массив параметров подключения. Он может использоваться для определения всех возможных параметров
PQconnectdbи значений, которые были использованы для подключения к серверу. Возвращаемое значение указывает на массив структурPQconninfoOption, который завершается элементом, имеющим нулевой указательkeyword. Все замечания, приведённые выше дляPQconndefaults, также справедливы и для результатаPQconninfo.PQconninfoParseВозвращает разобранные параметры подключения, переданные в строке подключения.
PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
Разбирает строку подключения и возвращает результирующие параметры в виде массива; возвращает
NULL, если возникают проблемы при разборе строки подключения. Эту функцию можно использовать для извлечения параметров функцииPQconnectdbиз предоставленной строки подключения. Возвращаемое значение указывает на массив структурPQconninfoOption, который завершается элементом, имеющим нулевой указательkeyword.Все разрешённые параметры будут присутствовать в результирующем массиве, но
PQconninfoOptionдля любого параметра, не присутствующего в строке подключения, будет иметь значениеNULLв полеval; значения по умолчанию не подставляются.Если
errmsgне равноNULL, тогда в случае успеха*errmsgприсваиваетсяNULL, а в противном случае -- адрес строки сообщения об ошибке, объясняющего проблему. Память для этой строки выделяет функцияmalloc. (Также возможна ситуация, когда*errmsgбудет установлено вNULL, и при этом функция возвращаетNULL. Это указывает на нехватку памяти.)После обработки массива параметров освободите память, передав его функции
PQconninfoFree. Если этого не делать, тогда некоторое количество памяти будет утекать при каждом вызовеPQconninfoParse. И наоборот, если произошла ошибка иerrmsgне равноNULL, обязательно освободите память, занимаемую строкой сообщения об ошибке, используяPQfreemem.PQfinishЗакрывает соединение с сервером. Также освобождает память, используемую объектом
PGconn.void PQfinish(PGconn *conn);
Обратите внимание, что даже если попытка подключения к серверу потерпела неудачу (как показывает
PQstatus), приложение все равно должно вызватьPQfinish, чтобы освободить память, используемую объектомPGconn. УказательPGconnне должен использоваться повторно после того, как была вызвана функцияPQfinish.PQresetПереустанавливает канал связи с сервером.
void PQreset(PGconn *conn);
Эта функция закроет подключение к серверу, а потом попытается восстановить подключение к тому же серверу, используя все те же параметры, которые использовались прежде. Это может быть полезным для восстановления после ошибки, если работающее соединение оказалось потерянным.
PQresetStartPQresetPollПереустанавливает канал связи с сервером неблокирующим способом.
int PQresetStart(PGconn *conn); PostgresPollingStatusType PQresetPoll(PGconn *conn);
Эти функции закроют подключение к серверу, а потом попытаются восстановить подключение к тому же серверу, используя все те же параметры, которые использовались прежде. Это может быть полезным для восстановления после ошибки, если работающее соединение оказалось потерянным. Они отличаются от
PQreset(см. выше) тем, что действуют неблокирующим способом. На эти функции налагаются те же ограничения, что и наPQconnectStartParams,PQconnectStartиPQconnectPoll.Чтобы приступить к переустановке подключения, вызовите
PQresetStart. Если она возвратит 0, переустановка завершилась неудачно. Если она возвратит 1, опросите результат переустановки, используяPQresetPoll, точно таким же образом, как если бы вы создавали подключение, используяPQconnectPoll.PQpingParamsPQpingParamsсообщает состояние сервера. Она принимает параметры подключения, идентичные тем, что получает функцияPQconnectdbParams, описанная выше. Нет необходимости предоставлять корректные имя пользователя, пароль или имя базы данных, чтобы получить состояние сервера. Однако, если предоставлены некорректные значения, сервер занесёт в журнал неудачную попытку подключения.PGPing PQpingParams(const char * const *keywords, const char * const *values, int expand_dbname);Функция возвращает одно из следующих значений:
PQPING_OKСервер работает и, по-видимому, принимает подключения.
PQPING_REJECTСервер работает, но находится в состоянии, которое запрещает подключения (запуск, завершение работы или восстановление после аварийного отказа).
PQPING_NO_RESPONSEКонтакт с сервером не удался. Это может указывать на то, что сервер не запущен или что-то не в порядке с параметрами данного подключения (например, неверный номер порта), или имеет место проблема с возможностью соединения по сети (например, брандмауэр блокирует запрос на подключение).
PQPING_NO_ATTEMPTНикакой попытки установить контакт с сервером сделано не было, поскольку предоставленные параметры были явно некорректными, или имела место какая-то проблема на стороне клиента (например, нехватка памяти).
PQpingPQpingсообщает состояние сервера. Она принимает параметры подключения, идентичные тем, что получает функцияPQconnectdb, описанная выше. Нет необходимости предоставлять корректные имя пользователя, пароль или имя базы данных, чтобы получить состояние сервера. Однако, если предоставлены некорректные значения, сервер занесёт в журнал неудачную попытку подключения.PGPing PQping(const char *conninfo);
Возвращаемые значения такие же, как и для
PQpingParams.
32.1.1. Строки параметров подключения
Ряд функций libpq разбирают заданную пользователем строку для извлечения параметров подключения. Есть два принятых формата этих строк: простой ключ = значение и URI. Строки URI в основном соответствуют RFC 3986, но могут содержать также строки подключения с несколькими узлами, как описано ниже.
32.1.1.1. Строки параметров подключения вида "ключ/значение"
Согласно первому формату, установка каждого параметра выполняется в форме keyword = value. Пробелы вокруг знака равенства не являются обязательными. Для записи пустого значения или значения, содержащего пробелы, заключите его в одинарные кавычки, например, keyword = 'a value'. Одинарные кавычки и символы обратной косой черты внутри значения нужно обязательно экранировать с помощью символа обратной косой черты, т. е., \' и \\.
Пример:
host=localhost port=5432 dbname=mydb connect_timeout=10
Ключевые слова-параметры, распознаваемые в настоящее время, приведены в Подразделе 32.1.2.
32.1.1.2. URI для подключения
Общая форма URI для подключения такова:
postgresql://[user[:password]@][netloc][:port][,...][/dbname][?param1=value1&...]
В качестве обозначения схемы URI может использоваться либо postgresql://, либо postgres://. Каждая из частей URI является необязательной. В следующих примерах показано правильное использование синтаксиса URI:
postgresql:// postgresql://localhost postgresql://localhost:5433 postgresql://localhost/mydb postgresql://user@localhost postgresql://user:secret@localhost postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp postgresql://host1:123,host2:456/somedb?target_session_attrs=any&application_name=myapp
Компоненты иерархической части URI можно также передавать в виде параметров. Например:
postgresql:///mydb?host=localhost&port=5433
Для включения символов, имеющих специальное значение, в любой части URI можно применять URL-кодирование (с использованием %), например заменить = на %3D.
Любые параметры соединения, не соответствующие ключевым словам, приведённым в Подразделе 32.1.2, игнорируются, а предупреждающее сообщение об этом направляется на stderr.
Для улучшения совместимости с теми URI, которые служат для подключения через JDBC, все экземпляры параметра ssl=true преобразуются в sslmode=require.
Сервер можно представить либо доменным именем, либо IP-адресом. При использовании протокола IPv6 нужно заключить адрес в квадратные скобки:
postgresql://[2001:db8::1234]/database
Компонент "host" интерпретируется в соответствии с описанием параметра host. В частности, если этот компонент пуст или начинается с символа косой черты, выбирается соединение через Unix-сокеты, а в противном случае инициируется соединение по TCP/IP. Обратите внимание, однако, что символ косой черты в иерархической части URI является зарезервированным. Поэтому, чтобы указать нестандартный каталог Unix-сокета, нужно поступить одним из двух способов: не задавать сервер в URI и указать сервер в качестве параметра, либо закодировать путь в компоненте "host" с процентами:
postgresql:///dbname?host=/var/lib/postgresql postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
В одном URI можно задать несколько компонентов узлов, каждый с необязательным указанием порта. URI вида postgresql://host1:port1,host2:port2,host3:port3/ равнозначно строке подключения вида host=host1,host2,host3 port=port1,port2,port3. Эти узлы будут перебираться по очереди, пока не будет установлено подключение.
32.1.1.3. Указание нескольких узлов
В строке подключения можно задать несколько узлов, к которым клиент будет пытаться подключиться в заданном порядке. Параметры host, hostaddr и port в формате ключ/значение принимают список значений, разделённых запятыми. В каждом определяемом параметре должно содержаться одинаковое число элементов, чтобы, например, первый элемент hostaddr соответствовал первому элементу host, второй — второму host и так далее. Исключение составляет port — если этот параметр содержит только один элемент, он применяется ко всем узлам.
В формате URI внутри компонента host можно указать несколько пар host:port, разделённых запятыми.
В любом формате одно имя узла может переводиться в несколько сетевых адресов. Например, часто бывает, что один узел имеет и адрес IPv4, и адрес IPv6.
Когда задаются несколько узлов или когда одно имя узла переводится в несколько адресов, все узлы и адреса перебираются по порядку, пока подключение не будет установлено. Если ни один из адресов не будет доступен, произойдёт сбой подключения. Если подключение устанавливается успешно, но происходит ошибка аутентификации, остальные узлы в списке не перебираются.
Если используется файл паролей, в нём можно задать разные пароли для разных узлов. Все остальные параметры подключения будут одинаковыми для всех узлов; например, нельзя задать для разных узлов различные имена пользователей.
32.1.2. Ключевые слова-параметры
Ключевые слова-параметры, распознаваемые в настоящее время, следующие:
hostИмя компьютера для подключения. Если это имя начинается с косой черты, оно выбирает подключение через Unix-сокет, а не через TCP/IP, и задаёт имя каталога, содержащего файл сокета. По умолчанию, если параметр
hostотсутствует или пуст, выполняется подключение к Unix-сокету в/tmp(или в том каталоге сокетов, который был задан при сборке Postgres Pro). В системах, где Unix-сокеты не поддерживаются, по умолчанию выполняется подключение кlocalhost.Также принимается разделённый запятыми список имён узлов; при этом данные имена будут перебираться по порядку. Для пустых элементов списка применяется поведение по умолчанию, описанное выше. За подробностями обратитесь к Подразделу 32.1.1.3.
hostaddrЧисловой IP-адрес компьютера для подключения. Он должен быть представлен в стандартном формате адресов IPv4, например,
172.28.40.9. Если ваша машина поддерживает IPv6, вы можете использовать и эти адреса. Связь по протоколу TCP/IP используется всегда, когда в качестве этого параметра передана непустая строка.Использование
hostaddrвместоhostпозволяет приложению избежать поиска на сервере имён, что может быть важно для приложений, имеющих ограничения по времени. Однако имя компьютера требуется для методов аутентификации GSSAPI или SSPI, а также для проверки полномочий на основе SSL-сертификатов в режимеverify-full. Применяются следующие правила:Если адрес
hostзадаётся безhostaddr, осуществляется разрешение имени. (При использованииPQconnectPollразрешение производится, когдаPQconnectPollрассматривает это имя в первый раз, и может заблокироватьPQconnectPollна неопределённое время.)Если указан
hostaddr, аhostне указан, тогда значениеhostaddrдаёт сетевой адрес сервера. Попытка подключения завершится неудачей, если метод аутентификации требует наличия имени компьютера.Если указаны как
host, так иhostaddr, тогда значениеhostaddrдаёт сетевой адрес сервера, а значениеhostигнорируется, если только метод аутентификации его не потребует. В таком случае оно будет использоваться в качестве имени компьютера.
Заметьте, что аутентификация может завершится неудачей, если
hostне является именем сервера с сетевым адресомhostaddr. Также заметьте, что когда указывается иhost, иhostaddr, соединение в файле паролей идентифицируется по значениюhost(см. Раздел 32.15).Также принимается разделённый запятыми список значений
hostaddr, при этом данные узлы будут перебираться по порядку. Вместо пустого элемента в этом списке будет подставлено имя соответствующего узла или, если и оно не определено, имя узла по умолчанию. За подробностями обратитесь к Подразделу 32.1.1.3.Если не указаны ни имя компьютера, ни его адрес, libpq будет производить подключение, используя локальный Unix-сокет; в системах, не поддерживающих Unix-сокеты, она будет пытаться подключиться к
localhost.portНомер порта, к которому нужно подключаться на сервере, либо расширение имени файла сокета для соединений через Unix-сокеты. Если в параметрах
hostилиhostaddrзадано несколько серверов, в данном параметре может задаваться через запятую список портов такой же длины, либо может указываться один номер порта для всех узлов. Пустая строка или пустой элемент в списке через запятую воспринимается как номер порта по умолчанию, установленный при сборке PostgreSQL.dbnameИмя базы данных. По умолчанию оно совпадает с именем пользователя. В определённых контекстах это значение проверяется на соответствие расширенным форматам; см. Подраздел 32.1.1 для получения подробной информации.
userИмя пользователя Postgres Pro, используемое для подключения. По умолчанию используется то же имя, которое имеет в операционной системе пользователь, от лица которого выполняется приложение.
passwordПароль, используемый в случае, когда сервер требует аутентификации по паролю.
passfileЗадаёт имя файла, в котором будут храниться пароли (см. Раздел 32.15). По умолчанию это
~/.pgpassили%APPDATA%\postgresql\pgpass.confв Microsoft Windows. (Отсутствие этого файла не считается ошибкой.)connect_timeoutМаксимальное время ожидания подключения (задаётся десятичным целым числом, например:
10). При нуле, отрицательном или неопределённом значении ожидание будет бесконечным. Минимальный допустимый тайм-аут равен 2 секундам; таким образом, значение1воспринимается как2. Этот тайм-аут применяется для каждого отдельного IP-адреса или имени сервера. Например, если вы зададите адреса двух серверов и значениеconnect_timeoutбудет равно 5, тайм-аут при неудачной попытке подключения к каждому серверу произойдёт через 5 секунд, а общее время ожидания подключения может достигать 10 секунд.client_encodingЭтим устанавливается конфигурационный параметр
client_encodingдля данного подключения. В дополнение к значениям, которые принимает соответствующий параметр сервера, вы можете использовать значениеauto. В этом случае правильная кодировка определяется на основе текущей локали на стороне клиента (в системах Unix это переменная системного окруженияLC_CTYPE).optionsЗадаёт параметры командной строки, которые будут отправлены серверу при установлении соединения. Например, значение
-c geqo=offустановит для параметра сеансаgeqoзначениеoff. Пробелы в этой строке считаются разделяющими аргументы командной строки, если только перед ними не стоит обратная косая черта (\); чтобы записать собственно обратную косую черту, её нужно продублировать (\\). Подробное описание возможных параметров можно найти в Главе 18.application_nameУстанавливает значение для конфигурационного параметра application_name.
fallback_application_nameУстанавливает альтернативное значение для конфигурационного параметра application_name. Это значение будет использоваться, если для параметра
application_nameне было передано никакого значения с помощью параметров подключения или переменной системного окруженияPGAPPNAME. Задание альтернативного имени полезно для универсальных программ-утилит, которые желают установить имя приложения по умолчанию, но позволяют пользователю изменить его.keepalivesУправляет использованием сообщений keepalive протокола TCP на стороне клиента. Значение по умолчанию равно 1, что означает использование сообщений. Вы можете изменить его на 0, если эти сообщения не нужны. Для соединений, установленных через Unix-сокеты, этот параметр игнорируется.
keepalives_idleУправляет длительностью периода отсутствия активности, выраженного числом секунд, по истечении которого TCP должен отправить сообщение keepalive серверу. При значении 0 действует системная величина. Этот параметр игнорируется для соединений, установленных через Unix-сокеты, или если сообщения keepalive отключены. Он поддерживается только в системах, воспринимающих параметр сокета
TCP_KEEPIDLEили равнозначный, и в Windows; в других системах он не оказывает влияния.keepalives_intervalЗадаёт количество секунд, по прошествии которых сообщение keepalive протокола TCP, получение которого не подтверждено сервером, должно быть отправлено повторно. При значении 0 действует системная величина. Этот параметр игнорируется для соединений, установленных через Unix-сокеты, или если сообщения keepalive отключены. Он поддерживается только в системах, воспринимающих параметр сокета
TCP_KEEPINTVLили равнозначный, и в Windows; в других системах он не оказывает влияния.keepalives_countЗадаёт количество сообщений keepalive протокола TCP, которые могут быть потеряны, прежде чем соединение клиента с сервером будет признано неработающим. Нулевое значение этого параметра указывает, что будет использоваться системное значение по умолчанию. Этот параметр игнорируется для соединений, установленных через Unix-сокеты, или если сообщения keepalive отключены. Он поддерживается только в системах, воспринимающих параметр сокета
TCP_KEEPCNTили равнозначный; в других системах он не оказывает влияния.ttyИгнорируется (прежде он указывал, куда направить вывод отладочных сообщений сервера).
sslmodeЭтот параметр определяет, будет ли согласовываться с сервером защищённое SSL-соединение по протоколу TCP/IP, и если да, то в какой очередности. Всего предусмотрено шесть режимов:
disableследует пытаться установить только соединение без использования SSL
allowсначала следует попытаться установить соединение без использования SSL; если попытка будет неудачной, нужно попытаться установить SSL-соединение
prefer(по умолчанию)сначала следует попытаться установить SSL-соединение; если попытка будет неудачной, нужно попытаться установить соединение без использования SSL
requireследует попытаться установить только SSL-соединение. Если присутствует файл корневого центра сертификации, то нужно верифицировать сертификат таким же способом, как будто был указан параметр
verify-caverify-caследует попытаться установить только SSL-соединение, при этом проконтролировать, чтобы сертификат сервера был выпущен доверенным центром сертификации (CA)
verify-fullследует попытаться установить только SSL-соединение, при этом проконтролировать, чтобы сертификат сервера был выпущен доверенным центром сертификации (CA) и чтобы имя запрошенного сервера соответствовало имени в сертификате
В Разделе 32.18 приведено подробное описание работы этих режимов.
sslmodeигнорируется при использовании Unix-сокетов. Если Postgres Pro скомпилирован без поддержки SSL, использование параметровrequire,verify-caилиverify-fullприведёт к ошибке, в то время как параметрыallowиpreferбудут приняты, но libpq в действительности не будет пытаться установить SSL-соединение.requiresslИспользовать этот параметр не рекомендуется, в качестве замены предлагается установить
sslmode.Если установлено значение 1, то требуется SSL-соединение с сервером (это эквивалентно
sslmoderequire). libpq в таком случае откажется подключаться, если сервер не принимает SSL-соединений. Если установлено значение 0 (по умолчанию), тогда libpq будет согласовывать тип подключения с сервером (эквивалентноsslmodeprefer). Этот параметр доступен, если только Postgres Pro скомпилирован с поддержкой SSL.sslcompressionЕсли установлено значение 1 (по умолчанию), данные, пересылаемые через SSL-соединения, будут сжиматься. Если установлено значение 0, сжатие будет отключено (для этого требуется OpenSSL версии 1.0.0 или более поздней). Этот параметр игнорируется, если выполнено подключение без SSL, или если используемая версия OpenSSL не поддерживает его.
Сжатие требует процессорного времени, но может улучшить пропускную способность, если узким местом является сеть. Отключение сжатия может улучшить время отклика и пропускную способность, если ограничивающим фактором является производительность CPU.
sslcertЭтот параметр предписывает имя файла для SSL-сертификата клиента, заменяющего файл по умолчанию
~/.postgresql/postgresql.crt. Этот параметр игнорируется, если SSL-подключение не выполнено.sslkeyЭтот параметр предписывает местоположение секретного ключа, используемого для сертификата клиента. Он может либо указывать имя файла, которое будет использоваться вместо имени по умолчанию
~/.postgresql/postgresql.key, либо он может указывать ключ, полученный от внешнего «криптомодуля» (криптомодули — это загружаемые модули OpenSSL). Спецификация внешнего криптомодуля должна состоять из имени модуля и ключевого идентификатора, зависящего от конкретного модуля, разделённых двоеточием. Этот параметр игнорируется, если SSL-подключение не выполнено.sslrootcertЭтот параметр указывает имя файла, содержащего SSL-сертификаты, выданные Центром сертификации (CA). Если файл существует, сертификат сервера будет проверен на предмет его подписания одним из этих центров. Имя по умолчанию —
~/.postgresql/root.crt.sslcrlЭтот параметр указывает имя файла, содержащего список отозванных SSL-сертификатов (CRL). Сертификаты, перечисленные в этом файле, если он существует, будут отвергаться при попытке установить подлинность сертификата сервера. Имя по умолчанию такое
~/.postgresql/root.crl.requirepeerЭтот параметр указывает имя пользователя операционной системы, предназначенное для сервера, например,
requirepeer=postgres. При создании подключения через Unix-сокет, если этот параметр установлен, клиент проверяет в самом начале процедуры подключения, что серверный процесс запущен от имени указанного пользователя; если это не так, соединение аварийно прерывается с ошибкой. Этот параметр можно использовать, чтобы обеспечить аутентификацию сервера, подобную той, которая доступна с помощью SSL-сертификатов при соединениях по протоколу TCP/IP. (Заметьте, что если Unix-сокет находится в каталоге/tmpили в другом каталоге, запись в который разрешена всем пользователям, тогда любой пользователь сможет запустить сервер, прослушивающий сокет в том каталоге. Используйте этот параметр, чтобы гарантировать, что вы подключены к серверу, запущенному доверенным пользователем.) Он поддерживается только на платформах, для которых реализован метод аутентификацииpeer; см. Подраздел 19.3.6.krbsrvnameИмя сервиса Kerberos, предназначенное для использования при аутентификации на основе GSSAPI. Оно должно соответствовать имени сервиса, указанному в конфигурации сервера, чтобы аутентификация на основе Kerberos прошла успешно. (См. также Подраздел 19.3.3.)
gsslibБиблиотека GSS, предназначенная для использования при аутентификации на основе GSSAPI. В настоящее время это действует только в сборках для Windows, поддерживающих одновременно и GSSAPI, и SSPI. Значение
gssapiв таких сборках позволяет указать, что libpq должна использовать для аутентификации библиотеку GSSAPI, а не подразумеваемую по умолчанию SSPI.serviceИмя сервиса, используемое для задания дополнительных параметров. Оно указывает имя сервиса в файле
pg_service.conf, который содержит дополнительные параметры подключения. Это позволяет приложениям указывать только имя сервиса, поскольку параметры подключения могут поддерживаться централизованно. См. Раздел 32.16.target_session_attrsЕсли этот параметр равен
read-write, по умолчанию будут приемлемы только подключения, допускающие транзакции на чтение/запись. При успешном подключении будет отправлен запросSHOW transaction_read_only; если он вернётon, соединение будет закрыто. Если в строке подключения указано несколько серверов, будут перебираться остальные серверы, как и при неудачной попытке подключения. Со значением по умолчанию (any) приемлемыми будут все подключения.