1. libpq 라이브러리 사용하기
- 애플리케이션에서 libpq를 사용하기 위해서는 libpq에서 제공하는 함수를 정의하기 위해 적절한 헤더파일을 포함해야 하고
이러한 함수들에 대한 코드를 가지고 있는 적절한 라이브러리를 연결해 주어야 한다.
- Linux 기준
- 헤더: 기본값으로 /usr/local/pgsql/include/ 디렉토리의 libpq-fe.h 파일이다.
- 라이브러리 : 기본값으로 /usr/local/pgsql/lib/ 디렉토리에 있다.
-Window 기준
- 헤더 : 기본값으로 C:\Program Files\PostgreSQL\9.2\include 디렉토리의 libpq-fe.h 파일
- 라이브러리 : 기본값으로 C:\Program Files\PostgreSQL\9.2\lib 디렉토리의 libpq.dll
- Linux 기준
- libpq 라이브러리를 사용하여 컴파일 하는 예
gcc -o test test.c -I /usr/local/pgsql/include -L /usr/local/pgsql/lib -lpq
2. 데이터베이스에 연결하기
- PGconn *PQconnectdb( const char *conninfo );
위 함수를 이용하여 데이터베이스에 연결할 수 있다. 위 함수는 데이터베이스에 연결이 되면 데이터베이스 연결에 대한 핸들을
돌려준다. fopen 함수를 이용하여 파일을 열 때 파일핸들을 리턴해 주는것과 거의 동일하다. 돌려받은 연결 핸들은 앞으로 데이
터베이스에 여러 작업을 하는데 사용된다.
- PQconnectdb함수는 연결할 데이터베이스를 지정하는 문자열을 인자로 넘겨받는다. 다음은 연결에 사용할 수 있는 일반적인
옵션을 정리한 것이다.
옵션 | 의미 | 기본값 |
Dbname | 연결할 데이터베이스 이름 | $PGDATABASE |
User | 연결시 사용할 사용자명 | $PGUSER |
Password | 사용자의 비밀번호 | $PGPASSWORD 또는 제공되지 않음 |
Host | 연결할 서버명 | $PGHOST 또는 로컬컴퓨터 |
Hostaddr | 연결할 서버의 IP주소 | $PGHOSTADDR |
port | 서버에 연결할 TCP/IP 포트 | $PGPORT 또는 5432 |
- host 옵션은 연결할 서버의 도메인 네임을 사용하고, hostaddr 옵션은 연결할 서버의 ip를 이용하여 접속할 때 사용한다.
- host나 hostaddr 옵션이 지정되지 않았다면 로컬컴퓨터로 접속한다.
- 옵션값에 공백이 포함되어 있거나 빈 문자열 값을 입력하려면 다음과 같이 작은 따옴표로 그 값을 표시해 준다.
"password = '' user = blue39" ( password를 공백처리 )
- PQconnectdb 함수는 인자로 전달받은 옵션 값을 체크하여 옵션이 지정되지 않았다면 각 옵션에 대응하는 환경변수가 설정
되어 있는지 체크하여 설정되어 있다면 환경변수의 값을 인자로 취한다. 따라서 PQconnectdb 함수를 빈 문자열로 호출한다면
모든 옵션은 환경변수를 통해 제공받는다.
ex)PGconn *pConn = PQconnecdb( "host = chan password = 123456 user = blue39 dbname = test" ); - 연결에 사용할
옵션을 인자로 넘긴다.
ex)PGconn *pConn = PQconnectdb( "" ); - 환경변수를 인자로 사용한다.
ex)PGconn *pConn = NULL;
// Make a connection to the database
pConn = PQconnectdb("user=postgres password=yeob dbname=exportmanager hostaddr=127.0.0.1 port=5432); // 로컬연결
- PQconnectdb 함수가 NULL이 아닌 연결 핸들을 리턴했다고 해서 정상적으로 연결이 되었다는 의미는 아니다. 연결이 정상적으
로 이루어졌는지 체크하기 위해 다음의 함수를 사용한다.
- ConnStatusType PQstatus( const PGconn *conn );
ConnStatusType은 다음 상수를 포함하는 열거형 변수이다.
CONNECTION_OK
CONNECTION_BAD
- 데이터베이스에 연결하고 필요한 작업을 모두 마쳤다면 파일에서와 마찬가지로 데이터베이스 연결 핸들을 종료해 주어야 한다.
이를 위하여 void PQfinish( PGconn *conn); 함수에 데이터베이스 연결 핸들을 넘겨준다.
3. libpq를 이용하여 SQL실행하기
- PGresult * PQexec( PGconn *conn, const char *sql_string );
SQL문을 PQconnectdb()함수를 이용하여 연결한 데이터베이스에서 실행시킨다. 해당 쿼리의 실행 결과값은 결과를 저장하는
PQresult 구조체를 통해 주고 받는다.
ex) PGresult *res = PQexec(conn, "CREATE TABLE employee (Fname char(30), Lname char(30))");
- ExecStatusType PQresultStatus( const PGresult * result );
SQL문의 실행 상태를 알아보기 위해 위 함수를 사용한다. 이 함수는 다음 표와 같은 값을 가지는 상태를 돌려준다.
상태 유형 | 설명 |
PGRES_EMPTY_QUERY | 테이터베이스를 이용할 필요가 없다. 일반적으로 빈 문자열의 결과이다. |
PGRES_COMMAND_OK | 성공. 명령이 데이터를 돌려주지 않는다. |
PGRES_TUPLES_OK | 성공. 질의가 0개 이상의 행들을 돌려준다. |
PGRES_BAD_RESPONSE | 실패. 서버응답을 이해할 수 없다. |
PGRES_NONFATAL_ERROR | 실패. 치명적이지는 않다. 재시도가 가능하다. |
PGRES_FATAL_ERROR | 실패. 치명적 오류가 발생하여 재시도가 불가능하다. |
- const char *PQresultErrorMessage( const PGresult * result );
쿼리 실행 후 오류가 발생하면 PQresultErrorMessage를 호출하여 읽을 수 있는 상세한 오류 메시지를 얻을 수 있다.
- void PQclear( PGresult * result );
연결구조체와 마찬가지로 결과객체를 사용했으면 반드시 자원을 해제해 주어야 한다. 이 과정은 위 함수 PQclear를 통해 이루어
진다. 결과 객체와 연결 객체는 별도로 취급되어서 연결이 해제된다고 결과객체도 같이 해제되는것은 아니니 주의해야한다.
4. 트랜잭션
- 표준 SQL에서와 마찬가지로 libpq에서도 트랜잭션 처리를 지원한다. 간단하게 PQexec함수의 쿼리문에 BEGIN, COMMIT,
ROLLBACK을 포함하는 SQL문을 넘겨 실행하면 된다.
ex) PGresult *res = PQexec(conn, "BEGIN");
5. SQL문으로부터 결과 값 가져오기
- int PQntuples( const PGresult * result );
PQexec함수로 오류없이 SQL문을 실행하였으면 PGRES_TUPLES_OK 상태코드를 리턴받는다. 그리고나서 현재 결과 집합에
몇 개의 행이 존재하는지 알아내기 위하여 PQntuples를 호출한다.
- 위 함수의 리턴 값은 결과 행의 전체 행 수 이므로 결과가 0이 될 수도 있다.
- int PQnfields( const PGresult * result );
특정 튜플(행)의 필드(속성 또는 열)의 개수는 PQnfields를 호출하여 알 수 있다.
- char *PQfname( const Pgresult * result, int index );
결과 필드들은 0부터 시작되는 순서를 가지며, 필드명은 PQfname을 호출하여 알 수 있다.
- int PQsize( const PGresult * result, int index );
필드의 크기는 PQsize를 호출하여 알 수 있다. 고정된 크기의 필드에 대해서는 특정열의 크기를 바이트 단위로 돌려주고 가변
길이 필드라면 -1을 돌려준다.
- char *PQgetvalue( const PGresult * result, int tuple, int field );
일반적으로 모든 데이터는 서버로부터 문자열 형식으로 전달된다. Pqgetvalue함수를 호출하면 데이터를 문자열 형식으로 얻을
수 있다. 튜플(행)과 필드(열)의 번호는 0부터 시작한다.
ex)
for (int i = 0; i < PQntuples(res); i++)
{
cStoringStatusArr[i][j] = PQgetvalue(res, i,j);
cStoringStatusArr[i][j+1] = PQgetvalue(res, i,j+1);
cStoringStatusArr[i][j+2] = PQgetvalue(res, i,j+2);
cStoringStatusArr[i][j+3] = PQgetvalue(res, i,j+3);
cStoringStatusArr[i][j+4] = PQgetvalue(res, i,j+4);
}
- int PQgetlength( PGresult * result, int tuple, int fueld );
결과 문자열의 길이를 알고 싶다면 PQgetlength를 호출한다.
[출처] postgreSQL 8.2에서 libpq를 이용한 C프로그래밍 |작성자 꼼탕구리
'PostgeSQL' 카테고리의 다른 글
[PostgreSQL] Create/Drop/Restore 시 batch-file 만들기(환경변수설정포함) (0) | 2014.05.16 |
---|---|
[PostgreSQL] CTID 단편화하기(?) (0) | 2014.05.13 |
[PostgreSQL] 제약조건, Constraint(NOT NULL, UNIQUE, PRIMARY KEY(기본키), FOREIGN KEY(외래키)) (0) | 2014.03.28 |
[PostgreSQL] 시작날짜 끝날짜 사이 중간값들 구하기 (0) | 2014.03.28 |
[PostgreSQL] interval 활용 (0) | 2014.03.28 |