Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
libpq-вызовы внутри C-функции - баг или фича?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Возникла необходимость организовать лог пользовательских ошибок. Для этого хранимым процедурам предоставляется функция с условным названием 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? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 18:53 |
|
||
|
libpq-вызовы внутри C-функции - баг или фича?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2007, 19:28 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=296&tid=2005397]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
2ms |
| others: | 249ms |
| total: | 365ms |

| 0 / 0 |
