接続
まずlibpqを使用するための環境を整えた.で,接続しないと何にもできないので,libpqを使用してPostgreSQLへ接続する方法を調査してみた.
Debian GNU/Linuxを使用している私は以下をした.
apt-get install libpgsql2 postgresql-dev他の環境ではどうしたらよいのかは知らない.とりあえず以下があればよい(たぶん).
- libpq-fe.h
- 私のマシンでは以下にあった.
/usr/include/postgresql/libpq-fe.h
- libpq.so
- 私のマシンでは以下にあった.
/usr/lib/libpq.so
libpqでPostgreSQLに接続するプログラムでの処理概要は以下となる.
これをコンパイルするには,ヘッダとライブラリの指定が必要である.
- PostgreSQLに接続
- PostgreSQLに要求
- 切断
gcc -I/usr/include/postgresql/ -lpq connect.cこのサンプルは引数にあるDB接続情報を使用してPostgreSQLに接続する.以下は実行結果.
$> ./a.out "host=dbserver user=matsu password=hogefuga dbname=firstdb" conninfo : host=dbserver user=matsu password=hogefuga dbname=firstdb connect success DBname : firstdb DBuser : matsu DBpasswd : hogefuga DBhost : dbserver DBport : 5432 Debug tty : options : PID : 1825 $> ./a.out "host=dbserver user=matsu password=hogefuga" conninfo : host=dbserver user=matsu password=hogefuga connect failed error message : FATAL 1: No pg_hba.conf entry for host 192.168.69.1, user matsu, database matsu $> ./a.out "host=dbserver user=nobody password=hogefuga dbname=firstdb" conninfo : host=dbserver user=nobody password=hogefuga dbname=firstdb connect failed error message : FATAL 1: Password authentication failed for user "nobody" $> ./a.out "host=dbserver user=matsu password=nopass dbname=firstdb" conninfo : host=dbserver user=matsu password=nopass dbname=firstdb connect failed error message : FATAL 1: Password authentication failed for user "matsu"サーバ側ではsyslogなどにログが出力されているので,疑い深い人はそちらも確かめた方がよいかもしれない.たぶんこんな感じで出ている(頁の表示上の都合で,\で改行してある).
Feb 23 15:51:39 dbserver postgres[1825]: [1] DEBUG: \ connection: host=xxx.xxx.xxx.xxx user=matsu database=firstdb Feb 23 15:51:46 dbserver postgres[1826]: [1] FATAL 1: \ No pg_hba.conf entry for host xxx.xxx.xxx.xxx, user matsu, database matsu Feb 23 15:51:55 dbserver postgres[1827]: [1] FATAL 1: \ Password authentication failed for user "nobody" Feb 23 15:52:07 dbserver postgres[1829]: [1] FATAL 1: \ Password authentication failed for user "matsu"
libpqには,いくつかのDB接続関数がある.前節のサンプルでは以下を使用した.
PGconn *PQconnectdb(const char *conninfo)引数は一つのcharへのポインタであり,先述の実行例のようにスペース区切りで
キーワード=値を繋げたものである.主なキーワードは以下である.
- host
- DBサーバ名
- hostaddr
- DBサーバのIPアドレス
- user
- DB接続時のユーザ名
- password
- userに対するパスワード
- dbname
- DB名
ConnStatusType PQstatus(const PGconn *conn)返り値には多くのパターンがあるが,同期接続を行なうPQconnectdbの場合(※)は以下の二種類がある.
- CONNECTION_OK
- 正常
- CONNECTION_BAD
- 異常
※ サーバへの接続要求が(成功,失敗を問わず)完了するまでブロックする.
PGconnには接続状況だけでなく,サーバやユーザ名などの接続情報が格納されている.PGconnの内部は直接参照できないので,取り出したい情報に応じた関数を使用する.以下に上記のサンプルで使用した接続情報取得関数の一覧を示す.
- サーバからのエラーメッセージ
- 以下の関数は,引数で渡す接続においてサーバから最後に取得したDB操作のエラーメッセージを返す.
char *PQerrorMessage(const PGconn* conn);
- 接続ユーザ名
- 以下の関数は,引数で渡す接続でのユーザ名を返す.
char *PQuser(const PGconn *conn)
- 接続パスワード
- 以下の関数は,引数で渡す接続で使用したパスワードを返す.
char *PQpass(const PGconn *conn)
- 接続サーバ名
- 以下の関数は,引数で渡す接続の接続先サーバ名を返す.
char *PQhost(const PGconn *conn)
- 接続ポート
- 以下の関数は,引数で渡す接続の接続ポートを返す.
char *PQport(const PGconn *conn)
- デバッグ用tty
- 以下の関数は,引数で渡す接続の,デバッグ用ttyを返す.
char *PQtty(const PGconn *conn)
- バックエンドオプション
- 以下の関数は,引数で渡す接続の,バックエンドオプションを返す.
char *PQoptions(const PGconn *conn)
- バックエンドのPID
- 以下の関数は,引数で渡す接続の,バックエンドのPIDを返す.
int PQbackendPID(const PGconn *conn);
この値は,サーバ側で調査をする際に有用である.
PostgreSQLに接続したら切断する.これには以下の関数を使用する.
void PQfinish(PGconn *conn)この関数により,引数で渡した接続を切断し,PQconnectDBで確保したPGconnの領域も開放する.

