From 4b6ab743182826562742863ad44981dab128d01a Mon Sep 17 00:00:00 2001
From: Jim Fulton <jim@zope.com>
Date: Fri, 18 May 2007 18:02:14 +0000
Subject: [PATCH] Removed the unnecessary and unused version argument from
 storeBlob.

Added a temporaryDirectory method for getting a directory to use for
creating temporary files.
---
 src/ZODB/Blobs/BlobStorage.py | 10 +++++++---
 src/ZODB/Blobs/interfaces.py  | 11 ++++++++---
 src/ZODB/Connection.py        |  7 +++----
 src/ZODB/ExportImport.py      | 28 +++++++++++++++-------------
 4 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/src/ZODB/Blobs/BlobStorage.py b/src/ZODB/Blobs/BlobStorage.py
index e04f682a..ade7e6fb 100644
--- a/src/ZODB/Blobs/BlobStorage.py
+++ b/src/ZODB/Blobs/BlobStorage.py
@@ -61,6 +61,11 @@ class BlobStorage(SpecificationDecoratorBase):
             supportsUndo = supportsUndo()
         self.__supportsUndo = supportsUndo
 
+    @non_overridable
+    def temporaryDirectory(self):
+        return self.fshelper.base_dir
+
+
     @non_overridable
     def __repr__(self):
         normal_storage = getProxiedObject(self)
@@ -114,13 +119,12 @@ class BlobStorage(SpecificationDecoratorBase):
                 os.unlink(clean) 
 
     @non_overridable
-    def loadBlob(self, oid, serial, version):
+    def loadBlob(self, oid, serial):
         """Return the filename where the blob file can be found.
-
         """
         filename = self.fshelper.getBlobFilename(oid, serial)
         if not os.path.exists(filename):
-            raise POSKeyError, "Not an existing blob."
+            return None
         return filename
 
     @non_overridable
diff --git a/src/ZODB/Blobs/interfaces.py b/src/ZODB/Blobs/interfaces.py
index e7e4633a..7ae3d595 100644
--- a/src/ZODB/Blobs/interfaces.py
+++ b/src/ZODB/Blobs/interfaces.py
@@ -60,11 +60,16 @@ class IBlobStorage(Interface):
     def storeBlob(oid, oldserial, data, blob, version, transaction):
         """Stores data that has a BLOB attached."""
 
-    def loadBlob(oid, serial, version):
-        """Return the filename of the Blob data responding to this OID and
-        serial.
+    def loadBlob(oid, serial):
+        """Return the filename of the Blob data for this OID and serial.
 
         Returns a filename or None if no Blob data is connected with this OID. 
 
         Raises POSKeyError if the blobfile cannot be found.
         """
+
+    def temporaryDirectory():
+        """Return a directory that should be used for uncommitted blob data.
+
+        If Blobs use this, then commits can be performed with a simple rename.
+        """
diff --git a/src/ZODB/Connection.py b/src/ZODB/Connection.py
index 70a9a02d..ec9eecf0 100644
--- a/src/ZODB/Connection.py
+++ b/src/ZODB/Connection.py
@@ -853,8 +853,7 @@ class Connection(ExportImport, object):
         providedBy = getattr(obj, '__providedBy__', None)
         if providedBy is not None and IBlob in providedBy:
             obj._p_blob_uncommitted = None
-            obj._p_blob_data = self._storage.loadBlob(
-                obj._p_oid, serial, self._version)
+            obj._p_blob_data = self._storage.loadBlob(obj._p_oid, serial)
 
     def _load_before_or_conflict(self, obj):
         """Load non-current state for obj or raise ReadConflictError."""
@@ -1108,7 +1107,7 @@ class Connection(ExportImport, object):
         for oid in oids:
             data, serial = src.load(oid, src)
             try:
-                blobfilename = src.loadBlob(oid, serial, self._version)
+                blobfilename = src.loadBlob(oid, serial)
             except POSKeyError:
                 s = self._storage.store(oid, serial, data,
                                         self._version, transaction)
@@ -1250,7 +1249,7 @@ class TmpStore:
         targetname = self._getCleanFilename(oid, serial)
         os.rename(blobfilename, targetname)
 
-    def loadBlob(self, oid, serial, version):
+    def loadBlob(self, oid, serial):
         """Return the filename where the blob file can be found.
         """
         filename = self._getCleanFilename(oid, serial)
diff --git a/src/ZODB/ExportImport.py b/src/ZODB/ExportImport.py
index ad28079d..8e63ec58 100644
--- a/src/ZODB/ExportImport.py
+++ b/src/ZODB/ExportImport.py
@@ -39,6 +39,7 @@ class ExportImport:
         done_oids = {}
         done=done_oids.has_key
         load=self._storage.load
+        supports_blobs = IBlobStorage.providedBy(self._storage)
         while oids:
             oid = oids.pop(0)
             if oid in done_oids:
@@ -52,20 +53,21 @@ class ExportImport:
             else:
                 referencesf(p, oids)
                 f.writelines([oid, p64(len(p)), p])
-            # Blob support
-            if not IBlobStorage.providedBy(self._storage):
-                continue
-            try:
-                blobfilename = self._storage.loadBlob(oid, 
-                                                      serial, self._version)
-            except POSKeyError: # Looks like this is not a blob
-                continue
 
-            f.write(blob_begin_marker)
-            f.write(p64(os.stat(blobfilename).st_size))
-            blobdata = open(blobfilename, "rb")
-            cp(blobdata, f)
-            blobdata.close()
+            if supports_blobs:
+                if 'Blob' not in p:
+                    continue # filter out most non-blobs
+                
+                blobfilename = self._storage.loadBlob(oid, serial)
+                if blobfilename is None:
+                    # This could be a non-blob or a blob with unsaved data.
+                    continue
+
+                f.write(blob_begin_marker)
+                f.write(p64(os.stat(blobfilename).st_size))
+                blobdata = open(blobfilename, "rb")
+                cp(blobdata, f)
+                blobdata.close()
             
         f.write(export_end_marker)
         return f
-- 
2.30.9