summaryrefslogtreecommitdiff
path: root/rrdformat/format.go
blob: 8898ffdece87bd2355bbe9a3a49d0a57efce7259 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package rrdformat

import (
	//"encoding"
	"encoding/xml"

	"git.lukeshu.com/go/librrd/rrdformat/rrdbinary"
)

// File format versions:
//
// For the most part, the layout of the file format hasn't
// changed--the version number just indicates which enum members you
// need to support.  The only parser-breaking change is that the
// 0002->0003 transition added a few bytes to the timestamp, in order
// to go from second-precision to microsecond-precision.
//
//  - "0005" (added in rrdtool 1.5.0, 2015-04-16)
//    * added DST_DCOUNTER
//    * added DST_DDERIVE
//    * otherwise identical to "0004"
//
//  - "0004" (added in rrdtool 1.3.0, 2008-06-10)
//    * added MHWPREDICT function
//    * otherwise identical to "0003"
//
//  - "0003" (added in the unreleased rrdtool 1.1.x in 2003,
//            present in rrdtool 1.2.0, 2005-04-25)
//    * last-updated timestamp gained a `long` microsecond component
//    * otherwise identical to "0002"
//
//  - "0002" (never used by a stable release of rrdtool, but was used
//            by development versions of 1.1.x 2001-2003)
//    * added DST_CDEF
//    * added CF_HWPREDICT
//    * added CF_SEASONAL
//    * added CF_DEVPREDICT
//    * added CF_DEVSEASONAL
//    * added CF_FAILURES
//
//  - "0001" (the original in rrdtool 1.0.0, 1999-07-15)

const XMLNS = "https://oss.oetiker.ch/rrdtool/rrdtool-dump.xml"

type RRDValue = rrdbinary.Float

type Header struct {
	Cookie      rrdbinary.String     `rrdbinary:"size=4" xml:"-"`
	Version     rrdbinary.String     `rrdbinary:"size=5" xml:"version"`
	FloatCookie rrdbinary.Float      `xml:"-"`
	DSCnt       rrdbinary.Uint       `xml:"-"`
	RRACnt      rrdbinary.Uint       `xml:"-"`
	PDPStep     rrdbinary.Uint       `xml:"step"`
	Parameters  [10]rrdbinary.Unival `xml:"-"`
}

type DSDef struct {
	DSName     rrdbinary.String `rrdbinary:"size=20"`
	DSType     rrdbinary.String `rrdbinary:"size=20"`
	Parameters [10]rrdbinary.Unival
}

type RRADef struct {
	CFName rrdbinary.String `rrdbinary:"size=20"`
	RowCnt rrdbinary.Uint
	PDPCnt rrdbinary.Uint
}

type Time struct {
	Sec  rrdbinary.Time
	Usec rrdbinary.Int // signed, but always >= 0
}

type PDPPrep struct {
	LastDS  rrdbinary.String `rrdbinary:"size=30"`
	Scratch [10]rrdbinary.Unival
}

type CDPPrep struct {
	Scratch [10]rrdbinary.Unival
}

type RRAPtr struct {
	CurRow rrdbinary.Uint
}

type RRDv0005 = RRDv0004
type RRDv0004 = RRDv0003

type RRDv0003 struct {
	Header      Header
	DSDefs      []DSDef  // .Header.DSCnt
	RRADefs     []RRADef // .Header.RRACnt
	LastUpdated Time
	PDPPrep     []PDPPrep  // .Header.DSCnt
	CDPPrep     []CDPPrep  // .Header.DSCnt * .Header.RRACnt
	RRAPtr      []RRAPtr   // .Header.RRACnt
	Values      []RRDValue // Σ .RRADefs[i].RowCnt*.Header.DsCnt
}

type RRDv0002 = RRDv0001

type RRDv0001 struct {
	Header      Header
	DSDefs      []DSDef  // .Header.DSCnt
	RRADefs     []RRADef // .Header.RRACnt
	LastUpdated rrdbinary.Time
	PDPPrep     []PDPPrep  // .Header.DSCnt
	CDPPrep     []CDPPrep  // .Header.DSCnt * .Header.RRACnt
	RRAPtr      []RRAPtr   // .Header.RRACnt
	Values      []RRDValue // Σ .RRADefs[i].RowCnt*.Header.DsCnt
}

func (h *Header) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
	if err := e.EncodeElement(h.Version, xml.StartElement{Name: xml.Name{Local: "version", Space: XMLNS}}); err != nil {
		return err
	}
	if err := e.EncodeElement(h.PDPStep, xml.StartElement{Name: xml.Name{Local: "step", Space: XMLNS}}); err != nil {
		return err
	}
	return nil
}

//var _ encoding.BinaryMarshaler = &Header{}
//var _ encoding.BinaryUnmarshaler = &Header{}

var _ xml.Marshaler = &Header{}

//var _ xml.Unmarshaler = &Header{}