[s2container-php5:77] Re: /*IF */ ... --ELSE ... /*END*/の使用方法について

Yusuke Hata nowel @ xole.net
2007年 2月 9日 (金) 02:42:00 JST


黒田様

ハタです。ファイルありがとうございました。

こちらでも再現致しました。
formats.weightとすると、"formats." にあるドット周辺のパースが上手く行えていないようでした。
# hoge.weightは上手くいったので何か別の理由があるかもしれません
原因はSqlTokenizerと考えています。

これの修正は、S2Dao.PHP5-1.1.2のリリースをもって反映したいと思います。
see: https://www.seasar.org/issues/browse/DAOPHP-8

また、修正とは別になってしまいますが、以下のようにテーブル名の指定を行わない方法で一時的に回避可能です。

    const getFormatByWeight3List_QUERY = "weight /*IF weight != null*/=/*weight*/0 --ELSE is null/*END*/";
    public function getFormatByWeight3List($weight = null);

    const getFormatByWeight2List_QUERY = "/*IF weight != null*/weight=/*weight*/0 --ELSE isnull(weight)/*END*/";
    public function getFormatByWeight2List($weight = null);

    const getFormatByWeightList_QUERY = "/*IF weight != null*/weight = /*weight*/0 --ELSE weight is null/*END*/";
    public function getFormatByWeightList($weight = null);

すいませんが、S2Dao.PHP5-1.1.2のリリースがされるまでは上記の方法で対応していただけませんでしょうか?
また、リリースの日程は未定です。

以上です。よろしくお願いします。

On Thu, 08 Feb 2007 02:51:48 +0900
Eishi Kuroda <kuroda @ jetsetrecords.net> wrote:

> ハタ様
> 
> たった今、下記の方法を試してみましたが、
> 
> ------- <<ここから>> -------
> /*IF hoge != null*/hoge = /*hoge*/'abc'
>   -- ELSE hoge is null
>  # --[ここに半角スペース]ELSE hoge is null
> /*END*/
> ------- <</ここまで>> -------
> 
> 例えば下記のようになり、無理でした。
> 
> SELECT formats.id, formats.name, formats.name_en, formats.weight,
> formats.entry, formats.version_no, formats.timestamp FROM formats
> WHERE 100 -- ELSE formats.weight is null
> 
> よろしくお願いします。
> 
> 黒田
> 
> On Thu, 08 Feb 2007 02:46:12 +0900
> Eishi Kuroda <kuroda @ jetsetrecords.net> wrote:
> 
> > ハタ様
> > 
> > 御対応ありがとうございます。
> > 
> > > また、リファレンスに載せているコードですが、一部DBMSで正常に動かな
> > > いことがあるので以下のように修正することで動く可能性があります。
> > 
> > ↑こちらはまだ試してないのですが、
> > とりあえず、私の方で試した時のコードとデータを出来る限り送ります。
> > 
> > pdo.dicon以外はほぼそのまま送っていますが、一部削った所もあります。
> > ただし、そのせいで問題の点の挙動が変わることはないと思います。
> > 
> > www/formats.sql
> > が、テーブルとデータ数個分のsql。
> > 
> > www/lib/dao
> > www/lib/entity
> > にformatsのdao, entity。
> > 
> > これで役に立つかどうか分かりませんが、
> > よろしくお願いいたします。
> > 
> > 黒田映史
> > 
> > 
> > On Thu, 8 Feb 2007 00:01:34 +0900
> > Yusuke Hata <nowel @ xole.net> wrote:
> > 
> > > ハタです。遅くなってしまって申し訳ありません。
> > > 
> > > で、結果なのですが、すいません、私の環境(後記)では全て動いてしまい
> > > ます(@@;; もし差し支えなければ、データやコードを私の方に送っていた
> > > だければ検証してみますので、送っていただけませんでしょうか?一部だ
> > > けでも構わないです。私の方でも、もう少し原因を追ってみます。
> > > 
> > > SQLバインドの使い方はgetFormatByWeightListやgetFormatByWeight2List
> > > の使い方で正しいハズです。
> > > 
> > > 以下は、その時のログになります。
> > > ------- <<ここから>> -------
> > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM
> > > hoge WHERE hoge.weight=100 object(S2Dao_ArrayList)#454 (1) {
> > >   [0]=>
> > >   object(HogeEntity)#457 (4) {
> > >     :
> > >   }
> > > }
> > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM
> > > hoge WHERE hoge.weight is null object(S2Dao_ArrayList)#453 (0) {
> > > }
> > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM
> > > hoge WHERE hoge.weight=100 object(S2Dao_ArrayList)#446 (1) {
> > >   [0]=>
> > >   object(HogeEntity)#456 (4) {
> > >     :
> > >   }
> > > }
> > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM
> > > hoge WHERE isnull(hoge.weight) object(S2Dao_ArrayList)#445 (0) {
> > > }
> > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM
> > > hoge WHERE hoge.weight =100 object(S2Dao_ArrayList)#353 (1) {
> > >   [0]=>
> > >   object(HogeEntity)#455 (4) {
> > >     :
> > >   }
> > > }
> > > [DEBUG]  - SELECT hoge.id, hoge.weight, hoge.aaa, hoge.bbb FROM
> > > hoge WHERE hoge.weight is null object(S2Dao_ArrayList)#447 (0) {
> > > }
> > > ------- <</ここまで>> -------
> > > 
> > > また、リファレンスに載せているコードですが、一部DBMSで正常に動かな
> > > いことがあるので以下のように修正することで動く可能性があります。
> > > 
> > > ------- <<ここから>> -------
> > > /*IF hoge != null*/hoge = /*hoge*/'abc'
> > >   -- ELSE hoge is null
> > >  # --[ここに半角スペース]ELSE hoge is null
> > > /*END*/
> > > ------- <</ここまで>> -------
> > > 
> > > 
> > > 以下は作成してみたモノです。
> > > 
> > > interface HogeDao {
> > >     const BEAN = "HogeEntity";
> > >     const getFormatByWeightList_QUERY = '/*IF weight !=
> > > null*/hoge.weight=/*weight*/0 --ELSE hoge.weight is null/*END*/';
> > > public function getFormatByWeightList($weight = null);
> > > 
> > >     const getFormatByWeight2List_QUERY = '/*IF weight !=
> > > null*/hoge.weight=/*weight*/0 --ELSE isnull(hoge.weight)/*END*/';
> > > public function getFormatByWeight2List($weight = null);
> > > 
> > >     const getFormatByWeight3List_QUERY = 'hoge.weight /*IF
> > > weight != null*/=/*weight*/0 --ELSE is null/*END*/'; public
> > > function getFormatByWeight3List($weight = null); }
> > > 
> > > class HogeEntity {
> > >     const TABLE = "hoge";
> > >     private $id;
> > >     private $weight;
> > >     private $aaa;
> > >     private $bbb;
> > >     :(setter/getterなので省略)
> > > }
> > > create table hoge(
> > >     id integer not null auto_increment,
> > >     weight varchar(255) not null,
> > >     aaa varchar(255),
> > >     bbb varchar(255),
> > >     primary key(id)
> > > );
> > > 
> > > 私の環境は以下になります。(なるべく合わせてみました)
> > > OpenSuSE 10.2
> > > PHP 5.1.6
> > > MySql 5.0.26
> > > S2Dao.PHP5 1.1.1
> > > S2Container.PHP5 1.1.1
> > > 
> > > 以上です。よろしくお願いします。
> > > 
> 
> 


-- 
Yusuke Hata <nowel @ xole.net>
blog: http://blog.xole.net/


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