@@ -45,25 +45,6 @@ impl From<io::Error> for MaxMindDBError {
45
45
46
46
type BinaryDecodeResult < T > = ( Result < T , MaxMindDBError > , usize ) ;
47
47
48
- #[ derive( Clone , Debug , PartialEq ) ]
49
- pub enum DataRecord {
50
- String ( String ) ,
51
- Double ( f64 ) ,
52
- Byte ( u8 ) ,
53
- Uint16 ( u16 ) ,
54
- Uint32 ( u32 ) ,
55
- Map ( Box < DbMap > ) ,
56
- Int32 ( i32 ) ,
57
- Uint64 ( u64 ) ,
58
- Boolean ( bool ) ,
59
- Array ( DbArray ) ,
60
- Float ( f32 ) ,
61
- Null ,
62
- }
63
-
64
- pub type DbArray = Vec < DataRecord > ;
65
- pub type DbMap = BTreeMap < String , DataRecord > ;
66
-
67
48
#[ derive( RustcDecodable , Debug ) ]
68
49
pub struct Metadata {
69
50
pub binary_format_major_version : u16 ,
@@ -83,7 +64,7 @@ struct BinaryDecoder {
83
64
}
84
65
85
66
impl BinaryDecoder {
86
- fn decode_array ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
67
+ fn decode_array ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
87
68
let mut array = Vec :: new ( ) ;
88
69
let mut new_offset = offset;
89
70
@@ -95,27 +76,27 @@ impl BinaryDecoder {
95
76
new_offset = tmp_offset;
96
77
array. push ( val) ;
97
78
}
98
- ( Ok ( DataRecord :: Array ( array) ) , new_offset)
79
+ ( Ok ( decoder :: DataRecord :: Array ( array) ) , new_offset)
99
80
}
100
81
101
- fn decode_bool ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
82
+ fn decode_bool ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
102
83
match size {
103
- 0 | 1 => ( Ok ( DataRecord :: Boolean ( size != 0 ) ) , offset) ,
84
+ 0 | 1 => ( Ok ( decoder :: DataRecord :: Boolean ( size != 0 ) ) , offset) ,
104
85
s => ( Err ( MaxMindDBError :: InvalidDatabaseError ( format ! ( "float of size {:?}" , s) ) ) ,
105
86
0 ) ,
106
87
}
107
88
}
108
89
109
- fn decode_bytes ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
90
+ fn decode_bytes ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
110
91
let new_offset = offset + size;
111
92
let u8_slice = & self . buf [ offset..new_offset] ;
112
93
113
- let bytes = u8_slice. iter ( ) . map ( |& b| DataRecord :: Byte ( b) ) . collect ( ) ;
94
+ let bytes = u8_slice. iter ( ) . map ( |& b| decoder :: DataRecord :: Byte ( b) ) . collect ( ) ;
114
95
115
- ( Ok ( DataRecord :: Array ( bytes) ) , new_offset)
96
+ ( Ok ( decoder :: DataRecord :: Array ( bytes) ) , new_offset)
116
97
}
117
98
118
- fn decode_float ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
99
+ fn decode_float ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
119
100
match size {
120
101
4 => {
121
102
let new_offset = offset + size;
@@ -124,14 +105,14 @@ impl BinaryDecoder {
124
105
. iter ( )
125
106
. fold ( 0u32 , |acc, & b| ( acc << 8 ) | b as u32 ) ;
126
107
let float_value: f32 = unsafe { mem:: transmute ( value) } ;
127
- ( Ok ( DataRecord :: Float ( float_value) ) , new_offset)
108
+ ( Ok ( decoder :: DataRecord :: Float ( float_value) ) , new_offset)
128
109
}
129
110
s => ( Err ( MaxMindDBError :: InvalidDatabaseError ( format ! ( "float of size {:?}" , s) ) ) ,
130
111
0 ) ,
131
112
}
132
113
}
133
114
134
- fn decode_double ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
115
+ fn decode_double ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
135
116
match size {
136
117
8 => {
137
118
let new_offset = offset + size;
@@ -140,33 +121,34 @@ impl BinaryDecoder {
140
121
. iter ( )
141
122
. fold ( 0u64 , |acc, & b| ( acc << 8 ) | b as u64 ) ;
142
123
let float_value: f64 = unsafe { mem:: transmute ( value) } ;
143
- ( Ok ( DataRecord :: Double ( float_value) ) , new_offset)
124
+ ( Ok ( decoder :: DataRecord :: Double ( float_value) ) , new_offset)
144
125
}
145
126
s => ( Err ( MaxMindDBError :: InvalidDatabaseError ( format ! ( "double of size {:?}" , s) ) ) ,
146
127
0 ) ,
147
128
}
148
129
}
149
130
150
- fn decode_uint64 ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
131
+ fn decode_uint64 ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
151
132
match size {
152
133
s if s <= 8 => {
153
134
let new_offset = offset + size;
154
135
155
136
let value = self . buf [ offset..new_offset]
156
137
. iter ( )
157
138
. fold ( 0u64 , |acc, & b| ( acc << 8 ) | b as u64 ) ;
158
- ( Ok ( DataRecord :: Uint64 ( value) ) , new_offset)
139
+ ( Ok ( decoder :: DataRecord :: Uint64 ( value) ) , new_offset)
159
140
}
160
141
s => ( Err ( MaxMindDBError :: InvalidDatabaseError ( format ! ( "u64 of size {:?}" , s) ) ) ,
161
142
0 ) ,
162
143
}
163
144
}
164
145
165
- fn decode_uint32 ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
146
+ fn decode_uint32 ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
166
147
match size {
167
148
s if s <= 4 => {
168
149
match self . decode_uint64 ( size, offset) {
169
- ( Ok ( DataRecord :: Uint64 ( u) ) , o) => ( Ok ( DataRecord :: Uint32 ( u as u32 ) ) , o) ,
150
+ ( Ok ( decoder:: DataRecord :: Uint64 ( u) ) , o) =>
151
+ ( Ok ( decoder:: DataRecord :: Uint32 ( u as u32 ) ) , o) ,
170
152
e => e,
171
153
}
172
154
}
@@ -175,11 +157,12 @@ impl BinaryDecoder {
175
157
}
176
158
}
177
159
178
- fn decode_uint16 ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
160
+ fn decode_uint16 ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
179
161
match size {
180
162
s if s <= 4 => {
181
163
match self . decode_uint64 ( size, offset) {
182
- ( Ok ( DataRecord :: Uint64 ( u) ) , o) => ( Ok ( DataRecord :: Uint16 ( u as u16 ) ) , o) ,
164
+ ( Ok ( decoder:: DataRecord :: Uint64 ( u) ) , o) =>
165
+ ( Ok ( decoder:: DataRecord :: Uint16 ( u as u16 ) ) , o) ,
183
166
e => e,
184
167
}
185
168
}
@@ -188,22 +171,22 @@ impl BinaryDecoder {
188
171
}
189
172
}
190
173
191
- fn decode_int ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
174
+ fn decode_int ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
192
175
match size {
193
176
s if s <= 4 => {
194
177
let new_offset = offset + size;
195
178
196
179
let value = self . buf [ offset..new_offset]
197
180
. iter ( )
198
181
. fold ( 0i32 , |acc, & b| ( acc << 8 ) | b as i32 ) ;
199
- ( Ok ( DataRecord :: Int32 ( value) ) , new_offset)
182
+ ( Ok ( decoder :: DataRecord :: Int32 ( value) ) , new_offset)
200
183
}
201
184
s => ( Err ( MaxMindDBError :: InvalidDatabaseError ( format ! ( "int32 of size {:?}" , s) ) ) ,
202
185
0 ) ,
203
186
}
204
187
}
205
188
206
- fn decode_map ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
189
+ fn decode_map ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
207
190
let mut values = Box :: new ( BTreeMap :: new ( ) ) ;
208
191
let mut new_offset = offset;
209
192
@@ -219,19 +202,22 @@ impl BinaryDecoder {
219
202
new_offset = tmp_offset;
220
203
221
204
let str_key = match key {
222
- DataRecord :: String ( s) => s,
205
+ decoder :: DataRecord :: String ( s) => s,
223
206
v => return ( Err ( MaxMindDBError :: InvalidDatabaseError ( format ! ( "unexpected map \
224
207
key type {:?}",
225
208
v) ) ) ,
226
209
0 ) ,
227
210
} ;
228
211
values. insert ( str_key, val) ;
229
212
}
230
- ( Ok ( DataRecord :: Map ( values) ) , new_offset)
213
+ ( Ok ( decoder :: DataRecord :: Map ( values) ) , new_offset)
231
214
}
232
215
233
216
234
- fn decode_pointer ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
217
+ fn decode_pointer ( & self ,
218
+ size : usize ,
219
+ offset : usize )
220
+ -> BinaryDecodeResult < decoder:: DataRecord > {
235
221
let pointer_value_offset = [ 0 , 0 , 2048 , 526336 , 0 ] ;
236
222
let pointer_size = ( ( size >> 3 ) & 0x3 ) + 1 ;
237
223
let new_offset = offset + pointer_size;
@@ -250,20 +236,20 @@ impl BinaryDecoder {
250
236
( result, new_offset)
251
237
}
252
238
253
- fn decode_string ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < DataRecord > {
239
+ fn decode_string ( & self , size : usize , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
254
240
use std:: str:: from_utf8;
255
241
256
242
let new_offset: usize = offset + size;
257
243
let bytes = & self . buf [ offset..new_offset] ;
258
244
match from_utf8 ( bytes) {
259
- Ok ( v) => ( Ok ( DataRecord :: String ( v. to_owned ( ) ) ) , new_offset) ,
245
+ Ok ( v) => ( Ok ( decoder :: DataRecord :: String ( v. to_owned ( ) ) ) , new_offset) ,
260
246
Err ( _) =>
261
247
( Err ( MaxMindDBError :: InvalidDatabaseError ( "error decoding string" . to_owned ( ) ) ) ,
262
248
new_offset) ,
263
249
}
264
250
}
265
251
266
- fn decode ( & self , offset : usize ) -> BinaryDecodeResult < DataRecord > {
252
+ fn decode ( & self , offset : usize ) -> BinaryDecodeResult < decoder :: DataRecord > {
267
253
let mut new_offset = offset + 1 ;
268
254
let ctrl_byte = self . buf [ offset] ;
269
255
@@ -313,7 +299,7 @@ impl BinaryDecoder {
313
299
data_type : u8 ,
314
300
size : usize ,
315
301
offset : usize )
316
- -> BinaryDecodeResult < DataRecord > {
302
+ -> BinaryDecodeResult < decoder :: DataRecord > {
317
303
match data_type {
318
304
1 => self . decode_pointer ( size, offset) ,
319
305
2 => self . decode_string ( size, offset) ,
@@ -504,7 +490,7 @@ impl Reader {
504
490
Ok ( val)
505
491
}
506
492
507
- fn resolve_data_pointer ( & self , pointer : usize ) -> Result < DataRecord , MaxMindDBError > {
493
+ fn resolve_data_pointer ( & self , pointer : usize ) -> Result < decoder :: DataRecord , MaxMindDBError > {
508
494
let search_tree_size = ( self . metadata . record_size as usize ) * self . metadata . node_count / 4 ;
509
495
510
496
let resolved = pointer - self . metadata . node_count + search_tree_size;
0 commit comments