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=1b51b573f0de5a7cf8bcd954fdc11a0b9ef6cca3;hb=1ae0a36c48e132bdd9852248c4db50f889e65719;hp=2acbbaf60113f7e8a84a6ea71ed1328311fa124f;hpb=41dd5d30761ff2def37173efbd0e58282d6a97d2;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 2acbbaf..1b51b57 100644 --- a/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm +++ b/lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm @@ -5,7 +5,6 @@ use warnings; use base qw/DBIx::Class::Storage::DBI::MSSQL/; use mro 'c3'; -use Carp::Clan qw/^DBIx::Class/; use List::Util(); use Scalar::Util (); @@ -62,7 +61,7 @@ sub connect_call_use_dynamic_cursors { my $self = shift; if (ref($self->_dbi_connect_info->[0]) eq 'CODE') { - croak 'cannot set DBI attributes on a CODE ref connect_info'; + $self->throw_exception ('Cannot set DBI attributes on a CODE ref connect_info'); } my $dbi_attrs = $self->_dbi_connect_info->[-1]; @@ -75,16 +74,15 @@ sub connect_call_use_dynamic_cursors { if (not exists $dbi_attrs->{odbc_cursortype}) { # turn on support for multiple concurrent statements, unless overridden $dbi_attrs->{odbc_cursortype} = 2; - my $connected = defined $self->_dbh; - $self->disconnect; - $self->ensure_connected if $connected; + $self->disconnect; # resetting dbi attrs, so have to reconnect + $self->ensure_connected; $self->_set_dynamic_cursors; } } sub _set_dynamic_cursors { my $self = shift; - my $dbh = $self->_dbh; + my $dbh = $self->_get_dbh; eval { local $dbh->{RaiseError} = 1; @@ -92,7 +90,7 @@ sub _set_dynamic_cursors { $dbh->do('SELECT @@IDENTITY'); }; if ($@) { - croak <<'EOF'; + $self->throw_exception (<<'EOF'); Your drivers do not seem to support dynamic cursors (odbc_cursortype => 2), if you're using FreeTDS, make sure to set tds_version to 8.0 or greater. @@ -103,12 +101,18 @@ EOF $self->_identity_method('@@identity'); } -sub _rebless { - no warnings 'uninitialized'; +sub _init { my $self = shift; - if (ref($self->_dbi_connect_info->[0]) ne 'CODE' && - eval { $self->_dbi_connect_info->[-1]{odbc_cursortype} } == 2) { + no warnings qw/uninitialized/; + + if ( + ref($self->_dbi_connect_info->[0]) ne 'CODE' + && + ref ($self->_dbi_connect_info->[-1]) eq 'HASH' + && + $self->_dbi_connect_info->[-1]{odbc_cursortype} == 2 + ) { $self->_set_dynamic_cursors; return; } @@ -137,14 +141,14 @@ sub connect_call_use_server_cursors { my $self = shift; my $sql_rowset_size = shift || 2; - $self->_dbh->{odbc_SQL_ROWSET_SIZE} = $sql_rowset_size; + $self->_get_dbh->{odbc_SQL_ROWSET_SIZE} = $sql_rowset_size; } -=head2 connect_call_use_mars +=head2 connect_call_use_MARS Use as: - on_connect_call => 'use_mars' + on_connect_call => 'use_MARS' Use to enable a feature of SQL Server 2005 and later, "Multiple Active Result Sets". See L @@ -154,23 +158,31 @@ B: This has implications for the way transactions are handled. =cut -sub connect_call_use_mars { +sub connect_call_use_MARS { my $self = shift; my $dsn = $self->_dbi_connect_info->[0]; if (ref($dsn) eq 'CODE') { - croak 'cannot change the DBI DSN on a CODE ref connect_info'; + $self->throw_exception('cannot change the DBI DSN on a CODE ref connect_info'); } if ($dsn !~ /MARS_Connection=/) { $self->_dbi_connect_info->[0] = "$dsn;MARS_Connection=Yes"; - my $connected = defined $self->_dbh; + my $was_connected = defined $self->_dbh; $self->disconnect; - $self->ensure_connected if $connected; + $self->ensure_connected if $was_connected; } } +sub _get_mssql_version { + my $self = shift; + + my ($version) = $self->_get_dbh->get_info(18) =~ /^(\d+)/; + + return $version; +} + 1; =head1 AUTHOR