Author: REHSACK
Date: Fri Oct 26 08:29:37 2012
New Revision: 15455

Modified:
   dbi/branches/sqlengine/lib/DBD/File.pm

Log:
move flock check to DBD::File::DataSource::Stream and add one liner to query 
capability from derived classes

Modified: dbi/branches/sqlengine/lib/DBD/File.pm
==============================================================================
--- dbi/branches/sqlengine/lib/DBD/File.pm      (original)
+++ dbi/branches/sqlengine/lib/DBD/File.pm      Fri Oct 26 08:29:37 2012
@@ -401,6 +401,10 @@
 
 @DBD::File::DataSource::Stream::ISA = 'DBI::DBD::SqlEngine::DataSource';
 
+# We may have a working flock () built-in but that doesn't mean that locking
+# will work on NFS (flock () may hang hard)
+my $locking = eval { flock STDOUT, 0; 1 };
+
 use Carp;
 
 sub complete_table_name
@@ -442,7 +446,7 @@
     my ($self, $meta, $attrs, $flags) = @_;
 
     $flags->{dropMode} and croak "Can't drop a table in stream";
-    my $fn = "file handle " . fileno($meta->{fh});
+    my $fn = "file handle " . fileno($meta->{f_file});
 
     if ($flags->{createMode} || $flags->{lockMode}) {
        $meta->{fh} = IO::Handle->new_from_fd( fileno($meta->{f_file} ), "w+" ) 
or
@@ -463,8 +467,24 @@
            binmode $meta->{fh} or croak "Failed to set binary mode on $fn: $!";
            }
        } # have $meta->{$fh}
+
+    if ($self->can_flock && $meta->{fh}) {
+       my $lm = defined $flags->{f_lock}
+                     && $flags->{f_lock} =~ m/^[012]$/
+                      ? $flags->{f_lock}
+                      : $flags->{lockMode} ? 2 : 1;
+       if ($lm == 2) {
+           flock $meta->{fh}, 2 or croak "Cannot obtain exclusive lock on $fn: 
$!";
+           }
+       elsif ($lm == 1) {
+           flock $meta->{fh}, 1 or croak "Cannot obtain shared lock on $fn: 
$!";
+           }
+       # $lm = 0 is forced no locking at all
+       }
     } # open_data
 
+sub can_flock { $locking }
+
 package DBD::File::DataSource::File;
 
 use strict;
@@ -476,10 +496,6 @@
 
 my $fn_any_ext_regex = qr/\.[^.]*/;
 
-# We may have a working flock () built-in but that doesn't mean that locking
-# will work on NFS (flock () may hang hard)
-my $locking = eval { flock STDOUT, 0; 1 };
-
 sub complete_table_name
 {
     my ($self, $meta, $file, $respect_case, $file_is_table) = @_;
@@ -630,7 +646,7 @@
        $meta->{lockfh} = $fh;
        }
 
-    if ($locking && $fh) {
+    if ($self->can_flock && $fh) {
        my $lm = defined $flags->{f_lock}
                      && $flags->{f_lock} =~ m/^[012]$/
                       ? $flags->{f_lock}

Reply via email to