Software Engineer and Web Developer's Diary

1年後の自分に向けて

Oracle 9i with CakePHP

CakePHPOracle を使ってアクセスすると以下のようなエラーが発生して困った。

Fatal error: Call to a member function on a non-object in
/...../cake/cake/libs/model/dbo/dbo_adodb.php on line 298

Oracle 9i with CakePHP でも同じ問題で躓いている人がいたが、解決の手がかりはなし。

CakePHP で CaekPHP の本家を見ていると、 #1526 (Oracle+ADODB+CakePHP Call to a member function MetaType() on a non-object in dbo_adodb.php) - CakePHP : The Rapid Development Framework for PHP - Trac

・resolution set to wontfix.

 

We are creating a native Oracle driver that will be used instead of Adodb, there are too many changes that are specific to Oracle for us to change the Adodb dbo. This should be completed shortly and can be placed in your own app/models/dbo

というように、CakePHP としては対応しません、ということになっている。(wontfix)

仕方がないので、いろいろ探していると、バージョン 1.2.x の方に dbo_oracle.php というものがあったので試してみるもやっぱりエラー。

Parse error: parse error, unexpected '&', expecting T_VARIABLE or '$' in
/...../cake/cake/libs/model/dbo/dbo_oracle.php on line 217

もう少し探すと #2024 (dbo_oracle: Oracle preserved keys and fullTableName) - CakePHP : The Rapid Development Framework for PHP - Trac にもバグ修正後の dbo_oracle.php があったので使ってみるとエラーはなくなりました。

ただ開発中のソースなのでこのまま問題なく使用できる保障はない。

2007/04/17 追記

オラクルでトランザクションを使いたいので、以下から最新の dbo_oracle.php を取得し置き換えました。 root/branches/1.2.x.x/cake/libs/model/datasources/dbo/dbo_oracle.php Revision 4620 このままだとエラーになるので、何点か修正。 31 行目ぐらいに

uses('model'.DS.'datasources'.DS.'dbo_source');

を追加。 150、151 行目の execute 文をコメント化

//$this->execute('ALTER SESSION SET NLS_SORT=BINARY_CI');
//$this->execute('ALTER SESSION SET NLS_COMP=ANSI');

217 行目の "&" がエラーになるので削除。※ "&" の意味を調べる必要あり

foreach ($fields as $value) {

これぐらい修正するととりあえず動きます。 トランザクションのテストはまだしてません。

テストしてみてまだエラーだったので、 1.1.x.xの場合 Re: トランザクションを実現するには にあるように、以下 2 ファイルを修正する cake/libs/model/datasources/dbo_source.php cake/libs/model/model_php4.php(サンプルはmodel_php5.php となっているが同じコードを php4 に使っても大丈夫)

ここまでやると、エラーは発生しなくなりました。 あとは複数テーブルのコミット、ロールバックの確認。

2007/04/20 追記

複数テーブルのコミット、ロールバックも OK でした。