def fetchObjRef(self, objRef): """ Given an unarchived object reference, this method returns the actual object for it (or None if the reference is NULL or dangling). While this method assumes that obj refs are stored as 64-bit numbers containing the class id and object serial number, subclasses are certainly able to override that assumption by overriding this method. """ assert isinstance(objRef, types.LongType), 'type=%r, objRef=%r' % (type(objRef), objRef) if objRef == 0: return None else: klassId, serialNum = objRefSplit(objRef) if klassId == 0 or serialNum == 0: # invalid! we don't use 0 serial numbers return self.objRefZeroSerialNum(objRef) klass = self.klassForId(klassId) # Check if we already have this in memory first key = ObjectKey() key.initFromClassNameAndSerialNum(klass.name(), serialNum) obj = self._objects.get(key, None) if obj: return obj clauses = 'where %s=%d' % (klass.sqlSerialColumnName(), serialNum) objs = self.fetchObjectsOfClass(klass, clauses, isDeep=False) if len(objs) == 1: return objs[0] elif len(objs) > 1: raise ValueError, 'Multiple objects.' # @@ 2000-11-22 ce: expand the msg with more information else: return self.objRefDangles(objRef)
def objRefZeroSerialNum(self, objRef): """Raise serial number zero error. Invoked by fetchObjRef() if either the class or the object serial number is zero. """ raise ObjRefZeroSerialNumError(*objRefSplit(objRef))
def objRefZeroSerialNum(self, objRef): """Raise serial number zero error. Invoked by fetchObjRef() if either the class or the object serial number is zero. """ raise ObjRefZeroSerialNumError(objRefSplit(objRef))
def objRefDangles(self, objRef): """Raise dangling reference error. Invoked by fetchObjRef() if there is no possible target object for the given objRef. E.g., this can happen for a dangling reference. This method invokes self.warning() and includes the objRef as decimal, hexadecimal and class:obj numbers. """ raise ObjRefDanglesError(*objRefSplit(objRef))
def objRefDangles(self, objRef): """Raise dangling reference error. Invoked by fetchObjRef() if there is no possible target object for the given objRef. E.g., this can happen for a dangling reference. This method invokes self.warning() and includes the objRef as decimal, hexadecimal and class:obj numbers. """ raise ObjRefDanglesError(objRefSplit(objRef))
def objRefInMem(self, objRef): """ Return the object corresponding to the given objref if and only if it has been loaded into memory. If the object has never been fetched from the database, None is returned. """ assert isinstance(objRef, types.LongType), 'type=%r, objRef=%r' % (type(objRef), objRef) if objRef == 0: return 0 else: klassId, serialNum = objRefSplit(objRef) if klassId == 0 or serialNum == 0: # invalid! we don't use 0 serial numbers return self.objRefZeroSerialNum(objRef) klass = self.klassForId(klassId) # return whether we have this object in memory key = ObjectKey() key.initFromClassNameAndSerialNum(klass.name(), serialNum) return self._objects.get(key, None)
def objRefInMem(self, objRef): """Return referenced object in memory. Returns the object corresponding to the given objref if and only if it has been loaded into memory. If the object has never been fetched from the database, None is returned. """ assert isinstance(objRef, long), 'type=%r, objRef=%r' % (type(objRef), objRef) if objRef == 0: return 0 else: klassId, serialNum = objRefSplit(objRef) if klassId == 0 or serialNum == 0: # invalid! we don't use 0 serial numbers return self.objRefZeroSerialNum(objRef) klass = self.klassForId(klassId) # return whether we have this object in memory key = ObjectKey() key.initFromClassNameAndSerialNum(klass.name(), serialNum) return self._objects.get(key)
def fetchObjRef(self, objRef): """Fetch referenced object. Given an unarchived object reference, this method returns the actual object for it (or None if the reference is NULL or dangling). While this method assumes that obj refs are stored as 64-bit numbers containing the class id and object serial number, subclasses are certainly able to override that assumption by overriding this method. """ assert isinstance(objRef, int), 'type=%r, objRef=%r' % (type(objRef), objRef) if objRef == 0: return None else: klassId, serialNum = objRefSplit(objRef) if klassId == 0 or serialNum == 0: # invalid! we don't use 0 serial numbers return self.objRefZeroSerialNum(objRef) klass = self.klassForId(klassId) # Check if we already have this in memory first key = ObjectKey() key.initFromClassNameAndSerialNum(klass.name(), serialNum) obj = self._objects.get(key) if obj: return obj clauses = 'where %s=%d' % (klass.sqlSerialColumnName(), serialNum) objs = self.fetchObjectsOfClass(klass, clauses, isDeep=False) if len(objs) == 1: return objs[0] elif len(objs) > 1: # @@ 2000-11-22 ce: expand the msg with more information raise ValueError('Multiple objects.') else: return self.objRefDangles(objRef)
def objRefZeroSerialNum(self, objRef): """ Invoked by fetchObjRef() if either the class or object serial number is 0. """ raise ObjRefZeroSerialNumError, objRefSplit(objRef)
def objRefZeroSerialNum(self, objRef): """ Invoked by fetchObjRef() if either the class or object serial number is 0. """ raise ObjRefZeroSerialNumError, objRefSplit(objRef)