이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 선택하세요.
포스트그레SQL
이전 44장. libpq 다음

샘플 프로그램

샘플 프로그램 1

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

         무효
         exit_nicely(PGconn* conn)

           PQfinish(콘);
           출구(1);

         메인()

           char *pghost, *pgport, *pgoptions, *pgtty;
           char* DB이름;
           int nFields;
           int i,j;

         /* 파일 *디버그; */

           PGconn* 연결;
           PGresult* res;

           /* 백엔드 연결에 대한 매개변수를 설정하여 시작합니다.
              매개변수가 null이면 시스템은 다음을 사용하려고 시도합니다.
              환경 변수를 찾아 합리적인 기본값
              또는 실패하면 하드와이어 상수를 사용합니다 */
           pghost = NULL;  /* 백엔드 서버의 호스트 이름 */
           pgport = NULL;  /* 백엔드 서버의 포트 */
           pgoptions = NULL; /* 백엔드 서버를 시작하기 위한 특수 옵션 */
           pgtty = NULL;     /* 백엔드 서버에 대한 tty 디버깅 */
           DB이름 = "템플릿1";

           /* 데이터베이스에 연결 */
           conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

           /* 백엔드 연결이 성공적으로 이루어졌는지 확인하세요 */
           if (PQstatus(conn) == CONNECTION_BAD) 
             fprintf(stderr,"데이터베이스 '%s'에 대한 연결에 실패했습니다.0, dbName);
             fprintf(stderr,"%s",PQerrorMessage(conn));
             exit_nicely(conn);

         /* debug = fopen("/tmp/trace.out","w");  */
         /* PQtrace(conn, 디버그);  */

           /* 트랜잭션 블록 시작 */

           res = PQexec(conn,"BEGIN");
           if (PQresultStatus(res) != PGRES_COMMAND_OK) 
             fprintf(stderr,"BEGIN 명령이 실패했습니다0);
             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,"DECLARE CURSOR 명령이 실패했습니다0);
             PQclear(res);
             exit_nicely(conn);

           PQclear(res);

           res = PQexec(conn,"myportal에서 모두 가져오기");
           if (PQresultStatus(res) != PGRES_TUPLES_OK) 
             fprintf(stderr,"FETCH ALL 명령이 튜플을 제대로 반환하지 않았습니다0);
             PQclear(res);
             exit_nicely(conn);

           /* 먼저 속성 이름을 인쇄합니다 */
           nFields = PQnfields(res);
           for (i=0; i < nFields; i++) 
             printf("%-15s",PQfname(res,i));

           printf("0);

           /* 다음으로 인스턴스를 인쇄합니다 */
           for (i=0; i < PQntuples(res); i++) 
             for (j=0 ; j < nFields; j++) 
               printf("%-15s", PQgetvalue(res,i,j));

             printf("0);

           PQclear(res);

           /* 포털을 닫습니다 */
           res = PQexec(conn, "CLOSE myportal");
           PQclear(res);

           /* 트랜잭션 종료 */
           res = PQexec(conn, "END");
           PQclear(res);

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

         /* fclose(디버그); */

샘플 프로그램 2

/*
          * 테스트libpq2.c
          * 비동기 알림 인터페이스 테스트
          *
            데이터베이스를 다음으로 채웁니다.

         테이블 TBL1 생성(i int4);

         테이블 TBL2 생성(i int4);

         TBL1 DO [INSERT INTO TBL2 값(new.i); 통지 TBL2];

          * 그런 다음 이 프로그램을 시작하세요.
          * 프로그램이 시작된 후,

         TBL1 값에 삽입(10);

          *
          *
          */
         #include <stdio.h
         #include "libpq-fe.h"

         void exit_nicely(PGconn* conn)

           PQfinish(콘);
           출구(1);

         메인()

           char *pghost, *pgport, *pgoptions, *pgtty;
           char* DB이름;
           int nFields;
           int i,j;

           PGconn* 연결;
           PGresult* res;
           PGnotify* 알림;

           /* 백엔드 연결에 대한 매개변수를 설정하여 시작합니다.
              매개변수가 null이면 시스템은 다음을 사용하려고 시도합니다.
              환경 변수를 찾아 합리적인 기본값
              또는 실패하면 하드와이어 상수를 사용합니다 */
           pghost = NULL;  /* 백엔드 서버의 호스트 이름 */
           pgport = NULL;  /* 백엔드 서버의 포트 */
           pgoptions = NULL; /* 백엔드 서버를 시작하기 위한 특수 옵션 */
           pgtty = NULL;     /* 백엔드 서버에 대한 tty 디버깅 */
           dbName = getenv("사용자"); /* 이를 테스트 데이터베이스 이름으로 변경합니다*/

           /* 데이터베이스에 연결 */
           conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

           /* 백엔드 연결이 성공적으로 이루어졌는지 확인하세요 */
           if (PQstatus(conn) == CONNECTION_BAD) 
             fprintf(stderr,"데이터베이스 '%s'에 대한 연결에 실패했습니다.0, dbName);
             fprintf(stderr,"%s",PQerrorMessage(conn));
             exit_nicely(conn);

           res = PQexec(conn, "LISTEN TBL2");
           if (PQresultStatus(res) != PGRES_COMMAND_OK) 
             fprintf(stderr,"LISTEN 명령이 실패했습니다0);
             PQclear(res);
             exit_nicely(conn);

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

           동안 (1) 
               /* 비동기 알림은 쿼리의 결과로만 돌아옵니다*/
               /* 빈 쿼리를 보낼 수 있습니다 */
               res = PQexec(conn, " ");
         /* printf("res-status = %s0, pgresStatus[PQresultStatus(res)]); */
               /* 비동기 반환 확인 */
               통지 = PQnotify(conn);
               if (알림) 
                fprintf(표준 오류,
                     "백엔드 PID '%d'에서 '%s'에 대한 비동기 알림이 수신되었습니다.
                     알림-relname, 알림-be_pid);
                무료(알림);
                부서지다;

               PQclear(res);

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

샘플 프로그램 3

/*
          * 테스트libpq3.c
          * Postgres 프런트엔드 라이브러리인 LIBPQ의 C 버전을 테스트합니다.
          * 바이너리 커서 인터페이스 테스트
          *
          *
          *
          다음을 수행하여 데이터베이스를 채웁니다.

         CREATE TABLE test1 (i int4, d float4, p 다각형);

         INSERT INTO test1 값(1, 3.567, '(3.0, 4.0, 1.0, 2.0)'::폴리곤);

         INSERT INTO test1 값(2, 89.05, '(4.0, 3.0, 2.0, 1.0)'::폴리곤);

          예상되는 출력은 다음과 같습니다

         튜플 0: 있음
          i = (4바이트) 1,
          d = (4바이트) 3.567000,
          p = (4바이트) 2포인트 경계 상자 = (hi=3.000000/4.000000, lo = 1.000000,2.000000)
         튜플 1: 획득
          i = (4바이트) 2,
          d = (4바이트) 89.050003,
          p = (4바이트) 2포인트 경계 상자 = (hi=4.000000/3.000000, lo = 2.000000,1.000000)

          *
          */
         #include <stdio.h
         #include "libpq-fe.h"
         #include "utils/geo-decls.h" /* POLYGON 유형의 경우 */

         void exit_nicely(PGconn* conn)

           PQfinish(콘);
           출구(1);

         메인()

           char *pghost, *pgport, *pgoptions, *pgtty;
           char* DB이름;
           int nFields;
           int i,j;
           int i_fnum, d_fnum, p_fnum;

           PGconn* 연결;
           PGresult* res;

           /* 백엔드 연결에 대한 매개변수를 설정하여 시작합니다.
              매개변수가 null이면 시스템은 다음을 사용하려고 시도합니다.
              환경 변수를 찾아 합리적인 기본값
              또는 실패하면 하드와이어 상수를 사용합니다 */
           pghost = NULL;  /* 백엔드 서버의 호스트 이름 */
           pgport = NULL;  /* 백엔드 서버의 포트 */
           pgoptions = NULL; /* 백엔드 서버를 시작하기 위한 특수 옵션 */
           pgtty = NULL;     /* 백엔드 서버에 대한 tty 디버깅 */

           dbName = getenv("사용자");  /* 이를 테스트 데이터베이스 이름으로 변경합니다*/

           /* 데이터베이스에 연결 */
           conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

           /* 백엔드 연결이 성공적으로 이루어졌는지 확인하세요 */
           if (PQstatus(conn) == CONNECTION_BAD) 
             fprintf(stderr,"데이터베이스 '%s'에 대한 연결에 실패했습니다.0, dbName);
             fprintf(stderr,"%s",PQerrorMessage(conn));
             exit_nicely(conn);

           /* 트랜잭션 블록 시작 */
           res = PQexec(conn,"BEGIN");
           if (PQresultStatus(res) != PGRES_COMMAND_OK) 
             fprintf(stderr,"BEGIN 명령이 실패했습니다0);
             PQclear(res);
             exit_nicely(conn);

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

           /* 데이터베이스의 시스템 카탈로그인 pg_database에서 인스턴스를 가져옵니다*/
           res = PQexec(conn,"test1에서 *를 선택하기 위해 mycursor 바이너리 커서를 선언합니다.");
           if (PQresultStatus(res) != PGRES_COMMAND_OK) 
             fprintf(stderr,"DECLARE CURSOR 명령이 실패했습니다0);
             PQclear(res);
             exit_nicely(conn);

           PQclear(res);

           res = PQexec(conn,"mycursor에서 모두 가져오기");
           if (PQresultStatus(res) != PGRES_TUPLES_OK) 
             fprintf(stderr,"FETCH ALL 명령이 튜플을 제대로 반환하지 않았습니다0);
             PQclear(res);
             exit_nicely(conn);

           i_fnum = PQfnumber(res,"i");
           d_fnum = PQfnumber(res,"d");
           p_fnum = PQfnumber(res,"p");

           (i=0;i<3;i++) 
               printf("유형[%d] = %d, 크기[%d] = %d0,
                   i, PQftype(res,i),
                   i, PQfsize(res,i));

           for (i=0; i < PQntuples(res); i++) 
             int *ival;
             float *dval;
             int plen;
             다각형* pval;
             /*/
             ival = (int*)PQgetvalue(res,i,i_fnum);
             dval = (float*)PQgetvalue(res,i,d_fnum);
             plen = PQgetlength(res,i,p_fnum);

             /* plen에는 길이 필드가 포함되어 있지 않으므로 VARHDSZ만큼 증가해야 합니다*/
             pval = (POLYGON*) malloc(plen + VARHDRSZ);
             pval-크기 = plen;
             memmove((char*)&pval-npts, PQgetvalue(res,i,p_fnum), plen);
             printf("튜플 %d: got0, i);
             printf(" i = (%d 바이트) %d,0,
                 PQgetlength(res,i,i_fnum), *ival);
             printf(" d = (%d 바이트) %f,0,
                 PQgetlength(res,i,d_fnum), *dval);
             printf(" p = (%d 바이트) %d 포인트 경계 상자 = (hi=%f/%f, lo = %f,%f)0,
                 PQgetlength(res,i,d_fnum),
                 pval-npts,
                 pval-boundbox.xh,
                 pval-boundbox.yh,
                 pval-boundbox.xl,
                 pval-boundbox.yl);

           PQclear(res);

           /* 포털을 닫습니다 */
           res = PQexec(conn, "CLOSE mycursor");
           PQclear(res);

           /* 트랜잭션 종료 */
           res = PQexec(conn, "END");
           PQclear(res);

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

이전 다음
버그 위로 pgtcl