my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_SYBASE_${_}" } qw/DSN USER PASS/};
-my $TESTS = 35 + 2;
+my $TESTS = 37 + 2;
if (not ($dsn && $user)) {
plan skip_all =>
my $schema;
my $storage_idx = -1;
+sub get_schema {
+ DBICTest::Schema->connect($dsn, $user, $pass, {
+ on_connect_call => [
+ [ blob_setup => log_on_update => 1 ], # this is a safer option
+ ],
+ });
+}
+
for my $storage_type (@storage_types) {
$storage_idx++;
-# this is so we can set ->storage_type before connecting
- my $schema = DBICTest::Schema->clone;
unless ($storage_type eq 'DBI::Sybase') { # autodetect
- $schema->storage_type("::$storage_type");
+ DBICTest::Schema->storage_type("::$storage_type");
}
- $schema->connection($dsn, $user, $pass, {
- AutoCommit => 1,
- on_connect_call => [
- [ blob_setup => log_on_update => 1 ], # this is a safer option
- ],
- });
+ $schema = get_schema();
$schema->storage->ensure_connected;
# so we start unconnected
$schema->storage->disconnect;
-# inserts happen in a txn, so we make sure it still works inside a txn too
- $schema->txn_begin;
-
# test primary key handling
my $new = $schema->resultset('Artist')->create({ name => 'foo' });
ok($new->artistid > 0, "Auto-PK worked");
$seen_id{$new->artistid}++;
- for (1..6) {
+# check redispatch to storage-specific insert when auto-detected storage
+ if ($storage_type eq 'DBI::Sybase') {
+ DBICTest::Schema->storage_type('::DBI');
+ $schema = get_schema();
+ }
+
+ $new = $schema->resultset('Artist')->create({ name => 'Artist 1' });
+ is ( $seen_id{$new->artistid}, undef, 'id for Artist 1 is unique' );
+ $seen_id{$new->artistid}++;
+
+# inserts happen in a txn, so we make sure it still works inside a txn too
+ $schema->txn_begin;
+
+ for (2..6) {
$new = $schema->resultset('Artist')->create({ name => 'Artist ' . $_ });
is ( $seen_id{$new->artistid}, undef, "id for Artist $_ is unique" );
$seen_id{$new->artistid}++;
is( $it->count, 7, 'COUNT of GROUP_BY ok' );
+# do an identity insert (which should happen with no txn when using
+# placeholders.)
+ {
+ no warnings 'redefine';
+ my @debug_out;
+ local *DBIx::Class::Storage::DBI::_query_start = sub {
+ push @debug_out, $_[1];
+ };
+
+ my $txn_used = 0;
+ my $txn_commit = \&DBIx::Class::Storage::DBI::txn_commit;
+ local *DBIx::Class::Storage::DBI::txn_commit = sub {
+ $txn_used = 1;
+ goto &$txn_commit;
+ };
+
+ $schema->resultset('Artist')
+ ->create({ artistid => 999, name => 'mtfnpy' });
+
+ ok((grep /IDENTITY_INSERT/i, @debug_out), 'IDENTITY_INSERT');
+
+ SKIP: {
+ skip 'not testing lack of txn on IDENTITY_INSERT with NoBindVars', 1
+ if $storage_type =~ /NoBindVars/i;
+
+ is $txn_used, 0, 'no txn on insert with IDENTITY_INSERT';
+ }
+ }
+
# mostly stolen from the blob stuff Nniuq wrote for t/73oracle.t
SKIP: {
skip 'TEXT/IMAGE support does not work with FreeTDS', 12
# try a blob update
my $new_str = $binstr{large} . 'mtfnpy';
+
+ # check redispatch to storage-specific update when auto-detected storage
+ if ($storage_type eq 'DBI::Sybase') {
+ DBICTest::Schema->storage_type('::DBI');
+ $schema = get_schema();
+ }
+
eval { $rs->search({ id => 1 })->update({ blob => $new_str }) };
ok !$@, 'updated blob successfully';
diag $@ if $@;