1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C から ECPG を使って PostgreSQL に接続してみる

Last updated at Posted at 2021-08-14

C から ECPG を使って PostgreSQL に接続するプログラムの作成方法について説明します。

環境は CentOS 7 または 8、PostgreSQL 9.6 以降を対象とし、PostgreSQL に接続できる状態になっていることを前提とします。PostgreSQL のインストールや設定がまだであれば、インストール方法は こちらの記事、ローカルホスト以外からの接続受けつけに必要な設定方法は こちらの記事 を参照してください。

  1. 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 つの数字からなるバージョンから . を取り除いたものとなります。

  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 にはパスワードを指定します。ご自身の環境に合わせて書き替えてください。

  3. プログラムをビルドします。

    $ /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 が生成されれば、プログラムのビルドは成功です。

  4. プログラムを実行します。

    $ ./test_ecpg
    postgres
    template1
    template0
    

    エラーメッセージが出力されず、データベースの一覧が出力されれば、プログラムの実行は成功です。

以上でプログラムの作成は完了です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?