[ZODB-Dev] Class Versioning?

Victor Safronovich vsafronovich at naumen.ru
Sat Oct 29 09:58:09 EDT 2005


Hello Chris Spencer,

Saturday, October 29, 2005, 7:16:43 AM, you wrote:

CS> Would it be possible to support some system of class versioning in ZODB, 
CS> to aid to handling modifications to source code? For instance, suppose 
CS> each class definition has a __version__ attribute. Upon serialization, 
CS> this version is saved for each instance. Then, if the class is updated, 
CS> signified by incrementing the class's __version__, ZODB could take 
CS> action, for example, by executing an optional __upgrade_to_x(self) in 
CS> the new class definition.
 you can easily derive your own class from Persistent class, and add some system of class versioning
 to them.

 for example ( untested )

 class Persistent(_Persistent):
    # attributes for version tag support
    _class_version = None
    _class_tag   = None
    _version_tag = None

    def __class_init__(self): # works only for extension classes
        tags = [ self._class_version ]
        for base in self.__bases__:
            if hasattr( base, '_class_tag' ):
               tags.append( base._class_tag )

        self._class_tag = hash( tuple(tags) )

    def __setstate__( self, state ):
        _Persistent.__setstate__( self, state )
        if self.tagChanged():
            self.doSomething()
            
    def doSomething(self):
        self._version_tag = self._class_tag
        
    def tagChanged(self):
        return self._version_tag <> self._class_tag
        
 class A(Persistent):
    _class_version = 1.3

 class B(A):
    _class_version = 1.45

-- 
Best regards,
 Victor Safronovich
 NauMen.NauDoc.SoftwareDeveloper  http://www.naumen.ru



More information about the ZODB-Dev mailing list