Tie-Hash-DBD
view release on metacpan or search on metacpan
#!/pro/bin/perl
use strict;
use warnings;
use Encode qw( encode decode );
my $data;
sub _bindata {
$data ||= pack "LA20A*", time, "#sys", encode "UTF-8", "Value \x{20ac}";
return $data;
} # _bindata
my $tempdb;
sub _dsn {
my $type = shift;
$type eq "Pg" and return "dbi:Pg:";
my $rnd = sprintf "%d_%04d", $$, (time + int rand 10000) % 10000;
if ($type eq "SQLite") {
$tempdb = "db_$rnd.3";
unlink $tempdb;
# return "dbi:SQLite:dbname=:memory:";
return "dbi:SQLite:dbname=$tempdb";
}
if ($type eq "CSV") {
my $xsv = eval q{use Text::CSV_XS; $Text::CSV_XS::VERSION; } || 0;
my $dbv = eval q{use DBD::CSV; $DBD::CSV::VERSION; } || 0;
$tempdb = "csv_$rnd";
mkdir $tempdb, 0777;
my $dsn = "dbi:CSV:f_dir=$tempdb;f_ext=.csv/r;csv_null=1";
$xsv > 1.01 && $dbv > 0.47 and $dsn .= ";csv_decode_utf8=0";
$dbv > 0.29 && $] < 5.008009 and $dsn .= ";csv_auto_diag=0";
return $dsn;
}
# We assume user "0" is illegal
my $user = $ENV{LOGNAME} || $ENV{USER};
$user ||= getpwuid $< unless $^O eq "MSWin32";
$user ||= "";
if ($type eq "Oracle") {
my @id = split m{/} => ($ENV{ORACLE_USERID} || "/"), -1;
$ENV{DBI_USER} = $id[0];
$ENV{DBI_PASS} = $id[1];
($ENV{ORACLE_SID} || $ENV{TWO_TASK}) &&
-d ($ENV{ORACLE_HOME} || "/-..\x03") &&
$ENV{DBI_USER} && $ENV{DBI_PASS} or
plan skip_all => "Not a testable Oracle env";
return "dbi:Oracle:";
}
if ($type eq "mysql" || $type eq "MariaDB") {
my $db = $ENV{MYSQLDB} || $user or
plan skip_all => "Not a testable MariaDB/MySQL env";
$ENV{DBI_USER} ||= $ENV{MYSQLUSER} || $user;
return "dbi:$type:database=$db";
}
if ($type eq "Unify") {
$ENV{DBI_USER} = $ENV{USCHEMA} || "";
-d ($ENV{UNIFY} || "/-..\x03") &&
-d ($ENV{DBPATH} || "/-..\x03") or
plan skip_all => "Not a testable Unify env";
return "dbi:Unify:";
}
if ($type eq "Firebird") {
# use flamerobin for DB administration
# Default pass for SYSDBA is "masterkey"
# I gave up on this. Too hard to make it work. Connection always fails
$ENV{ISC_USER} ||= "SYSDBA";
$ENV{ISC_PASSWORD} ||= "masterkey";
$ENV{ISC_DATABASE} ||= ""; # Prevent warnings in Firebird.pm
$ENV{DBI_USER} = $ENV{ISC_USER};
$ENV{DBI_PASS} = $ENV{ISC_PASSWORD};
return "dbi:Firebird:";
}
} # _dsn
sub dsn {
my $type = shift;
cleanup ($type);
return _dsn ($type);
} # dsn
sub plan_fail {
my $type = shift;
my $reason = DBI->errstr;
$reason or ($reason = $@) =~ s/:.*//s;
if ($type eq "Pg") {
# could not connect to server: No such file or directory
# \tIs the server running locally and accepting
# \tconnections on Unix do ...
$reason =~ s{: No such file or directory(\r?\n.*)?$}{}s;
# could not connect to server: Connection refused (0x0000274D/10061)
( run in 1.191 second using v1.01-cache-2.11-cpan-39bf76dae61 )