Commit 45d0bb1b authored by Jim Fulton's avatar Jim Fulton

DemoStorages now accept constructor athuments, close_base_on_close

and close_changes_on_close, to control whether underlying storages
are closed when the DemoStorage is closed.

https://bugs.launchpad.net/zodb/+bug/118512
parent 9421c7d1
......@@ -2,6 +2,18 @@
Change History
================
3.10.0b1 (2010-05-??)
=====================
New Features
------------
- DemoStorages now accept constructor athuments, close_base_on_close
and close_changes_on_close, to control whether underlying storages
are closed when the DemoStorage is closed.
https://bugs.launchpad.net/zodb/+bug/118512
3.10.0a2 (2010-05-04)
=====================
......
......@@ -38,24 +38,34 @@ class DemoStorage(object):
ZODB.interfaces.IStorageIteration,
)
def __init__(self, name=None, base=None, changes=None):
if base is None:
base = ZODB.MappingStorage.MappingStorage()
self._temporary_base = True
else:
self._temporary_base = False
def __init__(self, name=None, base=None, changes=None,
close_base_on_close=None, close_changes_on_close=None):
if close_base_on_close is None:
if base is None:
base = ZODB.MappingStorage.MappingStorage()
close_base_on_close = False
else:
close_base_on_close = True
self.base = base
self.close_base_on_close = close_base_on_close
if changes is None:
self._temporary_changes = True
changes = ZODB.MappingStorage.MappingStorage()
zope.interface.alsoProvides(self, ZODB.interfaces.IBlobStorage)
self._temporary_changes = True
if close_changes_on_close is None:
close_changes_on_close = False
else:
if ZODB.interfaces.IBlobStorage.providedBy(changes):
zope.interface.alsoProvides(self, ZODB.interfaces.IBlobStorage)
self._temporary_changes = False
if close_changes_on_close is None:
close_changes_on_close = True
self.changes = changes
self.close_changes_on_close = close_changes_on_close
self._issued_oids = set()
self._stored_oids = set()
......@@ -88,9 +98,9 @@ class DemoStorage(object):
self.changes.cleanup()
def close(self):
if not self._temporary_base:
if self.close_base_on_close:
self.base.close()
if not self._temporary_changes:
if self.close_changes_on_close:
self.changes.close()
def _copy_methods_from_changes(self, changes):
......@@ -222,9 +232,9 @@ class DemoStorage(object):
def pack(self, t, referencesf, gc=None):
if gc is None:
if self._temporary_base:
if self._temporary_changes:
return self.changes.pack(t, referencesf)
elif self._temporary_base:
elif self._temporary_changes:
return self.changes.pack(t, referencesf, gc=gc)
elif gc:
raise TypeError(
......
......@@ -133,6 +133,30 @@ Undo methods are simply copied from the changes storage:
>>> db.close()
Closing demo storages
=====================
Normally, when a demo storage is closed, it's base and changes
storage are closed:
>>> from ZODB.MappingStorage import MappingStorage
>>> demo = DemoStorage(base=MappingStorage(), changes=MappingStorage())
>>> demo.close()
>>> demo.base.opened(), demo.changes.opened()
(False, False)
You can pass constructor arguments to control whether the base and
changes storages should be closed when the demo storage is closed:
>>> demo = DemoStorage(
... base=MappingStorage(), changes=MappingStorage(),
... close_base_on_close=False, close_changes_on_close=False,
... )
>>> demo.close()
>>> demo.base.opened(), demo.changes.opened()
(True, True)
Storage Stacking
================
......@@ -147,7 +171,6 @@ creates a new demo storage who's base is the original demo storage:
We can also supply an explicit changes storage, if we wish:
>>> from ZODB.MappingStorage import MappingStorage
>>> changes = MappingStorage()
>>> demo3 = demo2.push(changes)
>>> demo3.changes is changes, demo3.base is demo2
......@@ -166,12 +189,7 @@ Special backward compatibility support
--------------------------------------
Normally, when a demo storage is closed, it's base and changes
storage are closed:
>>> demo = DemoStorage(base=MappingStorage(), changes=MappingStorage())
>>> demo.close()
>>> demo.base.opened(), demo.changes.opened()
(False, False)
storage are closed.
Older versions of DemoStorage didn't have a separate changes storage
and didn't close or discard their changes when they were closed. When
......@@ -354,7 +372,7 @@ First we'll get a single OID.
>>> storage = DemoStorage.push(storage)
>>> random.seed(47)
>>> storage.new_oid()
'\x1a,S\xa4\xe9\xbb\x17\xbd'
'8\xaa-\tz\x1dP\x07'
Then we'll force the random number generator to use the same seed for the
subsequent call to "new_oid" and show that we get a different OID.
......@@ -362,7 +380,7 @@ subsequent call to "new_oid" and show that we get a different OID.
>>> random.seed(47)
>>> oid = storage.new_oid()
>>> oid
'\x1a,S\xa4\xe9\xbb\x17\xbe'
'8\xaa-\tz\x1dP\x08'
DemoStorage keeps up with the issued OIDs to know when not to reissue them...
......
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