From: Rafael Kitover Date: Thu, 24 Sep 2009 09:21:18 +0000 (+0000) Subject: minor cleanups, test update of blob to NULL X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=d390bd3cd416f6f291bd40ad7adc5e8bb7d6b539;p=dbsrgits%2FDBIx-Class-Historic.git minor cleanups, test update of blob to NULL --- diff --git a/lib/DBIx/Class/Storage/DBI/Sybase.pm b/lib/DBIx/Class/Storage/DBI/Sybase.pm index 7c3b995..319b703 100644 --- a/lib/DBIx/Class/Storage/DBI/Sybase.pm +++ b/lib/DBIx/Class/Storage/DBI/Sybase.pm @@ -428,13 +428,8 @@ sub update { if $is_identity_update; } -# check that we're not updating a blob column that's also in $where - for my $blob (grep $self->_is_lob_column($source, $_), $source->columns) { - if (exists $where->{$blob} && exists $fields->{$blob}) { - croak -'Update of TEXT/IMAGE column that is also in search condition impossible'; - } - } +# If there are any blobs in $where, Sybase will return a descriptive error +# message. # update+blob update(s) done atomically on separate connection $self = $self->_writer_storage; @@ -475,6 +470,7 @@ sub update { return $wantarray ? @res : $res[0]; } +# for IDENTITY_INSERT / IDENTITY_UPDATE sub _set_session_identity { my ($self, $op, $table, $off_on) = @_; @@ -505,9 +501,6 @@ sub _set_session_identity { } } -# for tests -sub _can_insert_bulk { 1 } - sub insert_bulk { my $self = shift; my ($source, $cols, $data) = @_; @@ -540,14 +533,8 @@ 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'; - ($self, my ($guard)) = do { - if ($self->{transaction_depth} == 0 && - ($blob_cols || $dumb_last_insert_id)) { + if ($self->{transaction_depth} == 0 && $blob_cols) { ($self->_writer_storage, $self->_writer_storage->txn_scope_guard); } else { @@ -1053,10 +1040,10 @@ session variable. =head1 TRANSACTIONS Due to limitations of the TDS protocol, L, or both; you cannot -begin a transaction while there are active cursors. An active cursor is, for -example, a L that has been executed using -C or C but has not been exhausted or -L. +begin a transaction while there are active cursors; nor can you use multiple +active cursors within a transaction. An active cursor is, for example, a +L that has been executed using C or +C but has not been exhausted or L. For example, this will not work: @@ -1070,6 +1057,11 @@ For example, this will not work: } }); +This won't either: + + my $first_row = $large_rs->first; + $schema->txn_do(sub { ... }); + Transactions done for inserts in C mode when placeholders are in use are not affected, as they are done on an extra database handle. diff --git a/lib/DBIx/Class/Storage/DBI/Sybase/NoBindVars.pm b/lib/DBIx/Class/Storage/DBI/Sybase/NoBindVars.pm index ebb1dcc..32908ee 100644 --- a/lib/DBIx/Class/Storage/DBI/Sybase/NoBindVars.pm +++ b/lib/DBIx/Class/Storage/DBI/Sybase/NoBindVars.pm @@ -59,9 +59,6 @@ sub _prep_interpolated_value { return $value; } -# for tests -sub _can_insert_bulk { 0 } - 1; =head1 NAME diff --git a/t/746sybase.t b/t/746sybase.t index 430d5a4..c05b09d 100644 --- a/t/746sybase.t +++ b/t/746sybase.t @@ -211,7 +211,7 @@ SQL # test insert_bulk using populate. SKIP: { skip 'insert_bulk not supported', 4 - unless $schema->storage->_can_insert_bulk; + unless $storage_type !~ /NoBindVars/i; lives_ok { $schema->resultset('Artist')->populate([ @@ -247,7 +247,7 @@ SQL # make sure insert_bulk works a second time on the same connection SKIP: { skip 'insert_bulk not supported', 3 - unless $schema->storage->_can_insert_bulk; + unless $storage_type !~ /NoBindVars/i; lives_ok { $schema->resultset('Artist')->populate([ @@ -294,7 +294,7 @@ SQL # now test insert_bulk with IDENTITY_INSERT SKIP: { skip 'insert_bulk not supported', 3 - unless $schema->storage->_can_insert_bulk; + unless $storage_type !~ /NoBindVars/i; lives_ok { $schema->resultset('Artist')->populate([ @@ -457,12 +457,12 @@ SQL is((grep $_->clob eq $new_str, $rs->all), 2, 'TEXT column set correctly via insert_bulk'); - # make sure impossible blob update throws - throws_ok { - $rs->update({ clob => 'foo' }); - $rs->create({ clob => 'bar' }); - $rs->search({ clob => 'foo' })->update({ clob => 'bar' }); - } qr/impossible/, 'impossible blob update throws'; + lives_and { + $rs->delete; + $rs->create({ blob => $binstr{large} }) for (1..2); + $rs->update({ blob => undef }); + is((grep !defined($_->blob), $rs->all), 2); + } 'blob update to NULL'; } # test MONEY column support