PQconnectdb

libpqC言語からPostgreSQLのDBに接続する。
接続には、PQconnectdbを使う。

https://www.postgresql.jp/document/8.4/html/libpq-connect.html
postgreSQL

まず、インストール。

[bg1@localhost ~]$ su
パスワード:
[root@localhost bg1]# yum install postgresql-devel
Fedora Modular 31 - x86_64                       11 kB/s | 6.4 kB     00:00    
Fedora Modular 31 - x86_64 - Updates             16 kB/s | 5.4 kB     00:00    
Fedora 31 - x86_64 - Updates                    9.7 kB/s | 5.5 kB     00:00    
Fedora 31 - x86_64 - Updates                    541 kB/s | 2.6 MB     00:04    
Fedora 31 - x86_64                               11 kB/s | 6.5 kB     00:00    
依存関係が解決しました。
================================================================================
 Package             Architecture   Version               Repository       Size
================================================================================
インストール:
 libpq-devel         x86_64         12.2-1.fc31           updates          98 k

トランザクションの概要
================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 98 k
インストール済みのサイズ: 336 k
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
libpq-devel-12.2-1.fc31.x86_64.rpm              136 kB/s |  98 kB     00:00    
--------------------------------------------------------------------------------
合計                                             62 kB/s |  98 kB     00:01    
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                        1/1
  インストール中   : libpq-devel-12.2-1.fc31.x86_64                         1/1
  scriptletの実行中: libpq-devel-12.2-1.fc31.x86_64                         1/1
  検証             : libpq-devel-12.2-1.fc31.x86_64                         1/1

インストール済み:
  libpq-devel-12.2-1.fc31.x86_64                                                

完了しました!
[root@localhost bg1]#

意外とlibpq-develが入ってなかった。

PQconnectdbの接続だけ。
ソースコードはこれでいいんだけど、今の状態だと、Ident認証なので、bg1からtestuser1の持つtestuser1dbにアクセスできない。
(testuser1dbに接続できるのはtestuser1ロールであり、Linuxユーザのtestuser1でログインしていないといけない。)
そこで、

PostgreSQLの設定 - 初めてのVPS構築

[root@localhost PQconnectdb]# cd /var/lib/pgsql/data/
[root@localhost data]# vi pg_hba.conf

pg_hba.confを開いて、

修正前
修正前

修正前は、identとある部分を、

修正後
修正後

passwordに変更する。
(md5にするとか、USERとかDATABSEとかいろいろいじったけど、セキュリティはともかく、この方法でしか上手くいかなかった。)

あと、Linuxユーザのtestuser1にパスワードをセットしていたけど、PostgreSQLのロールのtesuser1にはパスワード設定していなかった気がするので、psqlで、

postgres=# ALTER USER testuser1 WITH PASSWORD <パスワード>;

これもやっておかないとたぶん接続できないのでは。

[root@localhost data]# psql -U testuser1 -h localhost -d testuser1db
psql: FATAL:  ユーザ"testuser1"のIdent認証に失敗しました
[root@localhost data]# cd /var/lib/pgsql/data/
[root@localhost data]# vi pg_hba.conf
[root@localhost data]# service postgresql restart
Redirecting to /bin/systemctl restart postgresql.service
[root@localhost data]# psql -U testuser1 -h localhost -d testuser1db
ユーザ testuser1 のパスワード:
psql (11.7)
"help" でヘルプを表示します。

testuser1db=> exit
[root@localhost data]#

このように、rootからtestuser1でのtestuser1db接続は出来ないはずだが、
先程のpg_hba.conf編集の後は、接続できる。
bg1ユーザで、C言語プログラムからも接続できるはず。

[bg1@localhost PQconnectdb]$ vi main.c
[bg1@localhost PQconnectdb]$ gcc main.c -o main -lpq
[bg1@localhost PQconnectdb]$ ./main
OK
[bg1@localhost PQconnectdb]$

接続できた。
いろいろ調べたけど、結構ハマった・・・。
ちゃんとアクセス制限はしないといけないけど、今回はとりあえずこれで・・・。

Sample/libpq/PQconnectdb/PQconnectdb/src/PQconnectdb at master · bg1bgst333/Sample · GitHub