33.13. ÐбÑабоÑка замеÑаний #
СообÑÐµÐ½Ð¸Ñ Ñ Ð·Ð°Ð¼ÐµÑаниÑми и пÑедÑпÑеждениÑми, вÑдаваемÑе ÑеÑвеÑом, не возвÑаÑаÑÑÑÑ ÑÑнкÑиÑми, вÑполнÑÑÑими запÑоÑÑ, Ñак как они не ÑвидеÑелÑÑÑвÑÑÑ Ð¾Ð± оÑибке в запÑоÑе. ÐмеÑÑо ÑÑого они пеÑедаÑÑÑÑ ÑÑнкÑии обÑабоÑки замеÑаний и поÑле завеÑÑÐµÐ½Ð¸Ñ ÑÑой ÑÑнкÑии вÑполнение пÑодолжаеÑÑÑ ÐºÐ°Ðº обÑÑно. СÑандаÑÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑабоÑки замеÑаний вÑÐ²Ð¾Ð´Ð¸Ñ ÑообÑение в stderr, но пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑеопÑеделиÑÑ ÑÑо поведение, пÑедоÑÑавив ÑобÑÑвеннÑй обÑабоÑÑик.
Ðо иÑÑоÑиÑеÑким пÑиÑинам обÑабоÑка замеÑаний вÑполнÑеÑÑÑ Ð½Ð° двÑÑ ÑÑовнÑÑ , пÑиÑмником замеÑаний и обÑабоÑÑиком замеÑаний. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑиÑмник замеÑаний ÑоÑмаÑиÑÑÐµÑ Ð·Ð°Ð¼ÐµÑание и пеÑедаÑÑ ÑÑоÑмиÑованнÑÑ ÑÑÑÐ¾ÐºÑ Ð¾Ð±ÑабоÑÑÐ¸ÐºÑ Ð·Ð°Ð¼ÐµÑаний Ð´Ð»Ñ Ð²Ñвода. Ðднако пÑиложениÑ, коÑоÑÑе ÑеализÑÑÑ Ñвой пÑиÑмник замеÑаний, обÑÑно пÑоÑÑо игноÑиÑÑÑÑ Ñлой обÑабоÑÑика и вÑполнÑÑÑ Ð²Ñе дейÑÑÐ²Ð¸Ñ Ð² коде пÑиÑмника.
ФÑнкÑÐ¸Ñ PQsetNoticeReceiver ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¸Ð»Ð¸ возвÑаÑÐ°ÐµÑ ÑекÑÑий пÑиÑмник замеÑаний Ð´Ð»Ñ Ð¾Ð±ÑекÑа ÑоединениÑ. ÐодобнÑм обÑазом, PQsetNoticeProcessor ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¸Ð»Ð¸ возвÑаÑÐ°ÐµÑ ÑекÑÑий обÑабоÑÑик замеÑаний.
typedef void (*PQnoticeReceiver) (void *arg, const PGresult *res);
PQnoticeReceiver
PQsetNoticeReceiver(PGconn *conn,
PQnoticeReceiver proc,
void *arg);
typedef void (*PQnoticeProcessor) (void *arg, const char *message);
PQnoticeProcessor
PQsetNoticeProcessor(PGconn *conn,
PQnoticeProcessor proc,
void *arg);
ÐÐ°Ð¶Ð´Ð°Ñ Ð¸Ð· ÑÑÐ¸Ñ ÑÑнкÑий возвÑаÑÐ°ÐµÑ ÑказаÑÐµÐ»Ñ Ð½Ð° Ñанее ÑÑÑановленнÑй пÑиÑмник или обÑабоÑÑик замеÑаний и ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð½Ð¾Ð²Ñй ÑказаÑелÑ. ÐÑли ей пеÑедаÑÑÑÑ Ð½Ñлевой ÑказаÑелÑ, она ниÑего не делаеÑ, ÑолÑко возвÑаÑÐ°ÐµÑ ÑекÑÑий ÑказаÑелÑ.
Ðогда ÑообÑение Ñ Ð·Ð°Ð¼ÐµÑанием или пÑедÑпÑеждением поÑÑÑÐ¿Ð°ÐµÑ Ð¾Ñ ÑеÑвеÑа, либо вÑдаÑÑÑÑ Ñамой библиоÑекой libpq, вÑзÑваеÑÑÑ ÑÑнкÑÐ¸Ñ Ð¿ÑиÑмника замеÑаниÑ. СообÑение пеÑедаÑÑÑÑ ÐµÐ¹ в виде ÑоÑÑоÑÐ½Ð¸Ñ PGRES_NONFATAL_ERROR обÑекÑа PGresult. (ÐÑо позволÑÐµÑ Ð¿ÑиÑÐ¼Ð½Ð¸ÐºÑ Ð¸Ð·Ð²Ð»ÐµÑÑ Ð¸Ð· него оÑделÑнÑе полÑ, иÑполÑзÑÑ PQresultErrorField, либо полÑÑиÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ гоÑовое ÑообÑение, вÑзвав PQresultErrorMessage или PQresultVerboseErrorMessage.) Ðй Ñакже пеÑедаÑÑÑÑ ÑÐ¾Ñ Ð¶Ðµ неопÑеделÑннÑй ÑказаÑелÑ, ÑÑо бÑл пеÑедан ÑÑнкÑии PQsetNoticeReceiver. (ÐÑÐ¾Ñ ÑказаÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑигодиÑÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº внÑÑÑÐµÐ½Ð½ÐµÐ¼Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñи необÑ
одимоÑÑи.)
СÑандаÑÑнÑй пÑиÑмник замеÑаний пÑоÑÑо Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑообÑение (вÑзÑÐ²Ð°Ñ PQresultErrorMessage) и пеÑедаÑÑ ÐµÐ³Ð¾ обÑабоÑÑÐ¸ÐºÑ Ð·Ð°Ð¼ÐµÑаний.
ÐбÑабоÑÑик замеÑаний оÑвеÑÐ°ÐµÑ Ð·Ð° обÑабоÑÐºÑ ÑообÑÐµÐ½Ð¸Ñ Ñ Ð·Ð°Ð¼ÐµÑанием или пÑедÑпÑеждением в ÑекÑÑовом виде. ÐÐ¼Ñ Ð¿ÐµÑедаÑÑÑÑ ÑÑÑока Ñ ÑекÑÑом ÑообÑÐµÐ½Ð¸Ñ (вклÑÑаÑÑÐ°Ñ Ð·Ð°Ð²ÐµÑÑаÑÑий Ñимвол новой ÑÑÑоки) и неопÑеделÑннÑй ÑказаÑелÑ, коÑоÑÑй бÑл пеÑедан ÑÑнкÑии PQsetNoticeProcessor. (ÐÑÐ¾Ñ ÑказаÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑигодиÑÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº внÑÑÑÐµÐ½Ð½ÐµÐ¼Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñи необÑ
одимоÑÑи.)
СÑандаÑÑнÑй обÑабоÑÑик замеÑаний пÑоÑÑ:
static void
defaultNoticeProcessor(void *arg, const char *message)
{
fprintf(stderr, "%s", message);
}УÑÑановив пÑиÑмник или обÑабоÑÑик замеÑаний, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ожидаÑÑ, ÑÑо ÑÑа ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ, пока бÑдÑÑ ÑÑÑеÑÑвоваÑÑ Ð¾Ð±ÑÐµÐºÑ PGconn или обÑекÑÑ PGresult, ÑозданнÑе Ñ Ð½ÐµÐ¹. Ðогда ÑоздаÑÑÑÑ PGresult, ÑказаÑели ÑекÑÑиÑ
обÑабоÑÑиков замеÑаний, ÑÑÑановленнÑе в PGconn, копиÑÑÑÑÑÑ Ð² PGresult Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ð³Ð¾ иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑиÑми вÑоде PQgetvalue.