29.11. °æ°í ó¸®

¼­¹ö·Î ÀÎÇØ »ý¼ºµÇ´Â ÁÖÀÇ/°æ°í ¸Þ¼¼Áö´Â Äõ¸® ½ÇÇà ÇÔ¼ö¿¡¼­ ¹ÝȯµÇÁö ¾Ê½À´Ï´Ù. À̰͵éÀÌ Äõ¸®ÀÇ ½ÇÆÐ¸¦ ÀǹÌÇÏ´Â °ÍÀº ¾Æ´Ï±â ¶§¹®ÀÔ´Ï´Ù. ±× ´ë½Å¿¡, À̵éÀº °æ°í ó¸® ÇÔ¼ö¿¡°Ô °Ç³×Áö°í, Çڵ鷯°¡ µ¹¾Æ¿Â ÈÄ, ÀϹÝÀûÀÎ ½ÇÇàÀÌ °è¼ÓµË´Ï´Ù. µðÆúÆ®ÀÎ °æ°í ó¸® ÇÔ¼ö´Â ¸Þ¼¼Áö¸¦stderr¿¡ Ãâ·ÂÇÕ´Ï´Ù. ±×·¯³ª ¾îÇø®ÄÉÀ̼ÇÀº ÀÌ µ¿ÀÛÀ» °ãÃÄ ½á¼­, µ¶ÀÚÀûÀΠó¸® ÇÔ¼ö¸¦ Á¦°øÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿ª»çÀûÀÎ ÀÌÀ¯¿¡ ÀÇÇØ, °æ°í 󸮿¡´Â °æ°í ¸®½Ã¹ö¿Í °æ°í ÇÁ·Î¼¼¼­·Î ºÒ¸®´Â 2 ·¹º§ÀÌ ÀÖ½À´Ï´Ù. µðÆúÆ® µ¿ÀÛ¿¡¼­´Â °æ°í ¸®½Ã¹ö´Â °æ°í ¼­½ÄÀ» Á¤µ·Çϰí, °æ°í ÇÁ·Î¼¼¼­¿¡ ¹®ÀÚ¿­À» °Ç³×ÁÝ´Ï´Ù. ±×·¯³ª º¸Åë, µ¶ÀÚÀûÀÎ °æ°í ¸®½Ã¹ö¸¦ Á¦°øÇÏ´Â ¾îÇø®ÄÉÀ̼ǿ¡¼­´Â °æ°í ÇÁ·Î¼¼¼­ ·¹À̾ ¹«½ÃÇϰí, ¸ðµç 󸮸¦ °æ°í ¸®½Ã¹ö¸¸À¸·Î ½ÇÇàÇÕ´Ï´Ù.

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);

°¢ ÇÔ¼ö´Â ÀÌÀüÀÇ °æ°í ¸®½Ã¹ö³ª ÇÁ·Î¼¼¼­ ÇÔ¼ö Æ÷ÀÎÅ͸¦ µ¹·ÁÁÖ¾î, »õ·Î¿î °ªÀ» ¼³Á¤ÇÕ´Ï´Ù. ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ nullÀ» °Ç³×ÁÖ¾úÀ» °æ¿ì, ¾Æ¹«°Íµµ º¯°æµÇÁö ¾Ê°í ÇöÀçÀÇ Æ÷ÀÎÅͰ¡ ¹ÝȯµË´Ï´Ù.

¼­¹ö·ÎºÎÅÍ ÁÖÀÇ/°æ°í ¸Þ¼¼Áö¸¦ ¹Þ¾ÆµéÀ̰ųª libpq³»ºÎ¿¡¼­ ÁÖÀÇ/°æ°í ¸Þ¼¼Áö°¡ »ý¼ºµÇ¸é, °æ°í ¸®½Ã¹ö ÇÔ¼ö°¡ È£ÃâµË´Ï´Ù. PGRES_NONFATAL_ERROR PGresult ÇüÅ·Π¸Þ¼¼Áö°¡ °Ç³×Áý´Ï´Ù. (À̰Ϳ¡ ÀÇÇØ, ¸®½Ã¹ö´Â PQresultErrorField¸¦ »ç¿ëÇØ °³°³ÀÇ Çʵ带 ²¨³»´Â °ÍÀ̳ª, PQresultErrorMessage¸¦ »ç¿ëÇØ »çÀü¿¡ Á¤ÇüµÈ ¿Ï·á ¸Þ¼¼Áö¸¦ ²¨³¾ ¼ö ÀÖ½À´Ï´Ù. ) PQsetNoticeReceiver¿¡°Ô °Ç³×Áø void Æ÷ÀÎÅÍ¿Í °°Àº °Íµµ °Ç³×¹Þ½À´Ï´Ù. (ÀÌ Æ÷ÀÎÅ͸¦ »ç¿ëÇϰí, Çʿ信 µû¶ó¼­ ¾îÇø®ÄÉÀÌ¼Ç Æ¯Á¤ÇÑ »óÅ¿¡ ¾×¼¼½º ÇÒ ¼ö ÀÖ½À´Ï´Ù. )

µðÆúÆ®ÀÇ °æ°í ¸®½Ã¹ö´Â ´ÜÁö(PQresultErrorMessage¸¦ »ç¿ëÇØ) ¸Þ¼¼Áö¸¦ ²¨³»°í, ±×°ÍÀ» °æ°í ÇÁ·Î¼¼¼­¿¡ °Ç³×ÁÙ »ÓÀÔ´Ï´Ù.

°æ°í ÇÁ·Î¼¼¼­´Â ÅØ½ºÆ® Çü½Ä¿¡¼­ ÁÖ¾îÁø ÁÖÀÇ/°æ°í ¸Þ¼¼Áö ´Ù·ç´Â °Í¿¡ °üÇØ Ã¥ÀÓÀ» °¡Áý´Ï´Ù. ¸Þ¼¼Áö´Â(¸¶Áö¸· »õ·Î¿î ÇàÀ» Æ÷ÇÔ) ¹®ÀÚ¿­ ÅØ½ºÆ®·Î °Ç³×¹Þ°í, ´õÇØ¼­ PQsetNoticeProcessor¿¡ °Ç³×ÁØ °Í°ú °°Àº void Æ÷ÀÎÅ͵µ °Ç³×¹Þ½À´Ï´Ù. (ÀÌ Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ¿© ÇÊ¿äÇÏ´Ù¸é ¾îÇø®ÄÉÀÌ¼Ç Æ¯Á¤ÇÑ »óÅ¿¡ ¾×¼¼½º ÇÒ ¼ö ÀÖ½À´Ï´Ù. )

µðÆúÆ®ÀÇ °æ°í ÇÁ·Î¼¼¼­´Â ÀÌÇÏ¿Í °°ÀÌ ´Ü¼øÇÑ °ÍÀÔ´Ï´Ù.

static void
defaultNoticeProcessor(void *arg, const char *message)
{
    fprintf(stderr, "%s", message);
}

ÀÏ´Ü °æ°í ¸®½Ã¹ö³ª °æ°í ÇÁ·Î¼¼¼­¸¦ ¼³Á¤Çϸé, PGconn¿ÀºêÁ§Æ®³ª »ý¼ºµÈPGresult¿ÀºêÁ§Æ®°¡ Á¸ÀçÇÏ´Â µ¿¾ÈÀº ÇÔ¼ö°¡ È£ÃâµÉ °¡´É¼ºÀÌ ÀÖ´Ù°í »ý°¢ÇØ µÎ¾î¾ß ÇÕ´Ï´Ù. PGresultÀÇ »ý¼º½Ã¿¡´Â PGconnÀÇ ÇöÀç °æ°í ó¸® Æ÷ÀÎÅͰ¡, PQgetvalue¿Í °°ÀÌ ÇÔ¼ö·Î »ç¿ëµÇµµ·Ï, PGresult¿¡ º¹»çµË´Ï´Ù.