• Kirill Smelkov's avatar
    go/zodb: Persistent - the base type to implement IPersistent objects · 354e0e51
    Kirill Smelkov authored
    Add the base type, that types which want to implement persistency
    could embed, and this way inherit persistent functionality. For example
    
    	type MyObject struct {
    		Persistent
    		...
    	}
    
    	type myObjectState MyObject
    
    	func (o *myObjectState) DropState() { ... }
    	func (o *myObjectState) SetState(state *mem.Buf) error { ... }
    
    Here state management methods (DropState and SetState) will be
    automatically used by persistency machinery on activation and
    deactivation.
    
    For this to work MyObject class has to be registered to ZODB
    
    	func init() {
    		t := reflect.TypeOf
    		zodb.RegisterClass("mymodule.MyObject", t(MyObject{}), t(myObjectState))
    	}
    
    and new instances of MyObject has to be created via zodb.NewPersistent:
    
    	obj := zodb.NewPersistent(reflect.TypeOf(MyObject{}), jar).(*MyObject)
    
    SetState corresponds to __setstate__ in Python. However in Go version it
    is explicitly separated from class's public API - as it is the contract
    between a class and persistency machinery, not between the class and its
    user. Notice that SetState takes raw buffer as its argument. In the
    following patch we'll add SetState cousing (PySetState) that will be
    taking unpickled objects as the state - exactly how __setstate__
    operates in Python. Classes will be able to choose whether to accept
    state as raw bytes or as a python object.
    
    The activation/deactivation is implemented via reference counting.
    
    Tests are pending (for PySetState).
    354e0e51
persistent.go 12.2 KB