37.20. Поведение в многопоточных программах #

Библиотека libpq по умолчанию поддерживает повторные вызовы и многопоточность. Для соответствующего варианта сборки вашего приложения вам может понадобиться передать компилятору специальные параметры командной строки. Чтобы узнать, как собрать многопоточное приложение, обратитесь к документации вашей системы. Эта функция позволяет узнать, поддерживает ли libpq многопоточность:

PQisthreadsafe #

Возвращает состояние потокобезопасности в библиотеке libpq.

int PQisthreadsafe();

Возвращает 1, если библиотека libpq потокобезопасная, или 0 в противном случае.

Реализация многопоточности не лишена ограничений: два потока не должны пытаться одновременно работать с одним объектом PGconn. В частности, не допускается параллельное выполнение команд из разных потоков через один объект соединения. (Если вам нужно выполнять команды одновременно, используйте несколько соединений.)

Объекты PGresult после создания обычно доступны только для чтения, и поэтому их можно свободно передавать между потоками. Однако если вы используете какую-либо из функций, изменяющих PGresult, описанных в Разделе 37.12 или Разделе 37.14, вы должны также избегать одновременных обращений к одному объекту PGresult.

Устаревшие функции PQrequestCancel и PQoidStatus не являются потокобезопасными и не должны применяться в многопоточных программах. Вместо PQrequestCancel можно использовать PQcancel, а вместо PQoidStatusPQoidValue.

Если протокол Kerberos применяется в пользовательском приложении (помимо возможного использования внутри libpq), необходимо обеспечить блокировку вокруг вызовов Kerberos, так как его функции не являются потокобезопасными.

34.5. applicable_roles

The view applicable_roles identifies all roles whose privileges the current user can use. This means there is some chain of role grants from the current user to the role in question. The current user itself is also an applicable role. The set of applicable roles is generally used for permission checking.

Table 34-3. applicable_roles Columns

NameData TypeDescription
granteesql_identifier Name of the role to which this role membership was granted (can be the current user, or a different role in case of nested role memberships)
role_namesql_identifierName of a role
is_grantableyes_or_noYES if the grantee has the admin option on the role, NO if not