Author: REHSACK
Date: Wed Jun 16 23:20:12 2010
New Revision: 14162

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

Log:
- try to fix data_sources
- no long way around in FETCH routines to fetch internal data


Modified: dbi/trunk/lib/DBD/File.pm
==============================================================================
--- dbi/trunk/lib/DBD/File.pm   (original)
+++ dbi/trunk/lib/DBD/File.pm   Wed Jun 16 23:20:12 2010
@@ -151,12 +151,24 @@
     return $this;
     } # connect
 
+sub dsn_quote
+{
+    my $str = $_[0];
+    ref $str and return "";
+    defined $str or return "";
+    $str =~ s/([;:])/\\$1/g;
+    return $str;
+    }
+
 sub data_sources ($;$)
 {
     my ($drh, $attr) = @_;
     my $dir = $attr && exists $attr->{f_dir}
        ? $attr->{f_dir}
        : File::Spec->curdir ();
+    $attr and my %attrs = %$attr;
+    delete $attrs{f_dir};
+    my $dsnextra = join (";", map { $_ . "=" . dsn_quote ($attrs{$_}) } keys 
%attrs);
     my ($dirh) = Symbol::gensym ();
     unless (opendir ($dirh, $dir)) {
        $drh->set_err ($DBI::stderr, "Cannot open directory $dir: $!");
@@ -164,12 +176,13 @@
        }
 
     my ($file, @dsns, %names, $driver);
-    if ($drh->{ImplementorClass} =~ m/^dbd\:\:([^\:]+)\:\:/i) {
-       $driver = $1;
-       }
-    else {
-       $driver = "File";
-       }
+    $driver = $drh->{ImplementorClass} =~ m/^dbd\:\:([^\:]+)\:\:/i ? $1 : 
"File";
+    #if ($drh->{ImplementorClass} =~ m/^dbd\:\:([^\:]+)\:\:/i) {
+#      $driver = $1;
+#      }
+#    else {
+#      $driver = "File";
+#      }
 
     while (defined ($file = readdir ($dirh))) {
        if ($^O eq "VMS") {
@@ -180,7 +193,7 @@
        my $d = File::Spec->catdir ($dir, $file);
        # allow current dir ... it can be a data_source too
        $file ne File::Spec->updir () && -d $d and
-           push @dsns, "DBI:$driver:f_dir=$d";
+           push @dsns, "DBI:$driver:f_dir=" . dsn_quote ($d) . ($dsnextra ? 
";$dsnextra" : "");
        }
     return @dsns;
     } # data_sources
@@ -548,8 +561,7 @@
     $table eq "." and
        return $dbh->FETCH ($attr);
 
-    my $class = $dbh->FETCH ("ImplementorClass");
-    $class =~ s/::db$/::Table/;
+    (my $class = $dbh->{ImplementorClass}) =~ s/::db$/::Table/;
     (undef, $meta) = $class->get_table_meta ($dbh, $table, 1);
     $meta or croak "No such table '$table'";
 
@@ -602,8 +614,7 @@
     $table eq "." and
        return $dbh->STORE ($attr, $value);
 
-    my $class = $dbh->FETCH ("ImplementorClass");
-    $class =~ s/::db$/::Table/;
+    (my $class = $dbh->{ImplementorClass}) =~ s/::db$/::Table/;
     (undef, $meta) = $class->get_table_meta ($dbh, $table, 1);
     $meta or croak "No such table '$table'";
     $class->set_table_meta_attr ($meta, $attr, $value);
@@ -650,8 +661,7 @@
 {
     my ($dbh, $table) = @_;
 
-    my $class = $dbh->FETCH ("ImplementorClass");
-    $class =~ s/::db$/::Table/;
+    (my $class = $dbh->{ImplementorClass}) =~ s/::db$/::Table/;
     my (undef, $meta) = $class->get_table_meta ($dbh, $table, 1);
     $meta and %{$meta} = ();
 

Reply via email to