[s2container-php5:121] Solaris で RELNO の機能を利用したときのS2Dao_HashMapについて

Noriyuki ITAGAKI [E-MAIL ADDRESS DELETED]
2008年 4月 16日 (水) 04:17:23 JST


板垣と申します。

以下の環境で利用させていただいております。

・s2dao.php5-1.1.2.tar.gz
・s2container.php5-1.1.3.zip
・Oracle10g
・Apache/2.0.61 (source) PHP/5.2.4
・Solaris10(SPARC)


Solaris で RELNO の機能を利用したとき、連結される
外部結合テーブルのBeanがおかしくなるようです。
※ 同じコードでWindowsでは再現しません。

「S2Dao_RelationRowCache.class.php」を確認させていただきましたが、
以下のようになっているようです。
    39: return $this->getRowMap($relno)->get($key->hashCode());
    43: $this->getRowMap($relno)->put($key->hashCode(), $row);

S2Dao_RelationKey::hashCode() の値が偶然一致しているのかと思い、
調査しましたが、別の値になっておりました。
※ 偶然一致してしまう可能性はないでしょうか。

おかしくなるデータを確認したところ、S2Dao_RelationKey::hashCode()
の値がマイナスになっているもののように思います。

S2Dao_HashMap のソースでは、array() をラッピングするように
なっておりますので、数値(マイナスや十分に大きな値)を設定した
ときの挙動は保障されていないかもしれません。
※ なぜか、Windows版では、マイナスは問題なさそうですが、十分に
   大きな値を設定したとき、想定する結果にはなりませんでした。
     > 「十分に大きな値」と「十分に大きな値+1」は、
        同じキーとして扱われる。

java のHashMapのように、キーとして、リテラルな数値は設定できない
方が良いと思いますが、いかがでしょうか。

現在、「S2Dao_HashMap.class.php」を添付のファイルのように修正し、
「S2Dao_RelationRowCache.class.php」ファイルを以下のように
修正して運用しておりますが、何か不都合や、別のアドバイスが
ございましたら、ご教示いただけると幸いです。
  39: return $this->getRowMap($relno)->get($key);
  43: $this->getRowMap($relno)->put($key, $row);


既出の問題の場合、または、PHP.iniの設定によるものの場合は、
お許しください。


以上です。
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: S2Dao_HashMap.class.php
型:         application/php
サイズ:     3465 バイト
説明:       無し
URL:        http://ml.seasar.org/archives/s2container-php5/attachments/20080416/742691ce/attachment-0001.bin 


S2Container-PHP5 メーリングリストの案内