X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI.pm;h=e2d0b41991d7e1c3a8e91a04dea494bf7d056db2;hb=4068e05f67336c92ee83f71cdd86df10beee014e;hp=00c8eb87e2c89f0454d0d16de1aa815aed0e46e0;hpb=38d5ea9f06646beb01422d3d6a2994f1601bf35e;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 00c8eb8..e2d0b41 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -16,9 +16,12 @@ use List::Util(); 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/ + _conn_tid transaction_depth _dbh_autocommit _driver_determined savepoints + _server_info_hash/ ); # the values for these accessors are picked out (and deleted) from @@ -35,7 +38,7 @@ __PACKAGE__->cursor_class('DBIx::Class::Storage::DBI::Cursor'); __PACKAGE__->mk_group_accessors('inherited' => qw/ sql_maker_class - can_insert_returning + _supports_insert_returning /); __PACKAGE__->sql_maker_class('DBIx::Class::SQLAHacks'); @@ -92,7 +95,7 @@ DBIx::Class::Storage::DBI - DBI storage handler ); $schema->resultset('Book')->search({ - written_on => $schema->storage->datetime_parser(DateTime->now) + written_on => $schema->storage->datetime_parser->format_datetime(DateTime->now) }); =head1 DESCRIPTION @@ -907,6 +910,7 @@ sub _populate_dbh { 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($$); @@ -931,6 +935,48 @@ sub _run_connection_actions { $self->_do_connection_actions(connect_call_ => $_) for @actions; } +sub _server_info { + my $self = shift; + + unless ($self->_server_info_hash) { + + my %info; + + my $server_version = $self->_get_server_version; + + if (defined $server_version) { + $info{dbms_version} = $server_version; + + 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; + + $info{normalized_dbms_version} = sprintf "%d.%03d%03d", @use_parts; + } + } + + $self->_server_info_hash(\%info); + } + + return $self->_server_info_hash +} + +sub _get_server_version { + eval { shift->_get_dbh->get_info(18) }; +} + sub _determine_driver { my ($self) = @_; @@ -954,8 +1000,9 @@ 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}; } } @@ -2289,6 +2336,9 @@ sub create_ddl_dir { 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);