X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FODBC%2FMicrosoft_SQL_Server.pm;h=e0fe1ea312174c63eea88b4973ed52e52aff6aa6;hb=23eae1757461efb9dfc3ad207f47f6c334c38887;hp=afd51f3ee20ba38f59c03cc2338d84dc07f58354;hpb=25d3127deaaa381fdaa35b8b9d09e0483ba9e532;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm b/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm index afd51f3..e0fe1ea 100644 --- a/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm +++ b/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm @@ -2,7 +2,10 @@ package DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server; use strict; use warnings; -use base qw/DBIx::Class::Storage::DBI::MSSQL/; +use base qw/ + DBIx::Class::Storage::DBI::ODBC + DBIx::Class::Storage::DBI::MSSQL +/; use mro 'c3'; use Scalar::Util 'reftype'; use Try::Tiny; @@ -124,7 +127,7 @@ sub connect_call_use_mars { } if ($dsn !~ /MARS_Connection=/) { - if ($self->using_freetds) { + if ($self->_using_freetds) { $self->throw_exception('FreeTDS does not support MARS at the time of ' .'writing.'); } @@ -208,6 +211,8 @@ sub connect_call_use_dynamic_cursors { sub _run_connection_actions { my $self = shift; + $self->next::method (@_); + # keep the dynamic_cursors_support and driver-state in sync # on every reconnect my $use_dyncursors = ($self->_dbic_connect_attributes->{odbc_cursortype} || 0) > 1; @@ -226,7 +231,7 @@ sub _run_connection_actions { $self->throw_exception ( 'Your drivers do not seem to support dynamic cursors (odbc_cursortype => 2).' . ( - $self->using_freetds + $self->_using_freetds ? ' If you are using FreeTDS, make sure to set tds_version to 8.0 or greater.' : '' ) @@ -235,23 +240,24 @@ sub _run_connection_actions { $self->_using_dynamic_cursors(1); $self->_identity_method('@@identity'); - $self->_no_scope_identity_query($self->using_freetds); } else { $self->_using_dynamic_cursors(0); $self->_identity_method(undef); - $self->_no_scope_identity_query(undef); } } - $self->next::method (@_); + $self->_no_scope_identity_query($self->_using_dynamic_cursors + ? $self->_using_freetds + : undef + ); # freetds is too damn broken, some fixups - if ($self->using_freetds) { + if ($self->_using_freetds) { # no dynamic cursors starting from 0.83 if ($self->_using_dynamic_cursors) { - my $fv = $self->_dbh_get_info('SQL_DRIVER_VER'); + my $fv = $self->_using_freetds_version || 999; # assume large if can't be determined $self->throw_exception( 'Dynamic cursors (odbc_cursortype => 2) are not supported with FreeTDS > 0.82 ' . "(you have $fv). Please hassle FreeTDS authors to fix the outstanding bugs in " @@ -261,7 +267,7 @@ sub _run_connection_actions { # FreeTDS is too broken wrt execute_for_fetch batching # just disable it outright until things quiet down - $self->_get_dbh->{odbc_disable_array_operations} = 1; + $self->_disable_odbc_array_ops; } } @@ -297,26 +303,6 @@ sub connect_call_use_server_cursors { $self->_get_dbh->{odbc_SQL_ROWSET_SIZE} = $sql_rowset_size; } -=head2 using_freetds - -Tries to determine, to the best of our ability, whether or not you are using the -FreeTDS driver with L. - -=cut - -sub using_freetds { - my $self = shift; - - my $dsn = $self->_dbi_connect_info->[0]; - - $dsn = '' if ref $dsn eq 'CODE'; - - return 1 if $dsn =~ /driver=FreeTDS/i - || ($self->_dbh_get_info('SQL_DRIVER_NAME')||'') =~ /tdsodbc/i; - - return 0; -} - 1; =head1 AUTHOR