[Zope-Checkins] CVS: ZODB3/ZODB - FileStorage.py:1.135.8.7 POSException.py:1.20.6.3 serialize.py:1.1.2.4

Jeremy Hylton cvs-admin at zope.org
Thu Oct 30 15:17:26 EST 2003


Update of /cvs-repository/ZODB3/ZODB
In directory cvs.zope.org:/tmp/cvs-serv13588/ZODB

Modified Files:
      Tag: zodb33-devel-branch
	FileStorage.py POSException.py serialize.py 
Log Message:
Change ConflictError to include the name of the object's class.


=== ZODB3/ZODB/FileStorage.py 1.135.8.6 => 1.135.8.7 ===
--- ZODB3/ZODB/FileStorage.py:1.135.8.6	Tue Oct 28 16:28:32 2003
+++ ZODB3/ZODB/FileStorage.py	Thu Oct 30 15:16:55 2003
@@ -729,11 +729,13 @@
                             `oid`, locked_version)
 
                 if serial != oserial:
-                    data = self.tryToResolveConflict(oid, oserial, serial,
+                    rdata = self.tryToResolveConflict(oid, oserial, serial,
                                                      data)
-                    if data is None:
-                        raise POSException.ConflictError(oid=oid,
-                                                serials=(oserial, serial))
+                    if rdata is None:
+                        raise POSException.ConflictError(
+                            oid=oid, serials=(oserial, serial), data=data)
+                    else:
+                        data = rdata
             else:
                 oserial=serial
 


=== ZODB3/ZODB/POSException.py 1.20.6.2 => 1.20.6.3 ===
--- ZODB3/ZODB/POSException.py:1.20.6.2	Tue Jul  1 18:02:20 2003
+++ ZODB3/ZODB/POSException.py	Thu Oct 30 15:16:55 2003
@@ -51,13 +51,17 @@
         related to conflict.  The first is the revision of object that
         is in conflict, the second is the revision of that the current
         transaction read when it started.
+      data : string
+        The database record that failed to commit, used to put the
+        class name in the error message.
 
     The caller should pass either object or oid as a keyword argument,
     but not both of them.  If object is passed, it should be a
     persistent object with an _p_oid attribute.
     """
 
-    def __init__(self, message=None, object=None, oid=None, serials=None):
+    def __init__(self, message=None, object=None, oid=None, serials=None,
+                 data=None):
         if message is None:
             self.message = "database conflict error"
         else:
@@ -74,6 +78,14 @@
         if oid is not None:
             assert self.oid is None
             self.oid = oid
+
+        if data is not None:
+            # avoid circular import chain
+            from ZODB.serialize import SimpleObjectReader
+            self.class_name = SimpleObjectReader().getClassName(data)
+        else:
+            if message != "data read conflict error":
+                raise RuntimeError
 
         self.serials = serials
 


=== ZODB3/ZODB/serialize.py 1.1.2.3 => 1.1.2.4 ===
--- ZODB3/ZODB/serialize.py:1.1.2.3	Thu Oct 30 14:29:42 2003
+++ ZODB3/ZODB/serialize.py	Thu Oct 30 15:16:55 2003
@@ -179,8 +179,11 @@
 
     def getClassName(self, pickle):
         unpickler = self._get_unpickler(pickle)
-        cls, newargs = unpickler.load()
-        return cls.__name__
+        klass, newargs = unpickler.load()
+        if isinstance(klass, tuple):
+            return "%s.%s" % klass
+        else:
+            return klass.__name__
 
     def getGhost(self, pickle):
         unpickler = self._get_unpickler(pickle)
@@ -206,6 +209,24 @@
         state = unpickler.load()
         obj.__setstate__(state)
         return obj
+
+class ExternalReference(object):
+    pass
+
+class SimpleObjectReader(BaseObjectReader):
+    """Can be used to inspect a single object pickle.
+
+    It returns an ExternalReference() object for other persistent
+    objects.  It can't instantiate the object.
+    """
+
+    ext_ref = ExternalReference()
+
+    def _persistent_load(self, oid):
+        return self.ext_ref
+
+    def _get_class(self, module, name):
+        return None
 
 class ConnectionObjectReader(BaseObjectReader):
 




More information about the Zope-Checkins mailing list