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;