이 예와 다른 와이즈 토토는 디렉토리에서 찾을 수 있습니다src/test/examples소스 코드에서 분포.
예 27-1.libpq와이즈 토토 프로그램 1
/* * testLibpq.c * * Postgres Frontend 라이브러리 인 Libpq의 C 버전을 테스트하십시오. */ #include <stdio.h #include <stdlib.h #include "libpq-fe.h" 정적 무효 exit_nicely (pgconn *conn) pqfinish (conn); 출구 (1); int 메인 (Int Argc, char ** argv) Const Char *Conninfo; pgconn *conn; pgresult *res; int nfields; INT I, J; /* * 사용자가 명령 줄에 매개 변수를 제공하는 경우 * Conninfo 문자열; 그렇지 않으면 dbname 설정 = 템플릿 설정에 기본값이 있습니다 * 및 기타 모든 연결에 환경 변수 또는 기본값 사용 * 매개 변수. */ if (argc 1) Conninfo = argv [1]; 또 다른 conninfo = "dbname = template1"; / * 데이터베이스에 연결 */ conn = pqconnectdb (conninfo); / * 백엔드 연결이 성공적으로 만들어 졌는지 확인하십시오 */ if (pqstatus (conn)! = connection_ok) fprintf (stderr, "데이터베이스 '%s'에 대한 연결 실패. \ n", pqdb (conn)); fprintf (stderr, "%s", pqerrormessage (conn)); exit_nicely (conn); /* * 여기서 우리의 테스트 사례는 커서를 사용하는 것과 관련이 있습니다. * 거래 블록 내부. 우리는 모든 일을 할 수 있습니다 * "PG_DATABASE에서 선택 *"의 단일 pqExec ()이지만 그게도 마찬가지입니다. * 좋은 모범을 보이기위한 사소한. */ / * 거래 블록 시작 */ RES = PQEXEC (Conn, "시작"); if (pqresultstatus (res)! = pgres_command_ok) fprintf (stderr, "시작 명령 실패 : %s", pqerrormessage (conn)); PQCLEAR (RES); exit_nicely (conn); /* * pqclear pgresult가 더 이상 피할 필요가 없을 때마다 * 메모리 누출 */ PQCLEAR (RES); /* * 데이터베이스의 시스템 카탈로그 인 PG_DATABASE의 행을 가져 오기 */ res = pqexec (conn, "pg_database에서 select *에서 myportal cursor를 선언합니다"); 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 (conn); 반환 0;
예 27-2.libpq와이즈 토토 프로그램 2
/* * testlibpq2.c * 비동기식 알림 인터페이스 테스트 * *이 프로그램을 시작한 다음 다른 창의 PSQL에서 * TBL2 알림; *이 프로그램을 종료하려면 4 번 반복하십시오. * * 또는 공상을 원한다면 이것을 시도하십시오. * 다음 명령으로 데이터베이스를 채 웁니다 * (src/test/examples/testlibpq2.sql에 제공됨) : * * 테이블 TBL1 (I int4)을 만듭니다. * * 테이블 생성 tbl2 (i int4); * * tbl1에 삽입 된대로 규칙 R1을 만듭니다. * (tbl2 값 (new.i)에 삽입; TBL2 알림); * * 그리고 이것을 네 번하십시오 : * * TBL1 값 (10)에 삽입; */ #include <stdio.h #include <stdlib.h #include <string.h #include <errno.h #include <sys/time.h #include "libpq-fe.h" 정적 무효 exit_nicely (pgconn *conn) pqfinish (conn); 출구 (1); int 메인 (Int Argc, char ** argv) Const Char *Conninfo; pgconn *conn; pgresult *res; pgnotify *알림; int nnotifies; /* * 사용자가 명령 줄에 매개 변수를 제공하는 경우 * Conninfo 문자열; 그렇지 않으면 dbname 설정 = 템플릿 설정에 기본값이 있습니다 * 및 기타 모든 연결에 환경 변수 또는 기본값 사용 * 매개 변수. */ if (argc 1) Conninfo = argv [1]; 또 다른 conninfo = "dbname = template1"; / * 데이터베이스에 연결 */ conn = pqconnectdb (conninfo); / * 백엔드 연결이 성공적으로 만들어 졌는지 확인하십시오 */ if (pqstatus (conn)! = connection_ok) fprintf (stderr, "데이터베이스 '%s'에 대한 연결 실패. \ n", pqdb (conn)); fprintf (stderr, "%s", pqerrormessage (conn)); exit_nicely (conn); /* * 규칙 알림에서 알림을 활성화하려면 청취 명령을 발행하십시오. */ res = pqexec (conn, "청취 tbl2"); if (pqresultstatus (res)! = pgres_command_ok) fprintf (stderr, "청취 명령 실패 : %s", pqerrormessage (conn)); PQCLEAR (RES); exit_nicely (conn); /* * pqclear pgresult가 더 이상 피할 필요가 없을 때마다 * 메모리 누출 */ PQCLEAR (RES); /* 4 개의 알림이 접수 된 후 종료하십시오. */ nnotifies = 0; whind (nnotifies <4) /* * 연결에 무언가가 일어날 때까지 잠을 자십시오. 우리는 select (2)를 사용합니다. * 입력을 기다리려면 poll () 또는 이와 유사하게 사용할 수도 있습니다. * 시설. */ int 양말; fd_set input_mask; 양말 = pqsocket (conn); if (sock <0) 부서지다; / * 발생하지 않아야합니다 */ fd_zero (& input_mask); FD_SET (SOOD, & Input_mask); if (select (sock + 1, & input_mask, null, null, null) <0) fprintf (stderr, "select () 실패 : %s \ n", strerror (errno)); exit_nicely (conn); / * 이제 입력을 확인하십시오 */ pqconsumeInput (conn); while ((notify = pqnotifies (conn))! = null) fprintf (stderr, "Backend Pid %d \ n에서 수신 된 ' %s'의 Async 알림", notify- relname, notify- be_pid); PQFREEMEM (알림); notifies ++; fprintf (stderr, "done. \ n"); / * 데이터베이스 연결을 닫고 정리 */ pqfinish (conn); 반환 0;
예 27-3.libpq와이즈 토토 프로그램 3
/* * testlibpq3.c * 외부 매개 변수 및 이진 I/O를 테스트하십시오. * *이 실행하기 전에 다음 명령으로 데이터베이스를 채우십시오. * (src/test/examples/testlibpq3.sql에 제공됨) : * * 테이블 테스트 1 (i int4, t 텍스트, b 바이 테아)을 작성합니다. * * test1 값 (1, 'Joe' 'place', '\\ 000 \\ 001 \\ 002 \\ 003 \\ 004'에 삽입); * test1 값 (2, 'ho there', '\\ 004 \\ 003 \\ 002 \\ 001 \\ 000'에 삽입); * * 예상 출력은 다음과 같습니다. * * 튜플 0 : 얻었습니다 * i = (4 바이트) 1 * t = (11 바이트) 'Joe's Place ' * b = (5 바이트) \ 000 \ 001 \ 002 \ 003 \ 004 * */ #include <stdio.h #include <stdlib.h #include <string.h #include <sys/type.h #include "libpq-fe.h" / * ntohl/htonl의 경우 */ #include <netinet/in.h #include <arpa/inet.h 정적 무효 exit_nicely (pgconn *conn) pqfinish (conn); 출구 (1); int 메인 (Int Argc, char ** argv) Const Char *Conninfo; pgconn *conn; pgresult *res; const char *paramvalues [1]; INT I, J; int i_fnum, t_fnum, b_fnum; /* * 사용자가 명령 줄에 매개 변수를 제공하는 경우 * Conninfo 문자열; 그렇지 않으면 dbname 설정 = 템플릿 설정에 기본값이 있습니다 * 및 기타 모든 연결에 환경 변수 또는 기본값 사용 * 매개 변수. */ if (argc 1) Conninfo = argv [1]; 또 다른 conninfo = "dbname = template1"; / * 데이터베이스에 연결 */ conn = pqconnectdb (conninfo); / * 백엔드 연결이 성공적으로 만들어 졌는지 확인하십시오 */ if (pqstatus (conn)! = connection_ok) fprintf (stderr, "데이터베이스 '%s'에 대한 연결 실패. \ n", pqdb (conn)); fprintf (stderr, "%s", pqerrormessage (conn)); exit_nicely (conn); /* *이 프로그램의 요점은 pqexecparams ()의 사용을 설명하는 것입니다. * 외부 매개 변수 및 이진 전송 * 결과. 외부 매개 변수를 사용하면 많은 것을 피할 수 있습니다. * 인용 및 탈출에 대한 지루한 멍청이. 우리가 어떻게 주목하십시오 * 견적 표시로 특별한 일을 할 필요가 없습니다. * 매개 변수 값. */ / * 여기에 우리의 외부 매개 변수 값이 있습니다 */ paramvalues [0] = "Joe 's Place"; res = pqexecparams (conn, "test1에서 * 선택 * t = $ 1", 1, / * 하나의 매개 변수 * / null, / * 백엔드가 매개 변수 유형을 추론하자 * / 매개 변수, null, / * 텍스트 이후 매개 변수 길이가 필요하지 않습니다 * / null, / * 모든 텍스트 매개 변수에 대한 기본값 * / 1); / * 이진 결과 요청 */ if (pqresultstatus (res)! = pgres_tuples_ok) fprintf (stderr, "select 실패 : %s", pqerrormessage (conn)); PQCLEAR (RES); exit_nicely (conn); / * 결과의 필드 순서에 대한 가정을 피하려면 pqfnumber를 사용하십시오 */ i_fnum = pqfnumber (res, "i"); t_fnum = pqfnumber (res, "t"); b_fnum = pqfnumber (res, "b"); for (i = 0; i <pqntuples (res); i ++) char *iptr; char *tptr; char *bptr; int Blen; 친밀한 Ival; / * 필드 값을 얻습니다 (가능성은 무시합니다!) */ iptr = pqgetValue (res, i, i_fnum); tptr = pqgetValue (res, i, t_fnum); bptr = pqgetValue (res, i, b_fnum); /* * INT4의 이진 표현은 네트워크 바이트 순서입니다. * 우리는 로컬 바이트 순서를 더 잘 강요 할 것입니다. */ ival = ntohl ( *((uint32_t *) iptr)); /* * 텍스트의 이진 표현은 텍스트, 그리고 그 이후로 * libpq는 제로 바이트를 추가하기에 충분히 좋았습니다. * C 문자열처럼 괜찮습니다. * * Bytea의 이진 표현은 수많은 바이트입니다. * 내장 널을 포함 할 수 있으므로주의를 기울여야합니다. * 필드 길이. */ blen = pqgetlength (res, i, b_fnum); printf ( "튜플 %d : got \ 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 <blen; j ++) printf ( "\\%03o", bptr [j]); printf ( "\ n \ n"); PQCLEAR (RES); / * 데이터베이스 연결을 닫고 정리 */ pqfinish (conn); 반환 0;