From 3691ece4a5d84320cc74a3a37af8c59ea1a1ee63 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sun, 2 Feb 2020 23:59:41 -0500 Subject: wip rpn --- rrdformat/marshal_xml.go | 54 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 5 deletions(-) (limited to 'rrdformat/marshal_xml.go') diff --git a/rrdformat/marshal_xml.go b/rrdformat/marshal_xml.go index 033073c..7b97894 100644 --- a/rrdformat/marshal_xml.go +++ b/rrdformat/marshal_xml.go @@ -40,7 +40,7 @@ func (rrd RRD) MarshalXML(e *xml.Encoder, start xml.StartElement) error { if err := e.EncodeToken(xml.Comment(" Seconds ")); err != nil { return err } - // 3. Step + // 3. Last Update if err := e.EncodeElement(rrd.LastUpdated, xmlStart("lastupdate")); err != nil { return err } @@ -69,10 +69,6 @@ func (rrd RRD) MarshalXML(e *xml.Encoder, start xml.StartElement) error { } func (t TimeWithUsec) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - return e.EncodeElement(TimeWithoutUsec{Sec: t.Sec}, start) -} - -func (t TimeWithoutUsec) MarshalXML(e *xml.Encoder, start xml.StartElement) error { if err := e.EncodeToken(start); err != nil { return err } @@ -90,3 +86,51 @@ func (t TimeWithoutUsec) MarshalXML(e *xml.Encoder, start xml.StartElement) erro } return nil } + +func (ds DSDef) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if err := e.EncodeToken(start); err != nil { + return err + } + if err := e.EncodeElement(" "+ds.DSName+" ", xmlStart("name")); err != nil { + return err + } + if err := e.EncodeElement(" "+ds.DSType+" ", xmlStart("type")); err != nil { + return err + } + + switch ds.DSType { + case DST_CDEF: + var rpnps []rrdbinary.RPNToken + for _, param := range ds.Params { + rpnps = append(rpnps, param.AsRPNTokens()...) + } + strs := make([]string, len(rpnps)) + for _, rpnp := range rpnps { + switch Op(rpnp.Op) { + case OP_NUMBER: + strs = append(strs, fmt.Sprintf("%d", rpnp.Val)) + case OP_VARIABLE: + if rpnp.Val < 0 || rpnp.Val >= len(rrd.DSDefs) { + return fmt.Errorf("out-of-bounds %s %d", Op(rpnp.Op), rpnp.Val) + } + strs = append(strs, rrd.DSDefs[int(rpnp.Val)].Name) + case OP_PREV_OTHER: + if rpnp.Val < 0 || rpnp.Val >= len(rrd.DSDefs) { + return fmt.Errorf("out-of-bounds %s %d", Op(rpnp.Op), rpnp.Val) + } + strs = append(strs, fmt.Sprintf("PREV(%s)", rrd.DSDefs[int(rpnp.Val)].Name)) + default: + strs = append(strs, rpnp.Op.String()) + } + } + if err := e.EncodeElement(strings.Join(strs, ","), xmlStart("cdef")); err != nil { + return err + } + default: + + } + + if err := e.EncodeToken(start.End()); err != nil { + return err + } +} -- cgit v1.2.3