이 예와 다른 예제는 디렉토리에서 찾을 수 있습니다src/test/examples
소스 코드 분포에서.
예 34.1. libpq예제 프로그램 1
/* * src/test/examples/testlibpq.c * * * testLibpq.c * * Postgresql 프론트 엔드 라이브러리 인 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 = 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); /* 항상 보안 검색 경로를 설정하므로 악의적 인 사용자가 제어 할 수 없습니다. */ res = pqexec (conn, "pg_catalog.set_config ( 'search_path', '', false)를 선택하십시오."); if (pqresultstatus (res)! = pgres_tuples_ok) fprintf (stderr, "set 실패 : %s", pqerrormessage (conn)); PQCLEAR (RES); exit_nicely (conn); /* * 메모리를 피하기 위해 더 이상 필요하지 않을 때마다 pqclear pgresult가 있어야합니다. * 누출 */ PQCLEAR (RES); /* * 여기서 테스트 사례는 커서를 사용하는 것이 포함되며, 여기에는 내부에 있어야합니다. * 거래 블록. 우리는 단일로 모든 일을 할 수있었습니다 * "pg_database에서 선택 *"의 pqexec (), 그러나 그것은 너무 사소한 일입니다. * 좋은 예입니다. */ / * 거래 블록 시작 */ RES = PQEXEC (Conn, "시작"); if (pqresultstatus (res)! = pgres_command_ok) fprintf (stderr, "시작 명령 실패 : %s", pqerrormessage (conn)); PQCLEAR (RES); exit_nicely (conn); 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;
예 34.2. libpq예제 프로그램 2
/* * src/test/examples/testlibpq2.c * * * testlibpq2.c * 비동기식 알림 인터페이스 테스트 * *이 프로그램을 시작한 다음 다른 창의 PSQL에서 * TBL2 알림; *이 프로그램을 종료하려면 4 번 반복하십시오. * * 또는 공상을 원한다면 이것을 시도하십시오. * 다음 명령으로 데이터베이스를 채 웁니다 * (src/test/examples/testlibpq2.sql에 제공됨) : * * 스키마 생성 testlibpq2; * SET SEARCH_PATH = TESTLIBPQ2; * 테이블 TBL1 (I int4)을 만듭니다. * 테이블 생성 tbl2 (i int4); * tbl1에 삽입 된대로 규칙 R1을 만듭니다. * (tbl2 값 (new.i)에 삽입; TBL2 알림); * *이 프로그램을 시작한 다음 PSQL 에서이 작업을 네 번 수행합니다. * * testLibpq2.tbl1 값 (10)에 삽입; */ #ifdef win32 #include <windows.h #endif #include <stdio.h #include <stdlib.h #include <string.h #include <errno.h #include <sys/time.h #include <sys/type.h #ifdef have_sys_select_h #include <sys/select.h #endif #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 = 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); /* 항상 보안 검색 경로를 설정하므로 악의적 인 사용자가 제어 할 수 없습니다. */ res = pqexec (conn, "pg_catalog.set_config ( 'search_path', '', false)를 선택하십시오."); if (pqresultstatus (res)! = pgres_tuples_ok) fprintf (stderr, "set 실패 : %s", pqerrormessage (conn)); PQCLEAR (RES); exit_nicely (conn); /* * 메모리를 피하기 위해 더 이상 필요하지 않을 때마다 pqclear pgresult가 있어야합니다. * 누출 */ PQCLEAR (RES); /* * 규칙 알림에서 알림을 활성화하려면 청취 명령을 발행하십시오. */ res = pqexec (conn, "청취 tbl2"); if (pqresultstatus (res)! = pgres_command_ok) fprintf (stderr, "청취 명령 실패 : %s", pqerrormessage (conn)); PQCLEAR (RES); exit_nicely (conn); 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 ++; pqconsumeInput (conn); fprintf (stderr, "done. \ n"); / * 데이터베이스 연결을 닫고 정리 */ pqfinish (conn); 반환 0;
예 34.3. libpq예제 프로그램 3
/* * src/test/examples/testlibpq3.c * * * testlibpq3.c * 외부 매개 변수 및 이진 I/O를 테스트하십시오. * *이 실행하기 전에 다음 명령으로 데이터베이스를 채우십시오. * (src/test/examples/testlibpq3.sql에 제공됨) : * * 스키마 생성 testlibpq3; * SET SEARCH_PATH = TESTLIBPQ3; * set Standard_Conforming_strings = on; * 테이블 테스트 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 * * 튜플 0 : 얻었습니다 * i = (4 바이트) 2 * t = (8 바이트) 'ho there' * b = (5 바이트) \ 004 \ 003 \ 002 \ 001 \ 000 */ #ifdef win32 #include <windows.h #endif #include <stdio.h #include <stdlib.h #include <stdint.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); /* *이 기능은 이진 형식 페치 인 쿼리 결과를 인쇄합니다. * 위의 주석에서와 같이 정의 된 테이블. 우리는 그것을 나누기 때문에 * main () 함수는 두 번 사용합니다. */ 정적 무효 show_binary_results (pgresult *res) INT I, J; int 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 ++) 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");
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면