@@ -14,27 +14,48 @@ type DataDecoder struct {
1414 buffer []byte
1515}
1616
17- type dataType int
17+ // Type corresponds to the data types defined in the MaxMind DB format
18+ // specification v2.0, specifically in the "Output Data Section".
19+ type Type int
1820
1921const (
20- _Extended dataType = iota
21- _Pointer
22- _String
23- _Float64
24- _Bytes
25- _Uint16
26- _Uint32
27- _Map
28- _Int32
29- _Uint64
30- _Uint128
31- _Slice
32- // We don't use the next two. They are placeholders. See the spec
33- // for more details.
34- _Container //nolint:deadcode,varcheck // above
35- _Marker //nolint:deadcode,varcheck // above
36- _Bool
37- _Float32
22+ // TypeExtended is an "extended" type. This means that the type is encoded in the
23+ // next byte(s). It should not be used directly.
24+ TypeExtended Type = iota
25+ // TypePointer represents a pointer to another location in the data section.
26+ TypePointer
27+ // TypeString represents a UTF-8 string.
28+ TypeString
29+ // TypeFloat64 represents a 64-bit floating point number (double).
30+ TypeFloat64
31+ // TypeBytes represents a slice of bytes.
32+ TypeBytes
33+ // TypeUint16 represents a 16-bit unsigned integer.
34+ TypeUint16
35+ // TypeUint32 represents a 32-bit unsigned integer.
36+ TypeUint32
37+ // TypeMap represents a map data type. The keys must be strings.
38+ // The values may be any data type.
39+ TypeMap
40+ // TypeInt32 represents a 32-bit signed integer.
41+ TypeInt32
42+ // TypeUint64 represents a 64-bit unsigned integer.
43+ TypeUint64
44+ // TypeUint128 represents a 128-bit unsigned integer.
45+ TypeUint128
46+ // TypeSlice represents an array data type.
47+ TypeSlice
48+ // TypeContainer represents a data cache container. This is used for
49+ // internal database optimization and is not directly used.
50+ // It is included here as a placeholder per the specification.
51+ TypeContainer
52+ // TypeMarker represents an end marker for the data section. It is included
53+ // here as a placeholder per the specification. It is not used directly.
54+ TypeMarker
55+ // TypeBool represents a boolean type.
56+ TypeBool
57+ // TypeFloat32 represents a 32-bit floating point number (float).
58+ TypeFloat32
3859)
3960
4061const (
@@ -77,19 +98,19 @@ func (d *DataDecoder) decodeToDeserializer(
7798 return d .decodeFromTypeToDeserializer (typeNum , size , newOffset , dser , depth + 1 )
7899}
79100
80- func (d * DataDecoder ) decodeCtrlData (offset uint ) (dataType , uint , uint , error ) {
101+ func (d * DataDecoder ) decodeCtrlData (offset uint ) (Type , uint , uint , error ) {
81102 newOffset := offset + 1
82103 if offset >= uint (len (d .buffer )) {
83104 return 0 , 0 , 0 , mmdberrors .NewOffsetError ()
84105 }
85106 ctrlByte := d .buffer [offset ]
86107
87- typeNum := dataType (ctrlByte >> 5 )
88- if typeNum == _Extended {
108+ typeNum := Type (ctrlByte >> 5 )
109+ if typeNum == TypeExtended {
89110 if newOffset >= uint (len (d .buffer )) {
90111 return 0 , 0 , 0 , mmdberrors .NewOffsetError ()
91112 }
92- typeNum = dataType (d .buffer [newOffset ] + 7 )
113+ typeNum = Type (d .buffer [newOffset ] + 7 )
93114 newOffset ++
94115 }
95116
@@ -101,10 +122,10 @@ func (d *DataDecoder) decodeCtrlData(offset uint) (dataType, uint, uint, error)
101122func (d * DataDecoder ) sizeFromCtrlByte (
102123 ctrlByte byte ,
103124 offset uint ,
104- typeNum dataType ,
125+ typeNum Type ,
105126) (uint , uint , error ) {
106127 size := uint (ctrlByte & 0x1f )
107- if typeNum == _Extended {
128+ if typeNum == TypeExtended {
108129 return size , offset , nil
109130 }
110131
@@ -134,83 +155,83 @@ func (d *DataDecoder) sizeFromCtrlByte(
134155}
135156
136157func (d * DataDecoder ) decodeFromTypeToDeserializer (
137- dtype dataType ,
158+ dtype Type ,
138159 size uint ,
139160 offset uint ,
140161 dser deserializer ,
141162 depth int ,
142163) (uint , error ) {
143164 // For these types, size has a special meaning
144165 switch dtype {
145- case _Bool :
166+ case TypeBool :
146167 v , offset := decodeBool (size , offset )
147168 return offset , dser .Bool (v )
148- case _Map :
169+ case TypeMap :
149170 return d .decodeMapToDeserializer (size , offset , dser , depth )
150- case _Pointer :
171+ case TypePointer :
151172 pointer , newOffset , err := d .decodePointer (size , offset )
152173 if err != nil {
153174 return 0 , err
154175 }
155176 _ , err = d .decodeToDeserializer (pointer , dser , depth , false )
156177 return newOffset , err
157- case _Slice :
178+ case TypeSlice :
158179 return d .decodeSliceToDeserializer (size , offset , dser , depth )
159- case _Bytes :
180+ case TypeBytes :
160181 v , offset , err := d .decodeBytes (size , offset )
161182 if err != nil {
162183 return 0 , err
163184 }
164185 return offset , dser .Bytes (v )
165- case _Float32 :
186+ case TypeFloat32 :
166187 v , offset , err := d .decodeFloat32 (size , offset )
167188 if err != nil {
168189 return 0 , err
169190 }
170191 return offset , dser .Float32 (v )
171- case _Float64 :
192+ case TypeFloat64 :
172193 v , offset , err := d .decodeFloat64 (size , offset )
173194 if err != nil {
174195 return 0 , err
175196 }
176197
177198 return offset , dser .Float64 (v )
178- case _Int32 :
199+ case TypeInt32 :
179200 v , offset , err := d .decodeInt (size , offset )
180201 if err != nil {
181202 return 0 , err
182203 }
183204
184205 return offset , dser .Int32 (int32 (v ))
185- case _String :
206+ case TypeString :
186207 v , offset , err := d .decodeString (size , offset )
187208 if err != nil {
188209 return 0 , err
189210 }
190211
191212 return offset , dser .String (v )
192- case _Uint16 :
213+ case TypeUint16 :
193214 v , offset , err := d .decodeUint (size , offset )
194215 if err != nil {
195216 return 0 , err
196217 }
197218
198219 return offset , dser .Uint16 (uint16 (v ))
199- case _Uint32 :
220+ case TypeUint32 :
200221 v , offset , err := d .decodeUint (size , offset )
201222 if err != nil {
202223 return 0 , err
203224 }
204225
205226 return offset , dser .Uint32 (uint32 (v ))
206- case _Uint64 :
227+ case TypeUint64 :
207228 v , offset , err := d .decodeUint (size , offset )
208229 if err != nil {
209230 return 0 , err
210231 }
211232
212233 return offset , dser .Uint64 (v )
213- case _Uint128 :
234+ case TypeUint128 :
214235 v , offset , err := d .decodeUint128 (size , offset )
215236 if err != nil {
216237 return 0 , err
@@ -410,15 +431,15 @@ func (d *DataDecoder) decodeKey(offset uint) ([]byte, uint, error) {
410431 if err != nil {
411432 return nil , 0 , err
412433 }
413- if typeNum == _Pointer {
434+ if typeNum == TypePointer {
414435 pointer , ptrOffset , err := d .decodePointer (size , dataOffset )
415436 if err != nil {
416437 return nil , 0 , err
417438 }
418439 key , _ , err := d .decodeKey (pointer )
419440 return key , ptrOffset , err
420441 }
421- if typeNum != _String {
442+ if typeNum != TypeString {
422443 return nil , 0 , mmdberrors .NewInvalidDatabaseError (
423444 "unexpected type when decoding string: %v" ,
424445 typeNum ,
@@ -443,16 +464,16 @@ func (d *DataDecoder) nextValueOffset(offset, numberToSkip uint) (uint, error) {
443464 return 0 , err
444465 }
445466 switch typeNum {
446- case _Pointer :
467+ case TypePointer :
447468 _ , offset , err = d .decodePointer (size , offset )
448469 if err != nil {
449470 return 0 , err
450471 }
451- case _Map :
472+ case TypeMap :
452473 numberToSkip += 2 * size
453- case _Slice :
474+ case TypeSlice :
454475 numberToSkip += size
455- case _Bool :
476+ case TypeBool :
456477 default :
457478 offset += size
458479 }
0 commit comments