人生ずっと勉強

人生ずっと勉強ですね。 https://twitter.com/KiyotakaGoto

DBIx::Skinny で RDBMS の関数を使う方法が結局わからずじまい

mysql の INET_ATON(MySQL :: MySQL 5.6 Reference Manual :: 12.16 Miscellaneous Functions) を使って、
table.start_ip_num <= INET_ATON( IP_V4_ADDR ) AND INET_ATON( IP_V4_ADDR ) <= table.end_ip_num
という判定をしたくて試行錯誤していたのだけれど、

resultset の add_where だと、

$rs->add_where( "INET_ATON('$ipv4addr')" => { '<=' => 'table.end_ip_num' } );

とするとフィールド名がフィールド名じゃなくてただの値として扱われてしまうし、

$rs->add_where( "table.start_ip_num" => { '<=' => "INET_ATON('$ipv4addr')" } );

でも結局「INET_ATON('10.0.0.0')」みたいなただの値になってしまう。
ということで結局 mysql の関数を使う方法がわからずじまいになってしまった・・・。

とりあえずこの時は、以下のように ipv4 -> num をするサブルーチンを書いて perl で処理することで対応した。

sub __ipv4addr2num {
    my ($self, $ipv4) = @_;
    return unpack('N', pack('C*', (split/\./, $ipv4) ) )
}

もちろん search_by_sql を使えば実現はできるけれど、せっかく wrap してくれてるのに sql を書くのは
wrapper の意味が無い気がするので避けたい。
RDBMS の関数を使うにはどうすればいいんだろう。COUNT は専用のメソッドが用意されているみたいだけど。