Author: REHSACK
Date: Tue Jun 15 02:54:14 2010
New Revision: 14150

Modified:
   dbi/trunk/lib/DBD/DBM.pm
   dbi/trunk/lib/DBD/File.pm

Log:
- Improve DBD::File::db::get_versions and retrieve additional info from
  derived ImplementorClass
- Remove depreciated DBD::DBM::dbm_versions stub


Modified: dbi/trunk/lib/DBD/DBM.pm
==============================================================================
--- dbi/trunk/lib/DBD/DBM.pm    (original)
+++ dbi/trunk/lib/DBD/DBM.pm    Tue Jun 15 02:54:14 2010
@@ -47,7 +47,6 @@
     #
     unless ( $methods_already_installed++ )
     {
-        DBD::DBM::db->install_method('dbm_versions');
         DBD::DBM::st->install_method('dbm_schema');
     }
 
@@ -229,38 +228,36 @@
     return $dbh;
 }
 
-# this is an example of a private method
-# these used to be done with $dbh->func(...)
-# see above in the driver() sub for how to install the method
-#
-sub dbm_versions
-{
-    my $class = $_[0]->FETCH ("ImplementorClass");
-    my $get_versions = $class->can( 'get_versions' );
-    goto &$get_versions;
-}
-
-sub get_versions
+sub get_dbm_versions
 {
     my ($dbh, $table) = @_;
     $table ||= '';
-    my @versions = $dbh->SUPER::get_versions( $table );
-
-    # update first line (optical)
-    my $dbdfv = shift @versions;
-    my ($pkg, $info) = split( /\s+/, $dbdfv, 2 );
-    unshift (@versions, sprintf ("%-16s %s", '  ' . $pkg, $info ));
 
     my $class = $dbh->FETCH ("ImplementorClass");
     $class =~ s/::db$/::Table/;
     my (undef, $meta) = $class->get_table_meta( $dbh, $table, 1 );
     $meta or ( $meta = {} and $class->bootstrap_table_meta( $dbh, $meta, 
$table ) );
 
+    my $dver;
+    my $eval_str;
+    $eval_str = sprintf( '$dver = $%s::VERSION', $meta->{dbm_type} );
+    eval $eval_str;
     my $dtype = $meta->{dbm_type};
-    $dtype .= ' + MLDBM + ' . $meta->{dbm_mldbm} if( $meta->{dbm_mldbm} );
-    unshift( @versions, sprintf( "%-16s %s using %s", 'DBD::DBM', 
$dbh->{dbm_version}, $dtype ) );
-
-    return wantarray ? @versions : join ("\n", @versions);
+    $dtype .= ' (' . $dver . ')' if $dver;
+    if( $meta->{dbm_mldbm} )
+    {
+       $dtype .= ' + MLDBM';
+       $eval_str = '$dver = $MLDBM::VERSION';
+       eval $eval_str;
+       $dtype .= ' (' . $dver . ')' if $dver;
+       $dtype .= ' + ' . $meta->{dbm_mldbm};
+       $eval_str = sprintf( 'require MLDBM::Serializer::%s;' .
+                            '$dver = $MLDBM::Serializer::%s::VERSION',
+                            $meta->{dbm_mldbm}, $meta->{dbm_mldbm} );
+       eval $eval_str;
+       $dtype .= ' (' . $dver . ')' if $dver;
+    }
+    return sprintf( "%s using %s", $dbh->{dbm_version}, $dtype );
 }
 
 # you may need to over-ride some DBD::File::db methods here

Modified: dbi/trunk/lib/DBD/File.pm
==============================================================================
--- dbi/trunk/lib/DBD/File.pm   (original)
+++ dbi/trunk/lib/DBD/File.pm   Tue Jun 15 02:54:14 2010
@@ -501,21 +501,41 @@
 
 sub get_versions
 {
-    my $dbh = $_[0];
+    my ($dbh, $table) = @_;
     my %vsn = (
        OS              => "$^O ($Config::Config{osvers})",
        Perl            => "$] ($Config::Config{archname})",
        DBI             => $DBI::VERSION,
-
-       "DBD::File"     => join " ",
-           $dbh->{f_version}, "using", $dbh->{sql_handler},
-           $dbh->{sql_handler} eq "SQL::Statement"
-               ? $dbh->{sql_statement_version}
-               : $dbh->{sql_nano_version},
        );
+    my %vmp;
+
+    my $dbd_file_verinfo = join " ",
+       $dbh->{f_version}, "using", $dbh->{sql_handler},
+       $dbh->{sql_handler} eq "SQL::Statement"
+           ? $dbh->{sql_statement_version}
+           : $dbh->{sql_nano_version};
+
+    (my $drv_class = $dbh->{ImplementorClass}) =~ s/::db$//;
+    my $drv_prefix = DBI->driver_prefix ($drv_class);
+    my $ddgv = $dbh->{ImplementorClass}->can( "get_" . $drv_prefix . 
"versions" );
+    if ($ddgv) {
+       $vsn{"DBD::File"} = $dbd_file_verinfo;
+       $vmp{"DBD::File"} = "  DBD::File";
+       $vsn{$drv_class}  = &$ddgv ($dbh, $table);
+       }
+    else {
+       $vsn{"DBD::File"} = $dbd_file_verinfo;
+       }
+
     $DBI::PurePerl and $vsn{"DBI::PurePerl"} = $DBI::PurePerl::VERSION;
 
-    my @versions = map { sprintf "%-16s %s", $_, $vsn{$_} } sort keys %vsn;
+    my @versions = map { sprintf "%-16s %s", $vmp{$_} || $_, $vsn{$_} }
+                  sort
+                  {
+                      $a->isa ($b) and return -1;
+                      $b->isa ($a) and return 1;
+                      return $a cmp $b;
+                      } keys %vsn;
 
     return wantarray ? @versions : join "\n", @versions;
     } # get_versions

Reply via email to