powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / libpq-вызовы внутри C-функции - баг или фича?
2 сообщений из 2, страница 1 из 1
libpq-вызовы внутри C-функции - баг или фича?
    #34565916
Ilya Storozhilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Возникла необходимость организовать лог пользовательских ошибок. Для этого хранимым процедурам предоставляется функция с условным названием raise_error(), которая должна добавить соответствующую запись в таблицу, например, error_log, затем выполнить PL/PgSQL-оператор RAISE EXCEPTION '<Error description string>'. Здесь имеется интересное противоречие: команда RAISE EXCEPTION откатывает транзакцию, в рамках которой выполняется пользовательский запрос, что, собственно, и нужно, но при этом откатывается операция записи ошибки в таблицу error_log. Я выбрал следующее решение: ф-ция raise_error() реализуется на C и в процессе выполнения устанавливает соединени с сервером БД посредством интерфейса libpq, выполняет нужные действия в контексте этого соединения, которое, очевидно, никак не связано с откатываемой транзакцией и в конце генерирует искомое исключение вызовом макроса ereport(ERROR, ...).
Тут выяснилось следующее: при вызове PQconnectdb() разрывается соединение, установленное вызовом SPI_connect() и освобождаются все области памяти с нужными для записи ошибки в error_log данными (остаются нетронутыми только аргументы ф-ции). В принципе ничего не мешает скопировать нужные данные в буфера памяти статического условно большого размера, т.к. из-за разрыва соединения нельзя использовать palloc(). Однако, все же интересно, что посетители форума думают по этому поводу? Это нормальное поведение PostgreSQL или тут мы имеем дело с ошибкой и надо делать bugreport? Может для решения моей задачи имеется альтернативное решение, которое не требует использования libpq?
Спасибо!
...
Рейтинг: 0 / 0
libpq-вызовы внутри C-функции - баг или фича?
    #34565994
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ilya Storozhilov Может для решения моей задачи имеется альтернативное решение, которое не требует использования libpq?

Nu naprimer contrib/dblink
T.e. delat'
select dblink_connect('dbname=your_db');
select dblink_exec('...your update or your insert'); i vse prekrasno rabotaet v sluchae rollback'a
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / libpq-вызовы внутри C-функции - баг или фича?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]