libpq выводит уведомления в терминал

Я пишу библиотеку, которая оборачивает libpq в C. Когда я выполняю запрос типа DROP SCHEMA IF EXISTS bob, а bob не существует, libpq выводит

"NOTICE:  schema "bob" does not exist, skipping"

в мой терминал, но затем успешно. Точно так же, если я создаю таблицу с id serial primary key, она печатает уведомление о том, что она автоматически сгенерировала последовательность.

Как остановить печать этого в терминале? У меня в библиотеке есть функции для получения такой информации, если она нужна пользователю, но она не должна просто так выводиться в терминал.

Я ничего не видел в документации для PQexecParams() или PQconnectdb() и т.д.


person d11wtq    schedule 19.09.2012    source источник


Ответы (2)


См. libpq — обработка уведомлений в руководстве. Вам необходимо предоставить обработчик уведомлений, чтобы заменить процессор по умолчанию.

Обработчик уведомлений по умолчанию просто:

static void
defaultNoticeProcessor(void *arg, const char *message)
{
    fprintf(stderr, "%s", message);
}
person Craig Ringer    schedule 19.09.2012
comment
Интересно, спасибо, попробую! Выглядит довольно странно, учитывая, что эта информация доступна через PQerrorMessage() и PQresultErrorMessage() :) - person d11wtq; 20.09.2012
comment
Ха, очевидно, уведомления и предупреждения недоступны из тех функций, которые я упоминаю. Интересно, что тогда такое PGRES_NONFATAL_ERROR. - person d11wtq; 20.09.2012

Один из вариантов — изменить стандартный вывод (и/или стандартный вывод).

person BSull    schedule 19.09.2012
comment
Я на самом деле думаю, что это stderr, хотя я не уверен, что это то, что мне нужно, если только это не единственный способ, которым я могу это сделать, что может показаться странным. Обычно вы не ожидаете, что библиотека C выведет что-либо, если вы не сказали ей об этом. - person d11wtq; 20.09.2012
comment
Да, я не уверен. Не знаю, что может привести к выводу, что вы сможете изменить его, кроме перенаправления stdout/stderr. - person BSull; 20.09.2012