def _setstate(self, obj): # Helper for setstate(), which provides logging of failures. # The control flow is complicated here to avoid loading an # object revision that we are sure we aren't going to use. As # a result, invalidation tests occur before and after the # load. We can only be sure about invalidations after the # load. # If an object has been invalidated, there are several cases # to consider: # 1. Check _p_independent() # 2. Try MVCC # 3. Raise ConflictError. # Does anything actually use _p_independent()? It would simplify # the code if we could drop support for it. # (BTrees.Length does.) # There is a harmless data race with self._invalidated. A # dict update could go on in another thread, but we don't care # because we have to check again after the load anyway. if self._invalidatedCache: raise ReadConflictError() if (obj._p_oid in self._invalidated and not myhasattr(obj, "_p_independent")): # If the object has _p_independent(), we will handle it below. self._load_before_or_conflict(obj) return p, serial = self._storage.load(obj._p_oid, self._version) self._load_count += 1 self._inv_lock.acquire() try: invalid = obj._p_oid in self._invalidated finally: self._inv_lock.release() if invalid: if myhasattr(obj, "_p_independent"): # This call will raise a ReadConflictError if something # goes wrong self._handle_independent(obj) else: self._load_before_or_conflict(obj) return self._reader.setGhostState(obj, p) obj._p_serial = serial self._cache.update_object_size_estimation(obj._p_oid, len(p)) obj._p_estimated_size = len(p) # Blob support if isinstance(obj, Blob): obj._p_blob_uncommitted = None obj._p_blob_committed = self._storage.loadBlob(obj._p_oid, serial)
def _setstate(self, obj): # Helper for setstate(), which provides logging of failures. # The control flow is complicated here to avoid loading an # object revision that we are sure we aren't going to use. As # a result, invalidation tests occur before and after the # load. We can only be sure about invalidations after the # load. # If an object has been invalidated, there are several cases # to consider: # 1. Check _p_independent() # 2. Try MVCC # 3. Raise ConflictError. # Does anything actually use _p_independent()? It would simplify # the code if we could drop support for it. # There is a harmless data race with self._invalidated. A # dict update could go on in another thread, but we don't care # because we have to check again after the load anyway. if (obj._p_oid in self._invalidated and not myhasattr(obj, "_p_independent")): # If the object has _p_independent(), we will handle it below. self._load_before_or_conflict(obj) return p, serial = self._storage.load(obj._p_oid, self._version) self._load_count += 1 self._inv_lock.acquire() try: invalid = obj._p_oid in self._invalidated finally: self._inv_lock.release() if invalid: if myhasattr(obj, "_p_independent"): # This call will raise a ReadConflictError if something # goes wrong self._handle_independent(obj) else: self._load_before_or_conflict(obj) return self._reader.setGhostState(obj, p) obj._p_serial = serial
def test_myhasattr(self): class OldStyle: bar = "bar" def __getattr__(self, name): if name == "error": raise ValueError("whee!") else: raise AttributeError(name) class NewStyle(object): bar = "bar" def _raise(self): raise ValueError("whee!") error = property(_raise) self.assertRaises(ValueError, serialize.myhasattr, OldStyle(), "error") self.assertRaises(ValueError, serialize.myhasattr, NewStyle(), "error") self.assertTrue(serialize.myhasattr(OldStyle(), "bar")) self.assertTrue(serialize.myhasattr(NewStyle(), "bar")) self.assertTrue(not serialize.myhasattr(OldStyle(), "rat")) self.assertTrue(not serialize.myhasattr(NewStyle(), "rat"))
def test_myhasattr(self): class OldStyle(object): bar = "bar" def __getattr__(self, name): if name == "error": raise ValueError("whee!") else: raise AttributeError(name) class NewStyle(object): bar = "bar" def _raise(self): raise ValueError("whee!") error = property(_raise) self.assertRaises(ValueError, serialize.myhasattr, OldStyle(), "error") self.assertRaises(ValueError, serialize.myhasattr, NewStyle(), "error") self.assertTrue(serialize.myhasattr(OldStyle(), "bar")) self.assertTrue(serialize.myhasattr(NewStyle(), "bar")) self.assertTrue(not serialize.myhasattr(OldStyle(), "rat")) self.assertTrue(not serialize.myhasattr(NewStyle(), "rat"))