X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FTie%2FFile.pm;h=9528ab1bfdb76d3ff14e8ae1b9dd91f278b24fa3;hb=aaf9c2b26697492a8234a7efe890beef8868ea9b;hp=851e63a61b00f70bc59e6c33c7faccbbed2256c4;hpb=91b2dafa28c5175123b6afb7a182a9369cef1736;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Tie/File.pm b/lib/Tie/File.pm index 851e63a..9528ab1 100644 --- a/lib/Tie/File.pm +++ b/lib/Tie/File.pm @@ -7,14 +7,14 @@ use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX', 'LOCK_SH', 'O_WRONLY', 'O_RDONLY'; sub O_ACCMODE () { O_RDONLY | O_RDWR | O_WRONLY } -$VERSION = "0.96"; +$VERSION = "0.97_02"; my $DEFAULT_MEMORY_SIZE = 1<<21; # 2 megabytes my $DEFAULT_AUTODEFER_THRESHHOLD = 3; # 3 records my $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD = 65536; # 16 disk blocksful my %good_opt = map {$_ => 1, "-$_" => 1} qw(memory dw_size mode recsep discipline - autodefer autochomp autodefer_threshhold); + autodefer autochomp autodefer_threshhold concurrent); sub TIEARRAY { if (@_ % 2 != 0) { @@ -33,6 +33,10 @@ sub TIEARRAY { } } + if ($opts{concurrent}) { + croak("$pack: concurrent access not supported yet\n"); + } + unless (defined $opts{memory}) { # default is the larger of the default cache size and the # deferred-write buffer size (if specified) @@ -89,7 +93,7 @@ sub TIEARRAY { unless (seek $file, 1, SEEK_SET) { croak "$pack: your filehandle does not appear to be seekable"; } - seek $file, 0, SEEK_SET # put it back + seek $file, 0, SEEK_SET; # put it back $fh = $file; # setting binmode is the user's problem } elsif (ref $file) { croak "usage: tie \@array, $pack, filename, [option => value]..."; @@ -652,7 +656,7 @@ sub _mtwrite { if (@_) { $unwritten = $self->_downcopy($data, $end, $_[1] - $end); } else { - # Make the file longer to accomodate the last segment that doesn' + # Make the file longer to accommodate the last segment that doesn' $unwritten = $self->_downcopy($data, $end); } } @@ -697,6 +701,8 @@ sub _upcopy { # moving everything in the block forwards to make room. # Instead of writing the last length($data) bytes from the block # (because there isn't room for them any longer) return them. +# +# Undefined $len means 'until the end of the file' sub _downcopy { my $blocksize = 8192; my ($self, $data, $pos, $len) = @_; @@ -707,11 +713,21 @@ sub _downcopy { : $len > $blocksize? $blocksize : $len; $self->_seekb($pos); read $fh, my($old), $readsize; + my $last_read_was_short = length($old) < $readsize; $data .= $old; - $self->_seekb($pos); - my $writable = substr($data, 0, $readsize, ""); + my $writable; + if ($last_read_was_short) { + # If last read was short, then $data now contains the entire rest + # of the file, so there's no need to write only one block of it + $writable = $data; + $data = ""; + } else { + $writable = substr($data, 0, $readsize, ""); + } last if $writable eq ""; + $self->_seekb($pos); $self->_write_record($writable); + last if $last_read_was_short && $data eq ""; $len -= $readsize if defined $len; $pos += $readsize; } @@ -1993,7 +2009,7 @@ Tie::File - Access the lines of a disk file via a Perl array =head1 SYNOPSIS - # This file documents Tie::File version 0.96 + # This file documents Tie::File version 0.97 use Tie::File; tie @array, 'Tie::File', filename or die ...; @@ -2411,14 +2427,14 @@ C<-Eautodefer()> recovers the current value of the autodefer setting. =head1 CONCURRENT ACCESS TO FILES Caching and deferred writing are inappropriate if you want the same -file to be accessed simultaneously from more than one process. You -will want to disable these features. You should do that by including -the C 0> option in your C calls; this will inhibit -caching and deferred writing. +file to be accessed simultaneously from more than one process. Other +optimizations performed internally by this module are also +incompatible with concurrent access. A future version of this module will +support a C 1> option that enables safe concurrent access. -You will also want to lock the file while reading or writing it. You -can use the C<-Eflock> method for this. A future version of this -module may provide an 'autolocking' mode. +Previous versions of this documentation suggested using C 0> for safe concurrent access. This was mistaken. Tie::File +will not support safe concurrent access before version 0.98. =head1 CAVEATS @@ -2516,7 +2532,7 @@ any news of importance, will be available at =head1 LICENSE -C version 0.96 is copyright (C) 2002 Mark Jason Dominus. +C version 0.97 is copyright (C) 2003 Mark Jason Dominus. This library is free software; you may redistribute it and/or modify it under the same terms as Perl itself. @@ -2533,8 +2549,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library program; it should be in the file C. -If not, write to the Free Software Foundation, Inc., 59 Temple Place, -Suite 330, Boston, MA 02111 USA +If not, write to the Free Software Foundation, Inc., 51 Franklin Street, +Fifth Floor, Boston, MA 02110-1301, USA For licensing inquiries, contact the author at: @@ -2544,7 +2560,7 @@ For licensing inquiries, contact the author at: =head1 WARRANTY -C version 0.96 comes with ABSOLUTELY NO WARRANTY. +C version 0.97 comes with ABSOLUTELY NO WARRANTY. For details, see the license. =head1 THANKS