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のメソッドだけな気がする。