DBIx::Simpleでprepareキャッシュ
MySQLとかの場合はprepareキャッシュは効かないからあれだけど、
Oracleとかのばやいは有効なはず。
MySQLの場合でもある程度はよくなるはず。
--- Simple.pm (revision 17548) +++ Simple.pm (working copy) @@ -123,6 +123,42 @@ ### public methods +sub prepare { + my ($self, $query) = @_; + + my $sth; + eval { $sth = $self->{dbh}->prepare($query) } or do { + if ($@) { + $@ =~ s/ at \S+ line \d+\.\n\z//; + Carp::croak($@); + } + $self->{reason} = "Prepare failed ($DBI::errstr)"; + return; + }; + my $st = bless { + db => "$self", + sth => $sth, + query => $query + }, 'DBIx::Simple::Statement'; + $statements{$self}{$st} = $st; + $self->{st} = $st; + + return $self; +} + +sub execute { + my ($self, @binds) = @_; + eval { $self->{st}->{sth}->execute(@binds) } or do { + if ($@) { + $@ =~ s/ at \S+ line \d+\.\n\z//; + Carp::croak($@); + } + $self->{reason} = "Execute failed ($DBI::errstr)"; + return; + }; + return bless { st => $self->{st}, lc_columns => $self->{lc_columns} }, 'DBIx::Simple::ResultAdvance'; +} + sub query { my ($self, $query, @binds) = @_; $self->{success} = 0; @@ -485,6 +521,11 @@ ); } +package DBIx::Simple::ResultAdvance; +use base 'DBIx::Simple::Result'; +sub _die { } +sub DESTROY { } + 1; __END__
こんな感じ
#! /usr/bin/perl use strict; use warnings; use Data::Dumper; use DBIx::Simple; my $db = DBIx::Simple->connect('dbi:mysql:hoge','foo','bar') or die DBIx::Simple->error; my $result = $db->prepare('SELECT id,name FROM member WHERE name = ?'); for my $name ( qw/nekokak nomaneko/ ) { my $simple = $result->execute($name); for my $row ( $simple->map ) { warn Dumper $row; } warn '# -------------------------------------------------------------------------#'; }
なんかDBIx::Simpleでうれしいことって
DBIx::Simple::Resultのメソッドだけな気がする。