X-Git-Url: http://git.rot13.org/?p=BackupPC.git;a=blobdiff_plain;f=lib%2FBackupPC%2FPoolWrite.pm;h=d0be0e653b4ecdeea228a85c37da1d3c2090fab3;hp=f05223c5ab5ddd76d2ca32c4d5b7085478263b9e;hb=e951f787a66c5bd9e9955c3f657a5b44289c0fe1;hpb=3ec73efe5ee035c9cda24dc70500157e455d9c84 diff --git a/lib/BackupPC/PoolWrite.pm b/lib/BackupPC/PoolWrite.pm index f05223c..d0be0e6 100644 --- a/lib/BackupPC/PoolWrite.pm +++ b/lib/BackupPC/PoolWrite.pm @@ -38,7 +38,7 @@ # Craig Barratt # # COPYRIGHT -# Copyright (C) 2001 Craig Barratt +# Copyright (C) 2001-2003 Craig Barratt # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -56,7 +56,7 @@ # #======================================================================== # -# Version 2.0.0beta2, released 13 Apr 2003. +# Version 2.1.0, released 20 Jun 2004. # # See http://backuppc.sourceforge.net. # @@ -98,8 +98,8 @@ sub new return $self; } -my $BufSize = 1048576; # 1MB or 2^20 -my $MaxFiles = 20; +my $BufSize = 1048576; # 1MB or 2^20 +my $MaxFiles = 20; # max number of compare files open at one time sub write { @@ -115,10 +115,12 @@ sub write # file list if the file changes between the file list sending # and the file sending). Here we only catch the case where # we haven't computed the digest (ie: we have written no more - # than $BufSize. We catch the big file case below. + # than $BufSize). We catch the big file case below. # if ( !defined($dataRef) && !defined($a->{digest}) && $a->{fileSize} != length($a->{data}) ) { + #my $newSize = length($a->{data}); + #print("Fixing file size from $a->{fileSize} to $newSize\n"); $a->{fileSize} = length($a->{data}); } @@ -270,9 +272,6 @@ sub write # We are at EOF, so finish up # $a->{eof} = 1; - foreach my $f ( @{$a->{files}} ) { - $f->{fh}->close(); - } # # Make sure the fileSize was correct. See above for comments about @@ -291,27 +290,39 @@ sub write my($fh, $fileName); $a->{fileSize} = $a->{nWrite}; - if ( $a->{fileName} =~ /(.*)\// ) { - $fileName = $1; - } else { - $fileName = "."; - } - # - # Find a unique target temporary file name - # - my $i = 0; - while ( -f "$fileName/t$$.$i" ) { - $i++; + if ( defined($a->{fhOut}) ) { + if ( $a->{fileName} =~ /(.*)\// ) { + $fileName = $1; + } else { + $fileName = "."; + } + # + # Find a unique target temporary file name + # + my $i = 0; + while ( -f "$fileName/t$$.$i" ) { + $i++; + } + $fileName = "$fileName/t$$.$i"; + $a->{fhOut}->close(); + if ( !rename($a->{fileName}, $fileName) + || !defined($fh = BackupPC::FileZIO->open($fileName, 0, + $a->{compress})) ) { + push(@{$a->{errors}}, "Can't rename $a->{fileName} -> $fileName" + . " or open during size fixup\n"); + } + #print("Using temporary name $fileName\n"); + } elsif ( defined($a->{files}) && defined($a->{files}[0]) ) { + # + # We haven't written anything yet, so just use the + # compare file to copy from. + # + $fh = $a->{files}[0]->{fh}; + $fh->rewind; + #print("Using compare file $a->{files}[0]->{name}\n"); } - $fileName = "$fileName/t$$.$i"; - $a->{fhOut}->close(); - if ( !rename($a->{fileName}, $fileName) - || !defined($fh = BackupPC::FileZIO->open($fileName, 0, - $a->{compress})) ) { - push(@{$a->{errors}}, "Can't rename $a->{fileName} -> $fileName" - . " or open during size fixup\n"); - } else { + if ( defined($fh) ) { my $poolWrite = BackupPC::PoolWrite->new($a->{bpc}, $a->{fileName}, $a->{fileSize}, $a->{compress}); my $nRead = 0; @@ -331,7 +342,7 @@ sub write $nRead += $thisRead; } $fh->close; - unlink($fileName); + unlink($fileName) if ( defined($fileName) ); if ( @{$a->{errors}} ) { $poolWrite->close; return (0, $a->{digest}, -s $a->{fileName}, $a->{errors}); @@ -341,6 +352,13 @@ sub write } } + # + # Close the compare files + # + foreach my $f ( @{$a->{files}} ) { + $f->{fh}->close(); + } + if ( $a->{fileSize} == 0 ) { # # Simply create an empty file @@ -394,6 +412,23 @@ sub close return $a->write(undef); } +# +# Abort a pool write +# +sub abort +{ + my($a) = @_; + + if ( defined($a->{fhOut}) ) { + $a->{fhOut}->close(); + unlink($a->{fileName}); + } + foreach my $f ( @{$a->{files}} ) { + $f->{fh}->close(); + } + $a->{files} = []; +} + # # Copy $nBytes from files $fhIn to $fhOut. #