use strict;
use warnings;
use Test::More;
use Data::Dumper::Concise;
use Try::Tiny;
use lib qw(t/lib);
use DBICTest;
my %expected = (
'DBIx::Class::Storage::DBI' =>
# no default quote_char
{ name_sep => '.' },
'DBIx::Class::Storage::DBI::MSSQL' =>
{ quote_char => [ '[', ']' ], name_sep => '.' },
'DBIx::Class::Storage::DBI::DB2' =>
{ quote_char => '"', name_sep => '.' },
'DBIx::Class::Storage::DBI::Informix' =>
{ quote_char => '"', name_sep => '.' },
'DBIx::Class::Storage::DBI::InterBase' =>
{ quote_char => '"', name_sep => '.' },
'DBIx::Class::Storage::DBI::mysql' =>
{ quote_char => '`', name_sep => '.' },
'DBIx::Class::Storage::DBI::Pg' =>
{ quote_char => '"', name_sep => '.' },
'DBIx::Class::Storage::DBI::ODBC::ACCESS' =>
{ quote_char => [ '[', ']' ], name_sep => '.' },
# Not testing this one, it's a pain.
# 'DBIx::Class::Storage::DBI::ODBC::DB2_400_SQL' =>
# { quote_char => '"', name_sep => qr/must be connected/ },
'DBIx::Class::Storage::DBI::Oracle::Generic' =>
{ quote_char => '"', name_sep => '.' },
'DBIx::Class::Storage::DBI::SQLAnywhere' =>
{ quote_char => '"', name_sep => '.' },
'DBIx::Class::Storage::DBI::SQLite' =>
{ quote_char => '"', name_sep => '.' },
'DBIx::Class::Storage::DBI::Sybase::ASE' =>
{ quote_char => [ '[', ']' ], name_sep => '.' },
);
for my $class (keys %expected) { SKIP: {
eval "require ${class}"
or skip "Skipping test of quotes for $class due to missing dependencies", 1;
my $mapping = $expected{$class};
my ($quote_char, $name_sep) = @$mapping{qw/quote_char name_sep/};
my $instance = $class->new;
my $quote_char_text = dumper($quote_char);
if (exists $mapping->{quote_char}) {
is_deeply $instance->sql_quote_char, $quote_char,
"sql_quote_char for $class is $quote_char_text";
}
is $instance->sql_name_sep, $name_sep,
"sql_name_sep for $class is '$name_sep'";
}}
# Try quote_names with available DBs.
# Env var to base class mapping, these are the DBs I actually have.
# the SQLITE is a fake memory dsn
local $ENV{DBICTEST_SQLITE_DSN} = 'dbi:SQLite::memory:';
my %dbs = (
SQLITE => 'DBIx::Class::Storage::DBI::SQLite',
ORA => 'DBIx::Class::Storage::DBI::Oracle::Generic',
PG => 'DBIx::Class::Storage::DBI::Pg',
MYSQL => 'DBIx::Class::Storage::DBI::mysql',
DB2 => 'DBIx::Class::Storage::DBI::DB2',
SYBASE => 'DBIx::Class::Storage::DBI::Sybase::ASE',
SQLANYWHERE => 'DBIx::Class::Storage::DBI::SQLAnywhere',
SQLANYWHERE_ODBC => 'DBIx::Class::Storage::DBI::SQLAnywhere',
FIREBIRD => 'DBIx::Class::Storage::DBI::InterBase',
FIREBIRD_ODBC => 'DBIx::Class::Storage::DBI::InterBase',
INFORMIX => 'DBIx::Class::Storage::DBI::Informix',
MSSQL_ODBC => 'DBIx::Class::Storage::DBI::MSSQL',
);
# lie that we already locked stuff - the tests below do not touch anything
$ENV{DBICTEST_LOCK_HOLDER} = -1;
# Make sure oracle is tried last - some clients (e.g. 10.2) have symbol
# clashes with libssl, and will segfault everything coming after them
for my $db (sort {
$a eq 'ORA' ? 1
: $b eq 'ORA' ? -1
: $a cmp $b
} keys %dbs) {
my ($dsn, $user, $pass) = map $ENV{"DBICTEST_${db}_$_"}, qw/DSN USER PASS/;
next unless $dsn;
my $schema;
try {
$schema = DBICTest::Schema->connect($dsn, $user, $pass, {
quote_names => 1
});
$schema->storage->ensure_connected;
1;
} || next;
my ($exp_quote_char, $exp_name_sep) =
@{$expected{$dbs{$db}}}{qw/quote_char name_sep/};
my ($quote_char_text, $name_sep_text) = map { dumper($_) }
($exp_quote_char, $exp_name_sep);
is_deeply $schema->storage->sql_maker->quote_char,
$exp_quote_char,
"$db quote_char with quote_names => 1 is $quote_char_text";
is $schema->storage->sql_maker->name_sep,
$exp_name_sep,
"$db name_sep with quote_names => 1 is $name_sep_text";
}
done_testing;
sub dumper {
my $val = shift;
my $dd = DumperObject;
$dd->Indent(0);
return $dd->Values([ $val ])->Dump;
}
1;