이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.
현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 선택하세요.
| 포스트그레SQL |
| 이전 |
44장.
libpq |
다음 |
/*
* 테스트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(디버그); */
/*
* 테스트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(콘);
/*
* 테스트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(콘);