°ø°³ µ¥ÀÌÅͺ£À̽º ¼­¹ö PostgreSQL (4)
-libpq¸¦ ÀÌ¿ëÇÑ ¾îÇø®ÄÉÀÌ¼Ç ÀÛ¼º

Çѵ¿ÈÆ ddoch@hitel.kol.co.kr

 

     

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

 

    PQdb
    ÇöÀç ¿¬°áµÈ µ¥ÀÌÅͺ£À̽ºÀÇ À̸§À» ¹ÝȯÇÑ´Ù.
     

    char *PQdb(PGconn *conn)

 

    PQhost
    ÇöÀç ¿¬°áµÇ¾î ÀÖ´Â ¼­¹öÀÇ È£½ºÆ® À̸§À» ¹ÝȯÇÑ´Ù.
     

    char *PQhost(PGconn *conn)

 

    PQoptions
    ¿¬°á½Ã¿¡ »ç¿ëµÈ ¿É¼ÇÀÌ ¹«¾ùÀ̾ú´ÂÁö¸¦ ¾Ë·ÁÁØ´Ù.
     

    char *PQoptions(PGconn *conn)

 

    PQport
    ¿¬°áµÈ Æ÷Æ® ¹øÈ£¸¦ ¹ÝȯÇÑ´Ù.
     

    char *PQport(PGconn *conn)

 

    PQtty
    ¿¬°áµÈ tty¸¦ ¹ÝȯÇÑ´Ù.
     

    char *PQtty(PGconn *conn)

 

    PQstatus
    ¿¬°áµÈ »óÅ¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë·ÁÁØ´Ù. »óÅ°ªÀº CONNECTION_OK³ª CONNECTION_BAD°¡ µÉ ¼ö ÀÖ´Ù.
     

    ConnStatusType *PQstatus(PGconn *conn)


    ¿¹)
    /* Á¢¼ÓÀÌ ½ÇÆÐÇÏ¸é ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏ°í Á¾·áÇÑ´Ù. */
    if (PQstatus(conn) == CONNECTION_BAD) {
      fprintf(stderr, "Connection to database '¡¬s' failed.¡¬n", dbname);
      fprintf(stderr, "¡¬s", PQerrorMessage(conn));
      PQfinish(conn);
      exit(1);
    }

 

    PQerrorMessage
    ¿¬°á½Ã¿¡ ¹ß»ýÇÑ ¿¡·¯ ¸Þ½ÃÁö¸¦ ¾Ë·ÁÁØ´Ù.
     

    char *PQerrorMessage(PGconn *conn);

 

    PQfinish
    ¼­¹ö¿ÍÀÇ Á¢¼ÓÀ» Á¾·áÇÑ´Ù. ¶ÇÇÑ PGconn ±¸Á¶Ã¼¿¡ »ç¿ëµÈ ¸Þ¸ð¸®¸¦ ¹ÝȯÇÑ´Ù. PQfinish¸¦ È£ÃâÇÑ ÀÌÈÄ¿¡´Â PGconn Æ÷ÀÎÅ͸¦ »ç¿ëÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù.
     

    void PQfinish(PQconn *conn)

 

    PQreset
    ¼­¹ö¿ÍÀÇ Á¢¼Ó Æ÷Æ®¸¦ ¸®¼ÂÇÑ´Ù. Áï, ¼­¹ö¿¡ ¿¬°áµÈ IPC ¼ÒÄÏÀ» ´Ý°í µ¿ÀÏÇÑ ¼­¹ö¿¡ Á¢¼ÓÀ» »õ·Ó°Ô ½ÃµµÇÑ´Ù.
     

    void PQreset(PGconn *conn)

 

    PQtrace
    ¼­¹ö¿Í ÇÁ·ÐÆ®¿£µå »çÀÌ¿¡ ¿À°¡´Â ¸Þ½ÃÁö¸¦ ÃßÀûÇÑ´Ù. ÃßÀû ¸Þ½ÃÁö´Â debug_port ÆÄÀÏ ½ºÆ®¸²À¸·Î Ãâ·ÂµÈ´Ù.
     

    void PQtrace(PGconn *conn, FILE* debug_port);

 

    PQuntrace
    ¼­¹ö¿Í ÇÁ·ÐÆ®¿£µå »çÀÌ¿¡ ÁÖ°í¹Þ´Â ¸Þ½ÃÁö ÃßÀûÀ» Ãë¼ÒÇÑ´Ù.
     

    void PQuntrace(PGconn *conn);

     

     

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

 

    PQnfields
    ÇʵåÀÇ °³¼ö¸¦ ¹ÝȯÇÑ´Ù.
     

    int PQnfields(PGresult *res);

 

    PQfname
    ÁöÁ¤ÇÏ´Â Çʵå À妽º¿Í °ü·ÃµÈ Çʵå(¼Ó¼º) À̸§À» µ¹·ÁÁØ´Ù. Çʵå À妽º´Â 0¿¡¼­ºÎÅÍ ½ÃÀÛÇÑ´Ù.
     

    char *PQfname(PGresult *res, int field_index);

 

    PQfnumber
    ÁÖ¾îÁø Çʵå À̸§ÀÇ À妽º ¹øÈ£¸¦ ¸®ÅÏÇÑ´Ù.
     

    int PQfnumber(PGresult *res, char *field_name);

 

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

 

    PQgetlength
    ÇʵåÀÇ ±æÀ̸¦ ¹ÙÀÌÆ® ¼ö·Î µ¹·ÁÁØ´Ù.
     

    int PQgetlength(PGresult *res, int tup_num, int field_num);

 

    PQcmdStatus
    ¸¶Áö¸· ÁúÀÇ ¸í·É°ú °ü·ÃµÈ ¸í·É¾î »óŸ¦ µ¹·ÁÁØ´Ù.
     

    char *PQcmdStatus(PGresult *res);

 

    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ÀÇ È°¿ë

    Áö±Ý±îÁö 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

homeÀ¸·Î...