X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FSybase.pm;h=8cb5f5f0022cda6fbb81ad309f222017ece2d80c;hb=3c730a833333a93aae5cdd98044420b5dbd965ff;hp=f82a3c5f7b54739e73ae7cdcd9244651b0fa443d;hpb=9a6a7fdb92b50d48c7d132bdf28ca2a3ec28336a;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Sybase.pm b/lib/DBIx/Class/Storage/DBI/Sybase.pm index f82a3c5..8cb5f5f 100644 --- a/lib/DBIx/Class/Storage/DBI/Sybase.pm +++ b/lib/DBIx/Class/Storage/DBI/Sybase.pm @@ -9,8 +9,9 @@ use base qw/ /; use mro 'c3'; use Carp::Clan qw/^DBIx::Class/; -use List::Util (); -use Sub::Name (); +use List::Util(); +use Sub::Name(); +use Data::Dumper::Concise(); __PACKAGE__->mk_group_accessors('simple' => qw/_identity _blob_log_on_update _writer_storage _is_extra_storage @@ -62,12 +63,13 @@ sub _rebless { my $dbtype = eval { @{$self->_get_dbh->selectrow_arrayref(qq{sp_server_info \@attribute_id=1})}[2] } || ''; + $self->throw_exception("Unable to estable connection to determine database type: $@") + if $@; - my $exception = $@; $dbtype =~ s/\W/_/gi; my $subclass = "DBIx::Class::Storage::DBI::Sybase::${dbtype}"; - if (!$exception && $dbtype && $self->load_optional_class($subclass)) { + if ($dbtype && $self->load_optional_class($subclass)) { bless $self, $subclass; $self->_rebless; } else { # real Sybase @@ -188,7 +190,7 @@ sub _populate_dbh { my $self = shift; $self->next::method(@_); - + if ($self->_is_bulk_storage) { # this should be cleared on every reconnect $self->_began_bulk_work(0); @@ -277,7 +279,8 @@ sub _prep_for_execute { ); } - if ($op eq 'insert' && (not $bound_identity_col) && $identity_col) { + if ($op eq 'insert' && (not $bound_identity_col) && $identity_col && + (not $self->{insert_bulk})) { $sql = "$sql\n" . $self->_fetch_identity_sql($ident, $identity_col); @@ -379,7 +382,7 @@ sub insert { # we are already in a transaction, or there are no blobs # and we don't need the PK - just (try to) do it if ($self->{transaction_depth} - || (!$blob_cols && !$dumb_last_insert_id) + || (!$blob_cols && !$dumb_last_insert_id) ) { return $self->_insert ( $next, $source, $to_insert, $blob_cols, $identity_col @@ -449,6 +452,8 @@ sub update { # it is originally put by _remove_blob_cols .) my %blobs_to_empty = map { ($_ => delete $fields->{$_}) } keys %$blob_cols; +# We can't only update NULL blobs, because blobs cannot be in the WHERE clause. + $self->next::method($source, \%blobs_to_empty, $where, @rest); # Now update the blobs before the other columns in case the update of other @@ -505,20 +510,14 @@ EOF if (not $use_bulk_api) { my $blob_cols = $self->_remove_blob_cols_array($source, $cols, $data); - my $dumb_last_insert_id = - $identity_col - && (not $is_identity_insert) - && ($self->_identity_method||'') ne '@@IDENTITY'; +# _execute_array uses a txn anyway, but it ends too early in case we need to +# select max(col) to get the identity for inserting blobs. + ($self, my $guard) = $self->{transaction_depth} == 0 ? + ($self->_writer_storage, $self->_writer_storage->txn_scope_guard) + : + ($self, undef); - ($self, my ($guard)) = do { - if ($self->{transaction_depth} == 0 && $blob_cols && - $dumb_last_insert_id) { - ($self->_writer_storage, $self->_writer_storage->txn_scope_guard); - } - else { - ($self, undef); - } - }; + local $self->{insert_bulk} = 1; $self->next::method(@_); @@ -547,6 +546,7 @@ EOF } $guard->commit if $guard; + return; } @@ -631,7 +631,9 @@ EOF }; $self->_execute_array( - $source, $sth, \@bind, \@source_columns, \@new_data, $guard + $source, $sth, \@bind, \@source_columns, \@new_data, sub { + $guard->commit + } ); $bulk->_query_end($sql); @@ -661,6 +663,15 @@ EOF } } +sub _dbh_execute_array { + my ($self, $sth, $tuple_status, $cb) = @_; + + my $rv = $self->next::method($sth, $tuple_status); + $cb->() if $cb; + + return $rv; +} + # Make sure blobs are not bound as placeholders, and return any non-empty ones # as a hash. sub _remove_blob_cols { @@ -770,7 +781,7 @@ sub _insert_blobs { $self->throw_exception( "Could not find row in table '$table' for blob update:\n" - . $self->_pretty_print (\%where) + . Data::Dumper::Concise::Dumper (\%where) ); }