Author: REHSACK
Date: Thu Sep 16 13:59:35 2010
New Revision: 14409

Modified:
   dbi/trunk/lib/DBD/File.pm
   dbi/trunk/t/51dbm_file.t

Log:
Fixed issue in DBD::File when users set individual file name for tables
  via f_meta compatibility interface - reported by H.Merijn Brand while
  working on RT#61168

Modified: dbi/trunk/lib/DBD/File.pm
==============================================================================
--- dbi/trunk/lib/DBD/File.pm   (original)
+++ dbi/trunk/lib/DBD/File.pm   Thu Sep 16 13:59:35 2010
@@ -737,21 +737,27 @@
        }
 
     # (my $tbl = $file) =~ s/$ext$//i;
-    my ($tbl, $dir, $user_spec_file);
+    my ($tbl, $basename, $dir, $fn_ext, $user_spec_file);
     if ($file_is_table and defined $meta->{f_file}) {
        $tbl = $file;
-       ($file, $dir, undef) = File::Basename::fileparse ($meta->{f_file});
+       ($basename, $dir, $fn_ext) = File::Basename::fileparse 
($meta->{f_file}, $fn_any_ext_regex);
+       $file = $basename . $fn_ext;
        $user_spec_file = 1;
        }
     else {
-       ($tbl, $dir, undef) = File::Basename::fileparse ($file, $ext);
+       ($basename, $dir, undef) = File::Basename::fileparse ($file, $ext);
+       $file = $tbl = $basename;
        $user_spec_file = 0;
        }
 
-    !$respect_case and $meta->{sql_identifier_case} == 1 and # XXX SQL_IC_UPPER
+    if (!$respect_case and $meta->{sql_identifier_case} == 1) { # XXX 
SQL_IC_UPPER
+        $basename = uc $basename;
         $tbl = uc $tbl;
-    !$respect_case and $meta->{sql_identifier_case} == 2 and # XXX SQL_IC_LOWER
+       }
+    if( !$respect_case and $meta->{sql_identifier_case} == 2) { # XXX 
SQL_IC_LOWER
+        $basename = lc $basename;
         $tbl = lc $tbl;
+       }
 
     my $searchdir = File::Spec->file_name_is_absolute ($dir)
        ? ($dir =~ s|/$||, $dir)
@@ -763,14 +769,14 @@
        $dir = "";
 
     unless ($user_spec_file) {
-       $file_is_table and $file = "$tbl$ext";
+       $file_is_table and $file = "$basename$ext";
 
        # Fully Qualified File Name
        my $cmpsub;
        if ($respect_case) {
            $cmpsub = sub {
                my ($fn, undef, $sfx) = File::Basename::fileparse ($_, 
$fn_any_ext_regex);
-               $fn eq $tbl and
+               $fn eq $basename and
                    return (lc $sfx eq lc $ext or !$req && !$sfx);
                return 0;
                }
@@ -778,7 +784,7 @@
        else {
            $cmpsub = sub {
                my ($fn, undef, $sfx) = File::Basename::fileparse ($_, 
$fn_any_ext_regex);
-               lc $fn eq lc $tbl and
+               lc $fn eq lc $basename and
                    return (lc $sfx eq lc $ext or !$req && !$sfx);
                return 0;
                }
@@ -799,7 +805,7 @@
        }
 
     my $fqfn = File::Spec->catfile ($searchdir, $file);
-    my $fqbn = File::Spec->catfile ($searchdir, $tbl);
+    my $fqbn = File::Spec->catfile ($searchdir, $basename);
 
     $meta->{f_fqfn} = $fqfn;
     $meta->{f_fqbn} = $fqbn;
@@ -842,7 +848,9 @@
        $table =~ s/\"$//;
        }
 
-    defined $dbh->{f_meta_map}{$table} and $table = $dbh->{f_meta_map}{$table};
+    unless ($respect_case) {
+       defined $dbh->{f_meta_map}{$table} and $table = 
$dbh->{f_meta_map}{$table};
+       }
 
     my $meta = {};
     defined $dbh->{f_meta}{$table} and $meta = $dbh->{f_meta}{$table};
@@ -861,10 +869,12 @@
 
        # now we know a bit more - let's check if user can't use consequent 
spelling
        # XXX add know issue about reset sql_identifier_case here ...
-       if (defined $dbh->{f_meta}{$table} && 
$dbh->{f_meta}{$table}{initialized}) {
+       if (defined $dbh->{f_meta}{$table} && 
defined($dbh->{f_meta}{$table}{initialized})) {
            $meta = $dbh->{f_meta}{$table};
+           $self->file2table ($meta, $table, $file_is_table, $respect_case) or
+               return unless ($dbh->{f_meta}{$table}{initialized});
            }
-       else {
+       unless ($dbh->{f_meta}{$table}{initialized}) {
            $self->init_table_meta ($dbh, $meta, $table);
            $meta->{initialized} = 1;
            $dbh->{f_meta}{$table} = $meta;
@@ -921,7 +931,7 @@
     my ($class, $meta, $attrib, $value) = @_;
     defined $reset_on_modify{$attrib} and
        delete $meta->{$reset_on_modify{$attrib}} and
-       delete $meta->{initialized};
+       $meta->{initialized} = 0;
     } # table_meta_attr_changed
 
 # ====== FILE OPEN 
=============================================================

Modified: dbi/trunk/t/51dbm_file.t
==============================================================================
--- dbi/trunk/t/51dbm_file.t    (original)
+++ dbi/trunk/t/51dbm_file.t    Thu Sep 16 13:59:35 2010
@@ -2,10 +2,12 @@
 $| = 1;
 
 use strict;
+use warnings;
+
+use File::Copy ();
 use File::Path;
-use File::Spec;
+use File::Spec ();
 use Test::More;
-use Cwd;
 
 my $using_dbd_gofer = ( $ENV{DBI_AUTOPROXY} || '' ) =~ 
/^dbi:Gofer.*transport=/i;
 
@@ -54,6 +56,16 @@
 
 ok( $dbh->do(q/insert into FRED (a,b) values(2,1)/), 'insert into uppercase 
table' );
 
+my $fn_tbl2 = $dbh->{dbm_tables}->{fred}->{f_fqfn};
+   $fn_tbl2 =~ s/fred(\.[^.]*)?/freddy$1/;
+foreach my $fn (glob($dbh->{dbm_tables}->{fred}->{f_fqbn} . "*"))
+{
+    my $tgt_fn = $fn;
+    $tgt_fn =~ s/fred(\.[^.]*)?/freddy$1/;
+    File::Copy::copy( $fn, $tgt_fn );
+}
+$dbh->{dbm_tables}->{krueger}->{file} = $fn_tbl2;
+
 my $r = $dbh->selectall_arrayref(q/select * from Fred/);
 ok( @$r == 2, 'rows found via mixed case table' );
 
@@ -65,4 +77,9 @@
 
 ok( $dbh->do(q/drop table if exists FRED/), 'drop table' );
 
+my $r = $dbh->selectall_arrayref(q/select * from Krueger/);
+ok( @$r == 2, 'rows found via cloned mixed case table' );
+
+ok( $dbh->do(q/drop table if exists KRUeGEr/), 'drop table' );
+
 done_testing();

Reply via email to