DBIx::Simple で count したい

SQL::Abstract が存在すること前提ですけど

sub DBIx::Simple::count {
    my ($self, $table, $fields, $cond) = @_;

    if (ref $fields eq 'ARRAY' && @$fields == 1) {
        $fields = $fields->[0];
    }
    $fields = '*' if ! defined $fields || ref $fields;

    my $result = $self->select($table, [ "COUNT($fields)" ], $cond);

    return $result ? $result->array->[0] : -1;
}

こんなコードを書くと,$db->select() と同等の引数で COUNT できます。

my $result      = $db->select('dummy_table', 'id', { available => 1 });

my $num_records = $db->count ('dummy_table', 'id', { available => 1 });

$fields をほぼそのまま埋め込んでるんでインジェクションに弱いのはご愛敬(どうすればいいんだろう)。

ほんとは DBIx::Simple::Result を拡張するほうがかっこいいんですが,DBIC と違って query() を呼んだ段階でクエリを実行してしまうんでこちらの仕様のほうが現実的かな,と。あと -1 を返しているところは 0 にしたほうが実用的かもしんない。