@@ -14,27 +14,48 @@ type DataDecoder struct {
14
14
buffer []byte
15
15
}
16
16
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
18
20
19
21
const (
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
38
59
)
39
60
40
61
const (
@@ -77,19 +98,19 @@ func (d *DataDecoder) decodeToDeserializer(
77
98
return d .decodeFromTypeToDeserializer (typeNum , size , newOffset , dser , depth + 1 )
78
99
}
79
100
80
- func (d * DataDecoder ) decodeCtrlData (offset uint ) (dataType , uint , uint , error ) {
101
+ func (d * DataDecoder ) decodeCtrlData (offset uint ) (Type , uint , uint , error ) {
81
102
newOffset := offset + 1
82
103
if offset >= uint (len (d .buffer )) {
83
104
return 0 , 0 , 0 , mmdberrors .NewOffsetError ()
84
105
}
85
106
ctrlByte := d .buffer [offset ]
86
107
87
- typeNum := dataType (ctrlByte >> 5 )
88
- if typeNum == _Extended {
108
+ typeNum := Type (ctrlByte >> 5 )
109
+ if typeNum == TypeExtended {
89
110
if newOffset >= uint (len (d .buffer )) {
90
111
return 0 , 0 , 0 , mmdberrors .NewOffsetError ()
91
112
}
92
- typeNum = dataType (d .buffer [newOffset ] + 7 )
113
+ typeNum = Type (d .buffer [newOffset ] + 7 )
93
114
newOffset ++
94
115
}
95
116
@@ -101,10 +122,10 @@ func (d *DataDecoder) decodeCtrlData(offset uint) (dataType, uint, uint, error)
101
122
func (d * DataDecoder ) sizeFromCtrlByte (
102
123
ctrlByte byte ,
103
124
offset uint ,
104
- typeNum dataType ,
125
+ typeNum Type ,
105
126
) (uint , uint , error ) {
106
127
size := uint (ctrlByte & 0x1f )
107
- if typeNum == _Extended {
128
+ if typeNum == TypeExtended {
108
129
return size , offset , nil
109
130
}
110
131
@@ -134,83 +155,83 @@ func (d *DataDecoder) sizeFromCtrlByte(
134
155
}
135
156
136
157
func (d * DataDecoder ) decodeFromTypeToDeserializer (
137
- dtype dataType ,
158
+ dtype Type ,
138
159
size uint ,
139
160
offset uint ,
140
161
dser deserializer ,
141
162
depth int ,
142
163
) (uint , error ) {
143
164
// For these types, size has a special meaning
144
165
switch dtype {
145
- case _Bool :
166
+ case TypeBool :
146
167
v , offset := decodeBool (size , offset )
147
168
return offset , dser .Bool (v )
148
- case _Map :
169
+ case TypeMap :
149
170
return d .decodeMapToDeserializer (size , offset , dser , depth )
150
- case _Pointer :
171
+ case TypePointer :
151
172
pointer , newOffset , err := d .decodePointer (size , offset )
152
173
if err != nil {
153
174
return 0 , err
154
175
}
155
176
_ , err = d .decodeToDeserializer (pointer , dser , depth , false )
156
177
return newOffset , err
157
- case _Slice :
178
+ case TypeSlice :
158
179
return d .decodeSliceToDeserializer (size , offset , dser , depth )
159
- case _Bytes :
180
+ case TypeBytes :
160
181
v , offset , err := d .decodeBytes (size , offset )
161
182
if err != nil {
162
183
return 0 , err
163
184
}
164
185
return offset , dser .Bytes (v )
165
- case _Float32 :
186
+ case TypeFloat32 :
166
187
v , offset , err := d .decodeFloat32 (size , offset )
167
188
if err != nil {
168
189
return 0 , err
169
190
}
170
191
return offset , dser .Float32 (v )
171
- case _Float64 :
192
+ case TypeFloat64 :
172
193
v , offset , err := d .decodeFloat64 (size , offset )
173
194
if err != nil {
174
195
return 0 , err
175
196
}
176
197
177
198
return offset , dser .Float64 (v )
178
- case _Int32 :
199
+ case TypeInt32 :
179
200
v , offset , err := d .decodeInt (size , offset )
180
201
if err != nil {
181
202
return 0 , err
182
203
}
183
204
184
205
return offset , dser .Int32 (int32 (v ))
185
- case _String :
206
+ case TypeString :
186
207
v , offset , err := d .decodeString (size , offset )
187
208
if err != nil {
188
209
return 0 , err
189
210
}
190
211
191
212
return offset , dser .String (v )
192
- case _Uint16 :
213
+ case TypeUint16 :
193
214
v , offset , err := d .decodeUint (size , offset )
194
215
if err != nil {
195
216
return 0 , err
196
217
}
197
218
198
219
return offset , dser .Uint16 (uint16 (v ))
199
- case _Uint32 :
220
+ case TypeUint32 :
200
221
v , offset , err := d .decodeUint (size , offset )
201
222
if err != nil {
202
223
return 0 , err
203
224
}
204
225
205
226
return offset , dser .Uint32 (uint32 (v ))
206
- case _Uint64 :
227
+ case TypeUint64 :
207
228
v , offset , err := d .decodeUint (size , offset )
208
229
if err != nil {
209
230
return 0 , err
210
231
}
211
232
212
233
return offset , dser .Uint64 (v )
213
- case _Uint128 :
234
+ case TypeUint128 :
214
235
v , offset , err := d .decodeUint128 (size , offset )
215
236
if err != nil {
216
237
return 0 , err
@@ -410,15 +431,15 @@ func (d *DataDecoder) decodeKey(offset uint) ([]byte, uint, error) {
410
431
if err != nil {
411
432
return nil , 0 , err
412
433
}
413
- if typeNum == _Pointer {
434
+ if typeNum == TypePointer {
414
435
pointer , ptrOffset , err := d .decodePointer (size , dataOffset )
415
436
if err != nil {
416
437
return nil , 0 , err
417
438
}
418
439
key , _ , err := d .decodeKey (pointer )
419
440
return key , ptrOffset , err
420
441
}
421
- if typeNum != _String {
442
+ if typeNum != TypeString {
422
443
return nil , 0 , mmdberrors .NewInvalidDatabaseError (
423
444
"unexpected type when decoding string: %v" ,
424
445
typeNum ,
@@ -443,16 +464,16 @@ func (d *DataDecoder) nextValueOffset(offset, numberToSkip uint) (uint, error) {
443
464
return 0 , err
444
465
}
445
466
switch typeNum {
446
- case _Pointer :
467
+ case TypePointer :
447
468
_ , offset , err = d .decodePointer (size , offset )
448
469
if err != nil {
449
470
return 0 , err
450
471
}
451
- case _Map :
472
+ case TypeMap :
452
473
numberToSkip += 2 * size
453
- case _Slice :
474
+ case TypeSlice :
454
475
numberToSkip += size
455
- case _Bool :
476
+ case TypeBool :
456
477
default :
457
478
offset += size
458
479
}
0 commit comments