1. PostgreSQLÀÇ C ÀÎÅÍÆäÀ̽º - libpq
Áö±Ý±îÁö´Â PostgreSQLÀÇ SQLƯ¡À» »ìÆ캸¾Ò´Ù.
ÀÌÁ¦ºÎÅÍ´Â SQL ¿ÜÀÇ ±â´ÉµéÀ» ÁßÁ¡À¸·Î »ìÆ캸µµ·Ï ÇÏ°Ú´Ù. ±×
ù ¹ø°·Î¼ PostgreSQLÀÇ C ÀÎÅÍÆäÀ̽ºÀÎ libpq¿¡ ´ëÇؼ ¾Ë¾Æº¸µµ·Ï
ÇÏÀÚ.
libpq´Â ¸»±×´ë·Î PostgreSQLÀÇ µ¥ÀÌÅͺ£À̽º¸¦
´Ù·ç´Âµ¥ »ç¿ëµÇ´Â C ¶óÀ̺귯¸®ÀÌ´Ù. »ç½Ç »ç¿ëÀÚ ÇÁ·Î±×·¥ÀÎ psqlµµ
libpq¸¦ »ç¿ëÇÏ¿© ÀÛ¼ºÇÑ ¾îÇø®ÄÉÀ̼ÇÀÇ ÀÏÁ¾ÀÌ´Ù. ¸¸µé±â¿¡ µû¶ó¼
psql º¸´Ù ´õ ¶Ù¾î³ »ç¿ëÀÚ ÇÁ·Î±×·¥À» ¾ó¸¶µçÁö ¸¸µé ¼ö ÀÖ´Ù.
PostgreSQLÀ» Ç¥ÁØÀ¸·Î ¼³Ä¡ÇÏ¿´´Ù¸é, libpq´Â
/usr/local/pgsql/lib¾È¿¡ ¸ð¿©ÀÖÀ» °ÍÀÌ´Ù. ÀÌ µð·ºÅ丮 ¾ÈÀÇ libpq.a´Â
Á¤Àû ¶óÀ̺귯¸®ÀÌ°í libpq.so.1Àº µ¿Àû ¶óÀ̺귯¸®ÀÌ´Ù. ¼³Ä¡ ½Ã¿¡
/ect/ld.so.conf ÆÄÀÏ¿¡ /usr/local/pgsql/lib¸¦ Ãß°¡ÇÏ°í ldconfig¸¦
¼öÇàÇÑ °æÇèÀÌ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ°ÍÀº PostgreSQL ÀÀ¿ë ÇÁ·Î±×·¥ ¼öÇà¿¡
ÇÊ¿äÇÑ libpq µ¿Àû ¶óÀ̺귯¸®¸¦ ÀÚµ¿ÀûÀ¸·Î ¸µÅ©Çϱâ À§ÇØ ÇÊ¿äÇÑ
ÀÛ¾÷À̾ú´Ù. Á¶±Ý ¹þ¾î³ª´Â À̾߱âÁö¸¸ PHP/FI¿¡¼ PostgreSQLÀ»
»ç¿ëÇϵµ·Ï ¼³Á¤ÇÏ¿´´Âµ¥, httpd¸¦ ¶ç¿ï ¶§ libpq.so¸¦ ãÁö ¸øÇÏ°Ú´Ù´Â
¸Þ½ÃÁö°¡ ³ª¿Â´Ù¸é libpq.so.1À» libpq.so·Î ½Éº¼¸¯ ¸µÅ©ÇÏ°í /etc/ld.so.conf
ÆÄÀÏ¿¡ /usr/local/pgsql/libÀ» Ãß°¡ÇÑ ´ÙÀ½, ldconfig¸¦ ¼öÇàÇϸé
µÈ´Ù. libpq¿¡ ´ëÇÑ ¿Â¶óÀÎ ¼³¸íÀº 'man libpq'·Î ã¾Æº¼ ¼ö ÀÖ°í,
¿¹Á¦ ¼Ò½º ÆÄÀÏÀº PostgreSQL ¼Ò½º ÆÄÀÏÀÇ ¾ÐÃàÀ» Ǭ µð·ºÅ丮¸¦
±âÁØÀ¸·Î º¼ ¶§, src/test/examples µð·ºÅ丮¿¡ ÀÖ´Ù. ÀÌÁ¦ º»·ÐÀ¸·Î
µé¾î°¡º¸ÀÚ.
2. libpq ÀÇ ÇÔ¼öµé
libpq´Â PostgreSQLÀÇ ¾îÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¡¹Ö
ÀÎÅÍÆäÀ̽ºÀÌ´Ù. libpq´Â Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÌ PostgreSQL ¹é¿£µå
¼¹ö¿¡°Ô ÁúÀǸ¦ Àü´ÞÇÏ°í °á°ú¸¦ ȸ¼öÇÏ´Â ¿ªÇÒÀ» ÇÏ´Â ¶óÀ̺귯¸®ÀÌ´Ù.
libpq¸¦ »ç¿ëÇÏ´Â ÇÁ·ÐÆ®¿£µå ¾îÇø®ÄÉÀ̼ÇÀº libpq-fe.h Çì´õ ÆÄÀÏÀ»
Æ÷ÇÔÇÏ°í libpq ¶óÀ̺귯¸®¿Í ¸µÅ©µÇ¾î¾ß ÇÑ´Ù´Â Á¡À» ±â¾ïÇÏÀÚ.
¸ÕÀú libpq¿¡ Æ÷ÇԵǾî ÀÖ´Â ¶óÀ̺귯¸® ÇÔ¼öµéÀ» »ìÆ캸µµ·Ï ÇÑ´Ù.
1) µ¥ÀÌÅͺ£À̽º ÃʱâÈ¿Í Á¦¾î¿Í °ü·ÃÇÑ È¯°æº¯¼ö
Linux ȯ°æÀÇ ´Ù¸¥ ¾îÇø®ÄÉÀ̼ǵé°ú ¸¶Âù°¡Áö·Î
libpq¿¡¼µµ ÃʱâÈ¿Í ¾îÇø®ÄÉÀ̼ÇÀÇ ÇൿÀ» Á¦¾îÇϱâ À§ÇÏ¿© ȯ°æº¯¼ö¸¦
»ç¿ëÇÑ´Ù. ´ÙÀ½ÀÇ È¯°æº¯¼öÀÇ °ªÀÌ libpq¿¡¼ ±âº»°ªÀ¸·Î »ç¿ëµÈ´Ù.
PGHOST 񃧯
¼¹ö¸íÀ» ÁöÁ¤ÇÑ´Ù. PGOPTIONS º¤¿£µå
¼¹ö¸¦ À§ÇÑ Ãß°¡ÀûÀÎ ½Ç½Ã°£ ¿É¼ÇÀ» ¼³Á¤ÇÑ´Ù.
PGPORT º¤¿£µå
¼¹ö¿Í Åë½ÅÇÒ ±âº» Æ÷Æ®¸¦ ÁöÁ¤ÇÑ´Ù. PGTTY º¤¿£µå
¼¹ö°¡ Ãâ·ÂÇÏ´Â µð¹ö±ë ¸Þ½ÃÁö¸¦ ó¸®ÇÒ
ÆÄÀÏÀ̳ª tty¸¦ ÁöÁ¤ÇÑ´Ù. PGDATABASE ±âº»
µ¥ÀÌÅͺ£À̽º ¸íÀ» ÁöÁ¤ÇÑ´Ù. PGREALM Kerberos
ÀÎÁõ ½Ã½ºÅÛÀÌ »ç¿ëµÉ ¶§¿¡¸¸ ¼³Á¤ÇÑ´Ù. |
2) µ¥ÀÌÅͺ£À̽º Á¢¼Ó ÇÔ¼ö
´ÙÀ½ÀÇ ÇÔ¼öµéÀº µ¥ÀÌÅͺ£À̽º Á¢¼Ó°ú °ü·ÃµÈ
°ÍµéÀÌ´Ù.
PQsetdb ¼¹ö¿Í
»õ·Î¿î ¿¬°áÀ» ¸¸µé¾î ÁØ´Ù.
PGconn *PQsetdb(char
*pghost, char
*pgport, char
*pgoptions, char
*pgtty, char
*dbName); |
ÀÎÀÚ°¡ NULLÀ̸é, ÇØ´çÇϴ ȯ°æº¯¼ö¸¦ °Ë»çÇÏ°í,
ȯ°æº¯¼ö°¡ ¼³Á¤µÇÁö ¾Ê¾Ò´Ù¸é ³»ºÎ ±âº» ¼³Á¤°ªÀ» »ç¿ëÇÑ´Ù.
ÀÌ ÇÔ¼ö´Â Ç×»ó À¯È¿ÇÑ PGconn Æ÷ÀÎÅ͸¦ ¹ÝȯÇϴµ¥, PQstatus¸¦
»ç¿ëÇÏ¿© ÁúÀǸ¦ ¼¹ö·Î º¸³»±â Àü¿¡ ¿¬°áÀÌ È®½ÇÈ÷ ¼º¸³µÇ¾ú´ÂÁö¸¦
°Ë»çÇÒ ¼ö ÀÖ´Ù. libpq »ç¿ëÀÚ´Â PGconnÀ» °ü¸®Çϴµ¥ À¯ÀÇÇؾß
ÇÑ´Ù. PGconn ±¸Á¶Ã¼´Â ¹Ì·¡¿¡ º¯°æµÉ ¼öµµ Àֱ⠶§¹®¿¡ Á÷Á¢ ±¸Á¶Ã¼ÀÇ
Çʵ带 ÂüÁ¶ÇÏ´Â °ÍÀº ÇÇÇÏ´Â°Ô ÁÁ´Ù.
¿¹) PGconn
*conn; /* 192.168.1.2 È£½ºÆ®ÀÇ 5432 Æ÷Æ®¸¦ ÅëÇÏ¿©
web µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼ÓÇÑ´Ù. */ PQsetdb("192.168.1.2",
"5432", NULL, NULL, "web"); |
PQfinish
¼¹ö¿ÍÀÇ Á¢¼ÓÀ» Á¾·áÇÑ´Ù. ¶ÇÇÑ PGconn ±¸Á¶Ã¼¿¡ »ç¿ëµÈ ¸Þ¸ð¸®¸¦
¹ÝȯÇÑ´Ù. PQfinish¸¦ È£ÃâÇÑ ÀÌÈÄ¿¡´Â PGconn Æ÷ÀÎÅ͸¦ »ç¿ëÇÏÁö
¸»¾Æ¾ß ÇÑ´Ù.
void PQfinish(PQconn
*conn) |
PQreset ¼¹ö¿ÍÀÇ
Á¢¼Ó Æ÷Æ®¸¦ ¸®¼ÂÇÑ´Ù. Áï, ¼¹ö¿¡ ¿¬°áµÈ IPC ¼ÒÄÏÀ» ´Ý°í µ¿ÀÏÇÑ
¼¹ö¿¡ Á¢¼ÓÀ» »õ·Ó°Ô ½ÃµµÇÑ´Ù.
void PQreset(PGconn
*conn) |
PQtrace ¼¹ö¿Í
ÇÁ·ÐÆ®¿£µå »çÀÌ¿¡ ¿À°¡´Â ¸Þ½ÃÁö¸¦ ÃßÀûÇÑ´Ù. ÃßÀû ¸Þ½ÃÁö´Â debug_port
ÆÄÀÏ ½ºÆ®¸²À¸·Î Ãâ·ÂµÈ´Ù.
void PQtrace(PGconn
*conn, FILE* debug_port); |
3) ÁúÀÇ ½ÇÇà ÇÔ¼ö
PQexec ÁúÀǸ¦
¼¹ö¿¡ Àü´ÞÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÁúÀÇ°¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é PGresult
Æ÷ÀÎÅ͸¦ µ¹·ÁÁÖ°í, ±×·¸Áö ¾ÊÀ¸¸é NULLÀ» µ¹·ÁÁØ´Ù. NULLÀÌ ¹ÝȯµÇ¸é,
PQerrorMessage¸¦ »ç¿ëÇÏ¿© ÇØ´ç ¿¡·¯¿¡ ´ëÇÑ Á» ´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦
¾òÀ» ¼ö ÀÖ´Ù.
PGresult *PQexec(PGconn
*conn, char *query); |
PGresult ±¸Á¶Ã¼¿¡´Â ¼¹ö°¡ ¹ÝȯÇÑ ÁúÀÇ
°á°ú°¡ µé¾îÀÖ´Ù. ÇÁ·Î±×·¡¸Ó´Â PGresult¸¦ Á¶½É½º·´°Ô °ü¸®Çؾß
ÇÒ Çʿ伺ÀÌ ÀÖ´Ù. ÁúÀÇ °á°ú¸¦ ȸ¼öÇÏ´Â µ¥ »ç¿ëµÇ´Â Á¢±Ù ÇÔ¼ö¸¦
¾Æ·¡¿¡ ¼³¸íÇÑ´Ù. PGresult ±¸Á¶Ã¼´Â PGconn ±¸Á¶Ã¼¿Í ¸¶Âù°¡Áö·Î
¾ÕÀ¸·Î ¾ðÁ¦µçÁö º¯ÇÒ °¡´É¼ºÀÌ Àֱ⠶§¹®¿¡ Á÷Á¢ ±¸Á¶Ã¼ÀÇ Çʵ带
ÂüÁ¶ÇÏ´Â °ÍÀº ÇÇÇϱ⠹ٶõ´Ù.
PQresultStatus
ÁúÀÇ °á°ú »óŸ¦ ¾Ë·ÁÁØ´Ù.
ExecStatusType
PQresultStatus(PGresult *res); |
¹Ýȯ°ªÀÎ ExecStatusTypeÀº ´ÙÀ½ Áß Çϳª°¡ µÉ
¼ö ÀÖ´Ù.
PGRES_EMPTY_QUERY
: ÁúÀÇ°¡
ºñ¾î ÀÖ´Â °æ¿ì PGRES_COMMEND_OK :
°ªÀ» ¹ÝȯÇÏÁö ¾Ê´Â ÁúÀÇ ¸í·ÉÀÎ °æ¿ì PGRES_TUPLES_OK
:
ÁúÀÇ°¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¾î¼ Æ©ÇÃÀ» ¹ÝȯÇÑ °æ¿ì
PGRES_BAD_RESPONSE :
¼¹ö·ÎºÎÅÍ ±â´ëÇÏÁö ¾ÊÀº ÀÀ´äÀ» ¹ÞÀº °æ¿ì PGRES_NONFATAL_ERROR
: Ä¡¸íÀûÀÌÁö ¾ÊÀº ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì PGRES_FATAL_ERROR
:
Ä¡¸íÀûÀÎ ¿¡·¯°¡ ¹ß»ýÇÑ °æ¿ì PGRES_COPY_OUT
PGRES_COPY_IN |
°á°úÀÇ »óÅ°ªÀÌ PGRES_TUPLES_OKÀÌ¸é ¹ÝȯµÈ
Æ©ÇÃÀ» ȸ¼öÇϱâ À§ÇØ ´ÙÀ½ÀÇ ÇÔ¼öµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
PQntuples
ÁúÀÇ °á°úÀÇ Æ©ÇÃ(ÀνºÅϽº ¶Ç´Â ·¹ÄÚµå, ·Î¿ì)ÀÇ °³¼ö¸¦ ¹ÝȯÇÑ´Ù.
int PQntuples(PGresult
*res); |
PQftype ÀúÀåÇÏ´Â
Çʵå À妽ºÀÇ Çʵå ŸÀÔÀ» µ¹·ÁÁØ´Ù. ¹ÝȯµÇ´Â Á¤¼ö°ªÀº ³»ºÎÀûÀ¸·Î
Á¤ÀǵǾî ÀÖ´Â text, int4 µîÀ» ³ªÅ¸³»´Â °ªÀÌ´Ù.
Oid PQftype(PGresult
*res, int field_num); |
PQfsize ÁöÁ¤ÇÏ´Â
Çʵå À妽º¿Í °ü·ÃµÈ ÇʵåÀÇ Å©±â¸¦ ¹ÙÀÌÆ® ¼ö·Î µ¹·ÁÁØ´Ù. ¹ÝȯµÈ
Å©±â°¡ -1ÀÌ¸é °¡º¯ ±æÀÌÀÇ ÇʵåÀÓÀ» ³ªÅ¸³½´Ù.
int PQfsize(PGresult
*res, int field_index); |
PQgetvalue
ÇʵåÀÇ À̸§À» ÁöÁ¤ÇÏ¸é ±× ÇʵåÀÇ °ªÀ» µ¹·ÁÁØ´Ù. PQgetvalue¿¡¼
¹ÝȯµÇ´Â °ªÀº ÇʵåÀÇ °ªÀ» ³Î·Î ³¡³ª´Â ¾Æ½ºÅ° ¹®ÀÚ¿·Î º¯È¯ÇÑ
°ªÀÌ´Ù. ÁúÀÇ°¡ ¹ÙÀ̳ʸ®(BINARY) Ä¿¼ÀÏ °æ¿ì¿¡ ¹ÝȯµÇ´Â °ªÀº
¼¹öÀÇ ³»ºÎÀûÀÎ Æ÷¸ËÀÇ ¹ÙÀ̳ʸ® ŸÀÔÀÌ´Ù. ÀÌ °æ¿ì¿¡ ÇØ´ç µ¥ÀÌÅ͸¦
¿Ã¹Ù¸¥ CŸÀÔÀ¸·Î º¯È¯ÇØ¾ß ÇÑ´Ù. PQgetvalue°¡ ¹ÝȯÇÏ´Â °ªÀº PGresult
±¸Á¶Ã¼ÀÇ ÇØ´ç Çʵ忡 ´ëÇÑ Æ÷ÀÎÅÍÀ̹ǷΠPGresult¸¦ ÇØÁ¦ÇÏ°í ³
´ÙÀ½¿¡µµ »ç¿ëÇÏ·Á¸é ±× °ªÀ» º¹»çÇØ µÖ¾ß ÇÑ´Ù.
char *PQgetvalue(PGresult
*res, int tup_num, int field_num); |
PQoidStatus
¸¶Áö¸·À¸·Î ¼öÇàÇÑ ÁúÀÇ°¡ INSERT ¸í·ÉÀÏ ¶§, »ðÀÔµÈ Æ©ÇÃÀÇ °´Ã¼
¾ÆÀ̵𸦠¹®ÀÚ¿·Î µ¹·ÁÁØ´Ù. ±× ¿Ü¿¡´Â ºó ¹®ÀÚ¿À» µ¹·ÁÁØ´Ù.
char *PQoidStatus(PGresult
*res); |
PQdisplayTuples
ÀÓÀÇÀÇ ¸ðµç ·¹Äڵ带 Ãâ·ÂÇÑ´Ù. ¼±ÅÃÀûÀ¸·Î ŸÀÌƲ°ÝÀÎ ¼Ó¼º À̸§ÀÇ
Ãâ·Â¿©ºÎ¿Í Ãâ·Â ½ºÆ®¸²À» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ´ëÇ¥ÀûÀ¸·Î psqlÀÌ Å×À̺íÀÇ
³»¿ëÀ» Ãâ·ÂÇϱâ À§ÇØ PQdisplayTuples ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
void PQprintTuples(
PGresult *res, FILE
*fout, /* Ãâ·Â°á°ú¸¦ º¸³¾
ÆÄÀÏ ½ºÆ®¸² */ int fillAlign,
/*Çʵ带 Á¤·ÄÇϱâ À§ÇØ ºóºÎºÐÀ» °ø¹éÀ¸·Î ä¿ò¿©ºÎ*/
char *fieldSep, /* Çʵå
±¸ºÐÀÚ·Î »ç¿ëÇÒ ¹®ÀÚ¿, ÀϹÝÀûÀ¸·Î '|'¸¦ »ç¿ë */
int printHeader, /* Çì´õÀÇ
Ãâ·Â ¿©ºÎ */ int quit
); |
PQclear PGresult¿Í
°ü·ÃµÈ ³»¿ëÀ» ÇØÁ¦ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÁúÀÇ °á°ú°¡ ´õ ÀÌ»ó ÇÊ¿ä
¾øÀ» ½Ã¿¡´Â ¹Ýµå½Ã ÇØÁ¦ÇÏ¿©¾ß ÇÑ´Ù. ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ¸¸é ÇÁ·ÐÆ®¿£µå
ÀÀ¿ëÇÁ·Î±×·¥¿¡¼ ¸Þ¸ð¸®°¡ À¯ÃâµÇ´Â °á°ú¸¦ ³º´Â´Ù.
4) COPY ÁúÀÇ¿Í °ü·ÃµÈ ÇÔ¼ö
PQgetline
ÀÌ ÇÔ¼ö´Â ´º¶óÀÎÀ¸·Î ³¡³ª´Â ¹®ÀÚ¿À» ÀÐ¾î¼ string ¹öÆÛ¿¡
void PQclear(PQresult
*res); |
ÀúÀåÇÑ´Ù. fgets¿Í ºñ½ÁÇÏ°Ô, length-1
¹®ÀÚ¸¦ stringÀ¸·Î º¹»çÇÏ°í, ¸¶Áö¸·ÀÇ ´º¶óÀÎ ¹®ÀÚ¸¦ ³Î ¹®ÀÚ·Î
º¯È¯ÇÑ´Ù´Â °ÍÀÌ gets¿Í´Â ´Ù¸¥ Á¡ÀÌ´Ù.
int PQgetlline(PQconn
*conn, char *string, int length); |
PQgetlineÀº ÀÐ¾î µéÀÌ´Â µµÁß¿¡ EOF¸¦
¸¸³ª¸é EOF¸¦ ¹ÝȯÇÏ°í, Àüü ¶óÀÎÀ» Àоîµé¿´´Ù¸é 0À», ´º¶óÀÎÀ»
Àб⵵ Àü¿¡ ¹öÆÛ°¡ Â÷¹ö¸®¸é 1À» ¹ÝȯÇÑ´Ù. ¾îÇø®ÄÉÀ̼ǿ¡¼´Â
ÇϳªÀÇ ´º¶óÀÎÀÌ "."·Î ÀԷµǴ Áö¸¦ °Ë»çÇÏ¿©¾ß ÇÑ´Ù.
ÀÌ ¹®ÀÚ´Â ¼¹ö°¡ copy ¸í·ÉÀÇ °á°ú Àü¼ÛÀ» Á¾·áÇÑ´Ù´Â °ÍÀ» ¶æÇÑ´Ù.
±×¸®°í length-1 º¸´Ù Å« ±æÀÌÀÇ ¶óÀÎÀ» ÀоîµéÀÏ ¼öµµ ÀÖÀ¸¹Ç·Î
PQgetlineÀÇ ¹Ýȯ°ªÀ» üũÇÏ¿©¾ß ÇÑ´Ù.
PQputline
ÀÌ ÇÔ¼ö´Â ³Î·Î ³¡³ª´Â stringÀ» ¼¹ö¿¡ Àü¼ÛÇÑ´Ù. ¾îÇø®ÄÉÀ̼ǿ¡¼´Â
¸¶Áö¸· ¹®ÀÚ "."¸¦ µ¥ÀÌÅÍ Àü¼ÛÀÌ ¿Ï·áµÇ¾ú´Ù´Â °ÍÀ»
¼¹ö¿¡°Ô Á¤È®È÷ ¾Ë¸®±â À§ÇØ º¸³»¾ß ÇÑ´Ù.
void PQputline(PGconn
*conn, char *string); |
PQendcopy
¼¹ö°¡ copy¸¦ ³¡³¾ ¶§±îÁö ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ±â´Ù¸®µµ·Ï ÇÑ´Ù. ÀÌ
ÇÔ¼ö´Â PQputlineÀ» »ç¿ëÇÏ¿© ¼¹ö¿¡°Ô ¸¶Áö¸· ¹®ÀÚ¿À» º¸³ÂÀ»
°æ¿ì³ª PQgetlineÀ» »ç¿ëÇÏ¿© ¼¹ö¿¡°Ô¼ ¸¶Áö¸· ¹®ÀÚ¿À» ȸ¼öÇÏ¿´À»
°æ¿ì¿¡ »ç¿ëÇÑ´Ù. ÀÌ ÇÔ¼öÀÇ ¹Ýȯ°ª¿¡ µû¶ó, ¼¹ö´Â ´ÙÀ½ ÁúÀǸ¦
¹Þ¾ÆµéÀÏ Áغñ¸¦ ÇÑ´Ù. ¼º°øÀûÀ¸·Î ¼öÇàµÇ¾ú´Ù¸é 0À», ±× ¿Ü¿¡´Â
0ÀÌ ¾Æ´Ñ °ªÀ» ¹ÝȯÇÑ´Ù.
int PQendcopy(PGconn
*conn); |
Âü°í·Î PostgreSQL¿¡¼´Â ÁúÀÇ ¹öÆÛ°¡ 8192 ¹ÙÀÌÆ®
±æÀÌÀ̹ǷÎ, 8K¸¦ ³Ñ´Â ÁúÀÇÀÇ µÞºÎºÐÀº Àß·Á³ª°¡¹Ç·Î ÁÖÀÇÇϱâ
¹Ù¶õ´Ù. ¹°·Ð ±×·² °æ¿ì´Â ¾ø°ÚÁö¸¸...
¿¹) PQexec(conn,
"create table foo (a int4, b char16, d float8)");
PQexec(conn, "copy foo from stdin");
/* ¿©±â¿¡¼ <TAB>Àº ½ÇÁ¦·Î TABÅ°¸¦ ÀÔ·ÂÇÔÀ»
À̾߱âÇÑ´Ù. */ PQputline(conn, "3<TAB>hello
world<TAB>4.5¡¬n"); PQputline(conn,
"4<TAB>goodbye world<TAB>7.11¡¬n");
PQputline(conn, ".¡¬n"); PQendcopy(conn); |
3. libpqÀÇ È°¿ë
1) ¿¹Á¦ ÇÁ·Î±×·¥ - testlibpq.c
¿©±â¿¡¼´Â ¸ÕÀú PostgreSQL¿¡¼ Á¦°øÇÏ´Â ±¦ÂúÀº
¿¹Á¦ ¼Ò½º¸¦ ¸ÕÀú »ìÆ캻´Ù. ÀÌ ÆÄÀÏÀº src/test/examples/testlibpq.c
ÆÄÀÏÀÌ´Ù. ¸ÕÀú ÄÄÆÄÀÏÀ» ÇÏ¿© ½ÇÇàÀ» Çغ¸ÀÚ.
$ make $ ./testlibpq
datname datdba
datpath
template1 501
template1
ddoch 501
ddoch
test3 501
test3
mydb 501
mydb
web 506
web
test 501
test |
ÀÌ ÇÁ·Î±×·¥Àº Àӽà µ¥ÀÌÅͺ£À̽º·Î »ç¿ëµÇ´Â
template1 µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼ÓÇÏ¿© ½Ã½ºÅÛ Ä«Å»·Î±×ÀÇ ÀÏÁ¾ÀÎ pg_database
Ŭ·¡½º¿¡¼ µ¥ÀÌÅͺ£À̽º ¸ñ·ÏÀ» ÃàÃâÇÏ¿© Ãâ·ÂÇÏ°í ÀÖ´Ù. ´ÙÀ½Àº
¼Ò½º ÇÁ·Î±×·¥ÀÌ´Ù. ÀÚ¼¼ÇÑ ÁÖ¼®À» ºÙ¿©³õ¾Ò´Ù.
/* * testlibpq.c
* PostgreSQL ÇÁ·ÐÆ®¿£µå ¶óÀ̺귯¸®ÀÎ
LIBPQ¸¦ »ç¿ëÇÑ Å×½ºÆ® ÇÁ·Î±×·¥ * * */
#include <stdio.h> #include
"libpq-fe.h" /* LIBPQ¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥¿¡¼
²À Æ÷ÇÔÇØ¾ß ÇÑ´Ù. */
static void exit_nicely(PGconn
*conn) { PQfinish(conn); exit(1);
}
int main() { char
*pghost, *pgport, *pgoptions, *pgtty; char *dbName;
int nFields; /* ÇʵåÀÇ °¹¼ö¸¦ ÀúÀåÇÒ º¯¼ö */
int i,j;
#ifdef DEBUG FILE *debug;
/* µð¹ö±ëÀ» À§ÇÑ ÆÄÀÏ ½ºÆ®¸² */ #endif /*
DEBUG */
PGconn *conn; /* µ¥ÀÌÅͺ£À̽º
Á¢¼Ó µð½ºÅ©·´Æ® ±¸Á¶Ã¼ */ PGresult *res; /*ÁúÀÇ
°á°ú¸¦ ÀúÀåÇÒ PGresult ±¸Á¶Ã¼ Æ÷ÀÎÅÍ*/
/* * ¸ÕÀú, ¼¹ö Á¢¼ÓÀ» À§Çؼ
¸Å°³ÀÎÀÚ¸¦ ¼³Á¤ÇÑ´Ù. * ¸Å°³ÀÎÀÚ°¡ ³ÎÀ̸é, ȯ°æº¯¼ö¸¦
°Ë»çÇÏ°í, * ȯ°æº¯¼ö°¡ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é
½Ã½ºÅÛ ±âº» ³»Á¤°ªÀ» »ç¿ëÇÑ´Ù. */
pghost = NULL; /*
¼¹öÀÇ È£½ºÆ® À̸§ */ pgport = NULL; /*
¼¹ö Æ÷Æ® */ pgoptions = NULL; /*
¼¹ö·Î Àü´ÞÇÒ Æ¯º°ÇÑ ¿É¼Ç */ pgtty = NULL; /*
¼¹ö¸¦ À§ÇÑ µð¹ö±ë tty */ dbName = "template1";
/* Á¢¼ÓÇÒ Àӽà µ¥ÀÌÅͺ£À̽º */
/* µ¥ÀÌÅͺ£À̽º·Î Á¢¼ÓÀ» ½ÃµµÇÑ´Ù.
*/ conn = PQsetdb(pghost, pgport, pgoptions,
pgtty, dbName);
/* ¼¹ö¿ÍÀÇ Á¢¼ÓÀÌ ¼º°øÀûÀ¸·Î
ÀÌ·ç¾îÁ³´ÂÁö °Ë»çÇÑ´Ù. * ¸¸ÀÏ ½ÇÆÐÇÏ¿´´Ù¸é ¿¡·¯
¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°í Á¾·áÇÑ´Ù. */ if (PQstatus(conn)
== CONNECTION_BAD) { fprintf(stderr, "Connection
to database '¡¬s' failed.¡¬n", dbName);
fprintf(stderr, "¡¬s", PQerrorMessage(conn));
exit_nicely(conn); }
#ifdef DEBUG /* µð¹ö±ë ÆÄÀÏ
½ºÆ®¸²À» ¿°í ÃßÀûÀ» ½ÃÀÛÇÑ´Ù. */ debug = fopen("/tmp/trace.out",
"w"); PQtrace(conn, debug); #endif
/* DEBUG */
/* Æ®·£Àè¼Ç ºí·ÏÀ» ½ÃÀÛÇÑ´Ù. ¸ðµç
ÀÛ¾÷Àº Æ®·£Àè¼Ç ±¸¹®¾È¿¡¼ * ÀÌ·ç¾îÁ®¾ß ÇÑ´Ù.
*/ res = PQexec(conn, "BEGIN");
if (PQresultStatus(res) ! = PGRES_COMMAND_OK)
{ fprintf(stderr, "BEGIN command failed¡¬n");
PQclear(res); exit_nicely(conn); }
/* * ¸Þ¸ð¸® À¯ÃâÀ» ¸·À¸·Á¸é
´õ ÀÌ»ó ÇÊ¿äÇÏÁö ¾Ê´Â PGresult¸¦ * PQclear
ÇØ¾ß ÇÑ´Ù. */ PQclear(res);
/* * µ¥ÀÌÅͺ£À̽ºÀÇ ½Ã½ºÅÛ
Ä«Å»·Î±×ÀÎ pg_database Ŭ·¡½º¿¡¼ ¸ðµç * µ¥ÀÌÅͺ£À̽º
Ç׸ñÀ» ¾ò¾î¼ Ä¿¼¸¦ ¼±¾ðÇÑ´Ù. */
res = PQexec(conn, "DECLARE
myportal CURSOR FOR select *from pg_database");
if (PQresultStatus(res) ! = PGRES_COMMAND_OK)
{ fprintf(stderr, "DECLARE CURSOR command
failed¡¬n"); PQclear(res); exit_nicely(conn);
} PQclear(res);
/* ¼±¾ðÇÑ Ä¿¼¿¡¼ µ¥ÀÌÅ͸¦ ¸ðµÎ
ºÒ·¯µéÀδÙ. */ res = PQexec(conn, "FETCH
ALL in myportal"); if (PQresultStatus(res)
! = PGRES_TUPLES_OK) { fprintf(stderr, "FETCH
ALL command didn't return tuples properly¡¬n");
PQclear(res); exit_nicely(conn); }
/* ¸ÕÀú Çʵå Çì´õ¸¦ Ãâ·ÂÇÑ´Ù.
*/ nFields = PQnfields(res); for (i = 0;
i<nFields;i++) { printf("¡¬-15s",
PQfname(res, i)); } printf("¡¬n¡¬n");
/* ´ÙÀ½À¸·Î ÀνºÅϽº Àüü¸¦ ·¹ÄÚµå
¼ö¿Í ÇÊµå ¼ö¸¸Å Ãâ·ÂÇÑ´Ù. */ for (i = 0; i<PQntuples(res);
i++) { for (j = 0; j<nFields; j++)
{ printf("¡¬-15s", PQgetvalue(res,
i, j)); } printf("¡¬n"); }
PQclear(res);
/* Ä¿¼¸¦ ´Ý´Â´Ù. Ä¿¼°¡ ´õ ÀÌ»ó
ÇÊ¿ä¾øÀ¸¸é Ä¿¼¸¦ ´Ý¾Æ¾ß ÇÑ´Ù. */ res = PQexec(conn,
"CLOSE myportal"); PQclear(res);
/* Æ®·£Àè¼ÇÀ» ³¡³½´Ù. */ res
= PQexec(conn, "END"); PQclear(res);
/* µ¥ÀÌÅͺ£À̽º Á¢¼ÓÀ» Á¾·áÇÏ°í
Á¤¸®ÇÑ´Ù. */ PQfinish(conn);
#ifdef DEBUG fclose(debug);
/* µð¹ö±ë ÃßÀûÀ» Áß´ÜÇÑ´Ù. */ #endif /*
DEBUG */
exit(0); } |
2) °£ÀÌ SQL ¸ð´ÏÅ͸µ ÇÁ·Î±×·¥
°£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À» »ìÆ캸¾ÒÀ¸¹Ç·Î, ÀÌÁ¦
Á¶±Ý ´õ »ö´Ù¸¥ ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¸ÀÚ. ¾Õ¼¿Í º°´Ù¸¦ ¹Ù¾ß ¾øÁö¸¸
psql°ú ºñ½ÁÇÑ °£ÀÌ SQL ¸ð´ÏÅ͸µ ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¸°Ú´Ù. psqlµµ
»ç½ÇÀº libpq¸¦ ÀÌ¿ëÇÏ¿© ÀÛ¼ºÇÑ ÀÀ¿ë ÇÁ·Î±×·¥À̶ó´Â °ÍÀ» ¾Õ¼
¼³¸íÇÑ ¹Ù ÀÖ´Ù. ¿©±â¿¡ ³ª¿À´Â spsql ÇÁ·Î±×·¥Àº psqlÀÇ ±âº»ÀûÀÎ
±â´ÉÀ» ¸ð¹æÇÏ¿© ÀÛ¼ºÇÑ °ÍÀ¸·Î, ³»ºÎ ±¸Á¶´Â ¸ÕÀú localhost¿¡
Á¢¼ÓÇÏ¿© pg_database Ä«Å»·Î±×¿¡¼ Àüü µ¥ÀÌÅͺ£À̽º ¸ñ·ÏÀ» ÃàÃâÇÏ¿©
»ç¿ëÀÚ¿¡°Ô º¸¿©ÁÖ°í, »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ µ¥ÀÌÅͺ£À̽º¿¡ ´Ù½Ã Á¢¼ÓÇÏ¿©
»ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ¾Æ¼ ¼¹ö¿¡°Ô Àü´ÞÇÏ°í, ¼¹ö¿¡¼ °á°ú¸¦ µ¹·Á¹ÞÀ»
°æ¿ì ±×°ÍÀ» Ãâ·ÂÇÑ´Ù.
#include <stdio.h>
#include <string.h> #include <stdlib.h>
#include <ctype.h>
#include "libpq-fe.h"
/* libpq ¾îÇø®ÄÉÀ̼ǿ¡ ÇÊ¿äÇÑ Çì´õÆÄÀÏ */
void main() {
char *pghost = NULL; char
*pgport = NULL; char *pgoptions = NULL;
char *pgtty = NULL; char *dbname = NULL;
int nTuples; int i, j; PGconn *conn;
PGresult *res;
FILE *debug; /* µð¹ö±ë ½ºÆ®¸²
*/
char database¡²256¡³; char
buf¡²2048¡³, query¡²2048¡³;
/* ±âº»°ªÀ¸·Î µ¥ÀÌÅͺ£À̽º¿¡ Á¢¼ÓÇÑ´Ù.
*/ conn = PQsetdb(pghost, pgport, pgoptions,
pgtty, dbname);
if (PQstatus(conn) == CONNECTION_BAD)
{ fprintf(stderr, "Connection to database
'¡¬s' failed.¡¬n", dbname); fprintf(stderr,
"¡¬s", PQerrorMEssage(conn)); PQfinish(conn);
exit(1); }
/* µð¹ö±ë Á¤º¸¸¦ ¾ò±â À§ÇØ ½ºÆ®¸²À¸·Î
¿¬°áÇÑ´Ù. */ debug = fopen("/tmp/trace.out",
"w"); PQreace(conn, debug); |
¡ã top
|