Fix ::Sybase::ASE incorrect attempt to retrieve an autoinc on blob inserts
[dbsrgits/DBIx-Class.git] / t / 746sybase.t
index 540ca78..0b8406c 100644 (file)
@@ -6,6 +6,8 @@ no warnings 'uninitialized';
 
 use Test::More;
 use Test::Exception;
+use DBIx::Class::_Util 'sigwarn_silencer';
+
 use lib qw(t/lib);
 use DBICTest;
 
@@ -13,11 +15,8 @@ my @storage_types = (
   'DBI::Sybase::ASE',
   'DBI::Sybase::ASE::NoBindVars',
 );
-eval "require DBIx::Class::Storage::$_;" or die $@
-  for @storage_types;
 
 my $schema;
-my $storage_idx = -1;
 
 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_SYBASE_${_}" } qw/DSN USER PASS/};
 
@@ -31,6 +30,7 @@ sub get_schema {
 
 my $ping_count = 0;
 {
+  require DBIx::Class::Storage::DBI::Sybase::ASE;
   my $ping = DBIx::Class::Storage::DBI::Sybase::ASE->can('_ping');
   *DBIx::Class::Storage::DBI::Sybase::ASE::_ping = sub {
     $ping_count++;
@@ -39,7 +39,6 @@ my $ping_count = 0;
 }
 
 for my $storage_type (@storage_types) {
-  $storage_idx++;
 
   unless ($storage_type eq 'DBI::Sybase::ASE') { # autodetect
     DBICTest::Schema->storage_type("::$storage_type");
@@ -49,12 +48,12 @@ for my $storage_type (@storage_types) {
 
   $schema->storage->ensure_connected;
 
-  if ($storage_idx == 0 &&
-      $schema->storage->isa('DBIx::Class::Storage::DBI::Sybase::ASE::NoBindVars')) {
-      # no placeholders in this version of Sybase or DBD::Sybase (or using FreeTDS)
-      skip "Skipping entire test for $storage_type - no placeholder support", 1;
-      next;
-  }
+  # we are going to explicitly test this anyway, just loop through
+  next if
+    $storage_type ne 'DBI::Sybase::ASE::NoBindVars'
+      and
+    $schema->storage->isa('DBIx::Class::Storage::DBI::Sybase::ASE::NoBindVars')
+  ;
 
   isa_ok( $schema->storage, "DBIx::Class::Storage::$storage_type" );
 
@@ -205,6 +204,10 @@ SQL
       unless $storage_type !~ /NoBindVars/i;
 
     lives_ok {
+
+      local $SIG{__WARN__} = sigwarn_silencer(qr/Sybase bulk API operation failed due to character set incompatibility/)
+        unless $ENV{DBICTEST_SYBASE_SUBTEST_RERUN};
+
       $schema->resultset('Artist')->populate([
         {
           name => 'bulk artist 1',
@@ -269,6 +272,9 @@ SQL
 # test invalid _insert_bulk (missing required column)
 #
   throws_ok {
+    local $SIG{__WARN__} = sigwarn_silencer(qr/Sybase bulk API operation failed due to character set incompatibility/)
+      unless $ENV{DBICTEST_SYBASE_SUBTEST_RERUN};
+
     $schema->resultset('Artist')->populate([
       {
         charfield => 'foo',
@@ -495,6 +501,13 @@ SQL
       $rs->update({ blob => undef });
       is((grep !defined($_->blob), $rs->all), 2);
     } 'blob update to NULL';
+
+    lives_ok {
+      $schema->txn_do(sub {
+        my $created = $rs->create( { clob => "some text" } );
+      });
+    } 'insert blob field in transaction';
+    $ping_count-- if $@; # failure retry triggers a ping
   }
 
 # test MONEY column support (and some other misc. stuff)
@@ -605,12 +618,13 @@ SQL
 
 is $ping_count, 0, 'no pings';
 
-# if tests passed and did so under a non-C lang - let's rerun the test
-if (Test::Builder->new->is_passing and $ENV{LANG} and $ENV{LANG} ne 'C') {
-  my $oldlang = $ENV{LANG};
-  local $ENV{LANG} = 'C';
+# if tests passed and did so under a non-C LC_ALL - let's rerun the test
+if (Test::Builder->new->is_passing and $ENV{LC_ALL} and $ENV{LC_ALL} ne 'C') {
+
+  pass ("Your LC_ALL is set to $ENV{LC_ALL} - retesting with C");
 
-  pass ("Your lang is set to $oldlang - retesting with C");
+  local $ENV{LC_ALL} = 'C';
+  local $ENV{DBICTEST_SYBASE_SUBTEST_RERUN} = 1;
 
   local $ENV{PATH};
   my @cmd = map { $_ =~ /(.+)/ } ($^X, __FILE__);