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 は専用のメソッドが用意されているみたいだけど。