use strict;
use warnings;
use Test::More ;
use DBI;
use DBI::Const::GetInfoType;
$|= 1;
use vars qw($test_dsn $test_user $test_password);
use lib 't', '.';
require 'lib.pl';
my $dbh = eval { DBI->connect($test_dsn, $test_user, $test_password, { RaiseError => 1, PrintError => 0, AutoCommit => 0 }) };
if (not defined $dbh) {
my $err = $@;
$err = "unknown error" unless $err;
if ( $ENV{CONNECTION_TESTING} ) {
BAIL_OUT "no database connection: $err";
} else {
plan skip_all => "no database connection: $err";
}
}
ok(defined $dbh, "Connected to database");
for my $attribute ( qw(
mariadb_clientinfo
mariadb_clientversion
mariadb_serverversion
mariadb_hostinfo
mariadb_serverinfo
mariadb_stat
mariadb_protoinfo
) ) {
ok($dbh->{$attribute}, "Value of '$attribute'");
diag "$attribute is: ". $dbh->{$attribute};
}
my $sql_dbms_name = $dbh->get_info($GetInfoType{SQL_DBMS_NAME});
like($sql_dbms_name, qr/^MariaDB$|^MySQL$/, 'get_info SQL_DBMS_NAME is MariaDB or MySQL');
diag "SQL_DBMS_NAME is $sql_dbms_name";
my $sql_dbms_ver = $dbh->get_info($GetInfoType{SQL_DBMS_VER});
like($sql_dbms_ver, qr/^\d{2}\.\d{2}\.\d{4}$/, 'get_info SQL_DBMS_VER like ##.##.####');
diag "SQL_DBMS_VER is $sql_dbms_ver";
my $sql_server_name = $dbh->get_info($GetInfoType{SQL_SERVER_NAME});
ok(defined $sql_server_name, 'get_info SQL_SERVER_NAME');
diag "SQL_SERVER_NAME is $sql_server_name";
my $driver_ver = $dbh->get_info($GetInfoType{SQL_DRIVER_VER});
like(
$driver_ver,
qr/^\d{2}\.\d{2}\.\d{4}$/,
'get_info SQL_DRIVER_VER like ##.##.####'
);
diag "SQL_DRIVER_VER is $driver_ver";
# The variable name for MySQL's storage engine function has varied over time
#
# From MySQL version 3.23.0 until 4.1.2: @@table_type
# removed in 5.5.0
# https://downloads.mysql.com/docs/refman-4.1-en.a4.pdf
#
# From MySQL version 4.1.2 until 5.5.3: @@storage_engine
# removed in 5.7.5
# http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_storage_engine
#
# From MySQL version 5.5.3: @@default_storage_engine
# http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_storage_engine
my $storage_engine = '@@default_storage_engine';
if ($dbh->{mariadb_serverversion} < 40102) {
$storage_engine = '@@table_type';
} elsif ($dbh->{mariadb_serverversion} < 50503) {
$storage_engine = '@@storage_engine';
}
my $result = $dbh->selectall_arrayref('select ' . $storage_engine);
my $default_storage_engine = $result->[0]->[0] || 'unknown';
diag "Default storage engine is: $default_storage_engine";
my $res = $dbh->selectrow_hashref('SELECT @@character_set_client, @@character_set_results, @@character_set_connection, @@character_set_server, @@character_set_database, @@collation_connection, @@collation_server, @@collation_database');
foreach (sort keys %{$res}) {
like($res->{$_}, qr/^utf8/, "Value of $_ is UTF-8");
diag("$_ is: ". $res->{$_});
}
my $info_hashref = $dbh->{mariadb_dbd_stats};
ok(defined $info_hashref, "Value of 'mariadb_dbd_stats'");
foreach (sort keys %{$info_hashref}) {
diag("$_ is: ". $info_hashref->{$_});
}
SKIP: {
skip $dbh->errstr(), 2 unless eval { $dbh->do('SHOW GRANTS') };
skip 'Server accepts connections with invalid user/password', 2
if eval { DBI->connect($test_dsn, '4yZ73s9qeECdWi', '64heUGwAsVoNqo', { RaiseError => 1, PrintError => 0 }) };
# dbi docs state:
# The username and password can also be specified using the attributes
# Username and Password, in which case they take precedence over the $username
# and $password parameters.
# see https://rt.cpan.org/Ticket/Display.html?id=89835
my $failed = not eval { DBI->connect($test_dsn, $test_user, $test_password,
{ RaiseError => 1, PrintError => 0, AutoCommit => 0,
Username => '4yZ73s9qeECdWi', Password => '64heUGwAsVoNqo' });};
ok($failed, 'Username and Password attributes override');
my $success = eval { DBI->connect($test_dsn, '4yZ73s9qeECdWi', '64heUGwAsVoNqo',
{ RaiseError => 1, PrintError => 0, AutoCommit => 0,
Username => $test_user, Password => $test_password });};
ok($success, 'Username and Password attributes override') or diag(DBI->errstr());
}
ok($dbh->disconnect(), 'Disconnected');
done_testing;