// // The serialization version (the first byte of the serialized record) should // be stripped off (already read) from the io.Reader being passed in. // func (serde ORecordSerializerV0) Deserialize(dbc *DBClient, doc *oschema.ODocument, buf *obuf.ReadBuf) (err error) { if doc == nil { return errors.New("ODocument reference passed into ORecordSerializerBinaryV0.Deserialize was null") } // temporarily set state for the duration of this Deserialize call // dbc is allowed to be nil for reentrant (recursive) calls -- in which // case serde.dbc should already be set (not-nil) if dbc != nil { if serde.dbc != nil { return errors.New("Attempted to set dbc again in Serialize when it is already set") } serde.dbc = dbc defer func() { serde.dbc = nil }() } else if serde.dbc == nil { return errors.New("dbc *DBClient passed into Deserialize was null and dbc had not already been set in Serializer state") } classname, err := readClassname(buf) if err != nil { return oerror.NewTrace(err) } doc.Classname = classname header, err := readHeader(buf) if err != nil { return oerror.NewTrace(err) } serde.refreshGlobalPropertiesIfRequired(header) for i, prop := range header.properties { var ofield *oschema.OField if len(prop.name) == 0 { globalProp, ok := serde.dbc.GetCurrDB().GlobalProperties[int(prop.id)] if !ok { panic(oerror.ErrStaleGlobalProperties) // TODO: should return this instead } ofield = &oschema.OField{ ID: prop.id, Name: globalProp.Name, Type: globalProp.Type, } } else { ofield = &oschema.OField{ ID: int32(-1), Name: string(prop.name), Type: prop.typ, } } // if data ptr is 0 (NULL), then it has no entry/value in the serialized record if header.dataPtrs[i] != 0 { buf.Seek(uint(header.dataPtrs[i] - 1)) // -1 bcs the lead byte (serialization version) was stripped off val, err := serde.readDataValue(buf, ofield.Type) if err != nil { return err } ofield.Value = val } doc.AddField(ofield.Name, ofield) } return nil }