From: Brandon L. Black Date: Mon, 2 Jul 2007 15:15:42 +0000 (+0000) Subject: Patch for ? in NoBindVars data from Tom Hukins X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=b4474f31dee1dd4f1ded144158878f1009982448;p=dbsrgits%2FDBIx-Class-Historic.git Patch for ? in NoBindVars data from Tom Hukins --- diff --git a/Changes b/Changes index da0ffea..0d2aafa 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,6 @@ Revision history for DBIx::Class + - Patch to fix ? in data for NoBindVars (from Tom Hukins) - Restored mk_classaccessor method for compatibility 0.08002 2007-06-20 06:10:00 diff --git a/lib/DBIx/Class/Storage/DBI/NoBindVars.pm b/lib/DBIx/Class/Storage/DBI/NoBindVars.pm index c5fa9af..80f367d 100644 --- a/lib/DBIx/Class/Storage/DBI/NoBindVars.pm +++ b/lib/DBIx/Class/Storage/DBI/NoBindVars.pm @@ -42,17 +42,21 @@ sub _prep_for_execute { # stringify args, quote via $dbh, and manually insert + my @sql_part = split /\?/, $sql; + my $new_sql; + foreach my $bound (@$bind) { shift @$bound; foreach my $data (@$bound) { if(ref $data) { $data = ''.$data; } - $sql =~ s/\?/$self->_dbh->quote($data)/e; + $new_sql .= shift(@sql_part) . $self->_dbh->quote($data); } } + $new_sql .= join '', @sql_part; - return ($sql); + return ($new_sql); } =head1 AUTHORS diff --git a/t/74mssql.t b/t/74mssql.t index 1e86e2d..26fffcf 100644 --- a/t/74mssql.t +++ b/t/74mssql.t @@ -12,7 +12,7 @@ my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_${_}" } qw/DSN USER PASS/}; plan skip_all => 'Set $ENV{DBICTEST_MSSQL_DSN}, _USER and _PASS to run this test' unless ($dsn); -plan tests => 4; +plan tests => 5; my $storage_type = '::DBI::MSSQL'; $storage_type = '::DBI::Sybase::MSSQL' if $dsn =~ /^dbi:Sybase:/; @@ -28,6 +28,7 @@ $dbh->do("IF OBJECT_ID('artist', 'U') IS NOT NULL DROP TABLE artist"); $dbh->do("CREATE TABLE artist (artistid INT IDENTITY PRIMARY KEY, name VARCHAR(255));"); +$dbh->do("CREATE TABLE cd (cdid INT IDENTITY PRIMARY KEY, artist INT, title VARCHAR(100), year VARCHAR(100));"); # Just to test compat shim, Auto is in Core $schema->class('Artist')->load_components('PK::Auto::MSSQL'); @@ -48,6 +49,14 @@ my $it = $schema->resultset('Artist')->search( { }, } ); +# Test ? in data don't get treated as placeholders +my $cd = $schema->resultset('CD')->create( { + artist => 1, + title => 'Does this break things?', + year => 2007, +} ); +ok($cd->id, 'Not treating ? in data as placeholders'); + is( $it->count, 3, "LIMIT count ok" ); ok( $it->next->name, "iterator->next ok" ); $it->next; @@ -58,4 +67,6 @@ is( $it->next, undef, "next past end of resultset ok" ); END { $dbh->do("IF OBJECT_ID('artist', 'U') IS NOT NULL DROP TABLE artist") if $dbh; + $dbh->do("IF OBJECT_ID('cd', 'U') IS NOT NULL DROP TABLE cd") + if $dbh; }