Commit ce252850 authored by Christian Theune's avatar Christian Theune

Fixed bug in TmpStore: load() would not defer to the backend storage.

parent ac35b4df
...@@ -33,7 +33,7 @@ General ...@@ -33,7 +33,7 @@ General
ZEO ZEO
--- ---
- (???) Fixed bug in transaction buffer: a tuple was unpackged incorrectly in - (???) Fixed bug in transaction buffer: a tuple was unpacked incorrectly in
`clear`. `clear`.
- (???) Fixed bug in blob filesystem helper: the `isSecure` check was inversed. - (???) Fixed bug in blob filesystem helper: the `isSecure` check was inversed.
...@@ -95,6 +95,9 @@ Transactions ...@@ -95,6 +95,9 @@ Transactions
Blobs Blobs
----- -----
- (???) Fixed bug in Connection.TmpStore: load() would not defer to the
backend storage for loading blobs.
- (3.8b5) Fixed bug #130459: Packing was broken by uncommitted blob data. - (3.8b5) Fixed bug #130459: Packing was broken by uncommitted blob data.
- (3.8b4) Fixed bug #127182: Blobs were subclassable which was not desired. - (3.8b4) Fixed bug #127182: Blobs were subclassable which was not desired.
......
...@@ -1260,7 +1260,7 @@ class TmpStore: ...@@ -1260,7 +1260,7 @@ class TmpStore:
self._storage) self._storage)
filename = self._getCleanFilename(oid, serial) filename = self._getCleanFilename(oid, serial)
if not os.path.exists(filename): if not os.path.exists(filename):
raise POSKeyError("No blob file", oid, serial) return self._storage.loadBlob(oid, serial)
return filename return filename
def _getBlobPath(self, oid): def _getBlobPath(self, oid):
......
...@@ -247,7 +247,7 @@ We do support optimistic savepoints: ...@@ -247,7 +247,7 @@ We do support optimistic savepoints:
"I'm a happy blob. And I'm singing." "I'm a happy blob. And I'm singing."
>>> transaction.commit() >>> transaction.commit()
We support optimistic savepoints too: We support non-optimistic savepoints too:
>>> root5['blob'].open("a").write(" And I'm dancing.") >>> root5['blob'].open("a").write(" And I'm dancing.")
>>> root5['blob'].open("r").read() >>> root5['blob'].open("r").read()
......
...@@ -443,6 +443,60 @@ def secure_blob_directory(): ...@@ -443,6 +443,60 @@ def secure_blob_directory():
""" """
def loadblob_tmpstore():
"""
This is a test for assuring that the TmpStore's loadBlob implementation
falls back correctly to loadBlob on the backend.
First, let's setup a regular database and store a blob:
>>> import transaction
>>> from ZODB.FileStorage.FileStorage import FileStorage
>>> from ZODB.blob import BlobStorage
>>> from ZODB.DB import DB
>>> from ZODB.serialize import referencesf
>>> from tempfile import mkdtemp, mktemp
>>> storagefile = mktemp()
>>> base_storage = FileStorage(storagefile)
>>> blob_dir = mkdtemp()
>>> blob_storage = BlobStorage(blob_dir, base_storage)
>>> database = DB(blob_storage)
>>> connection = database.open()
>>> root = connection.root()
>>> from ZODB.blob import Blob
>>> root['blob'] = Blob()
>>> connection.add(root['blob'])
>>> root['blob'].open('w').write('test')
>>> import transaction
>>> transaction.commit()
>>> blob_oid = root['blob']._p_oid
>>> tid = blob_storage.lastTransaction()
Now we open a database with a TmpStore in front:
>>> database.close()
>>> from ZODB.Connection import TmpStore
>>> tmpstore = TmpStore('', blob_storage)
We can access the blob correctly:
>>> tmpstore.loadBlob(blob_oid, tid) # doctest: +ELLIPSIS
'.../0x01/0x...blob'
Clean up:
>>> database.close()
>>> import shutil
>>> shutil.rmtree(blob_dir)
>>> os.unlink(storagefile)
>>> os.unlink(storagefile+".index")
>>> os.unlink(storagefile+".tmp")
"""
def test_suite(): def test_suite():
suite = unittest.TestSuite() suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(ZODBBlobConfigTest)) suite.addTest(unittest.makeSuite(ZODBBlobConfigTest))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment