이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.
현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.
/*
* testlibpq.c Postgres 프론트엔드인 Libpq의 C 버전을 테스트합니다.
* 도서관.
*
*
*/
#include <stdio.h
#include "libpq-fe.h"
무효
exit_nicely(PGconn *conn)
PQfinish(콘);
출구(1);
메인()
char *pghost,
*pg포트,
*pgo옵션,
*pgtty;
char *db이름;
int nFields;
나는,
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' 데이터베이스에 연결하지 못했습니다.\n", dbName);
fprintf(stderr, "%s", PQerrorMessage(conn));
exit_nicely(conn);
/* debug = fopen("/tmp/trace.out","w"); */
/* PQtrace(conn, 디버그); */
/* 트랜잭션 블록 시작 */
res = PQexec(conn, "BEGIN");
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
fprintf(stderr, "BEGIN 명령이 실패했습니다\n");
PQclear(res);
exit_nicely(conn);
/*
* 더 이상 필요하지 않을 때마다 PQclear PGresult를 피해야 합니다.
* 메모리 누수
*/
PQclear(res);
/*
* 시스템 카탈로그인 pg_database에서 인스턴스를 가져옵니다.
* 데이터베이스
*/
res = PQexec(conn, "pg_database에서 *를 선택하기 위해 mycursor 커서를 선언합니다.");
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
fprintf(stderr, "DECLARE CURSOR 명령이 실패했습니다\n");
PQclear(res);
exit_nicely(conn);
PQclear(res);
res = PQexec(conn, "mycursor에서 모두 가져오기");
if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
fprintf(stderr, "FETCH ALL 명령이 튜플을 제대로 반환하지 않았습니다\n");
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 mycursor");
PQclear(res);
/* 트랜잭션 커밋 */
res = PQexec(conn, "COMMIT");
PQclear(res);
/* 데이터베이스에 대한 연결을 닫고 정리합니다 */
PQfinish(콘);
/* fclose(디버그); */
0을 반환합니다.
/*
* 테스트libpq2.c
* 비동기 알림 인터페이스 테스트
*
* 이 프로그램을 시작한 다음 다른 창의 psql에서 다음을 수행하십시오.
* TBL2에 통지;
*
* 또는 좀 더 화려하게 꾸미고 싶다면 다음을 시도해 보세요.
* 데이터베이스를 다음으로 채웁니다.
*
* 테이블 TBL1 생성(i int4);
*
* 테이블 TBL2 생성(i int4);
*
* TBL1 DO에 삽입할 때 규칙 r1을 생성합니다.
* (INSERT INTO TBL2 값(new.i); NOTIFY TBL2);
*
* 그리고 할
*
* TBL1 값에 삽입(10);
*
*/
#include <stdio.h
#include "libpq-fe.h"
무효
exit_nicely(PGconn *conn)
PQfinish(콘);
출구(1);
메인()
char *pghost,
*pg포트,
*pgo옵션,
*pgtty;
char *db이름;
int nFields;
나는,
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' 데이터베이스에 연결하지 못했습니다.\n", dbName);
fprintf(stderr, "%s", PQerrorMessage(conn));
exit_nicely(conn);
res = PQexec(conn, "LISTEN TBL2");
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
fprintf(stderr, "LISTEN 명령이 실패했습니다\n");
PQclear(res);
exit_nicely(conn);
/*
* 더 이상 필요하지 않을 때마다 PQclear PGresult를 피해야 합니다.
* 메모리 누수
*/
PQclear(res);
동안 (1)
/*
* 확인 사이에 잠시 기다리십시오. select()로 대기 중
* 더 효율적일 것입니다.
*/
수면(1);
/* 비동기 백엔드 메시지 수집 */
PQconsumeInput(conn);
/* 비동기 알림 메시지 확인 */
while ((notify = PQnotify(conn)) != NULL)
fprintf(표준 오류,
"백엔드 PID '%d'에서 '%s'의 비동기 알림을 받았습니다\n",
알림-relname, 알림-be_pid);
무료(알림);
/* 데이터베이스에 대한 연결을 닫고 정리합니다 */
PQfinish(콘);
0을 반환합니다.
/*
* testlibpq3.c Postgres 프론트엔드인 Libpq의 C 버전을 테스트합니다.
* 도서관. 바이너리 커서 인터페이스 테스트
*
*
*
* 다음을 수행하여 데이터베이스를 채웁니다.
*
* CREATE TABLE test1 (i int4, d float4, p 다각형);
*
* test1 값(1, 3.567, '(3.0, 4.0, 1.0,
* 2.0)'::다각형);
*
* 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 유형의 경우 */
무효
exit_nicely(PGconn *conn)
PQfinish(콘);
출구(1);
메인()
char *pghost,
*pg포트,
*pgo옵션,
*pgtty;
char *db이름;
int nFields;
나는,
j;
정수 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' 데이터베이스에 연결하지 못했습니다.\n", dbName);
fprintf(stderr, "%s", PQerrorMessage(conn));
exit_nicely(conn);
/* 트랜잭션 블록 시작 */
res = PQexec(conn, "BEGIN");
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
fprintf(stderr, "BEGIN 명령이 실패했습니다\n");
PQclear(res);
exit_nicely(conn);
/*
* 더 이상 필요하지 않을 때마다 PQclear PGresult를 피해야 합니다.
* 메모리 누수
*/
PQclear(res);
/*
* 시스템 카탈로그인 pg_database에서 인스턴스를 가져옵니다.
* 데이터베이스
*/
res = PQexec(conn, "test1에서 *를 선택하기 위해 mycursor 바이너리 커서를 선언합니다.");
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
fprintf(stderr, "DECLARE CURSOR 명령이 실패했습니다\n");
PQclear(res);
exit_nicely(conn);
PQclear(res);
res = PQexec(conn, "mycursor에서 모두 가져오기");
if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
fprintf(stderr, "FETCH ALL 명령이 튜플을 제대로 반환하지 않았습니다\n");
PQclear(res);
exit_nicely(conn);
i_fnum = PQfnumber(res, "i");
d_fnum = PQfnumber(res, "d");
p_fnum = PQfnumber(res, "p");
for (i = 0; i < 3; i++)
printf("유형[%d] = %d, 크기[%d] = %d\n",
i, PQftype(res, i),
i, PQfsize(res, i));
for (i = 0; i < PQntuples(res); i++)
int *ival;
float *dval;
int plen;
다각형 *pval;
/* 이것을 우리가 알고 있는 3개 필드에 연결합니다 */
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: 가져옴\n", i);
printf(" i = (%d 바이트) %d,\n",
PQgetlength(res, i, i_fnum), *ival);
printf(" d = (%d 바이트) %f,\n",
PQgetlength(res, i, d_fnum), *dval);
printf(" p = (%d 바이트) %d 포인트 \tboundbox = (hi=%f/%f, lo = %f,%f)\n",
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, "COMMIT");
PQclear(res);
/* 데이터베이스에 대한 연결을 닫고 정리합니다 */
PQfinish(콘);
0을 반환합니다.