use Data::Dumper::Concise();
use Sub::Name ();
+use File::Path ();
+
__PACKAGE__->mk_group_accessors('simple' =>
qw/_connect_info _dbi_connect_info _dbh _sql_maker _sql_maker_opts _conn_pid
_conn_tid transaction_depth _dbh_autocommit _driver_determined savepoints
- __server_info/
+ _server_info_hash/
);
# the values for these accessors are picked out (and deleted) from
my @info = @{$self->_dbi_connect_info || []};
$self->_dbh(undef); # in case ->connected failed we might get sent here
+ $self->_server_info_hash (undef);
$self->_dbh($self->_connect(@info));
$self->_conn_pid($$);
$self->{transaction_depth} = $self->_dbh_autocommit ? 0 : 1;
$self->_run_connection_actions unless $self->{_in_determine_driver};
-
- $self->_populate_server_info;
}
sub _run_connection_actions {
$self->_do_connection_actions(connect_call_ => $_) for @actions;
}
-sub _populate_server_info {
+sub _server_info {
my $self = shift;
- my %info;
- my $dbms_ver = eval {
- local $@;
- $self->_get_dbh->get_info(18)
- };
+ unless ($self->_server_info_hash) {
- if (defined $dbms_ver) {
- $info{dbms_ver} = $dbms_ver;
+ my %info;
- ($dbms_ver) = $dbms_ver =~ /^(\S+)/;
+ my $server_version = $self->_get_server_version;
- my @verparts = split /\./, $dbms_ver;
- $info{dbms_ver_normalized} = sprintf "%d.%03d%03d", @verparts;
- }
+ if (defined $server_version) {
+ $info{dbms_version} = $server_version;
- $self->__server_info(\%info);
+ my ($numeric_version) = $server_version =~ /^([\d\.]+)/;
+ my @verparts = split (/\./, $numeric_version);
+ if (
+ @verparts
+ &&
+ $verparts[0] <= 999
+ ) {
+ # consider only up to 3 version parts, iff not more than 3 digits
+ my @use_parts;
+ while (@verparts && @use_parts < 3) {
+ my $p = shift @verparts;
+ last if $p > 999;
+ push @use_parts, $p;
+ }
+ push @use_parts, 0 while @use_parts < 3;
- return \%info;
-}
+ $info{normalized_dbms_version} = sprintf "%d.%03d%03d", @use_parts;
+ }
+ }
-sub _server_info {
- my $self = shift;
+ $self->_server_info_hash(\%info);
+ }
- $self->_get_dbh;
+ return $self->_server_info_hash
+}
- return $self->__server_info(@_);
+sub _get_server_version {
+ eval { shift->_get_dbh->get_info(18) };
}
sub _determine_driver {
# try to use dsn to not require being connected, the driver may still
# force a connection in _rebless to determine version
# (dsn may not be supplied at all if all we do is make a mock-schema)
- my $dsn = $self->_dbi_connect_info->[0] || '';
+ my $dsn = $self->_dbi_connect_info->[0] || $ENV{DBI_DSN} || '';
($driver) = $dsn =~ /dbi:([^:]+):/i;
+ $driver ||= $ENV{DBI_DRIVER};
}
}
unless ($dir) {
carp "No directory given, using ./\n";
$dir = './';
+ } else {
+ -d $dir or File::Path::mkpath($dir)
+ or croak "create_ddl_dir: could not create dir '$dir'";
}
$self->throw_exception ("Directory '$dir' does not exist\n") unless(-d $dir);