C から ECPG を使って PostgreSQL に接続するプログラムの作成方法について説明します。
環境は CentOS 7 または 8、PostgreSQL 9.6 以降を対象とし、PostgreSQL に接続できる状態になっていることを前提とします。PostgreSQL のインストールや設定がまだであれば、インストール方法は こちらの記事、ローカルホスト以外からの接続受けつけに必要な設定方法は こちらの記事 を参照してください。
-
GCC、PostgreSQL ヘッダファイル・開発ライブラリをインストールします。
CentOS 7 で PostgreSQL 11 以降の場合には、EPEL、SCL リポジトリをインストールします。理由は こちらの記事 を参照してください。
CentOS 7 の場合$ sudo yum install -y epel-release centos-release-scl (省略) Complete!
続いて、GCC、PostgreSQL ヘッダファイル・開発ライブラリをインストールします。
$ sudo yum install -y gcc postgresql13-devel (省略) Complete!
パッケージ名に含まれる
13
は PostgreSQL のバージョンです。ご自身の環境に合わせて書き替えてください。バージョン 9.6 以前は96
のように 2 つの数字からなるバージョンから . を取り除いたものとなります。 -
プログラムを作成します。
プログラムの内容はデータベースの一覧を出力するというものです。エラー処理は原因特定に必要最低限のことしか行っていません。
test_ecpg.pgc#include <stdio.h> #include <stdlib.h> EXEC SQL WHENEVER SQLERROR CALL die(); EXEC SQL WHENEVER NOT FOUND DO BREAK; void die(void) { fprintf(stderr, "%s\n", sqlca.sqlerrm.sqlerrmc); exit(1); } int main(void) { EXEC SQL BEGIN DECLARE SECTION; const char *target = "postgres@localhost:5432"; const char *user = "postgres"; const char *passwd = "password"; char dbname[64]; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT TO :target USER :user USING :passwd; EXEC SQL DECLARE cur CURSOR FOR SELECT datname FROM pg_database; EXEC SQL OPEN cur; while (1) { EXEC SQL FETCH cur INTO :dbname; printf("%s\n", dbname); } EXEC SQL CLOSE cur; EXEC SQL COMMIT; EXEC SQL DISCONNECT ALL; return 0; }
ホスト変数の
target
にはデータベース名@ホスト名:ポート
形式で接続先、user
にはユーザ、passwd
にはパスワードを指定します。ご自身の環境に合わせて書き替えてください。 -
プログラムをビルドします。
$ /usr/pgsql-13/bin/ecpg test_ecpg.pgc $ gcc -Wall -I/usr/pgsql-13/include -L/usr/pgsql-13/lib -lecpg -o test_ecpg test_ecpg.c
-I
、-L
オプションにはそれぞれ PostgreSQL ヘッダファイル、開発ライブラリ格納先のパスを指定します。パスに含まれる13
は PostgreSQL のバージョンです。ご自身の環境に合わせて書き替えてください。エラーメッセージが出力されず、C プログラム
test_ecpg.c
が生成され、そこから実行ファイルtest_ecpg
が生成されれば、プログラムのビルドは成功です。 -
プログラムを実行します。
$ ./test_ecpg postgres template1 template0
エラーメッセージが出力されず、データベースの一覧が出力されれば、プログラムの実行は成功です。
以上でプログラムの作成は完了です。