34.22. 예제 프로그램

이 예와 다른 예제는 디렉토리에서 찾을 수 있습니다src/test/examples소스 코드 분포에서.

예 34.1. libpq예제 프로그램 1

/*
 * src/test/examples/testlibpq.c
 *
 *
 * testLibpq.c
 *
 * Postgresql 프론트 엔드 라이브러리 인 Libpq의 C 버전을 테스트하십시오.
 */
#include <stdio.h
#include <stdlib.h
#include "libpq-fe.h"

정적 무효
exit_nicely (pgconn *conn)

    pqfinish (conn);
    출구 (1);

int
메인 (Int Argc, char ** argv)

    Const Char *Conninfo;
    pgconn *conn;
    pgresult *res;
    int nfields;
    INT I,
                J;

    /*
     * 사용자가 명령 줄에 매개 변수를 공급하는 경우
     * Conninfo 문자열; 그렇지 않으면 dbname = postgres를 설정하고 사용하는 것의 기본값
     * 다른 모든 연결 매개 변수의 환경 변수 또는 기본값.
     */
    if (argc 1)
        Conninfo = argv [1];
    또 다른
        conninfo = "dbname = postgres";

    / * 데이터베이스에 연결 */
    conn = pqconnectdb (conninfo);

    / * 백엔드 연결이 성공적으로 만들어 졌는지 확인하십시오 */
    if (pqstatus (conn)! = connection_ok)

        fprintf (stderr, "%s", pqerrormessage (conn));
        exit_nicely (conn);

    /* 항상 보안 검색 경로를 설정하므로 악의적 인 사용자가 제어 할 수 없습니다. */
    res = pqexec (conn,
                 "pg_catalog.set_config ( 'search_path', '', false)를 선택하십시오.");
    if (pqresultstatus (res)! = pgres_tuples_ok)

        fprintf (stderr, "set 실패 : %s", pqerrormessage (conn));
        PQCLEAR (RES);
        exit_nicely (conn);

    /*
     * 메모리를 피하기 위해 더 이상 필요하지 않을 때마다 pqclear pgresult가 있어야합니다.
     * 누출
     */
    PQCLEAR (RES);

    /*
     * 여기서 테스트 사례는 커서를 사용하는 것이 포함되며, 여기에는 내부에 있어야합니다.
     * 거래 블록.  우리는 단일로 모든 일을 할 수있었습니다
     * "pg_database에서 선택 *"의 pqexec (), 그러나 그것은 너무 사소한 일입니다.
     * 좋은 예입니다.
     */

    / * 거래 블록 시작 */
    RES = PQEXEC (Conn, "시작");
    if (pqresultstatus (res)! = pgres_command_ok)

        fprintf (stderr, "시작 명령 실패 : %s", pqerrormessage (conn));
        PQCLEAR (RES);
        exit_nicely (conn);

    PQCLEAR (RES);

    /*
     * 데이터베이스의 시스템 카탈로그 인 PG_DATABASE의 행을 가져 오기
     */
    res = pqexec (conn, "pg_database에서 select *에서 myportal cursor를 선언합니다");
    if (pqresultstatus (res)! = pgres_command_ok)

        fprintf (stderr, "커서 실패 : %s", pqerrormessage (conn));
        PQCLEAR (RES);
        exit_nicely (conn);

    PQCLEAR (RES);

    RES = PQEXEC (Conn, "MyPortal에서 모두 가져 오기");
    if (pqresultstatus (res)! = pgres_tuples_ok)

        fprintf (stderr, "모든 실패 : %s", pqerrormessage (conn));
        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);

    반환 0;

예 34.2. libpq예제 프로그램 2

/*
 * src/test/examples/testlibpq2.c
 *
 *
 * testlibpq2.c
 * 비동기식 알림 인터페이스 테스트
 *
 *이 프로그램을 시작한 다음 다른 창의 PSQL에서
 * TBL2 알림;
 *이 프로그램을 종료하려면 4 번 반복하십시오.
 *
 * 또는 공상을 원한다면 이것을 시도하십시오.
 * 다음 명령으로 데이터베이스를 채 웁니다
 * (src/test/examples/testlibpq2.sql에 제공됨) :
 *
 * 스키마 생성 testlibpq2;
 * SET SEARCH_PATH = TESTLIBPQ2;
 * 테이블 TBL1 (I int4)을 만듭니다.
 * 테이블 생성 tbl2 (i int4);
 * tbl1에 삽입 된대로 규칙 R1을 만듭니다.
 * (tbl2 값 (new.i)에 삽입; TBL2 알림);
 *
 *이 프로그램을 시작한 다음 PSQL 에서이 작업을 네 번 수행합니다.
 *
 * testLibpq2.tbl1 값 (10)에 삽입;
 */

#ifdef win32
#include <windows.h
#endif
#include <stdio.h
#include <stdlib.h
#include <string.h
#include <errno.h
#include <sys/time.h
#include <sys/type.h
#ifdef have_sys_select_h
#include <sys/select.h
#endif

#include "libpq-fe.h"

정적 무효
exit_nicely (pgconn *conn)

    pqfinish (conn);
    출구 (1);

int
메인 (Int Argc, char ** argv)

    Const Char *Conninfo;
    pgconn *conn;
    pgresult *res;
    pgnotify *알림;
    int nnotifies;

    /*
     * 사용자가 명령 줄에 매개 변수를 공급하는 경우
     * Conninfo 문자열; 그렇지 않으면 dbname = postgres를 설정하고 사용하는 것의 기본값
     * 다른 모든 연결 매개 변수의 환경 변수 또는 기본값.
     */
    if (argc 1)
        Conninfo = argv [1];
    또 다른
        conninfo = "dbname = postgres";

    / * 데이터베이스에 연결 */
    conn = pqconnectdb (conninfo);

    / * 백엔드 연결이 성공적으로 만들어 졌는지 확인하십시오 */
    if (pqstatus (conn)! = connection_ok)

        fprintf (stderr, "%s", pqerrormessage (conn));
        exit_nicely (conn);

    /* 항상 보안 검색 경로를 설정하므로 악의적 인 사용자가 제어 할 수 없습니다. */
    res = pqexec (conn,
                 "pg_catalog.set_config ( 'search_path', '', false)를 선택하십시오.");
    if (pqresultstatus (res)! = pgres_tuples_ok)

        fprintf (stderr, "set 실패 : %s", pqerrormessage (conn));
        PQCLEAR (RES);
        exit_nicely (conn);

    /*
     * 메모리를 피하기 위해 더 이상 필요하지 않을 때마다 pqclear pgresult가 있어야합니다.
     * 누출
     */
    PQCLEAR (RES);

    /*
     * 규칙 알림에서 알림을 활성화하려면 청취 명령을 발행하십시오.
     */
    res = pqexec (conn, "청취 tbl2");
    if (pqresultstatus (res)! = pgres_command_ok)

        fprintf (stderr, "청취 명령 실패 : %s", pqerrormessage (conn));
        PQCLEAR (RES);
        exit_nicely (conn);

    PQCLEAR (RES);

    /* 4 개의 알림이 접수 된 후 종료하십시오. */
    nnotifies = 0;
    whind (nnotifies <4)

        /*
         * 연결에 무언가가 일어날 때까지 잠을 자십시오.  우리는 select (2)를 사용합니다.
         * 입력을 기다리려면 poll () 또는 이와 유사하게 사용할 수도 있습니다.
         * 시설.
         */
        int 양말;
        fd_set input_mask;

        양말 = pqsocket (conn);

        if (sock <0)
            부서지다;              / * 발생하지 않아야합니다 */

        fd_zero (& input_mask);
        FD_SET (SOOD, & Input_mask);

        if (select (sock + 1, & input_mask, null, null, null) <0)

            fprintf (stderr, "select () 실패 : %s \ n", strerror (errno));
            exit_nicely (conn);

        / * 이제 입력을 확인하십시오 */
        pqconsumeInput (conn);
        while ((notify = pqnotifies (conn))! = null)

            fprintf (stderr,
                    "Backend Pid %d \ n에서 수신 된 ' %s'의 Async 알림",
                    notify- relname, notify- be_pid);
            PQFREEMEM (알림);
            notifies ++;
            pqconsumeInput (conn);

    fprintf (stderr, "done. \ n");

    / * 데이터베이스 연결을 닫고 정리 */
    pqfinish (conn);

    반환 0;

예 34.3. libpq예제 프로그램 3

/*
 * src/test/examples/testlibpq3.c
 *
 *
 * testlibpq3.c
 * 외부 매개 변수 및 이진 I/O를 테스트하십시오.
 *
 *이 실행하기 전에 다음 명령으로 데이터베이스를 채우십시오.
 * (src/test/examples/testlibpq3.sql에 제공됨) :
 *
 * 스키마 생성 testlibpq3;
 * SET SEARCH_PATH = TESTLIBPQ3;
 * set Standard_Conforming_strings = on;
 * 테이블 테스트 1 (i int4, t 텍스트, b 바이 테아)을 작성합니다.
 * test1 값 (1, 'Joe' 'place', '\ 000 \ 001 \ 002 \ 003 \ 004'에 삽입);
 * test1 값 (2, 'ho there', '\ 004 \ 003 \ 002 \ 001 \ 000'에 삽입);
 *
 * 예상 출력은 다음과 같습니다.
 *
 * 튜플 0 : 얻었습니다
 * i = (4 바이트) 1
 * t = (11 바이트) 'Joe's Place '
 * b = (5 바이트) \ 000 \ 001 \ 002 \ 003 \ 004
 *
 * 튜플 0 : 얻었습니다
 * i = (4 바이트) 2
 * t = (8 바이트) 'ho there'
 * b = (5 바이트) \ 004 \ 003 \ 002 \ 001 \ 000
 */

#ifdef win32
#include <windows.h
#endif

#include <stdio.h
#include <stdlib.h
#include <stdint.h
#include <string.h
#include <sys/type.h
#include "libpq-fe.h"

/ * ntohl/htonl의 경우 */
#include <netinet/in.h
#include <arpa/inet.h

정적 무효
exit_nicely (pgconn *conn)

    pqfinish (conn);
    출구 (1);

/*
 *이 기능은 이진 형식 페치 인 쿼리 결과를 인쇄합니다.
 * 위의 주석에서와 같이 정의 된 테이블.  우리는 그것을 나누기 때문에
 * main () 함수는 두 번 사용합니다.
 */
정적 무효
show_binary_results (pgresult *res)

    INT I,
                J;
    int i_fnum,
                t_fnum,
                b_fnum;

    / * 결과의 필드 순서에 대한 가정을 피하려면 pqfnumber를 사용하십시오 */
    i_fnum = pqfnumber (res, "i");
    t_fnum = pqfnumber (res, "t");
    b_fnum = pqfnumber (res, "b");

    for (i = 0; i <pqntuples (res); i ++)

        char *iptr;
        char *tptr;
        char *bptr;
        int Blen;
        친밀한 Ival;

        / * 필드 값을 얻습니다 (가능성은 무시합니다!) */
        iptr = pqgetValue (res, i, i_fnum);
        tptr = pqgetValue (res, i, t_fnum);
        bptr = pqgetValue (res, i, b_fnum);

        /*
         * INT4의 바이너리 표현은 네트워크 바이트 순서에 있으며
         * 우리는 로컬 바이트 순서를 더 잘 강요 할 것입니다.
         */
        ival = ntohl ( *((uint32_t *) iptr));

        /*
         * 텍스트의 이진 표현은 텍스트이며 libpq 이후
         * 제로 바이트를 추가하기에 충분히 좋았습니다. 잘 작동합니다.
         * C 문자열로.
         *
         * Bytea의 이진 표현은 수많은 바이트입니다.
         * 필드 길이에주의를 기울여야하므로 포함 된 널을 포함하십시오.
         */
        blen = pqgetlength (res, i, b_fnum);

        printf ( "튜플 %d : got \ n", i);
        printf ( "i = ( %d 바이트) %d \ n",
               pqgetlength (res, i, i_fnum), ival);
        printf ( "t = (%d 바이트) '%s'\ n",
               pqgetlength (res, i, t_fnum), tptr);
        printf ( "b = (%d 바이트)", blen);
        for (j = 0; j <blen; j ++)
            printf ( "\\%03o", bptr [j]);
        printf ( "\ n \ n");

정정 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면