[Zodb-checkins] CVS: ZODB4/ZODB - ConflictResolution.py:1.14
Jeremy Hylton
jeremy@zope.com
Thu, 19 Sep 2002 15:11:03 -0400
Update of /cvs-repository/ZODB4/ZODB
In directory cvs.zope.org:/tmp/cvs-serv27897/ZODB
Modified Files:
ConflictResolution.py
Log Message:
Repair the implementation to match 1.12.
The 1.13 checkin was too hasty and had a bunch of sloppy mistakes.
=== ZODB4/ZODB/ConflictResolution.py 1.13 => 1.14 ===
--- ZODB4/ZODB/ConflictResolution.py:1.13 Thu Sep 19 14:22:04 2002
+++ ZODB4/ZODB/ConflictResolution.py Thu Sep 19 15:11:03 2002
@@ -12,21 +12,12 @@
#
##############################################################################
from cStringIO import StringIO
-from cPickle import Unpickler, Pickler
+from cPickle import Pickler, PicklingError
from Transaction.Exceptions import ConflictError
-from ZODB.Serialize import ResolveUnpickler
+from ZODB.Serialize import ResolveUnpickler, getClassMetadata
-ResolvedSerial = 'rs'
-
-def state(storage, oid, serial, prfactory, p=''):
- p=p or storage.loadSerial(oid, serial)
- file=StringIO(p)
- unpickler=Unpickler(file)
- unpickler.persistent_load=prfactory
- class_tuple=unpickler.load()
- state=unpickler.load()
- return state
+ResolvedSerial = "rs"
class PersistentReference:
@@ -61,24 +52,32 @@
"Mix-in class that provides conflict resolution handling for storages"
def tryToResolveConflict(self, oid, committedSerial, oldSerial, newpickle,
- committedData=''):
- unpickler = ResolveUnpickler(PersistentReferenceFactory(),
- can_resolve_class)
- resolve = unpickler.getResolveMethod(newpickle)
+ committedData=None):
+ unpickler = ResolveUnpickler(PersistentReferenceFactory())
+ resolve = unpickler.getResolver(newpickle)
if resolve is None:
return None
- else:
+ newstate = unpickler.getState(newpickle)
+
+ try:
+ p = self.loadSerial(oid, oldSerial)
try:
- p = self.loadSerial(oid, oldSerial)
old = unpickler.getState(p)
+ except (EOFError, PicklingError), err:
+ return None
+ if committedData is None:
+ committedData = self.loadSerial(oid, committedSerial)
+ try:
committed = unpickler.getState(committedData)
- resolved = resolve(old, committed, newstate)
-
- file = StringIO()
- pickler = Pickler(file,1)
- pickler.persistent_id = persistent_id
- pickler.dump(class_tuple)
- pickler.dump(resolved)
- return file.getvalue(1)
- except ConflictError:
+ except (EOFError, PicklingError), err:
return None
+ resolved = resolve(old, committed, newstate)
+
+ file = StringIO()
+ pickler = Pickler(file,1)
+ pickler.persistent_id = persistent_id
+ pickler.dump(getClassMetadata(resolve.im_self))
+ pickler.dump(resolved)
+ return file.getvalue(1)
+ except ConflictError:
+ return None