DBIC::EscapeSearch

DBICのメソッド拡張ですが、ResultSetManagerを使えばラクチンでした。
ResultSetManagerが王道になるのかな。

参考:http://blog.hide-k.net/archives/2006/03/dbixclassresult.php

searchメソッド実行させるときにシングルクォートのエスケープさせたかったのですが、
Kittenでは例えばこんな感じ


eval {
$cap->stash->{memo} = __PACKAGE__->resultset('Memo')->search(
{
memo => {'like', '%'.&Kitten::Util::escapeDB($q->param('memo')).'%'}
},
{
page => $page,
row => 10,
order_by => 'id DESC',
}
);
};

&Kitten::Util::escapeDBが汚くて嫌だったのです。
シングルクォートのエスケープなんて意識せずにやって欲しいってのが本音。
ってことで、DBIC::EscapeSearchをサックリ作ってみました。


package DBIx::Class::EscapeSearch;
use strict;
use warnings;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/ResultSetManager/);
sub escape_search : ResultSet {
my $class = shift;
my $attrs = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
my $query = ref $_[0] eq 'HASH' ? { %{shift()} }: {@_};
$query->{$_} =~ s/'/''/g for keys %$query;
return $class->search($query, { %$attrs });
}
1;

こんなのできました。
↓見たいにload_componentsしてやればOK

__PACKAGE__->load_components(qw/EscapeSearch PK::Auto::SQLite Core/);

search_likeメソッドとか見ても結局はsearchメソッドへのラッパーになってるんですよね。
だからこんなのでいいのかなと。

(追記)こんな感じでかけるかね。


eval {
$cap->stash->{memo} = __PACKAGE__->resultset('Memo')->escape_search(
{
memo => {'like', '%'.$q->param('memo').'%'}
},
{
page => $page,
row => 10,
order_by => 'id DESC',
}
);
};

CDBIでも同じ事がいえそうな希ガス