/* * testlibpq.c libpq, postgres frontend의 c 버전 테스트 * 도서관. * * */ #include <stdio.h #include "libpq-fe.h" 무효의 exit_nicely (pgconn *conn) pqfinish (conn); 출구 (1); 기본() char *pghost, *pgport, *pgoptions, *pgtty; char *dbname; int nfields; INT I, J; / * 파일 * 디버그; */ pgconn *conn; pgresult *res; /* * 백엔드 연결의 매개 변수를 설정하여 시작합니다. * 매개 변수는 null이면 시스템은 합리적인 사용을 시도합니다. * 환경 변수를 찾거나 실패함으로써 기본값 * 하드 유선 상수 사용 */ pghost = null; / * 백엔드 서버의 호스트 이름 */ pgport = null; / * 백엔드 서버의 포트 */ pgoptions = null; /* 백엔드를 시작하는 특별 옵션 * 서버 */ pgtty = null; / * 백엔드 서버의 TTY 디버깅 */ dbname = "template1"; / * 데이터베이스에 연결 */ 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, Debug); */ / * 거래 블록 시작 */ RES = PQEXEC (Conn, "시작"); if (pqresultstatus (res)! = pgres_command_ok) fprintf (stderr, "시작 명령 실패 \ n"); PQCLEAR (RES); exit_nicely (conn); /* * pqclear pgresult가 더 이상 피할 필요가 없을 때마다 * 메모리 누출 */ PQCLEAR (RES); /* * PG_DATABASE의 인스턴스, 시스템 카탈로그 * 데이터베이스 */ res = pqexec (conn, "pg_database에서 select *에서 mycursor cursor를 선언한다"); if (pqresultstatus (res)! = pgres_command_ok) fprintf (stderr, "cursor 명령 실패 \ n"); PQCLEAR (RES); exit_nicely (conn); PQCLEAR (RES); RES = PQEXEC (Conn, "MyCursor에서 모두 가져 오기"); if (pqresultstatus (res)! = pgres_tuples_ok) fprintf (stderr, "모든 명령은 튜플을 올바르게 반환하지 않았다"); 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 (conn); /* fclose (Debug); */
/* * 비동기 알림 인터페이스의 TestLibPq2.c 테스트 * * 다음과 함께 데이터베이스를 채우십시오. * * 테이블 TBL1 (I int4)을 만듭니다. * * 테이블 생성 tbl2 (i int4); * * tbl1에 삽입 된 rule r1 생성 [tbl2 값에 삽입 * (new.i); 알림 tbl2]; * * 그런 다음 프로그램이 시작된 후이 프로그램을 시작하십시오. * * TBL1 값 (10)에 삽입; * * * */ #include <stdio.h #include "libpq-fe.h" 무효의 exit_nicely (pgconn *conn) pqfinish (conn); 출구 (1); 기본() char *pghost, *pgport, *pgoptions, *pgtty; char *dbname; int nfields; INT I, J; pgconn *conn; 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, "청취 tbl2"); if (pqresultstatus (res)! = pgres_command_ok) fprintf (stderr, "청취 명령 실패 \ n"); PQCLEAR (RES); exit_nicely (conn); /* * pqclear pgresult가 더 이상 피할 필요가 없을 때마다 * 메모리 누출 */ PQCLEAR (RES); 동안 (1) /* * 수표 사이를 조금 기다리십시오. select ()와 대기 * 더 효율적입니다. */ 수면 (1); / * 비동기 백엔드 메시지 수집 */ pqconsumeInput (conn); / * 비동기식 알림 메시지 */ while ((notify = pqnotifies (conn))! = null) fprintf (stderr, "Backend Pid '%d'에서 '%s'를 Async 알림 \ n", notify- relname, notify- be_pid); 무료 (알림); / * 데이터베이스 연결을 닫고 정리 */ pqfinish (conn);
/* * testlibpq3.c libpq, postgres frontend의 c 버전 테스트 * 도서관. 이진 커서 인터페이스를 테스트합니다 * * * * 다음을 수행하여 데이터베이스를 채우십시오. * * 테이블 테스트 1 (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 : got i = (4 바이트) 1, d = (4 바이트) 3.567000, p = (4 * 바이트) 2 포인트 boundbox = (hi = 3.000000/4.000000, lo = * 1.000000,2.000000) 튜플 1 : got i = (4 바이트) 2, d = (4 바이트) * 89.050003, p = (4 바이트) 2 points boundbox = * (HI = 4.000000/3.000000, LO = 2.000000,1.000000) * * */ #include <stdio.h #include "libpq-fe.h" #include "utils/geo-decls.h"/ * 다각형 유형 */ 무효의 exit_nicely (pgconn *conn) pqfinish (conn); 출구 (1); 기본() char *pghost, *pgport, *pgoptions, *pgtty; char *dbname; int nfields; INT I, J; int i_fnum, d_fnum, p_fnum; pgconn *conn; 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, "시작"); if (pqresultstatus (res)! = pgres_command_ok) fprintf (stderr, "시작 명령 실패 \ n"); PQCLEAR (RES); exit_nicely (conn); /* * pqclear pgresult가 더 이상 피할 필요가 없을 때마다 * 메모리 누출 */ PQCLEAR (RES); /* * PG_DATABASE의 인스턴스, 시스템 카탈로그 * 데이터베이스 */ res = pqexec (conn, "select * from test1에 대한 mycursor binary cursor를 선언한다"); if (pqresultstatus (res)! = pgres_command_ok) fprintf (stderr, "cursor 명령 실패 \ n"); PQCLEAR (RES); exit_nicely (conn); PQCLEAR (RES); RES = PQEXEC (Conn, "MyCursor에서 모두 가져 오기"); if (pqresultstatus (res)! = pgres_tuples_ok) fprintf (stderr, "모든 명령은 튜플을 올바르게 반환하지 않았다"); 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 ( "type [ %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 = (다각형 *) malloc (plen + varhdrsz); pval- size = plen; memmove ((char *) 및 pval- npts, pqgetValue (res, i, p_fnum), plen); printf ( "튜플 %d : got \ 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 points \ 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 (conn);