X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F746sybase.t;fp=t%2F746sybase.t;h=430d5a4ff42eac397263b84a80700468bdb0fe19;hb=0a9a9955657da2985e7f564e16389cfcd7f15ed5;hp=0c1130ccec69832604e3794180f4ea06a256d97b;hpb=689819e14e9e6245000c64ece46ddd1bc8293bf5;p=dbsrgits%2FDBIx-Class.git diff --git a/t/746sybase.t b/t/746sybase.t index 0c1130c..430d5a4 100644 --- a/t/746sybase.t +++ b/t/746sybase.t @@ -12,7 +12,7 @@ require DBIx::Class::Storage::DBI::Sybase::NoBindVars; my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_SYBASE_${_}" } qw/DSN USER PASS/}; -my $TESTS = 51 + 2; +my $TESTS = 58 + 2; if (not ($dsn && $user)) { plan skip_all => @@ -208,8 +208,7 @@ SQL name => { -like => 'bulk artist %' } }); -# test insert_bulk using populate, this should always pass whether or not it -# does anything Sybase specific or not. Just here to aid debugging. +# test insert_bulk using populate. SKIP: { skip 'insert_bulk not supported', 4 unless $schema->storage->_can_insert_bulk; @@ -245,6 +244,53 @@ SQL $bulk_rs->delete; } +# 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; + + lives_ok { + $schema->resultset('Artist')->populate([ + { + name => 'bulk artist 1', + charfield => 'bar', + }, + { + name => 'bulk artist 2', + charfield => 'bar', + }, + { + name => 'bulk artist 3', + charfield => 'bar', + }, + ]); + } 'insert_bulk via populate called a second time'; + + is $bulk_rs->count, 3, + 'correct number inserted via insert_bulk'; + + is ((grep $_->charfield eq 'bar', $bulk_rs->all), 3, + 'column set correctly via insert_bulk'); + + $bulk_rs->delete; + } + +# test invalid insert_bulk (missing required column) +# +# There should be a rollback, reconnect and the next valid insert_bulk should +# succeed. + throws_ok { + $schema->resultset('Artist')->populate([ + { + charfield => 'foo', + } + ]); + } qr/no value or default|does not allow null|placeholders/i, +# The second pattern is the error from fallback to regular array insert on +# incompatible charset. +# The third is for ::NoBindVars with no syb_has_blk. + 'insert_bulk with missing required column throws error'; + # now test insert_bulk with IDENTITY_INSERT SKIP: { skip 'insert_bulk not supported', 3 @@ -290,7 +336,7 @@ SQL # mostly stolen from the blob stuff Nniuq wrote for t/73oracle.t SKIP: { - skip 'TEXT/IMAGE support does not work with FreeTDS', 15 + skip 'TEXT/IMAGE support does not work with FreeTDS', 18 if $schema->storage->using_freetds; my $dbh = $schema->storage->_dbh; @@ -302,7 +348,7 @@ SQL CREATE TABLE bindtype_test ( id INT IDENTITY PRIMARY KEY, - bytea INT NULL, + bytea IMAGE NULL, blob IMAGE NULL, clob TEXT NULL ) @@ -327,34 +373,30 @@ SQL foreach my $size (qw(small large)) { no warnings 'uninitialized'; - my $created = eval { $rs->create( { $type => $binstr{$size} } ) }; - ok(!$@, "inserted $size $type without dying"); - diag $@ if $@; + my $created; + lives_ok { + $created = $rs->create( { $type => $binstr{$size} } ) + } "inserted $size $type without dying"; $last_id = $created->id if $created; - my $got = eval { - $rs->find($last_id)->$type - }; - diag $@ if $@; - ok($got eq $binstr{$size}, "verified inserted $size $type"); + lives_and { + ok($rs->find($last_id)->$type eq $binstr{$size}) + } "verified inserted $size $type"; } } - # blob insert with explicit PK - # also a good opportunity to test IDENTITY_INSERT - $rs->delete; - my $created = eval { $rs->create( { id => 1, blob => $binstr{large} } ) }; - ok(!$@, "inserted large blob without dying with manual PK"); - diag $@ if $@; + # blob insert with explicit PK + # also a good opportunity to test IDENTITY_INSERT + lives_ok { + $rs->create( { id => 1, blob => $binstr{large} } ) + } 'inserted large blob without dying with manual PK'; - my $got = eval { - $rs->find(1)->blob - }; - diag $@ if $@; - ok($got eq $binstr{large}, "verified inserted large blob with manual PK"); + lives_and { + ok($rs->find(1)->blob eq $binstr{large}) + } 'verified inserted large blob with manual PK'; # try a blob update my $new_str = $binstr{large} . 'mtfnpy'; @@ -365,14 +407,13 @@ SQL $schema = get_schema(); } - eval { $rs->search({ id => 1 })->update({ blob => $new_str }) }; - ok !$@, 'updated blob successfully'; - diag $@ if $@; - $got = eval { - $rs->find(1)->blob - }; - diag $@ if $@; - ok($got eq $new_str, "verified updated blob"); + lives_ok { + $rs->search({ id => 1 })->update({ blob => $new_str }) + } 'updated blob successfully'; + + lives_and { + ok($rs->find(1)->blob eq $new_str) + } 'verified updated blob'; # try a blob update with IDENTITY_UPDATE lives_and { @@ -383,11 +424,38 @@ SQL ## try multi-row blob update # first insert some blobs - $rs->delete; - $rs->create({ blob => $binstr{large} }) for (1..3); $new_str = $binstr{large} . 'foo'; - $rs->update({ blob => $new_str }); - is((grep $_->blob eq $new_str, $rs->all), 3, 'multi-row blob update'); + lives_and { + $rs->delete; + $rs->create({ blob => $binstr{large} }) for (1..2); + $rs->update({ blob => $new_str }); + is((grep $_->blob eq $new_str, $rs->all), 2); + } 'multi-row blob update'; + + $rs->delete; + + # now try insert_bulk with blobs + $new_str = $binstr{large} . 'bar'; + lives_ok { + $rs->populate([ + { + bytea => 1, + blob => $binstr{large}, + clob => $new_str, + }, + { + bytea => 1, + blob => $binstr{large}, + clob => $new_str, + }, + ]); + } 'insert_bulk with blobs does not die'; + + is((grep $_->blob eq $binstr{large}, $rs->all), 2, + 'IMAGE column set correctly via insert_bulk'); + + is((grep $_->clob eq $new_str, $rs->all), 2, + 'TEXT column set correctly via insert_bulk'); # make sure impossible blob update throws throws_ok {