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

<!-- wp:paragraph -->
<p class="">備忘録として</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">CentOS7＋Apache2.4＋php5.6っていう指定・・・もう古い</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="">CentOS7インストール</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p class="">ググればある！から省く</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="">Apache2.4インストール</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p class="">これもググれ！</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="">PHP5.6インストール</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p class="">こちらはPHPを切り替えたい要望なので、5.4～8.1までPHP-FPMで動作するよう実装</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class=""></p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black","textColor":"white"} -->
<pre class="wp-block-code has-white-color has-black-background-color has-text-color has-background"><code><span class="deb-pre--txt-clr white">//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
&lt;VirtualHost *:80&gt;
    ServerName ドメイン名
    DocumentRoot /home/ユーザー名/public_html/
    ErrorLog /home/ユーザー名/public_html/logs/php56-error.log
    CustomLog /home/ユーザー名/public_html/logs/php56-access.log combined
    &lt;FilesMatch \.php$&gt;
        SetHandler "proxy:fcgi://127.0.0.1:9056"
    &lt;/FilesMatch&gt;
&lt;/VirtualHost&gt;

//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
</span>
</code></pre>
<!-- /wp:code -->

<!-- wp:heading -->
<h2 class="">Firebird Driverを入れる</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p class="">PHP7以上ならpdo_firebirdっていうモジュールを入れれば済む話<br>しかし、PHP5.6で動作させるにはライブラリがないので、ODBC経由で接続させなきゃいかん</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">まずは、Firebirdドライバーを入れる<br>ググれば楽勝モードだったのに、これが一番苦労した</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3 class="">ドライバーのダウンロード</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p class=""><a href="http://www.firebirdsql.org/en/odbc-driver/" target="_blank" rel="noreferrer noopener">http://www.firebirdsql.org/en/odbc-driver/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">ODBC ドライバー　最新バージョン2.0.5のLinux AMD64 Libraryをダウンロード<br>ダウンロードリンクじゃなくて1画面前置きされたからwgetできない・・・面倒くさい</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class=""><a rel="noreferrer noopener" href="https://sourceforge.net/projects/firebird/files/firebird-ODBC-driver/2.0.5-Release/OdbcFb-LIB-2.0.5.156.amd64.gz/download" target="_blank">OdbcFb-LIB-2.0.5.156.amd64.gz</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">とりあえずこれを解凍解凍解凍…で、現れる<strong> libOdbcFb.so</strong> を/usr/lib/あたりにぶち込む</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"white"} -->
<pre class="wp-block-code has-white-background-color has-background"><code># mv OdbcFb-LIB-2.0.5.156/libOdbcFb.so /usr/lib/
# chmod 0755 /usr/lib/libOdbcFb.so</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="">unixODBCをインストール</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p class="">こちらは難しくないこれからが地獄</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black","textColor":"white"} -->
<pre class="wp-block-code has-white-color has-black-background-color has-text-color has-background"><code><span class="deb-pre--txt-clr white"># yum -y install unixODBC unixODBC-devel

// odbcinst.iniの編集
//　末行に以下を追加
&#91;Firebird]
Description=Firebird/InterBase(r) driver
Driver=/usr/lib/libOdbcFb.so
UsageCount=1</span></code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":3} -->
<h3 class="">エラーのはじまりと対処</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p class="">isqlで接続チェック！</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black"} -->
<pre class="wp-block-code has-black-background-color has-background"><code><span class="deb-pre--txt-clr white"># isql Firebird SYSDBA MASTERKEY -v
&#91;01000]&#91;unixODBC]&#91;Driver Manager]Can't open lib '/usr/lib/libOdbcFb.so' : file not found
&#91;ISQL]ERROR: Could not SQLConnect</span></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p class="">なんかエラー吐いた・・・ファイルは存在するのにnot foundってちょっと何言ってるかわかんない</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black"} -->
<pre class="wp-block-code has-black-background-color has-background"><code><span class="deb-pre--txt-clr white">// ちょっとどちらを参照してるかldd コマンドでチェック
# ldd /usr/lib/libOdbcFb.so
        linux-vdso.so.1 =&gt;  (0x00007ffdd66dd000)
        libcrypt.so.1 =&gt; /lib64/libcrypt.so.1 (0x00007fef99630000)
        libdl.so.2 =&gt; /lib64/libdl.so.2 (0x00007fef9942c000)
        libodbcinst.so.1 =&gt; not found
        libstdc++.so.6 =&gt; /lib64/libstdc++.so.6 (0x00007fef98f12000)
        libm.so.6 =&gt; /lib64/libm.so.6 (0x00007fef98c10000)
        libgcc_s.so.1 =&gt; /lib64/libgcc_s.so.1 (0x00007fef989fa000)
        libc.so.6 =&gt; /lib64/libc.so.6 (0x00007fef9862c000)
        libfreebl3.so =&gt; /lib64/libfreebl3.so (0x00007fef98429000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fef99b82000)
        libltdl.so.7 =&gt; /lib64/libltdl.so.7 (0x00007fef9821f000)
        libpthread.so.0 =&gt; /lib64/libpthread.so.0 (0x00007fef98003000)</span></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p class="">あれ？<strong>libodbcinst.so.1</strong>ってとこだけ「<strong>not found</strong>」されてる<br>ls で探してみるとない？</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black"} -->
<pre class="wp-block-code has-black-background-color has-background"><code><span class="deb-pre--txt-clr white"># find / -name libodbcinst.so.1
//・・・無反応
//ディレクトリを見に行く！
# ls /usr/lib64/ | grep libodbcinst
libodbcinst.so
libodbcinst.so.2
libodbcinst.so.2.0.0</span></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p class="">おや？libodbcinst.so.1だけがないやん！！<br>ググってみると、Firebirdのドライバからは.so.1を見に行ってまっせってこと・・・<br>しょうがないので、シンボリックリンクで代用でもしてみる！</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black"} -->
<pre class="wp-block-code has-black-background-color has-background"><code><span class="deb-pre--txt-clr white"># ln -s /usr/lib64/libodbcinst.so.2.0.0 /usr/lib64/libodbcinst.so.1</span></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p class="">どないや？ってことで、もう一度isqlを試す！</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black"} -->
<pre class="wp-block-code has-black-background-color has-background"><code><span class="deb-pre--txt-clr white"># isql Firebird sysdba masterkey -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help &#91;tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL&gt;</span></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p class="">やったー♪オーケーじゃん？終わりーーーお疲れっしたーあざっしたー<br>って思って、SQL文叩いてテスト</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black"} -->
<pre class="wp-block-code has-black-background-color has-background"><code><span class="deb-pre--txt-clr white">SQL&gt;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|
+--------------------------------+--------------------------------+-------------+----------+------------+
| フィールド１                    | VARYING                        | 1           |          | 0          |
| フィールド２                    | VARYING                        | 1           |          | 0          |
+--------------------------------+--------------------------------+-------------+----------+------------+
SQLRowCount returns -4974962741
2 rows fetched
SQL&gt;</span></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p class="">(。´・ω・)ん?　SQLRowCount returns -4974962741 ・・・？<br>2行しかないのに何の値？おかしくない？ここも「2」で終わるはずなんに・・・</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">何度やってもどのテーブルをSELECTしても同じ・・・<br>これ、やっぱりシンボリックリンクなんて騙してやってるから狂ってる？</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">ググってもこんなところを探す日本人はおらず、こんな面倒くさいことをやる人類もいない<br>やったけど情報を晒していないかな？</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">色々ググって、読めない英語頑張って、このURLにたどり着く・・・約6時間(むしろ遅くね？)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class=""><a href="https://www.firebirdnews.org/howto-install-firebird-odbc-driver-for-unixodbc-from-source/" target="_blank" rel="noreferrer noopener">https://www.firebirdnews.org/howto-install-firebird-odbc-driver-for-unixodbc-from-source/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">最新のソースからmakefileすればどうにかなるかな？</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black"} -->
<pre class="wp-block-code has-black-background-color has-background"><code><span class="deb-pre--txt-clr white"># 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</span></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p class="">既存のlibOdbcFb.soのバックアップとるの忘れたと思ったけど、もう一回ダウンロードすればいいので先に進む</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">先ほどのlddコマンドで参照先を確認</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black"} -->
<pre class="wp-block-code has-black-background-color has-background"><code><span class="deb-pre--txt-clr white"># ldd /usr/lib/libOdbcFb.so
        linux-vdso.so.1 =&gt;  (0x00007ffd02338000)
        libcrypt.so.1 =&gt; /lib64/libcrypt.so.1 (0x00007f85a61f5000)
        libdl.so.2 =&gt; /lib64/libdl.so.2 (0x00007f85a5ff1000)
        libodbcinst.so.2 =&gt; /lib64/libodbcinst.so.2 (0x00007f85a5ddf000)
        libstdc++.so.6 =&gt; /lib64/libstdc++.so.6 (0x00007f85a5ad7000)
        libm.so.6 =&gt; /lib64/libm.so.6 (0x00007f85a57d5000)
        libgcc_s.so.1 =&gt; /lib64/libgcc_s.so.1 (0x00007f85a55bf000)
        libc.so.6 =&gt; /lib64/libc.so.6 (0x00007f85a51f1000)
        libfreebl3.so =&gt; /lib64/libfreebl3.so (0x00007f85a4fee000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f85a6791000)
        libltdl.so.7 =&gt; /lib64/libltdl.so.7 (0x00007f85a4de4000)
        libpthread.so.0 =&gt; /lib64/libpthread.so.0 (0x00007f85a4bc8000)</span></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p class="">お？さっきのlibodbcinst.so.1がlibodbcinst.so.2になっとる！<br>シンボリックリンク作らないでも良いってことは・・・</p>
<!-- /wp:paragraph -->

<!-- wp:code {"backgroundColor":"black"} -->
<pre class="wp-block-code has-black-background-color has-background"><code><span class="deb-pre--txt-clr white">SQL&gt;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|
+--------------------------------+--------------------------------+-------------+----------+------------+
| フィールド１                    | VARYING                        | 1           |          | 0          |
| フィールド２                    | VARYING                        | 1           |          | 0          |
+--------------------------------+--------------------------------+-------------+----------+------------+
SQLRowCount returns 2
2 rows fetched
SQL&gt;</span></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p class="">やったー！なんとかなっとる＝♪</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">ブラウザからも問題なく接続できてめでたしめでたし</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2 class="">まとめ</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p class="">古いOSとかPHPは新しいので攻めようね♪</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p class="">今回はお客様のフレームワークが古いために止む無くの決断トライでした。</p>
<!-- /wp:paragraph -->