summaryrefslogtreecommitdiff
path: root/rrdformat/marshal_xml.go
diff options
context:
space:
mode:
Diffstat (limited to 'rrdformat/marshal_xml.go')
-rw-r--r--rrdformat/marshal_xml.go54
1 files changed, 49 insertions, 5 deletions
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
+ }
+}