이러한 예와 기타 예는 디렉토리에서 찾을 수 있습니다.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");