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