rdiff-backup-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Rdiff-backup-commits] Changes to rdiff-backup/rdiff_backup/iterfile.py


From: Ben Escoto
Subject: [Rdiff-backup-commits] Changes to rdiff-backup/rdiff_backup/iterfile.py
Date: Fri, 04 Nov 2005 17:41:19 -0500

Index: rdiff-backup/rdiff_backup/iterfile.py
diff -u rdiff-backup/rdiff_backup/iterfile.py:1.11 
rdiff-backup/rdiff_backup/iterfile.py:1.12
--- rdiff-backup/rdiff_backup/iterfile.py:1.11  Mon Oct 31 04:53:31 2005
+++ rdiff-backup/rdiff_backup/iterfile.py       Fri Nov  4 22:41:13 2005
@@ -44,6 +44,7 @@
                "o" for an object,
                "f" for file,
                "c" for a continution of a file,
+               "h" for the close value of a file
                "e" for an exception, or
                None if no more data can be read.
 
@@ -57,7 +58,7 @@
                        assert None, "Header %s is only %d bytes" % (header, 
len(header))
                type, length = header[0], C.str2long(header[1:])
                buf = self.file.read(length)
-               if type in ("o", "e"): return type, cPickle.loads(buf)
+               if type in ("o", "e", "h"): return type, cPickle.loads(buf)
                else:
                        assert type in ("f", "c")
                        return type, buf
@@ -82,11 +83,7 @@
                type, data = self._get()
                if not type: raise StopIteration
                if type == "o" or type == "e": return data
-               elif type == "f":
-                       file = IterVirtualFile(self, data)
-                       if data: self.currently_in_file = file
-                       else: self.currently_in_file = None
-                       return file
+               elif type == "f": return IterVirtualFile(self, data)
                else: raise IterFileException("Bad file type %s" % type)
 
 
@@ -107,8 +104,10 @@
                """
                UnwrapFile.__init__(self, iwf.file)
                self.iwf = iwf
+               iwf.currently_in_file = self
                self.buffer = initial_data
                self.closed = None
+               if not initial_data: self.set_close_val()
 
        def read(self, length = -1):
                """Read length bytes from the file, updating buffers as 
necessary"""
@@ -140,15 +139,24 @@
                        self.buffer += data
                        return 1
                else:
-                       self.iwf.currently_in_file = None
+                       self.set_close_val()
                        return None
 
+       def set_close_val(self):
+               """Read the close value and clear currently_in_file"""
+               assert self.iwf.currently_in_file
+               self.iwf.currently_in_file = None
+               type, object = self.iwf._get()
+               assert type == 'h', type
+               self.close_value = object
+
        def close(self):
                """Currently just reads whats left and discards it"""
                while self.iwf.currently_in_file:
                        self.addtobuffer()
                        self.buffer = ""
                self.closed = 1
+               return self.close_value
 
 
 class FileWrappingIter:
@@ -214,13 +222,16 @@
                buf = robust.check_common_error(self.read_error_handler,
                                                                                
self.currently_in_file.read,
                                                                                
[Globals.blocksize])
-               if buf == "" or buf is None:
-                       self.currently_in_file.close()
-                       self.currently_in_file = None                   
-                       if buf is None: # error occurred above, encode exception
-                               prefix_letter = "e"
-                               buf = cPickle.dumps(self.last_exception, 1)
-               total = "".join((prefix_letter, C.long2str(long(len(buf))), 
buf))
+               if buf is None: # error occurred above, encode exception
+                       self.currently_in_file = None
+                       excstr = cPickle.dumps(self.last_exception, 1)
+                       total = "".join(('e', C.long2str(long(len(excstr))), 
excstr))
+               else:
+                       total = "".join((prefix_letter, 
C.long2str(long(len(buf))), buf))
+                       if buf == "": # end of file
+                               cstr = 
cPickle.dumps(self.currently_in_file.close(), 1)
+                               self.currently_in_file = None
+                               total += "".join(('h', 
C.long2str(long(len(cstr))), cstr))
                self.array_buf.fromstring(total)
 
        def read_error_handler(self, exc, blocksize):
@@ -386,11 +397,7 @@
        def get_file(self):
                """Read file object from file"""
                type, data = self._get()
-               if type == "f":
-                       file = IterVirtualFile(self, data)
-                       if data: self.currently_in_file = file
-                       else: self.currently_in_file = None
-                       return file
+               if type == "f": return IterVirtualFile(self, data)
                assert type == "e", "Expected type e, got %s" % (type,)
                assert isinstance(data, Exception)
                return ErrorFile(data)
@@ -411,7 +418,7 @@
                type, length = self.buf[0], C.str2long(self.buf[1:8])
                data = self.buf[8:8+length]
                self.buf = self.buf[8+length:]
-               if type in "oer": return type, cPickle.loads(data)
+               if type in "oerh": return type, cPickle.loads(data)
                else: return type, data
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]