LoginSignup
0
0

More than 1 year has passed since last update.

centos7からunixODBCを介してFirebirdに接続するまでの話

Posted at

備忘録として

CentOS7+Apache2.4+php5.6っていう指定・・・もう古い

CentOS7インストール

ググればある!から省く

Apache2.4インストール

これもググれ!

PHP5.6インストール

こちらはPHPを切り替えたい要望なので、5.4~8.1までPHP-FPMで動作するよう実装

//Remiレポジトリをインストール
# yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum install yum-utils
# yum-config-manager --enable remi

//php54、55、56、73、74、80、81をインストール
# for v in 54 55 56 73 74 80 81; do yum -y install php$v php$v-php-{gd,xml,mbstring,mysqlnd,embedded} ; done
# for v in 54 55 ; do yum -y install php$v-php-pecl-{apc,memcached} ; done
# for v in 56 73 74 80 81; do yum -y install php$v-php-{opcache,pecl-apcu,pecl-memcached} ; done

//php-fpmをインストール
# for v in 54 55 56 73 74 80 81; do yum -y install php$v-php-fpm ; done
# for v in 54 55 56 ; do sed -i '/pm = /s/dynamic/ondemand/' /opt/remi/php$v/root/etc/php-fpm.d/www.conf ; done
# for v in 73 74 80 81; do sed -i '/pm = /s/dynamic/ondemand/' /etc/opt/remi/php$v/php-fpm.d/www.conf ; done
# for v in 54 55 56 ; do sed -i "s/9000/90$v/" /opt/remi/php$v/root/etc/php-fpm.d/www.conf ; done
# for v in 73 74 80 81; do sed -i "s/9000/90$v/" /etc/opt/remi/php$v/php-fpm.d/www.conf ; done

//Apacheのバーチャルホストにした
# mkdir /home/ユーザー名/public_html/
# mkdir /home/ユーザー名/public_html/logs

//ディレクトリパス=/home/ユーザー名/public_html/
# cat /etc/httpd/conf.d/ユーザー名.conf
<VirtualHost *:80>
    ServerName ドメイン名
    DocumentRoot /home/ユーザー名/public_html/
    ErrorLog /home/ユーザー名/public_html/logs/php56-error.log
    CustomLog /home/ユーザー名/public_html/logs/php56-access.log combined
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9056"
    </FilesMatch>
</VirtualHost>

//PHP-FPMテイクオフ
# for v in 54 55 56 73 74 80 ; do systemctl start php$v-php-fpm ; systemctl enable php$v-php-fpm ; done

Firebird Driverを入れる

PHP7以上ならpdo_firebirdっていうモジュールを入れれば済む話
しかし、PHP5.6で動作させるにはライブラリがないので、ODBC経由で接続させなきゃいかん

まずは、Firebirdドライバーを入れる
ググれば楽勝モードだったのに、これが一番苦労した

ドライバーのダウンロード

http://www.firebirdsql.org/en/odbc-driver/

ODBC ドライバー 最新バージョン2.0.5のLinux AMD64 Libraryをダウンロード
ダウンロードリンクじゃなくて1画面前置きされたからwgetできない・・・面倒くさい

OdbcFb-LIB-2.0.5.156.amd64.gz

とりあえずこれを解凍解凍解凍…で、現れる libOdbcFb.so を/usr/lib/あたりにぶち込む

# mv OdbcFb-LIB-2.0.5.156/libOdbcFb.so /usr/lib/
# chmod 0755 /usr/lib/libOdbcFb.so

unixODBCをインストール

こちらは難しくないこれからが地獄

# yum -y install unixODBC unixODBC-devel

// odbcinst.iniの編集
// 末行に以下を追加
[Firebird]
Description=Firebird/InterBase(r) driver
Driver=/usr/lib/libOdbcFb.so
UsageCount=1

エラーのはじまりと対処

isqlで接続チェック!

# isql Firebird SYSDBA MASTERKEY -v
[01000][unixODBC][Driver Manager]Can't open lib '/usr/lib/libOdbcFb.so' : file not found
[ISQL]ERROR: Could not SQLConnect

なんかエラー吐いた・・・ファイルは存在するのにnot foundってちょっと何言ってるかわかんない

// ちょっとどちらを参照してるかldd コマンドでチェック
# ldd /usr/lib/libOdbcFb.so
        linux-vdso.so.1 =>  (0x00007ffdd66dd000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fef99630000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fef9942c000)
        libodbcinst.so.1 => not found
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fef98f12000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fef98c10000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fef989fa000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fef9862c000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007fef98429000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fef99b82000)
        libltdl.so.7 => /lib64/libltdl.so.7 (0x00007fef9821f000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fef98003000)

あれ?libodbcinst.so.1ってとこだけ「not found」されてる
ls で探してみるとない?

# find / -name libodbcinst.so.1
//・・・無反応
//ディレクトリを見に行く!
# ls /usr/lib64/ | grep libodbcinst
libodbcinst.so
libodbcinst.so.2
libodbcinst.so.2.0.0

おや?libodbcinst.so.1だけがないやん!!
ググってみると、Firebirdのドライバからは.so.1を見に行ってまっせってこと・・・
しょうがないので、シンボリックリンクで代用でもしてみる!

# ln -s /usr/lib64/libodbcinst.so.2.0.0 /usr/lib64/libodbcinst.so.1

どないや?ってことで、もう一度isqlを試す!

# isql Firebird sysdba masterkey -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

やったー♪オーケーじゃん?終わりーーーお疲れっしたーあざっしたー
って思って、SQL文叩いてテスト

SQL>select b.RDB$FIELD_NAME FIELD_NAME, d.RDB$TYPE_NAME TYPE_NAME, c.RDB$FIELD_LENGTH FIELD_LENGTH, b.RDB$NULL_FLAG NULL_FLAG, case when (select y.RDB$CONSTRAINT_TYPE from rdb$relation_constraints y inner join rdb$index_segments z on y.RDB$INDEX_NAME=z.RDB$INDEX_NAME where z.RDB$FIELD_NAME = b.RDB$FIELD_NAME and y.RDB$RELATION_NAME=b.RDB$RELATION_NAME) LIKE 'PRIMARY%' then 1 else 0 end PRIMARY_KEY from RDB$RELATION_FIELDS b inner join RDB$FIELDS c on b.RDB$FIELD_SOURCE=c.RDB$FIELD_NAME inner join rdb$types d on c.RDB$FIELD_TYPE=d.RDB$TYPE and d.RDB$FIELD_NAME='RDB$FIELD_TYPE' where b.RDB$RELATION_NAME = 'テーブル名' order by b.RDB$FIELD_POSITION;
+--------------------------------+--------------------------------+-------------+----------+------------+
| FIELD_NAME                     | TYPE_NAME                      | FIELD_LENGTH| NULL_FLAG| PRIMARY_KEY|
+--------------------------------+--------------------------------+-------------+----------+------------+
| フィールド1                    | VARYING                        | 1           |          | 0          |
| フィールド2                    | VARYING                        | 1           |          | 0          |
+--------------------------------+--------------------------------+-------------+----------+------------+
SQLRowCount returns -4974962741
2 rows fetched
SQL>

(。´・ω・)ん? SQLRowCount returns -4974962741 ・・・?
2行しかないのに何の値?おかしくない?ここも「2」で終わるはずなんに・・・

何度やってもどのテーブルをSELECTしても同じ・・・
これ、やっぱりシンボリックリンクなんて騙してやってるから狂ってる?

ググってもこんなところを探す日本人はおらず、こんな面倒くさいことをやる人類もいない
やったけど情報を晒していないかな?

色々ググって、読めない英語頑張って、このURLにたどり着く・・・約6時間(むしろ遅くね?)

https://www.firebirdnews.org/howto-install-firebird-odbc-driver-for-unixodbc-from-source/

最新のソースからmakefileすればどうにかなるかな?

# tar -zxvf OdbcJdbc-src-2.0.5.156.tar.gz
# cd OdbcJdbc-src-2.0.5.156/OdbcJdbc/Builds/Gcc.lin
# make -f makefile.linux
../makefile.environ:6: ARCH is x86_64
../makefile.environ:21: ODBCMANAGER is unixODBC in /usr/lib64
../makefile.environ:50: FBINCDIR is /usr/include
../makefile.environ:56: FBLIBDIR is /usr/lib64
g++ -w -D_REENTRANT -D_PTHREADS -DEXTERNAL -DunixODBC -I/usr/include -I/usr/include -I/include -I/usr/include -fPIC -m64 -DNDEBUG -c ../../IscDbc/Attachment.cpp -o Release_x86_64/obj/Attachment.o
make: g++: コマンドが見つかりませんでした
//ここでつまずく
//g++はgcc-c++をインストールせよってググった♪
# yum -y install grep gcc-c++

//これでもう一回メイクユアハッピー
# make -f makefile.linux
//エラーなく終了・・・completeさえでなかったから不安

# cd Release_x86_64
# cp libOdbcFb.so /usr/lib/libOdbcFb.so

既存のlibOdbcFb.soのバックアップとるの忘れたと思ったけど、もう一回ダウンロードすればいいので先に進む

先ほどのlddコマンドで参照先を確認

# ldd /usr/lib/libOdbcFb.so
        linux-vdso.so.1 =>  (0x00007ffd02338000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f85a61f5000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f85a5ff1000)
        libodbcinst.so.2 => /lib64/libodbcinst.so.2 (0x00007f85a5ddf000)
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f85a5ad7000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f85a57d5000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f85a55bf000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f85a51f1000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007f85a4fee000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f85a6791000)
        libltdl.so.7 => /lib64/libltdl.so.7 (0x00007f85a4de4000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f85a4bc8000)

お?さっきのlibodbcinst.so.1がlibodbcinst.so.2になっとる!
シンボリックリンク作らないでも良いってことは・・・

SQL>select b.RDB$FIELD_NAME FIELD_NAME, d.RDB$TYPE_NAME TYPE_NAME, c.RDB$FIELD_LENGTH FIELD_LENGTH, b.RDB$NULL_FLAG NULL_FLAG, case when (select y.RDB$CONSTRAINT_TYPE from rdb$relation_constraints y inner join rdb$index_segments z on y.RDB$INDEX_NAME=z.RDB$INDEX_NAME where z.RDB$FIELD_NAME = b.RDB$FIELD_NAME and y.RDB$RELATION_NAME=b.RDB$RELATION_NAME) LIKE 'PRIMARY%' then 1 else 0 end PRIMARY_KEY from RDB$RELATION_FIELDS b inner join RDB$FIELDS c on b.RDB$FIELD_SOURCE=c.RDB$FIELD_NAME inner join rdb$types d on c.RDB$FIELD_TYPE=d.RDB$TYPE and d.RDB$FIELD_NAME='RDB$FIELD_TYPE' where b.RDB$RELATION_NAME = 'テーブル名' order by b.RDB$FIELD_POSITION;
+--------------------------------+--------------------------------+-------------+----------+------------+
| FIELD_NAME                     | TYPE_NAME                      | FIELD_LENGTH| NULL_FLAG| PRIMARY_KEY|
+--------------------------------+--------------------------------+-------------+----------+------------+
| フィールド1                    | VARYING                        | 1           |          | 0          |
| フィールド2                    | VARYING                        | 1           |          | 0          |
+--------------------------------+--------------------------------+-------------+----------+------------+
SQLRowCount returns 2
2 rows fetched
SQL>

やったー!なんとかなっとる=♪

ブラウザからも問題なく接続できてめでたしめでたし

まとめ

古いOSとかPHPは新しいので攻めようね♪

今回はお客様のフレームワークが古いために止む無くの決断トライでした。

0
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
0
0