이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다사설 토토 사이트 : 문서 : 17 : 32.22. 예제 프로그램버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

27.14. 예제 프로그램

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

예 27-1.libpq와이즈 토토 프로그램 1

/*
 * testLibpq.c
 *
 * Postgres Frontend 라이브러리 인 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 설정 = 템플릿 설정에 기본값이 있습니다
         * 및 기타 모든 연결에 환경 변수 또는 기본값 사용
         * 매개 변수.
         */
        if (argc 1)
                Conninfo = argv [1];
        또 다른
                conninfo = "dbname = template1";

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

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

                fprintf (stderr, "데이터베이스 '%s'에 대한 연결 실패. \ n", pqdb (conn));
                fprintf (stderr, "%s", pqerrormessage (conn));
                exit_nicely (conn);

        /*
         * 여기서 우리의 테스트 사례는 커서를 사용하는 것과 관련이 있습니다.
         * 거래 블록 내부.  우리는 모든 일을 할 수 있습니다
         * "PG_DATABASE에서 선택 *"의 단일 pqExec ()이지만 그게도 마찬가지입니다.
         * 좋은 모범을 보이기위한 사소한.
         */

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

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

        /*
         * pqclear pgresult가 더 이상 피할 필요가 없을 때마다
         * 메모리 누출
         */
        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;

예 27-2.libpq와이즈 토토 프로그램 2

/*
 * testlibpq2.c
 * 비동기식 알림 인터페이스 테스트
 *
 *이 프로그램을 시작한 다음 다른 창의 PSQL에서
 * TBL2 알림;
 *이 프로그램을 종료하려면 4 번 반복하십시오.
 *
 * 또는 공상을 원한다면 이것을 시도하십시오.
 * 다음 명령으로 데이터베이스를 채 웁니다
 * (src/test/examples/testlibpq2.sql에 제공됨) :
 *
 * 테이블 TBL1 (I int4)을 만듭니다.
 *
 * 테이블 생성 tbl2 (i int4);
 *
 * tbl1에 삽입 된대로 규칙 R1을 만듭니다.
 * (tbl2 값 (new.i)에 삽입; TBL2 알림);
 *
 * 그리고 이것을 네 번하십시오 :
 *
 * TBL1 값 (10)에 삽입;
 */
#include <stdio.h
#include <stdlib.h
#include <string.h
#include <errno.h
#include <sys/time.h
#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 설정 = 템플릿 설정에 기본값이 있습니다
         * 및 기타 모든 연결에 환경 변수 또는 기본값 사용
         * 매개 변수.
         */
        if (argc 1)
                Conninfo = argv [1];
        또 다른
                conninfo = "dbname = template1";

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

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

                fprintf (stderr, "데이터베이스 '%s'에 대한 연결 실패. \ n", pqdb (conn));
                fprintf (stderr, "%s", pqerrormessage (conn));
                exit_nicely (conn);

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

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

        /*
         * pqclear pgresult가 더 이상 피할 필요가 없을 때마다
         * 메모리 누출
         */
        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 ++;

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

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

        반환 0;

예 27-3.libpq와이즈 토토 프로그램 3

/*
 * testlibpq3.c
 * 외부 매개 변수 및 이진 I/O를 테스트하십시오.
 *
 *이 실행하기 전에 다음 명령으로 데이터베이스를 채우십시오.
 * (src/test/examples/testlibpq3.sql에 제공됨) :
 *
 * 테이블 테스트 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
 *
 */
#include <stdio.h
#include <stdlib.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);

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

        Const Char *Conninfo;
        pgconn *conn;
        pgresult *res;
        const char *paramvalues ​​[1];
        INT I,
                                J;
        int i_fnum,
                                t_fnum,
                                b_fnum;

        /*
         * 사용자가 명령 줄에 매개 변수를 제공하는 경우
         * Conninfo 문자열; 그렇지 않으면 dbname 설정 = 템플릿 설정에 기본값이 있습니다
         * 및 기타 모든 연결에 환경 변수 또는 기본값 사용
         * 매개 변수.
         */
        if (argc 1)
                Conninfo = argv [1];
        또 다른
                conninfo = "dbname = template1";

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

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

                fprintf (stderr, "데이터베이스 '%s'에 대한 연결 실패. \ n", pqdb (conn));
                fprintf (stderr, "%s", pqerrormessage (conn));
                exit_nicely (conn);

        /*
         *이 프로그램의 요점은 pqexecparams ()의 사용을 설명하는 것입니다.
         * 외부 매개 변수 및 이진 전송
         * 결과.  외부 매개 변수를 사용하면 많은 것을 피할 수 있습니다.
         * 인용 및 탈출에 대한 지루한 멍청이.  우리가 어떻게 주목하십시오
         * 견적 표시로 특별한 일을 할 필요가 없습니다.
         * 매개 변수 값.
         */

        / * 여기에 우리의 외부 매개 변수 값이 있습니다 */
        paramvalues ​​[0] = "Joe 's Place";

        res = pqexecparams (conn,
                                           "test1에서 * 선택 * t = $ 1",
                                           1, / * 하나의 매개 변수 * /
                                           null, / * 백엔드가 매개 변수 유형을 추론하자 * /
                                           매개 변수,
                                           null, / * 텍스트 이후 매개 변수 길이가 필요하지 않습니다 * /
                                           null, / * 모든 텍스트 매개 변수에 대한 기본값 * /
                                           1);          / * 이진 결과 요청 */

        if (pqresultstatus (res)! = pgres_tuples_ok)

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

        / * 결과의 필드 순서에 대한 가정을 피하려면 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");

        PQCLEAR (RES);

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

        반환 0;