diff options
Diffstat (limited to 'rrdformat/unmarshal_binary.go')
-rw-r--r-- | rrdformat/unmarshal_binary.go | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/rrdformat/unmarshal_binary.go b/rrdformat/unmarshal_binary.go new file mode 100644 index 0000000..b9bafde --- /dev/null +++ b/rrdformat/unmarshal_binary.go @@ -0,0 +1,67 @@ +package rrdformat + +import ( + "encoding" + + "git.lukeshu.com/go/librrd/rrdformat/rrdbinary" +) + +type RRD struct { + Architecture rrdbinary.Architecture + Data RRDv0005 +} + +func (rrd *RRD) UnmarshalBinary(data []byte) error { + arch, err := SniffArchitecture(data) + if err != nil { + return err + } + var header Header + if err := rrdbinary.Unmarshal(arch, data, &header); err != nil { + return err + } + + var parsed RRDv0005 + parsed.DSDefs = make([]DSDef, header.DSCnt) + parsed.DSDefs = make([]DSDef, header.DSCnt) + parsed.RRADefs = make([]RRADef, header.RRACnt) + //LastUpdated + parsed.PDPPreps = make([]PDPPrep, header.DSCnt) + parsed.CDPPreps = make([]CDPPrep, header.DSCnt*header.RRACnt) + parsed.RRAPtrs = make([]RRAPtr, header.RRACnt) + //Values + + switch header.Version { + case "0001", "0002": + _parsed := &RRDv0001{} //(*RRDv0001)(&parsed) + if err := rrdbinary.Unmarshal(arch, data, _parsed); err != nil { + return err + } + case "0003", "0004", "0005": + if err := rrdbinary.Unmarshal(arch, data, &parsed); err != nil { + return err + } + default: + // version number already validated by + // SniffArchitecture + panic("should not happen") + } + + val_cnt := 0 + for i := range parsed.RRADefs { + val_cnt += int(parsed.RRADefs[i].RowCnt * header.DSCnt) + } + parsed.Values = make([]RRDValue, val_cnt) + if err := rrdbinary.Unmarshal(arch, data, &parsed.Values); err != nil { + return err + } + + *rrd = RRD{ + Architecture: arch, + Data: parsed, + } + return nil +} + +//var _ encoding.BinaryMarshaler = &RRD{} +var _ encoding.BinaryUnmarshaler = &RRD{} |