この前、MySQLにて二重接続を行いましたがそれのpostgreSQL版を作成し今度はフィールド名にて値の取得を行ってみました。ソースは以下の通り、動作確認はFreeBSD6.0です。
今度はstd::mapを使ってMySQL版との共通化を考えよう…。
UNIXとプログラミングの備忘録
この前、MySQLにて二重接続を行いましたがそれのpostgreSQL版を作成し今度はフィールド名にて値の取得を行ってみました。ソースは以下の通り、動作確認はFreeBSD6.0です。
今度はstd::mapを使ってMySQL版との共通化を考えよう…。
MySQLが一段落したので今度はPostgreSQLへ接続してみます。
ソースファイルはこちら(C言語)
pg20060521-1
PostgreSQLとMySQLでは値の取り出し方法が違うみたいですね。C++でクラス化する際には共通のほ方法で利用できるように考慮したほうが良いですね。(DBI使ったほうが早いとか置いといて)
もうひとつ重大な問題がこのソースにはあります。SELECTで*を指定しておいて取り出し時に何番目というやり方で行っていること。つまりテーブルのフィールドに追加変更があった場合にプログラムが動かなくなってしまう危険があります。単にSELECTで*を使わなければ良いのですがそれでも要素名でアクセスできないのは可読性に影響します。
C++版は以上を考慮に入れてMySQL版と移植性の高いものを作ってみます。
ちょっと必要性の問題でひとつのプログラムから同時に2つのDBへ接続するテストを行いました。
ソースはこちら(クラスで使ったほうが楽になるのでC++版のみです。)
mysql_cxx20060520-1
コンパイルした後、実行したらFreeBSDだとライブラリが見つからないとエラー、初期のソースを組んだ後PHPのインストールと設定などで一度reboot掛けていたのでldconfigの効果が消えていたっぽい。
ldconfig -m /usr/local/mysql/lib/mysql
Linuxだと/etc/ld.so.confに書けば済むはず(こっちはreboot掛けたことない)なのに、FreeBSDには該当ファイルなし。findで探したら/usr/compat/linux/etc/ld.so.confに見つかったが編集してreboot掛けても意味なし。/etc/ld.so.confにコピーしてrebootしてもダメ。
結局、.loginに
if ($?LD_LIBRARY_PATH) then
setenv LD_LIBRARY_PATH “${LD_LIBRARY_PATH}:${MYLIB}”
else
setenv LD_LIBRARY_PATH “${MYLIB}”
endif
と追加して解決。
DBクライアントは他のユーザーでも使用するかも知れないから/etc/profileに書いたほうがいいかなー?