X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI.pm;h=f24a9e126525bb395bad10e42a1ae8818677cf9c;hb=fecb38cba68186d579ef96f89bf6ce557e55ab1c;hp=4a94e2c85fb42dfeb4deed20bd0fe365cebe38de;hpb=88704779cb6018a9680c15f8c1bc1e1285985595;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 4a94e2c..f24a9e1 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -19,7 +19,7 @@ use Sub::Name (); __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 @@ -36,7 +36,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'); @@ -93,7 +93,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 @@ -908,6 +908,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($$); @@ -920,8 +921,6 @@ sub _populate_dbh { $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 { @@ -934,32 +933,46 @@ 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 {