+use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_rdbms_ase';
+
use strict;
use warnings;
no warnings 'uninitialized';
use Test::More;
use Test::Exception;
-use DBIx::Class::Optional::Dependencies ();
+use DBIx::Class::_Util 'sigwarn_silencer';
+
use lib qw(t/lib);
use DBICTest;
-my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_SYBASE_${_}" } qw/DSN USER PASS/};
-if (not ($dsn && $user)) {
- plan skip_all => join ' ',
- 'Set $ENV{DBICTEST_SYBASE_DSN}, _USER and _PASS to run this test.',
- 'Warning: This test drops and creates the tables:',
- "'artist', 'money_test' and 'bindtype_test'",
- ;
-};
-
-plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('test_rdbms_ase')
- unless DBIx::Class::Optional::Dependencies->req_ok_for ('test_rdbms_ase');
-
my @storage_types = (
'DBI::Sybase::ASE',
'DBI::Sybase::ASE::NoBindVars',
);
-eval "require DBIx::Class::Storage::$_;" for @storage_types;
my $schema;
-my $storage_idx = -1;
+
+my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_SYBASE_${_}" } qw/DSN USER PASS/};
sub get_schema {
DBICTest::Schema->connect($dsn, $user, $pass, {
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++;
}
for my $storage_type (@storage_types) {
- $storage_idx++;
unless ($storage_type eq 'DBI::Sybase::ASE') { # autodetect
DBICTest::Schema->storage_type("::$storage_type");
$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" );
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',
# test invalid _insert_bulk (missing required column)
#
-# There should be a rollback, reconnect and the next valid _insert_bulk should
-# succeed.
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',
}
]);
- } 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.
+ qr/
+ \Qno value or default\E
+ |
+ \Qdoes not allow null\E
+ |
+ \QUnable to invoke fast-path insert without storage placeholder support\E
+ /xi,
'_insert_bulk with missing required column throws error';
# now test _insert_bulk with IDENTITY_INSERT
id INT IDENTITY PRIMARY KEY,
bytea IMAGE NULL,
blob IMAGE NULL,
- blob2 IMAGE NULL,
clob TEXT NULL,
- clob2 TEXT NULL,
a_memo IMAGE NULL
)
],{ RaiseError => 1, PrintError => 0 });
$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)
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__);