From: Brandon L. Black Date: Tue, 3 Oct 2006 22:57:09 +0000 (+0000) Subject: add connect_info option to disable statement caching X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=b33697ef204738fc1bb8edd81bc6eb2e7bd2b5a2;hp=894328b896435b7b8d8a37500750f37a40bcbb2f;p=dbsrgits%2FDBIx-Class-Historic.git add connect_info option to disable statement caching --- diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index edeb8d0..a0a34a8 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -14,7 +14,7 @@ use IO::File; __PACKAGE__->mk_group_accessors( 'simple' => qw/_connect_info _dbh _sql_maker _sql_maker_opts _conn_pid _conn_tid - cursor on_connect_do transaction_depth/ + disable_sth_caching cursor on_connect_do transaction_depth/ ); BEGIN { @@ -336,6 +336,11 @@ This can be set to an arrayref of literal sql statements, which will be executed immediately after making the connection to the database every time we [re-]connect. +=item disable_sth_caching + +If set to a true value, this option will disable the caching of +statement handles via L. + =item limit_dialect Sets the limit dialect. This is useful for JDBC-bridge among others @@ -413,6 +418,7 @@ Examples: quote_char => q{`}, name_sep => q{@}, on_connect_do => ['SET search_path TO myschema,otherschema,public'], + disable_sth_caching => 1, }, ] ); @@ -432,8 +438,10 @@ sub connect_info { my $info = [ @$info_arg ]; # copy because we can alter it my $last_info = $info->[-1]; if(ref $last_info eq 'HASH') { - if(my $on_connect_do = delete $last_info->{on_connect_do}) { - $self->on_connect_do($on_connect_do); + for my $storage_opt (qw/on_connect_do disable_sth_caching/) { + if(my $value = delete $last_info->{$storage_opt}) { + $self->$storage_opt($value); + } } for my $sql_maker_opt (qw/limit_dialect quote_char name_sep/) { if(my $opt_val = delete $last_info->{$sql_maker_opt}) { @@ -969,11 +977,17 @@ Returns a L sth (statement handle) for the supplied SQL. sub _dbh_sth { my ($self, $dbh, $sql) = @_; + # 3 is the if_active parameter which avoids active sth re-use - $dbh->prepare_cached($sql, {}, 3) or - $self->throw_exception( - 'no sth generated via sql (' . ($@ || $dbh->errstr) . "): $sql" - ); + my $sth = $self->disable_sth_caching + ? $dbh->prepare($sql) + : $dbh->prepare_cached($sql, {}, 3); + + $self->throw_exception( + 'no sth generated via sql (' . ($@ || $dbh->errstr) . "): $sql" + ) if !$sth; + + $sth; } sub sth { diff --git a/lib/DBIx/Class/Storage/DBI/NoBindVars.pm b/lib/DBIx/Class/Storage/DBI/NoBindVars.pm index 2ab0799..b965053 100644 --- a/lib/DBIx/Class/Storage/DBI/NoBindVars.pm +++ b/lib/DBIx/Class/Storage/DBI/NoBindVars.pm @@ -17,15 +17,17 @@ well, as is the case with L =head1 METHODS -=head2 sth +=head2 connect_info -Uses C instead of the usual C, seeing as we can't cache very effectively without bind variables. +We can't cache very effectively without bind variables, so force the C setting to be turned on when the connect info is set. =cut -sub _dbh_sth { - my ($self, $dbh, $sql) = @_; - $dbh->prepare($sql); +sub connect_info { + my $self = shift; + my $retval = shift->next::method(@_); + $self->disable_sth_caching(1); + $retval; } =head2 _prep_for_execute diff --git a/t/35disable_sth_caching.t b/t/35disable_sth_caching.t new file mode 100644 index 0000000..5ad4cca --- /dev/null +++ b/t/35disable_sth_caching.t @@ -0,0 +1,19 @@ +use strict; +use warnings; + +use Test::More; +use lib qw(t/lib); +use DBICTest; + +plan tests => 2; + +# Set up the "usual" sqlite for DBICTest +my $schema = DBICTest->init_schema; + +my $sth_one = $schema->storage->sth('SELECT 42'); +my $sth_two = $schema->storage->sth('SELECT 42'); +$schema->storage->disable_sth_caching(1); +my $sth_three = $schema->storage->sth('SELECT 42'); + +ok($sth_one == $sth_two, "statement caching works"); +ok($sth_two != $sth_three, "disabling statement caching works");