ushidayの日記

主に「IBMi」のメモに・・・

Zend Server CE 5.0 for IBM iのdb2_bind_paramで

Zend Server CE 5.0 for IBM i(PHP 5.3 Ver)で、最初からインスコされているIBM_DB2PECLはバージョン”1.8.4”です。このバージョン”1.8.4”のPECLは、既知のバグがあり、関数、クラス内で「db2_prepare → db2_bind_param → db2_execute」をすると、db2_bind_param関数で割り当てる、変数のスコープがどうもおかしいようで、以下のようなエラーになります。

Warning: db2_execute() [function.db2-execute]: Value Not Bound in hoge.php on line XX
Warning: db2_execute() [function.db2-execute]: Binding Error 3 in 

PECLのサポートサイトより

最新のPECLでは、この既知の問題は解決しているようなので、IBM iのZend Server CEに、2011.09.28現在最新の”1.9.2”を導入しました。
いったんは、IBM i上でビルドを試みましたが、「ibm_db2.so」は出来上がるものの、ファイルのバイト数が明らかに小さく、起動時にエクステンションエラーになってしまいました。結果的にはAIX上でビルドしたエクステンションは、正常通り動作しました。「db2_prepare → db2_bind_param → db2_execute」も問題なく使えます。
もし、バイナリが欲しい方がいたら、このブログにコメント下さい。1.9.2の”ibm_db2.so”を提供します。但し、使用は自己責任で。

ビルドの際に、宣言エラーが抜けている様なので、以下の箇所を追加しました。

-- エラー1
../ibm_db2-1.9.2/ibm_db2.c: In function '_php_db2_connect_helper':
../ibm_db2.c:2109: error: 'conn_handle' has no member named 'c_i5_allow_commit'

-- 対応:「ibm_db2.c」に宣言を追加
   114 long c_i5_allow_commit;

-- エラー2
../ibm_db2-1.9.2/ibm_db2.c: In function '_ibm_db_chaining_flag':
../ibm_db2-1.9.2/ibm_db2.c:6761: error: 'SQL_ATTR_CHAINING_BEGIN' undeclared (first use in this function)

-- 対応:「php_ibm_db2.h」に定数を追加
    302 #ifdef PASE /* i5/OS ease of use turn off/on */
    303     #ifndef SQL_ATTR_CHAINING_BEGIN-
    304         #define SQL_ATTR_CHAINING_BEGIN 2464
    305         #define SQL_ATTR_CHAINING_END 2465
    306         #define SQL_IS_POINTER -4
    307     #endif-
    308 #endif /* PASE */

PECL 1.9.2の確認

とりあえず、この情報が役立つか判らないけど、PECLのサポートに上げておいた。
http://pecl.php.net/bugs/bug.php?id=24382