이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.사설 토토 사이트 : 문서 : 17 : 32.22. 예제 프로그램버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

30.19. 토토 꽁 머니 프로그램

이러한 예와 기타 예는 디렉토리에서 찾을 수 있습니다.src/테스트/토토 꽁 머니소스 코드에서 배포.

예 30-1.libpq토토 꽁 머니 프로그램 1

/*
 * 테스트libpq.c
 *
 * PostgreSQL 프런트엔드 라이브러리인 libpq의 C 버전을 테스트합니다.
 */
#include <stdio.h
#include <stdlib.h
#include "libpq-fe.h"

정적 공백
exit_nicely(PGconn *conn)

    PQfinish(콘);
    출구(1);

정수
메인(int argc, char **argv)

    const char *conninfo;
    PGconn *콘;
    PGresult *res;
    int nFields;
    나는,
                j;

    /*
     * 사용자가 명령줄에 매개변수를 제공하는 경우 이를
     * 연결 정보 문자열; 그렇지 않으면 기본적으로 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);

    /*
     * 여기서 우리의 테스트 케이스는 커서를 사용하는 것과 관련되어 있습니다.
     * 거래 블록.  우리는 한 번으로 모든 것을 할 수 있어요
     * "select * from pg_database"의 PQexec()이지만 만들기에는 너무 사소합니다.
     * 좋은 예.
     */

    /* 트랜잭션 블록 시작 */
    res = PQexec(conn, "BEGIN");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)

        fprintf(stderr, "BEGIN 명령 실패: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);

    /*
     * 메모리를 피하기 위해 더 이상 필요하지 않을 때마다 PQclear PGresult를 수행해야 합니다.
     * 누출
     */
    PQclear(res);

    /*
     * 데이터베이스의 시스템 카탈로그인 pg_database에서 행을 가져옵니다.
     */
    res = PQexec(conn, "pg_database에서 *를 선택하기 위해 myportal 커서를 선언합니다.");
    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(콘);

    0을 반환합니다.

예 30-2.libpq토토 꽁 머니 프로그램 2

/*
 * 테스트libpq2.c
 * 비동기 알림 인터페이스 테스트
 *
 * 이 프로그램을 시작한 다음 다른 창의 psql에서 다음을 수행하십시오.
 * TBL2에 통지;
 * 이 프로그램을 종료하려면 4번 반복하세요.
 *
 * 또는 좀 더 화려하게 꾸미고 싶다면 다음을 시도해 보세요.
 * 다음 명령으로 데이터베이스를 채웁니다.
 * (src/test/examples/testlibpq2.sql에서 제공):
 *
 * 테이블 TBL1 생성(i int4);
 *
 * 테이블 TBL2 생성(i int4);
 *
 * TBL1 DO에 삽입할 때 규칙 r1을 생성합니다.
 * (TBL2 값에 삽입(new.i); TBL2에 알림);
 *
 * 이 작업을 네 번 수행합니다.
 *
 * TBL1 값에 삽입(10);
 */
#include <stdio.h
#include <stdlib.h
#include <문자열.h
#include <errno.h
#include <sys/time.h
#include "libpq-fe.h"

정적 공백
exit_nicely(PGconn *conn)

    PQfinish(콘);
    출구(1);

정수
메인(int argc, char **argv)

    const char *conninfo;
    PGconn *콘;
    PGresult *res;
    PGnotify *알림;
    int는 알림을 보내지 않습니다.

    /*
     * 사용자가 명령줄에 매개변수를 제공하는 경우 이를
     * 연결 정보 문자열; 그렇지 않으면 기본적으로 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);

    /*
     * 규칙의 NOTIFY에서 알림을 활성화하려면 LISTEN 명령을 실행하세요.
     */
    res = PQexec(conn, "LISTEN TBL2");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)

        fprintf(stderr, "LISTEN 명령 실패: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);

    /*
     * 메모리를 피하기 위해 더 이상 필요하지 않을 때마다 PQclear PGresult를 사용해야 합니다.
     * 누출
     */
    PQclear(res);

    /* 4개의 알림을 받은 후 종료합니다. */
    알림 = 0;
    while (< 4를 통지하지 않음)

        /*
         * 연결에 문제가 생길 때까지 잠을 자세요.  우리는 select(2)를 사용합니다.
         * 입력을 기다리려면 poll() 또는 이와 유사한 것을 사용할 수도 있습니다.
         * 시설.
         */
        int 양말;
        fd_set 입력_마스크;

        양말 = PQsocket(conn);

        만약 (양말 < 0)
            휴식;              /* 일어나서는 안되는 일 */

        FD_ZERO(&input_mask);
        FD_SET(양말, &input_mask);

        if (select(양말 + 1, &input_mask, NULL, NULL, NULL) < 0)

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

        /* 이제 입력을 확인합니다 */
        PQconsumeInput(conn);
        while ((notify = PQnotify(conn)) != NULL)

            fprintf(표준 오류,
                    "'%s'의 비동기 알림이 백엔드 pid %d에서 수신되었습니다\n",
                    알림-relname, 알림-be_pid);
            PQfreemem(알림);
            통지하지 않음++;

    fprintf(stderr, "완료.\n");

    /* 데이터베이스에 대한 연결을 닫고 정리합니다 */
    PQfinish(콘);

    0을 반환합니다.

예 30-3.libpq토토 꽁 머니 프로그램 3

/*
 * 테스트libpq3.c
 * 라인 외부 매개변수 및 바이너리 I/O를 테스트합니다.
 *
 * 이를 실행하기 전에 다음 명령으로 데이터베이스를 채우십시오.
 * (src/test/examples/testlibpq3.sql에서 제공):
 *
 * CREATE TABLE test1 (i int4, t text, b bytea);
 *
 * INSERT INTO test1 값(1, 'joe'의 장소', '\\000\\001\\002\\003\\004');
 * INSERT INTO test1 값(2, 'ho 거기', '\\004\\003\\002\\001\\000');
 *
 * 예상되는 결과는 다음과 같습니다.
 *
 * 튜플 0: 획득
 * i = (4바이트) 1
 * t = (11바이트) '조의 장소'
 * b = (5바이트) \000\001\002\003\004
 *
 * 튜플 0: 획득
 * i = (4바이트) 2
 * t = (8바이트) '저기요'
 * b = (5바이트) \004\003\002\001\000
 */
#include <stdio.h
#include <stdlib.h
#include <문자열.h
#include <sys/types.h
#include "libpq-fe.h"

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

정적 공백
exit_nicely(PGconn *conn)

    PQfinish(콘);
    출구(1);

/*
 * 이 함수는 바이너리 형식으로 가져온 쿼리 결과를 인쇄합니다.
 * 위의 설명과 같이 정의된 테이블입니다.  우리는 그것을 나누었습니다. 왜냐하면
 * main() 함수는 이를 두 번 사용합니다.
 */
정적 공백
show_binary_results(PGresult *res)

    나는,
                j;
    정수 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++)

        문자 *iptr;
        char *tptr;
        char *bptr;
        블렌;
        내부적으로;

        /* 필드 값을 가져옵니다(값이 null일 가능성은 무시합니다!) */
        iptr = PQgetvalue(res, i, i_fnum);
        tptr = PQgetvalue(res, i, t_fnum);
        bptr = PQgetvalue(res, i, b_fnum);

        /*
         * INT4의 이진 표현은 네트워크 바이트 순서로 되어 있습니다.
         * 로컬 바이트 순서로 강제하는 것이 좋습니다.
         */
        ival = ntohl(*((uint32_t *) iptr));

        /*
         * TEXT의 이진 표현은 텍스트이며 libpq 이후
         * 0바이트를 추가할 수 있을 만큼 훌륭했습니다. 잘 작동할 것입니다.
         * C 문자열로.
         *
         * BYTEA의 이진 표현은 바이트 묶음입니다.
         * 포함된 null을 포함하므로 필드 길이에 주의해야 합니다.
         */
        blen = PQgetlength(res, i, b_fnum);

        printf("튜플 %d: 가져옴\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 < 블렌; j++)
            printf("\\%03o", btr[j]);
        printf("\n\n");