From: Brandon L. Black Date: Thu, 24 Aug 2006 19:23:28 +0000 (+0000) Subject: reduce redundancy in NoBindVars, add extra test for it X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=d5130dd2ecbb3a4d31393332f6b4e419f251f427;p=dbsrgits%2FDBIx-Class-Historic.git reduce redundancy in NoBindVars, add extra test for it --- diff --git a/lib/DBIx/Class/Storage/DBI/NoBindVars.pm b/lib/DBIx/Class/Storage/DBI/NoBindVars.pm index 565178e..2ab0799 100644 --- a/lib/DBIx/Class/Storage/DBI/NoBindVars.pm +++ b/lib/DBIx/Class/Storage/DBI/NoBindVars.pm @@ -23,55 +23,24 @@ Uses C instead of the usual C, seeing as we can't cache =cut -sub sth { - my ($self, $sql) = @_; - return $self->dbh->prepare($sql); +sub _dbh_sth { + my ($self, $dbh, $sql) = @_; + $dbh->prepare($sql); } -=head2 _execute +=head2 _prep_for_execute -Manually subs in the values for the usual C placeholders before calling L on the generated SQL. +Manually subs in the values for the usual C placeholders. =cut -sub _execute { - my ($self, $op, $extra_bind, $ident, @args) = @_; - my ($sql, @bind) = $self->sql_maker->$op($ident, @args); - unshift(@bind, @$extra_bind) if $extra_bind; - if ($self->debug) { - my @debug_bind = map { defined $_ ? qq{'$_'} : q{'NULL'} } @bind; - $self->debugobj->query_start($sql, @debug_bind); - } - - while(my $bvar = shift @bind) { - $bvar = $self->_dbh->quote($bvar); - $sql =~ s/\?/$bvar/; - } - - my $sth = eval { $self->sth($sql,$op) }; - - if (!$sth || $@) { - $self->throw_exception( - 'no sth generated via sql (' . ($@ || $self->_dbh->errstr) . "): $sql" - ); - } - - my $rv; - if ($sth) { - my $time = time(); - $rv = eval { $sth->execute }; - - if ($@ || !$rv) { - $self->throw_exception("Error executing '$sql': ".($@ || $sth->errstr)); - } - } else { - $self->throw_exception("'$sql' did not generate a statement."); - } - if ($self->debug) { - my @debug_bind = map { defined $_ ? qq{`$_'} : q{`NULL'} } @bind; - $self->debugobj->query_end($sql, @debug_bind); - } - return (wantarray ? ($rv, $sth, @bind) : $rv); +sub _prep_for_execute { + my $self = shift; + my ($sql, @bind) = $self->next::method(@_); + + $sql =~ s/\?/$self->_dbh->quote($_)/e for (@bind); + + return ($sql); } =head1 AUTHORS diff --git a/t/93nobindvars.t b/t/93nobindvars.t new file mode 100644 index 0000000..a759a6c --- /dev/null +++ b/t/93nobindvars.t @@ -0,0 +1,65 @@ +use strict; +use warnings; + +# Copied from 71mysql.t, manually using NoBindVars. This is to give that code +# wider testing, since virtually nobody who regularly runs the test suite +# is using DBD::Sybase+FreeTDS+MSSQL -- blblack + +use Test::More; +use lib qw(t/lib); +use DBICTest; +use DBI::Const::GetInfoType; + +my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/}; + +#warn "$dsn $user $pass"; + +plan skip_all => 'Set $ENV{DBICTEST_MYSQL_DSN}, _USER and _PASS to run this test' + unless ($dsn && $user); + +plan tests => 4; + +{ # Fake storage driver for mysql + no bind variables + package DBIx::Class::Storage::DBI::MySQLNoBindVars; + use base qw/ + DBIx::Class::Storage::DBI::mysql + DBIx::Class::Storage::DBI::NoBindVars + /; + $INC{'DBIx/Class/Storage/DBI/MySQLNoBindVars.pm'} = 1; +} + +DBICTest::Schema->storage(undef); # just in case? +DBICTest::Schema->storage_type('::DBI::MySQLNoBindVars'); +DBICTest::Schema->compose_connection('MySQLTest' => $dsn, $user, $pass); + +my $dbh = MySQLTest->schema->storage->dbh; + +$dbh->do("DROP TABLE IF EXISTS artist;"); + +$dbh->do("CREATE TABLE artist (artistid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), charfield CHAR(10));"); + +#'dbi:mysql:host=localhost;database=dbic_test', 'dbic_test', ''); + +MySQLTest::Artist->load_components('PK::Auto'); + +# test primary key handling +my $new = MySQLTest::Artist->create({ name => 'foo' }); +ok($new->artistid, "Auto-PK worked"); + +# test LIMIT support +for (1..6) { + MySQLTest::Artist->create({ name => 'Artist ' . $_ }); +} +my $it = MySQLTest::Artist->search( {}, + { rows => 3, + offset => 2, + order_by => 'artistid' } +); +is( $it->count, 3, "LIMIT count ok" ); +is( $it->next->name, "Artist 2", "iterator->next ok" ); +$it->next; +$it->next; +is( $it->next, undef, "next past end of resultset ok" ); + +# clean up our mess +$dbh->do("DROP TABLE artist");